<?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>174798</bug_id>
          
          <creation_ts>2017-07-24 14:27:18 -0700</creation_ts>
          <short_desc>Web Inspector: Add three.js in preparation for layer visualization.</short_desc>
          <delta_ts>2017-08-10 20:08:57 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Inspector</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>174176</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ross Kirsling">ross.kirsling</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>ap</cc>
    
    <cc>bburg</cc>
    
    <cc>commit-queue</cc>
    
    <cc>don.olmstead</cc>
    
    <cc>inspector-bugzilla-changes</cc>
    
    <cc>mjs</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1331739</commentid>
    <comment_count>0</comment_count>
    <who name="Ross Kirsling">ross.kirsling</who>
    <bug_when>2017-07-24 14:27:18 -0700</bug_when>
    <thetext>Add three.js and its OrbitControls as a prerequisite for the 3D layer visualization.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1331808</commentid>
    <comment_count>1</comment_count>
      <attachid>316332</attachid>
    <who name="Ross Kirsling">ross.kirsling</who>
    <bug_when>2017-07-24 17:46:00 -0700</bug_when>
    <thetext>Created attachment 316332
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1331809</commentid>
    <comment_count>2</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2017-07-24 17:49:26 -0700</bug_when>
    <thetext>three.js appears to be under MIT license, which is not one of those allowed in WebKit. I don&apos;t know exactly how this works, but we may need some extra review of license terms.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1331812</commentid>
    <comment_count>3</comment_count>
      <attachid>316332</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2017-07-24 17:52:26 -0700</bug_when>
    <thetext>Comment on attachment 316332
Patch

R- since this patch violates license requirements set on patch upload page, and there is no indication that there was an exception agreed upon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1331813</commentid>
    <comment_count>4</comment_count>
    <who name="Ross Kirsling">ross.kirsling</who>
    <bug_when>2017-07-24 17:54:55 -0700</bug_when>
    <thetext>Sure. Brian mentioned on IRC that &quot;if you want to check in three.js and orbit controls, I can start a request with our legal team&quot;, so I&apos;d opened this ticket accordingly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332119</commentid>
    <comment_count>5</comment_count>
    <who name="Ross Kirsling">ross.kirsling</who>
    <bug_when>2017-07-25 15:24:26 -0700</bug_when>
    <thetext>Note that among the existing libraries in Web Inspector, CodeMirror and ESLint are both MIT-licensed, while Esprima is BSD-licensed (which should be equivalent: https://choosealicense.com/appendix/).

I&apos;m surprised that a conversation should even be necessary regarding permissive OSS licenses, but presumably this should just be a matter of doing. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1332262</commentid>
    <comment_count>6</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2017-07-25 22:19:31 -0700</bug_when>
    <thetext>&gt; I&apos;m surprised that a conversation should even be necessary regarding permissive OSS licenses 

Seems worth raising this on webkit-dev mailing list.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1337533</commentid>
    <comment_count>7</comment_count>
      <attachid>316332</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2017-08-10 12:10:24 -0700</bug_when>
    <thetext>Comment on attachment 316332
Patch

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

Please upload a new patch with directory rename.

When you actually hook this into the build system, you&apos;ll need to make sure it gets minified properly. That should be in a follow up patch separate from the source dump.

&gt; Source/WebInspectorUI/ChangeLog:8
&gt; +        * UserInterface/External/Three/LICENSE: Added.

Can you put it into directory named three.js or threejs instead of Three?

&gt; Source/WebInspectorUI/UserInterface/Main.html:246
&gt; +    &lt;script src=&quot;External/Three/OrbitControls.js&quot;&gt;&lt;/script&gt;

No need to include it until it&apos;s used.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1337612</commentid>
    <comment_count>8</comment_count>
      <attachid>317855</attachid>
    <who name="Ross Kirsling">ross.kirsling</who>
    <bug_when>2017-08-10 14:53:46 -0700</bug_when>
    <thetext>Created attachment 317855
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1337675</commentid>
    <comment_count>9</comment_count>
      <attachid>317855</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2017-08-10 16:18:49 -0700</bug_when>
    <thetext>Comment on attachment 317855
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1337755</commentid>
    <comment_count>10</comment_count>
      <attachid>317855</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-08-10 17:38:06 -0700</bug_when>
    <thetext>Comment on attachment 317855
Patch

Rejecting attachment 317855 from commit-queue.

Failed to run &quot;[&apos;/Volumes/Data/EWS/WebKit/Tools/Scripts/webkit-patch&apos;, &apos;--status-host=webkit-queues.webkit.org&apos;, &apos;--bot-id=webkit-cq-03&apos;, &apos;land-attachment&apos;, &apos;--force-clean&apos;, &apos;--non-interactive&apos;, &apos;--parent-command=commit-queue&apos;, 317855, &apos;--port=mac&apos;]&quot; exit_code: 2 cwd: /Volumes/Data/EWS/WebKit

Last 500 characters of output:
fs/remotes/origin/master/.rev_map.268f45cc-cd09-0410-ab3c-d52691b4dbfc ...
Currently at 220563 = 79a999cbe204abbc99b3ba8e1b8a1d659720d01e
r220565 = dedd274b9feaeb9e589fbcfde9b3958152a25309
r220566 = 104789904f418c99cf355973ee0f95a4f017490e
r220567 = 0a63ca5d8ceb2abd6d17e2abfab369ecf4c3b0b5
Done rebuilding .git/svn/refs/remotes/origin/master/.rev_map.268f45cc-cd09-0410-ab3c-d52691b4dbfc
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.

Full output: http://webkit-queues.webkit.org/results/4292876</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1337771</commentid>
    <comment_count>11</comment_count>
    <who name="Ross Kirsling">ross.kirsling</who>
    <bug_when>2017-08-10 18:28:38 -0700</bug_when>
    <thetext>Looks like we&apos;ll need to sanitize those damn tabs after all. *shakes fist*</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1337793</commentid>
    <comment_count>12</comment_count>
      <attachid>317901</attachid>
    <who name="Ross Kirsling">ross.kirsling</who>
    <bug_when>2017-08-10 19:21:28 -0700</bug_when>
    <thetext>Created attachment 317901
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1337808</commentid>
    <comment_count>13</comment_count>
      <attachid>317901</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-08-10 20:07:09 -0700</bug_when>
    <thetext>Comment on attachment 317901
Patch

Clearing flags on attachment: 317901

Committed r220575: &lt;http://trac.webkit.org/changeset/220575&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1337809</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-08-10 20:07:11 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1337811</commentid>
    <comment_count>15</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-08-10 20:08:57 -0700</bug_when>
    <thetext>&lt;rdar://problem/33842044&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>316332</attachid>
            <date>2017-07-24 17:46:00 -0700</date>
            <delta_ts>2017-08-10 14:53:07 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-174798-20170724174603.patch</filename>
            <type>text/plain</type>
            <size>1111374</size>
            <attacher name="Ross Kirsling">ross.kirsling</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjE5NzkxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVj
dG9yVUkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkluc3BlY3RvclVJL0NoYW5nZUxvZwppbmRleCBm
MWY1MjY5NjBiOWQxYWFkN2YzMGQ3MWY5ZjIzYjcxNjkzYTk2MjY4Li4yN2Y3MmI3ZTUzMjg4MzMw
M2EyYTliNzE0MGNiNThhZmI3MGZjN2Q2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9y
VUkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwxNSBAQAorMjAxNy0wNy0yNCAgUm9zcyBLaXJzbGluZyAgPHJvc3Mua2lyc2xpbmdAc29u
eS5jb20+CisKKyAgICAgICAgV2ViIEluc3BlY3RvcjogQWRkIHRocmVlLmpzIGluIHByZXBhcmF0
aW9uIGZvciBsYXllciB2aXN1YWxpemF0aW9uLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc0Nzk4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL0V4dGVybmFsL1RocmVlL0xJQ0VO
U0U6IEFkZGVkLgorICAgICAgICAqIFVzZXJJbnRlcmZhY2UvRXh0ZXJuYWwvVGhyZWUvT3JiaXRD
b250cm9scy5qczogQWRkZWQuCisgICAgICAgICogVXNlckludGVyZmFjZS9FeHRlcm5hbC9UaHJl
ZS90aHJlZS5qczogQWRkZWQuCisgICAgICAgICogVXNlckludGVyZmFjZS9NYWluLmh0bWw6CisK
IDIwMTctMDctMjEgIEpvc2VwaCBQZWNvcmFybyAgPHBlY29yYXJvQGFwcGxlLmNvbT4KIAogICAg
ICAgICBXZWIgSW5zcGVjdG9yOiBpbnNwZWN0KGFGdW5jdGlvbikgc2hvdWxkIGp1bXAgdG8gZnVu
Y3Rpb24gZGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJ
bnRlcmZhY2UvRXh0ZXJuYWwvVGhyZWUvTElDRU5TRSBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9V
c2VySW50ZXJmYWNlL0V4dGVybmFsL1RocmVlL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNTYwNDkwMTQw
ZWI1MmViZjJkOWE0ZDI2MDQ5NTEyNGQyNzYwOGJhNAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0V4dGVybmFsL1RocmVlL0xJQ0VOU0UKQEAg
LTAsMCArMSwyMSBAQAorVGhlIE1JVCBMaWNlbnNlCisKK0NvcHlyaWdodCDCqSAyMDEwLTIwMTcg
dGhyZWUuanMgYXV0aG9ycworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9m
IGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJl
IGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8g
ZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRo
b3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBw
dWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRo
ZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlz
CitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
OgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGlj
ZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9u
cyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBX
SVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJ
TkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwK
K0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFC
TEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElO
IEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwK
K09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Ig
T1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJ
bnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0V4dGVybmFsL1RocmVlL09yYml0Q29udHJvbHMuanMg
Yi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9FeHRlcm5hbC9UaHJlZS9PcmJp
dENvbnRyb2xzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjE1MWYwYzgwYzZhNzFjMmM3MDVjZTFjNTI1Y2Y2NjIz
ZTgwODI2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlcklu
dGVyZmFjZS9FeHRlcm5hbC9UaHJlZS9PcmJpdENvbnRyb2xzLmpzCkBAIC0wLDAgKzEsMTA0MiBA
QAorLyoqCisgKiBAYXV0aG9yIHFpYW8gLyBodHRwczovL2dpdGh1Yi5jb20vcWlhbworICogQGF1
dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbQorICogQGF1dGhvciBhbHRlcmVkcSAvIGh0
dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8v
Z2l0aHViLmNvbS9XZXN0TGFuZ2xleQorICogQGF1dGhvciBlcmljaDY2NiAvIGh0dHA6Ly9lcmlj
aGFpbmVzLmNvbQorICovCisKKy8vIFRoaXMgc2V0IG9mIGNvbnRyb2xzIHBlcmZvcm1zIG9yYml0
aW5nLCBkb2xseWluZyAoem9vbWluZyksIGFuZCBwYW5uaW5nLgorLy8gVW5saWtlIFRyYWNrYmFs
bENvbnRyb2xzLCBpdCBtYWludGFpbnMgdGhlICJ1cCIgZGlyZWN0aW9uIG9iamVjdC51cCAoK1kg
YnkgZGVmYXVsdCkuCisvLworLy8gICAgT3JiaXQgLSBsZWZ0IG1vdXNlIC8gdG91Y2g6IG9uZSBm
aW5nZXIgbW92ZQorLy8gICAgWm9vbSAtIG1pZGRsZSBtb3VzZSwgb3IgbW91c2V3aGVlbCAvIHRv
dWNoOiB0d28gZmluZ2VyIHNwcmVhZCBvciBzcXVpc2gKKy8vICAgIFBhbiAtIHJpZ2h0IG1vdXNl
LCBvciBhcnJvdyBrZXlzIC8gdG91Y2g6IHRocmVlIGZpbmdlciBzd2lwZQorCitUSFJFRS5PcmJp
dENvbnRyb2xzID0gZnVuY3Rpb24gKCBvYmplY3QsIGRvbUVsZW1lbnQgKSB7CisKKwl0aGlzLm9i
amVjdCA9IG9iamVjdDsKKworCXRoaXMuZG9tRWxlbWVudCA9ICggZG9tRWxlbWVudCAhPT0gdW5k
ZWZpbmVkICkgPyBkb21FbGVtZW50IDogZG9jdW1lbnQ7CisKKwkvLyBTZXQgdG8gZmFsc2UgdG8g
ZGlzYWJsZSB0aGlzIGNvbnRyb2wKKwl0aGlzLmVuYWJsZWQgPSB0cnVlOworCisJLy8gInRhcmdl
dCIgc2V0cyB0aGUgbG9jYXRpb24gb2YgZm9jdXMsIHdoZXJlIHRoZSBvYmplY3Qgb3JiaXRzIGFy
b3VuZAorCXRoaXMudGFyZ2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTsKKworCS8vIEhvdyBmYXIg
eW91IGNhbiBkb2xseSBpbiBhbmQgb3V0ICggUGVyc3BlY3RpdmVDYW1lcmEgb25seSApCisJdGhp
cy5taW5EaXN0YW5jZSA9IDA7CisJdGhpcy5tYXhEaXN0YW5jZSA9IEluZmluaXR5OworCisJLy8g
SG93IGZhciB5b3UgY2FuIHpvb20gaW4gYW5kIG91dCAoIE9ydGhvZ3JhcGhpY0NhbWVyYSBvbmx5
ICkKKwl0aGlzLm1pblpvb20gPSAwOworCXRoaXMubWF4Wm9vbSA9IEluZmluaXR5OworCisJLy8g
SG93IGZhciB5b3UgY2FuIG9yYml0IHZlcnRpY2FsbHksIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMu
CisJLy8gUmFuZ2UgaXMgMCB0byBNYXRoLlBJIHJhZGlhbnMuCisJdGhpcy5taW5Qb2xhckFuZ2xl
ID0gMDsgLy8gcmFkaWFucworCXRoaXMubWF4UG9sYXJBbmdsZSA9IE1hdGguUEk7IC8vIHJhZGlh
bnMKKworCS8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCBob3Jpem9udGFsbHksIHVwcGVyIGFuZCBs
b3dlciBsaW1pdHMuCisJLy8gSWYgc2V0LCBtdXN0IGJlIGEgc3ViLWludGVydmFsIG9mIHRoZSBp
bnRlcnZhbCBbIC0gTWF0aC5QSSwgTWF0aC5QSSBdLgorCXRoaXMubWluQXppbXV0aEFuZ2xlID0g
LSBJbmZpbml0eTsgLy8gcmFkaWFucworCXRoaXMubWF4QXppbXV0aEFuZ2xlID0gSW5maW5pdHk7
IC8vIHJhZGlhbnMKKworCS8vIFNldCB0byB0cnVlIHRvIGVuYWJsZSBkYW1waW5nIChpbmVydGlh
KQorCS8vIElmIGRhbXBpbmcgaXMgZW5hYmxlZCwgeW91IG11c3QgY2FsbCBjb250cm9scy51cGRh
dGUoKSBpbiB5b3VyIGFuaW1hdGlvbiBsb29wCisJdGhpcy5lbmFibGVEYW1waW5nID0gZmFsc2U7
CisJdGhpcy5kYW1waW5nRmFjdG9yID0gMC4yNTsKKworCS8vIFRoaXMgb3B0aW9uIGFjdHVhbGx5
IGVuYWJsZXMgZG9sbHlpbmcgaW4gYW5kIG91dDsgbGVmdCBhcyAiem9vbSIgZm9yIGJhY2t3YXJk
cyBjb21wYXRpYmlsaXR5LgorCS8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHpvb21pbmcKKwl0
aGlzLmVuYWJsZVpvb20gPSB0cnVlOworCXRoaXMuem9vbVNwZWVkID0gMS4wOworCisJLy8gU2V0
IHRvIGZhbHNlIHRvIGRpc2FibGUgcm90YXRpbmcKKwl0aGlzLmVuYWJsZVJvdGF0ZSA9IHRydWU7
CisJdGhpcy5yb3RhdGVTcGVlZCA9IDEuMDsKKworCS8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxl
IHBhbm5pbmcKKwl0aGlzLmVuYWJsZVBhbiA9IHRydWU7CisJdGhpcy5rZXlQYW5TcGVlZCA9IDcu
MDsJLy8gcGl4ZWxzIG1vdmVkIHBlciBhcnJvdyBrZXkgcHVzaAorCisJLy8gU2V0IHRvIHRydWUg
dG8gYXV0b21hdGljYWxseSByb3RhdGUgYXJvdW5kIHRoZSB0YXJnZXQKKwkvLyBJZiBhdXRvLXJv
dGF0ZSBpcyBlbmFibGVkLCB5b3UgbXVzdCBjYWxsIGNvbnRyb2xzLnVwZGF0ZSgpIGluIHlvdXIg
YW5pbWF0aW9uIGxvb3AKKwl0aGlzLmF1dG9Sb3RhdGUgPSBmYWxzZTsKKwl0aGlzLmF1dG9Sb3Rh
dGVTcGVlZCA9IDIuMDsgLy8gMzAgc2Vjb25kcyBwZXIgcm91bmQgd2hlbiBmcHMgaXMgNjAKKwor
CS8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHVzZSBvZiB0aGUga2V5cworCXRoaXMuZW5hYmxl
S2V5cyA9IHRydWU7CisKKwkvLyBUaGUgZm91ciBhcnJvdyBrZXlzCisJdGhpcy5rZXlzID0geyBM
RUZUOiAzNywgVVA6IDM4LCBSSUdIVDogMzksIEJPVFRPTTogNDAgfTsKKworCS8vIE1vdXNlIGJ1
dHRvbnMKKwl0aGlzLm1vdXNlQnV0dG9ucyA9IHsgT1JCSVQ6IFRIUkVFLk1PVVNFLkxFRlQsIFpP
T006IFRIUkVFLk1PVVNFLk1JRERMRSwgUEFOOiBUSFJFRS5NT1VTRS5SSUdIVCB9OworCisJLy8g
Zm9yIHJlc2V0CisJdGhpcy50YXJnZXQwID0gdGhpcy50YXJnZXQuY2xvbmUoKTsKKwl0aGlzLnBv
c2l0aW9uMCA9IHRoaXMub2JqZWN0LnBvc2l0aW9uLmNsb25lKCk7CisJdGhpcy56b29tMCA9IHRo
aXMub2JqZWN0Lnpvb207CisKKwkvLworCS8vIHB1YmxpYyBtZXRob2RzCisJLy8KKworCXRoaXMu
Z2V0UG9sYXJBbmdsZSA9IGZ1bmN0aW9uICgpIHsKKworCQlyZXR1cm4gc3BoZXJpY2FsLnBoaTsK
KworCX07CisKKwl0aGlzLmdldEF6aW11dGhhbEFuZ2xlID0gZnVuY3Rpb24gKCkgeworCisJCXJl
dHVybiBzcGhlcmljYWwudGhldGE7CisKKwl9OworCisJdGhpcy5zYXZlU3RhdGUgPSBmdW5jdGlv
biAoKSB7CisKKwkJc2NvcGUudGFyZ2V0MC5jb3B5KCBzY29wZS50YXJnZXQgKTsKKwkJc2NvcGUu
cG9zaXRpb24wLmNvcHkoIHNjb3BlLm9iamVjdC5wb3NpdGlvbiApOworCQlzY29wZS56b29tMCA9
IHNjb3BlLm9iamVjdC56b29tOworCisJfTsKKworCXRoaXMucmVzZXQgPSBmdW5jdGlvbiAoKSB7
CisKKwkJc2NvcGUudGFyZ2V0LmNvcHkoIHNjb3BlLnRhcmdldDAgKTsKKwkJc2NvcGUub2JqZWN0
LnBvc2l0aW9uLmNvcHkoIHNjb3BlLnBvc2l0aW9uMCApOworCQlzY29wZS5vYmplY3Quem9vbSA9
IHNjb3BlLnpvb20wOworCisJCXNjb3BlLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7
CisJCXNjb3BlLmRpc3BhdGNoRXZlbnQoIGNoYW5nZUV2ZW50ICk7CisKKwkJc2NvcGUudXBkYXRl
KCk7CisKKwkJc3RhdGUgPSBTVEFURS5OT05FOworCisJfTsKKworCS8vIHRoaXMgbWV0aG9kIGlz
IGV4cG9zZWQsIGJ1dCBwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciBpZiB3ZSBjYW4gbWFrZSBp
dCBwcml2YXRlLi4uCisJdGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoKSB7CisKKwkJdmFyIG9mZnNl
dCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7CisKKwkJLy8gc28gY2FtZXJhLnVwIGlzIHRoZSBvcmJp
dCBheGlzCisJCXZhciBxdWF0ID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tVW5pdFZl
Y3RvcnMoIG9iamVjdC51cCwgbmV3IFRIUkVFLlZlY3RvcjMoIDAsIDEsIDAgKSApOworCQl2YXIg
cXVhdEludmVyc2UgPSBxdWF0LmNsb25lKCkuaW52ZXJzZSgpOworCisJCXZhciBsYXN0UG9zaXRp
b24gPSBuZXcgVEhSRUUuVmVjdG9yMygpOworCQl2YXIgbGFzdFF1YXRlcm5pb24gPSBuZXcgVEhS
RUUuUXVhdGVybmlvbigpOworCisJCXJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7CisKKwkJCXZh
ciBwb3NpdGlvbiA9IHNjb3BlLm9iamVjdC5wb3NpdGlvbjsKKworCQkJb2Zmc2V0LmNvcHkoIHBv
c2l0aW9uICkuc3ViKCBzY29wZS50YXJnZXQgKTsKKworCQkJLy8gcm90YXRlIG9mZnNldCB0byAi
eS1heGlzLWlzLXVwIiBzcGFjZQorCQkJb2Zmc2V0LmFwcGx5UXVhdGVybmlvbiggcXVhdCApOwor
CisJCQkvLyBhbmdsZSBmcm9tIHotYXhpcyBhcm91bmQgeS1heGlzCisJCQlzcGhlcmljYWwuc2V0
RnJvbVZlY3RvcjMoIG9mZnNldCApOworCisJCQlpZiAoIHNjb3BlLmF1dG9Sb3RhdGUgJiYgc3Rh
dGUgPT09IFNUQVRFLk5PTkUgKSB7CisKKwkJCQlyb3RhdGVMZWZ0KCBnZXRBdXRvUm90YXRpb25B
bmdsZSgpICk7CisKKwkJCX0KKworCQkJc3BoZXJpY2FsLnRoZXRhICs9IHNwaGVyaWNhbERlbHRh
LnRoZXRhOworCQkJc3BoZXJpY2FsLnBoaSArPSBzcGhlcmljYWxEZWx0YS5waGk7CisKKwkJCS8v
IHJlc3RyaWN0IHRoZXRhIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHMKKwkJCXNwaGVyaWNh
bC50aGV0YSA9IE1hdGgubWF4KCBzY29wZS5taW5BemltdXRoQW5nbGUsIE1hdGgubWluKCBzY29w
ZS5tYXhBemltdXRoQW5nbGUsIHNwaGVyaWNhbC50aGV0YSApICk7CisKKwkJCS8vIHJlc3RyaWN0
IHBoaSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzCisJCQlzcGhlcmljYWwucGhpID0gTWF0
aC5tYXgoIHNjb3BlLm1pblBvbGFyQW5nbGUsIE1hdGgubWluKCBzY29wZS5tYXhQb2xhckFuZ2xl
LCBzcGhlcmljYWwucGhpICkgKTsKKworCQkJc3BoZXJpY2FsLm1ha2VTYWZlKCk7CisKKworCQkJ
c3BoZXJpY2FsLnJhZGl1cyAqPSBzY2FsZTsKKworCQkJLy8gcmVzdHJpY3QgcmFkaXVzIHRvIGJl
IGJldHdlZW4gZGVzaXJlZCBsaW1pdHMKKwkJCXNwaGVyaWNhbC5yYWRpdXMgPSBNYXRoLm1heCgg
c2NvcGUubWluRGlzdGFuY2UsIE1hdGgubWluKCBzY29wZS5tYXhEaXN0YW5jZSwgc3BoZXJpY2Fs
LnJhZGl1cyApICk7CisKKwkJCS8vIG1vdmUgdGFyZ2V0IHRvIHBhbm5lZCBsb2NhdGlvbgorCQkJ
c2NvcGUudGFyZ2V0LmFkZCggcGFuT2Zmc2V0ICk7CisKKwkJCW9mZnNldC5zZXRGcm9tU3BoZXJp
Y2FsKCBzcGhlcmljYWwgKTsKKworCQkJLy8gcm90YXRlIG9mZnNldCBiYWNrIHRvICJjYW1lcmEt
dXAtdmVjdG9yLWlzLXVwIiBzcGFjZQorCQkJb2Zmc2V0LmFwcGx5UXVhdGVybmlvbiggcXVhdElu
dmVyc2UgKTsKKworCQkJcG9zaXRpb24uY29weSggc2NvcGUudGFyZ2V0ICkuYWRkKCBvZmZzZXQg
KTsKKworCQkJc2NvcGUub2JqZWN0Lmxvb2tBdCggc2NvcGUudGFyZ2V0ICk7CisKKwkJCWlmICgg
c2NvcGUuZW5hYmxlRGFtcGluZyA9PT0gdHJ1ZSApIHsKKworCQkJCXNwaGVyaWNhbERlbHRhLnRo
ZXRhICo9ICggMSAtIHNjb3BlLmRhbXBpbmdGYWN0b3IgKTsKKwkJCQlzcGhlcmljYWxEZWx0YS5w
aGkgKj0gKCAxIC0gc2NvcGUuZGFtcGluZ0ZhY3RvciApOworCisJCQl9IGVsc2UgeworCisJCQkJ
c3BoZXJpY2FsRGVsdGEuc2V0KCAwLCAwLCAwICk7CisKKwkJCX0KKworCQkJc2NhbGUgPSAxOwor
CQkJcGFuT2Zmc2V0LnNldCggMCwgMCwgMCApOworCisJCQkvLyB1cGRhdGUgY29uZGl0aW9uIGlz
OgorCQkJLy8gbWluKGNhbWVyYSBkaXNwbGFjZW1lbnQsIGNhbWVyYSByb3RhdGlvbiBpbiByYWRp
YW5zKV4yID4gRVBTCisJCQkvLyB1c2luZyBzbWFsbC1hbmdsZSBhcHByb3hpbWF0aW9uIGNvcyh4
LzIpID0gMSAtIHheMiAvIDgKKworCQkJaWYgKCB6b29tQ2hhbmdlZCB8fAorCQkJCWxhc3RQb3Np
dGlvbi5kaXN0YW5jZVRvU3F1YXJlZCggc2NvcGUub2JqZWN0LnBvc2l0aW9uICkgPiBFUFMgfHwK
KwkJCQk4ICogKCAxIC0gbGFzdFF1YXRlcm5pb24uZG90KCBzY29wZS5vYmplY3QucXVhdGVybmlv
biApICkgPiBFUFMgKSB7CisKKwkJCQlzY29wZS5kaXNwYXRjaEV2ZW50KCBjaGFuZ2VFdmVudCAp
OworCisJCQkJbGFzdFBvc2l0aW9uLmNvcHkoIHNjb3BlLm9iamVjdC5wb3NpdGlvbiApOworCQkJ
CWxhc3RRdWF0ZXJuaW9uLmNvcHkoIHNjb3BlLm9iamVjdC5xdWF0ZXJuaW9uICk7CisJCQkJem9v
bUNoYW5nZWQgPSBmYWxzZTsKKworCQkJCXJldHVybiB0cnVlOworCisJCQl9CisKKwkJCXJldHVy
biBmYWxzZTsKKworCQl9OworCisJfSgpOworCisJdGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkg
eworCisJCXNjb3BlLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2NvbnRleHRtZW51
Jywgb25Db250ZXh0TWVudSwgZmFsc2UgKTsKKwkJc2NvcGUuZG9tRWxlbWVudC5yZW1vdmVFdmVu
dExpc3RlbmVyKCAnbW91c2Vkb3duJywgb25Nb3VzZURvd24sIGZhbHNlICk7CisJCXNjb3BlLmRv
bUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3doZWVsJywgb25Nb3VzZVdoZWVsLCBmYWxz
ZSApOworCisJCXNjb3BlLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3RvdWNoc3Rh
cnQnLCBvblRvdWNoU3RhcnQsIGZhbHNlICk7CisJCXNjb3BlLmRvbUVsZW1lbnQucmVtb3ZlRXZl
bnRMaXN0ZW5lciggJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCwgZmFsc2UgKTsKKwkJc2NvcGUuZG9t
RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIGZh
bHNlICk7CisKKwkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNlbW92ZScsIG9u
TW91c2VNb3ZlLCBmYWxzZSApOworCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91
c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UgKTsKKworCQl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5l
ciggJ2tleWRvd24nLCBvbktleURvd24sIGZhbHNlICk7CisKKwkJLy9zY29wZS5kaXNwYXRjaEV2
ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7IC8vIHNob3VsZCB0aGlzIGJlIGFkZGVkIGhlcmU/
CisKKwl9OworCisJLy8KKwkvLyBpbnRlcm5hbHMKKwkvLworCisJdmFyIHNjb3BlID0gdGhpczsK
KworCXZhciBjaGFuZ2VFdmVudCA9IHsgdHlwZTogJ2NoYW5nZScgfTsKKwl2YXIgc3RhcnRFdmVu
dCA9IHsgdHlwZTogJ3N0YXJ0JyB9OworCXZhciBlbmRFdmVudCA9IHsgdHlwZTogJ2VuZCcgfTsK
KworCXZhciBTVEFURSA9IHsgTk9ORTogLSAxLCBST1RBVEU6IDAsIERPTExZOiAxLCBQQU46IDIs
IFRPVUNIX1JPVEFURTogMywgVE9VQ0hfRE9MTFk6IDQsIFRPVUNIX1BBTjogNSB9OworCisJdmFy
IHN0YXRlID0gU1RBVEUuTk9ORTsKKworCXZhciBFUFMgPSAwLjAwMDAwMTsKKworCS8vIGN1cnJl
bnQgcG9zaXRpb24gaW4gc3BoZXJpY2FsIGNvb3JkaW5hdGVzCisJdmFyIHNwaGVyaWNhbCA9IG5l
dyBUSFJFRS5TcGhlcmljYWwoKTsKKwl2YXIgc3BoZXJpY2FsRGVsdGEgPSBuZXcgVEhSRUUuU3Bo
ZXJpY2FsKCk7CisKKwl2YXIgc2NhbGUgPSAxOworCXZhciBwYW5PZmZzZXQgPSBuZXcgVEhSRUUu
VmVjdG9yMygpOworCXZhciB6b29tQ2hhbmdlZCA9IGZhbHNlOworCisJdmFyIHJvdGF0ZVN0YXJ0
ID0gbmV3IFRIUkVFLlZlY3RvcjIoKTsKKwl2YXIgcm90YXRlRW5kID0gbmV3IFRIUkVFLlZlY3Rv
cjIoKTsKKwl2YXIgcm90YXRlRGVsdGEgPSBuZXcgVEhSRUUuVmVjdG9yMigpOworCisJdmFyIHBh
blN0YXJ0ID0gbmV3IFRIUkVFLlZlY3RvcjIoKTsKKwl2YXIgcGFuRW5kID0gbmV3IFRIUkVFLlZl
Y3RvcjIoKTsKKwl2YXIgcGFuRGVsdGEgPSBuZXcgVEhSRUUuVmVjdG9yMigpOworCisJdmFyIGRv
bGx5U3RhcnQgPSBuZXcgVEhSRUUuVmVjdG9yMigpOworCXZhciBkb2xseUVuZCA9IG5ldyBUSFJF
RS5WZWN0b3IyKCk7CisJdmFyIGRvbGx5RGVsdGEgPSBuZXcgVEhSRUUuVmVjdG9yMigpOworCisJ
ZnVuY3Rpb24gZ2V0QXV0b1JvdGF0aW9uQW5nbGUoKSB7CisKKwkJcmV0dXJuIDIgKiBNYXRoLlBJ
IC8gNjAgLyA2MCAqIHNjb3BlLmF1dG9Sb3RhdGVTcGVlZDsKKworCX0KKworCWZ1bmN0aW9uIGdl
dFpvb21TY2FsZSgpIHsKKworCQlyZXR1cm4gTWF0aC5wb3coIDAuOTUsIHNjb3BlLnpvb21TcGVl
ZCApOworCisJfQorCisJZnVuY3Rpb24gcm90YXRlTGVmdCggYW5nbGUgKSB7CisKKwkJc3BoZXJp
Y2FsRGVsdGEudGhldGEgLT0gYW5nbGU7CisKKwl9CisKKwlmdW5jdGlvbiByb3RhdGVVcCggYW5n
bGUgKSB7CisKKwkJc3BoZXJpY2FsRGVsdGEucGhpIC09IGFuZ2xlOworCisJfQorCisJdmFyIHBh
bkxlZnQgPSBmdW5jdGlvbiAoKSB7CisKKwkJdmFyIHYgPSBuZXcgVEhSRUUuVmVjdG9yMygpOwor
CisJCXJldHVybiBmdW5jdGlvbiBwYW5MZWZ0KCBkaXN0YW5jZSwgb2JqZWN0TWF0cml4ICkgewor
CisJCQl2LnNldEZyb21NYXRyaXhDb2x1bW4oIG9iamVjdE1hdHJpeCwgMCApOyAvLyBnZXQgWCBj
b2x1bW4gb2Ygb2JqZWN0TWF0cml4CisJCQl2Lm11bHRpcGx5U2NhbGFyKCAtIGRpc3RhbmNlICk7
CisKKwkJCXBhbk9mZnNldC5hZGQoIHYgKTsKKworCQl9OworCisJfSgpOworCisJdmFyIHBhblVw
ID0gZnVuY3Rpb24gKCkgeworCisJCXZhciB2ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTsKKworCQly
ZXR1cm4gZnVuY3Rpb24gcGFuVXAoIGRpc3RhbmNlLCBvYmplY3RNYXRyaXggKSB7CisKKwkJCXYu
c2V0RnJvbU1hdHJpeENvbHVtbiggb2JqZWN0TWF0cml4LCAxICk7IC8vIGdldCBZIGNvbHVtbiBv
ZiBvYmplY3RNYXRyaXgKKwkJCXYubXVsdGlwbHlTY2FsYXIoIGRpc3RhbmNlICk7CisKKwkJCXBh
bk9mZnNldC5hZGQoIHYgKTsKKworCQl9OworCisJfSgpOworCisJLy8gZGVsdGFYIGFuZCBkZWx0
YVkgYXJlIGluIHBpeGVsczsgcmlnaHQgYW5kIGRvd24gYXJlIHBvc2l0aXZlCisJdmFyIHBhbiA9
IGZ1bmN0aW9uICgpIHsKKworCQl2YXIgb2Zmc2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTsKKwor
CQlyZXR1cm4gZnVuY3Rpb24gcGFuKCBkZWx0YVgsIGRlbHRhWSApIHsKKworCQkJdmFyIGVsZW1l
bnQgPSBzY29wZS5kb21FbGVtZW50ID09PSBkb2N1bWVudCA/IHNjb3BlLmRvbUVsZW1lbnQuYm9k
eSA6IHNjb3BlLmRvbUVsZW1lbnQ7CisKKwkJCWlmICggc2NvcGUub2JqZWN0IGluc3RhbmNlb2Yg
VEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEgKSB7CisKKwkJCQkvLyBwZXJzcGVjdGl2ZQorCQkJCXZh
ciBwb3NpdGlvbiA9IHNjb3BlLm9iamVjdC5wb3NpdGlvbjsKKwkJCQlvZmZzZXQuY29weSggcG9z
aXRpb24gKS5zdWIoIHNjb3BlLnRhcmdldCApOworCQkJCXZhciB0YXJnZXREaXN0YW5jZSA9IG9m
ZnNldC5sZW5ndGgoKTsKKworCQkJCS8vIGhhbGYgb2YgdGhlIGZvdiBpcyBjZW50ZXIgdG8gdG9w
IG9mIHNjcmVlbgorCQkJCXRhcmdldERpc3RhbmNlICo9IE1hdGgudGFuKCAoIHNjb3BlLm9iamVj
dC5mb3YgLyAyICkgKiBNYXRoLlBJIC8gMTgwLjAgKTsKKworCQkJCS8vIHdlIGFjdHVhbGx5IGRv
bid0IHVzZSBzY3JlZW5XaWR0aCwgc2luY2UgcGVyc3BlY3RpdmUgY2FtZXJhIGlzIGZpeGVkIHRv
IHNjcmVlbiBoZWlnaHQKKwkJCQlwYW5MZWZ0KCAyICogZGVsdGFYICogdGFyZ2V0RGlzdGFuY2Ug
LyBlbGVtZW50LmNsaWVudEhlaWdodCwgc2NvcGUub2JqZWN0Lm1hdHJpeCApOworCQkJCXBhblVw
KCAyICogZGVsdGFZICogdGFyZ2V0RGlzdGFuY2UgLyBlbGVtZW50LmNsaWVudEhlaWdodCwgc2Nv
cGUub2JqZWN0Lm1hdHJpeCApOworCisJCQl9IGVsc2UgaWYgKCBzY29wZS5vYmplY3QgaW5zdGFu
Y2VvZiBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEgKSB7CisKKwkJCQkvLyBvcnRob2dyYXBoaWMK
KwkJCQlwYW5MZWZ0KCBkZWx0YVggKiAoIHNjb3BlLm9iamVjdC5yaWdodCAtIHNjb3BlLm9iamVj
dC5sZWZ0ICkgLyBzY29wZS5vYmplY3Quem9vbSAvIGVsZW1lbnQuY2xpZW50V2lkdGgsIHNjb3Bl
Lm9iamVjdC5tYXRyaXggKTsKKwkJCQlwYW5VcCggZGVsdGFZICogKCBzY29wZS5vYmplY3QudG9w
IC0gc2NvcGUub2JqZWN0LmJvdHRvbSApIC8gc2NvcGUub2JqZWN0Lnpvb20gLyBlbGVtZW50LmNs
aWVudEhlaWdodCwgc2NvcGUub2JqZWN0Lm1hdHJpeCApOworCisJCQl9IGVsc2UgeworCisJCQkJ
Ly8gY2FtZXJhIG5laXRoZXIgb3J0aG9ncmFwaGljIG5vciBwZXJzcGVjdGl2ZQorCQkJCWNvbnNv
bGUud2FybiggJ1dBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93
biBjYW1lcmEgdHlwZSAtIHBhbiBkaXNhYmxlZC4nICk7CisJCQkJc2NvcGUuZW5hYmxlUGFuID0g
ZmFsc2U7CisKKwkJCX0KKworCQl9OworCisJfSgpOworCisJZnVuY3Rpb24gZG9sbHlJbiggZG9s
bHlTY2FsZSApIHsKKworCQlpZiAoIHNjb3BlLm9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLlBlcnNw
ZWN0aXZlQ2FtZXJhICkgeworCisJCQlzY2FsZSAvPSBkb2xseVNjYWxlOworCisJCX0gZWxzZSBp
ZiAoIHNjb3BlLm9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSApIHsK
KworCQkJc2NvcGUub2JqZWN0Lnpvb20gPSBNYXRoLm1heCggc2NvcGUubWluWm9vbSwgTWF0aC5t
aW4oIHNjb3BlLm1heFpvb20sIHNjb3BlLm9iamVjdC56b29tICogZG9sbHlTY2FsZSApICk7CisJ
CQlzY29wZS5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOworCQkJem9vbUNoYW5nZWQg
PSB0cnVlOworCisJCX0gZWxzZSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1dBUk5JTkc6IE9yYml0
Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIGRvbGx5L3pv
b20gZGlzYWJsZWQuJyApOworCQkJc2NvcGUuZW5hYmxlWm9vbSA9IGZhbHNlOworCisJCX0KKwor
CX0KKworCWZ1bmN0aW9uIGRvbGx5T3V0KCBkb2xseVNjYWxlICkgeworCisJCWlmICggc2NvcGUu
b2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEgKSB7CisKKwkJCXNjYWxl
ICo9IGRvbGx5U2NhbGU7CisKKwkJfSBlbHNlIGlmICggc2NvcGUub2JqZWN0IGluc3RhbmNlb2Yg
VEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhICkgeworCisJCQlzY29wZS5vYmplY3Quem9vbSA9IE1h
dGgubWF4KCBzY29wZS5taW5ab29tLCBNYXRoLm1pbiggc2NvcGUubWF4Wm9vbSwgc2NvcGUub2Jq
ZWN0Lnpvb20gLyBkb2xseVNjYWxlICkgKTsKKwkJCXNjb3BlLm9iamVjdC51cGRhdGVQcm9qZWN0
aW9uTWF0cml4KCk7CisJCQl6b29tQ2hhbmdlZCA9IHRydWU7CisKKwkJfSBlbHNlIHsKKworCQkJ
Y29uc29sZS53YXJuKCAnV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1
bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4nICk7CisJCQlzY29wZS5l
bmFibGVab29tID0gZmFsc2U7CisKKwkJfQorCisJfQorCisJLy8KKwkvLyBldmVudCBjYWxsYmFj
a3MgLSB1cGRhdGUgdGhlIG9iamVjdCBzdGF0ZQorCS8vCisKKwlmdW5jdGlvbiBoYW5kbGVNb3Vz
ZURvd25Sb3RhdGUoIGV2ZW50ICkgeworCisJCS8vY29uc29sZS5sb2coICdoYW5kbGVNb3VzZURv
d25Sb3RhdGUnICk7CisKKwkJcm90YXRlU3RhcnQuc2V0KCBldmVudC5jbGllbnRYLCBldmVudC5j
bGllbnRZICk7CisKKwl9CisKKwlmdW5jdGlvbiBoYW5kbGVNb3VzZURvd25Eb2xseSggZXZlbnQg
KSB7CisKKwkJLy9jb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlRG93bkRvbGx5JyApOworCisJCWRv
bGx5U3RhcnQuc2V0KCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZICk7CisKKwl9CisKKwlm
dW5jdGlvbiBoYW5kbGVNb3VzZURvd25QYW4oIGV2ZW50ICkgeworCisJCS8vY29uc29sZS5sb2co
ICdoYW5kbGVNb3VzZURvd25QYW4nICk7CisKKwkJcGFuU3RhcnQuc2V0KCBldmVudC5jbGllbnRY
LCBldmVudC5jbGllbnRZICk7CisKKwl9CisKKwlmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmVSb3Rh
dGUoIGV2ZW50ICkgeworCisJCS8vY29uc29sZS5sb2coICdoYW5kbGVNb3VzZU1vdmVSb3RhdGUn
ICk7CisKKwkJcm90YXRlRW5kLnNldCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSApOwor
CQlyb3RhdGVEZWx0YS5zdWJWZWN0b3JzKCByb3RhdGVFbmQsIHJvdGF0ZVN0YXJ0ICk7CisKKwkJ
dmFyIGVsZW1lbnQgPSBzY29wZS5kb21FbGVtZW50ID09PSBkb2N1bWVudCA/IHNjb3BlLmRvbUVs
ZW1lbnQuYm9keSA6IHNjb3BlLmRvbUVsZW1lbnQ7CisKKwkJLy8gcm90YXRpbmcgYWNyb3NzIHdo
b2xlIHNjcmVlbiBnb2VzIDM2MCBkZWdyZWVzIGFyb3VuZAorCQlyb3RhdGVMZWZ0KCAyICogTWF0
aC5QSSAqIHJvdGF0ZURlbHRhLnggLyBlbGVtZW50LmNsaWVudFdpZHRoICogc2NvcGUucm90YXRl
U3BlZWQgKTsKKworCQkvLyByb3RhdGluZyB1cCBhbmQgZG93biBhbG9uZyB3aG9sZSBzY3JlZW4g
YXR0ZW1wdHMgdG8gZ28gMzYwLCBidXQgbGltaXRlZCB0byAxODAKKwkJcm90YXRlVXAoIDIgKiBN
YXRoLlBJICogcm90YXRlRGVsdGEueSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0ICogc2NvcGUucm90
YXRlU3BlZWQgKTsKKworCQlyb3RhdGVTdGFydC5jb3B5KCByb3RhdGVFbmQgKTsKKworCQlzY29w
ZS51cGRhdGUoKTsKKworCX0KKworCWZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZURvbGx5KCBldmVu
dCApIHsKKworCQkvL2NvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VNb3ZlRG9sbHknICk7CisKKwkJ
ZG9sbHlFbmQuc2V0KCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZICk7CisKKwkJZG9sbHlE
ZWx0YS5zdWJWZWN0b3JzKCBkb2xseUVuZCwgZG9sbHlTdGFydCApOworCisJCWlmICggZG9sbHlE
ZWx0YS55ID4gMCApIHsKKworCQkJZG9sbHlJbiggZ2V0Wm9vbVNjYWxlKCkgKTsKKworCQl9IGVs
c2UgaWYgKCBkb2xseURlbHRhLnkgPCAwICkgeworCisJCQlkb2xseU91dCggZ2V0Wm9vbVNjYWxl
KCkgKTsKKworCQl9CisKKwkJZG9sbHlTdGFydC5jb3B5KCBkb2xseUVuZCApOworCisJCXNjb3Bl
LnVwZGF0ZSgpOworCisJfQorCisJZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlUGFuKCBldmVudCAp
IHsKKworCQkvL2NvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VNb3ZlUGFuJyApOworCisJCXBhbkVu
ZC5zZXQoIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkgKTsKKworCQlwYW5EZWx0YS5zdWJW
ZWN0b3JzKCBwYW5FbmQsIHBhblN0YXJ0ICk7CisKKwkJcGFuKCBwYW5EZWx0YS54LCBwYW5EZWx0
YS55ICk7CisKKwkJcGFuU3RhcnQuY29weSggcGFuRW5kICk7CisKKwkJc2NvcGUudXBkYXRlKCk7
CisKKwl9CisKKwlmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKCBldmVudCApIHsKKworCQkvLyBjb25z
b2xlLmxvZyggJ2hhbmRsZU1vdXNlVXAnICk7CisKKwl9CisKKwlmdW5jdGlvbiBoYW5kbGVNb3Vz
ZVdoZWVsKCBldmVudCApIHsKKworCQkvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlV2hlZWwn
ICk7CisKKwkJaWYgKCBldmVudC5kZWx0YVkgPCAwICkgeworCisJCQlkb2xseU91dCggZ2V0Wm9v
bVNjYWxlKCkgKTsKKworCQl9IGVsc2UgaWYgKCBldmVudC5kZWx0YVkgPiAwICkgeworCisJCQlk
b2xseUluKCBnZXRab29tU2NhbGUoKSApOworCisJCX0KKworCQlzY29wZS51cGRhdGUoKTsKKwor
CX0KKworCWZ1bmN0aW9uIGhhbmRsZUtleURvd24oIGV2ZW50ICkgeworCisJCS8vY29uc29sZS5s
b2coICdoYW5kbGVLZXlEb3duJyApOworCisJCXN3aXRjaCAoIGV2ZW50LmtleUNvZGUgKSB7CisK
KwkJCWNhc2Ugc2NvcGUua2V5cy5VUDoKKwkJCQlwYW4oIDAsIHNjb3BlLmtleVBhblNwZWVkICk7
CisJCQkJc2NvcGUudXBkYXRlKCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2Ugc2NvcGUua2V5cy5C
T1RUT006CisJCQkJcGFuKCAwLCAtIHNjb3BlLmtleVBhblNwZWVkICk7CisJCQkJc2NvcGUudXBk
YXRlKCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2Ugc2NvcGUua2V5cy5MRUZUOgorCQkJCXBhbigg
c2NvcGUua2V5UGFuU3BlZWQsIDAgKTsKKwkJCQlzY29wZS51cGRhdGUoKTsKKwkJCQlicmVhazsK
KworCQkJY2FzZSBzY29wZS5rZXlzLlJJR0hUOgorCQkJCXBhbiggLSBzY29wZS5rZXlQYW5TcGVl
ZCwgMCApOworCQkJCXNjb3BlLnVwZGF0ZSgpOworCQkJCWJyZWFrOworCisJCX0KKworCX0KKwor
CWZ1bmN0aW9uIGhhbmRsZVRvdWNoU3RhcnRSb3RhdGUoIGV2ZW50ICkgeworCisJCS8vY29uc29s
ZS5sb2coICdoYW5kbGVUb3VjaFN0YXJ0Um90YXRlJyApOworCisJCXJvdGF0ZVN0YXJ0LnNldCgg
ZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VYLCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVkgKTsKKwor
CX0KKworCWZ1bmN0aW9uIGhhbmRsZVRvdWNoU3RhcnREb2xseSggZXZlbnQgKSB7CisKKwkJLy9j
b25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoU3RhcnREb2xseScgKTsKKworCQl2YXIgZHggPSBldmVu
dC50b3VjaGVzWyAwIF0ucGFnZVggLSBldmVudC50b3VjaGVzWyAxIF0ucGFnZVg7CisJCXZhciBk
eSA9IGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbIDEgXS5wYWdlWTsK
KworCQl2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoIGR4ICogZHggKyBkeSAqIGR5ICk7CisKKwkJ
ZG9sbHlTdGFydC5zZXQoIDAsIGRpc3RhbmNlICk7CisKKwl9CisKKwlmdW5jdGlvbiBoYW5kbGVU
b3VjaFN0YXJ0UGFuKCBldmVudCApIHsKKworCQkvL2NvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hT
dGFydFBhbicgKTsKKworCQlwYW5TdGFydC5zZXQoIGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWCwg
ZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VZICk7CisKKwl9CisKKwlmdW5jdGlvbiBoYW5kbGVUb3Vj
aE1vdmVSb3RhdGUoIGV2ZW50ICkgeworCisJCS8vY29uc29sZS5sb2coICdoYW5kbGVUb3VjaE1v
dmVSb3RhdGUnICk7CisKKwkJcm90YXRlRW5kLnNldCggZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VY
LCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVkgKTsKKwkJcm90YXRlRGVsdGEuc3ViVmVjdG9ycygg
cm90YXRlRW5kLCByb3RhdGVTdGFydCApOworCisJCXZhciBlbGVtZW50ID0gc2NvcGUuZG9tRWxl
bWVudCA9PT0gZG9jdW1lbnQgPyBzY29wZS5kb21FbGVtZW50LmJvZHkgOiBzY29wZS5kb21FbGVt
ZW50OworCisJCS8vIHJvdGF0aW5nIGFjcm9zcyB3aG9sZSBzY3JlZW4gZ29lcyAzNjAgZGVncmVl
cyBhcm91bmQKKwkJcm90YXRlTGVmdCggMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS54IC8gZWxl
bWVudC5jbGllbnRXaWR0aCAqIHNjb3BlLnJvdGF0ZVNwZWVkICk7CisKKwkJLy8gcm90YXRpbmcg
dXAgYW5kIGRvd24gYWxvbmcgd2hvbGUgc2NyZWVuIGF0dGVtcHRzIHRvIGdvIDM2MCwgYnV0IGxp
bWl0ZWQgdG8gMTgwCisJCXJvdGF0ZVVwKCAyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnkgLyBl
bGVtZW50LmNsaWVudEhlaWdodCAqIHNjb3BlLnJvdGF0ZVNwZWVkICk7CisKKwkJcm90YXRlU3Rh
cnQuY29weSggcm90YXRlRW5kICk7CisKKwkJc2NvcGUudXBkYXRlKCk7CisKKwl9CisKKwlmdW5j
dGlvbiBoYW5kbGVUb3VjaE1vdmVEb2xseSggZXZlbnQgKSB7CisKKwkJLy9jb25zb2xlLmxvZygg
J2hhbmRsZVRvdWNoTW92ZURvbGx5JyApOworCisJCXZhciBkeCA9IGV2ZW50LnRvdWNoZXNbIDAg
XS5wYWdlWCAtIGV2ZW50LnRvdWNoZXNbIDEgXS5wYWdlWDsKKwkJdmFyIGR5ID0gZXZlbnQudG91
Y2hlc1sgMCBdLnBhZ2VZIC0gZXZlbnQudG91Y2hlc1sgMSBdLnBhZ2VZOworCisJCXZhciBkaXN0
YW5jZSA9IE1hdGguc3FydCggZHggKiBkeCArIGR5ICogZHkgKTsKKworCQlkb2xseUVuZC5zZXQo
IDAsIGRpc3RhbmNlICk7CisKKwkJZG9sbHlEZWx0YS5zdWJWZWN0b3JzKCBkb2xseUVuZCwgZG9s
bHlTdGFydCApOworCisJCWlmICggZG9sbHlEZWx0YS55ID4gMCApIHsKKworCQkJZG9sbHlPdXQo
IGdldFpvb21TY2FsZSgpICk7CisKKwkJfSBlbHNlIGlmICggZG9sbHlEZWx0YS55IDwgMCApIHsK
KworCQkJZG9sbHlJbiggZ2V0Wm9vbVNjYWxlKCkgKTsKKworCQl9CisKKwkJZG9sbHlTdGFydC5j
b3B5KCBkb2xseUVuZCApOworCisJCXNjb3BlLnVwZGF0ZSgpOworCisJfQorCisJZnVuY3Rpb24g
aGFuZGxlVG91Y2hNb3ZlUGFuKCBldmVudCApIHsKKworCQkvL2NvbnNvbGUubG9nKCAnaGFuZGxl
VG91Y2hNb3ZlUGFuJyApOworCisJCXBhbkVuZC5zZXQoIGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdl
WCwgZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VZICk7CisKKwkJcGFuRGVsdGEuc3ViVmVjdG9ycygg
cGFuRW5kLCBwYW5TdGFydCApOworCisJCXBhbiggcGFuRGVsdGEueCwgcGFuRGVsdGEueSApOwor
CisJCXBhblN0YXJ0LmNvcHkoIHBhbkVuZCApOworCisJCXNjb3BlLnVwZGF0ZSgpOworCisJfQor
CisJZnVuY3Rpb24gaGFuZGxlVG91Y2hFbmQoIGV2ZW50ICkgeworCisJCS8vY29uc29sZS5sb2co
ICdoYW5kbGVUb3VjaEVuZCcgKTsKKworCX0KKworCS8vCisJLy8gZXZlbnQgaGFuZGxlcnMgLSBG
U006IGxpc3RlbiBmb3IgZXZlbnRzIGFuZCByZXNldCBzdGF0ZQorCS8vCisKKwlmdW5jdGlvbiBv
bk1vdXNlRG93biggZXZlbnQgKSB7CisKKwkJaWYgKCBzY29wZS5lbmFibGVkID09PSBmYWxzZSAp
IHJldHVybjsKKworCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCisJCXN3aXRjaCAoIGV2ZW50
LmJ1dHRvbiApIHsKKworCQkJY2FzZSBzY29wZS5tb3VzZUJ1dHRvbnMuT1JCSVQ6CisKKwkJCQlp
ZiAoIHNjb3BlLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCQloYW5kbGVN
b3VzZURvd25Sb3RhdGUoIGV2ZW50ICk7CisKKwkJCQlzdGF0ZSA9IFNUQVRFLlJPVEFURTsKKwor
CQkJCWJyZWFrOworCisJCQljYXNlIHNjb3BlLm1vdXNlQnV0dG9ucy5aT09NOgorCisJCQkJaWYg
KCBzY29wZS5lbmFibGVab29tID09PSBmYWxzZSApIHJldHVybjsKKworCQkJCWhhbmRsZU1vdXNl
RG93bkRvbGx5KCBldmVudCApOworCisJCQkJc3RhdGUgPSBTVEFURS5ET0xMWTsKKworCQkJCWJy
ZWFrOworCisJCQljYXNlIHNjb3BlLm1vdXNlQnV0dG9ucy5QQU46CisKKwkJCQlpZiAoIHNjb3Bl
LmVuYWJsZVBhbiA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCQloYW5kbGVNb3VzZURvd25QYW4o
IGV2ZW50ICk7CisKKwkJCQlzdGF0ZSA9IFNUQVRFLlBBTjsKKworCQkJCWJyZWFrOworCisJCX0K
KworCQlpZiAoIHN0YXRlICE9PSBTVEFURS5OT05FICkgeworCisJCQlkb2N1bWVudC5hZGRFdmVu
dExpc3RlbmVyKCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlICk7CisJCQlkb2N1bWVu
dC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UgKTsKKworCQkJ
c2NvcGUuZGlzcGF0Y2hFdmVudCggc3RhcnRFdmVudCApOworCisJCX0KKworCX0KKworCWZ1bmN0
aW9uIG9uTW91c2VNb3ZlKCBldmVudCApIHsKKworCQlpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZh
bHNlICkgcmV0dXJuOworCisJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisKKwkJc3dpdGNoICgg
c3RhdGUgKSB7CisKKwkJCWNhc2UgU1RBVEUuUk9UQVRFOgorCisJCQkJaWYgKCBzY29wZS5lbmFi
bGVSb3RhdGUgPT09IGZhbHNlICkgcmV0dXJuOworCisJCQkJaGFuZGxlTW91c2VNb3ZlUm90YXRl
KCBldmVudCApOworCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1RBVEUuRE9MTFk6CisKKwkJCQlp
ZiAoIHNjb3BlLmVuYWJsZVpvb20gPT09IGZhbHNlICkgcmV0dXJuOworCisJCQkJaGFuZGxlTW91
c2VNb3ZlRG9sbHkoIGV2ZW50ICk7CisKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVEFURS5QQU46
CisKKwkJCQlpZiAoIHNjb3BlLmVuYWJsZVBhbiA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCQlo
YW5kbGVNb3VzZU1vdmVQYW4oIGV2ZW50ICk7CisKKwkJCQlicmVhazsKKworCQl9CisKKwl9CisK
KwlmdW5jdGlvbiBvbk1vdXNlVXAoIGV2ZW50ICkgeworCisJCWlmICggc2NvcGUuZW5hYmxlZCA9
PT0gZmFsc2UgKSByZXR1cm47CisKKwkJaGFuZGxlTW91c2VVcCggZXZlbnQgKTsKKworCQlkb2N1
bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNl
ICk7CisJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZXVwJywgb25Nb3VzZVVw
LCBmYWxzZSApOworCisJCXNjb3BlLmRpc3BhdGNoRXZlbnQoIGVuZEV2ZW50ICk7CisKKwkJc3Rh
dGUgPSBTVEFURS5OT05FOworCisJfQorCisJZnVuY3Rpb24gb25Nb3VzZVdoZWVsKCBldmVudCAp
IHsKKworCQlpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlIHx8IHNjb3BlLmVuYWJsZVpvb20g
PT09IGZhbHNlIHx8ICggc3RhdGUgIT09IFNUQVRFLk5PTkUgJiYgc3RhdGUgIT09IFNUQVRFLlJP
VEFURSApICkgcmV0dXJuOworCisJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCWV2ZW50LnN0
b3BQcm9wYWdhdGlvbigpOworCisJCWhhbmRsZU1vdXNlV2hlZWwoIGV2ZW50ICk7CisKKwkJc2Nv
cGUuZGlzcGF0Y2hFdmVudCggc3RhcnRFdmVudCApOyAvLyBub3Qgc3VyZSB3aHkgdGhlc2UgYXJl
IGhlcmUuLi4KKwkJc2NvcGUuZGlzcGF0Y2hFdmVudCggZW5kRXZlbnQgKTsKKworCX0KKworCWZ1
bmN0aW9uIG9uS2V5RG93biggZXZlbnQgKSB7CisKKwkJaWYgKCBzY29wZS5lbmFibGVkID09PSBm
YWxzZSB8fCBzY29wZS5lbmFibGVLZXlzID09PSBmYWxzZSB8fCBzY29wZS5lbmFibGVQYW4gPT09
IGZhbHNlICkgcmV0dXJuOworCisJCWhhbmRsZUtleURvd24oIGV2ZW50ICk7CisKKwl9CisKKwlm
dW5jdGlvbiBvblRvdWNoU3RhcnQoIGV2ZW50ICkgeworCisJCWlmICggc2NvcGUuZW5hYmxlZCA9
PT0gZmFsc2UgKSByZXR1cm47CisKKwkJc3dpdGNoICggZXZlbnQudG91Y2hlcy5sZW5ndGggKSB7
CisKKwkJCWNhc2UgMToJLy8gb25lLWZpbmdlcmVkIHRvdWNoOiByb3RhdGUKKworCQkJCWlmICgg
c2NvcGUuZW5hYmxlUm90YXRlID09PSBmYWxzZSApIHJldHVybjsKKworCQkJCWhhbmRsZVRvdWNo
U3RhcnRSb3RhdGUoIGV2ZW50ICk7CisKKwkJCQlzdGF0ZSA9IFNUQVRFLlRPVUNIX1JPVEFURTsK
KworCQkJCWJyZWFrOworCisJCQljYXNlIDI6CS8vIHR3by1maW5nZXJlZCB0b3VjaDogZG9sbHkK
KworCQkJCWlmICggc2NvcGUuZW5hYmxlWm9vbSA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCQlo
YW5kbGVUb3VjaFN0YXJ0RG9sbHkoIGV2ZW50ICk7CisKKwkJCQlzdGF0ZSA9IFNUQVRFLlRPVUNI
X0RPTExZOworCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzogLy8gdGhyZWUtZmluZ2VyZWQgdG91
Y2g6IHBhbgorCisJCQkJaWYgKCBzY29wZS5lbmFibGVQYW4gPT09IGZhbHNlICkgcmV0dXJuOwor
CisJCQkJaGFuZGxlVG91Y2hTdGFydFBhbiggZXZlbnQgKTsKKworCQkJCXN0YXRlID0gU1RBVEUu
VE9VQ0hfUEFOOworCisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisKKwkJCQlzdGF0ZSA9IFNU
QVRFLk5PTkU7CisKKwkJfQorCisJCWlmICggc3RhdGUgIT09IFNUQVRFLk5PTkUgKSB7CisKKwkJ
CXNjb3BlLmRpc3BhdGNoRXZlbnQoIHN0YXJ0RXZlbnQgKTsKKworCQl9CisKKwl9CisKKwlmdW5j
dGlvbiBvblRvdWNoTW92ZSggZXZlbnQgKSB7CisKKwkJaWYgKCBzY29wZS5lbmFibGVkID09PSBm
YWxzZSApIHJldHVybjsKKworCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQlldmVudC5zdG9w
UHJvcGFnYXRpb24oKTsKKworCQlzd2l0Y2ggKCBldmVudC50b3VjaGVzLmxlbmd0aCApIHsKKwor
CQkJY2FzZSAxOiAvLyBvbmUtZmluZ2VyZWQgdG91Y2g6IHJvdGF0ZQorCisJCQkJaWYgKCBzY29w
ZS5lbmFibGVSb3RhdGUgPT09IGZhbHNlICkgcmV0dXJuOworCQkJCWlmICggc3RhdGUgIT09IFNU
QVRFLlRPVUNIX1JPVEFURSApIHJldHVybjsgLy8gaXMgdGhpcyBuZWVkZWQ/Li4uCisKKwkJCQlo
YW5kbGVUb3VjaE1vdmVSb3RhdGUoIGV2ZW50ICk7CisKKwkJCQlicmVhazsKKworCQkJY2FzZSAy
OiAvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5CisKKwkJCQlpZiAoIHNjb3BlLmVuYWJsZVpv
b20gPT09IGZhbHNlICkgcmV0dXJuOworCQkJCWlmICggc3RhdGUgIT09IFNUQVRFLlRPVUNIX0RP
TExZICkgcmV0dXJuOyAvLyBpcyB0aGlzIG5lZWRlZD8uLi4KKworCQkJCWhhbmRsZVRvdWNoTW92
ZURvbGx5KCBldmVudCApOworCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzogLy8gdGhyZWUtZmlu
Z2VyZWQgdG91Y2g6IHBhbgorCisJCQkJaWYgKCBzY29wZS5lbmFibGVQYW4gPT09IGZhbHNlICkg
cmV0dXJuOworCQkJCWlmICggc3RhdGUgIT09IFNUQVRFLlRPVUNIX1BBTiApIHJldHVybjsgLy8g
aXMgdGhpcyBuZWVkZWQ/Li4uCisKKwkJCQloYW5kbGVUb3VjaE1vdmVQYW4oIGV2ZW50ICk7CisK
KwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKworCQkJCXN0YXRlID0gU1RBVEUuTk9ORTsKKwor
CQl9CisKKwl9CisKKwlmdW5jdGlvbiBvblRvdWNoRW5kKCBldmVudCApIHsKKworCQlpZiAoIHNj
b3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuOworCisJCWhhbmRsZVRvdWNoRW5kKCBldmVu
dCApOworCisJCXNjb3BlLmRpc3BhdGNoRXZlbnQoIGVuZEV2ZW50ICk7CisKKwkJc3RhdGUgPSBT
VEFURS5OT05FOworCisJfQorCisJZnVuY3Rpb24gb25Db250ZXh0TWVudSggZXZlbnQgKSB7CisK
KwkJaWYgKCBzY29wZS5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjsKKworCQlldmVudC5wcmV2
ZW50RGVmYXVsdCgpOworCisJfQorCisJLy8KKworCXNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRM
aXN0ZW5lciggJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwgZmFsc2UgKTsKKworCXNjb3Bl
LmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlZG93bicsIG9uTW91c2VEb3duLCBm
YWxzZSApOworCXNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3doZWVsJywgb25N
b3VzZVdoZWVsLCBmYWxzZSApOworCisJc2NvcGUuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVy
KCAndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCwgZmFsc2UgKTsKKwlzY29wZS5kb21FbGVtZW50
LmFkZEV2ZW50TGlzdGVuZXIoICd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIGZhbHNlICk7CisJc2Nv
cGUuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUs
IGZhbHNlICk7CisKKwl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ2tleWRvd24nLCBvbktleURv
d24sIGZhbHNlICk7CisKKwkvLyBmb3JjZSBhbiB1cGRhdGUgYXQgc3RhcnQKKworCXRoaXMudXBk
YXRlKCk7CisKK307CisKK1RIUkVFLk9yYml0Q29udHJvbHMucHJvdG90eXBlID0gT2JqZWN0LmNy
ZWF0ZSggVEhSRUUuRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApOworVEhSRUUuT3JiaXRDb250
cm9scy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUSFJFRS5PcmJpdENvbnRyb2xzOworCitPYmpl
Y3QuZGVmaW5lUHJvcGVydGllcyggVEhSRUUuT3JiaXRDb250cm9scy5wcm90b3R5cGUsIHsKKwor
CWNlbnRlcjogeworCisJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLndhcm4oICdU
SFJFRS5PcmJpdENvbnRyb2xzOiAuY2VudGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnRhcmdldCcg
KTsKKwkJCXJldHVybiB0aGlzLnRhcmdldDsKKworCQl9CisKKwl9LAorCisJLy8gYmFja3dhcmQg
Y29tcGF0aWJpbGl0eQorCisJbm9ab29tOiB7CisKKwkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJ
CWNvbnNvbGUud2FybiggJ1RIUkVFLk9yYml0Q29udHJvbHM6IC5ub1pvb20gaGFzIGJlZW4gZGVw
cmVjYXRlZC4gVXNlIC5lbmFibGVab29tIGluc3RlYWQuJyApOworCQkJcmV0dXJuICEgdGhpcy5l
bmFibGVab29tOworCisJCX0sCisKKwkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQlj
b25zb2xlLndhcm4oICdUSFJFRS5PcmJpdENvbnRyb2xzOiAubm9ab29tIGhhcyBiZWVuIGRlcHJl
Y2F0ZWQuIFVzZSAuZW5hYmxlWm9vbSBpbnN0ZWFkLicgKTsKKwkJCXRoaXMuZW5hYmxlWm9vbSA9
ICEgdmFsdWU7CisKKwkJfQorCisJfSwKKworCW5vUm90YXRlOiB7CisKKwkJZ2V0OiBmdW5jdGlv
biAoKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9yYml0Q29udHJvbHM6IC5ub1JvdGF0
ZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVJvdGF0ZSBpbnN0ZWFkLicgKTsKKwkJ
CXJldHVybiAhIHRoaXMuZW5hYmxlUm90YXRlOworCisJCX0sCisKKwkJc2V0OiBmdW5jdGlvbiAo
IHZhbHVlICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5PcmJpdENvbnRyb2xzOiAubm9S
b3RhdGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4nICk7
CisJCQl0aGlzLmVuYWJsZVJvdGF0ZSA9ICEgdmFsdWU7CisKKwkJfQorCisJfSwKKworCW5vUGFu
OiB7CisKKwkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9y
Yml0Q29udHJvbHM6IC5ub1BhbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVBhbiBp
bnN0ZWFkLicgKTsKKwkJCXJldHVybiAhIHRoaXMuZW5hYmxlUGFuOworCisJCX0sCisKKwkJc2V0
OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5PcmJpdENv
bnRyb2xzOiAubm9QYW4gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVQYW4gaW5zdGVh
ZC4nICk7CisJCQl0aGlzLmVuYWJsZVBhbiA9ICEgdmFsdWU7CisKKwkJfQorCisJfSwKKworCW5v
S2V5czogeworCisJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJF
RS5PcmJpdENvbnRyb2xzOiAubm9LZXlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxl
S2V5cyBpbnN0ZWFkLicgKTsKKwkJCXJldHVybiAhIHRoaXMuZW5hYmxlS2V5czsKKworCQl9LAor
CisJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUu
T3JiaXRDb250cm9sczogLm5vS2V5cyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZUtl
eXMgaW5zdGVhZC4nICk7CisJCQl0aGlzLmVuYWJsZUtleXMgPSAhIHZhbHVlOworCisJCX0KKwor
CX0sCisKKwlzdGF0aWNNb3Zpbmc6IHsKKworCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJY29u
c29sZS53YXJuKCAnVEhSRUUuT3JiaXRDb250cm9sczogLnN0YXRpY01vdmluZyBoYXMgYmVlbiBk
ZXByZWNhdGVkLiBVc2UgLmVuYWJsZURhbXBpbmcgaW5zdGVhZC4nICk7CisJCQlyZXR1cm4gISB0
aGlzLmVuYWJsZURhbXBpbmc7CisKKwkJfSwKKworCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7
CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9yYml0Q29udHJvbHM6IC5zdGF0aWNNb3Zpbmcg
aGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVEYW1waW5nIGluc3RlYWQuJyApOworCQkJ
dGhpcy5lbmFibGVEYW1waW5nID0gISB2YWx1ZTsKKworCQl9CisKKwl9LAorCisJZHluYW1pY0Rh
bXBpbmdGYWN0b3I6IHsKKworCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS53YXJu
KCAnVEhSRUUuT3JiaXRDb250cm9sczogLmR5bmFtaWNEYW1waW5nRmFjdG9yIGhhcyBiZWVuIHJl
bmFtZWQuIFVzZSAuZGFtcGluZ0ZhY3RvciBpbnN0ZWFkLicgKTsKKwkJCXJldHVybiB0aGlzLmRh
bXBpbmdGYWN0b3I7CisKKwkJfSwKKworCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJ
CWNvbnNvbGUud2FybiggJ1RIUkVFLk9yYml0Q29udHJvbHM6IC5keW5hbWljRGFtcGluZ0ZhY3Rv
ciBoYXMgYmVlbiByZW5hbWVkLiBVc2UgLmRhbXBpbmdGYWN0b3IgaW5zdGVhZC4nICk7CisJCQl0
aGlzLmRhbXBpbmdGYWN0b3IgPSB2YWx1ZTsKKworCQl9CisKKwl9CisKK30gKTsKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0V4dGVybmFsL1RocmVlL3Ro
cmVlLmpzIGIvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvRXh0ZXJuYWwvVGhy
ZWUvdGhyZWUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMWNlNmZmNzcyYTJiZWI2NWI5NTliMzg1MTI0ZGVjODNi
OTllMGQxNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50
ZXJmYWNlL0V4dGVybmFsL1RocmVlL3RocmVlLmpzCkBAIC0wLDAgKzEsNDQxMTAgQEAKKyhmdW5j
dGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7CisJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYm
IHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6CisJdHlw
ZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0
cyddLCBmYWN0b3J5KSA6CisJKGZhY3RvcnkoKGdsb2JhbC5USFJFRSA9IGdsb2JhbC5USFJFRSB8
fCB7fSkpKTsKK30odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsKKwor
CS8vIFBvbHlmaWxscworCisJaWYgKCBOdW1iZXIuRVBTSUxPTiA9PT0gdW5kZWZpbmVkICkgewor
CisJCU51bWJlci5FUFNJTE9OID0gTWF0aC5wb3coIDIsIC0gNTIgKTsKKworCX0KKworCWlmICgg
TnVtYmVyLmlzSW50ZWdlciA9PT0gdW5kZWZpbmVkICkgeworCisJCS8vIE1pc3NpbmcgaW4gSUUK
KwkJLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNj
cmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTnVtYmVyL2lzSW50ZWdlcgorCisJCU51bWJl
ci5pc0ludGVnZXIgPSBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQlyZXR1cm4gdHlwZW9mIHZh
bHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSggdmFsdWUgKSAmJiBNYXRoLmZsb29yKCB2YWx1
ZSApID09PSB2YWx1ZTsKKworCQl9OworCisJfQorCisJLy8KKworCWlmICggTWF0aC5zaWduID09
PSB1bmRlZmluZWQgKSB7CisKKwkJLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4t
VVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9zaWdu
CisKKwkJTWF0aC5zaWduID0gZnVuY3Rpb24gKCB4ICkgeworCisJCQlyZXR1cm4gKCB4IDwgMCAp
ID8gLSAxIDogKCB4ID4gMCApID8gMSA6ICsgeDsKKworCQl9OworCisJfQorCisJaWYgKCBGdW5j
dGlvbi5wcm90b3R5cGUubmFtZSA9PT0gdW5kZWZpbmVkICkgeworCisJCS8vIE1pc3NpbmcgaW4g
SUUKKwkJLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2
YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vbmFtZQorCisJCU9iamVj
dC5kZWZpbmVQcm9wZXJ0eSggRnVuY3Rpb24ucHJvdG90eXBlLCAnbmFtZScsIHsKKworCQkJZ2V0
OiBmdW5jdGlvbiAoKSB7CisKKwkJCQlyZXR1cm4gdGhpcy50b1N0cmluZygpLm1hdGNoKCAvXlxz
KmZ1bmN0aW9uXHMqKFteXChcc10qKS8gKVsgMSBdOworCisJCQl9CisKKwkJfSApOworCisJfQor
CisJaWYgKCBPYmplY3QuYXNzaWduID09PSB1bmRlZmluZWQgKSB7CisKKwkJLy8gTWlzc2luZyBp
biBJRQorCQkvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9K
YXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduCisKKwkJKCBm
dW5jdGlvbiAoKSB7CisKKwkJCU9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiAoIHRhcmdldCApIHsK
KworCQkJCSd1c2Ugc3RyaWN0JzsKKworCQkJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgfHwg
dGFyZ2V0ID09PSBudWxsICkgeworCisJCQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICdDYW5ub3Qg
Y29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnICk7CisKKwkJCQl9CisKKwkJCQl2
YXIgb3V0cHV0ID0gT2JqZWN0KCB0YXJnZXQgKTsKKworCQkJCWZvciAoIHZhciBpbmRleCA9IDE7
IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXggKysgKSB7CisKKwkJCQkJdmFyIHNvdXJj
ZSA9IGFyZ3VtZW50c1sgaW5kZXggXTsKKworCQkJCQlpZiAoIHNvdXJjZSAhPT0gdW5kZWZpbmVk
ICYmIHNvdXJjZSAhPT0gbnVsbCApIHsKKworCQkJCQkJZm9yICggdmFyIG5leHRLZXkgaW4gc291
cmNlICkgeworCisJCQkJCQkJaWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNh
bGwoIHNvdXJjZSwgbmV4dEtleSApICkgeworCisJCQkJCQkJCW91dHB1dFsgbmV4dEtleSBdID0g
c291cmNlWyBuZXh0S2V5IF07CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJ
CQl9CisKKwkJCQlyZXR1cm4gb3V0cHV0OworCisJCQl9OworCisJCX0gKSgpOworCisJfQorCisJ
LyoqCisJICogaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi9ldmVudGRpc3BhdGNoZXIuanMvCisJ
ICovCisKKwlmdW5jdGlvbiBFdmVudERpc3BhdGNoZXIoKSB7fQorCisJT2JqZWN0LmFzc2lnbigg
RXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwgeworCisJCWFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0
aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7CisKKwkJCWlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1
bmRlZmluZWQgKSB0aGlzLl9saXN0ZW5lcnMgPSB7fTsKKworCQkJdmFyIGxpc3RlbmVycyA9IHRo
aXMuX2xpc3RlbmVyczsKKworCQkJaWYgKCBsaXN0ZW5lcnNbIHR5cGUgXSA9PT0gdW5kZWZpbmVk
ICkgeworCisJCQkJbGlzdGVuZXJzWyB0eXBlIF0gPSBbXTsKKworCQkJfQorCisJCQlpZiAoIGxp
c3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgPT09IC0gMSApIHsKKworCQkJCWxp
c3RlbmVyc1sgdHlwZSBdLnB1c2goIGxpc3RlbmVyICk7CisKKwkJCX0KKworCQl9LAorCisJCWhh
c0V2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7CisKKwkJCWlmICgg
dGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm4gZmFsc2U7CisKKwkJCXZhciBs
aXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7CisKKwkJCXJldHVybiBsaXN0ZW5lcnNbIHR5cGUg
XSAhPT0gdW5kZWZpbmVkICYmIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkg
IT09IC0gMTsKKworCQl9LAorCisJCXJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlw
ZSwgbGlzdGVuZXIgKSB7CisKKwkJCWlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQg
KSByZXR1cm47CisKKwkJCXZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7CisJCQl2YXIg
bGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgdHlwZSBdOworCisJCQlpZiAoIGxpc3RlbmVyQXJy
YXkgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCXZhciBpbmRleCA9IGxpc3RlbmVyQXJyYXkuaW5k
ZXhPZiggbGlzdGVuZXIgKTsKKworCQkJCWlmICggaW5kZXggIT09IC0gMSApIHsKKworCQkJCQls
aXN0ZW5lckFycmF5LnNwbGljZSggaW5kZXgsIDEgKTsKKworCQkJCX0KKworCQkJfQorCisJCX0s
CisKKwkJZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gKCBldmVudCApIHsKKworCQkJaWYgKCB0aGlz
Ll9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjsKKworCQkJdmFyIGxpc3RlbmVycyA9
IHRoaXMuX2xpc3RlbmVyczsKKwkJCXZhciBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyBldmVu
dC50eXBlIF07CisKKwkJCWlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkgeworCisJ
CQkJZXZlbnQudGFyZ2V0ID0gdGhpczsKKworCQkJCXZhciBhcnJheSA9IGxpc3RlbmVyQXJyYXku
c2xpY2UoIDAgKTsKKworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8
IGw7IGkgKysgKSB7CisKKwkJCQkJYXJyYXlbIGkgXS5jYWxsKCB0aGlzLCBldmVudCApOworCisJ
CQkJfQorCisJCQl9CisKKwkJfQorCisJfSApOworCisJdmFyIFJFVklTSU9OID0gJzg2JzsKKwl2
YXIgTU9VU0UgPSB7IExFRlQ6IDAsIE1JRERMRTogMSwgUklHSFQ6IDIgfTsKKwl2YXIgQ3VsbEZh
Y2VOb25lID0gMDsKKwl2YXIgQ3VsbEZhY2VCYWNrID0gMTsKKwl2YXIgQ3VsbEZhY2VGcm9udCA9
IDI7CisJdmFyIEN1bGxGYWNlRnJvbnRCYWNrID0gMzsKKwl2YXIgRnJvbnRGYWNlRGlyZWN0aW9u
Q1cgPSAwOworCXZhciBGcm9udEZhY2VEaXJlY3Rpb25DQ1cgPSAxOworCXZhciBCYXNpY1NoYWRv
d01hcCA9IDA7CisJdmFyIFBDRlNoYWRvd01hcCA9IDE7CisJdmFyIFBDRlNvZnRTaGFkb3dNYXAg
PSAyOworCXZhciBGcm9udFNpZGUgPSAwOworCXZhciBCYWNrU2lkZSA9IDE7CisJdmFyIERvdWJs
ZVNpZGUgPSAyOworCXZhciBGbGF0U2hhZGluZyA9IDE7CisJdmFyIFNtb290aFNoYWRpbmcgPSAy
OworCXZhciBOb0NvbG9ycyA9IDA7CisJdmFyIEZhY2VDb2xvcnMgPSAxOworCXZhciBWZXJ0ZXhD
b2xvcnMgPSAyOworCXZhciBOb0JsZW5kaW5nID0gMDsKKwl2YXIgTm9ybWFsQmxlbmRpbmcgPSAx
OworCXZhciBBZGRpdGl2ZUJsZW5kaW5nID0gMjsKKwl2YXIgU3VidHJhY3RpdmVCbGVuZGluZyA9
IDM7CisJdmFyIE11bHRpcGx5QmxlbmRpbmcgPSA0OworCXZhciBDdXN0b21CbGVuZGluZyA9IDU7
CisJdmFyIEFkZEVxdWF0aW9uID0gMTAwOworCXZhciBTdWJ0cmFjdEVxdWF0aW9uID0gMTAxOwor
CXZhciBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiA9IDEwMjsKKwl2YXIgTWluRXF1YXRpb24gPSAx
MDM7CisJdmFyIE1heEVxdWF0aW9uID0gMTA0OworCXZhciBaZXJvRmFjdG9yID0gMjAwOworCXZh
ciBPbmVGYWN0b3IgPSAyMDE7CisJdmFyIFNyY0NvbG9yRmFjdG9yID0gMjAyOworCXZhciBPbmVN
aW51c1NyY0NvbG9yRmFjdG9yID0gMjAzOworCXZhciBTcmNBbHBoYUZhY3RvciA9IDIwNDsKKwl2
YXIgT25lTWludXNTcmNBbHBoYUZhY3RvciA9IDIwNTsKKwl2YXIgRHN0QWxwaGFGYWN0b3IgPSAy
MDY7CisJdmFyIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgPSAyMDc7CisJdmFyIERzdENvbG9yRmFj
dG9yID0gMjA4OworCXZhciBPbmVNaW51c0RzdENvbG9yRmFjdG9yID0gMjA5OworCXZhciBTcmNB
bHBoYVNhdHVyYXRlRmFjdG9yID0gMjEwOworCXZhciBOZXZlckRlcHRoID0gMDsKKwl2YXIgQWx3
YXlzRGVwdGggPSAxOworCXZhciBMZXNzRGVwdGggPSAyOworCXZhciBMZXNzRXF1YWxEZXB0aCA9
IDM7CisJdmFyIEVxdWFsRGVwdGggPSA0OworCXZhciBHcmVhdGVyRXF1YWxEZXB0aCA9IDU7CisJ
dmFyIEdyZWF0ZXJEZXB0aCA9IDY7CisJdmFyIE5vdEVxdWFsRGVwdGggPSA3OworCXZhciBNdWx0
aXBseU9wZXJhdGlvbiA9IDA7CisJdmFyIE1peE9wZXJhdGlvbiA9IDE7CisJdmFyIEFkZE9wZXJh
dGlvbiA9IDI7CisJdmFyIE5vVG9uZU1hcHBpbmcgPSAwOworCXZhciBMaW5lYXJUb25lTWFwcGlu
ZyA9IDE7CisJdmFyIFJlaW5oYXJkVG9uZU1hcHBpbmcgPSAyOworCXZhciBVbmNoYXJ0ZWQyVG9u
ZU1hcHBpbmcgPSAzOworCXZhciBDaW5lb25Ub25lTWFwcGluZyA9IDQ7CisJdmFyIFVWTWFwcGlu
ZyA9IDMwMDsKKwl2YXIgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nID0gMzAxOworCXZhciBDdWJlUmVm
cmFjdGlvbk1hcHBpbmcgPSAzMDI7CisJdmFyIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBw
aW5nID0gMzAzOworCXZhciBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyA9IDMwNDsK
Kwl2YXIgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDU7CisJdmFyIEN1YmVVVlJlZmxl
Y3Rpb25NYXBwaW5nID0gMzA2OworCXZhciBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyA9IDMwNzsK
Kwl2YXIgUmVwZWF0V3JhcHBpbmcgPSAxMDAwOworCXZhciBDbGFtcFRvRWRnZVdyYXBwaW5nID0g
MTAwMTsKKwl2YXIgTWlycm9yZWRSZXBlYXRXcmFwcGluZyA9IDEwMDI7CisJdmFyIE5lYXJlc3RG
aWx0ZXIgPSAxMDAzOworCXZhciBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDQ7CisJ
dmFyIE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA1OworCXZhciBMaW5lYXJGaWx0ZXIg
PSAxMDA2OworCXZhciBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNzsKKwl2YXIgTGlu
ZWFyTWlwTWFwTGluZWFyRmlsdGVyID0gMTAwODsKKwl2YXIgVW5zaWduZWRCeXRlVHlwZSA9IDEw
MDk7CisJdmFyIEJ5dGVUeXBlID0gMTAxMDsKKwl2YXIgU2hvcnRUeXBlID0gMTAxMTsKKwl2YXIg
VW5zaWduZWRTaG9ydFR5cGUgPSAxMDEyOworCXZhciBJbnRUeXBlID0gMTAxMzsKKwl2YXIgVW5z
aWduZWRJbnRUeXBlID0gMTAxNDsKKwl2YXIgRmxvYXRUeXBlID0gMTAxNTsKKwl2YXIgSGFsZkZs
b2F0VHlwZSA9IDEwMTY7CisJdmFyIFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSA9IDEwMTc7CisJdmFy
IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSA9IDEwMTg7CisJdmFyIFVuc2lnbmVkU2hvcnQ1NjVUeXBl
ID0gMTAxOTsKKwl2YXIgVW5zaWduZWRJbnQyNDhUeXBlID0gMTAyMDsKKwl2YXIgQWxwaGFGb3Jt
YXQgPSAxMDIxOworCXZhciBSR0JGb3JtYXQgPSAxMDIyOworCXZhciBSR0JBRm9ybWF0ID0gMTAy
MzsKKwl2YXIgTHVtaW5hbmNlRm9ybWF0ID0gMTAyNDsKKwl2YXIgTHVtaW5hbmNlQWxwaGFGb3Jt
YXQgPSAxMDI1OworCXZhciBSR0JFRm9ybWF0ID0gUkdCQUZvcm1hdDsKKwl2YXIgRGVwdGhGb3Jt
YXQgPSAxMDI2OworCXZhciBEZXB0aFN0ZW5jaWxGb3JtYXQgPSAxMDI3OworCXZhciBSR0JfUzNU
Q19EWFQxX0Zvcm1hdCA9IDIwMDE7CisJdmFyIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCA9IDIwMDI7
CisJdmFyIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCA9IDIwMDM7CisJdmFyIFJHQkFfUzNUQ19EWFQ1
X0Zvcm1hdCA9IDIwMDQ7CisJdmFyIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMjEwMDsKKwl2
YXIgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAyMTAxOworCXZhciBSR0JBX1BWUlRDXzRCUFBW
MV9Gb3JtYXQgPSAyMTAyOworCXZhciBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAyMTAzOwor
CXZhciBSR0JfRVRDMV9Gb3JtYXQgPSAyMTUxOworCXZhciBMb29wT25jZSA9IDIyMDA7CisJdmFy
IExvb3BSZXBlYXQgPSAyMjAxOworCXZhciBMb29wUGluZ1BvbmcgPSAyMjAyOworCXZhciBJbnRl
cnBvbGF0ZURpc2NyZXRlID0gMjMwMDsKKwl2YXIgSW50ZXJwb2xhdGVMaW5lYXIgPSAyMzAxOwor
CXZhciBJbnRlcnBvbGF0ZVNtb290aCA9IDIzMDI7CisJdmFyIFplcm9DdXJ2YXR1cmVFbmRpbmcg
PSAyNDAwOworCXZhciBaZXJvU2xvcGVFbmRpbmcgPSAyNDAxOworCXZhciBXcmFwQXJvdW5kRW5k
aW5nID0gMjQwMjsKKwl2YXIgVHJpYW5nbGVzRHJhd01vZGUgPSAwOworCXZhciBUcmlhbmdsZVN0
cmlwRHJhd01vZGUgPSAxOworCXZhciBUcmlhbmdsZUZhbkRyYXdNb2RlID0gMjsKKwl2YXIgTGlu
ZWFyRW5jb2RpbmcgPSAzMDAwOworCXZhciBzUkdCRW5jb2RpbmcgPSAzMDAxOworCXZhciBHYW1t
YUVuY29kaW5nID0gMzAwNzsKKwl2YXIgUkdCRUVuY29kaW5nID0gMzAwMjsKKwl2YXIgTG9nTHV2
RW5jb2RpbmcgPSAzMDAzOworCXZhciBSR0JNN0VuY29kaW5nID0gMzAwNDsKKwl2YXIgUkdCTTE2
RW5jb2RpbmcgPSAzMDA1OworCXZhciBSR0JERW5jb2RpbmcgPSAzMDA2OworCXZhciBCYXNpY0Rl
cHRoUGFja2luZyA9IDMyMDA7CisJdmFyIFJHQkFEZXB0aFBhY2tpbmcgPSAzMjAxOworCisJLyoq
CisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBA
YXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJdmFyIF9NYXRoID0g
eworCisJCURFRzJSQUQ6IE1hdGguUEkgLyAxODAsCisJCVJBRDJERUc6IDE4MCAvIE1hdGguUEks
CisKKwkJZ2VuZXJhdGVVVUlEOiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIGh0dHA6Ly93d3cuYnJv
b2ZhLmNvbS9Ub29scy9NYXRoLnV1aWQuaHRtCisKKwkJCXZhciBjaGFycyA9ICcwMTIzNDU2Nzg5
QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicuc3Bs
aXQoICcnICk7CisJCQl2YXIgdXVpZCA9IG5ldyBBcnJheSggMzYgKTsKKwkJCXZhciBybmQgPSAw
LCByOworCisJCQlyZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCkgeworCisJCQkJZm9yICgg
dmFyIGkgPSAwOyBpIDwgMzY7IGkgKysgKSB7CisKKwkJCQkJaWYgKCBpID09PSA4IHx8IGkgPT09
IDEzIHx8IGkgPT09IDE4IHx8IGkgPT09IDIzICkgeworCisJCQkJCQl1dWlkWyBpIF0gPSAnLSc7
CisKKwkJCQkJfSBlbHNlIGlmICggaSA9PT0gMTQgKSB7CisKKwkJCQkJCXV1aWRbIGkgXSA9ICc0
JzsKKworCQkJCQl9IGVsc2UgeworCisJCQkJCQlpZiAoIHJuZCA8PSAweDAyICkgcm5kID0gMHgy
MDAwMDAwICsgKCBNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwICkgfCAwOworCQkJCQkJciA9IHJu
ZCAmIDB4ZjsKKwkJCQkJCXJuZCA9IHJuZCA+PiA0OworCQkJCQkJdXVpZFsgaSBdID0gY2hhcnNb
ICggaSA9PT0gMTkgKSA/ICggciAmIDB4MyApIHwgMHg4IDogciBdOworCisJCQkJCX0KKworCQkJ
CX0KKworCQkJCXJldHVybiB1dWlkLmpvaW4oICcnICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJ
CWNsYW1wOiBmdW5jdGlvbiAoIHZhbHVlLCBtaW4sIG1heCApIHsKKworCQkJcmV0dXJuIE1hdGgu
bWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIHZhbHVlICkgKTsKKworCQl9LAorCisJCS8vIGNvbXB1
dGUgZXVjbGlkaWFuIG1vZHVsbyBvZiBtICUgbgorCQkvLyBodHRwczovL2VuLndpa2lwZWRpYS5v
cmcvd2lraS9Nb2R1bG9fb3BlcmF0aW9uCisKKwkJZXVjbGlkZWFuTW9kdWxvOiBmdW5jdGlvbiAo
IG4sIG0gKSB7CisKKwkJCXJldHVybiAoICggbiAlIG0gKSArIG0gKSAlIG07CisKKwkJfSwKKwor
CQkvLyBMaW5lYXIgbWFwcGluZyBmcm9tIHJhbmdlIDxhMSwgYTI+IHRvIHJhbmdlIDxiMSwgYjI+
CisKKwkJbWFwTGluZWFyOiBmdW5jdGlvbiAoIHgsIGExLCBhMiwgYjEsIGIyICkgeworCisJCQly
ZXR1cm4gYjEgKyAoIHggLSBhMSApICogKCBiMiAtIGIxICkgLyAoIGEyIC0gYTEgKTsKKworCQl9
LAorCisJCS8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpbmVhcl9pbnRlcnBvbGF0
aW9uCisKKwkJbGVycDogZnVuY3Rpb24gKCB4LCB5LCB0ICkgeworCisJCQlyZXR1cm4gKCAxIC0g
dCApICogeCArIHQgKiB5OworCisJCX0sCisKKwkJLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcv
d2lraS9TbW9vdGhzdGVwCisKKwkJc21vb3Roc3RlcDogZnVuY3Rpb24gKCB4LCBtaW4sIG1heCAp
IHsKKworCQkJaWYgKCB4IDw9IG1pbiApIHJldHVybiAwOworCQkJaWYgKCB4ID49IG1heCApIHJl
dHVybiAxOworCisJCQl4ID0gKCB4IC0gbWluICkgLyAoIG1heCAtIG1pbiApOworCisJCQlyZXR1
cm4geCAqIHggKiAoIDMgLSAyICogeCApOworCisJCX0sCisKKwkJc21vb3RoZXJzdGVwOiBmdW5j
dGlvbiAoIHgsIG1pbiwgbWF4ICkgeworCisJCQlpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7CisJ
CQlpZiAoIHggPj0gbWF4ICkgcmV0dXJuIDE7CisKKwkJCXggPSAoIHggLSBtaW4gKSAvICggbWF4
IC0gbWluICk7CisKKwkJCXJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSAr
IDEwICk7CisKKwkJfSwKKworCQkvLyBSYW5kb20gaW50ZWdlciBmcm9tIDxsb3csIGhpZ2g+IGlu
dGVydmFsCisKKwkJcmFuZEludDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7CisKKwkJCXJldHVy
biBsb3cgKyBNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogKCBoaWdoIC0gbG93ICsgMSApICk7
CisKKwkJfSwKKworCQkvLyBSYW5kb20gZmxvYXQgZnJvbSA8bG93LCBoaWdoPiBpbnRlcnZhbAor
CisJCXJhbmRGbG9hdDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7CisKKwkJCXJldHVybiBsb3cg
KyBNYXRoLnJhbmRvbSgpICogKCBoaWdoIC0gbG93ICk7CisKKwkJfSwKKworCQkvLyBSYW5kb20g
ZmxvYXQgZnJvbSA8LXJhbmdlLzIsIHJhbmdlLzI+IGludGVydmFsCisKKwkJcmFuZEZsb2F0U3By
ZWFkOiBmdW5jdGlvbiAoIHJhbmdlICkgeworCisJCQlyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1h
dGgucmFuZG9tKCkgKTsKKworCQl9LAorCisJCWRlZ1RvUmFkOiBmdW5jdGlvbiAoIGRlZ3JlZXMg
KSB7CisKKwkJCXJldHVybiBkZWdyZWVzICogX01hdGguREVHMlJBRDsKKworCQl9LAorCisJCXJh
ZFRvRGVnOiBmdW5jdGlvbiAoIHJhZGlhbnMgKSB7CisKKwkJCXJldHVybiByYWRpYW5zICogX01h
dGguUkFEMkRFRzsKKworCQl9LAorCisJCWlzUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSAp
IHsKKworCQkJcmV0dXJuICggdmFsdWUgJiAoIHZhbHVlIC0gMSApICkgPT09IDAgJiYgdmFsdWUg
IT09IDA7CisKKwkJfSwKKworCQluZWFyZXN0UG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSAp
IHsKKworCQkJcmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLnJvdW5kKCBNYXRoLmxvZyggdmFsdWUg
KSAvIE1hdGguTE4yICkgKTsKKworCQl9LAorCisJCW5leHRQb3dlck9mVHdvOiBmdW5jdGlvbiAo
IHZhbHVlICkgeworCisJCQl2YWx1ZSAtLTsKKwkJCXZhbHVlIHw9IHZhbHVlID4+IDE7CisJCQl2
YWx1ZSB8PSB2YWx1ZSA+PiAyOworCQkJdmFsdWUgfD0gdmFsdWUgPj4gNDsKKwkJCXZhbHVlIHw9
IHZhbHVlID4+IDg7CisJCQl2YWx1ZSB8PSB2YWx1ZSA+PiAxNjsKKwkJCXZhbHVlICsrOworCisJ
CQlyZXR1cm4gdmFsdWU7CisKKwkJfQorCisJfTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29i
IC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cu
dGhlaml0Lm9yZy8KKwkgKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29t
LworCSAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cK
KwkgKi8KKworCWZ1bmN0aW9uIFZlY3RvcjIoIHgsIHkgKSB7CisKKwkJdGhpcy54ID0geCB8fCAw
OworCQl0aGlzLnkgPSB5IHx8IDA7CisKKwl9CisKKwlPYmplY3QuZGVmaW5lUHJvcGVydGllcygg
VmVjdG9yMi5wcm90b3R5cGUsIHsKKworCQkid2lkdGgiIDogeworCisJCQlnZXQ6IGZ1bmN0aW9u
ICgpIHsKKworCQkJCXJldHVybiB0aGlzLng7CisKKwkJCX0sCisKKwkJCXNldDogZnVuY3Rpb24g
KCB2YWx1ZSApIHsKKworCQkJCXRoaXMueCA9IHZhbHVlOworCisJCQl9CisKKwkJfSwKKworCQki
aGVpZ2h0IiA6IHsKKworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQlyZXR1cm4gdGhpcy55
OworCisJCQl9LAorCisJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQl0aGlzLnkg
PSB2YWx1ZTsKKworCQkJfQorCisJCX0KKworCX0gKTsKKworCU9iamVjdC5hc3NpZ24oIFZlY3Rv
cjIucHJvdG90eXBlLCB7CisKKwkJaXNWZWN0b3IyOiB0cnVlLAorCisJCXNldDogZnVuY3Rpb24g
KCB4LCB5ICkgeworCisJCQl0aGlzLnggPSB4OworCQkJdGhpcy55ID0geTsKKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQlzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgeworCisJ
CQl0aGlzLnggPSBzY2FsYXI7CisJCQl0aGlzLnkgPSBzY2FsYXI7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJc2V0WDogZnVuY3Rpb24gKCB4ICkgeworCisJCQl0aGlzLnggPSB4Owor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldFk6IGZ1bmN0aW9uICggeSApIHsKKwor
CQkJdGhpcy55ID0geTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRDb21wb25l
bnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkgeworCisJCQlzd2l0Y2ggKCBpbmRleCApIHsK
KworCQkJCWNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrOworCQkJCWNhc2UgMTogdGhpcy55
ID0gdmFsdWU7IGJyZWFrOworCQkJCWRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlz
IG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQlnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXggKSB7CisKKwkJCXN3aXRj
aCAoIGluZGV4ICkgeworCisJCQkJY2FzZSAwOiByZXR1cm4gdGhpcy54OworCQkJCWNhc2UgMTog
cmV0dXJuIHRoaXMueTsKKwkJCQlkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBv
dXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApOworCisJCQl9CisKKwkJfSwKKworCQljbG9uZTogZnVu
Y3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhp
cy55ICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIHYgKSB7CisKKwkJCXRoaXMueCA9
IHYueDsKKwkJCXRoaXMueSA9IHYueTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlh
ZGQ6IGZ1bmN0aW9uICggdiwgdyApIHsKKworCQkJaWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CisK
KwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0
cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOworCQkJ
CXJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTsKKworCQkJfQorCisJCQl0aGlzLnggKz0g
di54OworCQkJdGhpcy55ICs9IHYueTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlh
ZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHsKKworCQkJdGhpcy54ICs9IHM7CisJCQl0aGlzLnkg
Kz0gczsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlhZGRWZWN0b3JzOiBmdW5jdGlv
biAoIGEsIGIgKSB7CisKKwkJCXRoaXMueCA9IGEueCArIGIueDsKKwkJCXRoaXMueSA9IGEueSAr
IGIueTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlhZGRTY2FsZWRWZWN0b3I6IGZ1
bmN0aW9uICggdiwgcyApIHsKKworCQkJdGhpcy54ICs9IHYueCAqIHM7CisJCQl0aGlzLnkgKz0g
di55ICogczsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzdWI6IGZ1bmN0aW9uICgg
diwgdyApIHsKKworCQkJaWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQljb25zb2xlLndh
cm4oICdUSFJFRS5WZWN0b3IyOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQu
IFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOworCQkJCXJldHVybiB0aGlzLnN1
YlZlY3RvcnMoIHYsIHcgKTsKKworCQkJfQorCisJCQl0aGlzLnggLT0gdi54OworCQkJdGhpcy55
IC09IHYueTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzdWJTY2FsYXI6IGZ1bmN0
aW9uICggcyApIHsKKworCQkJdGhpcy54IC09IHM7CisJCQl0aGlzLnkgLT0gczsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQlzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CisK
KwkJCXRoaXMueCA9IGEueCAtIGIueDsKKwkJCXRoaXMueSA9IGEueSAtIGIueTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQltdWx0aXBseTogZnVuY3Rpb24gKCB2ICkgeworCisJCQl0
aGlzLnggKj0gdi54OworCQkJdGhpcy55ICo9IHYueTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJ
fSwKKworCQltdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CisKKwkJCXRoaXMu
eCAqPSBzY2FsYXI7CisJCQl0aGlzLnkgKj0gc2NhbGFyOworCisJCQlyZXR1cm4gdGhpczsKKwor
CQl9LAorCisJCWRpdmlkZTogZnVuY3Rpb24gKCB2ICkgeworCisJCQl0aGlzLnggLz0gdi54Owor
CQkJdGhpcy55IC89IHYueTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlkaXZpZGVT
Y2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgeworCisJCQlyZXR1cm4gdGhpcy5tdWx0aXBseVNj
YWxhciggMSAvIHNjYWxhciApOworCisJCX0sCisKKwkJbWluOiBmdW5jdGlvbiAoIHYgKSB7CisK
KwkJCXRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApOworCQkJdGhpcy55ID0gTWF0aC5t
aW4oIHRoaXMueSwgdi55ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbWF4OiBm
dW5jdGlvbiAoIHYgKSB7CisKKwkJCXRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApOwor
CQkJdGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7CisKKwkJCXJldHVybiB0aGlzOwor
CisJCX0sCisKKwkJY2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7CisKKwkJCS8vIGFzc3Vt
ZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlCisKKwkJCXRoaXMueCA9IE1hdGgubWF4KCBtaW4u
eCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApOworCQkJdGhpcy55ID0gTWF0aC5tYXgoIG1p
bi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7CisKKwkJCXJldHVybiB0aGlzOworCisJ
CX0sCisKKwkJY2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIG1pbiA9IG5ldyBW
ZWN0b3IyKCk7CisJCQl2YXIgbWF4ID0gbmV3IFZlY3RvcjIoKTsKKworCQkJcmV0dXJuIGZ1bmN0
aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHsKKworCQkJCW1pbi5zZXQoIG1pblZh
bCwgbWluVmFsICk7CisJCQkJbWF4LnNldCggbWF4VmFsLCBtYXhWYWwgKTsKKworCQkJCXJldHVy
biB0aGlzLmNsYW1wKCBtaW4sIG1heCApOworCisJCQl9OworCisJCX0oKSwKKworCQljbGFtcExl
bmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHsKKworCQkJdmFyIGxlbmd0aCA9IHRoaXMubGVu
Z3RoKCk7CisKKwkJCXJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0
aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApOwor
CisJCX0sCisKKwkJZmxvb3I6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy54ID0gTWF0aC5mbG9v
ciggdGhpcy54ICk7CisJCQl0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQljZWlsOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMueCA9
IE1hdGguY2VpbCggdGhpcy54ICk7CisJCQl0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApOwor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXJvdW5kOiBmdW5jdGlvbiAoKSB7CisKKwkJ
CXRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApOworCQkJdGhpcy55ID0gTWF0aC5yb3VuZCgg
dGhpcy55ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJcm91bmRUb1plcm86IGZ1
bmN0aW9uICgpIHsKKworCQkJdGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRo
aXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7CisJCQl0aGlzLnkgPSAoIHRoaXMueSA8IDAg
KSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQluZWdhdGU6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy54
ID0gLSB0aGlzLng7CisJCQl0aGlzLnkgPSAtIHRoaXMueTsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQlkb3Q6IGZ1bmN0aW9uICggdiApIHsKKworCQkJcmV0dXJuIHRoaXMueCAqIHYu
eCArIHRoaXMueSAqIHYueTsKKworCQl9LAorCisJCWxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7CisK
KwkJCXJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnk7CisKKwkJfSwKKwor
CQlsZW5ndGg6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIE1hdGguc3FydCggdGhpcy54ICog
dGhpcy54ICsgdGhpcy55ICogdGhpcy55ICk7CisKKwkJfSwKKworCQlsZW5ndGhNYW5oYXR0YW46
IGZ1bmN0aW9uKCkgeworCisJCQlyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMo
IHRoaXMueSApOworCisJCX0sCisKKwkJbm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJl
dHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7CisKKwkJfSwKKwor
CQlhbmdsZTogZnVuY3Rpb24gKCkgeworCisJCQkvLyBjb21wdXRlcyB0aGUgYW5nbGUgaW4gcmFk
aWFucyB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvc2l0aXZlIHgtYXhpcworCisJCQl2YXIgYW5nbGUg
PSBNYXRoLmF0YW4yKCB0aGlzLnksIHRoaXMueCApOworCisJCQlpZiAoIGFuZ2xlIDwgMCApIGFu
Z2xlICs9IDIgKiBNYXRoLlBJOworCisJCQlyZXR1cm4gYW5nbGU7CisKKwkJfSwKKworCQlkaXN0
YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7CisKKwkJCXJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlz
dGFuY2VUb1NxdWFyZWQoIHYgKSApOworCisJCX0sCisKKwkJZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1
bmN0aW9uICggdiApIHsKKworCQkJdmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAt
IHYueTsKKwkJCXJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTsKKworCQl9LAorCisJCWRpc3RhbmNl
VG9NYW5oYXR0YW46IGZ1bmN0aW9uICggdiApIHsKKworCQkJcmV0dXJuIE1hdGguYWJzKCB0aGlz
LnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKTsKKworCQl9LAorCisJCXNldExl
bmd0aDogZnVuY3Rpb24gKCBsZW5ndGggKSB7CisKKwkJCXJldHVybiB0aGlzLm5vcm1hbGl6ZSgp
Lm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTsKKworCQl9LAorCisJCWxlcnA6IGZ1bmN0aW9uICgg
diwgYWxwaGEgKSB7CisKKwkJCXRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7CisJ
CQl0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhOworCisJCQlyZXR1cm4gdGhpczsK
KworCQl9LAorCisJCWxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7CisK
KwkJCXJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBo
YSApLmFkZCggdjEgKTsKKworCQl9LAorCisJCWVxdWFsczogZnVuY3Rpb24gKCB2ICkgeworCisJ
CQlyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICk7CisK
KwkJfSwKKworCQlmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKKworCQkJ
aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CisKKwkJCXRoaXMueCA9IGFy
cmF5WyBvZmZzZXQgXTsKKwkJCXRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0
ICkgeworCisJCQlpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOworCQkJaWYg
KCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CisKKwkJCWFycmF5WyBvZmZzZXQg
XSA9IHRoaXMueDsKKwkJCWFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7CisKKwkJCXJldHVy
biBhcnJheTsKKworCQl9LAorCisJCWZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0
cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgeworCisJCQlpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVk
ICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogb2Zmc2V0IGhhcyBiZWVu
IHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTsKKworCQkJfQorCisJCQl0
aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTsKKwkJCXRoaXMueSA9IGF0dHJpYnV0ZS5n
ZXRZKCBpbmRleCApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXJvdGF0ZUFyb3Vu
ZDogZnVuY3Rpb24gKCBjZW50ZXIsIGFuZ2xlICkgeworCisJCQl2YXIgYyA9IE1hdGguY29zKCBh
bmdsZSApLCBzID0gTWF0aC5zaW4oIGFuZ2xlICk7CisKKwkJCXZhciB4ID0gdGhpcy54IC0gY2Vu
dGVyLng7CisJCQl2YXIgeSA9IHRoaXMueSAtIGNlbnRlci55OworCisJCQl0aGlzLnggPSB4ICog
YyAtIHkgKiBzICsgY2VudGVyLng7CisJCQl0aGlzLnkgPSB4ICogcyArIHkgKiBjICsgY2VudGVy
Lnk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRo
b3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0
dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0
aHViLmNvbS9zemltZWsvCisJICovCisKKwl2YXIgdGV4dHVyZUlkID0gMDsKKworCWZ1bmN0aW9u
IFRleHR1cmUoIGltYWdlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmls
dGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkgeworCisJCU9iamVjdC5k
ZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogdGV4dHVyZUlkICsrIH0gKTsKKwor
CQl0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKKworCQl0aGlzLm5hbWUgPSAnJzsK
KworCQl0aGlzLmltYWdlID0gaW1hZ2UgIT09IHVuZGVmaW5lZCA/IGltYWdlIDogVGV4dHVyZS5E
RUZBVUxUX0lNQUdFOworCQl0aGlzLm1pcG1hcHMgPSBbXTsKKworCQl0aGlzLm1hcHBpbmcgPSBt
YXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogVGV4dHVyZS5ERUZBVUxUX01BUFBJTkc7
CisKKwkJdGhpcy53cmFwUyA9IHdyYXBTICE9PSB1bmRlZmluZWQgPyB3cmFwUyA6IENsYW1wVG9F
ZGdlV3JhcHBpbmc7CisJCXRoaXMud3JhcFQgPSB3cmFwVCAhPT0gdW5kZWZpbmVkID8gd3JhcFQg
OiBDbGFtcFRvRWRnZVdyYXBwaW5nOworCisJCXRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9
PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7CisJCXRoaXMubWluRmlsdGVy
ID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5l
YXJGaWx0ZXI7CisKKwkJdGhpcy5hbmlzb3Ryb3B5ID0gYW5pc290cm9weSAhPT0gdW5kZWZpbmVk
ID8gYW5pc290cm9weSA6IDE7CisKKwkJdGhpcy5mb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5l
ZCA/IGZvcm1hdCA6IFJHQkFGb3JtYXQ7CisJCXRoaXMudHlwZSA9IHR5cGUgIT09IHVuZGVmaW5l
ZCA/IHR5cGUgOiBVbnNpZ25lZEJ5dGVUeXBlOworCisJCXRoaXMub2Zmc2V0ID0gbmV3IFZlY3Rv
cjIoIDAsIDAgKTsKKwkJdGhpcy5yZXBlYXQgPSBuZXcgVmVjdG9yMiggMSwgMSApOworCisJCXRo
aXMuZ2VuZXJhdGVNaXBtYXBzID0gdHJ1ZTsKKwkJdGhpcy5wcmVtdWx0aXBseUFscGhhID0gZmFs
c2U7CisJCXRoaXMuZmxpcFkgPSB0cnVlOworCQl0aGlzLnVucGFja0FsaWdubWVudCA9IDQ7CS8v
IHZhbGlkIHZhbHVlczogMSwgMiwgNCwgOCAoc2VlIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvb3Bl
bmdsZXMvc2RrL2RvY3MvbWFuL3hodG1sL2dsUGl4ZWxTdG9yZWkueG1sKQorCisJCS8vIFZhbHVl
cyBvZiBlbmNvZGluZyAhPT0gVEhSRUUuTGluZWFyRW5jb2Rpbmcgb25seSBzdXBwb3J0ZWQgb24g
bWFwLCBlbnZNYXAgYW5kIGVtaXNzaXZlTWFwLgorCQkvLworCQkvLyBBbHNvIGNoYW5naW5nIHRo
ZSBlbmNvZGluZyBhZnRlciBhbHJlYWR5IHVzZWQgYnkgYSBNYXRlcmlhbCB3aWxsIG5vdCBhdXRv
bWF0aWNhbGx5IG1ha2UgdGhlIE1hdGVyaWFsCisJCS8vIHVwZGF0ZS4gIFlvdSBuZWVkIHRvIGV4
cGxpY2l0bHkgY2FsbCBNYXRlcmlhbC5uZWVkc1VwZGF0ZSB0byB0cmlnZ2VyIGl0IHRvIHJlY29t
cGlsZS4KKwkJdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nICE9PSB1bmRlZmluZWQgPyBlbmNvZGlu
ZyA6IExpbmVhckVuY29kaW5nOworCisJCXRoaXMudmVyc2lvbiA9IDA7CisJCXRoaXMub25VcGRh
dGUgPSBudWxsOworCisJfQorCisJVGV4dHVyZS5ERUZBVUxUX0lNQUdFID0gdW5kZWZpbmVkOwor
CVRleHR1cmUuREVGQVVMVF9NQVBQSU5HID0gVVZNYXBwaW5nOworCisJT2JqZWN0LmRlZmluZVBy
b3BlcnR5KCBUZXh0dXJlLnByb3RvdHlwZSwgIm5lZWRzVXBkYXRlIiwgeworCisJCXNldDogZnVu
Y3Rpb24gKCB2YWx1ZSApIHsKKworCQkJaWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lv
biArKzsKKworCQl9CisKKwl9ICk7CisKKwlPYmplY3QuYXNzaWduKCBUZXh0dXJlLnByb3RvdHlw
ZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwgeworCisJCWNvbnN0cnVjdG9yOiBUZXh0dXJl
LAorCisJCWlzVGV4dHVyZTogdHJ1ZSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQly
ZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisKKwkJfSwKKworCQlj
b3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworCQkJdGhpcy5uYW1lID0gc291cmNlLm5hbWU7
CisKKwkJCXRoaXMuaW1hZ2UgPSBzb3VyY2UuaW1hZ2U7CisJCQl0aGlzLm1pcG1hcHMgPSBzb3Vy
Y2UubWlwbWFwcy5zbGljZSggMCApOworCisJCQl0aGlzLm1hcHBpbmcgPSBzb3VyY2UubWFwcGlu
ZzsKKworCQkJdGhpcy53cmFwUyA9IHNvdXJjZS53cmFwUzsKKwkJCXRoaXMud3JhcFQgPSBzb3Vy
Y2Uud3JhcFQ7CisKKwkJCXRoaXMubWFnRmlsdGVyID0gc291cmNlLm1hZ0ZpbHRlcjsKKwkJCXRo
aXMubWluRmlsdGVyID0gc291cmNlLm1pbkZpbHRlcjsKKworCQkJdGhpcy5hbmlzb3Ryb3B5ID0g
c291cmNlLmFuaXNvdHJvcHk7CisKKwkJCXRoaXMuZm9ybWF0ID0gc291cmNlLmZvcm1hdDsKKwkJ
CXRoaXMudHlwZSA9IHNvdXJjZS50eXBlOworCisJCQl0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uu
b2Zmc2V0ICk7CisJCQl0aGlzLnJlcGVhdC5jb3B5KCBzb3VyY2UucmVwZWF0ICk7CisKKwkJCXRo
aXMuZ2VuZXJhdGVNaXBtYXBzID0gc291cmNlLmdlbmVyYXRlTWlwbWFwczsKKwkJCXRoaXMucHJl
bXVsdGlwbHlBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBseUFscGhhOworCQkJdGhpcy5mbGlwWSA9
IHNvdXJjZS5mbGlwWTsKKwkJCXRoaXMudW5wYWNrQWxpZ25tZW50ID0gc291cmNlLnVucGFja0Fs
aWdubWVudDsKKwkJCXRoaXMuZW5jb2RpbmcgPSBzb3VyY2UuZW5jb2Rpbmc7CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0sCisKKwkJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CisKKwkJCWlm
ICggbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gIT09IHVuZGVmaW5lZCApIHsKKworCQkJCXJl
dHVybiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXTsKKworCQkJfQorCisJCQlmdW5jdGlvbiBn
ZXREYXRhVVJMKCBpbWFnZSApIHsKKworCQkJCXZhciBjYW52YXM7CisKKwkJCQlpZiAoIGltYWdl
LnRvRGF0YVVSTCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWNhbnZhcyA9IGltYWdlOworCisJ
CQkJfSBlbHNlIHsKKworCQkJCQljYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdo
dHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTsKKwkJCQkJY2FudmFzLndp
ZHRoID0gaW1hZ2Uud2lkdGg7CisJCQkJCWNhbnZhcy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7CisK
KwkJCQkJY2FudmFzLmdldENvbnRleHQoICcyZCcgKS5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBp
bWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7CisKKwkJCQl9CisKKwkJCQlpZiAoIGNhbnZhcy53
aWR0aCA+IDIwNDggfHwgY2FudmFzLmhlaWdodCA+IDIwNDggKSB7CisKKwkJCQkJcmV0dXJuIGNh
bnZhcy50b0RhdGFVUkwoICdpbWFnZS9qcGVnJywgMC42ICk7CisKKwkJCQl9IGVsc2UgeworCisJ
CQkJCXJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvcG5nJyApOworCisJCQkJfQorCisJ
CQl9CisKKwkJCXZhciBvdXRwdXQgPSB7CisJCQkJbWV0YWRhdGE6IHsKKwkJCQkJdmVyc2lvbjog
NC41LAorCQkJCQl0eXBlOiAnVGV4dHVyZScsCisJCQkJCWdlbmVyYXRvcjogJ1RleHR1cmUudG9K
U09OJworCQkJCX0sCisKKwkJCQl1dWlkOiB0aGlzLnV1aWQsCisJCQkJbmFtZTogdGhpcy5uYW1l
LAorCisJCQkJbWFwcGluZzogdGhpcy5tYXBwaW5nLAorCisJCQkJcmVwZWF0OiBbIHRoaXMucmVw
ZWF0LngsIHRoaXMucmVwZWF0LnkgXSwKKwkJCQlvZmZzZXQ6IFsgdGhpcy5vZmZzZXQueCwgdGhp
cy5vZmZzZXQueSBdLAorCQkJCXdyYXA6IFsgdGhpcy53cmFwUywgdGhpcy53cmFwVCBdLAorCisJ
CQkJbWluRmlsdGVyOiB0aGlzLm1pbkZpbHRlciwKKwkJCQltYWdGaWx0ZXI6IHRoaXMubWFnRmls
dGVyLAorCQkJCWFuaXNvdHJvcHk6IHRoaXMuYW5pc290cm9weSwKKworCQkJCWZsaXBZOiB0aGlz
LmZsaXBZCisJCQl9OworCisJCQlpZiAoIHRoaXMuaW1hZ2UgIT09IHVuZGVmaW5lZCApIHsKKwor
CQkJCS8vIFRPRE86IE1vdmUgdG8gVEhSRUUuSW1hZ2UKKworCQkJCXZhciBpbWFnZSA9IHRoaXMu
aW1hZ2U7CisKKwkJCQlpZiAoIGltYWdlLnV1aWQgPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQlp
bWFnZS51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7IC8vIFVHSAorCisJCQkJfQorCisJCQkJ
aWYgKCBtZXRhLmltYWdlc1sgaW1hZ2UudXVpZCBdID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJ
bWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9IHsKKwkJCQkJCXV1aWQ6IGltYWdlLnV1aWQsCisJ
CQkJCQl1cmw6IGdldERhdGFVUkwoIGltYWdlICkKKwkJCQkJfTsKKworCQkJCX0KKworCQkJCW91
dHB1dC5pbWFnZSA9IGltYWdlLnV1aWQ7CisKKwkJCX0KKworCQkJbWV0YS50ZXh0dXJlc1sgdGhp
cy51dWlkIF0gPSBvdXRwdXQ7CisKKwkJCXJldHVybiBvdXRwdXQ7CisKKwkJfSwKKworCQlkaXNw
b3NlOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlz
cG9zZScgfSApOworCisJCX0sCisKKwkJdHJhbnNmb3JtVXY6IGZ1bmN0aW9uICggdXYgKSB7CisK
KwkJCWlmICggdGhpcy5tYXBwaW5nICE9PSBVVk1hcHBpbmcgKSByZXR1cm47CisKKwkJCXV2Lm11
bHRpcGx5KCB0aGlzLnJlcGVhdCApOworCQkJdXYuYWRkKCB0aGlzLm9mZnNldCApOworCisJCQlp
ZiAoIHV2LnggPCAwIHx8IHV2LnggPiAxICkgeworCisJCQkJc3dpdGNoICggdGhpcy53cmFwUyAp
IHsKKworCQkJCQljYXNlIFJlcGVhdFdyYXBwaW5nOgorCisJCQkJCQl1di54ID0gdXYueCAtIE1h
dGguZmxvb3IoIHV2LnggKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQ2xhbXBUb0VkZ2VX
cmFwcGluZzoKKworCQkJCQkJdXYueCA9IHV2LnggPCAwID8gMCA6IDE7CisJCQkJCQlicmVhazsK
KworCQkJCQljYXNlIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6CisKKwkJCQkJCWlmICggTWF0aC5h
YnMoIE1hdGguZmxvb3IoIHV2LnggKSAlIDIgKSA9PT0gMSApIHsKKworCQkJCQkJCXV2LnggPSBN
YXRoLmNlaWwoIHV2LnggKSAtIHV2Lng7CisKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQl1di54
ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTsKKworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisK
KwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCB1di55IDwgMCB8fCB1di55ID4gMSApIHsKKworCQkJ
CXN3aXRjaCAoIHRoaXMud3JhcFQgKSB7CisKKwkJCQkJY2FzZSBSZXBlYXRXcmFwcGluZzoKKwor
CQkJCQkJdXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7CisJCQkJCQlicmVhazsKKwor
CQkJCQljYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6CisKKwkJCQkJCXV2LnkgPSB1di55IDwgMCA/
IDAgOiAxOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5n
OgorCisJCQkJCQlpZiAoIE1hdGguYWJzKCBNYXRoLmZsb29yKCB1di55ICkgJSAyICkgPT09IDEg
KSB7CisKKwkJCQkJCQl1di55ID0gTWF0aC5jZWlsKCB1di55ICkgLSB1di55OworCisJCQkJCQl9
IGVsc2UgeworCisJCQkJCQkJdXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7CisKKwkJ
CQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJfQorCisJCQl9CisKKwkJCWlmICggdGhpcy5mbGlw
WSApIHsKKworCQkJCXV2LnkgPSAxIC0gdXYueTsKKworCQkJfQorCisJCX0KKworCX0gKTsKKwor
CS8qKgorCSAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28u
dWsvCisJICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy8KKwkgKiBA
YXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLworCSAqIEBhdXRob3IgZWdy
YWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vCisJICogQGF1dGhvciBXZXN0TGFuZ2xleSAv
IGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisJICovCisKKwlmdW5jdGlvbiBWZWN0b3I0
KCB4LCB5LCB6LCB3ICkgeworCisJCXRoaXMueCA9IHggfHwgMDsKKwkJdGhpcy55ID0geSB8fCAw
OworCQl0aGlzLnogPSB6IHx8IDA7CisJCXRoaXMudyA9ICggdyAhPT0gdW5kZWZpbmVkICkgPyB3
IDogMTsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7CisKKwkJ
aXNWZWN0b3I0OiB0cnVlLAorCisJCXNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkgeworCisJ
CQl0aGlzLnggPSB4OworCQkJdGhpcy55ID0geTsKKwkJCXRoaXMueiA9IHo7CisJCQl0aGlzLncg
PSB3OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldFNjYWxhcjogZnVuY3Rpb24g
KCBzY2FsYXIgKSB7CisKKwkJCXRoaXMueCA9IHNjYWxhcjsKKwkJCXRoaXMueSA9IHNjYWxhcjsK
KwkJCXRoaXMueiA9IHNjYWxhcjsKKwkJCXRoaXMudyA9IHNjYWxhcjsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfSwKKworCQlzZXRYOiBmdW5jdGlvbiAoIHggKSB7CisKKwkJCXRoaXMueCA9IHg7
CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0WTogZnVuY3Rpb24gKCB5ICkgewor
CisJCQl0aGlzLnkgPSB5OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldFo6IGZ1
bmN0aW9uICggeiApIHsKKworCQkJdGhpcy56ID0gejsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJ
fSwKKworCQlzZXRXOiBmdW5jdGlvbiAoIHcgKSB7CisKKwkJCXRoaXMudyA9IHc7CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2
YWx1ZSApIHsKKworCQkJc3dpdGNoICggaW5kZXggKSB7CisKKwkJCQljYXNlIDA6IHRoaXMueCA9
IHZhbHVlOyBicmVhazsKKwkJCQljYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhazsKKwkJCQlj
YXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhazsKKwkJCQljYXNlIDM6IHRoaXMudyA9IHZhbHVl
OyBicmVhazsKKwkJCQlkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2Yg
cmFuZ2U6ICcgKyBpbmRleCApOworCisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJZ2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisJCQlzd2l0Y2ggKCBpbmRl
eCApIHsKKworCQkJCWNhc2UgMDogcmV0dXJuIHRoaXMueDsKKwkJCQljYXNlIDE6IHJldHVybiB0
aGlzLnk7CisJCQkJY2FzZSAyOiByZXR1cm4gdGhpcy56OworCQkJCWNhc2UgMzogcmV0dXJuIHRo
aXMudzsKKwkJCQlkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFu
Z2U6ICcgKyBpbmRleCApOworCisJCQl9CisKKwkJfSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkg
eworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55LCB0aGlz
LnosIHRoaXMudyApOworCisJCX0sCisKKwkJY29weTogZnVuY3Rpb24gKCB2ICkgeworCisJCQl0
aGlzLnggPSB2Lng7CisJCQl0aGlzLnkgPSB2Lnk7CisJCQl0aGlzLnogPSB2Lno7CisJCQl0aGlz
LncgPSAoIHYudyAhPT0gdW5kZWZpbmVkICkgPyB2LncgOiAxOworCisJCQlyZXR1cm4gdGhpczsK
KworCQl9LAorCisJCWFkZDogZnVuY3Rpb24gKCB2LCB3ICkgeworCisJCQlpZiAoIHcgIT09IHVu
ZGVmaW5lZCApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5hZGQoKSBu
b3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5z
dGVhZC4nICk7CisJCQkJcmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApOworCisJCQl9CisK
KwkJCXRoaXMueCArPSB2Lng7CisJCQl0aGlzLnkgKz0gdi55OworCQkJdGhpcy56ICs9IHYuejsK
KwkJCXRoaXMudyArPSB2Lnc7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJYWRkU2Nh
bGFyOiBmdW5jdGlvbiAoIHMgKSB7CisKKwkJCXRoaXMueCArPSBzOworCQkJdGhpcy55ICs9IHM7
CisJCQl0aGlzLnogKz0gczsKKwkJCXRoaXMudyArPSBzOworCisJCQlyZXR1cm4gdGhpczsKKwor
CQl9LAorCisJCWFkZFZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHsKKworCQkJdGhpcy54ID0g
YS54ICsgYi54OworCQkJdGhpcy55ID0gYS55ICsgYi55OworCQkJdGhpcy56ID0gYS56ICsgYi56
OworCQkJdGhpcy53ID0gYS53ICsgYi53OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJ
CWFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkgeworCisJCQl0aGlzLnggKz0gdi54
ICogczsKKwkJCXRoaXMueSArPSB2LnkgKiBzOworCQkJdGhpcy56ICs9IHYueiAqIHM7CisJCQl0
aGlzLncgKz0gdi53ICogczsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzdWI6IGZ1
bmN0aW9uICggdiwgdyApIHsKKworCQkJaWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQlj
b25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUg
YXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOworCQkJCXJldHVy
biB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTsKKworCQkJfQorCisJCQl0aGlzLnggLT0gdi54Owor
CQkJdGhpcy55IC09IHYueTsKKwkJCXRoaXMueiAtPSB2Lno7CisJCQl0aGlzLncgLT0gdi53Owor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXN1YlNjYWxhcjogZnVuY3Rpb24gKCBzICkg
eworCisJCQl0aGlzLnggLT0gczsKKwkJCXRoaXMueSAtPSBzOworCQkJdGhpcy56IC09IHM7CisJ
CQl0aGlzLncgLT0gczsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzdWJWZWN0b3Jz
OiBmdW5jdGlvbiAoIGEsIGIgKSB7CisKKwkJCXRoaXMueCA9IGEueCAtIGIueDsKKwkJCXRoaXMu
eSA9IGEueSAtIGIueTsKKwkJCXRoaXMueiA9IGEueiAtIGIuejsKKwkJCXRoaXMudyA9IGEudyAt
IGIudzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQltdWx0aXBseVNjYWxhcjogZnVu
Y3Rpb24gKCBzY2FsYXIgKSB7CisKKwkJCXRoaXMueCAqPSBzY2FsYXI7CisJCQl0aGlzLnkgKj0g
c2NhbGFyOworCQkJdGhpcy56ICo9IHNjYWxhcjsKKwkJCXRoaXMudyAqPSBzY2FsYXI7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7
CisKKwkJCXZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56LCB3ID0gdGhpcy53
OworCQkJdmFyIGUgPSBtLmVsZW1lbnRzOworCisJCQl0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsg
NCBdICogeSArIGVbIDggXSAqIHogKyBlWyAxMiBdICogdzsKKwkJCXRoaXMueSA9IGVbIDEgXSAq
IHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKiB3OworCQkJdGhpcy56ID0g
ZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKiB3OworCQkJ
dGhpcy53ID0gZVsgMyBdICogeCArIGVbIDcgXSAqIHkgKyBlWyAxMSBdICogeiArIGVbIDE1IF0g
KiB3OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWRpdmlkZVNjYWxhcjogZnVuY3Rp
b24gKCBzY2FsYXIgKSB7CisKKwkJCXJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2Nh
bGFyICk7CisKKwkJfSwKKworCQlzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24g
KCBxICkgeworCisJCQkvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9t
ZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvcXVhdGVybmlvblRvQW5nbGUvaW5kZXguaHRtCisK
KwkJCS8vIHEgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkCisKKwkJCXRoaXMudyA9IDIgKiBN
YXRoLmFjb3MoIHEudyApOworCisJCQl2YXIgcyA9IE1hdGguc3FydCggMSAtIHEudyAqIHEudyAp
OworCisJCQlpZiAoIHMgPCAwLjAwMDEgKSB7CisKKwkJCQkgdGhpcy54ID0gMTsKKwkJCQkgdGhp
cy55ID0gMDsKKwkJCQkgdGhpcy56ID0gMDsKKworCQkJfSBlbHNlIHsKKworCQkJCSB0aGlzLngg
PSBxLnggLyBzOworCQkJCSB0aGlzLnkgPSBxLnkgLyBzOworCQkJCSB0aGlzLnogPSBxLnogLyBz
OworCisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0QXhpc0FuZ2xlRnJv
bVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7CisKKwkJCS8vIGh0dHA6Ly93d3cuZXVj
bGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRy
aXhUb0FuZ2xlL2luZGV4Lmh0bQorCisJCQkvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBp
cyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKQorCisJCQl2YXIgYW5nbGUs
IHgsIHksIHosCQkvLyB2YXJpYWJsZXMgZm9yIHJlc3VsdAorCQkJCWVwc2lsb24gPSAwLjAxLAkJ
Ly8gbWFyZ2luIHRvIGFsbG93IGZvciByb3VuZGluZyBlcnJvcnMKKwkJCQllcHNpbG9uMiA9IDAu
MSwJCS8vIG1hcmdpbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDAgYW5kIDE4MCBkZWdyZWVzCisK
KwkJCQl0ZSA9IG0uZWxlbWVudHMsCisKKwkJCQltMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBd
LCBtMTMgPSB0ZVsgOCBdLAorCQkJCW0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9
IHRlWyA5IF0sCisJCQkJbTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEw
IF07CisKKwkJCWlmICggKCBNYXRoLmFicyggbTEyIC0gbTIxICkgPCBlcHNpbG9uICkgJiYKKwkJ
CSAgICAgKCBNYXRoLmFicyggbTEzIC0gbTMxICkgPCBlcHNpbG9uICkgJiYKKwkJCSAgICAgKCBN
YXRoLmFicyggbTIzIC0gbTMyICkgPCBlcHNpbG9uICkgKSB7CisKKwkJCQkvLyBzaW5ndWxhcml0
eSBmb3VuZAorCQkJCS8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVz
dCBoYXZlICsxIGZvciBhbGwgdGVybXMKKwkJCQkvLyBpbiBsZWFkaW5nIGRpYWdvbmFsIGFuZCB6
ZXJvIGluIG90aGVyIHRlcm1zCisKKwkJCQlpZiAoICggTWF0aC5hYnMoIG0xMiArIG0yMSApIDwg
ZXBzaWxvbjIgKSAmJgorCQkJCSAgICAgKCBNYXRoLmFicyggbTEzICsgbTMxICkgPCBlcHNpbG9u
MiApICYmCisJCQkJICAgICAoIE1hdGguYWJzKCBtMjMgKyBtMzIgKSA8IGVwc2lsb24yICkgJiYK
KwkJCQkgICAgICggTWF0aC5hYnMoIG0xMSArIG0yMiArIG0zMyAtIDMgKSA8IGVwc2lsb24yICkg
KSB7CisKKwkJCQkJLy8gdGhpcyBzaW5ndWxhcml0eSBpcyBpZGVudGl0eSBtYXRyaXggc28gYW5n
bGUgPSAwCisKKwkJCQkJdGhpcy5zZXQoIDEsIDAsIDAsIDAgKTsKKworCQkJCQlyZXR1cm4gdGhp
czsgLy8gemVybyBhbmdsZSwgYXJiaXRyYXJ5IGF4aXMKKworCQkJCX0KKworCQkJCS8vIG90aGVy
d2lzZSB0aGlzIHNpbmd1bGFyaXR5IGlzIGFuZ2xlID0gMTgwCisKKwkJCQlhbmdsZSA9IE1hdGgu
UEk7CisKKwkJCQl2YXIgeHggPSAoIG0xMSArIDEgKSAvIDI7CisJCQkJdmFyIHl5ID0gKCBtMjIg
KyAxICkgLyAyOworCQkJCXZhciB6eiA9ICggbTMzICsgMSApIC8gMjsKKwkJCQl2YXIgeHkgPSAo
IG0xMiArIG0yMSApIC8gNDsKKwkJCQl2YXIgeHogPSAoIG0xMyArIG0zMSApIC8gNDsKKwkJCQl2
YXIgeXogPSAoIG0yMyArIG0zMiApIC8gNDsKKworCQkJCWlmICggKCB4eCA+IHl5ICkgJiYgKCB4
eCA+IHp6ICkgKSB7CisKKwkJCQkJLy8gbTExIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm0K
KworCQkJCQlpZiAoIHh4IDwgZXBzaWxvbiApIHsKKworCQkJCQkJeCA9IDA7CisJCQkJCQl5ID0g
MC43MDcxMDY3ODE7CisJCQkJCQl6ID0gMC43MDcxMDY3ODE7CisKKwkJCQkJfSBlbHNlIHsKKwor
CQkJCQkJeCA9IE1hdGguc3FydCggeHggKTsKKwkJCQkJCXkgPSB4eSAvIHg7CisJCQkJCQl6ID0g
eHogLyB4OworCisJCQkJCX0KKworCQkJCX0gZWxzZSBpZiAoIHl5ID4genogKSB7CisKKwkJCQkJ
Ly8gbTIyIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm0KKworCQkJCQlpZiAoIHl5IDwgZXBz
aWxvbiApIHsKKworCQkJCQkJeCA9IDAuNzA3MTA2NzgxOworCQkJCQkJeSA9IDA7CisJCQkJCQl6
ID0gMC43MDcxMDY3ODE7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJeSA9IE1hdGguc3FydCgg
eXkgKTsKKwkJCQkJCXggPSB4eSAvIHk7CisJCQkJCQl6ID0geXogLyB5OworCisJCQkJCX0KKwor
CQkJCX0gZWxzZSB7CisKKwkJCQkJLy8gbTMzIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm0g
c28gYmFzZSByZXN1bHQgb24gdGhpcworCisJCQkJCWlmICggenogPCBlcHNpbG9uICkgeworCisJ
CQkJCQl4ID0gMC43MDcxMDY3ODE7CisJCQkJCQl5ID0gMC43MDcxMDY3ODE7CisJCQkJCQl6ID0g
MDsKKworCQkJCQl9IGVsc2UgeworCisJCQkJCQl6ID0gTWF0aC5zcXJ0KCB6eiApOworCQkJCQkJ
eCA9IHh6IC8gejsKKwkJCQkJCXkgPSB5eiAvIHo7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJ
dGhpcy5zZXQoIHgsIHksIHosIGFuZ2xlICk7CisKKwkJCQlyZXR1cm4gdGhpczsgLy8gcmV0dXJu
IDE4MCBkZWcgcm90YXRpb24KKworCQkJfQorCisJCQkvLyBhcyB3ZSBoYXZlIHJlYWNoZWQgaGVy
ZSB0aGVyZSBhcmUgbm8gc2luZ3VsYXJpdGllcyBzbyB3ZSBjYW4gaGFuZGxlIG5vcm1hbGx5CisK
KwkJCXZhciBzID0gTWF0aC5zcXJ0KCAoIG0zMiAtIG0yMyApICogKCBtMzIgLSBtMjMgKSArCisJ
CQkgICAgICAgICAgICAgICAgICAgKCBtMTMgLSBtMzEgKSAqICggbTEzIC0gbTMxICkgKworCQkJ
ICAgICAgICAgICAgICAgICAgICggbTIxIC0gbTEyICkgKiAoIG0yMSAtIG0xMiApICk7IC8vIHVz
ZWQgdG8gbm9ybWFsaXplCisKKwkJCWlmICggTWF0aC5hYnMoIHMgKSA8IDAuMDAxICkgcyA9IDE7
CisKKwkJCS8vIHByZXZlbnQgZGl2aWRlIGJ5IHplcm8sIHNob3VsZCBub3QgaGFwcGVuIGlmIG1h
dHJpeCBpcyBvcnRob2dvbmFsIGFuZCBzaG91bGQgYmUKKwkJCS8vIGNhdWdodCBieSBzaW5ndWxh
cml0eSB0ZXN0IGFib3ZlLCBidXQgSSd2ZSBsZWZ0IGl0IGluIGp1c3QgaW4gY2FzZQorCisJCQl0
aGlzLnggPSAoIG0zMiAtIG0yMyApIC8gczsKKwkJCXRoaXMueSA9ICggbTEzIC0gbTMxICkgLyBz
OworCQkJdGhpcy56ID0gKCBtMjEgLSBtMTIgKSAvIHM7CisJCQl0aGlzLncgPSBNYXRoLmFjb3Mo
ICggbTExICsgbTIyICsgbTMzIC0gMSApIC8gMiApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9
LAorCisJCW1pbjogZnVuY3Rpb24gKCB2ICkgeworCisJCQl0aGlzLnggPSBNYXRoLm1pbiggdGhp
cy54LCB2LnggKTsKKwkJCXRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApOworCQkJdGhp
cy56ID0gTWF0aC5taW4oIHRoaXMueiwgdi56ICk7CisJCQl0aGlzLncgPSBNYXRoLm1pbiggdGhp
cy53LCB2LncgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQltYXg6IGZ1bmN0aW9u
ICggdiApIHsKKworCQkJdGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7CisJCQl0aGlz
LnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTsKKwkJCXRoaXMueiA9IE1hdGgubWF4KCB0aGlz
LnosIHYueiApOworCQkJdGhpcy53ID0gTWF0aC5tYXgoIHRoaXMudywgdi53ICk7CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJY2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7CisK
KwkJCS8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlCisKKwkJCXRoaXMueCA9IE1h
dGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApOworCQkJdGhpcy55ID0g
TWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7CisJCQl0aGlzLnog
PSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTsKKwkJCXRoaXMu
dyA9IE1hdGgubWF4KCBtaW4udywgTWF0aC5taW4oIG1heC53LCB0aGlzLncgKSApOworCisJCQly
ZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7CisKKwkJ
CXZhciBtaW4sIG1heDsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWws
IG1heFZhbCApIHsKKworCQkJCWlmICggbWluID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJbWlu
ID0gbmV3IFZlY3RvcjQoKTsKKwkJCQkJbWF4ID0gbmV3IFZlY3RvcjQoKTsKKworCQkJCX0KKwor
CQkJCW1pbi5zZXQoIG1pblZhbCwgbWluVmFsLCBtaW5WYWwsIG1pblZhbCApOworCQkJCW1heC5z
ZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwsIG1heFZhbCApOworCisJCQkJcmV0dXJuIHRoaXMu
Y2xhbXAoIG1pbiwgbWF4ICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWNsYW1wTGVuZ3RoOiBm
dW5jdGlvbiAoIG1pbiwgbWF4ICkgeworCisJCQl2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTsK
KworCQkJcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2Nh
bGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7CisKKwkJfSwK
KworCQlmbG9vcjogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlz
LnggKTsKKwkJCXRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApOworCQkJdGhpcy56ID0gTWF0
aC5mbG9vciggdGhpcy56ICk7CisJCQl0aGlzLncgPSBNYXRoLmZsb29yKCB0aGlzLncgKTsKKwor
CQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljZWlsOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRo
aXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7CisJCQl0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMu
eSApOworCQkJdGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTsKKwkJCXRoaXMudyA9IE1hdGgu
Y2VpbCggdGhpcy53ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJcm91bmQ6IGZ1
bmN0aW9uICgpIHsKKworCQkJdGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7CisJCQl0aGlz
LnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTsKKwkJCXRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMu
eiApOworCQkJdGhpcy53ID0gTWF0aC5yb3VuZCggdGhpcy53ICk7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJcm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy54ID0g
KCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54
ICk7CisJCQl0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBN
YXRoLmZsb29yKCB0aGlzLnkgKTsKKwkJCXRoaXMueiA9ICggdGhpcy56IDwgMCApID8gTWF0aC5j
ZWlsKCB0aGlzLnogKSA6IE1hdGguZmxvb3IoIHRoaXMueiApOworCQkJdGhpcy53ID0gKCB0aGlz
LncgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMudyApIDogTWF0aC5mbG9vciggdGhpcy53ICk7CisK
KwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbmVnYXRlOiBmdW5jdGlvbiAoKSB7CisKKwkJ
CXRoaXMueCA9IC0gdGhpcy54OworCQkJdGhpcy55ID0gLSB0aGlzLnk7CisJCQl0aGlzLnogPSAt
IHRoaXMuejsKKwkJCXRoaXMudyA9IC0gdGhpcy53OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9
LAorCisJCWRvdDogZnVuY3Rpb24gKCB2ICkgeworCisJCQlyZXR1cm4gdGhpcy54ICogdi54ICsg
dGhpcy55ICogdi55ICsgdGhpcy56ICogdi56ICsgdGhpcy53ICogdi53OworCisJCX0sCisKKwkJ
bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRo
aXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudzsKKworCQl9
LAorCisJCWxlbmd0aDogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gTWF0aC5zcXJ0KCB0aGlz
LnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncg
KiB0aGlzLncgKTsKKworCQl9LAorCisJCWxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkgewor
CisJCQlyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0
aC5hYnMoIHRoaXMueiApICsgTWF0aC5hYnMoIHRoaXMudyApOworCisJCX0sCisKKwkJbm9ybWFs
aXplOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5s
ZW5ndGgoKSB8fCAxICk7CisKKwkJfSwKKworCQlzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3Ro
ICkgeworCisJCQlyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3Ro
ICk7CisKKwkJfSwKKworCQlsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkgeworCisJCQl0aGlz
LnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhOworCQkJdGhpcy55ICs9ICggdi55IC0gdGhp
cy55ICkgKiBhbHBoYTsKKwkJCXRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7CisJ
CQl0aGlzLncgKz0gKCB2LncgLSB0aGlzLncgKSAqIGFscGhhOworCisJCQlyZXR1cm4gdGhpczsK
KworCQl9LAorCisJCWxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7CisK
KwkJCXJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBo
YSApLmFkZCggdjEgKTsKKworCQl9LAorCisJCWVxdWFsczogZnVuY3Rpb24gKCB2ICkgeworCisJ
CQlyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICgg
di56ID09PSB0aGlzLnogKSAmJiAoIHYudyA9PT0gdGhpcy53ICkgKTsKKworCQl9LAorCisJCWZy
b21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgeworCisJCQlpZiAoIG9mZnNldCA9
PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKKworCQkJdGhpcy54ID0gYXJyYXlbIG9mZnNldCBd
OworCQkJdGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTsKKwkJCXRoaXMueiA9IGFycmF5WyBv
ZmZzZXQgKyAyIF07CisJCQl0aGlzLncgPSBhcnJheVsgb2Zmc2V0ICsgMyBdOworCisJCQlyZXR1
cm4gdGhpczsKKworCQl9LAorCisJCXRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCAp
IHsKKworCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKKwkJCWlmICgg
b2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisJCQlhcnJheVsgb2Zmc2V0IF0g
PSB0aGlzLng7CisJCQlhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55OworCQkJYXJyYXlbIG9m
ZnNldCArIDIgXSA9IHRoaXMuejsKKwkJCWFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLnc7CisK
KwkJCXJldHVybiBhcnJheTsKKworCQl9LAorCisJCWZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0
aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgeworCisJCQlpZiAoIG9mZnNldCAhPT0g
dW5kZWZpbmVkICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogb2Zmc2V0
IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTsKKworCQkJ
fQorCisJCQl0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTsKKwkJCXRoaXMueSA9IGF0
dHJpYnV0ZS5nZXRZKCBpbmRleCApOworCQkJdGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4
ICk7CisJCQl0aGlzLncgPSBhdHRyaWJ1dGUuZ2V0VyggaW5kZXggKTsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBzemltZWsgLyBodHRwczov
L2dpdGh1Yi5jb20vc3ppbWVrLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJl
ZHF1YWxpYS5jb20vCisJICogQGF1dGhvciBNYXJpdXMgS2ludGVsIC8gaHR0cHM6Ly9naXRodWIu
Y29tL2tpbnRlbAorCSAqLworCisJLyoKKwkgSW4gb3B0aW9ucywgd2UgY2FuIHNwZWNpZnk6CisJ
ICogVGV4dHVyZSBwYXJhbWV0ZXJzIGZvciBhbiBhdXRvLWdlbmVyYXRlZCB0YXJnZXQgdGV4dHVy
ZQorCSAqIGRlcHRoQnVmZmVyL3N0ZW5jaWxCdWZmZXI6IEJvb2xlYW5zIHRvIGluZGljYXRlIGlm
IHdlIHNob3VsZCBnZW5lcmF0ZSB0aGVzZSBidWZmZXJzCisJKi8KKwlmdW5jdGlvbiBXZWJHTFJl
bmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHsKKworCQl0aGlzLnV1aWQgPSBf
TWF0aC5nZW5lcmF0ZVVVSUQoKTsKKworCQl0aGlzLndpZHRoID0gd2lkdGg7CisJCXRoaXMuaGVp
Z2h0ID0gaGVpZ2h0OworCisJCXRoaXMuc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0
aCwgaGVpZ2h0ICk7CisJCXRoaXMuc2Npc3NvclRlc3QgPSBmYWxzZTsKKworCQl0aGlzLnZpZXdw
b3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKKworCQlvcHRpb25zID0g
b3B0aW9ucyB8fCB7fTsKKworCQlpZiAoIG9wdGlvbnMubWluRmlsdGVyID09PSB1bmRlZmluZWQg
KSBvcHRpb25zLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjsKKworCQl0aGlzLnRleHR1cmUgPSBu
ZXcgVGV4dHVyZSggdW5kZWZpbmVkLCB1bmRlZmluZWQsIG9wdGlvbnMud3JhcFMsIG9wdGlvbnMu
d3JhcFQsIG9wdGlvbnMubWFnRmlsdGVyLCBvcHRpb25zLm1pbkZpbHRlciwgb3B0aW9ucy5mb3Jt
YXQsIG9wdGlvbnMudHlwZSwgb3B0aW9ucy5hbmlzb3Ryb3B5LCBvcHRpb25zLmVuY29kaW5nICk7
CisKKwkJdGhpcy5kZXB0aEJ1ZmZlciA9IG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5l
ZCA/IG9wdGlvbnMuZGVwdGhCdWZmZXIgOiB0cnVlOworCQl0aGlzLnN0ZW5jaWxCdWZmZXIgPSBv
cHRpb25zLnN0ZW5jaWxCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlbmNpbEJ1ZmZl
ciA6IHRydWU7CisJCXRoaXMuZGVwdGhUZXh0dXJlID0gb3B0aW9ucy5kZXB0aFRleHR1cmUgIT09
IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhUZXh0dXJlIDogbnVsbDsKKworCX0KKworCU9iamVj
dC5hc3NpZ24oIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSwgRXZlbnREaXNwYXRjaGVyLnBy
b3RvdHlwZSwgeworCisJCWlzV2ViR0xSZW5kZXJUYXJnZXQ6IHRydWUsCisKKwkJc2V0U2l6ZTog
ZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0ICkgeworCisJCQlpZiAoIHRoaXMud2lkdGggIT09IHdp
ZHRoIHx8IHRoaXMuaGVpZ2h0ICE9PSBoZWlnaHQgKSB7CisKKwkJCQl0aGlzLndpZHRoID0gd2lk
dGg7CisJCQkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisKKwkJCQl0aGlzLmRpc3Bvc2UoKTsKKwor
CQkJfQorCisJCQl0aGlzLnZpZXdwb3J0LnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApOworCQkJ
dGhpcy5zY2lzc29yLnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApOworCisJCX0sCisKKwkJY2xv
bmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29w
eSggdGhpcyApOworCisJCX0sCisKKwkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJ
CXRoaXMud2lkdGggPSBzb3VyY2Uud2lkdGg7CisJCQl0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWln
aHQ7CisKKwkJCXRoaXMudmlld3BvcnQuY29weSggc291cmNlLnZpZXdwb3J0ICk7CisKKwkJCXRo
aXMudGV4dHVyZSA9IHNvdXJjZS50ZXh0dXJlLmNsb25lKCk7CisKKwkJCXRoaXMuZGVwdGhCdWZm
ZXIgPSBzb3VyY2UuZGVwdGhCdWZmZXI7CisJCQl0aGlzLnN0ZW5jaWxCdWZmZXIgPSBzb3VyY2Uu
c3RlbmNpbEJ1ZmZlcjsKKwkJCXRoaXMuZGVwdGhUZXh0dXJlID0gc291cmNlLmRlcHRoVGV4dHVy
ZTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlkaXNwb3NlOiBmdW5jdGlvbiAoKSB7
CisKKwkJCXRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApOworCisJCX0K
KworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1
YWxpYS5jb20KKwkgKi8KKworCWZ1bmN0aW9uIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggd2lkdGgs
IGhlaWdodCwgb3B0aW9ucyApIHsKKworCQlXZWJHTFJlbmRlclRhcmdldC5jYWxsKCB0aGlzLCB3
aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7CisKKwkJdGhpcy5hY3RpdmVDdWJlRmFjZSA9IDA7IC8v
IFBYIDAsIE5YIDEsIFBZIDIsIE5ZIDMsIFBaIDQsIE5aIDUKKwkJdGhpcy5hY3RpdmVNaXBNYXBM
ZXZlbCA9IDA7CisKKwl9CisKKwlXZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlID0gT2Jq
ZWN0LmNyZWF0ZSggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlICk7CisJV2ViR0xSZW5kZXJU
YXJnZXRDdWJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZTsK
KworCVdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUuaXNXZWJHTFJlbmRlclRhcmdldEN1
YmUgPSB0cnVlOworCisJLyoqCisJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8v
Z29tby5zZS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29t
LworCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xl
eQorCSAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KKwkgKi8KKworCWZ1bmN0
aW9uIFF1YXRlcm5pb24oIHgsIHksIHosIHcgKSB7CisKKwkJdGhpcy5feCA9IHggfHwgMDsKKwkJ
dGhpcy5feSA9IHkgfHwgMDsKKwkJdGhpcy5feiA9IHogfHwgMDsKKwkJdGhpcy5fdyA9ICggdyAh
PT0gdW5kZWZpbmVkICkgPyB3IDogMTsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIFF1YXRlcm5p
b24sIHsKKworCQlzbGVycDogZnVuY3Rpb24gKCBxYSwgcWIsIHFtLCB0ICkgeworCisJCQlyZXR1
cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTsKKworCQl9LAorCisJCXNsZXJwRmxhdDog
ZnVuY3Rpb24gKCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zm
c2V0MSwgdCApIHsKKworCQkJLy8gZnV6ei1mcmVlLCBhcnJheS1iYXNlZCBRdWF0ZXJuaW9uIFNM
RVJQIG9wZXJhdGlvbgorCisJCQl2YXIgeDAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMCBdLAorCQkJ
CXkwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDEgXSwKKwkJCQl6MCA9IHNyYzBbIHNyY09mZnNldDAg
KyAyIF0sCisJCQkJdzAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMyBdLAorCisJCQkJeDEgPSBzcmMx
WyBzcmNPZmZzZXQxICsgMCBdLAorCQkJCXkxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDEgXSwKKwkJ
CQl6MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF0sCisJCQkJdzEgPSBzcmMxWyBzcmNPZmZzZXQx
ICsgMyBdOworCisJCQlpZiAoIHcwICE9PSB3MSB8fCB4MCAhPT0geDEgfHwgeTAgIT09IHkxIHx8
IHowICE9PSB6MSApIHsKKworCQkJCXZhciBzID0gMSAtIHQsCisKKwkJCQkJY29zID0geDAgKiB4
MSArIHkwICogeTEgKyB6MCAqIHoxICsgdzAgKiB3MSwKKworCQkJCQlkaXIgPSAoIGNvcyA+PSAw
ID8gMSA6IC0gMSApLAorCQkJCQlzcXJTaW4gPSAxIC0gY29zICogY29zOworCisJCQkJLy8gU2tp
cCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMgdG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczoKKwkJ
CQlpZiAoIHNxclNpbiA+IE51bWJlci5FUFNJTE9OICkgeworCisJCQkJCXZhciBzaW4gPSBNYXRo
LnNxcnQoIHNxclNpbiApLAorCQkJCQkJbGVuID0gTWF0aC5hdGFuMiggc2luLCBjb3MgKiBkaXIg
KTsKKworCQkJCQlzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjsKKwkJCQkJdCA9IE1hdGgu
c2luKCB0ICogbGVuICkgLyBzaW47CisKKwkJCQl9CisKKwkJCQl2YXIgdERpciA9IHQgKiBkaXI7
CisKKwkJCQl4MCA9IHgwICogcyArIHgxICogdERpcjsKKwkJCQl5MCA9IHkwICogcyArIHkxICog
dERpcjsKKwkJCQl6MCA9IHowICogcyArIHoxICogdERpcjsKKwkJCQl3MCA9IHcwICogcyArIHcx
ICogdERpcjsKKworCQkJCS8vIE5vcm1hbGl6ZSBpbiBjYXNlIHdlIGp1c3QgZGlkIGEgbGVycDoK
KwkJCQlpZiAoIHMgPT09IDEgLSB0ICkgeworCisJCQkJCXZhciBmID0gMSAvIE1hdGguc3FydCgg
eDAgKiB4MCArIHkwICogeTAgKyB6MCAqIHowICsgdzAgKiB3MCApOworCisJCQkJCXgwICo9IGY7
CisJCQkJCXkwICo9IGY7CisJCQkJCXowICo9IGY7CisJCQkJCXcwICo9IGY7CisKKwkJCQl9CisK
KwkJCX0KKworCQkJZHN0WyBkc3RPZmZzZXQgXSA9IHgwOworCQkJZHN0WyBkc3RPZmZzZXQgKyAx
IF0gPSB5MDsKKwkJCWRzdFsgZHN0T2Zmc2V0ICsgMiBdID0gejA7CisJCQlkc3RbIGRzdE9mZnNl
dCArIDMgXSA9IHcwOworCisJCX0KKworCX0gKTsKKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVz
KCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwgeworCisJCXg6IHsKKworCQkJZ2V0OiBmdW5jdGlvbiAo
KSB7CisKKwkJCQlyZXR1cm4gdGhpcy5feDsKKworCQkJfSwKKworCQkJc2V0OiBmdW5jdGlvbiAo
IHZhbHVlICkgeworCisJCQkJdGhpcy5feCA9IHZhbHVlOworCQkJCXRoaXMub25DaGFuZ2VDYWxs
YmFjaygpOworCisJCQl9CisKKwkJfSwKKworCQl5OiB7CisKKwkJCWdldDogZnVuY3Rpb24gKCkg
eworCisJCQkJcmV0dXJuIHRoaXMuX3k7CisKKwkJCX0sCisKKwkJCXNldDogZnVuY3Rpb24gKCB2
YWx1ZSApIHsKKworCQkJCXRoaXMuX3kgPSB2YWx1ZTsKKwkJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJh
Y2soKTsKKworCQkJfQorCisJCX0sCisKKwkJejogeworCisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsK
KworCQkJCXJldHVybiB0aGlzLl96OworCisJCQl9LAorCisJCQlzZXQ6IGZ1bmN0aW9uICggdmFs
dWUgKSB7CisKKwkJCQl0aGlzLl96ID0gdmFsdWU7CisJCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNr
KCk7CisKKwkJCX0KKworCQl9LAorCisJCXc6IHsKKworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CisK
KwkJCQlyZXR1cm4gdGhpcy5fdzsKKworCQkJfSwKKworCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVl
ICkgeworCisJCQkJdGhpcy5fdyA9IHZhbHVlOworCQkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygp
OworCisJCQl9CisKKwkJfQorCisJfSApOworCisJT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbi5w
cm90b3R5cGUsIHsKKworCQlzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHsKKworCQkJdGhp
cy5feCA9IHg7CisJCQl0aGlzLl95ID0geTsKKwkJCXRoaXMuX3ogPSB6OworCQkJdGhpcy5fdyA9
IHc7CisKKwkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisJCQlyZXR1cm4gdGhpczsKKwor
CQl9LAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBuZXcgdGhpcy5jb25z
dHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyApOworCisJCX0sCisK
KwkJY29weTogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkgeworCisJCQl0aGlzLl94ID0gcXVhdGVy
bmlvbi54OworCQkJdGhpcy5feSA9IHF1YXRlcm5pb24ueTsKKwkJCXRoaXMuX3ogPSBxdWF0ZXJu
aW9uLno7CisJCQl0aGlzLl93ID0gcXVhdGVybmlvbi53OworCisJCQl0aGlzLm9uQ2hhbmdlQ2Fs
bGJhY2soKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRGcm9tRXVsZXI6IGZ1
bmN0aW9uICggZXVsZXIsIHVwZGF0ZSApIHsKKworCQkJaWYgKCAhICggZXVsZXIgJiYgZXVsZXIu
aXNFdWxlciApICkgeworCisJCQkJdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuUXVhdGVybmlvbjog
LnNldEZyb21FdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFu
IGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApOworCisJCQl9CisKKwkJCXZhciB4ID0gZXVsZXIuX3gs
IHkgPSBldWxlci5feSwgeiA9IGV1bGVyLl96LCBvcmRlciA9IGV1bGVyLm9yZGVyOworCisJCQkv
LyBodHRwOi8vd3d3Lm1hdGh3b3Jrcy5jb20vbWF0bGFiY2VudHJhbC9maWxlZXhjaGFuZ2UvCisJ
CQkvLyAJMjA2OTYtZnVuY3Rpb24tdG8tY29udmVydC1iZXR3ZWVuLWRjbS1ldWxlci1hbmdsZXMt
cXVhdGVybmlvbnMtYW5kLWV1bGVyLXZlY3RvcnMvCisJCQkvLwljb250ZW50L1NwaW5DYWxjLm0K
KworCQkJdmFyIGNvcyA9IE1hdGguY29zOworCQkJdmFyIHNpbiA9IE1hdGguc2luOworCisJCQl2
YXIgYzEgPSBjb3MoIHggLyAyICk7CisJCQl2YXIgYzIgPSBjb3MoIHkgLyAyICk7CisJCQl2YXIg
YzMgPSBjb3MoIHogLyAyICk7CisKKwkJCXZhciBzMSA9IHNpbiggeCAvIDIgKTsKKwkJCXZhciBz
MiA9IHNpbiggeSAvIDIgKTsKKwkJCXZhciBzMyA9IHNpbiggeiAvIDIgKTsKKworCQkJaWYgKCBv
cmRlciA9PT0gJ1hZWicgKSB7CisKKwkJCQl0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBz
MiAqIHMzOworCQkJCXRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7CisJCQkJ
dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMzsKKwkJCQl0aGlzLl93ID0gYzEg
KiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzOworCisJCQl9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1lY
WicgKSB7CisKKwkJCQl0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzOworCQkJ
CXRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7CisJCQkJdGhpcy5feiA9IGMx
ICogYzIgKiBzMyAtIHMxICogczIgKiBjMzsKKwkJCQl0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsg
czEgKiBzMiAqIHMzOworCisJCQl9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pYWScgKSB7CisKKwkJ
CQl0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzOworCQkJCXRoaXMuX3kgPSBj
MSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7CisJCQkJdGhpcy5feiA9IGMxICogYzIgKiBzMyAr
IHMxICogczIgKiBjMzsKKwkJCQl0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMz
OworCisJCQl9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pZWCcgKSB7CisKKwkJCQl0aGlzLl94ID0g
czEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzOworCQkJCXRoaXMuX3kgPSBjMSAqIHMyICogYzMg
KyBzMSAqIGMyICogczM7CisJCQkJdGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBj
MzsKKwkJCQl0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzOworCisJCQl9IGVs
c2UgaWYgKCBvcmRlciA9PT0gJ1laWCcgKSB7CisKKwkJCQl0aGlzLl94ID0gczEgKiBjMiAqIGMz
ICsgYzEgKiBzMiAqIHMzOworCQkJCXRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICog
czM7CisJCQkJdGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMzsKKwkJCQl0aGlz
Ll93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzOworCisJCQl9IGVsc2UgaWYgKCBvcmRl
ciA9PT0gJ1haWScgKSB7CisKKwkJCQl0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAq
IHMzOworCQkJCXRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7CisJCQkJdGhp
cy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMzsKKwkJCQl0aGlzLl93ID0gYzEgKiBj
MiAqIGMzICsgczEgKiBzMiAqIHMzOworCisJCQl9CisKKwkJCWlmICggdXBkYXRlICE9PSBmYWxz
ZSApIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAor
CisJCXNldEZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7CisKKwkJCS8v
IGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9j
b252ZXJzaW9ucy9hbmdsZVRvUXVhdGVybmlvbi9pbmRleC5odG0KKworCQkJLy8gYXNzdW1lcyBh
eGlzIGlzIG5vcm1hbGl6ZWQKKworCQkJdmFyIGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1h
dGguc2luKCBoYWxmQW5nbGUgKTsKKworCQkJdGhpcy5feCA9IGF4aXMueCAqIHM7CisJCQl0aGlz
Ll95ID0gYXhpcy55ICogczsKKwkJCXRoaXMuX3ogPSBheGlzLnogKiBzOworCQkJdGhpcy5fdyA9
IE1hdGguY29zKCBoYWxmQW5nbGUgKTsKKworCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CisK
KwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5j
dGlvbiAoIG0gKSB7CisKKwkJCS8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhz
L2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb1F1YXRlcm5pb24vaW5kZXgu
aHRtCisKKwkJCS8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlv
biBtYXRyaXggKGkuZSwgdW5zY2FsZWQpCisKKwkJCXZhciB0ZSA9IG0uZWxlbWVudHMsCisKKwkJ
CQltMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLAorCQkJCW0yMSA9
IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sCisJCQkJbTMxID0gdGVbIDIg
XSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF0sCisKKwkJCQl0cmFjZSA9IG0xMSArIG0y
MiArIG0zMywKKwkJCQlzOworCisJCQlpZiAoIHRyYWNlID4gMCApIHsKKworCQkJCXMgPSAwLjUg
LyBNYXRoLnNxcnQoIHRyYWNlICsgMS4wICk7CisKKwkJCQl0aGlzLl93ID0gMC4yNSAvIHM7CisJ
CQkJdGhpcy5feCA9ICggbTMyIC0gbTIzICkgKiBzOworCQkJCXRoaXMuX3kgPSAoIG0xMyAtIG0z
MSApICogczsKKwkJCQl0aGlzLl96ID0gKCBtMjEgLSBtMTIgKSAqIHM7CisKKwkJCX0gZWxzZSBp
ZiAoIG0xMSA+IG0yMiAmJiBtMTEgPiBtMzMgKSB7CisKKwkJCQlzID0gMi4wICogTWF0aC5zcXJ0
KCAxLjAgKyBtMTEgLSBtMjIgLSBtMzMgKTsKKworCQkJCXRoaXMuX3cgPSAoIG0zMiAtIG0yMyAp
IC8gczsKKwkJCQl0aGlzLl94ID0gMC4yNSAqIHM7CisJCQkJdGhpcy5feSA9ICggbTEyICsgbTIx
ICkgLyBzOworCQkJCXRoaXMuX3ogPSAoIG0xMyArIG0zMSApIC8gczsKKworCQkJfSBlbHNlIGlm
ICggbTIyID4gbTMzICkgeworCisJCQkJcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTIyIC0g
bTExIC0gbTMzICk7CisKKwkJCQl0aGlzLl93ID0gKCBtMTMgLSBtMzEgKSAvIHM7CisJCQkJdGhp
cy5feCA9ICggbTEyICsgbTIxICkgLyBzOworCQkJCXRoaXMuX3kgPSAwLjI1ICogczsKKwkJCQl0
aGlzLl96ID0gKCBtMjMgKyBtMzIgKSAvIHM7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlzID0gMi4w
ICogTWF0aC5zcXJ0KCAxLjAgKyBtMzMgLSBtMTEgLSBtMjIgKTsKKworCQkJCXRoaXMuX3cgPSAo
IG0yMSAtIG0xMiApIC8gczsKKwkJCQl0aGlzLl94ID0gKCBtMTMgKyBtMzEgKSAvIHM7CisJCQkJ
dGhpcy5feSA9ICggbTIzICsgbTMyICkgLyBzOworCQkJCXRoaXMuX3ogPSAwLjI1ICogczsKKwor
CQkJfQorCisJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQlzZXRGcm9tVW5pdFZlY3RvcnM6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gYXNz
dW1lcyBkaXJlY3Rpb24gdmVjdG9ycyB2RnJvbSBhbmQgdlRvIGFyZSBub3JtYWxpemVkCisKKwkJ
CXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgcjsKKworCQkJdmFyIEVQUyA9IDAuMDAw
MDAxOworCisJCQlyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVVuaXRWZWN0b3JzKCB2RnJvbSwgdlRv
ICkgeworCisJCQkJaWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVmVjdG9yMygpOwor
CisJCQkJciA9IHZGcm9tLmRvdCggdlRvICkgKyAxOworCisJCQkJaWYgKCByIDwgRVBTICkgewor
CisJCQkJCXIgPSAwOworCisJCQkJCWlmICggTWF0aC5hYnMoIHZGcm9tLnggKSA+IE1hdGguYWJz
KCB2RnJvbS56ICkgKSB7CisKKwkJCQkJCXYxLnNldCggLSB2RnJvbS55LCB2RnJvbS54LCAwICk7
CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJdjEuc2V0KCAwLCAtIHZGcm9tLnosIHZGcm9tLnkg
KTsKKworCQkJCQl9CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXYxLmNyb3NzVmVjdG9ycyggdkZy
b20sIHZUbyApOworCisJCQkJfQorCisJCQkJdGhpcy5feCA9IHYxLng7CisJCQkJdGhpcy5feSA9
IHYxLnk7CisJCQkJdGhpcy5feiA9IHYxLno7CisJCQkJdGhpcy5fdyA9IHI7CisKKwkJCQlyZXR1
cm4gdGhpcy5ub3JtYWxpemUoKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJaW52ZXJzZTogZnVu
Y3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5jb25qdWdhdGUoKS5ub3JtYWxpemUoKTsKKwor
CQl9LAorCisJCWNvbmp1Z2F0ZTogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLl94ICo9IC0gMTsK
KwkJCXRoaXMuX3kgKj0gLSAxOworCQkJdGhpcy5feiAqPSAtIDE7CisKKwkJCXRoaXMub25DaGFu
Z2VDYWxsYmFjaygpOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWRvdDogZnVuY3Rp
b24gKCB2ICkgeworCisJCQlyZXR1cm4gdGhpcy5feCAqIHYuX3ggKyB0aGlzLl95ICogdi5feSAr
IHRoaXMuX3ogKiB2Ll96ICsgdGhpcy5fdyAqIHYuX3c7CisKKwkJfSwKKworCQlsZW5ndGhTcTog
ZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICog
dGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3c7CisKKwkJfSwK
KworCQlsZW5ndGg6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIE1hdGguc3FydCggdGhpcy5f
eCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhp
cy5fdyAqIHRoaXMuX3cgKTsKKworCQl9LAorCisJCW5vcm1hbGl6ZTogZnVuY3Rpb24gKCkgewor
CisJCQl2YXIgbCA9IHRoaXMubGVuZ3RoKCk7CisKKwkJCWlmICggbCA9PT0gMCApIHsKKworCQkJ
CXRoaXMuX3ggPSAwOworCQkJCXRoaXMuX3kgPSAwOworCQkJCXRoaXMuX3ogPSAwOworCQkJCXRo
aXMuX3cgPSAxOworCisJCQl9IGVsc2UgeworCisJCQkJbCA9IDEgLyBsOworCisJCQkJdGhpcy5f
eCA9IHRoaXMuX3ggKiBsOworCQkJCXRoaXMuX3kgPSB0aGlzLl95ICogbDsKKwkJCQl0aGlzLl96
ID0gdGhpcy5feiAqIGw7CisJCQkJdGhpcy5fdyA9IHRoaXMuX3cgKiBsOworCisJCQl9CisKKwkJ
CXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJ
CW11bHRpcGx5OiBmdW5jdGlvbiAoIHEsIHAgKSB7CisKKwkJCWlmICggcCAhPT0gdW5kZWZpbmVk
ICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5KCkg
bm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlRdWF0ZXJuaW9ucygg
YSwgYiApIGluc3RlYWQuJyApOworCQkJCXJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMo
IHEsIHAgKTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCB0
aGlzLCBxICk7CisKKwkJfSwKKworCQlwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBxICkgeworCisJ
CQlyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCB0aGlzICk7CisKKwkJfSwKKwor
CQltdWx0aXBseVF1YXRlcm5pb25zOiBmdW5jdGlvbiAoIGEsIGIgKSB7CisKKwkJCS8vIGZyb20g
aHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxn
ZWJyYS9xdWF0ZXJuaW9ucy9jb2RlL2luZGV4Lmh0bQorCisJCQl2YXIgcWF4ID0gYS5feCwgcWF5
ID0gYS5feSwgcWF6ID0gYS5feiwgcWF3ID0gYS5fdzsKKwkJCXZhciBxYnggPSBiLl94LCBxYnkg
PSBiLl95LCBxYnogPSBiLl96LCBxYncgPSBiLl93OworCisJCQl0aGlzLl94ID0gcWF4ICogcWJ3
ICsgcWF3ICogcWJ4ICsgcWF5ICogcWJ6IC0gcWF6ICogcWJ5OworCQkJdGhpcy5feSA9IHFheSAq
IHFidyArIHFhdyAqIHFieSArIHFheiAqIHFieCAtIHFheCAqIHFiejsKKwkJCXRoaXMuX3ogPSBx
YXogKiBxYncgKyBxYXcgKiBxYnogKyBxYXggKiBxYnkgLSBxYXkgKiBxYng7CisJCQl0aGlzLl93
ID0gcWF3ICogcWJ3IC0gcWF4ICogcWJ4IC0gcWF5ICogcWJ5IC0gcWF6ICogcWJ6OworCisJCQl0
aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlz
bGVycDogZnVuY3Rpb24gKCBxYiwgdCApIHsKKworCQkJaWYgKCB0ID09PSAwICkgcmV0dXJuIHRo
aXM7CisJCQlpZiAoIHQgPT09IDEgKSByZXR1cm4gdGhpcy5jb3B5KCBxYiApOworCisJCQl2YXIg
eCA9IHRoaXMuX3gsIHkgPSB0aGlzLl95LCB6ID0gdGhpcy5feiwgdyA9IHRoaXMuX3c7CisKKwkJ
CS8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1l
ZEFsZ2VicmEvcXVhdGVybmlvbnMvc2xlcnAvCisKKwkJCXZhciBjb3NIYWxmVGhldGEgPSB3ICog
cWIuX3cgKyB4ICogcWIuX3ggKyB5ICogcWIuX3kgKyB6ICogcWIuX3o7CisKKwkJCWlmICggY29z
SGFsZlRoZXRhIDwgMCApIHsKKworCQkJCXRoaXMuX3cgPSAtIHFiLl93OworCQkJCXRoaXMuX3gg
PSAtIHFiLl94OworCQkJCXRoaXMuX3kgPSAtIHFiLl95OworCQkJCXRoaXMuX3ogPSAtIHFiLl96
OworCisJCQkJY29zSGFsZlRoZXRhID0gLSBjb3NIYWxmVGhldGE7CisKKwkJCX0gZWxzZSB7CisK
KwkJCQl0aGlzLmNvcHkoIHFiICk7CisKKwkJCX0KKworCQkJaWYgKCBjb3NIYWxmVGhldGEgPj0g
MS4wICkgeworCisJCQkJdGhpcy5fdyA9IHc7CisJCQkJdGhpcy5feCA9IHg7CisJCQkJdGhpcy5f
eSA9IHk7CisJCQkJdGhpcy5feiA9IHo7CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJfQorCisJ
CQl2YXIgc2luSGFsZlRoZXRhID0gTWF0aC5zcXJ0KCAxLjAgLSBjb3NIYWxmVGhldGEgKiBjb3NI
YWxmVGhldGEgKTsKKworCQkJaWYgKCBNYXRoLmFicyggc2luSGFsZlRoZXRhICkgPCAwLjAwMSAp
IHsKKworCQkJCXRoaXMuX3cgPSAwLjUgKiAoIHcgKyB0aGlzLl93ICk7CisJCQkJdGhpcy5feCA9
IDAuNSAqICggeCArIHRoaXMuX3ggKTsKKwkJCQl0aGlzLl95ID0gMC41ICogKCB5ICsgdGhpcy5f
eSApOworCQkJCXRoaXMuX3ogPSAwLjUgKiAoIHogKyB0aGlzLl96ICk7CisKKwkJCQlyZXR1cm4g
dGhpczsKKworCQkJfQorCisJCQl2YXIgaGFsZlRoZXRhID0gTWF0aC5hdGFuMiggc2luSGFsZlRo
ZXRhLCBjb3NIYWxmVGhldGEgKTsKKwkJCXZhciByYXRpb0EgPSBNYXRoLnNpbiggKCAxIC0gdCAp
ICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGEsCisJCQkJcmF0aW9CID0gTWF0aC5zaW4oIHQg
KiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YTsKKworCQkJdGhpcy5fdyA9ICggdyAqIHJhdGlv
QSArIHRoaXMuX3cgKiByYXRpb0IgKTsKKwkJCXRoaXMuX3ggPSAoIHggKiByYXRpb0EgKyB0aGlz
Ll94ICogcmF0aW9CICk7CisJCQl0aGlzLl95ID0gKCB5ICogcmF0aW9BICsgdGhpcy5feSAqIHJh
dGlvQiApOworCQkJdGhpcy5feiA9ICggeiAqIHJhdGlvQSArIHRoaXMuX3ogKiByYXRpb0IgKTsK
KworCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0s
CisKKwkJZXF1YWxzOiBmdW5jdGlvbiAoIHF1YXRlcm5pb24gKSB7CisKKwkJCXJldHVybiAoIHF1
YXRlcm5pb24uX3ggPT09IHRoaXMuX3ggKSAmJiAoIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kg
KSAmJiAoIHF1YXRlcm5pb24uX3ogPT09IHRoaXMuX3ogKSAmJiAoIHF1YXRlcm5pb24uX3cgPT09
IHRoaXMuX3cgKTsKKworCQl9LAorCisJCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zm
c2V0ICkgeworCisJCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKKwor
CQkJdGhpcy5feCA9IGFycmF5WyBvZmZzZXQgXTsKKwkJCXRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0
ICsgMSBdOworCQkJdGhpcy5feiA9IGFycmF5WyBvZmZzZXQgKyAyIF07CisJCQl0aGlzLl93ID0g
YXJyYXlbIG9mZnNldCArIDMgXTsKKworCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zm
c2V0ICkgeworCisJCQlpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOworCQkJ
aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CisKKwkJCWFycmF5WyBvZmZz
ZXQgXSA9IHRoaXMuX3g7CisJCQlhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5feTsKKwkJCWFy
cmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96OworCQkJYXJyYXlbIG9mZnNldCArIDMgXSA9IHRo
aXMuX3c7CisKKwkJCXJldHVybiBhcnJheTsKKworCQl9LAorCisJCW9uQ2hhbmdlOiBmdW5jdGlv
biAoIGNhbGxiYWNrICkgeworCisJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjazsK
KworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlvbkNoYW5nZUNhbGxiYWNrOiBmdW5jdGlv
biAoKSB7fQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJk
b29iLmNvbS8KKwkgKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcv
CisJICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy8KKwkgKiBAYXV0
aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLworCSAqIEBhdXRob3IgZWdyYWV0
aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vCisJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0
dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisJICovCisKKwlmdW5jdGlvbiBWZWN0b3IzKCB4
LCB5LCB6ICkgeworCisJCXRoaXMueCA9IHggfHwgMDsKKwkJdGhpcy55ID0geSB8fCAwOworCQl0
aGlzLnogPSB6IHx8IDA7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBWZWN0b3IzLnByb3RvdHlw
ZSwgeworCisJCWlzVmVjdG9yMzogdHJ1ZSwKKworCQlzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiAp
IHsKKworCQkJdGhpcy54ID0geDsKKwkJCXRoaXMueSA9IHk7CisJCQl0aGlzLnogPSB6OworCisJ
CQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIg
KSB7CisKKwkJCXRoaXMueCA9IHNjYWxhcjsKKwkJCXRoaXMueSA9IHNjYWxhcjsKKwkJCXRoaXMu
eiA9IHNjYWxhcjsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRYOiBmdW5jdGlv
biAoIHggKSB7CisKKwkJCXRoaXMueCA9IHg7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJc2V0WTogZnVuY3Rpb24gKCB5ICkgeworCisJCQl0aGlzLnkgPSB5OworCisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCXNldFo6IGZ1bmN0aW9uICggeiApIHsKKworCQkJdGhpcy56ID0g
ejsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRDb21wb25lbnQ6IGZ1bmN0aW9u
ICggaW5kZXgsIHZhbHVlICkgeworCisJCQlzd2l0Y2ggKCBpbmRleCApIHsKKworCQkJCWNhc2Ug
MDogdGhpcy54ID0gdmFsdWU7IGJyZWFrOworCQkJCWNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJy
ZWFrOworCQkJCWNhc2UgMjogdGhpcy56ID0gdmFsdWU7IGJyZWFrOworCQkJCWRlZmF1bHQ6IHRo
cm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7CisKKwkJ
CX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlnZXRDb21wb25lbnQ6IGZ1bmN0aW9u
ICggaW5kZXggKSB7CisKKwkJCXN3aXRjaCAoIGluZGV4ICkgeworCisJCQkJY2FzZSAwOiByZXR1
cm4gdGhpcy54OworCQkJCWNhc2UgMTogcmV0dXJuIHRoaXMueTsKKwkJCQljYXNlIDI6IHJldHVy
biB0aGlzLno7CisJCQkJZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9m
IHJhbmdlOiAnICsgaW5kZXggKTsKKworCQkJfQorCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9u
ICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwg
dGhpcy56ICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIHYgKSB7CisKKwkJCXRoaXMu
eCA9IHYueDsKKwkJCXRoaXMueSA9IHYueTsKKwkJCXRoaXMueiA9IHYuejsKKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQlhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHsKKworCQkJaWYgKCB3
ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAu
YWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwg
YiApIGluc3RlYWQuJyApOworCQkJCXJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTsKKwor
CQkJfQorCisJCQl0aGlzLnggKz0gdi54OworCQkJdGhpcy55ICs9IHYueTsKKwkJCXRoaXMueiAr
PSB2Lno7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJYWRkU2NhbGFyOiBmdW5jdGlv
biAoIHMgKSB7CisKKwkJCXRoaXMueCArPSBzOworCQkJdGhpcy55ICs9IHM7CisJCQl0aGlzLnog
Kz0gczsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlhZGRWZWN0b3JzOiBmdW5jdGlv
biAoIGEsIGIgKSB7CisKKwkJCXRoaXMueCA9IGEueCArIGIueDsKKwkJCXRoaXMueSA9IGEueSAr
IGIueTsKKwkJCXRoaXMueiA9IGEueiArIGIuejsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQlhZGRTY2FsZWRWZWN0b3I6IGZ1bmN0aW9uICggdiwgcyApIHsKKworCQkJdGhpcy54ICs9
IHYueCAqIHM7CisJCQl0aGlzLnkgKz0gdi55ICogczsKKwkJCXRoaXMueiArPSB2LnogKiBzOwor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXN1YjogZnVuY3Rpb24gKCB2LCB3ICkgewor
CisJCQlpZiAoIHcgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVF
LlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJW
ZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7CisJCQkJcmV0dXJuIHRoaXMuc3ViVmVjdG9ycygg
diwgdyApOworCisJCQl9CisKKwkJCXRoaXMueCAtPSB2Lng7CisJCQl0aGlzLnkgLT0gdi55Owor
CQkJdGhpcy56IC09IHYuejsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzdWJTY2Fs
YXI6IGZ1bmN0aW9uICggcyApIHsKKworCQkJdGhpcy54IC09IHM7CisJCQl0aGlzLnkgLT0gczsK
KwkJCXRoaXMueiAtPSBzOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXN1YlZlY3Rv
cnM6IGZ1bmN0aW9uICggYSwgYiApIHsKKworCQkJdGhpcy54ID0gYS54IC0gYi54OworCQkJdGhp
cy55ID0gYS55IC0gYi55OworCQkJdGhpcy56ID0gYS56IC0gYi56OworCisJCQlyZXR1cm4gdGhp
czsKKworCQl9LAorCisJCW11bHRpcGx5OiBmdW5jdGlvbiAoIHYsIHcgKSB7CisKKwkJCWlmICgg
dyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzog
Lm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlW
ZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7CisJCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlWZWN0
b3JzKCB2LCB3ICk7CisKKwkJCX0KKworCQkJdGhpcy54ICo9IHYueDsKKwkJCXRoaXMueSAqPSB2
Lnk7CisJCQl0aGlzLnogKj0gdi56OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCW11
bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHsKKworCQkJdGhpcy54ICo9IHNjYWxh
cjsKKwkJCXRoaXMueSAqPSBzY2FsYXI7CisJCQl0aGlzLnogKj0gc2NhbGFyOworCisJCQlyZXR1
cm4gdGhpczsKKworCQl9LAorCisJCW11bHRpcGx5VmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkg
eworCisJCQl0aGlzLnggPSBhLnggKiBiLng7CisJCQl0aGlzLnkgPSBhLnkgKiBiLnk7CisJCQl0
aGlzLnogPSBhLnogKiBiLno7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJYXBwbHlF
dWxlcjogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9u
KCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiBhcHBseUV1bGVyKCBldWxlciApIHsKKworCQkJCWlm
ICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHsKKworCQkJCQljb25zb2xlLmVycm9y
KCAnVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3Rh
dGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTsKKworCQkJCX0KKworCQkJ
CXJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1
bGVyICkgKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJYXBwbHlBeGlzQW5nbGU6IGZ1bmN0aW9u
ICgpIHsKKworCQkJdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOworCisJCQlyZXR1
cm4gZnVuY3Rpb24gYXBwbHlBeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkgeworCisJCQkJcmV0dXJu
IHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMs
IGFuZ2xlICkgKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJYXBwbHlNYXRyaXgzOiBmdW5jdGlv
biAoIG0gKSB7CisKKwkJCXZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56Owor
CQkJdmFyIGUgPSBtLmVsZW1lbnRzOworCisJCQl0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgMyBd
ICogeSArIGVbIDYgXSAqIHo7CisJCQl0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSAr
IGVbIDcgXSAqIHo7CisJCQl0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDgg
XSAqIHo7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJYXBwbHlNYXRyaXg0OiBmdW5j
dGlvbiAoIG0gKSB7CisKKwkJCXZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56
OworCQkJdmFyIGUgPSBtLmVsZW1lbnRzOworCisJCQl2YXIgdyA9IDEgLyAoIGVbIDMgXSAqIHgg
KyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICk7CisKKwkJCXRoaXMueCA9ICgg
ZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gICogeiArIGVbIDEyIF0gKSAqIHc7CisJ
CQl0aGlzLnkgPSAoIGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICAqIHogKyBlWyAx
MyBdICkgKiB3OworCQkJdGhpcy56ID0gKCBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEw
IF0gKiB6ICsgZVsgMTQgXSApICogdzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlh
cHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHsKKworCQkJdmFyIHggPSB0aGlzLngsIHkg
PSB0aGlzLnksIHogPSB0aGlzLno7CisJCQl2YXIgcXggPSBxLngsIHF5ID0gcS55LCBxeiA9IHEu
eiwgcXcgPSBxLnc7CisKKwkJCS8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjdG9yCisKKwkJCXZhciBp
eCA9ICBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHk7CisJCQl2YXIgaXkgPSAgcXcgKiB5ICsgcXog
KiB4IC0gcXggKiB6OworCQkJdmFyIGl6ID0gIHF3ICogeiArIHF4ICogeSAtIHF5ICogeDsKKwkJ
CXZhciBpdyA9IC0gcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6OworCisJCQkvLyBjYWxjdWxhdGUg
cmVzdWx0ICogaW52ZXJzZSBxdWF0CisKKwkJCXRoaXMueCA9IGl4ICogcXcgKyBpdyAqIC0gcXgg
KyBpeSAqIC0gcXogLSBpeiAqIC0gcXk7CisJCQl0aGlzLnkgPSBpeSAqIHF3ICsgaXcgKiAtIHF5
ICsgaXogKiAtIHF4IC0gaXggKiAtIHF6OworCQkJdGhpcy56ID0gaXogKiBxdyArIGl3ICogLSBx
eiArIGl4ICogLSBxeSAtIGl5ICogLSBxeDsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKwor
CQlwcm9qZWN0OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgp
OworCisJCQlyZXR1cm4gZnVuY3Rpb24gcHJvamVjdCggY2FtZXJhICkgeworCisJCQkJbWF0cml4
Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBtYXRyaXguZ2V0SW52
ZXJzZSggY2FtZXJhLm1hdHJpeFdvcmxkICkgKTsKKwkJCQlyZXR1cm4gdGhpcy5hcHBseU1hdHJp
eDQoIG1hdHJpeCApOworCisJCQl9OworCisJCX0oKSwKKworCQl1bnByb2plY3Q6IGZ1bmN0aW9u
ICgpIHsKKworCQkJdmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CisKKwkJCXJldHVybiBmdW5j
dGlvbiB1bnByb2plY3QoIGNhbWVyYSApIHsKKworCQkJCW1hdHJpeC5tdWx0aXBseU1hdHJpY2Vz
KCBjYW1lcmEubWF0cml4V29ybGQsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEucHJvamVjdGlv
bk1hdHJpeCApICk7CisJCQkJcmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKKwor
CQkJfTsKKworCQl9KCksCisKKwkJdHJhbnNmb3JtRGlyZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7
CisKKwkJCS8vIGlucHV0OiBUSFJFRS5NYXRyaXg0IGFmZmluZSBtYXRyaXgKKwkJCS8vIHZlY3Rv
ciBpbnRlcnByZXRlZCBhcyBhIGRpcmVjdGlvbgorCisJCQl2YXIgeCA9IHRoaXMueCwgeSA9IHRo
aXMueSwgeiA9IHRoaXMuejsKKwkJCXZhciBlID0gbS5lbGVtZW50czsKKworCQkJdGhpcy54ID0g
ZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gICogejsKKwkJCXRoaXMueSA9IGVbIDEg
XSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICAqIHo7CisJCQl0aGlzLnogPSBlWyAyIF0gKiB4
ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6OworCisJCQlyZXR1cm4gdGhpcy5ub3JtYWxpemUo
KTsKKworCQl9LAorCisJCWRpdmlkZTogZnVuY3Rpb24gKCB2ICkgeworCisJCQl0aGlzLnggLz0g
di54OworCQkJdGhpcy55IC89IHYueTsKKwkJCXRoaXMueiAvPSB2Lno7CisKKwkJCXJldHVybiB0
aGlzOworCisJCX0sCisKKwkJZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHsKKwor
CQkJcmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTsKKworCQl9LAorCisJ
CW1pbjogZnVuY3Rpb24gKCB2ICkgeworCisJCQl0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2
LnggKTsKKwkJCXRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApOworCQkJdGhpcy56ID0g
TWF0aC5taW4oIHRoaXMueiwgdi56ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJ
bWF4OiBmdW5jdGlvbiAoIHYgKSB7CisKKwkJCXRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYu
eCApOworCQkJdGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7CisJCQl0aGlzLnogPSBN
YXRoLm1heCggdGhpcy56LCB2LnogKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlj
bGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHsKKworCQkJLy8gYXNzdW1lcyBtaW4gPCBtYXgs
IGNvbXBvbmVudHdpc2UKKworCQkJdGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbigg
bWF4LngsIHRoaXMueCApICk7CisJCQl0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWlu
KCBtYXgueSwgdGhpcy55ICkgKTsKKwkJCXRoaXMueiA9IE1hdGgubWF4KCBtaW4ueiwgTWF0aC5t
aW4oIG1heC56LCB0aGlzLnogKSApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNs
YW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBtaW4gPSBuZXcgVmVjdG9yMygpOwor
CQkJdmFyIG1heCA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiBjbGFtcFNj
YWxhciggbWluVmFsLCBtYXhWYWwgKSB7CisKKwkJCQltaW4uc2V0KCBtaW5WYWwsIG1pblZhbCwg
bWluVmFsICk7CisJCQkJbWF4LnNldCggbWF4VmFsLCBtYXhWYWwsIG1heFZhbCApOworCisJCQkJ
cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWNs
YW1wTGVuZ3RoOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkgeworCisJCQl2YXIgbGVuZ3RoID0gdGhp
cy5sZW5ndGgoKTsKKworCQkJcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSAp
Lm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSAp
ICk7CisKKwkJfSwKKworCQlmbG9vcjogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLnggPSBNYXRo
LmZsb29yKCB0aGlzLnggKTsKKwkJCXRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApOworCQkJ
dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0s
CisKKwkJY2VpbDogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMu
eCApOworCQkJdGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTsKKwkJCXRoaXMueiA9IE1hdGgu
Y2VpbCggdGhpcy56ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJcm91bmQ6IGZ1
bmN0aW9uICgpIHsKKworCQkJdGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7CisJCQl0aGlz
LnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTsKKwkJCXRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMu
eiApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXJvdW5kVG9aZXJvOiBmdW5jdGlv
biAoKSB7CisKKwkJCXRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLngg
KSA6IE1hdGguZmxvb3IoIHRoaXMueCApOworCQkJdGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBN
YXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7CisJCQl0aGlzLnogPSAo
IHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnog
KTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQluZWdhdGU6IGZ1bmN0aW9uICgpIHsK
KworCQkJdGhpcy54ID0gLSB0aGlzLng7CisJCQl0aGlzLnkgPSAtIHRoaXMueTsKKwkJCXRoaXMu
eiA9IC0gdGhpcy56OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWRvdDogZnVuY3Rp
b24gKCB2ICkgeworCisJCQlyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhp
cy56ICogdi56OworCisJCX0sCisKKwkJLy8gVE9ETyBsZW5ndGhTcXVhcmVkPworCisJCWxlbmd0
aFNxOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkg
KiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLno7CisKKwkJfSwKKworCQlsZW5ndGg6IGZ1bmN0aW9u
ICgpIHsKKworCQkJcmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICog
dGhpcy55ICsgdGhpcy56ICogdGhpcy56ICk7CisKKwkJfSwKKworCQlsZW5ndGhNYW5oYXR0YW46
IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJz
KCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKTsKKworCQl9LAorCisJCW5vcm1hbGl6ZTog
ZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3Ro
KCkgfHwgMSApOworCisJCX0sCisKKwkJc2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHsK
KworCQkJcmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApOwor
CisJCX0sCisKKwkJbGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHsKKworCQkJdGhpcy54ICs9
ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTsKKwkJCXRoaXMueSArPSAoIHYueSAtIHRoaXMueSAp
ICogYWxwaGE7CisJCQl0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhOworCisJCQly
ZXR1cm4gdGhpczsKKworCQl9LAorCisJCWxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2Miwg
YWxwaGEgKSB7CisKKwkJCXJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5
U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTsKKworCQl9LAorCisJCWNyb3NzOiBmdW5jdGlvbiAo
IHYsIHcgKSB7CisKKwkJCWlmICggdyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJY29uc29sZS53
YXJuKCAnVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1l
bnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7CisJCQkJcmV0dXJuIHRo
aXMuY3Jvc3NWZWN0b3JzKCB2LCB3ICk7CisKKwkJCX0KKworCQkJdmFyIHggPSB0aGlzLngsIHkg
PSB0aGlzLnksIHogPSB0aGlzLno7CisKKwkJCXRoaXMueCA9IHkgKiB2LnogLSB6ICogdi55Owor
CQkJdGhpcy55ID0geiAqIHYueCAtIHggKiB2Lno7CisJCQl0aGlzLnogPSB4ICogdi55IC0geSAq
IHYueDsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljcm9zc1ZlY3RvcnM6IGZ1bmN0
aW9uICggYSwgYiApIHsKKworCQkJdmFyIGF4ID0gYS54LCBheSA9IGEueSwgYXogPSBhLno7CisJ
CQl2YXIgYnggPSBiLngsIGJ5ID0gYi55LCBieiA9IGIuejsKKworCQkJdGhpcy54ID0gYXkgKiBi
eiAtIGF6ICogYnk7CisJCQl0aGlzLnkgPSBheiAqIGJ4IC0gYXggKiBiejsKKwkJCXRoaXMueiA9
IGF4ICogYnkgLSBheSAqIGJ4OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXByb2pl
Y3RPblZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7CisKKwkJCXZhciBzY2FsYXIgPSB2ZWN0
b3IuZG90KCB0aGlzICkgLyB2ZWN0b3IubGVuZ3RoU3EoKTsKKworCQkJcmV0dXJuIHRoaXMuY29w
eSggdmVjdG9yICkubXVsdGlwbHlTY2FsYXIoIHNjYWxhciApOworCisJCX0sCisKKwkJcHJvamVj
dE9uUGxhbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKwor
CQkJcmV0dXJuIGZ1bmN0aW9uIHByb2plY3RPblBsYW5lKCBwbGFuZU5vcm1hbCApIHsKKworCQkJ
CXYxLmNvcHkoIHRoaXMgKS5wcm9qZWN0T25WZWN0b3IoIHBsYW5lTm9ybWFsICk7CisKKwkJCQly
ZXR1cm4gdGhpcy5zdWIoIHYxICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCXJlZmxlY3Q6IGZ1
bmN0aW9uICgpIHsKKworCQkJLy8gcmVmbGVjdCBpbmNpZGVudCB2ZWN0b3Igb2ZmIHBsYW5lIG9y
dGhvZ29uYWwgdG8gbm9ybWFsCisJCQkvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQg
bGVuZ3RoCisKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJldHVybiBmdW5jdGlv
biByZWZsZWN0KCBub3JtYWwgKSB7CisKKwkJCQlyZXR1cm4gdGhpcy5zdWIoIHYxLmNvcHkoIG5v
cm1hbCApLm11bHRpcGx5U2NhbGFyKCAyICogdGhpcy5kb3QoIG5vcm1hbCApICkgKTsKKworCQkJ
fTsKKworCQl9KCksCisKKwkJYW5nbGVUbzogZnVuY3Rpb24gKCB2ICkgeworCisJCQl2YXIgdGhl
dGEgPSB0aGlzLmRvdCggdiApIC8gKCBNYXRoLnNxcnQoIHRoaXMubGVuZ3RoU3EoKSAqIHYubGVu
Z3RoU3EoKSApICk7CisKKwkJCS8vIGNsYW1wLCB0byBoYW5kbGUgbnVtZXJpY2FsIHByb2JsZW1z
CisKKwkJCXJldHVybiBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB0aGV0YSwgLSAxLCAxICkgKTsK
KworCQl9LAorCisJCWRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHsKKworCQkJcmV0dXJuIE1h
dGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7CisKKwkJfSwKKworCQlkaXN0
YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkgeworCisJCQl2YXIgZHggPSB0aGlzLnggLSB2
LngsIGR5ID0gdGhpcy55IC0gdi55LCBkeiA9IHRoaXMueiAtIHYuejsKKworCQkJcmV0dXJuIGR4
ICogZHggKyBkeSAqIGR5ICsgZHogKiBkejsKKworCQl9LAorCisJCWRpc3RhbmNlVG9NYW5oYXR0
YW46IGZ1bmN0aW9uICggdiApIHsKKworCQkJcmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2Lngg
KSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKSArIE1hdGguYWJzKCB0aGlzLnogLSB2LnogKTsK
KworCQl9LAorCisJCXNldEZyb21TcGhlcmljYWw6IGZ1bmN0aW9uICggcyApIHsKKworCQkJdmFy
IHNpblBoaVJhZGl1cyA9IE1hdGguc2luKCBzLnBoaSApICogcy5yYWRpdXM7CisKKwkJCXRoaXMu
eCA9IHNpblBoaVJhZGl1cyAqIE1hdGguc2luKCBzLnRoZXRhICk7CisJCQl0aGlzLnkgPSBNYXRo
LmNvcyggcy5waGkgKSAqIHMucmFkaXVzOworCQkJdGhpcy56ID0gc2luUGhpUmFkaXVzICogTWF0
aC5jb3MoIHMudGhldGEgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRGcm9t
Q3lsaW5kcmljYWw6IGZ1bmN0aW9uICggYyApIHsKKworCQkJdGhpcy54ID0gYy5yYWRpdXMgKiBN
YXRoLnNpbiggYy50aGV0YSApOworCQkJdGhpcy55ID0gYy55OworCQkJdGhpcy56ID0gYy5yYWRp
dXMgKiBNYXRoLmNvcyggYy50aGV0YSApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJ
CXNldEZyb21NYXRyaXhQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkgeworCisJCQl2YXIgZSA9IG0u
ZWxlbWVudHM7CisKKwkJCXRoaXMueCA9IGVbIDEyIF07CisJCQl0aGlzLnkgPSBlWyAxMyBdOwor
CQkJdGhpcy56ID0gZVsgMTQgXTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRG
cm9tTWF0cml4U2NhbGU6IGZ1bmN0aW9uICggbSApIHsKKworCQkJdmFyIHN4ID0gdGhpcy5zZXRG
cm9tTWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7CisJCQl2YXIgc3kgPSB0aGlzLnNldEZy
b21NYXRyaXhDb2x1bW4oIG0sIDEgKS5sZW5ndGgoKTsKKwkJCXZhciBzeiA9IHRoaXMuc2V0RnJv
bU1hdHJpeENvbHVtbiggbSwgMiApLmxlbmd0aCgpOworCisJCQl0aGlzLnggPSBzeDsKKwkJCXRo
aXMueSA9IHN5OworCQkJdGhpcy56ID0gc3o7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJc2V0RnJvbU1hdHJpeENvbHVtbjogZnVuY3Rpb24gKCBtLCBpbmRleCApIHsKKworCQkJcmV0
dXJuIHRoaXMuZnJvbUFycmF5KCBtLmVsZW1lbnRzLCBpbmRleCAqIDQgKTsKKworCQl9LAorCisJ
CWVxdWFsczogZnVuY3Rpb24gKCB2ICkgeworCisJCQlyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54
ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSApOworCisJCX0s
CisKKwkJZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CisKKwkJCWlmICgg
b2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisJCQl0aGlzLnggPSBhcnJheVsg
b2Zmc2V0IF07CisJCQl0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdOworCQkJdGhpcy56ID0g
YXJyYXlbIG9mZnNldCArIDIgXTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQl0b0Fy
cmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CisKKwkJCWlmICggYXJyYXkgPT09IHVu
ZGVmaW5lZCApIGFycmF5ID0gW107CisJCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zm
c2V0ID0gMDsKKworCQkJYXJyYXlbIG9mZnNldCBdID0gdGhpcy54OworCQkJYXJyYXlbIG9mZnNl
dCArIDEgXSA9IHRoaXMueTsKKwkJCWFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7CisKKwkJ
CXJldHVybiBhcnJheTsKKworCQl9LAorCisJCWZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9u
ICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgeworCisJCQlpZiAoIG9mZnNldCAhPT0gdW5k
ZWZpbmVkICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhh
cyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTsKKworCQkJfQor
CisJCQl0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTsKKwkJCXRoaXMueSA9IGF0dHJp
YnV0ZS5nZXRZKCBpbmRleCApOworCQkJdGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7
CisKKwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3Ig
bXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBzdXBlcmVnZ2JlcnQgLyBo
dHRwOi8vd3d3LnBhdWxicnVudC5jby51ay8KKwkgKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8v
YmxvZy50aGVqaXQub3JnLworCSAqIEBhdXRob3Igam9yZGlfcm9zIC8gaHR0cDovL3BsYXR0c29m
dC5jb20KKwkgKiBAYXV0aG9yIEQxcGxvMWQgLyBodHRwOi8vZ2l0aHViLmNvbS9EMXBsbzFkCisJ
ICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0
aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLworCSAqIEBhdXRob3IgdGlta25p
cCAvIGh0dHA6Ly93d3cuZmxvb3JwbGFubmVyLmNvbS8KKwkgKiBAYXV0aG9yIGJob3VzdG9uIC8g
aHR0cDovL2NsYXJhLmlvCisJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIu
Y29tL1dlc3RMYW5nbGV5CisJICovCisKKwlmdW5jdGlvbiBNYXRyaXg0KCkgeworCisJCXRoaXMu
ZWxlbWVudHMgPSBbCisKKwkJCTEsIDAsIDAsIDAsCisJCQkwLCAxLCAwLCAwLAorCQkJMCwgMCwg
MSwgMCwKKwkJCTAsIDAsIDAsIDEKKworCQldOworCisJCWlmICggYXJndW1lbnRzLmxlbmd0aCA+
IDAgKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0
b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTsKKwor
CQl9CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwgeworCisJCWlz
TWF0cml4NDogdHJ1ZSwKKworCQlzZXQ6IGZ1bmN0aW9uICggbjExLCBuMTIsIG4xMywgbjE0LCBu
MjEsIG4yMiwgbjIzLCBuMjQsIG4zMSwgbjMyLCBuMzMsIG4zNCwgbjQxLCBuNDIsIG40MywgbjQ0
ICkgeworCisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworCisJCQl0ZVsgMCBdID0gbjExOyB0
ZVsgNCBdID0gbjEyOyB0ZVsgOCBdID0gbjEzOyB0ZVsgMTIgXSA9IG4xNDsKKwkJCXRlWyAxIF0g
PSBuMjE7IHRlWyA1IF0gPSBuMjI7IHRlWyA5IF0gPSBuMjM7IHRlWyAxMyBdID0gbjI0OworCQkJ
dGVbIDIgXSA9IG4zMTsgdGVbIDYgXSA9IG4zMjsgdGVbIDEwIF0gPSBuMzM7IHRlWyAxNCBdID0g
bjM0OworCQkJdGVbIDMgXSA9IG40MTsgdGVbIDcgXSA9IG40MjsgdGVbIDExIF0gPSBuNDM7IHRl
WyAxNSBdID0gbjQ0OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWlkZW50aXR5OiBm
dW5jdGlvbiAoKSB7CisKKwkJCXRoaXMuc2V0KAorCisJCQkJMSwgMCwgMCwgMCwKKwkJCQkwLCAx
LCAwLCAwLAorCQkJCTAsIDAsIDEsIDAsCisJCQkJMCwgMCwgMCwgMQorCisJCQkpOworCisJCQly
ZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVy
biBuZXcgTWF0cml4NCgpLmZyb21BcnJheSggdGhpcy5lbGVtZW50cyApOworCisJCX0sCisKKwkJ
Y29weTogZnVuY3Rpb24gKCBtICkgeworCisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworCQkJ
dmFyIG1lID0gbS5lbGVtZW50czsKKworCQkJdGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBt
ZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTsgdGVbIDMgXSA9IG1lWyAzIF07CisJCQl0ZVsgNCBd
ID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07IHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBd
ID0gbWVbIDcgXTsKKwkJCXRlWyA4IF0gPSBtZVsgOCBdOyB0ZVsgOSBdID0gbWVbIDkgXTsgdGVb
IDEwIF0gPSBtZVsgMTAgXTsgdGVbIDExIF0gPSBtZVsgMTEgXTsKKwkJCXRlWyAxMiBdID0gbWVb
IDEyIF07IHRlWyAxMyBdID0gbWVbIDEzIF07IHRlWyAxNCBdID0gbWVbIDE0IF07IHRlWyAxNSBd
ID0gbWVbIDE1IF07CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY29weVBvc2l0aW9u
OiBmdW5jdGlvbiAoIG0gKSB7CisKKwkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHMsIG1lID0gbS5l
bGVtZW50czsKKworCQkJdGVbIDEyIF0gPSBtZVsgMTIgXTsKKwkJCXRlWyAxMyBdID0gbWVbIDEz
IF07CisJCQl0ZVsgMTQgXSA9IG1lWyAxNCBdOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAor
CisJCWV4dHJhY3RCYXNpczogZnVuY3Rpb24gKCB4QXhpcywgeUF4aXMsIHpBeGlzICkgeworCisJ
CQl4QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAwICk7CisJCQl5QXhpcy5zZXRGcm9t
TWF0cml4Q29sdW1uKCB0aGlzLCAxICk7CisJCQl6QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0
aGlzLCAyICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbWFrZUJhc2lzOiBmdW5j
dGlvbiAoIHhBeGlzLCB5QXhpcywgekF4aXMgKSB7CisKKwkJCXRoaXMuc2V0KAorCQkJCXhBeGlz
LngsIHlBeGlzLngsIHpBeGlzLngsIDAsCisJCQkJeEF4aXMueSwgeUF4aXMueSwgekF4aXMueSwg
MCwKKwkJCQl4QXhpcy56LCB5QXhpcy56LCB6QXhpcy56LCAwLAorCQkJCTAsICAgICAgIDAsICAg
ICAgIDAsICAgICAgIDEKKwkJCSk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZXh0
cmFjdFJvdGF0aW9uOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7
CisKKwkJCXJldHVybiBmdW5jdGlvbiBleHRyYWN0Um90YXRpb24oIG0gKSB7CisKKwkJCQl2YXIg
dGUgPSB0aGlzLmVsZW1lbnRzOworCQkJCXZhciBtZSA9IG0uZWxlbWVudHM7CisKKwkJCQl2YXIg
c2NhbGVYID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTsKKwkJ
CQl2YXIgc2NhbGVZID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDEgKS5sZW5ndGgo
KTsKKwkJCQl2YXIgc2NhbGVaID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5s
ZW5ndGgoKTsKKworCQkJCXRlWyAwIF0gPSBtZVsgMCBdICogc2NhbGVYOworCQkJCXRlWyAxIF0g
PSBtZVsgMSBdICogc2NhbGVYOworCQkJCXRlWyAyIF0gPSBtZVsgMiBdICogc2NhbGVYOworCisJ
CQkJdGVbIDQgXSA9IG1lWyA0IF0gKiBzY2FsZVk7CisJCQkJdGVbIDUgXSA9IG1lWyA1IF0gKiBz
Y2FsZVk7CisJCQkJdGVbIDYgXSA9IG1lWyA2IF0gKiBzY2FsZVk7CisKKwkJCQl0ZVsgOCBdID0g
bWVbIDggXSAqIHNjYWxlWjsKKwkJCQl0ZVsgOSBdID0gbWVbIDkgXSAqIHNjYWxlWjsKKwkJCQl0
ZVsgMTAgXSA9IG1lWyAxMCBdICogc2NhbGVaOworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX07
CisKKwkJfSgpLAorCisJCW1ha2VSb3RhdGlvbkZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciAp
IHsKKworCQkJaWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkgeworCisJCQkJY29u
c29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDogLm1ha2VSb3RhdGlvbkZyb21FdWxlcigpIG5vdyBl
eHBlY3RzIGEgRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4n
ICk7CisKKwkJCX0KKworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworCQkJdmFyIHggPSBl
dWxlci54LCB5ID0gZXVsZXIueSwgeiA9IGV1bGVyLno7CisJCQl2YXIgYSA9IE1hdGguY29zKCB4
ICksIGIgPSBNYXRoLnNpbiggeCApOworCQkJdmFyIGMgPSBNYXRoLmNvcyggeSApLCBkID0gTWF0
aC5zaW4oIHkgKTsKKwkJCXZhciBlID0gTWF0aC5jb3MoIHogKSwgZiA9IE1hdGguc2luKCB6ICk7
CisKKwkJCWlmICggZXVsZXIub3JkZXIgPT09ICdYWVonICkgeworCisJCQkJdmFyIGFlID0gYSAq
IGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7CisKKwkJCQl0ZVsgMCBdID0g
YyAqIGU7CisJCQkJdGVbIDQgXSA9IC0gYyAqIGY7CisJCQkJdGVbIDggXSA9IGQ7CisKKwkJCQl0
ZVsgMSBdID0gYWYgKyBiZSAqIGQ7CisJCQkJdGVbIDUgXSA9IGFlIC0gYmYgKiBkOworCQkJCXRl
WyA5IF0gPSAtIGIgKiBjOworCisJCQkJdGVbIDIgXSA9IGJmIC0gYWUgKiBkOworCQkJCXRlWyA2
IF0gPSBiZSArIGFmICogZDsKKwkJCQl0ZVsgMTAgXSA9IGEgKiBjOworCisJCQl9IGVsc2UgaWYg
KCBldWxlci5vcmRlciA9PT0gJ1lYWicgKSB7CisKKwkJCQl2YXIgY2UgPSBjICogZSwgY2YgPSBj
ICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjsKKworCQkJCXRlWyAwIF0gPSBjZSArIGRmICog
YjsKKwkJCQl0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7CisJCQkJdGVbIDggXSA9IGEgKiBkOworCisJ
CQkJdGVbIDEgXSA9IGEgKiBmOworCQkJCXRlWyA1IF0gPSBhICogZTsKKwkJCQl0ZVsgOSBdID0g
LSBiOworCisJCQkJdGVbIDIgXSA9IGNmICogYiAtIGRlOworCQkJCXRlWyA2IF0gPSBkZiArIGNl
ICogYjsKKwkJCQl0ZVsgMTAgXSA9IGEgKiBjOworCisJCQl9IGVsc2UgaWYgKCBldWxlci5vcmRl
ciA9PT0gJ1pYWScgKSB7CisKKwkJCQl2YXIgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBk
ICogZSwgZGYgPSBkICogZjsKKworCQkJCXRlWyAwIF0gPSBjZSAtIGRmICogYjsKKwkJCQl0ZVsg
NCBdID0gLSBhICogZjsKKwkJCQl0ZVsgOCBdID0gZGUgKyBjZiAqIGI7CisKKwkJCQl0ZVsgMSBd
ID0gY2YgKyBkZSAqIGI7CisJCQkJdGVbIDUgXSA9IGEgKiBlOworCQkJCXRlWyA5IF0gPSBkZiAt
IGNlICogYjsKKworCQkJCXRlWyAyIF0gPSAtIGEgKiBkOworCQkJCXRlWyA2IF0gPSBiOworCQkJ
CXRlWyAxMCBdID0gYSAqIGM7CisKKwkJCX0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWllY
JyApIHsKKworCQkJCXZhciBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9
IGIgKiBmOworCisJCQkJdGVbIDAgXSA9IGMgKiBlOworCQkJCXRlWyA0IF0gPSBiZSAqIGQgLSBh
ZjsKKwkJCQl0ZVsgOCBdID0gYWUgKiBkICsgYmY7CisKKwkJCQl0ZVsgMSBdID0gYyAqIGY7CisJ
CQkJdGVbIDUgXSA9IGJmICogZCArIGFlOworCQkJCXRlWyA5IF0gPSBhZiAqIGQgLSBiZTsKKwor
CQkJCXRlWyAyIF0gPSAtIGQ7CisJCQkJdGVbIDYgXSA9IGIgKiBjOworCQkJCXRlWyAxMCBdID0g
YSAqIGM7CisKKwkJCX0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVpYJyApIHsKKworCQkJ
CXZhciBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkOworCisJ
CQkJdGVbIDAgXSA9IGMgKiBlOworCQkJCXRlWyA0IF0gPSBiZCAtIGFjICogZjsKKwkJCQl0ZVsg
OCBdID0gYmMgKiBmICsgYWQ7CisKKwkJCQl0ZVsgMSBdID0gZjsKKwkJCQl0ZVsgNSBdID0gYSAq
IGU7CisJCQkJdGVbIDkgXSA9IC0gYiAqIGU7CisKKwkJCQl0ZVsgMiBdID0gLSBkICogZTsKKwkJ
CQl0ZVsgNiBdID0gYWQgKiBmICsgYmM7CisJCQkJdGVbIDEwIF0gPSBhYyAtIGJkICogZjsKKwor
CQkJfSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdYWlknICkgeworCisJCQkJdmFyIGFjID0g
YSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7CisKKwkJCQl0ZVsgMCBd
ID0gYyAqIGU7CisJCQkJdGVbIDQgXSA9IC0gZjsKKwkJCQl0ZVsgOCBdID0gZCAqIGU7CisKKwkJ
CQl0ZVsgMSBdID0gYWMgKiBmICsgYmQ7CisJCQkJdGVbIDUgXSA9IGEgKiBlOworCQkJCXRlWyA5
IF0gPSBhZCAqIGYgLSBiYzsKKworCQkJCXRlWyAyIF0gPSBiYyAqIGYgLSBhZDsKKwkJCQl0ZVsg
NiBdID0gYiAqIGU7CisJCQkJdGVbIDEwIF0gPSBiZCAqIGYgKyBhYzsKKworCQkJfQorCisJCQkv
LyBsYXN0IGNvbHVtbgorCQkJdGVbIDMgXSA9IDA7CisJCQl0ZVsgNyBdID0gMDsKKwkJCXRlWyAx
MSBdID0gMDsKKworCQkJLy8gYm90dG9tIHJvdworCQkJdGVbIDEyIF0gPSAwOworCQkJdGVbIDEz
IF0gPSAwOworCQkJdGVbIDE0IF0gPSAwOworCQkJdGVbIDE1IF0gPSAxOworCisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAo
IHEgKSB7CisKKwkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisKKwkJCXZhciB4ID0gcS5feCwg
eSA9IHEuX3ksIHogPSBxLl96LCB3ID0gcS5fdzsKKwkJCXZhciB4MiA9IHggKyB4LCB5MiA9IHkg
KyB5LCB6MiA9IHogKyB6OworCQkJdmFyIHh4ID0geCAqIHgyLCB4eSA9IHggKiB5MiwgeHogPSB4
ICogejI7CisJCQl2YXIgeXkgPSB5ICogeTIsIHl6ID0geSAqIHoyLCB6eiA9IHogKiB6MjsKKwkJ
CXZhciB3eCA9IHcgKiB4Miwgd3kgPSB3ICogeTIsIHd6ID0gdyAqIHoyOworCisJCQl0ZVsgMCBd
ID0gMSAtICggeXkgKyB6eiApOworCQkJdGVbIDQgXSA9IHh5IC0gd3o7CisJCQl0ZVsgOCBdID0g
eHogKyB3eTsKKworCQkJdGVbIDEgXSA9IHh5ICsgd3o7CisJCQl0ZVsgNSBdID0gMSAtICggeHgg
KyB6eiApOworCQkJdGVbIDkgXSA9IHl6IC0gd3g7CisKKwkJCXRlWyAyIF0gPSB4eiAtIHd5Owor
CQkJdGVbIDYgXSA9IHl6ICsgd3g7CisJCQl0ZVsgMTAgXSA9IDEgLSAoIHh4ICsgeXkgKTsKKwor
CQkJLy8gbGFzdCBjb2x1bW4KKwkJCXRlWyAzIF0gPSAwOworCQkJdGVbIDcgXSA9IDA7CisJCQl0
ZVsgMTEgXSA9IDA7CisKKwkJCS8vIGJvdHRvbSByb3cKKwkJCXRlWyAxMiBdID0gMDsKKwkJCXRl
WyAxMyBdID0gMDsKKwkJCXRlWyAxNCBdID0gMDsKKwkJCXRlWyAxNSBdID0gMTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQlsb29rQXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHgg
PSBuZXcgVmVjdG9yMygpOworCQkJdmFyIHkgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIHogPSBu
ZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCBleWUsIHRhcmdldCwg
dXAgKSB7CisKKwkJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworCisJCQkJei5zdWJWZWN0b3Jz
KCBleWUsIHRhcmdldCApOworCisJCQkJaWYgKCB6Lmxlbmd0aFNxKCkgPT09IDAgKSB7CisKKwkJ
CQkJLy8gZXllIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uCisKKwkJCQkJei56
ID0gMTsKKworCQkJCX0KKworCQkJCXoubm9ybWFsaXplKCk7CisJCQkJeC5jcm9zc1ZlY3RvcnMo
IHVwLCB6ICk7CisKKwkJCQlpZiAoIHgubGVuZ3RoU3EoKSA9PT0gMCApIHsKKworCQkJCQkvLyB1
cCBhbmQgeiBhcmUgcGFyYWxsZWwKKworCQkJCQlpZiAoIE1hdGguYWJzKCB1cC56ICkgPT09IDEg
KSB7CisKKwkJCQkJCXoueCArPSAwLjAwMDE7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJei56
ICs9IDAuMDAwMTsKKworCQkJCQl9CisKKwkJCQkJei5ub3JtYWxpemUoKTsKKwkJCQkJeC5jcm9z
c1ZlY3RvcnMoIHVwLCB6ICk7CisKKwkJCQl9CisKKwkJCQl4Lm5vcm1hbGl6ZSgpOworCQkJCXku
Y3Jvc3NWZWN0b3JzKCB6LCB4ICk7CisKKwkJCQl0ZVsgMCBdID0geC54OyB0ZVsgNCBdID0geS54
OyB0ZVsgOCBdID0gei54OworCQkJCXRlWyAxIF0gPSB4Lnk7IHRlWyA1IF0gPSB5Lnk7IHRlWyA5
IF0gPSB6Lnk7CisJCQkJdGVbIDIgXSA9IHguejsgdGVbIDYgXSA9IHkuejsgdGVbIDEwIF0gPSB6
Lno7CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJfTsKKworCQl9KCksCisKKwkJbXVsdGlwbHk6
IGZ1bmN0aW9uICggbSwgbiApIHsKKworCQkJaWYgKCBuICE9PSB1bmRlZmluZWQgKSB7CisKKwkJ
CQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2Nl
cHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4n
ICk7CisJCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgbiApOworCisJCQl9CisK
KwkJCXJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTsKKworCQl9LAorCisJ
CXByZW11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7CisKKwkJCXJldHVybiB0aGlzLm11bHRpcGx5
TWF0cmljZXMoIG0sIHRoaXMgKTsKKworCQl9LAorCisJCW11bHRpcGx5TWF0cmljZXM6IGZ1bmN0
aW9uICggYSwgYiApIHsKKworCQkJdmFyIGFlID0gYS5lbGVtZW50czsKKwkJCXZhciBiZSA9IGIu
ZWxlbWVudHM7CisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworCisJCQl2YXIgYTExID0gYWVb
IDAgXSwgYTEyID0gYWVbIDQgXSwgYTEzID0gYWVbIDggXSwgYTE0ID0gYWVbIDEyIF07CisJCQl2
YXIgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDUgXSwgYTIzID0gYWVbIDkgXSwgYTI0ID0gYWVb
IDEzIF07CisJCQl2YXIgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDYgXSwgYTMzID0gYWVbIDEw
IF0sIGEzNCA9IGFlWyAxNCBdOworCQkJdmFyIGE0MSA9IGFlWyAzIF0sIGE0MiA9IGFlWyA3IF0s
IGE0MyA9IGFlWyAxMSBdLCBhNDQgPSBhZVsgMTUgXTsKKworCQkJdmFyIGIxMSA9IGJlWyAwIF0s
IGIxMiA9IGJlWyA0IF0sIGIxMyA9IGJlWyA4IF0sIGIxNCA9IGJlWyAxMiBdOworCQkJdmFyIGIy
MSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA1IF0sIGIyMyA9IGJlWyA5IF0sIGIyNCA9IGJlWyAxMyBd
OworCQkJdmFyIGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA2IF0sIGIzMyA9IGJlWyAxMCBdLCBi
MzQgPSBiZVsgMTQgXTsKKwkJCXZhciBiNDEgPSBiZVsgMyBdLCBiNDIgPSBiZVsgNyBdLCBiNDMg
PSBiZVsgMTEgXSwgYjQ0ID0gYmVbIDE1IF07CisKKwkJCXRlWyAwIF0gPSBhMTEgKiBiMTEgKyBh
MTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7CisJCQl0ZVsgNCBdID0gYTExICogYjEy
ICsgYTEyICogYjIyICsgYTEzICogYjMyICsgYTE0ICogYjQyOworCQkJdGVbIDggXSA9IGExMSAq
IGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMyArIGExNCAqIGI0MzsKKwkJCXRlWyAxMiBdID0g
YTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0OworCisJCQl0ZVsg
MSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMxICsgYTI0ICogYjQxOworCQkJ
dGVbIDUgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMiArIGEyNCAqIGI0MjsK
KwkJCXRlWyA5IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzMgKyBhMjQgKiBi
NDM7CisJCQl0ZVsgMTMgXSA9IGEyMSAqIGIxNCArIGEyMiAqIGIyNCArIGEyMyAqIGIzNCArIGEy
NCAqIGI0NDsKKworCQkJdGVbIDIgXSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIz
MSArIGEzNCAqIGI0MTsKKwkJCXRlWyA2IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMg
KiBiMzIgKyBhMzQgKiBiNDI7CisJCQl0ZVsgMTAgXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyAr
IGEzMyAqIGIzMyArIGEzNCAqIGI0MzsKKwkJCXRlWyAxNCBdID0gYTMxICogYjE0ICsgYTMyICog
YjI0ICsgYTMzICogYjM0ICsgYTM0ICogYjQ0OworCisJCQl0ZVsgMyBdID0gYTQxICogYjExICsg
YTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxOworCQkJdGVbIDcgXSA9IGE0MSAqIGIx
MiArIGE0MiAqIGIyMiArIGE0MyAqIGIzMiArIGE0NCAqIGI0MjsKKwkJCXRlWyAxMSBdID0gYTQx
ICogYjEzICsgYTQyICogYjIzICsgYTQzICogYjMzICsgYTQ0ICogYjQzOworCQkJdGVbIDE1IF0g
PSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJbXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHsK
KworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworCQkJdGVbIDAgXSAqPSBzOyB0ZVsgNCBd
ICo9IHM7IHRlWyA4IF0gKj0gczsgdGVbIDEyIF0gKj0gczsKKwkJCXRlWyAxIF0gKj0gczsgdGVb
IDUgXSAqPSBzOyB0ZVsgOSBdICo9IHM7IHRlWyAxMyBdICo9IHM7CisJCQl0ZVsgMiBdICo9IHM7
IHRlWyA2IF0gKj0gczsgdGVbIDEwIF0gKj0gczsgdGVbIDE0IF0gKj0gczsKKwkJCXRlWyAzIF0g
Kj0gczsgdGVbIDcgXSAqPSBzOyB0ZVsgMTEgXSAqPSBzOyB0ZVsgMTUgXSAqPSBzOworCisJCQly
ZXR1cm4gdGhpczsKKworCQl9LAorCisJCWFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9u
ICgpIHsKKworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9u
IGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHsKKworCQkJCWZvciAoIHZhciBp
ID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJdjEueCA9
IGF0dHJpYnV0ZS5nZXRYKCBpICk7CisJCQkJCXYxLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApOwor
CQkJCQl2MS56ID0gYXR0cmlidXRlLmdldFooIGkgKTsKKworCQkJCQl2MS5hcHBseU1hdHJpeDQo
IHRoaXMgKTsKKworCQkJCQlhdHRyaWJ1dGUuc2V0WFlaKCBpLCB2MS54LCB2MS55LCB2MS56ICk7
CisKKwkJCQl9CisKKwkJCQlyZXR1cm4gYXR0cmlidXRlOworCisJCQl9OworCisJCX0oKSwKKwor
CQlkZXRlcm1pbmFudDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRz
OworCisJCQl2YXIgbjExID0gdGVbIDAgXSwgbjEyID0gdGVbIDQgXSwgbjEzID0gdGVbIDggXSwg
bjE0ID0gdGVbIDEyIF07CisJCQl2YXIgbjIxID0gdGVbIDEgXSwgbjIyID0gdGVbIDUgXSwgbjIz
ID0gdGVbIDkgXSwgbjI0ID0gdGVbIDEzIF07CisJCQl2YXIgbjMxID0gdGVbIDIgXSwgbjMyID0g
dGVbIDYgXSwgbjMzID0gdGVbIDEwIF0sIG4zNCA9IHRlWyAxNCBdOworCQkJdmFyIG40MSA9IHRl
WyAzIF0sIG40MiA9IHRlWyA3IF0sIG40MyA9IHRlWyAxMSBdLCBuNDQgPSB0ZVsgMTUgXTsKKwor
CQkJLy9UT0RPOiBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnQKKwkJCS8vKCBiYXNlZCBvbiBodHRw
Oi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMv
aW52ZXJzZS9mb3VyRC9pbmRleC5odG0gKQorCisJCQlyZXR1cm4gKAorCQkJCW40MSAqICgKKwkJ
CQkJKyBuMTQgKiBuMjMgKiBuMzIKKwkJCQkJIC0gbjEzICogbjI0ICogbjMyCisJCQkJCSAtIG4x
NCAqIG4yMiAqIG4zMworCQkJCQkgKyBuMTIgKiBuMjQgKiBuMzMKKwkJCQkJICsgbjEzICogbjIy
ICogbjM0CisJCQkJCSAtIG4xMiAqIG4yMyAqIG4zNAorCQkJCSkgKworCQkJCW40MiAqICgKKwkJ
CQkJKyBuMTEgKiBuMjMgKiBuMzQKKwkJCQkJIC0gbjExICogbjI0ICogbjMzCisJCQkJCSArIG4x
NCAqIG4yMSAqIG4zMworCQkJCQkgLSBuMTMgKiBuMjEgKiBuMzQKKwkJCQkJICsgbjEzICogbjI0
ICogbjMxCisJCQkJCSAtIG4xNCAqIG4yMyAqIG4zMQorCQkJCSkgKworCQkJCW40MyAqICgKKwkJ
CQkJKyBuMTEgKiBuMjQgKiBuMzIKKwkJCQkJIC0gbjExICogbjIyICogbjM0CisJCQkJCSAtIG4x
NCAqIG4yMSAqIG4zMgorCQkJCQkgKyBuMTIgKiBuMjEgKiBuMzQKKwkJCQkJICsgbjE0ICogbjIy
ICogbjMxCisJCQkJCSAtIG4xMiAqIG4yNCAqIG4zMQorCQkJCSkgKworCQkJCW40NCAqICgKKwkJ
CQkJLSBuMTMgKiBuMjIgKiBuMzEKKwkJCQkJIC0gbjExICogbjIzICogbjMyCisJCQkJCSArIG4x
MSAqIG4yMiAqIG4zMworCQkJCQkgKyBuMTMgKiBuMjEgKiBuMzIKKwkJCQkJIC0gbjEyICogbjIx
ICogbjMzCisJCQkJCSArIG4xMiAqIG4yMyAqIG4zMQorCQkJCSkKKworCQkJKTsKKworCQl9LAor
CisJCXRyYW5zcG9zZTogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRz
OworCQkJdmFyIHRtcDsKKworCQkJdG1wID0gdGVbIDEgXTsgdGVbIDEgXSA9IHRlWyA0IF07IHRl
WyA0IF0gPSB0bXA7CisJCQl0bXAgPSB0ZVsgMiBdOyB0ZVsgMiBdID0gdGVbIDggXTsgdGVbIDgg
XSA9IHRtcDsKKwkJCXRtcCA9IHRlWyA2IF07IHRlWyA2IF0gPSB0ZVsgOSBdOyB0ZVsgOSBdID0g
dG1wOworCisJCQl0bXAgPSB0ZVsgMyBdOyB0ZVsgMyBdID0gdGVbIDEyIF07IHRlWyAxMiBdID0g
dG1wOworCQkJdG1wID0gdGVbIDcgXTsgdGVbIDcgXSA9IHRlWyAxMyBdOyB0ZVsgMTMgXSA9IHRt
cDsKKwkJCXRtcCA9IHRlWyAxMSBdOyB0ZVsgMTEgXSA9IHRlWyAxNCBdOyB0ZVsgMTQgXSA9IHRt
cDsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRQb3NpdGlvbjogZnVuY3Rpb24g
KCB2ICkgeworCisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworCisJCQl0ZVsgMTIgXSA9IHYu
eDsKKwkJCXRlWyAxMyBdID0gdi55OworCQkJdGVbIDE0IF0gPSB2Lno7CisKKwkJCXJldHVybiB0
aGlzOworCisJCX0sCisKKwkJZ2V0SW52ZXJzZTogZnVuY3Rpb24gKCBtLCB0aHJvd09uRGVnZW5l
cmF0ZSApIHsKKworCQkJLy8gYmFzZWQgb24gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20v
bWF0aHMvYWxnZWJyYS9tYXRyaXgvZnVuY3Rpb25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtCisJ
CQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzLAorCQkJCW1lID0gbS5lbGVtZW50cywKKworCQkJCW4x
MSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sIG40MSA9IG1lWyAzIF0s
CisJCQkJbjEyID0gbWVbIDQgXSwgbjIyID0gbWVbIDUgXSwgbjMyID0gbWVbIDYgXSwgbjQyID0g
bWVbIDcgXSwKKwkJCQluMTMgPSBtZVsgOCBdLCBuMjMgPSBtZVsgOSBdLCBuMzMgPSBtZVsgMTAg
XSwgbjQzID0gbWVbIDExIF0sCisJCQkJbjE0ID0gbWVbIDEyIF0sIG4yNCA9IG1lWyAxMyBdLCBu
MzQgPSBtZVsgMTQgXSwgbjQ0ID0gbWVbIDE1IF0sCisKKwkJCQl0MTEgPSBuMjMgKiBuMzQgKiBu
NDIgLSBuMjQgKiBuMzMgKiBuNDIgKyBuMjQgKiBuMzIgKiBuNDMgLSBuMjIgKiBuMzQgKiBuNDMg
LSBuMjMgKiBuMzIgKiBuNDQgKyBuMjIgKiBuMzMgKiBuNDQsCisJCQkJdDEyID0gbjE0ICogbjMz
ICogbjQyIC0gbjEzICogbjM0ICogbjQyIC0gbjE0ICogbjMyICogbjQzICsgbjEyICogbjM0ICog
bjQzICsgbjEzICogbjMyICogbjQ0IC0gbjEyICogbjMzICogbjQ0LAorCQkJCXQxMyA9IG4xMyAq
IG4yNCAqIG40MiAtIG4xNCAqIG4yMyAqIG40MiArIG4xNCAqIG4yMiAqIG40MyAtIG4xMiAqIG4y
NCAqIG40MyAtIG4xMyAqIG4yMiAqIG40NCArIG4xMiAqIG4yMyAqIG40NCwKKwkJCQl0MTQgPSBu
MTQgKiBuMjMgKiBuMzIgLSBuMTMgKiBuMjQgKiBuMzIgLSBuMTQgKiBuMjIgKiBuMzMgKyBuMTIg
KiBuMjQgKiBuMzMgKyBuMTMgKiBuMjIgKiBuMzQgLSBuMTIgKiBuMjMgKiBuMzQ7CisKKwkJCXZh
ciBkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTMgKyBuNDEgKiB0MTQ7CisK
KwkJCWlmICggZGV0ID09PSAwICkgeworCisJCQkJdmFyIG1zZyA9ICJUSFJFRS5NYXRyaXg0Lmdl
dEludmVyc2UoKTogY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCI7CisKKwkJ
CQlpZiAoIHRocm93T25EZWdlbmVyYXRlID09PSB0cnVlICkgeworCisJCQkJCXRocm93IG5ldyBF
cnJvciggbXNnICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCWNvbnNvbGUud2FybiggbXNnICk7
CisKKwkJCQl9CisKKwkJCQlyZXR1cm4gdGhpcy5pZGVudGl0eSgpOworCisJCQl9CisKKwkJCXZh
ciBkZXRJbnYgPSAxIC8gZGV0OworCisJCQl0ZVsgMCBdID0gdDExICogZGV0SW52OworCQkJdGVb
IDEgXSA9ICggbjI0ICogbjMzICogbjQxIC0gbjIzICogbjM0ICogbjQxIC0gbjI0ICogbjMxICog
bjQzICsgbjIxICogbjM0ICogbjQzICsgbjIzICogbjMxICogbjQ0IC0gbjIxICogbjMzICogbjQ0
ICkgKiBkZXRJbnY7CisJCQl0ZVsgMiBdID0gKCBuMjIgKiBuMzQgKiBuNDEgLSBuMjQgKiBuMzIg
KiBuNDEgKyBuMjQgKiBuMzEgKiBuNDIgLSBuMjEgKiBuMzQgKiBuNDIgLSBuMjIgKiBuMzEgKiBu
NDQgKyBuMjEgKiBuMzIgKiBuNDQgKSAqIGRldEludjsKKwkJCXRlWyAzIF0gPSAoIG4yMyAqIG4z
MiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAq
IG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52OworCisJ
CQl0ZVsgNCBdID0gdDEyICogZGV0SW52OworCQkJdGVbIDUgXSA9ICggbjEzICogbjM0ICogbjQx
IC0gbjE0ICogbjMzICogbjQxICsgbjE0ICogbjMxICogbjQzIC0gbjExICogbjM0ICogbjQzIC0g
bjEzICogbjMxICogbjQ0ICsgbjExICogbjMzICogbjQ0ICkgKiBkZXRJbnY7CisJCQl0ZVsgNiBd
ID0gKCBuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIg
KyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQgKSAq
IGRldEludjsKKwkJCXRlWyA3IF0gPSAoIG4xMiAqIG4zMyAqIG40MSAtIG4xMyAqIG4zMiAqIG40
MSArIG4xMyAqIG4zMSAqIG40MiAtIG4xMSAqIG4zMyAqIG40MiAtIG4xMiAqIG4zMSAqIG40MyAr
IG4xMSAqIG4zMiAqIG40MyApICogZGV0SW52OworCisJCQl0ZVsgOCBdID0gdDEzICogZGV0SW52
OworCQkJdGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0
ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICog
bjIzICogbjQ0ICkgKiBkZXRJbnY7CisJCQl0ZVsgMTAgXSA9ICggbjEyICogbjI0ICogbjQxIC0g
bjE0ICogbjIyICogbjQxICsgbjE0ICogbjIxICogbjQyIC0gbjExICogbjI0ICogbjQyIC0gbjEy
ICogbjIxICogbjQ0ICsgbjExICogbjIyICogbjQ0ICkgKiBkZXRJbnY7CisJCQl0ZVsgMTEgXSA9
ICggbjEzICogbjIyICogbjQxIC0gbjEyICogbjIzICogbjQxIC0gbjEzICogbjIxICogbjQyICsg
bjExICogbjIzICogbjQyICsgbjEyICogbjIxICogbjQzIC0gbjExICogbjIyICogbjQzICkgKiBk
ZXRJbnY7CisKKwkJCXRlWyAxMiBdID0gdDE0ICogZGV0SW52OworCQkJdGVbIDEzIF0gPSAoIG4x
MyAqIG4yNCAqIG4zMSAtIG4xNCAqIG4yMyAqIG4zMSArIG4xNCAqIG4yMSAqIG4zMyAtIG4xMSAq
IG4yNCAqIG4zMyAtIG4xMyAqIG4yMSAqIG4zNCArIG4xMSAqIG4yMyAqIG4zNCApICogZGV0SW52
OworCQkJdGVbIDE0IF0gPSAoIG4xNCAqIG4yMiAqIG4zMSAtIG4xMiAqIG4yNCAqIG4zMSAtIG4x
NCAqIG4yMSAqIG4zMiArIG4xMSAqIG4yNCAqIG4zMiArIG4xMiAqIG4yMSAqIG4zNCAtIG4xMSAq
IG4yMiAqIG4zNCApICogZGV0SW52OworCQkJdGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAt
IG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4x
MiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52OworCisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCXNjYWxlOiBmdW5jdGlvbiAoIHYgKSB7CisKKwkJCXZhciB0ZSA9
IHRoaXMuZWxlbWVudHM7CisJCQl2YXIgeCA9IHYueCwgeSA9IHYueSwgeiA9IHYuejsKKworCQkJ
dGVbIDAgXSAqPSB4OyB0ZVsgNCBdICo9IHk7IHRlWyA4IF0gKj0gejsKKwkJCXRlWyAxIF0gKj0g
eDsgdGVbIDUgXSAqPSB5OyB0ZVsgOSBdICo9IHo7CisJCQl0ZVsgMiBdICo9IHg7IHRlWyA2IF0g
Kj0geTsgdGVbIDEwIF0gKj0gejsKKwkJCXRlWyAzIF0gKj0geDsgdGVbIDcgXSAqPSB5OyB0ZVsg
MTEgXSAqPSB6OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWdldE1heFNjYWxlT25B
eGlzOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisKKwkJCXZh
ciBzY2FsZVhTcSA9IHRlWyAwIF0gKiB0ZVsgMCBdICsgdGVbIDEgXSAqIHRlWyAxIF0gKyB0ZVsg
MiBdICogdGVbIDIgXTsKKwkJCXZhciBzY2FsZVlTcSA9IHRlWyA0IF0gKiB0ZVsgNCBdICsgdGVb
IDUgXSAqIHRlWyA1IF0gKyB0ZVsgNiBdICogdGVbIDYgXTsKKwkJCXZhciBzY2FsZVpTcSA9IHRl
WyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBd
OworCisJCQlyZXR1cm4gTWF0aC5zcXJ0KCBNYXRoLm1heCggc2NhbGVYU3EsIHNjYWxlWVNxLCBz
Y2FsZVpTcSApICk7CisKKwkJfSwKKworCQltYWtlVHJhbnNsYXRpb246IGZ1bmN0aW9uICggeCwg
eSwgeiApIHsKKworCQkJdGhpcy5zZXQoCisKKwkJCQkxLCAwLCAwLCB4LAorCQkJCTAsIDEsIDAs
IHksCisJCQkJMCwgMCwgMSwgeiwKKwkJCQkwLCAwLCAwLCAxCisKKwkJCSk7CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0sCisKKwkJbWFrZVJvdGF0aW9uWDogZnVuY3Rpb24gKCB0aGV0YSApIHsK
KworCQkJdmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApOwor
CisJCQl0aGlzLnNldCgKKworCQkJCTEsIDAsICAwLCAwLAorCQkJCTAsIGMsIC0gcywgMCwKKwkJ
CQkwLCBzLCAgYywgMCwKKwkJCQkwLCAwLCAgMCwgMQorCisJCQkpOworCisJCQlyZXR1cm4gdGhp
czsKKworCQl9LAorCisJCW1ha2VSb3RhdGlvblk6IGZ1bmN0aW9uICggdGhldGEgKSB7CisKKwkJ
CXZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTsKKworCQkJ
dGhpcy5zZXQoCisKKwkJCQkgYywgMCwgcywgMCwKKwkJCQkgMCwgMSwgMCwgMCwKKwkJCQktIHMs
IDAsIGMsIDAsCisJCQkJIDAsIDAsIDAsIDEKKworCQkJKTsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQltYWtlUm90YXRpb25aOiBmdW5jdGlvbiAoIHRoZXRhICkgeworCisJCQl2YXIg
YyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7CisKKwkJCXRoaXMu
c2V0KAorCisJCQkJYywgLSBzLCAwLCAwLAorCQkJCXMsICBjLCAwLCAwLAorCQkJCTAsICAwLCAx
LCAwLAorCQkJCTAsICAwLCAwLCAxCisKKwkJCSk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0s
CisKKwkJbWFrZVJvdGF0aW9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHsKKworCQkJ
Ly8gQmFzZWQgb24gaHR0cDovL3d3dy5nYW1lZGV2Lm5ldC9yZWZlcmVuY2UvYXJ0aWNsZXMvYXJ0
aWNsZTExOTkuYXNwCisKKwkJCXZhciBjID0gTWF0aC5jb3MoIGFuZ2xlICk7CisJCQl2YXIgcyA9
IE1hdGguc2luKCBhbmdsZSApOworCQkJdmFyIHQgPSAxIC0gYzsKKwkJCXZhciB4ID0gYXhpcy54
LCB5ID0gYXhpcy55LCB6ID0gYXhpcy56OworCQkJdmFyIHR4ID0gdCAqIHgsIHR5ID0gdCAqIHk7
CisKKwkJCXRoaXMuc2V0KAorCisJCQkJdHggKiB4ICsgYywgdHggKiB5IC0gcyAqIHosIHR4ICog
eiArIHMgKiB5LCAwLAorCQkJCXR4ICogeSArIHMgKiB6LCB0eSAqIHkgKyBjLCB0eSAqIHogLSBz
ICogeCwgMCwKKwkJCQl0eCAqIHogLSBzICogeSwgdHkgKiB6ICsgcyAqIHgsIHQgKiB6ICogeiAr
IGMsIDAsCisJCQkJMCwgMCwgMCwgMQorCisJCQkpOworCisJCQkgcmV0dXJuIHRoaXM7CisKKwkJ
fSwKKworCQltYWtlU2NhbGU6IGZ1bmN0aW9uICggeCwgeSwgeiApIHsKKworCQkJdGhpcy5zZXQo
CisKKwkJCQl4LCAwLCAwLCAwLAorCQkJCTAsIHksIDAsIDAsCisJCQkJMCwgMCwgeiwgMCwKKwkJ
CQkwLCAwLCAwLCAxCisKKwkJCSk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbWFr
ZVNoZWFyOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7CisKKwkJCXRoaXMuc2V0KAorCisJCQkJMSwg
eSwgeiwgMCwKKwkJCQl4LCAxLCB6LCAwLAorCQkJCXgsIHksIDEsIDAsCisJCQkJMCwgMCwgMCwg
MQorCisJCQkpOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNvbXBvc2U6IGZ1bmN0
aW9uICggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkgeworCisJCQl0aGlzLm1ha2VSb3Rh
dGlvbkZyb21RdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7CisJCQl0aGlzLnNjYWxlKCBzY2FsZSAp
OworCQkJdGhpcy5zZXRQb3NpdGlvbiggcG9zaXRpb24gKTsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQlkZWNvbXBvc2U6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHZlY3RvciA9IG5l
dyBWZWN0b3IzKCk7CisJCQl2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKKworCQkJcmV0dXJu
IGZ1bmN0aW9uIGRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkgeworCisJ
CQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworCQkJCXZhciBzeCA9IHZlY3Rvci5zZXQoIHRl
WyAwIF0sIHRlWyAxIF0sIHRlWyAyIF0gKS5sZW5ndGgoKTsKKwkJCQl2YXIgc3kgPSB2ZWN0b3Iu
c2V0KCB0ZVsgNCBdLCB0ZVsgNSBdLCB0ZVsgNiBdICkubGVuZ3RoKCk7CisJCQkJdmFyIHN6ID0g
dmVjdG9yLnNldCggdGVbIDggXSwgdGVbIDkgXSwgdGVbIDEwIF0gKS5sZW5ndGgoKTsKKworCQkJ
CS8vIGlmIGRldGVybWluZSBpcyBuZWdhdGl2ZSwgd2UgbmVlZCB0byBpbnZlcnQgb25lIHNjYWxl
CisJCQkJdmFyIGRldCA9IHRoaXMuZGV0ZXJtaW5hbnQoKTsKKwkJCQlpZiAoIGRldCA8IDAgKSBz
eCA9IC0gc3g7CisKKwkJCQlwb3NpdGlvbi54ID0gdGVbIDEyIF07CisJCQkJcG9zaXRpb24ueSA9
IHRlWyAxMyBdOworCQkJCXBvc2l0aW9uLnogPSB0ZVsgMTQgXTsKKworCQkJCS8vIHNjYWxlIHRo
ZSByb3RhdGlvbiBwYXJ0CisJCQkJbWF0cml4LmNvcHkoIHRoaXMgKTsKKworCQkJCXZhciBpbnZT
WCA9IDEgLyBzeDsKKwkJCQl2YXIgaW52U1kgPSAxIC8gc3k7CisJCQkJdmFyIGludlNaID0gMSAv
IHN6OworCisJCQkJbWF0cml4LmVsZW1lbnRzWyAwIF0gKj0gaW52U1g7CisJCQkJbWF0cml4LmVs
ZW1lbnRzWyAxIF0gKj0gaW52U1g7CisJCQkJbWF0cml4LmVsZW1lbnRzWyAyIF0gKj0gaW52U1g7
CisKKwkJCQltYXRyaXguZWxlbWVudHNbIDQgXSAqPSBpbnZTWTsKKwkJCQltYXRyaXguZWxlbWVu
dHNbIDUgXSAqPSBpbnZTWTsKKwkJCQltYXRyaXguZWxlbWVudHNbIDYgXSAqPSBpbnZTWTsKKwor
CQkJCW1hdHJpeC5lbGVtZW50c1sgOCBdICo9IGludlNaOworCQkJCW1hdHJpeC5lbGVtZW50c1sg
OSBdICo9IGludlNaOworCQkJCW1hdHJpeC5lbGVtZW50c1sgMTAgXSAqPSBpbnZTWjsKKworCQkJ
CXF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXggKTsKKworCQkJCXNjYWxl
LnggPSBzeDsKKwkJCQlzY2FsZS55ID0gc3k7CisJCQkJc2NhbGUueiA9IHN6OworCisJCQkJcmV0
dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCW1ha2VQZXJzcGVjdGl2ZTogZnVuY3Rp
b24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHsKKworCQkJaWYgKCBm
YXIgPT09IHVuZGVmaW5lZCApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6
IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWdu
YXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4nICk7CisKKwkJCX0KKworCQkJdmFyIHRlID0g
dGhpcy5lbGVtZW50czsKKwkJCXZhciB4ID0gMiAqIG5lYXIgLyAoIHJpZ2h0IC0gbGVmdCApOwor
CQkJdmFyIHkgPSAyICogbmVhciAvICggdG9wIC0gYm90dG9tICk7CisKKwkJCXZhciBhID0gKCBy
aWdodCArIGxlZnQgKSAvICggcmlnaHQgLSBsZWZ0ICk7CisJCQl2YXIgYiA9ICggdG9wICsgYm90
dG9tICkgLyAoIHRvcCAtIGJvdHRvbSApOworCQkJdmFyIGMgPSAtICggZmFyICsgbmVhciApIC8g
KCBmYXIgLSBuZWFyICk7CisJCQl2YXIgZCA9IC0gMiAqIGZhciAqIG5lYXIgLyAoIGZhciAtIG5l
YXIgKTsKKworCQkJdGVbIDAgXSA9IHg7CXRlWyA0IF0gPSAwOwl0ZVsgOCBdID0gYTsJdGVbIDEy
IF0gPSAwOworCQkJdGVbIDEgXSA9IDA7CXRlWyA1IF0gPSB5Owl0ZVsgOSBdID0gYjsJdGVbIDEz
IF0gPSAwOworCQkJdGVbIDIgXSA9IDA7CXRlWyA2IF0gPSAwOwl0ZVsgMTAgXSA9IGM7CXRlWyAx
NCBdID0gZDsKKwkJCXRlWyAzIF0gPSAwOwl0ZVsgNyBdID0gMDsJdGVbIDExIF0gPSAtIDE7CXRl
WyAxNSBdID0gMDsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQltYWtlT3J0aG9ncmFw
aGljOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgewor
CisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworCQkJdmFyIHcgPSAxLjAgLyAoIHJpZ2h0IC0g
bGVmdCApOworCQkJdmFyIGggPSAxLjAgLyAoIHRvcCAtIGJvdHRvbSApOworCQkJdmFyIHAgPSAx
LjAgLyAoIGZhciAtIG5lYXIgKTsKKworCQkJdmFyIHggPSAoIHJpZ2h0ICsgbGVmdCApICogdzsK
KwkJCXZhciB5ID0gKCB0b3AgKyBib3R0b20gKSAqIGg7CisJCQl2YXIgeiA9ICggZmFyICsgbmVh
ciApICogcDsKKworCQkJdGVbIDAgXSA9IDIgKiB3Owl0ZVsgNCBdID0gMDsJdGVbIDggXSA9IDA7
CXRlWyAxMiBdID0gLSB4OworCQkJdGVbIDEgXSA9IDA7CXRlWyA1IF0gPSAyICogaDsJdGVbIDkg
XSA9IDA7CXRlWyAxMyBdID0gLSB5OworCQkJdGVbIDIgXSA9IDA7CXRlWyA2IF0gPSAwOwl0ZVsg
MTAgXSA9IC0gMiAqIHA7CXRlWyAxNCBdID0gLSB6OworCQkJdGVbIDMgXSA9IDA7CXRlWyA3IF0g
PSAwOwl0ZVsgMTEgXSA9IDA7CXRlWyAxNSBdID0gMTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJ
fSwKKworCQllcXVhbHM6IGZ1bmN0aW9uICggbWF0cml4ICkgeworCisJCQl2YXIgdGUgPSB0aGlz
LmVsZW1lbnRzOworCQkJdmFyIG1lID0gbWF0cml4LmVsZW1lbnRzOworCisJCQlmb3IgKCB2YXIg
aSA9IDA7IGkgPCAxNjsgaSArKyApIHsKKworCQkJCWlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSAp
IHJldHVybiBmYWxzZTsKKworCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKworCQl9LAorCisJCWZy
b21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgeworCisJCQlpZiAoIG9mZnNldCA9
PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgMTY7
IGkgKysgKSB7CisKKwkJCQl0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBd
OworCisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJdG9BcnJheTogZnVuY3Rp
b24gKCBhcnJheSwgb2Zmc2V0ICkgeworCisJCQlpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBh
cnJheSA9IFtdOworCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CisK
KwkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisKKwkJCWFycmF5WyBvZmZzZXQgXSA9IHRlWyAw
IF07CisJCQlhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTsKKwkJCWFycmF5WyBvZmZzZXQg
KyAyIF0gPSB0ZVsgMiBdOworCQkJYXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07CisKKwkJ
CWFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdOworCQkJYXJyYXlbIG9mZnNldCArIDUgXSA9
IHRlWyA1IF07CisJCQlhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTsKKwkJCWFycmF5WyBv
ZmZzZXQgKyA3IF0gPSB0ZVsgNyBdOworCisJCQlhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDgg
XTsKKwkJCWFycmF5WyBvZmZzZXQgKyA5IF0gPSB0ZVsgOSBdOworCQkJYXJyYXlbIG9mZnNldCAr
IDEwIF0gPSB0ZVsgMTAgXTsKKwkJCWFycmF5WyBvZmZzZXQgKyAxMSBdID0gdGVbIDExIF07CisK
KwkJCWFycmF5WyBvZmZzZXQgKyAxMiBdID0gdGVbIDEyIF07CisJCQlhcnJheVsgb2Zmc2V0ICsg
MTMgXSA9IHRlWyAxMyBdOworCQkJYXJyYXlbIG9mZnNldCArIDE0IF0gPSB0ZVsgMTQgXTsKKwkJ
CWFycmF5WyBvZmZzZXQgKyAxNSBdID0gdGVbIDE1IF07CisKKwkJCXJldHVybiBhcnJheTsKKwor
CQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVy
ZWRxdWFsaWEuY29tLworCSAqLworCisJZnVuY3Rpb24gRGF0YVRleHR1cmUoIGRhdGEsIHdpZHRo
LCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIs
IG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7CisKKwkJVGV4dHVyZS5jYWxsKCB0
aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBm
b3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7CisKKwkJdGhpcy5pbWFnZSA9IHsg
ZGF0YTogZGF0YSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9OworCisJCXRoaXMubWFn
RmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBOZWFyZXN0Rmls
dGVyOworCQl0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmls
dGVyIDogTmVhcmVzdEZpbHRlcjsKKworCQl0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwor
CQl0aGlzLmZsaXBZID0gZmFsc2U7CisJCXRoaXMudW5wYWNrQWxpZ25tZW50ID0gMTsKKworCX0K
KworCURhdGFUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90
eXBlICk7CisJRGF0YVRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGF0YVRleHR1cmU7
CisKKwlEYXRhVGV4dHVyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZSA9IHRydWU7CisKKwkvKioK
KwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rp
b24gQ3ViZVRleHR1cmUoIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIs
IG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHsKKworCQlp
bWFnZXMgPSBpbWFnZXMgIT09IHVuZGVmaW5lZCA/IGltYWdlcyA6IFtdOworCQltYXBwaW5nID0g
bWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFwcGluZyA6IEN1YmVSZWZsZWN0aW9uTWFwcGluZzsK
KworCQlUZXh0dXJlLmNhbGwoIHRoaXMsIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBt
YWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyAp
OworCisJCXRoaXMuZmxpcFkgPSBmYWxzZTsKKworCX0KKworCUN1YmVUZXh0dXJlLnByb3RvdHlw
ZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7CisJQ3ViZVRleHR1cmUucHJv
dG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViZVRleHR1cmU7CisKKwlDdWJlVGV4dHVyZS5wcm90b3R5
cGUuaXNDdWJlVGV4dHVyZSA9IHRydWU7CisKKwlPYmplY3QuZGVmaW5lUHJvcGVydHkoIEN1YmVU
ZXh0dXJlLnByb3RvdHlwZSwgJ2ltYWdlcycsIHsKKworCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKwor
CQkJcmV0dXJuIHRoaXMuaW1hZ2U7CisKKwkJfSwKKworCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUg
KSB7CisKKwkJCXRoaXMuaW1hZ2UgPSB2YWx1ZTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkg
KiBAYXV0aG9yIHRzY2h3CisJICoKKwkgKiBVbmlmb3JtcyBvZiBhIHByb2dyYW0uCisJICogVGhv
c2UgZm9ybSBhIHRyZWUgc3RydWN0dXJlIHdpdGggYSBzcGVjaWFsIHRvcC1sZXZlbCBjb250YWlu
ZXIgZm9yIHRoZSByb290LAorCSAqIHdoaWNoIHlvdSBnZXQgYnkgY2FsbGluZyAnbmV3IFdlYkdM
VW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApJy4KKwkgKgorCSAqCisJICogUHJvcGVy
dGllcyBvZiBpbm5lciBub2RlcyBpbmNsdWRpbmcgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6CisJ
ICoKKwkgKiAuc2VxIC0gYXJyYXkgb2YgbmVzdGVkIHVuaWZvcm1zCisJICogLm1hcCAtIG5lc3Rl
ZCB1bmlmb3JtcyBieSBuYW1lCisJICoKKwkgKgorCSAqIE1ldGhvZHMgb2YgYWxsIG5vZGVzIGV4
Y2VwdCB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjoKKwkgKgorCSAqIC5zZXRWYWx1ZSggZ2wsIHZh
bHVlLCBbcmVuZGVyZXJdICkKKwkgKgorCSAqIAkJdXBsb2FkcyBhIHVuaWZvcm0gdmFsdWUocykK
KwkgKiAgCXRoZSAncmVuZGVyZXInIHBhcmFtZXRlciBpcyBuZWVkZWQgZm9yIHNhbXBsZXIgdW5p
Zm9ybXMKKwkgKgorCSAqCisJICogU3RhdGljIG1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250
YWluZXIgKHJlbmRlcmVyIGZhY3Rvcml6YXRpb25zKToKKwkgKgorCSAqIC51cGxvYWQoIGdsLCBz
ZXEsIHZhbHVlcywgcmVuZGVyZXIgKQorCSAqCisJICogCQlzZXRzIHVuaWZvcm1zIGluICdzZXEn
IHRvICd2YWx1ZXNbaWRdLnZhbHVlJworCSAqCisJICogLnNlcVdpdGhWYWx1ZSggc2VxLCB2YWx1
ZXMgKSA6IGZpbHRlcmVkU2VxCisJICoKKwkgKiAJCWZpbHRlcnMgJ3NlcScgZW50cmllcyB3aXRo
IGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdmFsdWVzCisJICoKKwkgKgorCSAqIE1ldGhvZHMgb2Yg
dGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHJlbmRlcmVyIGZhY3Rvcml6YXRpb25zKToKKwkgKgor
CSAqIC5zZXRWYWx1ZSggZ2wsIG5hbWUsIHZhbHVlICkKKwkgKgorCSAqIAkJc2V0cyB1bmlmb3Jt
IHdpdGggIG5hbWUgJ25hbWUnIHRvICd2YWx1ZScKKwkgKgorCSAqIC5zZXQoIGdsLCBvYmosIHBy
b3AgKQorCSAqCisJICogCQlzZXRzIHVuaWZvcm0gZnJvbSBvYmplY3QgYW5kIHByb3BlcnR5IHdp
dGggc2FtZSBuYW1lIHRoYW4gdW5pZm9ybQorCSAqCisJICogLnNldE9wdGlvbmFsKCBnbCwgb2Jq
LCBwcm9wICkKKwkgKgorCSAqIAkJbGlrZSAuc2V0IGZvciBhbiBvcHRpb25hbCBwcm9wZXJ0eSBv
ZiB0aGUgb2JqZWN0CisJICoKKwkgKi8KKworCXZhciBlbXB0eVRleHR1cmUgPSBuZXcgVGV4dHVy
ZSgpOworCXZhciBlbXB0eUN1YmVUZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7CisKKwkvLyAt
LS0gQmFzZSBmb3IgaW5uZXIgbm9kZXMgKGluY2x1ZGluZyB0aGUgcm9vdCkgLS0tCisKKwlmdW5j
dGlvbiBVbmlmb3JtQ29udGFpbmVyKCkgeworCisJCXRoaXMuc2VxID0gW107CisJCXRoaXMubWFw
ID0ge307CisKKwl9CisKKwkvLyAtLS0gVXRpbGl0aWVzIC0tLQorCisJLy8gQXJyYXkgQ2FjaGVz
IChwcm92aWRlIHR5cGVkIGFycmF5cyBmb3IgdGVtcG9yYXJ5IGJ5IHNpemUpCisKKwl2YXIgYXJy
YXlDYWNoZUYzMiA9IFtdOworCXZhciBhcnJheUNhY2hlSTMyID0gW107CisKKwkvLyBGbG9hdDMy
QXJyYXkgY2FjaGVzIHVzZWQgZm9yIHVwbG9hZGluZyBNYXRyaXggdW5pZm9ybXMKKworCXZhciBt
YXQ0YXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCAxNiApOworCXZhciBtYXQzYXJyYXkgPSBuZXcg
RmxvYXQzMkFycmF5KCA5ICk7CisKKwkvLyBGbGF0dGVuaW5nIGZvciBhcnJheXMgb2YgdmVjdG9y
cyBhbmQgbWF0cmljZXMKKworCWZ1bmN0aW9uIGZsYXR0ZW4oIGFycmF5LCBuQmxvY2tzLCBibG9j
a1NpemUgKSB7CisKKwkJdmFyIGZpcnN0RWxlbSA9IGFycmF5WyAwIF07CisKKwkJaWYgKCBmaXJz
dEVsZW0gPD0gMCB8fCBmaXJzdEVsZW0gPiAwICkgcmV0dXJuIGFycmF5OworCQkvLyB1bm9wdGlt
aXplZDogISBpc05hTiggZmlyc3RFbGVtICkKKwkJLy8gc2VlIGh0dHA6Ly9qYWNrc29uZHVuc3Rh
bi5jb20vYXJ0aWNsZXMvOTgzCisKKwkJdmFyIG4gPSBuQmxvY2tzICogYmxvY2tTaXplLAorCQkJ
ciA9IGFycmF5Q2FjaGVGMzJbIG4gXTsKKworCQlpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsKKwor
CQkJciA9IG5ldyBGbG9hdDMyQXJyYXkoIG4gKTsKKwkJCWFycmF5Q2FjaGVGMzJbIG4gXSA9IHI7
CisKKwkJfQorCisJCWlmICggbkJsb2NrcyAhPT0gMCApIHsKKworCQkJZmlyc3RFbGVtLnRvQXJy
YXkoIHIsIDAgKTsKKworCQkJZm9yICggdmFyIGkgPSAxLCBvZmZzZXQgPSAwOyBpICE9PSBuQmxv
Y2tzOyArKyBpICkgeworCisJCQkJb2Zmc2V0ICs9IGJsb2NrU2l6ZTsKKwkJCQlhcnJheVsgaSBd
LnRvQXJyYXkoIHIsIG9mZnNldCApOworCisJCQl9CisKKwkJfQorCisJCXJldHVybiByOworCisJ
fQorCisJLy8gVGV4dHVyZSB1bml0IGFsbG9jYXRpb24KKworCWZ1bmN0aW9uIGFsbG9jVGV4VW5p
dHMoIHJlbmRlcmVyLCBuICkgeworCisJCXZhciByID0gYXJyYXlDYWNoZUkzMlsgbiBdOworCisJ
CWlmICggciA9PT0gdW5kZWZpbmVkICkgeworCisJCQlyID0gbmV3IEludDMyQXJyYXkoIG4gKTsK
KwkJCWFycmF5Q2FjaGVJMzJbIG4gXSA9IHI7CisKKwkJfQorCisJCWZvciAoIHZhciBpID0gMDsg
aSAhPT0gbjsgKysgaSApCisJCQlyWyBpIF0gPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7
CisKKwkJcmV0dXJuIHI7CisKKwl9CisKKwkvLyAtLS0gU2V0dGVycyAtLS0KKworCS8vIE5vdGU6
IERlZmluaW5nIHRoZXNlIG1ldGhvZHMgZXh0ZXJuYWxseSwgYmVjYXVzZSB0aGV5IGNvbWUgaW4g
YSBidW5jaAorCS8vIGFuZCB0aGlzIHdheSB0aGVpciBuYW1lcyBtaW5pZnkuCisKKwkvLyBTaW5n
bGUgc2NhbGFyCisKKwlmdW5jdGlvbiBzZXRWYWx1ZTFmKCBnbCwgdiApIHsgZ2wudW5pZm9ybTFm
KCB0aGlzLmFkZHIsIHYgKTsgfQorCWZ1bmN0aW9uIHNldFZhbHVlMWkoIGdsLCB2ICkgeyBnbC51
bmlmb3JtMWkoIHRoaXMuYWRkciwgdiApOyB9CisKKwkvLyBTaW5nbGUgZmxvYXQgdmVjdG9yIChm
cm9tIGZsYXQgYXJyYXkgb3IgVEhSRUUuVmVjdG9yTikKKworCWZ1bmN0aW9uIHNldFZhbHVlMmZ2
KCBnbCwgdiApIHsKKworCQlpZiAoIHYueCA9PT0gdW5kZWZpbmVkICkgZ2wudW5pZm9ybTJmdigg
dGhpcy5hZGRyLCB2ICk7CisJCWVsc2UgZ2wudW5pZm9ybTJmKCB0aGlzLmFkZHIsIHYueCwgdi55
ICk7CisKKwl9CisKKwlmdW5jdGlvbiBzZXRWYWx1ZTNmdiggZ2wsIHYgKSB7CisKKwkJaWYgKCB2
LnggIT09IHVuZGVmaW5lZCApCisJCQlnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi54LCB2Lnks
IHYueiApOworCQllbHNlIGlmICggdi5yICE9PSB1bmRlZmluZWQgKQorCQkJZ2wudW5pZm9ybTNm
KCB0aGlzLmFkZHIsIHYuciwgdi5nLCB2LmIgKTsKKwkJZWxzZQorCQkJZ2wudW5pZm9ybTNmdigg
dGhpcy5hZGRyLCB2ICk7CisKKwl9CisKKwlmdW5jdGlvbiBzZXRWYWx1ZTRmdiggZ2wsIHYgKSB7
CisKKwkJaWYgKCB2LnggPT09IHVuZGVmaW5lZCApIGdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwg
diApOworCQllbHNlIGdsLnVuaWZvcm00ZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2Lncg
KTsKKworCX0KKworCS8vIFNpbmdsZSBtYXRyaXggKGZyb20gZmxhdCBhcnJheSBvciBNYXRyaXhO
KQorCisJZnVuY3Rpb24gc2V0VmFsdWUyZm0oIGdsLCB2ICkgeworCisJCWdsLnVuaWZvcm1NYXRy
aXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYuZWxlbWVudHMgfHwgdiApOworCisJfQorCisJZnVu
Y3Rpb24gc2V0VmFsdWUzZm0oIGdsLCB2ICkgeworCisJCWlmICggdi5lbGVtZW50cyA9PT0gdW5k
ZWZpbmVkICkgeworCisJCQlnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCB2
ICk7CisKKwkJfSBlbHNlIHsKKworCQkJbWF0M2FycmF5LnNldCggdi5lbGVtZW50cyApOworCQkJ
Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0M2FycmF5ICk7CisKKwkJ
fQorCisJfQorCisJZnVuY3Rpb24gc2V0VmFsdWU0Zm0oIGdsLCB2ICkgeworCisJCWlmICggdi5l
bGVtZW50cyA9PT0gdW5kZWZpbmVkICkgeworCisJCQlnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlz
LmFkZHIsIGZhbHNlLCB2ICk7CisKKwkJfSBlbHNlIHsKKworCQkJbWF0NGFycmF5LnNldCggdi5l
bGVtZW50cyApOworCQkJZ2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0
NGFycmF5ICk7CisKKwkJfQorCisJfQorCisJLy8gU2luZ2xlIHRleHR1cmUgKDJEIC8gQ3ViZSkK
KworCWZ1bmN0aW9uIHNldFZhbHVlVDEoIGdsLCB2LCByZW5kZXJlciApIHsKKworCQl2YXIgdW5p
dCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTsKKwkJZ2wudW5pZm9ybTFpKCB0aGlzLmFk
ZHIsIHVuaXQgKTsKKwkJcmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2IHx8IGVtcHR5VGV4dHVyZSwg
dW5pdCApOworCisJfQorCisJZnVuY3Rpb24gc2V0VmFsdWVUNiggZ2wsIHYsIHJlbmRlcmVyICkg
eworCisJCXZhciB1bml0ID0gcmVuZGVyZXIuYWxsb2NUZXh0dXJlVW5pdCgpOworCQlnbC51bmlm
b3JtMWkoIHRoaXMuYWRkciwgdW5pdCApOworCQlyZW5kZXJlci5zZXRUZXh0dXJlQ3ViZSggdiB8
fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0ICk7CisKKwl9CisKKwkvLyBJbnRlZ2VyIC8gQm9vbGVh
biB2ZWN0b3JzIG9yIGFycmF5cyB0aGVyZW9mIChhbHdheXMgZmxhdCBhcnJheXMpCisKKwlmdW5j
dGlvbiBzZXRWYWx1ZTJpdiggZ2wsIHYgKSB7IGdsLnVuaWZvcm0yaXYoIHRoaXMuYWRkciwgdiAp
OyB9CisJZnVuY3Rpb24gc2V0VmFsdWUzaXYoIGdsLCB2ICkgeyBnbC51bmlmb3JtM2l2KCB0aGlz
LmFkZHIsIHYgKTsgfQorCWZ1bmN0aW9uIHNldFZhbHVlNGl2KCBnbCwgdiApIHsgZ2wudW5pZm9y
bTRpdiggdGhpcy5hZGRyLCB2ICk7IH0KKworCS8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBz
ZXR0ZXIgZm9yIHRoZSBzaW5ndWxhciBjYXNlCisKKwlmdW5jdGlvbiBnZXRTaW5ndWxhclNldHRl
ciggdHlwZSApIHsKKworCQlzd2l0Y2ggKCB0eXBlICkgeworCisJCQljYXNlIDB4MTQwNjogcmV0
dXJuIHNldFZhbHVlMWY7IC8vIEZMT0FUCisJCQljYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVl
MmZ2OyAvLyBfVkVDMgorCQkJY2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZTNmdjsgLy8gX1ZF
QzMKKwkJCWNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWU0ZnY7IC8vIF9WRUM0CisKKwkJCWNh
c2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWUyZm07IC8vIF9NQVQyCisJCQljYXNlIDB4OGI1Yjog
cmV0dXJuIHNldFZhbHVlM2ZtOyAvLyBfTUFUMworCQkJY2FzZSAweDhiNWM6IHJldHVybiBzZXRW
YWx1ZTRmbTsgLy8gX01BVDQKKworCQkJY2FzZSAweDhiNWU6IGNhc2UgMHg4ZDY2OiByZXR1cm4g
c2V0VmFsdWVUMTsgLy8gU0FNUExFUl8yRCwgU0FNUExFUl9FWFRFUk5BTF9PRVMKKwkJCWNhc2Ug
MHg4YjYwOiByZXR1cm4gc2V0VmFsdWVUNjsgLy8gU0FNUExFUl9DVUJFCisKKwkJCWNhc2UgMHgx
NDA0OiBjYXNlIDB4OGI1NjogcmV0dXJuIHNldFZhbHVlMWk7IC8vIElOVCwgQk9PTAorCQkJY2Fz
ZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyCisJCQlj
YXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZTNpdjsgLy8gX1ZFQzMKKwkJ
CWNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlNGl2OyAvLyBfVkVDNAor
CisJCX0KKworCX0KKworCS8vIEFycmF5IG9mIHNjYWxhcnMKKworCWZ1bmN0aW9uIHNldFZhbHVl
MWZ2KCBnbCwgdiApIHsgZ2wudW5pZm9ybTFmdiggdGhpcy5hZGRyLCB2ICk7IH0KKwlmdW5jdGlv
biBzZXRWYWx1ZTFpdiggZ2wsIHYgKSB7IGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdiApOyB9
CisKKwkvLyBBcnJheSBvZiB2ZWN0b3JzIChmbGF0IG9yIGZyb20gVEhSRUUgY2xhc3NlcykKKwor
CWZ1bmN0aW9uIHNldFZhbHVlVjJhKCBnbCwgdiApIHsKKworCQlnbC51bmlmb3JtMmZ2KCB0aGlz
LmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMiApICk7CisKKwl9CisKKwlmdW5jdGlvbiBz
ZXRWYWx1ZVYzYSggZ2wsIHYgKSB7CisKKwkJZ2wudW5pZm9ybTNmdiggdGhpcy5hZGRyLCBmbGF0
dGVuKCB2LCB0aGlzLnNpemUsIDMgKSApOworCisJfQorCisJZnVuY3Rpb24gc2V0VmFsdWVWNGEo
IGdsLCB2ICkgeworCisJCWdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhp
cy5zaXplLCA0ICkgKTsKKworCX0KKworCS8vIEFycmF5IG9mIG1hdHJpY2VzIChmbGF0IG9yIGZy
b20gVEhSRUUgY2xhc2VzKQorCisJZnVuY3Rpb24gc2V0VmFsdWVNMmEoIGdsLCB2ICkgeworCisJ
CWdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIGZsYXR0ZW4oIHYsIHRoaXMu
c2l6ZSwgNCApICk7CisKKwl9CisKKwlmdW5jdGlvbiBzZXRWYWx1ZU0zYSggZ2wsIHYgKSB7CisK
KwkJZ2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhp
cy5zaXplLCA5ICkgKTsKKworCX0KKworCWZ1bmN0aW9uIHNldFZhbHVlTTRhKCBnbCwgdiApIHsK
KworCQlnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBmbGF0dGVuKCB2LCB0
aGlzLnNpemUsIDE2ICkgKTsKKworCX0KKworCS8vIEFycmF5IG9mIHRleHR1cmVzICgyRCAvIEN1
YmUpCisKKwlmdW5jdGlvbiBzZXRWYWx1ZVQxYSggZ2wsIHYsIHJlbmRlcmVyICkgeworCisJCXZh
ciBuID0gdi5sZW5ndGgsCisJCQl1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICk7
CisKKwkJZ2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApOworCisJCWZvciAoIHZhciBp
ID0gMDsgaSAhPT0gbjsgKysgaSApIHsKKworCQkJcmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2WyBp
IF0gfHwgZW1wdHlUZXh0dXJlLCB1bml0c1sgaSBdICk7CisKKwkJfQorCisJfQorCisJZnVuY3Rp
b24gc2V0VmFsdWVUNmEoIGdsLCB2LCByZW5kZXJlciApIHsKKworCQl2YXIgbiA9IHYubGVuZ3Ro
LAorCQkJdW5pdHMgPSBhbGxvY1RleFVuaXRzKCByZW5kZXJlciwgbiApOworCisJCWdsLnVuaWZv
cm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTsKKworCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47
ICsrIGkgKSB7CisKKwkJCXJlbmRlcmVyLnNldFRleHR1cmVDdWJlKCB2WyBpIF0gfHwgZW1wdHlD
dWJlVGV4dHVyZSwgdW5pdHNbIGkgXSApOworCisJCX0KKworCX0KKworCS8vIEhlbHBlciB0byBw
aWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIGEgcHVyZSAoYm90dG9tLWxldmVsKSBhcnJheQorCisJ
ZnVuY3Rpb24gZ2V0UHVyZUFycmF5U2V0dGVyKCB0eXBlICkgeworCisJCXN3aXRjaCAoIHR5cGUg
KSB7CisKKwkJCWNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWUxZnY7IC8vIEZMT0FUCisJCQlj
YXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlVjJhOyAvLyBfVkVDMgorCQkJY2FzZSAweDhiNTE6
IHJldHVybiBzZXRWYWx1ZVYzYTsgLy8gX1ZFQzMKKwkJCWNhc2UgMHg4YjUyOiByZXR1cm4gc2V0
VmFsdWVWNGE7IC8vIF9WRUM0CisKKwkJCWNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWVNMmE7
IC8vIF9NQVQyCisJCQljYXNlIDB4OGI1YjogcmV0dXJuIHNldFZhbHVlTTNhOyAvLyBfTUFUMwor
CQkJY2FzZSAweDhiNWM6IHJldHVybiBzZXRWYWx1ZU00YTsgLy8gX01BVDQKKworCQkJY2FzZSAw
eDhiNWU6IHJldHVybiBzZXRWYWx1ZVQxYTsgLy8gU0FNUExFUl8yRAorCQkJY2FzZSAweDhiNjA6
IHJldHVybiBzZXRWYWx1ZVQ2YTsgLy8gU0FNUExFUl9DVUJFCisKKwkJCWNhc2UgMHgxNDA0OiBj
YXNlIDB4OGI1NjogcmV0dXJuIHNldFZhbHVlMWl2OyAvLyBJTlQsIEJPT0wKKwkJCWNhc2UgMHg4
YjUzOiBjYXNlIDB4OGI1NzogcmV0dXJuIHNldFZhbHVlMml2OyAvLyBfVkVDMgorCQkJY2FzZSAw
eDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMzCisJCQljYXNl
IDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZTRpdjsgLy8gX1ZFQzQKKworCQl9
CisKKwl9CisKKwkvLyAtLS0gVW5pZm9ybSBDbGFzc2VzIC0tLQorCisJZnVuY3Rpb24gU2luZ2xl
VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7CisKKwkJdGhpcy5pZCA9IGlkOworCQl0
aGlzLmFkZHIgPSBhZGRyOworCQl0aGlzLnNldFZhbHVlID0gZ2V0U2luZ3VsYXJTZXR0ZXIoIGFj
dGl2ZUluZm8udHlwZSApOworCisJCS8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8g
REVCVUcKKworCX0KKworCWZ1bmN0aW9uIFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZv
LCBhZGRyICkgeworCisJCXRoaXMuaWQgPSBpZDsKKwkJdGhpcy5hZGRyID0gYWRkcjsKKwkJdGhp
cy5zaXplID0gYWN0aXZlSW5mby5zaXplOworCQl0aGlzLnNldFZhbHVlID0gZ2V0UHVyZUFycmF5
U2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTsKKworCQkvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZv
Lm5hbWU7IC8vIERFQlVHCisKKwl9CisKKwlmdW5jdGlvbiBTdHJ1Y3R1cmVkVW5pZm9ybSggaWQg
KSB7CisKKwkJdGhpcy5pZCA9IGlkOworCisJCVVuaWZvcm1Db250YWluZXIuY2FsbCggdGhpcyAp
OyAvLyBtaXgtaW4KKworCX0KKworCVN0cnVjdHVyZWRVbmlmb3JtLnByb3RvdHlwZS5zZXRWYWx1
ZSA9IGZ1bmN0aW9uICggZ2wsIHZhbHVlICkgeworCisJCS8vIE5vdGU6IERvbid0IG5lZWQgYW4g
ZXh0cmEgJ3JlbmRlcmVyJyBwYXJhbWV0ZXIsIHNpbmNlIHNhbXBsZXJzCisJCS8vIGFyZSBub3Qg
YWxsb3dlZCBpbiBzdHJ1Y3R1cmVkIHVuaWZvcm1zLgorCisJCXZhciBzZXEgPSB0aGlzLnNlcTsK
KworCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewor
CisJCQl2YXIgdSA9IHNlcVsgaSBdOworCQkJdS5zZXRWYWx1ZSggZ2wsIHZhbHVlWyB1LmlkIF0g
KTsKKworCQl9CisKKwl9OworCisJLy8gLS0tIFRvcC1sZXZlbCAtLS0KKworCS8vIFBhcnNlciAt
IGJ1aWxkcyB1cCB0aGUgcHJvcGVydHkgdHJlZSBmcm9tIHRoZSBwYXRoIHN0cmluZ3MKKworCXZh
ciBSZVBhdGhQYXJ0ID0gLyhbXHdcZF9dKykoXF0pPyhcW3xcLik/L2c7CisKKwkvLyBleHRyYWN0
cworCS8vIAktIHRoZSBpZGVudGlmaWVyIChtZW1iZXIgbmFtZSBvciBhcnJheSBpbmRleCkKKwkv
LyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCByaWdodCBicmFja2V0IChmb3VuZCB3aGVuIGFy
cmF5IGluZGV4KQorCS8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIGxlZnQgYnJhY2tldCBv
ciBkb3QgKHR5cGUgb2Ygc3Vic2NyaXB0KQorCS8vCisJLy8gTm90ZTogVGhlc2UgcG9ydGlvbnMg
Y2FuIGJlIHJlYWQgaW4gYSBub24tb3ZlcmxhcHBpbmcgZmFzaGlvbiBhbmQKKwkvLyBhbGxvdyBz
dHJhaWdodGZvcndhcmQgcGFyc2luZyBvZiB0aGUgaGllcmFyY2h5IHRoYXQgV2ViR0wgZW5jb2Rl
cworCS8vIGluIHRoZSB1bmlmb3JtIG5hbWVzLgorCisJZnVuY3Rpb24gYWRkVW5pZm9ybSggY29u
dGFpbmVyLCB1bmlmb3JtT2JqZWN0ICkgeworCisJCWNvbnRhaW5lci5zZXEucHVzaCggdW5pZm9y
bU9iamVjdCApOworCQljb250YWluZXIubWFwWyB1bmlmb3JtT2JqZWN0LmlkIF0gPSB1bmlmb3Jt
T2JqZWN0OworCisJfQorCisJZnVuY3Rpb24gcGFyc2VVbmlmb3JtKCBhY3RpdmVJbmZvLCBhZGRy
LCBjb250YWluZXIgKSB7CisKKwkJdmFyIHBhdGggPSBhY3RpdmVJbmZvLm5hbWUsCisJCQlwYXRo
TGVuZ3RoID0gcGF0aC5sZW5ndGg7CisKKwkJLy8gcmVzZXQgUmVnRXhwIG9iamVjdCwgYmVjYXVz
ZSBvZiB0aGUgZWFybHkgZXhpdCBvZiBhIHByZXZpb3VzIHJ1bgorCQlSZVBhdGhQYXJ0Lmxhc3RJ
bmRleCA9IDA7CisKKwkJZm9yICggOyA7ICkgeworCisJCQl2YXIgbWF0Y2ggPSBSZVBhdGhQYXJ0
LmV4ZWMoIHBhdGggKSwKKwkJCQltYXRjaEVuZCA9IFJlUGF0aFBhcnQubGFzdEluZGV4LAorCisJ
CQkJaWQgPSBtYXRjaFsgMSBdLAorCQkJCWlkSXNJbmRleCA9IG1hdGNoWyAyIF0gPT09ICddJywK
KwkJCQlzdWJzY3JpcHQgPSBtYXRjaFsgMyBdOworCisJCQlpZiAoIGlkSXNJbmRleCApIGlkID0g
aWQgfCAwOyAvLyBjb252ZXJ0IHRvIGludGVnZXIKKworCQkJaWYgKCBzdWJzY3JpcHQgPT09IHVu
ZGVmaW5lZCB8fCBzdWJzY3JpcHQgPT09ICdbJyAmJiBtYXRjaEVuZCArIDIgPT09IHBhdGhMZW5n
dGggKSB7CisKKwkJCQkvLyBiYXJlIG5hbWUgb3IgInB1cmUiIGJvdHRvbS1sZXZlbCBhcnJheSAi
WzBdIiBzdWZmaXgKKworCQkJCWFkZFVuaWZvcm0oIGNvbnRhaW5lciwgc3Vic2NyaXB0ID09PSB1
bmRlZmluZWQgPworCQkJCQkJbmV3IFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRy
ICkgOgorCQkJCQkJbmV3IFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkg
KTsKKworCQkJCWJyZWFrOworCisJCQl9IGVsc2UgeworCisJCQkJLy8gc3RlcCBpbnRvIGlubmVy
IG5vZGUgLyBjcmVhdGUgaXQgaW4gY2FzZSBpdCBkb2Vzbid0IGV4aXN0CisKKwkJCQl2YXIgbWFw
ID0gY29udGFpbmVyLm1hcCwgbmV4dCA9IG1hcFsgaWQgXTsKKworCQkJCWlmICggbmV4dCA9PT0g
dW5kZWZpbmVkICkgeworCisJCQkJCW5leHQgPSBuZXcgU3RydWN0dXJlZFVuaWZvcm0oIGlkICk7
CisJCQkJCWFkZFVuaWZvcm0oIGNvbnRhaW5lciwgbmV4dCApOworCisJCQkJfQorCisJCQkJY29u
dGFpbmVyID0gbmV4dDsKKworCQkJfQorCisJCX0KKworCX0KKworCS8vIFJvb3QgQ29udGFpbmVy
CisKKwlmdW5jdGlvbiBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKSB7CisK
KwkJVW5pZm9ybUNvbnRhaW5lci5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy5yZW5kZXJlciA9IHJl
bmRlcmVyOworCisJCXZhciBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wu
QUNUSVZFX1VOSUZPUk1TICk7CisKKwkJZm9yICggdmFyIGkgPSAwOyBpIDwgbjsgKysgaSApIHsK
KworCQkJdmFyIGluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKCBwcm9ncmFtLCBpICksCisJCQkJ
cGF0aCA9IGluZm8ubmFtZSwKKwkJCQlhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9n
cmFtLCBwYXRoICk7CisKKwkJCXBhcnNlVW5pZm9ybSggaW5mbywgYWRkciwgdGhpcyApOworCisJ
CX0KKworCX0KKworCVdlYkdMVW5pZm9ybXMucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24g
KCBnbCwgbmFtZSwgdmFsdWUgKSB7CisKKwkJdmFyIHUgPSB0aGlzLm1hcFsgbmFtZSBdOworCisJ
CWlmICggdSAhPT0gdW5kZWZpbmVkICkgdS5zZXRWYWx1ZSggZ2wsIHZhbHVlLCB0aGlzLnJlbmRl
cmVyICk7CisKKwl9OworCisJV2ViR0xVbmlmb3Jtcy5wcm90b3R5cGUuc2V0T3B0aW9uYWwgPSBm
dW5jdGlvbiAoIGdsLCBvYmplY3QsIG5hbWUgKSB7CisKKwkJdmFyIHYgPSBvYmplY3RbIG5hbWUg
XTsKKworCQlpZiAoIHYgIT09IHVuZGVmaW5lZCApIHRoaXMuc2V0VmFsdWUoIGdsLCBuYW1lLCB2
ICk7CisKKwl9OworCisKKwkvLyBTdGF0aWMgaW50ZXJmYWNlCisKKwlXZWJHTFVuaWZvcm1zLnVw
bG9hZCA9IGZ1bmN0aW9uICggZ2wsIHNlcSwgdmFsdWVzLCByZW5kZXJlciApIHsKKworCQlmb3Ig
KCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisJCQl2YXIg
dSA9IHNlcVsgaSBdLAorCQkJCXYgPSB2YWx1ZXNbIHUuaWQgXTsKKworCQkJaWYgKCB2Lm5lZWRz
VXBkYXRlICE9PSBmYWxzZSApIHsKKworCQkJCS8vIG5vdGU6IGFsd2F5cyB1cGRhdGluZyB3aGVu
IC5uZWVkc1VwZGF0ZSBpcyB1bmRlZmluZWQKKwkJCQl1LnNldFZhbHVlKCBnbCwgdi52YWx1ZSwg
cmVuZGVyZXIgKTsKKworCQkJfQorCisJCX0KKworCX07CisKKwlXZWJHTFVuaWZvcm1zLnNlcVdp
dGhWYWx1ZSA9IGZ1bmN0aW9uICggc2VxLCB2YWx1ZXMgKSB7CisKKwkJdmFyIHIgPSBbXTsKKwor
CQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisJ
CQl2YXIgdSA9IHNlcVsgaSBdOworCQkJaWYgKCB1LmlkIGluIHZhbHVlcyApIHIucHVzaCggdSAp
OworCisJCX0KKworCQlyZXR1cm4gcjsKKworCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9v
YiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJdmFyIENvbG9yS2V5d29yZHMgPSB7ICdh
bGljZWJsdWUnOiAweEYwRjhGRiwgJ2FudGlxdWV3aGl0ZSc6IDB4RkFFQkQ3LCAnYXF1YSc6IDB4
MDBGRkZGLCAnYXF1YW1hcmluZSc6IDB4N0ZGRkQ0LCAnYXp1cmUnOiAweEYwRkZGRiwKKwkJJ2Jl
aWdlJzogMHhGNUY1REMsICdiaXNxdWUnOiAweEZGRTRDNCwgJ2JsYWNrJzogMHgwMDAwMDAsICdi
bGFuY2hlZGFsbW9uZCc6IDB4RkZFQkNELCAnYmx1ZSc6IDB4MDAwMEZGLCAnYmx1ZXZpb2xldCc6
IDB4OEEyQkUyLAorCQknYnJvd24nOiAweEE1MkEyQSwgJ2J1cmx5d29vZCc6IDB4REVCODg3LCAn
Y2FkZXRibHVlJzogMHg1RjlFQTAsICdjaGFydHJldXNlJzogMHg3RkZGMDAsICdjaG9jb2xhdGUn
OiAweEQyNjkxRSwgJ2NvcmFsJzogMHhGRjdGNTAsCisJCSdjb3JuZmxvd2VyYmx1ZSc6IDB4NjQ5
NUVELCAnY29ybnNpbGsnOiAweEZGRjhEQywgJ2NyaW1zb24nOiAweERDMTQzQywgJ2N5YW4nOiAw
eDAwRkZGRiwgJ2RhcmtibHVlJzogMHgwMDAwOEIsICdkYXJrY3lhbic6IDB4MDA4QjhCLAorCQkn
ZGFya2dvbGRlbnJvZCc6IDB4Qjg4NjBCLCAnZGFya2dyYXknOiAweEE5QTlBOSwgJ2RhcmtncmVl
bic6IDB4MDA2NDAwLCAnZGFya2dyZXknOiAweEE5QTlBOSwgJ2RhcmtraGFraSc6IDB4QkRCNzZC
LCAnZGFya21hZ2VudGEnOiAweDhCMDA4QiwKKwkJJ2RhcmtvbGl2ZWdyZWVuJzogMHg1NTZCMkYs
ICdkYXJrb3JhbmdlJzogMHhGRjhDMDAsICdkYXJrb3JjaGlkJzogMHg5OTMyQ0MsICdkYXJrcmVk
JzogMHg4QjAwMDAsICdkYXJrc2FsbW9uJzogMHhFOTk2N0EsICdkYXJrc2VhZ3JlZW4nOiAweDhG
QkM4RiwKKwkJJ2RhcmtzbGF0ZWJsdWUnOiAweDQ4M0Q4QiwgJ2RhcmtzbGF0ZWdyYXknOiAweDJG
NEY0RiwgJ2RhcmtzbGF0ZWdyZXknOiAweDJGNEY0RiwgJ2Rhcmt0dXJxdW9pc2UnOiAweDAwQ0VE
MSwgJ2Rhcmt2aW9sZXQnOiAweDk0MDBEMywKKwkJJ2RlZXBwaW5rJzogMHhGRjE0OTMsICdkZWVw
c2t5Ymx1ZSc6IDB4MDBCRkZGLCAnZGltZ3JheSc6IDB4Njk2OTY5LCAnZGltZ3JleSc6IDB4Njk2
OTY5LCAnZG9kZ2VyYmx1ZSc6IDB4MUU5MEZGLCAnZmlyZWJyaWNrJzogMHhCMjIyMjIsCisJCSdm
bG9yYWx3aGl0ZSc6IDB4RkZGQUYwLCAnZm9yZXN0Z3JlZW4nOiAweDIyOEIyMiwgJ2Z1Y2hzaWEn
OiAweEZGMDBGRiwgJ2dhaW5zYm9ybyc6IDB4RENEQ0RDLCAnZ2hvc3R3aGl0ZSc6IDB4RjhGOEZG
LCAnZ29sZCc6IDB4RkZENzAwLAorCQknZ29sZGVucm9kJzogMHhEQUE1MjAsICdncmF5JzogMHg4
MDgwODAsICdncmVlbic6IDB4MDA4MDAwLCAnZ3JlZW55ZWxsb3cnOiAweEFERkYyRiwgJ2dyZXkn
OiAweDgwODA4MCwgJ2hvbmV5ZGV3JzogMHhGMEZGRjAsICdob3RwaW5rJzogMHhGRjY5QjQsCisJ
CSdpbmRpYW5yZWQnOiAweENENUM1QywgJ2luZGlnbyc6IDB4NEIwMDgyLCAnaXZvcnknOiAweEZG
RkZGMCwgJ2toYWtpJzogMHhGMEU2OEMsICdsYXZlbmRlcic6IDB4RTZFNkZBLCAnbGF2ZW5kZXJi
bHVzaCc6IDB4RkZGMEY1LCAnbGF3bmdyZWVuJzogMHg3Q0ZDMDAsCisJCSdsZW1vbmNoaWZmb24n
OiAweEZGRkFDRCwgJ2xpZ2h0Ymx1ZSc6IDB4QUREOEU2LCAnbGlnaHRjb3JhbCc6IDB4RjA4MDgw
LCAnbGlnaHRjeWFuJzogMHhFMEZGRkYsICdsaWdodGdvbGRlbnJvZHllbGxvdyc6IDB4RkFGQUQy
LCAnbGlnaHRncmF5JzogMHhEM0QzRDMsCisJCSdsaWdodGdyZWVuJzogMHg5MEVFOTAsICdsaWdo
dGdyZXknOiAweEQzRDNEMywgJ2xpZ2h0cGluayc6IDB4RkZCNkMxLCAnbGlnaHRzYWxtb24nOiAw
eEZGQTA3QSwgJ2xpZ2h0c2VhZ3JlZW4nOiAweDIwQjJBQSwgJ2xpZ2h0c2t5Ymx1ZSc6IDB4ODdD
RUZBLAorCQknbGlnaHRzbGF0ZWdyYXknOiAweDc3ODg5OSwgJ2xpZ2h0c2xhdGVncmV5JzogMHg3
Nzg4OTksICdsaWdodHN0ZWVsYmx1ZSc6IDB4QjBDNERFLCAnbGlnaHR5ZWxsb3cnOiAweEZGRkZF
MCwgJ2xpbWUnOiAweDAwRkYwMCwgJ2xpbWVncmVlbic6IDB4MzJDRDMyLAorCQknbGluZW4nOiAw
eEZBRjBFNiwgJ21hZ2VudGEnOiAweEZGMDBGRiwgJ21hcm9vbic6IDB4ODAwMDAwLCAnbWVkaXVt
YXF1YW1hcmluZSc6IDB4NjZDREFBLCAnbWVkaXVtYmx1ZSc6IDB4MDAwMENELCAnbWVkaXVtb3Jj
aGlkJzogMHhCQTU1RDMsCisJCSdtZWRpdW1wdXJwbGUnOiAweDkzNzBEQiwgJ21lZGl1bXNlYWdy
ZWVuJzogMHgzQ0IzNzEsICdtZWRpdW1zbGF0ZWJsdWUnOiAweDdCNjhFRSwgJ21lZGl1bXNwcmlu
Z2dyZWVuJzogMHgwMEZBOUEsICdtZWRpdW10dXJxdW9pc2UnOiAweDQ4RDFDQywKKwkJJ21lZGl1
bXZpb2xldHJlZCc6IDB4QzcxNTg1LCAnbWlkbmlnaHRibHVlJzogMHgxOTE5NzAsICdtaW50Y3Jl
YW0nOiAweEY1RkZGQSwgJ21pc3R5cm9zZSc6IDB4RkZFNEUxLCAnbW9jY2FzaW4nOiAweEZGRTRC
NSwgJ25hdmFqb3doaXRlJzogMHhGRkRFQUQsCisJCSduYXZ5JzogMHgwMDAwODAsICdvbGRsYWNl
JzogMHhGREY1RTYsICdvbGl2ZSc6IDB4ODA4MDAwLCAnb2xpdmVkcmFiJzogMHg2QjhFMjMsICdv
cmFuZ2UnOiAweEZGQTUwMCwgJ29yYW5nZXJlZCc6IDB4RkY0NTAwLCAnb3JjaGlkJzogMHhEQTcw
RDYsCisJCSdwYWxlZ29sZGVucm9kJzogMHhFRUU4QUEsICdwYWxlZ3JlZW4nOiAweDk4RkI5OCwg
J3BhbGV0dXJxdW9pc2UnOiAweEFGRUVFRSwgJ3BhbGV2aW9sZXRyZWQnOiAweERCNzA5MywgJ3Bh
cGF5YXdoaXAnOiAweEZGRUZENSwgJ3BlYWNocHVmZic6IDB4RkZEQUI5LAorCQkncGVydSc6IDB4
Q0Q4NTNGLCAncGluayc6IDB4RkZDMENCLCAncGx1bSc6IDB4RERBMERELCAncG93ZGVyYmx1ZSc6
IDB4QjBFMEU2LCAncHVycGxlJzogMHg4MDAwODAsICdyZWQnOiAweEZGMDAwMCwgJ3Jvc3licm93
bic6IDB4QkM4RjhGLAorCQkncm95YWxibHVlJzogMHg0MTY5RTEsICdzYWRkbGVicm93bic6IDB4
OEI0NTEzLCAnc2FsbW9uJzogMHhGQTgwNzIsICdzYW5keWJyb3duJzogMHhGNEE0NjAsICdzZWFn
cmVlbic6IDB4MkU4QjU3LCAnc2Vhc2hlbGwnOiAweEZGRjVFRSwKKwkJJ3NpZW5uYSc6IDB4QTA1
MjJELCAnc2lsdmVyJzogMHhDMEMwQzAsICdza3libHVlJzogMHg4N0NFRUIsICdzbGF0ZWJsdWUn
OiAweDZBNUFDRCwgJ3NsYXRlZ3JheSc6IDB4NzA4MDkwLCAnc2xhdGVncmV5JzogMHg3MDgwOTAs
ICdzbm93JzogMHhGRkZBRkEsCisJCSdzcHJpbmdncmVlbic6IDB4MDBGRjdGLCAnc3RlZWxibHVl
JzogMHg0NjgyQjQsICd0YW4nOiAweEQyQjQ4QywgJ3RlYWwnOiAweDAwODA4MCwgJ3RoaXN0bGUn
OiAweEQ4QkZEOCwgJ3RvbWF0byc6IDB4RkY2MzQ3LCAndHVycXVvaXNlJzogMHg0MEUwRDAsCisJ
CSd2aW9sZXQnOiAweEVFODJFRSwgJ3doZWF0JzogMHhGNURFQjMsICd3aGl0ZSc6IDB4RkZGRkZG
LCAnd2hpdGVzbW9rZSc6IDB4RjVGNUY1LCAneWVsbG93JzogMHhGRkZGMDAsICd5ZWxsb3dncmVl
bic6IDB4OUFDRDMyIH07CisKKwlmdW5jdGlvbiBDb2xvciggciwgZywgYiApIHsKKworCQlpZiAo
IGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQgKSB7CisKKwkJCS8vIHIgaXMgVEhS
RUUuQ29sb3IsIGhleCBvciBzdHJpbmcKKwkJCXJldHVybiB0aGlzLnNldCggciApOworCisJCX0K
KworCQlyZXR1cm4gdGhpcy5zZXRSR0IoIHIsIGcsIGIgKTsKKworCX0KKworCU9iamVjdC5hc3Np
Z24oIENvbG9yLnByb3RvdHlwZSwgeworCisJCWlzQ29sb3I6IHRydWUsCisKKwkJcjogMSwgZzog
MSwgYjogMSwKKworCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCWlmICggdmFsdWUg
JiYgdmFsdWUuaXNDb2xvciApIHsKKworCQkJCXRoaXMuY29weSggdmFsdWUgKTsKKworCQkJfSBl
bHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyApIHsKKworCQkJCXRoaXMuc2V0SGV4
KCB2YWx1ZSApOworCisJCQl9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkg
eworCisJCQkJdGhpcy5zZXRTdHlsZSggdmFsdWUgKTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhp
czsKKworCQl9LAorCisJCXNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CisKKwkJCXRo
aXMuciA9IHNjYWxhcjsKKwkJCXRoaXMuZyA9IHNjYWxhcjsKKwkJCXRoaXMuYiA9IHNjYWxhcjsK
KworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRIZXg6IGZ1bmN0aW9uICggaGV4ICkg
eworCisJCQloZXggPSBNYXRoLmZsb29yKCBoZXggKTsKKworCQkJdGhpcy5yID0gKCBoZXggPj4g
MTYgJiAyNTUgKSAvIDI1NTsKKwkJCXRoaXMuZyA9ICggaGV4ID4+IDggJiAyNTUgKSAvIDI1NTsK
KwkJCXRoaXMuYiA9ICggaGV4ICYgMjU1ICkgLyAyNTU7CisKKwkJCXJldHVybiB0aGlzOworCisJ
CX0sCisKKwkJc2V0UkdCOiBmdW5jdGlvbiAoIHIsIGcsIGIgKSB7CisKKwkJCXRoaXMuciA9IHI7
CisJCQl0aGlzLmcgPSBnOworCQkJdGhpcy5iID0gYjsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJ
fSwKKworCQlzZXRIU0w6IGZ1bmN0aW9uICgpIHsKKworCQkJZnVuY3Rpb24gaHVlMnJnYiggcCwg
cSwgdCApIHsKKworCQkJCWlmICggdCA8IDAgKSB0ICs9IDE7CisJCQkJaWYgKCB0ID4gMSApIHQg
LT0gMTsKKwkJCQlpZiAoIHQgPCAxIC8gNiApIHJldHVybiBwICsgKCBxIC0gcCApICogNiAqIHQ7
CisJCQkJaWYgKCB0IDwgMSAvIDIgKSByZXR1cm4gcTsKKwkJCQlpZiAoIHQgPCAyIC8gMyApIHJl
dHVybiBwICsgKCBxIC0gcCApICogNiAqICggMiAvIDMgLSB0ICk7CisJCQkJcmV0dXJuIHA7CisK
KwkJCX0KKworCQkJcmV0dXJuIGZ1bmN0aW9uIHNldEhTTCggaCwgcywgbCApIHsKKworCQkJCS8v
IGgscyxsIHJhbmdlcyBhcmUgaW4gMC4wIC0gMS4wCisJCQkJaCA9IF9NYXRoLmV1Y2xpZGVhbk1v
ZHVsbyggaCwgMSApOworCQkJCXMgPSBfTWF0aC5jbGFtcCggcywgMCwgMSApOworCQkJCWwgPSBf
TWF0aC5jbGFtcCggbCwgMCwgMSApOworCisJCQkJaWYgKCBzID09PSAwICkgeworCisJCQkJCXRo
aXMuciA9IHRoaXMuZyA9IHRoaXMuYiA9IGw7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXZhciBw
ID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSAoIGwgKiBzICk7CisJCQkJCXZh
ciBxID0gKCAyICogbCApIC0gcDsKKworCQkJCQl0aGlzLnIgPSBodWUycmdiKCBxLCBwLCBoICsg
MSAvIDMgKTsKKwkJCQkJdGhpcy5nID0gaHVlMnJnYiggcSwgcCwgaCApOworCQkJCQl0aGlzLmIg
PSBodWUycmdiKCBxLCBwLCBoIC0gMSAvIDMgKTsKKworCQkJCX0KKworCQkJCXJldHVybiB0aGlz
OworCisJCQl9OworCisJCX0oKSwKKworCQlzZXRTdHlsZTogZnVuY3Rpb24gKCBzdHlsZSApIHsK
KworCQkJZnVuY3Rpb24gaGFuZGxlQWxwaGEoIHN0cmluZyApIHsKKworCQkJCWlmICggc3RyaW5n
ID09PSB1bmRlZmluZWQgKSByZXR1cm47CisKKwkJCQlpZiAoIHBhcnNlRmxvYXQoIHN0cmluZyAp
IDwgMSApIHsKKworCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9u
ZW50IG9mICcgKyBzdHlsZSArICcgd2lsbCBiZSBpZ25vcmVkLicgKTsKKworCQkJCX0KKworCQkJ
fQorCisKKwkJCXZhciBtOworCisJCQlpZiAoIG0gPSAvXigoPzpyZ2J8aHNsKWE/KVwoXHMqKFte
XCldKilcKS8uZXhlYyggc3R5bGUgKSApIHsKKworCQkJCS8vIHJnYiAvIGhzbAorCisJCQkJdmFy
IGNvbG9yOworCQkJCXZhciBuYW1lID0gbVsgMSBdOworCQkJCXZhciBjb21wb25lbnRzID0gbVsg
MiBdOworCisJCQkJc3dpdGNoICggbmFtZSApIHsKKworCQkJCQljYXNlICdyZ2InOgorCQkJCQlj
YXNlICdyZ2JhJzoKKworCQkJCQkJaWYgKCBjb2xvciA9IC9eKFxkKylccyosXHMqKFxkKylccyos
XHMqKFxkKylccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKCBjb21wb25lbnRz
ICkgKSB7CisKKwkJCQkJCQkvLyByZ2IoMjU1LDAsMCkgcmdiYSgyNTUsMCwwLDAuNSkKKwkJCQkJ
CQl0aGlzLnIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8g
MjU1OworCQkJCQkJCXRoaXMuZyA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMiBd
LCAxMCApICkgLyAyNTU7CisJCQkJCQkJdGhpcy5iID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQo
IGNvbG9yWyAzIF0sIDEwICkgKSAvIDI1NTsKKworCQkJCQkJCWhhbmRsZUFscGhhKCBjb2xvclsg
NSBdICk7CisKKwkJCQkJCQlyZXR1cm4gdGhpczsKKworCQkJCQkJfQorCisJCQkJCQlpZiAoIGNv
bG9yID0gL14oXGQrKVwlXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKigsXHMqKFswLTld
KlwuP1swLTldKylccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHsKKworCQkJCQkJCS8vIHJn
YigxMDAlLDAlLDAlKSByZ2JhKDEwMCUsMCUsMCUsMC41KQorCQkJCQkJCXRoaXMuciA9IE1hdGgu
bWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMSBdLCAxMCApICkgLyAxMDA7CisJCQkJCQkJdGhp
cy5nID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDEwMDsK
KwkJCQkJCQl0aGlzLmIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDMgXSwgMTAg
KSApIC8gMTAwOworCisJCQkJCQkJaGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTsKKworCQkJCQkJ
CXJldHVybiB0aGlzOworCisJCQkJCQl9CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgJ2hz
bCc6CisJCQkJCWNhc2UgJ2hzbGEnOgorCisJCQkJCQlpZiAoIGNvbG9yID0gL14oWzAtOV0qXC4/
WzAtOV0rKVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooLFxzKihbMC05XSpcLj9bMC05
XSspXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7CisKKwkJCQkJCQkvLyBoc2woMTIwLDUw
JSw1MCUpIGhzbGEoMTIwLDUwJSw1MCUsMC41KQorCQkJCQkJCXZhciBoID0gcGFyc2VGbG9hdCgg
Y29sb3JbIDEgXSApIC8gMzYwOworCQkJCQkJCXZhciBzID0gcGFyc2VJbnQoIGNvbG9yWyAyIF0s
IDEwICkgLyAxMDA7CisJCQkJCQkJdmFyIGwgPSBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSAv
IDEwMDsKKworCQkJCQkJCWhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7CisKKwkJCQkJCQlyZXR1
cm4gdGhpcy5zZXRIU0woIGgsIHMsIGwgKTsKKworCQkJCQkJfQorCisJCQkJCQlicmVhazsKKwor
CQkJCX0KKworCQkJfSBlbHNlIGlmICggbSA9IC9eXCMoW0EtRmEtZjAtOV0rKSQvLmV4ZWMoIHN0
eWxlICkgKSB7CisKKwkJCQkvLyBoZXggY29sb3IKKworCQkJCXZhciBoZXggPSBtWyAxIF07CisJ
CQkJdmFyIHNpemUgPSBoZXgubGVuZ3RoOworCisJCQkJaWYgKCBzaXplID09PSAzICkgeworCisJ
CQkJCS8vICNmZjAKKwkJCQkJdGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhl
eC5jaGFyQXQoIDAgKSwgMTYgKSAvIDI1NTsKKwkJCQkJdGhpcy5nID0gcGFyc2VJbnQoIGhleC5j
aGFyQXQoIDEgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTsKKwkJCQkJdGhpcy5iID0g
cGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTsK
KworCQkJCQlyZXR1cm4gdGhpczsKKworCQkJCX0gZWxzZSBpZiAoIHNpemUgPT09IDYgKSB7CisK
KwkJCQkJLy8gI2ZmMDAwMAorCQkJCQl0aGlzLnIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMCAp
ICsgaGV4LmNoYXJBdCggMSApLCAxNiApIC8gMjU1OworCQkJCQl0aGlzLmcgPSBwYXJzZUludCgg
aGV4LmNoYXJBdCggMiApICsgaGV4LmNoYXJBdCggMyApLCAxNiApIC8gMjU1OworCQkJCQl0aGlz
LmIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggNCApICsgaGV4LmNoYXJBdCggNSApLCAxNiApIC8g
MjU1OworCisJCQkJCXJldHVybiB0aGlzOworCisJCQkJfQorCisJCQl9CisKKwkJCWlmICggc3R5
bGUgJiYgc3R5bGUubGVuZ3RoID4gMCApIHsKKworCQkJCS8vIGNvbG9yIGtleXdvcmRzCisJCQkJ
dmFyIGhleCA9IENvbG9yS2V5d29yZHNbIHN0eWxlIF07CisKKwkJCQlpZiAoIGhleCAhPT0gdW5k
ZWZpbmVkICkgeworCisJCQkJCS8vIHJlZAorCQkJCQl0aGlzLnNldEhleCggaGV4ICk7CisKKwkJ
CQl9IGVsc2UgeworCisJCQkJCS8vIHVua25vd24gY29sb3IKKwkJCQkJY29uc29sZS53YXJuKCAn
VEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgJyArIHN0eWxlICk7CisKKwkJCQl9CisKKwkJCX0K
KworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJ
CQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuciwgdGhpcy5nLCB0aGlzLmIgKTsK
KworCQl9LAorCisJCWNvcHk6IGZ1bmN0aW9uICggY29sb3IgKSB7CisKKwkJCXRoaXMuciA9IGNv
bG9yLnI7CisJCQl0aGlzLmcgPSBjb2xvci5nOworCQkJdGhpcy5iID0gY29sb3IuYjsKKworCQkJ
cmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljb3B5R2FtbWFUb0xpbmVhcjogZnVuY3Rpb24gKCBj
b2xvciwgZ2FtbWFGYWN0b3IgKSB7CisKKwkJCWlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5l
ZCApIGdhbW1hRmFjdG9yID0gMi4wOworCisJCQl0aGlzLnIgPSBNYXRoLnBvdyggY29sb3Iuciwg
Z2FtbWFGYWN0b3IgKTsKKwkJCXRoaXMuZyA9IE1hdGgucG93KCBjb2xvci5nLCBnYW1tYUZhY3Rv
ciApOworCQkJdGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIGdhbW1hRmFjdG9yICk7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY29weUxpbmVhclRvR2FtbWE6IGZ1bmN0aW9uICgg
Y29sb3IsIGdhbW1hRmFjdG9yICkgeworCisJCQlpZiAoIGdhbW1hRmFjdG9yID09PSB1bmRlZmlu
ZWQgKSBnYW1tYUZhY3RvciA9IDIuMDsKKworCQkJdmFyIHNhZmVJbnZlcnNlID0gKCBnYW1tYUZh
Y3RvciA+IDAgKSA/ICggMS4wIC8gZ2FtbWFGYWN0b3IgKSA6IDEuMDsKKworCQkJdGhpcy5yID0g
TWF0aC5wb3coIGNvbG9yLnIsIHNhZmVJbnZlcnNlICk7CisJCQl0aGlzLmcgPSBNYXRoLnBvdygg
Y29sb3IuZywgc2FmZUludmVyc2UgKTsKKwkJCXRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBz
YWZlSW52ZXJzZSApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNvbnZlcnRHYW1t
YVRvTGluZWFyOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciByID0gdGhpcy5yLCBnID0gdGhpcy5n
LCBiID0gdGhpcy5iOworCisJCQl0aGlzLnIgPSByICogcjsKKwkJCXRoaXMuZyA9IGcgKiBnOwor
CQkJdGhpcy5iID0gYiAqIGI7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY29udmVy
dExpbmVhclRvR2FtbWE6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5yID0gTWF0aC5zcXJ0KCB0
aGlzLnIgKTsKKwkJCXRoaXMuZyA9IE1hdGguc3FydCggdGhpcy5nICk7CisJCQl0aGlzLmIgPSBN
YXRoLnNxcnQoIHRoaXMuYiApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWdldEhl
eDogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gKCB0aGlzLnIgKiAyNTUgKSA8PCAxNiBeICgg
dGhpcy5nICogMjU1ICkgPDwgOCBeICggdGhpcy5iICogMjU1ICkgPDwgMDsKKworCQl9LAorCisJ
CWdldEhleFN0cmluZzogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gKCAnMDAwMDAwJyArIHRo
aXMuZ2V0SGV4KCkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7CisKKwkJfSwKKworCQln
ZXRIU0w6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCS8vIGgscyxsIHJhbmdl
cyBhcmUgaW4gMC4wIC0gMS4wCisKKwkJCXZhciBoc2wgPSBvcHRpb25hbFRhcmdldCB8fCB7IGg6
IDAsIHM6IDAsIGw6IDAgfTsKKworCQkJdmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0
aGlzLmI7CisKKwkJCXZhciBtYXggPSBNYXRoLm1heCggciwgZywgYiApOworCQkJdmFyIG1pbiA9
IE1hdGgubWluKCByLCBnLCBiICk7CisKKwkJCXZhciBodWUsIHNhdHVyYXRpb247CisJCQl2YXIg
bGlnaHRuZXNzID0gKCBtaW4gKyBtYXggKSAvIDIuMDsKKworCQkJaWYgKCBtaW4gPT09IG1heCAp
IHsKKworCQkJCWh1ZSA9IDA7CisJCQkJc2F0dXJhdGlvbiA9IDA7CisKKwkJCX0gZWxzZSB7CisK
KwkJCQl2YXIgZGVsdGEgPSBtYXggLSBtaW47CisKKwkJCQlzYXR1cmF0aW9uID0gbGlnaHRuZXNz
IDw9IDAuNSA/IGRlbHRhIC8gKCBtYXggKyBtaW4gKSA6IGRlbHRhIC8gKCAyIC0gbWF4IC0gbWlu
ICk7CisKKwkJCQlzd2l0Y2ggKCBtYXggKSB7CisKKwkJCQkJY2FzZSByOiBodWUgPSAoIGcgLSBi
ICkgLyBkZWx0YSArICggZyA8IGIgPyA2IDogMCApOyBicmVhazsKKwkJCQkJY2FzZSBnOiBodWUg
PSAoIGIgLSByICkgLyBkZWx0YSArIDI7IGJyZWFrOworCQkJCQljYXNlIGI6IGh1ZSA9ICggciAt
IGcgKSAvIGRlbHRhICsgNDsgYnJlYWs7CisKKwkJCQl9CisKKwkJCQlodWUgLz0gNjsKKworCQkJ
fQorCisJCQloc2wuaCA9IGh1ZTsKKwkJCWhzbC5zID0gc2F0dXJhdGlvbjsKKwkJCWhzbC5sID0g
bGlnaHRuZXNzOworCisJCQlyZXR1cm4gaHNsOworCisJCX0sCisKKwkJZ2V0U3R5bGU6IGZ1bmN0
aW9uICgpIHsKKworCQkJcmV0dXJuICdyZ2IoJyArICggKCB0aGlzLnIgKiAyNTUgKSB8IDAgKSAr
ICcsJyArICggKCB0aGlzLmcgKiAyNTUgKSB8IDAgKSArICcsJyArICggKCB0aGlzLmIgKiAyNTUg
KSB8IDAgKSArICcpJzsKKworCQl9LAorCisJCW9mZnNldEhTTDogZnVuY3Rpb24gKCBoLCBzLCBs
ICkgeworCisJCQl2YXIgaHNsID0gdGhpcy5nZXRIU0woKTsKKworCQkJaHNsLmggKz0gaDsgaHNs
LnMgKz0gczsgaHNsLmwgKz0gbDsKKworCQkJdGhpcy5zZXRIU0woIGhzbC5oLCBoc2wucywgaHNs
LmwgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlhZGQ6IGZ1bmN0aW9uICggY29s
b3IgKSB7CisKKwkJCXRoaXMuciArPSBjb2xvci5yOworCQkJdGhpcy5nICs9IGNvbG9yLmc7CisJ
CQl0aGlzLmIgKz0gY29sb3IuYjsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlhZGRD
b2xvcnM6IGZ1bmN0aW9uICggY29sb3IxLCBjb2xvcjIgKSB7CisKKwkJCXRoaXMuciA9IGNvbG9y
MS5yICsgY29sb3IyLnI7CisJCQl0aGlzLmcgPSBjb2xvcjEuZyArIGNvbG9yMi5nOworCQkJdGhp
cy5iID0gY29sb3IxLmIgKyBjb2xvcjIuYjsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKwor
CQlhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHsKKworCQkJdGhpcy5yICs9IHM7CisJCQl0aGlz
LmcgKz0gczsKKwkJCXRoaXMuYiArPSBzOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJ
CXN1YjogZnVuY3Rpb24oIGNvbG9yICkgeworCisJCQl0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhp
cy5yIC0gY29sb3IuciApOworCQkJdGhpcy5nID0gTWF0aC5tYXgoIDAsIHRoaXMuZyAtIGNvbG9y
LmcgKTsKKwkJCXRoaXMuYiA9IE1hdGgubWF4KCAwLCB0aGlzLmIgLSBjb2xvci5iICk7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbXVsdGlwbHk6IGZ1bmN0aW9uICggY29sb3IgKSB7
CisKKwkJCXRoaXMuciAqPSBjb2xvci5yOworCQkJdGhpcy5nICo9IGNvbG9yLmc7CisJCQl0aGlz
LmIgKj0gY29sb3IuYjsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQltdWx0aXBseVNj
YWxhcjogZnVuY3Rpb24gKCBzICkgeworCisJCQl0aGlzLnIgKj0gczsKKwkJCXRoaXMuZyAqPSBz
OworCQkJdGhpcy5iICo9IHM7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbGVycDog
ZnVuY3Rpb24gKCBjb2xvciwgYWxwaGEgKSB7CisKKwkJCXRoaXMuciArPSAoIGNvbG9yLnIgLSB0
aGlzLnIgKSAqIGFscGhhOworCQkJdGhpcy5nICs9ICggY29sb3IuZyAtIHRoaXMuZyApICogYWxw
aGE7CisJCQl0aGlzLmIgKz0gKCBjb2xvci5iIC0gdGhpcy5iICkgKiBhbHBoYTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQllcXVhbHM6IGZ1bmN0aW9uICggYyApIHsKKworCQkJcmV0
dXJuICggYy5yID09PSB0aGlzLnIgKSAmJiAoIGMuZyA9PT0gdGhpcy5nICkgJiYgKCBjLmIgPT09
IHRoaXMuYiApOworCisJCX0sCisKKwkJZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZz
ZXQgKSB7CisKKwkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisJ
CQl0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07CisJCQl0aGlzLmcgPSBhcnJheVsgb2Zmc2V0ICsg
MSBdOworCQkJdGhpcy5iID0gYXJyYXlbIG9mZnNldCArIDIgXTsKKworCQkJcmV0dXJuIHRoaXM7
CisKKwkJfSwKKworCQl0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CisKKwkJ
CWlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107CisJCQlpZiAoIG9mZnNldCA9
PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKKworCQkJYXJyYXlbIG9mZnNldCBdID0gdGhpcy5y
OworCQkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuZzsKKwkJCWFycmF5WyBvZmZzZXQgKyAy
IF0gPSB0aGlzLmI7CisKKwkJCXJldHVybiBhcnJheTsKKworCQl9LAorCisJCXRvSlNPTjogZnVu
Y3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5nZXRIZXgoKTsKKworCQl9CisKKwl9ICk7CisK
KwkvKioKKwkgKiBVbmlmb3JtcyBsaWJyYXJ5IGZvciBzaGFyZWQgd2ViZ2wgc2hhZGVycworCSAq
LworCisJdmFyIFVuaWZvcm1zTGliID0geworCisJCWNvbW1vbjogeworCisJCQlkaWZmdXNlOiB7
IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSwKKwkJCW9wYWNpdHk6IHsgdmFsdWU6IDEu
MCB9LAorCisJCQltYXA6IHsgdmFsdWU6IG51bGwgfSwKKwkJCW9mZnNldFJlcGVhdDogeyB2YWx1
ZTogbmV3IFZlY3RvcjQoIDAsIDAsIDEsIDEgKSB9LAorCisJCQlzcGVjdWxhck1hcDogeyB2YWx1
ZTogbnVsbCB9LAorCQkJYWxwaGFNYXA6IHsgdmFsdWU6IG51bGwgfSwKKworCQkJZW52TWFwOiB7
IHZhbHVlOiBudWxsIH0sCisJCQlmbGlwRW52TWFwOiB7IHZhbHVlOiAtIDEgfSwKKwkJCXJlZmxl
Y3Rpdml0eTogeyB2YWx1ZTogMS4wIH0sCisJCQlyZWZyYWN0aW9uUmF0aW86IHsgdmFsdWU6IDAu
OTggfQorCisJCX0sCisKKwkJYW9tYXA6IHsKKworCQkJYW9NYXA6IHsgdmFsdWU6IG51bGwgfSwK
KwkJCWFvTWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH0KKworCQl9LAorCisJCWxpZ2h0bWFwOiB7
CisKKwkJCWxpZ2h0TWFwOiB7IHZhbHVlOiBudWxsIH0sCisJCQlsaWdodE1hcEludGVuc2l0eTog
eyB2YWx1ZTogMSB9CisKKwkJfSwKKworCQllbWlzc2l2ZW1hcDogeworCisJCQllbWlzc2l2ZU1h
cDogeyB2YWx1ZTogbnVsbCB9CisKKwkJfSwKKworCQlidW1wbWFwOiB7CisKKwkJCWJ1bXBNYXA6
IHsgdmFsdWU6IG51bGwgfSwKKwkJCWJ1bXBTY2FsZTogeyB2YWx1ZTogMSB9CisKKwkJfSwKKwor
CQlub3JtYWxtYXA6IHsKKworCQkJbm9ybWFsTWFwOiB7IHZhbHVlOiBudWxsIH0sCisJCQlub3Jt
YWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9CisKKwkJfSwKKworCQlkaXNw
bGFjZW1lbnRtYXA6IHsKKworCQkJZGlzcGxhY2VtZW50TWFwOiB7IHZhbHVlOiBudWxsIH0sCisJ
CQlkaXNwbGFjZW1lbnRTY2FsZTogeyB2YWx1ZTogMSB9LAorCQkJZGlzcGxhY2VtZW50Qmlhczog
eyB2YWx1ZTogMCB9CisKKwkJfSwKKworCQlyb3VnaG5lc3NtYXA6IHsKKworCQkJcm91Z2huZXNz
TWFwOiB7IHZhbHVlOiBudWxsIH0KKworCQl9LAorCisJCW1ldGFsbmVzc21hcDogeworCisJCQlt
ZXRhbG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfQorCisJCX0sCisKKwkJZ3JhZGllbnRtYXA6IHsK
KworCQkJZ3JhZGllbnRNYXA6IHsgdmFsdWU6IG51bGwgfQorCisJCX0sCisKKwkJZm9nOiB7CisK
KwkJCWZvZ0RlbnNpdHk6IHsgdmFsdWU6IDAuMDAwMjUgfSwKKwkJCWZvZ05lYXI6IHsgdmFsdWU6
IDEgfSwKKwkJCWZvZ0ZhcjogeyB2YWx1ZTogMjAwMCB9LAorCQkJZm9nQ29sb3I6IHsgdmFsdWU6
IG5ldyBDb2xvciggMHhmZmZmZmYgKSB9CisKKwkJfSwKKworCQlsaWdodHM6IHsKKworCQkJYW1i
aWVudExpZ2h0Q29sb3I6IHsgdmFsdWU6IFtdIH0sCisKKwkJCWRpcmVjdGlvbmFsTGlnaHRzOiB7
IHZhbHVlOiBbXSwgcHJvcGVydGllczogeworCQkJCWRpcmVjdGlvbjoge30sCisJCQkJY29sb3I6
IHt9LAorCisJCQkJc2hhZG93OiB7fSwKKwkJCQlzaGFkb3dCaWFzOiB7fSwKKwkJCQlzaGFkb3dS
YWRpdXM6IHt9LAorCQkJCXNoYWRvd01hcFNpemU6IHt9CisJCQl9IH0sCisKKwkJCWRpcmVjdGlv
bmFsU2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LAorCQkJZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6
IHsgdmFsdWU6IFtdIH0sCisKKwkJCXNwb3RMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVz
OiB7CisJCQkJY29sb3I6IHt9LAorCQkJCXBvc2l0aW9uOiB7fSwKKwkJCQlkaXJlY3Rpb246IHt9
LAorCQkJCWRpc3RhbmNlOiB7fSwKKwkJCQljb25lQ29zOiB7fSwKKwkJCQlwZW51bWJyYUNvczog
e30sCisJCQkJZGVjYXk6IHt9LAorCisJCQkJc2hhZG93OiB7fSwKKwkJCQlzaGFkb3dCaWFzOiB7
fSwKKwkJCQlzaGFkb3dSYWRpdXM6IHt9LAorCQkJCXNoYWRvd01hcFNpemU6IHt9CisJCQl9IH0s
CisKKwkJCXNwb3RTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sCisJCQlzcG90U2hhZG93TWF0cml4
OiB7IHZhbHVlOiBbXSB9LAorCisJCQlwb2ludExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRp
ZXM6IHsKKwkJCQljb2xvcjoge30sCisJCQkJcG9zaXRpb246IHt9LAorCQkJCWRlY2F5OiB7fSwK
KwkJCQlkaXN0YW5jZToge30sCisKKwkJCQlzaGFkb3c6IHt9LAorCQkJCXNoYWRvd0JpYXM6IHt9
LAorCQkJCXNoYWRvd1JhZGl1czoge30sCisJCQkJc2hhZG93TWFwU2l6ZToge30KKwkJCX0gfSwK
KworCQkJcG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sCisJCQlwb2ludFNoYWRvd01hdHJp
eDogeyB2YWx1ZTogW10gfSwKKworCQkJaGVtaXNwaGVyZUxpZ2h0czogeyB2YWx1ZTogW10sIHBy
b3BlcnRpZXM6IHsKKwkJCQlkaXJlY3Rpb246IHt9LAorCQkJCXNreUNvbG9yOiB7fSwKKwkJCQln
cm91bmRDb2xvcjoge30KKwkJCX0gfSwKKworCQkJLy8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RB
cmVhTGlnaHQgQlJERiBkYXRhIG5lZWRzIHRvIGJlIG1vdmVkIGZyb20gZXhhbXBsZSB0byBtYWlu
IHNyYworCQkJcmVjdEFyZWFMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7CisJCQkJ
Y29sb3I6IHt9LAorCQkJCXBvc2l0aW9uOiB7fSwKKwkJCQl3aWR0aDoge30sCisJCQkJaGVpZ2h0
OiB7fQorCQkJfSB9CisKKwkJfSwKKworCQlwb2ludHM6IHsKKworCQkJZGlmZnVzZTogeyB2YWx1
ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sCisJCQlvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSwK
KwkJCXNpemU6IHsgdmFsdWU6IDEuMCB9LAorCQkJc2NhbGU6IHsgdmFsdWU6IDEuMCB9LAorCQkJ
bWFwOiB7IHZhbHVlOiBudWxsIH0sCisJCQlvZmZzZXRSZXBlYXQ6IHsgdmFsdWU6IG5ldyBWZWN0
b3I0KCAwLCAwLCAxLCAxICkgfQorCisJCX0KKworCX07CisKKwkvKioKKwkgKiBVbmlmb3JtIFV0
aWxpdGllcworCSAqLworCisJdmFyIFVuaWZvcm1zVXRpbHMgPSB7CisKKwkJbWVyZ2U6IGZ1bmN0
aW9uICggdW5pZm9ybXMgKSB7CisKKwkJCXZhciBtZXJnZWQgPSB7fTsKKworCQkJZm9yICggdmFy
IHUgPSAwOyB1IDwgdW5pZm9ybXMubGVuZ3RoOyB1ICsrICkgeworCisJCQkJdmFyIHRtcCA9IHRo
aXMuY2xvbmUoIHVuaWZvcm1zWyB1IF0gKTsKKworCQkJCWZvciAoIHZhciBwIGluIHRtcCApIHsK
KworCQkJCQltZXJnZWRbIHAgXSA9IHRtcFsgcCBdOworCisJCQkJfQorCisJCQl9CisKKwkJCXJl
dHVybiBtZXJnZWQ7CisKKwkJfSwKKworCQljbG9uZTogZnVuY3Rpb24gKCB1bmlmb3Jtc19zcmMg
KSB7CisKKwkJCXZhciB1bmlmb3Jtc19kc3QgPSB7fTsKKworCQkJZm9yICggdmFyIHUgaW4gdW5p
Zm9ybXNfc3JjICkgeworCisJCQkJdW5pZm9ybXNfZHN0WyB1IF0gPSB7fTsKKworCQkJCWZvciAo
IHZhciBwIGluIHVuaWZvcm1zX3NyY1sgdSBdICkgeworCisJCQkJCXZhciBwYXJhbWV0ZXJfc3Jj
ID0gdW5pZm9ybXNfc3JjWyB1IF1bIHAgXTsKKworCQkJCQlpZiAoIHBhcmFtZXRlcl9zcmMgJiYg
KCBwYXJhbWV0ZXJfc3JjLmlzQ29sb3IgfHwKKwkJCQkJCXBhcmFtZXRlcl9zcmMuaXNNYXRyaXgz
IHx8IHBhcmFtZXRlcl9zcmMuaXNNYXRyaXg0IHx8CisJCQkJCQlwYXJhbWV0ZXJfc3JjLmlzVmVj
dG9yMiB8fCBwYXJhbWV0ZXJfc3JjLmlzVmVjdG9yMyB8fCBwYXJhbWV0ZXJfc3JjLmlzVmVjdG9y
NCB8fAorCQkJCQkJcGFyYW1ldGVyX3NyYy5pc1RleHR1cmUgKSApIHsKKworCQkJCQkJdW5pZm9y
bXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmMuY2xvbmUoKTsKKworCQkJCQl9IGVsc2Ug
aWYgKCBBcnJheS5pc0FycmF5KCBwYXJhbWV0ZXJfc3JjICkgKSB7CisKKwkJCQkJCXVuaWZvcm1z
X2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjLnNsaWNlKCk7CisKKwkJCQkJfSBlbHNlIHsK
KworCQkJCQkJdW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmM7CisKKwkJCQkJ
fQorCisJCQkJfQorCisJCQl9CisKKwkJCXJldHVybiB1bmlmb3Jtc19kc3Q7CisKKwkJfQorCisJ
fTsKKworCXZhciBhbHBoYW1hcF9mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0FMUEhBTUFQXG5cdGRp
ZmZ1c2VDb2xvci5hICo9IHRleHR1cmUyRCggYWxwaGFNYXAsIHZVdiApLmc7XG4jZW5kaWZcbiI7
CisKKwl2YXIgYWxwaGFtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0FMUEhBTUFQXG5c
dHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmXG4iOworCisJdmFyIGFscGhhdGVz
dF9mcmFnbWVudCA9ICIjaWZkZWYgQUxQSEFURVNUXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgPCBB
TFBIQVRFU1QgKSBkaXNjYXJkO1xuI2VuZGlmXG4iOworCisJdmFyIGFvbWFwX2ZyYWdtZW50ID0g
IiNpZmRlZiBVU0VfQU9NQVBcblx0ZmxvYXQgYW1iaWVudE9jY2x1c2lvbiA9ICggdGV4dHVyZTJE
KCBhb01hcCwgdlV2MiApLnIgLSAxLjAgKSAqIGFvTWFwSW50ZW5zaXR5ICsgMS4wO1xuXHRyZWZs
ZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gYW1iaWVudE9jY2x1c2lvbjtcblx0I2lmIGRl
ZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApXG5cdFx0ZmxvYXQgZG90
TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSAp
O1xuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKj0gY29tcHV0ZVNwZWN1bGFy
T2NjbHVzaW9uKCBkb3ROViwgYW1iaWVudE9jY2x1c2lvbiwgbWF0ZXJpYWwuc3BlY3VsYXJSb3Vn
aG5lc3MgKTtcblx0I2VuZGlmXG4jZW5kaWZcbiI7CisKKwl2YXIgYW9tYXBfcGFyc19mcmFnbWVu
dCA9ICIjaWZkZWYgVVNFX0FPTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwO1xuXHR1bmlm
b3JtIGZsb2F0IGFvTWFwSW50ZW5zaXR5O1xuI2VuZGlmIjsKKworCXZhciBiZWdpbl92ZXJ0ZXgg
PSAiXG52ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTtcbiI7CisKKwl2YXIgYmVn
aW5ub3JtYWxfdmVydGV4ID0gIlxudmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTtc
biI7CisKKwl2YXIgYnNkZnMgPSAiZmxvYXQgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRp
YW5jZUZhY3RvciggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQg
Y3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XG5cdGlmKCBk
ZWNheUV4cG9uZW50ID4gMC4wICkge1xuI2lmIGRlZmluZWQgKCBQSFlTSUNBTExZX0NPUlJFQ1Rf
TElHSFRTIClcblx0XHRmbG9hdCBkaXN0YW5jZUZhbGxvZmYgPSAxLjAgLyBtYXgoIHBvdyggbGln
aHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7XG5cdFx0ZmxvYXQgbWF4RGlzdGFu
Y2VDdXRvZmZGYWN0b3IgPSBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5j
ZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xuXHRcdHJldHVybiBkaXN0YW5jZUZhbGxvZmYgKiBt
YXhEaXN0YW5jZUN1dG9mZkZhY3RvcjtcbiNlbHNlXG5cdFx0cmV0dXJuIHBvdyggc2F0dXJhdGUo
IC1saWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCAp
O1xuI2VuZGlmXG5cdH1cblx0cmV0dXJuIDEuMDtcbn1cbnZlYzMgQlJERl9EaWZmdXNlX0xhbWJl
cnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xuXHRyZXR1cm4gUkVDSVBST0NBTF9Q
SSAqIGRpZmZ1c2VDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrKCBjb25zdCBpbiB2ZWMzIHNwZWN1
bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IGRvdExIICkge1xuXHRmbG9hdCBmcmVzbmVsID0gZXhw
MiggKCAtNS41NTQ3MyAqIGRvdExIIC0gNi45ODMxNiApICogZG90TEggKTtcblx0cmV0dXJuICgg
MS4wIC0gc3BlY3VsYXJDb2xvciApICogZnJlc25lbCArIHNwZWN1bGFyQ29sb3I7XG59XG5mbG9h
dCBHX0dHWF9TbWl0aCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5M
LCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcblx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xu
XHRmbG9hdCBnbCA9IGRvdE5MICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3RO
TCApICk7XG5cdGZsb2F0IGd2ID0gZG90TlYgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBv
dzIoIGRvdE5WICkgKTtcblx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xufVxuZmxvYXQgR19H
R1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQg
ZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhh
ICk7XG5cdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIo
IGRvdE5WICkgKTtcblx0ZmxvYXQgZ2wgPSBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiAp
ICogcG93MiggZG90TkwgKSApO1xuXHRyZXR1cm4gMC41IC8gbWF4KCBndiArIGdsLCBFUFNJTE9O
ICk7XG59XG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0
IGRvdE5IICkge1xuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGRlbm9tID0g
cG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDtcblx0cmV0dXJuIFJFQ0lQUk9DQUxf
UEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYKCBjb25z
dCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRl
eHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQg
cm91Z2huZXNzICkge1xuXHRmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApO1xuXHR2ZWMz
IGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgZ2VvbWV0cnku
dmlld0RpciApO1xuXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1h
bCwgaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRl
KCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdGZsb2F0IGRv
dE5IID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcblx0Zmxv
YXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRp
ciApICk7XG5cdHZlYzMgRiA9IEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0
ZmxvYXQgRyA9IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xu
XHRmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQg
KTtcbn1cbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29u
c3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRjb25zdCBmbG9hdCBMVVRfU0laRSAgPSA2NC4w
O1xuXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgPSAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0la
RTtcblx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgID0gMC41IC8gTFVUX1NJWkU7XG5cdGZsb2F0IHRo
ZXRhID0gYWNvcyggZG90KCBOLCBWICkgKTtcblx0dmVjMiB1diA9IHZlYzIoXG5cdFx0c3FydCgg
c2F0dXJhdGUoIHJvdWdobmVzcyApICksXG5cdFx0c2F0dXJhdGUoIHRoZXRhIC8gKCAwLjUgKiBQ
SSApICkgKTtcblx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xuXHRyZXR1cm4gdXY7
XG59XG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiAp
IHtcblx0ZmxvYXQgbCA9IGxlbmd0aCggZiApO1xuXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56
ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XG59XG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3Rv
ciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcblx0ZmxvYXQgeCA9IGRv
dCggdjEsIHYyICk7XG5cdGZsb2F0IHkgPSBhYnMoIHggKTtcblx0ZmxvYXQgYSA9IDAuODYyNjcg
KyAoMC40OTc4OCArIDAuMDE0MzYgKiB5ICkgKiB5O1xuXHRmbG9hdCBiID0gMy40NTA2OCArICg0
LjE4ODE0ICsgeSkgKiB5O1xuXHRmbG9hdCB2ID0gYSAvIGI7XG5cdGZsb2F0IHRoZXRhX3NpbnRo
ZXRhID0gKHggPiAwLjApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCAxLjAgLSB4ICogeCApIC0g
djtcblx0cmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhO1xufVxudmVjMyBM
VENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2
ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0g
KSB7XG5cdHZlYzMgdjEgPSByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZl
YzMgdjIgPSByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgbGlnaHRO
b3JtYWwgPSBjcm9zcyggdjEsIHYyICk7XG5cdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVj
dENvb3Jkc1sgMCBdICkgPCAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XG5cdHZlYzMgVDEsIFQy
O1xuXHRUMSA9IG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xuXHRUMiA9IC0gY3Jv
c3MoIE4sIFQxICk7XG5cdG1hdDMgbWF0ID0gbUludiAqIHRyYW5zcG9zZSggbWF0MyggVDEsIFQy
LCBOICkgKTtcblx0dmVjMyBjb29yZHNbIDQgXTtcblx0Y29vcmRzWyAwIF0gPSBtYXQgKiAoIHJl
Y3RDb29yZHNbIDAgXSAtIFAgKTtcblx0Y29vcmRzWyAxIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNb
IDEgXSAtIFAgKTtcblx0Y29vcmRzWyAyIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDIgXSAtIFAg
KTtcblx0Y29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTtcblx0Y29v
cmRzWyAwIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMCBdICk7XG5cdGNvb3Jkc1sgMSBdID0gbm9y
bWFsaXplKCBjb29yZHNbIDEgXSApO1xuXHRjb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRz
WyAyIF0gKTtcblx0Y29vcmRzWyAzIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMyBdICk7XG5cdHZl
YzMgdmVjdG9yRm9ybUZhY3RvciA9IHZlYzMoIDAuMCApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICs9
IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7XG5c
dHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDEg
XSwgY29vcmRzWyAyIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZv
cm1GYWN0b3IoIGNvb3Jkc1sgMiBdLCBjb29yZHNbIDMgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9y
ICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7
XG5cdHZlYzMgcmVzdWx0ID0gdmVjMyggTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0
b3JGb3JtRmFjdG9yICkgKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbnZlYzMgQlJERl9TcGVjdWxh
cl9HR1hfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNv
bnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xu
XHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnku
dmlld0RpciApICk7XG5cdGNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAu
NTcyLCAwLjAyMiApO1xuXHRjb25zdCB2ZWM0IGMxID0gdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAt
IDAuMDQgKTtcblx0dmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTtcblx0ZmxvYXQgYTAwNCA9
IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XG5c
dHZlYzIgQUIgPSB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XG5cdHJldHVybiBz
cGVjdWxhckNvbG9yICogQUIueCArIEFCLnk7XG59XG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGlj
aXQoICkge1xuXHRyZXR1cm4gMC4yNTtcbn1cbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4g
ZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcblx0cmV0dXJuIFJFQ0lQ
Uk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmlu
ZXNzICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRl
bnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5
LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyAp
IHtcblx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiAr
IGdlb21ldHJ5LnZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBnZW9t
ZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3Qo
IGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hs
aWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHID0gR19CbGlublBob25nX0lt
cGxpY2l0KCApO1xuXHRmbG9hdCBEID0gRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7
XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxuZmxvYXQgR0dYUm91Z2huZXNzVG9CbGlubkV4
cG9uZW50KCBjb25zdCBpbiBmbG9hdCBnZ3hSb3VnaG5lc3MgKSB7XG5cdHJldHVybiAoIDIuMCAv
IHBvdzIoIGdneFJvdWdobmVzcyArIDAuMDAwMSApIC0gMi4wICk7XG59XG5mbG9hdCBCbGlubkV4
cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XG5c
dHJldHVybiBzcXJ0KCAyLjAgLyAoIGJsaW5uRXhwb25lbnQgKyAyLjAgKSApO1xufVxuIjsKKwor
CXZhciBidW1wbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9CVU1QTUFQXG5cdHVuaWZv
cm0gc2FtcGxlcjJEIGJ1bXBNYXA7XG5cdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xuXHR2ZWMy
IGRIZHh5X2Z3ZCgpIHtcblx0XHR2ZWMyIGRTVGR4ID0gZEZkeCggdlV2ICk7XG5cdFx0dmVjMiBk
U1RkeSA9IGRGZHkoIHZVdiApO1xuXHRcdGZsb2F0IEhsbCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUy
RCggYnVtcE1hcCwgdlV2ICkueDtcblx0XHRmbG9hdCBkQnggPSBidW1wU2NhbGUgKiB0ZXh0dXJl
MkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcblx0XHRmbG9hdCBkQnkgPSBidW1w
U2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcblx0XHRy
ZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcblx0fVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZl
YzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xuXHRcdHZlYzMgdlNp
Z21hWCA9IHZlYzMoIGRGZHgoIHN1cmZfcG9zLnggKSwgZEZkeCggc3VyZl9wb3MueSApLCBkRmR4
KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZTaWdtYVkgPSB2ZWMzKCBkRmR5KCBzdXJmX3Bv
cy54ICksIGRGZHkoIHN1cmZfcG9zLnkgKSwgZEZkeSggc3VyZl9wb3MueiApICk7XG5cdFx0dmVj
MyB2TiA9IHN1cmZfbm9ybTtcblx0XHR2ZWMzIFIxID0gY3Jvc3MoIHZTaWdtYVksIHZOICk7XG5c
dFx0dmVjMyBSMiA9IGNyb3NzKCB2TiwgdlNpZ21hWCApO1xuXHRcdGZsb2F0IGZEZXQgPSBkb3Qo
IHZTaWdtYVgsIFIxICk7XG5cdFx0dmVjMyB2R3JhZCA9IHNpZ24oIGZEZXQgKSAqICggZEhkeHku
eCAqIFIxICsgZEhkeHkueSAqIFIyICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0
ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xuXHR9XG4jZW5kaWZcbiI7CisKKwl2YXIgY2xpcHBp
bmdfcGxhbmVzX2ZyYWdtZW50ID0gIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxuXHRmb3Ig
KCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7ICsrIGkgKSB7XG5cdFx0dmVj
NCBwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0aWYgKCBkb3QoIHZWaWV3UG9zaXRp
b24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApIGRpc2NhcmQ7XG5cdH1cblx0XHRcblx0I2lmIFVO
SU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVNcblx0XHRib29sIGNsaXBw
ZWQgPSB0cnVlO1xuXHRcdGZvciAoIGludCBpID0gVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIDwg
TlVNX0NMSVBQSU5HX1BMQU5FUzsgKysgaSApIHtcblx0XHRcdHZlYzQgcGxhbmUgPSBjbGlwcGlu
Z1BsYW5lc1sgaSBdO1xuXHRcdFx0Y2xpcHBlZCA9ICggZG90KCB2Vmlld1Bvc2l0aW9uLCBwbGFu
ZS54eXogKSA+IHBsYW5lLncgKSAmJiBjbGlwcGVkO1xuXHRcdH1cblx0XHRpZiAoIGNsaXBwZWQg
KSBkaXNjYXJkO1xuXHRcblx0I2VuZGlmXG4jZW5kaWZcbiI7CisKKwl2YXIgY2xpcHBpbmdfcGxh
bmVzX3BhcnNfZnJhZ21lbnQgPSAiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5cdCNpZiAh
IGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXG5cdFx0dmFyeWluZyB2
ZWMzIHZWaWV3UG9zaXRpb247XG5cdCNlbmRpZlxuXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFu
ZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcbiNlbmRpZlxuIjsKKworCXZhciBjbGlwcGluZ19w
bGFuZXNfcGFyc192ZXJ0ZXggPSAiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwICYmICEgZGVm
aW5lZCggUEhZU0lDQUwgKSAmJiAhIGRlZmluZWQoIFBIT05HIClcblx0dmFyeWluZyB2ZWMzIHZW
aWV3UG9zaXRpb247XG4jZW5kaWZcbiI7CisKKwl2YXIgY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCA9
ICIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAgJiYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYm
ICEgZGVmaW5lZCggUEhPTkcgKVxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtc
biNlbmRpZlxuIjsKKworCXZhciBjb2xvcl9mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0NPTE9SXG5c
dGRpZmZ1c2VDb2xvci5yZ2IgKj0gdkNvbG9yO1xuI2VuZGlmIjsKKworCXZhciBjb2xvcl9wYXJz
X2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNl
bmRpZlxuIjsKKworCXZhciBjb2xvcl9wYXJzX3ZlcnRleCA9ICIjaWZkZWYgVVNFX0NPTE9SXG5c
dHZhcnlpbmcgdmVjMyB2Q29sb3I7XG4jZW5kaWYiOworCisJdmFyIGNvbG9yX3ZlcnRleCA9ICIj
aWZkZWYgVVNFX0NPTE9SXG5cdHZDb2xvci54eXogPSBjb2xvci54eXo7XG4jZW5kaWYiOworCisJ
dmFyIGNvbW1vbiA9ICIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTlcbiNkZWZpbmUgUEkyIDYuMjgz
MTg1MzA3MThcbiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDlcbiNkZWZpbmUgUkVDSVBS
T0NBTF9QSSAwLjMxODMwOTg4NjE4XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRc
biNkZWZpbmUgTE9HMiAxLjQ0MjY5NVxuI2RlZmluZSBFUFNJTE9OIDFlLTZcbiNkZWZpbmUgc2F0
dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcbiNkZWZpbmUgd2hpdGVDb21wbGltZW50KGEp
ICggMS4wIC0gc2F0dXJhdGUoIGEgKSApXG5mbG9hdCBwb3cyKCBjb25zdCBpbiBmbG9hdCB4ICkg
eyByZXR1cm4geCp4OyB9XG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4g
eCp4Kng7IH1cbmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyID0geCp4
OyByZXR1cm4geDIqeDI7IH1cbmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7
IHJldHVybiBkb3QoIGNvbG9yLCB2ZWMzKCAwLjMzMzMgKSApOyB9XG5oaWdocCBmbG9hdCByYW5k
KCBjb25zdCBpbiB2ZWMyIHV2ICkge1xuXHRjb25zdCBoaWdocCBmbG9hdCBhID0gMTIuOTg5OCwg
YiA9IDc4LjIzMywgYyA9IDQzNzU4LjU0NTM7XG5cdGhpZ2hwIGZsb2F0IGR0ID0gZG90KCB1di54
eSwgdmVjMiggYSxiICkgKSwgc24gPSBtb2QoIGR0LCBQSSApO1xuXHRyZXR1cm4gZnJhY3Qoc2lu
KHNuKSAqIGMpO1xufVxuc3RydWN0IEluY2lkZW50TGlnaHQge1xuXHR2ZWMzIGNvbG9yO1xuXHR2
ZWMzIGRpcmVjdGlvbjtcblx0Ym9vbCB2aXNpYmxlO1xufTtcbnN0cnVjdCBSZWZsZWN0ZWRMaWdo
dCB7XG5cdHZlYzMgZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBkaXJlY3RTcGVjdWxhcjtcblx0dmVj
MyBpbmRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcbn07XG5zdHJ1Y3Qg
R2VvbWV0cmljQ29udGV4dCB7XG5cdHZlYzMgcG9zaXRpb247XG5cdHZlYzMgbm9ybWFsO1xuXHR2
ZWMzIHZpZXdEaXI7XG59O1xudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBp
biBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBk
aXIsIDAuMCApICkueHl6ICk7XG59XG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGlu
IHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0
KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7XG59XG52ZWMzIHByb2plY3RPblBsYW5lKGlu
IHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkg
e1xuXHRmbG9hdCBkaXN0YW5jZSA9IGRvdCggcGxhbmVOb3JtYWwsIHBvaW50IC0gcG9pbnRPblBs
YW5lICk7XG5cdHJldHVybiAtIGRpc3RhbmNlICogcGxhbmVOb3JtYWwgKyBwb2ludDtcbn1cbmZs
b2F0IHNpZGVPZlBsYW5lKCBpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4g
dmVjMyBwbGFuZU5vcm1hbCApIHtcblx0cmV0dXJuIHNpZ24oIGRvdCggcG9pbnQgLSBwb2ludE9u
UGxhbmUsIHBsYW5lTm9ybWFsICkgKTtcbn1cbnZlYzMgbGluZVBsYW5lSW50ZXJzZWN0KCBpbiB2
ZWMzIHBvaW50T25MaW5lLCBpbiB2ZWMzIGxpbmVEaXJlY3Rpb24sIGluIHZlYzMgcG9pbnRPblBs
YW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1cm4gbGluZURpcmVjdGlvbiAqICgg
ZG90KCBwbGFuZU5vcm1hbCwgcG9pbnRPblBsYW5lIC0gcG9pbnRPbkxpbmUgKSAvIGRvdCggcGxh
bmVOb3JtYWwsIGxpbmVEaXJlY3Rpb24gKSApICsgcG9pbnRPbkxpbmU7XG59XG5tYXQzIHRyYW5z
cG9zZSggY29uc3QgaW4gbWF0MyB2ICkge1xuXHRtYXQzIHRtcDtcblx0dG1wWzBdID0gdmVjMyh2
WzBdLngsIHZbMV0ueCwgdlsyXS54KTtcblx0dG1wWzFdID0gdmVjMyh2WzBdLnksIHZbMV0ueSwg
dlsyXS55KTtcblx0dG1wWzJdID0gdmVjMyh2WzBdLnosIHZbMV0ueiwgdlsyXS56KTtcblx0cmV0
dXJuIHRtcDtcbn1cbiI7CisKKwl2YXIgY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50ID0gIiNp
ZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXG4jZGVmaW5lIGN1YmVVVl90ZXh0dXJlU2l6ZSAoMTAy
NC4wKVxuaW50IGdldEZhY2VGcm9tRGlyZWN0aW9uKHZlYzMgZGlyZWN0aW9uKSB7XG5cdHZlYzMg
YWJzRGlyZWN0aW9uID0gYWJzKGRpcmVjdGlvbik7XG5cdGludCBmYWNlID0gLTE7XG5cdGlmKCBh
YnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56ICkge1xuXHRcdGlmKGFic0RpcmVjdGlvbi54
ID4gYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi54ID4gMC4wID8gMCA6
IDM7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMSA6IDQ7XG5c
dH1cblx0ZWxzZSB7XG5cdFx0aWYoYWJzRGlyZWN0aW9uLnogPiBhYnNEaXJlY3Rpb24ueSApXG5c
dFx0XHRmYWNlID0gZGlyZWN0aW9uLnogPiAwLjAgPyAyIDogNTtcblx0XHRlbHNlXG5cdFx0XHRm
YWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxIDogNDtcblx0fVxuXHRyZXR1cm4gZmFjZTtcbn1c
biNkZWZpbmUgY3ViZVVWX21heExvZHMxICAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkg
LSAxLjApXG4jZGVmaW5lIGN1YmVVVl9yYW5nZUNsYW1wIChleHAyKCg2LjAgLSAxLjApICogMi4w
KSlcbnZlYzIgTWlwTGV2ZWxJbmZvKCB2ZWMzIHZlYywgZmxvYXQgcm91Z2huZXNzTGV2ZWwsIGZs
b2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgc2NhbGUgPSBleHAyKGN1YmVVVl9tYXhMb2RzMSAt
IHJvdWdobmVzc0xldmVsKTtcblx0ZmxvYXQgZHhSb3VnaG5lc3MgPSBkRmR4KHJvdWdobmVzcyk7
XG5cdGZsb2F0IGR5Um91Z2huZXNzID0gZEZkeShyb3VnaG5lc3MpO1xuXHR2ZWMzIGR4ID0gZEZk
eCggdmVjICogc2NhbGUgKiBkeFJvdWdobmVzcyApO1xuXHR2ZWMzIGR5ID0gZEZkeSggdmVjICog
c2NhbGUgKiBkeVJvdWdobmVzcyApO1xuXHRmbG9hdCBkID0gbWF4KCBkb3QoIGR4LCBkeCApLCBk
b3QoIGR5LCBkeSApICk7XG5cdGQgPSBjbGFtcChkLCAxLjAsIGN1YmVVVl9yYW5nZUNsYW1wKTtc
blx0ZmxvYXQgbWlwTGV2ZWwgPSAwLjUgKiBsb2cyKGQpO1xuXHRyZXR1cm4gdmVjMihmbG9vciht
aXBMZXZlbCksIGZyYWN0KG1pcExldmVsKSk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMiAo
bG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAyLjApXG4jZGVmaW5lIGN1YmVVVl9yY3BU
ZXh0dXJlU2l6ZSAoMS4wIC8gY3ViZVVWX3RleHR1cmVTaXplKVxudmVjMiBnZXRDdWJlVVYodmVj
MyBkaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCBtaXBMZXZlbCkge1xuXHRt
aXBMZXZlbCA9IHJvdWdobmVzc0xldmVsID4gY3ViZVVWX21heExvZHMyIC0gMy4wID8gMC4wIDog
bWlwTGV2ZWw7XG5cdGZsb2F0IGEgPSAxNi4wICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2
ZWMyIGV4cDJfcGFja2VkID0gZXhwMiggdmVjMiggcm91Z2huZXNzTGV2ZWwsIG1pcExldmVsICkg
KTtcblx0dmVjMiByY3BfZXhwMl9wYWNrZWQgPSB2ZWMyKCAxLjAgKSAvIGV4cDJfcGFja2VkO1xu
XHRmbG9hdCBwb3dTY2FsZSA9IGV4cDJfcGFja2VkLnggKiBleHAyX3BhY2tlZC55O1xuXHRmbG9h
dCBzY2FsZSA9IHJjcF9leHAyX3BhY2tlZC54ICogcmNwX2V4cDJfcGFja2VkLnkgKiAwLjI1O1xu
XHRmbG9hdCBtaXBPZmZzZXQgPSAwLjc1KigxLjAgLSByY3BfZXhwMl9wYWNrZWQueSkgKiByY3Bf
ZXhwMl9wYWNrZWQueDtcblx0Ym9vbCBiUmVzID0gbWlwTGV2ZWwgPT0gMC4wO1xuXHRzY2FsZSA9
ICBiUmVzICYmIChzY2FsZSA8IGEpID8gYSA6IHNjYWxlO1xuXHR2ZWMzIHI7XG5cdHZlYzIgb2Zm
c2V0O1xuXHRpbnQgZmFjZSA9IGdldEZhY2VGcm9tRGlyZWN0aW9uKGRpcmVjdGlvbik7XG5cdGZs
b2F0IHJjcFBvd1NjYWxlID0gMS4wIC8gcG93U2NhbGU7XG5cdGlmKCBmYWNlID09IDApIHtcblx0
XHRyID0gdmVjMyhkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSk7XG5cdFx0
b2Zmc2V0ID0gdmVjMigwLjArbWlwT2Zmc2V0LDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zm
c2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxu
XHRlbHNlIGlmKCBmYWNlID09IDEpIHtcblx0XHRyID0gdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0
aW9uLngsIGRpcmVjdGlvbi56KTtcblx0XHRvZmZzZXQgPSB2ZWMyKHNjYWxlK21pcE9mZnNldCwg
MC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwg
Mi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgPT0gMikge1xuXHRc
dHIgPSB2ZWMzKGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9m
ZnNldCA9IHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0
XHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gYSA6IG9mZnNldC55O1xu
XHR9XG5cdGVsc2UgaWYoIGZhY2UgPT0gMykge1xuXHRcdHIgPSB2ZWMzKGRpcmVjdGlvbi54LCBk
aXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCA9IHZlYzIoMC4wK21pcE9mZnNl
dCwwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8
IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgPT0gNCkge1xu
XHRcdHIgPSB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56KTtcblx0
XHRvZmZzZXQgPSB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRc
dG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtc
blx0fVxuXHRlbHNlIHtcblx0XHRyID0gdmVjMyhkaXJlY3Rpb24ueiwgLWRpcmVjdGlvbi54LCBk
aXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0ID0gdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjUg
KiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCph
KSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdHIgPSBub3JtYWxpemUocik7XG5cdGZsb2F0IHRl
eGVsT2Zmc2V0ID0gMC41ICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2ZWMyIHMgPSAoIHIu
eXogLyBhYnMoIHIueCApICsgdmVjMiggMS4wICkgKSAqIDAuNTtcblx0dmVjMiBiYXNlID0gb2Zm
c2V0ICsgdmVjMiggdGV4ZWxPZmZzZXQgKTtcblx0cmV0dXJuIGJhc2UgKyBzICogKCBzY2FsZSAt
IDIuMCAqIHRleGVsT2Zmc2V0ICk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMyAobG9nMihj
dWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAzLjApXG52ZWM0IHRleHR1cmVDdWJlVVYodmVjMyBy
ZWZsZWN0ZWREaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgcm91Z2huZXNz
VmFsID0gcm91Z2huZXNzKiBjdWJlVVZfbWF4TG9kczM7XG5cdGZsb2F0IHIxID0gZmxvb3Iocm91
Z2huZXNzVmFsKTtcblx0ZmxvYXQgcjIgPSByMSArIDEuMDtcblx0ZmxvYXQgdCA9IGZyYWN0KHJv
dWdobmVzc1ZhbCk7XG5cdHZlYzIgbWlwSW5mbyA9IE1pcExldmVsSW5mbyhyZWZsZWN0ZWREaXJl
Y3Rpb24sIHIxLCByb3VnaG5lc3MpO1xuXHRmbG9hdCBzID0gbWlwSW5mby55O1xuXHRmbG9hdCBs
ZXZlbDAgPSBtaXBJbmZvLng7XG5cdGZsb2F0IGxldmVsMSA9IGxldmVsMCArIDEuMDtcblx0bGV2
ZWwxID0gbGV2ZWwxID4gNS4wID8gNS4wIDogbGV2ZWwxO1xuXHRsZXZlbDAgKz0gbWluKCBmbG9v
ciggcyArIDAuNSApLCA1LjAgKTtcblx0dmVjMiB1dl8xMCA9IGdldEN1YmVVVihyZWZsZWN0ZWRE
aXJlY3Rpb24sIHIxLCBsZXZlbDApO1xuXHR2ZWM0IGNvbG9yMTAgPSBlbnZNYXBUZXhlbFRvTGlu
ZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzEwKSk7XG5cdHZlYzIgdXZfMjAgPSBnZXRDdWJlVVYo
cmVmbGVjdGVkRGlyZWN0aW9uLCByMiwgbGV2ZWwwKTtcblx0dmVjNCBjb2xvcjIwID0gZW52TWFw
VGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8yMCkpO1xuXHR2ZWM0IHJlc3VsdCA9
IG1peChjb2xvcjEwLCBjb2xvcjIwLCB0KTtcblx0cmV0dXJuIHZlYzQocmVzdWx0LnJnYiwgMS4w
KTtcbn1cbiNlbmRpZlxuIjsKKworCXZhciBkZWZhdWx0bm9ybWFsX3ZlcnRleCA9ICJ2ZWMzIHRy
YW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTWF0cml4ICogb2JqZWN0Tm9ybWFsO1xuI2lmZGVmIEZM
SVBfU0lERURcblx0dHJhbnNmb3JtZWROb3JtYWwgPSAtIHRyYW5zZm9ybWVkTm9ybWFsO1xuI2Vu
ZGlmXG4iOworCisJdmFyIGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCA9ICIjaWZkZWYgVVNF
X0RJU1BMQUNFTUVOVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXNwbGFjZW1lbnRNYXA7XG5c
dHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50U2NhbGU7XG5cdHVuaWZvcm0gZmxvYXQgZGlzcGxh
Y2VtZW50QmlhcztcbiNlbmRpZlxuIjsKKworCXZhciBkaXNwbGFjZW1lbnRtYXBfdmVydGV4ID0g
IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSgg
b2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB1diApLnggKiBk
aXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTtcbiNlbmRpZlxuIjsKKworCXZh
ciBlbWlzc2l2ZW1hcF9mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHZlYzQg
ZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xuXHRlbWlzc2l2
ZUNvbG9yLnJnYiA9IGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJn
Yjtcblx0dG90YWxFbWlzc2l2ZVJhZGlhbmNlICo9IGVtaXNzaXZlQ29sb3IucmdiO1xuI2VuZGlm
XG4iOworCisJdmFyIGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9FTUlT
U0lWRU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcbiNlbmRpZlxuIjsKKwor
CXZhciBlbmNvZGluZ3NfZnJhZ21lbnQgPSAiICBnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1
dFRleGVsKCBnbF9GcmFnQ29sb3IgKTtcbiI7CisKKwl2YXIgZW5jb2RpbmdzX3BhcnNfZnJhZ21l
bnQgPSAiXG52ZWM0IExpbmVhclRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4g
dmFsdWU7XG59XG52ZWM0IEdhbW1hVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdh
bW1hRmFjdG9yICkge1xuXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS54eXosIHZlYzMoIGdhbW1h
RmFjdG9yICkgKSwgdmFsdWUudyApO1xufVxudmVjNCBMaW5lYXJUb0dhbW1hKCBpbiB2ZWM0IHZh
bHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcblx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUu
eHl6LCB2ZWMzKCAxLjAgLyBnYW1tYUZhY3RvciApICksIHZhbHVlLncgKTtcbn1cbnZlYzQgc1JH
QlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZh
bHVlLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQg
KSApLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVl
LnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB2YWx1ZS53ICk7XG59XG52ZWM0IExpbmVhclRv
c1JHQiggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5y
Z2IsIHZlYzMoIDAuNDE2NjYgKSApICogMS4wNTUgLSB2ZWMzKCAwLjA1NSApLCB2YWx1ZS5yZ2Ig
KiAxMi45MiwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjAwMzEzMDgg
KSApICkgKSwgdmFsdWUudyApO1xufVxudmVjNCBSR0JFVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUg
KSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiBleHAyKCB2YWx1ZS5hICogMjU1LjAgLSAx
MjguMCApLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JFKCBpbiB2ZWM0IHZhbHVlICkge1xu
XHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgoIG1heCggdmFsdWUuciwgdmFsdWUuZyApLCB2YWx1
ZS5iICk7XG5cdGZsb2F0IGZFeHAgPSBjbGFtcCggY2VpbCggbG9nMiggbWF4Q29tcG9uZW50ICkg
KSwgLTEyOC4wLCAxMjcuMCApO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gZXhwMiggZkV4
cCApLCAoIGZFeHAgKyAxMjguMCApIC8gMjU1LjAgKTtcbn1cbnZlYzQgUkdCTVRvTGluZWFyKCBp
biB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVl
Lnh5eiAqIHZhbHVlLncgKiBtYXhSYW5nZSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCTSgg
aW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdGZsb2F0IG1heFJHQiA9IG1h
eCggdmFsdWUueCwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcblx0ZmxvYXQgTSAgICAgID0g
Y2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xuXHRNICAgICAgICAgICAgPSBj
ZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBN
ICogbWF4UmFuZ2UgKSwgTSApO1xufVxudmVjNCBSR0JEVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUs
IGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1h
eFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdC
RCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdGZsb2F0IG1heFJHQiA9
IG1heCggdmFsdWUueCwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcblx0ZmxvYXQgRCAgICAg
ID0gbWF4KCBtYXhSYW5nZSAvIG1heFJHQiwgMS4wICk7XG5cdEQgICAgICAgICAgICA9IG1pbigg
Zmxvb3IoIEQgKSAvIDI1NS4wLCAxLjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICgg
RCAqICggMjU1LjAgLyBtYXhSYW5nZSApICksIEQgKTtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dk0g
PSBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAw
LjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XG52ZWM0IExpbmVhclRvTG9nTHV2KCBpbiB2ZWM0IHZh
bHVlICkgIHtcblx0dmVjMyBYcF9ZX1hZWnAgPSB2YWx1ZS5yZ2IgKiBjTG9nTHV2TTtcblx0WHBf
WV9YWVpwID0gbWF4KFhwX1lfWFlacCwgdmVjMygxZS02LCAxZS02LCAxZS02KSk7XG5cdHZlYzQg
dlJlc3VsdDtcblx0dlJlc3VsdC54eSA9IFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xuXHRm
bG9hdCBMZSA9IDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XG5cdHZSZXN1bHQudyA9
IGZyYWN0KExlKTtcblx0dlJlc3VsdC56ID0gKExlIC0gKGZsb29yKHZSZXN1bHQudyoyNTUuMCkp
LzI1NS4wKS8yNTUuMDtcblx0cmV0dXJuIHZSZXN1bHQ7XG59XG5jb25zdCBtYXQzIGNMb2dMdXZJ
bnZlcnNlTSA9IG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5
LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xudmVjNCBMb2dMdXZUb0xpbmVh
ciggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgTGUgPSB2YWx1ZS56ICogMjU1LjAgKyB2YWx1
ZS53O1xuXHR2ZWMzIFhwX1lfWFlacDtcblx0WHBfWV9YWVpwLnkgPSBleHAyKChMZSAtIDEyNy4w
KSAvIDIuMCk7XG5cdFhwX1lfWFlacC56ID0gWHBfWV9YWVpwLnkgLyB2YWx1ZS55O1xuXHRYcF9Z
X1hZWnAueCA9IHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcblx0dmVjMyB2UkdCID0gWHBfWV9YWVpw
LnJnYiAqIGNMb2dMdXZJbnZlcnNlTTtcblx0cmV0dXJuIHZlYzQoIG1heCh2UkdCLCAwLjApLCAx
LjAgKTtcbn1cbiI7CisKKwl2YXIgZW52bWFwX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRU5WTUFQ
XG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAg
KSB8fCBkZWZpbmVkKCBQSE9ORyApXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6
ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdHZlYzMgd29ybGROb3Jt
YWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0
XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0g
cmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRc
dHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwg
cmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdCNlbHNlXG5cdFx0dmVjMyByZWZsZWN0
VmVjID0gdlJlZmxlY3Q7XG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRc
dHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBmbGlwTm9ybWFsICogdmVjMygg
ZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7XG5cdCNlbGlmIGRl
ZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdHZlYzIgc2FtcGxlVVY7XG5cdFx0c2Ft
cGxlVVYueSA9IGFzaW4oIGZsaXBOb3JtYWwgKiByZWZsZWN0VmVjLnkgKSAqIFJFQ0lQUk9DQUxf
UEkgKyAwLjU7XG5cdFx0c2FtcGxlVVYueCA9IGF0YW4oIGZsaXBOb3JtYWwgKiByZWZsZWN0VmVj
LnosIGZsaXBOb3JtYWwgKiByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xu
XHRcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgc2FtcGxlVVYgKTtcblx0I2Vs
aWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfU1BIRVJFIClcblx0XHR2ZWMzIHJlZmxlY3RWaWV3ID0g
ZmxpcE5vcm1hbCAqIG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywg
MC4wICkgKS54eXogKyB2ZWMzKCAwLjAsIDAuMCwgMS4wICkgKTtcblx0XHR2ZWM0IGVudkNvbG9y
ID0gdGV4dHVyZTJEKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41ICk7XG5cdCNl
bHNlXG5cdFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xuXHQjZW5kaWZcblx0ZW52Q29s
b3IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZDb2xvciApO1xuXHQjaWZkZWYgRU5WTUFQX0JM
RU5ESU5HX01VTFRJUExZXG5cdFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwg
b3V0Z29pbmdMaWdodCAqIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rp
dml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfTUlYIClcblx0XHRvdXRn
b2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBlbnZDb2xvci54eXosIHNwZWN1bGFyU3Ry
ZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5H
X0FERCApXG5cdFx0b3V0Z29pbmdMaWdodCArPSBlbnZDb2xvci54eXogKiBzcGVjdWxhclN0cmVu
Z3RoICogcmVmbGVjdGl2aXR5O1xuXHQjZW5kaWZcbiNlbmRpZlxuIjsKKworCXZhciBlbnZtYXBf
cGFyc19mcmFnbWVudCA9ICIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIFBI
WVNJQ0FMIClcblx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XG5cdHVuaWZvcm0gZmxvYXQg
ZW52TWFwSW50ZW5zaXR5O1xuI2VuZGlmXG4jaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWYgISBkZWZp
bmVkKCBQSFlTSUNBTCApICYmICggZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBV
U0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKSApXG5cdFx0dmFyeWluZyB2ZWMzIHZX
b3JsZFBvc2l0aW9uO1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR1
bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIHNhbXBsZXIy
RCBlbnZNYXA7XG5cdCNlbmRpZlxuXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XG5cdCNpZiBk
ZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZp
bmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIFBIWVNJQ0FMIClcblx0XHR1bmlmb3JtIGZsb2F0IHJl
ZnJhY3Rpb25SYXRpbztcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdCNl
bmRpZlxuI2VuZGlmXG4iOworCisJdmFyIGVudm1hcF9wYXJzX3ZlcnRleCA9ICIjaWZkZWYgVVNF
X0VOVk1BUFxuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9S
TUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3Np
dGlvbjtcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdFx0dW5pZm9ybSBm
bG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuI2VuZGlmXG4iOworCisJdmFyIGVudm1h
cF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQ
ICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcblx0XHR2
V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xuXHQjZWxzZVxuXHRcdHZlYzMgY2Ft
ZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRp
b24gKTtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbigg
dHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVf
UkVGTEVDVElPTlxuXHRcdFx0dlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29y
bGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dlJlZmxlY3QgPSByZWZyYWN0KCBjYW1lcmFU
b1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQj
ZW5kaWZcbiNlbmRpZlxuIjsKKworCXZhciBmb2dfdmVydGV4ID0gIlxuI2lmZGVmIFVTRV9GT0dc
bmZvZ0RlcHRoID0gLW12UG9zaXRpb24uejtcbiNlbmRpZiI7CisKKwl2YXIgZm9nX3BhcnNfdmVy
dGV4ID0gIiNpZmRlZiBVU0VfRk9HXG4gIHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XG4jZW5kaWZc
biI7CisKKwl2YXIgZm9nX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRk9HXG5cdCNpZmRlZiBGT0df
RVhQMlxuXHRcdGZsb2F0IGZvZ0ZhY3RvciA9IHdoaXRlQ29tcGxpbWVudCggZXhwMiggLSBmb2dE
ZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKiBMT0cyICkgKTtcblx0
I2Vsc2Vcblx0XHRmbG9hdCBmb2dGYWN0b3IgPSBzbW9vdGhzdGVwKCBmb2dOZWFyLCBmb2dGYXIs
IGZvZ0RlcHRoICk7XG5cdCNlbmRpZlxuXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFn
Q29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XG4jZW5kaWZcbiI7CisKKwl2YXIgZm9n
X3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9GT0dcblx0dW5pZm9ybSB2ZWMzIGZvZ0NvbG9y
O1xuXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHR1bmlm
b3JtIGZsb2F0IGZvZ0RlbnNpdHk7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dOZWFy
O1xuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xuXHQjZW5kaWZcbiNlbmRpZlxuIjsKKworCXZh
ciBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBUT09OXG5cdHVuaWZvcm0gc2Ft
cGxlcjJEIGdyYWRpZW50TWFwO1xuXHR2ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBu
b3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7XG5cdFx0ZmxvYXQgZG90TkwgPSBkb3QoIG5v
cm1hbCwgbGlnaHREaXJlY3Rpb24gKTtcblx0XHR2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAw
LjUgKyAwLjUsIDAuMCApO1xuXHRcdCNpZmRlZiBVU0VfR1JBRElFTlRNQVBcblx0XHRcdHJldHVy
biB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnJnYjtcblx0XHQjZWxzZVxuXHRcdFx0
cmV0dXJuICggY29vcmQueCA8IDAuNyApID8gdmVjMyggMC43ICkgOiB2ZWMzKCAxLjAgKTtcblx0
XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4iOworCisJdmFyIGxpZ2h0bWFwX2ZyYWdtZW50ID0gIiNp
ZmRlZiBVU0VfTElHSFRNQVBcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IFBJ
ICogdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xu
I2VuZGlmXG4iOworCisJdmFyIGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9M
SUdIVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcblx0dW5pZm9ybSBmbG9hdCBs
aWdodE1hcEludGVuc2l0eTtcbiNlbmRpZiI7CisKKwl2YXIgbGlnaHRzX2xhbWJlcnRfdmVydGV4
ID0gInZlYzMgZGlmZnVzZSA9IHZlYzMoIDEuMCApO1xuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRy
eTtcbmdlb21ldHJ5LnBvc2l0aW9uID0gbXZQb3NpdGlvbi54eXo7XG5nZW9tZXRyeS5ub3JtYWwg
PSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5nZW9tZXRyeS52aWV3RGlyID0gbm9y
bWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcbkdlb21ldHJpY0NvbnRleHQgYmFja0dlb21ldHJ5
O1xuYmFja0dlb21ldHJ5LnBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XG5iYWNrR2VvbWV0
cnkubm9ybWFsID0gLWdlb21ldHJ5Lm5vcm1hbDtcbmJhY2tHZW9tZXRyeS52aWV3RGlyID0gZ2Vv
bWV0cnkudmlld0RpcjtcbnZMaWdodEZyb250ID0gdmVjMyggMC4wICk7XG4jaWZkZWYgRE9VQkxF
X1NJREVEXG5cdHZMaWdodEJhY2sgPSB2ZWMzKCAwLjAgKTtcbiNlbmRpZlxuSW5jaWRlbnRMaWdo
dCBkaXJlY3RMaWdodDtcbmZsb2F0IGRvdE5MO1xudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1
c2U7XG4jaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVN
X1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5j
ZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90Tkwg
PSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGly
ZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGln
aHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtc
blx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAt
ZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2Vu
ZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1f
U1BPVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSgg
c3BvdExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCA9IGRv
dCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RM
aWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZy
b250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRc
dCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3RO
TCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZc
biNpZiBOVU1fRElSX0xJR0hUUyA+IDBcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9M
SUdIVFM7IGkgKysgKSB7XG5cdFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2Uo
IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRv
dE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRc
dGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0
dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1
c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0
ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1c
biNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBcblx0Zm9yICggaW50IGkgPSAwOyBpIDwg
TlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdHZMaWdodEZyb250ICs9IGdldEhlbWlzcGhl
cmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0
XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICs9IGdldEhlbWlzcGhlcmVM
aWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XG5c
dFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuIjsKKworCXZhciBsaWdodHNfcGFycyA9ICJ1bmlmb3Jt
IHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2Uo
IGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XG5cdHZlYzMgaXJyYWRpYW5jZSA9
IGFtYmllbnRMaWdodENvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNc
blx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59
XG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXG5cdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcblx0
XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGludCBzaGFkb3c7XG5cdFx0
ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFk
b3dNYXBTaXplO1xuXHR9O1xuXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxM
aWdodHNbIE5VTV9ESVJfTElHSFRTIF07XG5cdHZvaWQgZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdo
dElycmFkaWFuY2UoIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwg
Y29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGly
ZWN0TGlnaHQgKSB7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBkaXJlY3Rpb25hbExpZ2h0LmNv
bG9yO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0
aW9uO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xuXHR9XG4jZW5kaWZcbiNpZiBO
VU1fUE9JTlRfTElHSFRTID4gMFxuXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XG5cdFx0dmVjMyBwb3Np
dGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRl
Y2F5O1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBz
aGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHR9O1xuXHR1bmlmb3JtIFBv
aW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRQb2lu
dERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBj
b25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJl
Y3RMaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2Vv
bWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBs
VmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xu
XHRcdGRpcmVjdExpZ2h0LmNvbG9yID0gcG9pbnRMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdo
dC5jb2xvciAqPSBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdo
dERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XG5cdFx0
ZGlyZWN0TGlnaHQudmlzaWJsZSA9ICggZGlyZWN0TGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkg
KTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHRzdHJ1Y3QgU3BvdExp
Z2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMg
Y29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdFx0ZmxvYXQg
Y29uZUNvcztcblx0XHRmbG9hdCBwZW51bWJyYUNvcztcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZs
b2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93
TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1Rf
TElHSFRTIF07XG5cdHZvaWQgZ2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4g
U3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwg
b3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgICkge1xuXHRcdHZlYzMgbFZlY3RvciA9IHNw
b3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRp
cmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2Ug
PSBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBhbmdsZUNvcyA9IGRvdCggZGlyZWN0TGln
aHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0aWYgKCBhbmdsZUNvcyA+
IHNwb3RMaWdodC5jb25lQ29zICkge1xuXHRcdFx0ZmxvYXQgc3BvdEVmZmVjdCA9IHNtb290aHN0
ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7
XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciA9IHNwb3RMaWdodC5jb2xvcjtcblx0XHRcdGRpcmVj
dExpZ2h0LmNvbG9yICo9IHNwb3RFZmZlY3QgKiBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJh
ZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdo
dC5kZWNheSApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XG5cdFx0fSBlbHNl
IHtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yID0gdmVjMyggMC4wICk7XG5cdFx0XHRkaXJlY3RM
aWdodC52aXNpYmxlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUkVDVF9B
UkVBX0xJR0hUUyA+IDBcblx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xuXHRcdHZlYzMgY29sb3I7
XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZI
ZWlnaHQ7XG5cdH07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y01hdDtcdHVuaWZvcm0gc2FtcGxl
cjJEIGx0Y01hZztcblx0dW5pZm9ybSBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHRzWyBOVU1f
UkVDVF9BUkVBX0xJR0hUUyBdO1xuI2VuZGlmXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxuXHRz
dHJ1Y3QgSGVtaXNwaGVyZUxpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIHNr
eUNvbG9yO1xuXHRcdHZlYzMgZ3JvdW5kQ29sb3I7XG5cdH07XG5cdHVuaWZvcm0gSGVtaXNwaGVy
ZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdO1xuXHR2ZWMzIGdldEhl
bWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIEhlbWlzcGhlcmVMaWdodCBoZW1pTGln
aHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XG5cdFx0ZmxvYXQgZG90
TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGVtaUxpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGZs
b2F0IGhlbWlEaWZmdXNlV2VpZ2h0ID0gMC41ICogZG90TkwgKyAwLjU7XG5cdFx0dmVjMyBpcnJh
ZGlhbmNlID0gbWl4KCBoZW1pTGlnaHQuZ3JvdW5kQ29sb3IsIGhlbWlMaWdodC5za3lDb2xvciwg
aGVtaURpZmZ1c2VXZWlnaHQgKTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdI
VFNcblx0XHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIGlycmFk
aWFuY2U7XG5cdH1cbiNlbmRpZlxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVk
KCBQSFlTSUNBTCApXG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggY29u
c3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gaW50IG1heE1JUExldmVs
ICkge1xuXHRcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBn
ZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VC
RVxuXHRcdFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54
LCB3b3JsZE5vcm1hbC55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0
XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlWZWMs
IGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1h
cENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZl
bCApICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVs
VG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9U
WVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3
b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9
IHRleHR1cmVDdWJlVVYoIHF1ZXJ5VmVjLCAxLjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjNCBl
bnZNYXBDb2xvciA9IHZlYzQoIDAuMCApO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBQSSAqIGVu
dk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuXHRmbG9hdCBnZXRTcGVjdWxh
ck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBp
biBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgPSBmbG9h
dCggbWF4TUlQTGV2ZWwgKTtcblx0XHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgPSBtYXhNSVBMZXZl
bFNjYWxhciAtIDAuNzkyNDggLSAwLjUgKiBsb2cyKCBwb3cyKCBibGlublNoaW5pbmVzc0V4cG9u
ZW50ICkgKyAxLjAgKTtcblx0XHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBt
YXhNSVBMZXZlbFNjYWxhciApO1xuXHR9XG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFk
aWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGZsb2F0
IGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0
XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0g
cmVmbGVjdCggLWdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCApO1xuXHRcdCNlbHNl
XG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2Vv
bWV0cnkubm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0XHRyZWZsZWN0
VmVjID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCAp
O1xuXHRcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgPSBnZXRTcGVjdWxhck1JUExldmVsKCBibGlu
blNoaW5pbmVzc0V4cG9uZW50LCBtYXhNSVBMZXZlbCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQ
RV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiBy
ZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9F
WFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAs
IHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRc
dFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZl
Yywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5y
Z2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBk
ZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVj
ID0gdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRc
dFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYocXVlcnlSZWZsZWN0VmVjLCBCbGlu
bkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoYmxpbm5TaGluaW5lc3NFeHBvbmVudCkpO1xuXHRcdCNl
bGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdFx0dmVjMiBzYW1wbGVVVjtc
blx0XHRcdHNhbXBsZVVWLnkgPSBzYXR1cmF0ZSggcmVmbGVjdFZlYy55ICogMC41ICsgMC41ICk7
XG5cdFx0XHRzYW1wbGVVVi54ID0gYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAq
IFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRc
dFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHNhbXBsZVVW
LCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENv
bG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5c
dFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIo
IGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVS
RSApXG5cdFx0XHR2ZWMzIHJlZmxlY3RWaWV3ID0gbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2
ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwwLjAsMS4wICkgKTtcblx0
XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRl
eHR1cmUyRExvZEVYVCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3Vs
YXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRl
eHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBM
ZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhl
bFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gZW52
TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG4jZW5kaWZcbiI7CisKKwl2YXIg
bGlnaHRzX3Bob25nX2ZyYWdtZW50ID0gIkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcbm1h
dGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5tYXRlcmlhbC5zcGVjdWxh
ckNvbG9yID0gc3BlY3VsYXI7XG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVz
cztcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO1xuIjsKKwor
CXZhciBsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCA9ICJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3Np
dGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5k
aWZcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5c
dHZlYzNcdHNwZWN1bGFyQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclNoaW5pbmVzcztcblx0Zmxv
YXRcdHNwZWN1bGFyU3RyZW5ndGg7XG59O1xudm9pZCBSRV9EaXJlY3RfQmxpbm5QaG9uZyggY29u
c3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4
dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBS
ZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0I2lmZGVmIFRPT05cblx0XHR2ZWMz
IGlycmFkaWFuY2UgPSBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGly
ZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2Vsc2Vcblx0XHRm
bG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQu
ZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0
LmNvbG9yO1xuXHQjZW5kaWZcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5c
dFx0aXJyYWRpYW5jZSAqPSBQSTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERp
ZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZm
dXNlQ29sb3IgKTtcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5j
ZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRl
cmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJp
YWwuc3BlY3VsYXJTdHJlbmd0aDtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhv
bmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBn
ZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZs
ZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RE
aWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlm
ZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X0JsaW5u
UGhvbmdcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9C
bGlublBob25nXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcdCgw
KVxuIjsKKworCXZhciBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQgPSAiUGh5c2ljYWxNYXRlcmlh
bCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2IgKiAo
IDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgPSBj
bGFtcCggcm91Z2huZXNzRmFjdG9yLCAwLjA0LCAxLjAgKTtcbiNpZmRlZiBTVEFOREFSRFxuXHRt
YXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZG
SUNJRU5UICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2Vsc2Vcblx0
bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VG
RklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFs
bmVzc0ZhY3RvciApO1xuXHRtYXRlcmlhbC5jbGVhckNvYXQgPSBzYXR1cmF0ZSggY2xlYXJDb2F0
ICk7XHRtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgPSBjbGFtcCggY2xlYXJDb2F0Um91Z2hu
ZXNzLCAwLjA0LCAxLjAgKTtcbiNlbmRpZlxuIjsKKworCXZhciBsaWdodHNfcGh5c2ljYWxfcGFy
c19mcmFnbWVudCA9ICJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VD
b2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyUm91Z2huZXNzO1xuXHR2ZWMzXHRzcGVjdWxhckNvbG9y
O1xuXHQjaWZuZGVmIFNUQU5EQVJEXG5cdFx0ZmxvYXQgY2xlYXJDb2F0O1xuXHRcdGZsb2F0IGNs
ZWFyQ29hdFJvdWdobmVzcztcblx0I2VuZGlmXG59O1xuI2RlZmluZSBNQVhJTVVNX1NQRUNVTEFS
X0NPRUZGSUNJRU5UIDAuMTZcbiNkZWZpbmUgREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCAw
LjA0XG5mbG9hdCBjbGVhckNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywg
Y29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XG5cdHJldHVybiBERUZBVUxUX1NQRUNVTEFSX0NPRUZG
SUNJRU5UICsgKCAxLjAgLSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICkgKiAoIHBvdygg
MS4wIC0gZG90TkwsIDUuMCApICogcG93KCAxLjAgLSByb3VnaG5lc3MsIDIuMCApICk7XG59XG4j
aWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXG5cdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1Bo
eXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdl
b21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJp
YWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRcdHZlYzMgbm9y
bWFsID0gZ2VvbWV0cnkubm9ybWFsO1xuXHRcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdE
aXI7XG5cdFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdHZlYzMgbGln
aHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoID0gcmVj
dEFyZWFMaWdodC5oYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdo
dC5oYWxmSGVpZ2h0O1xuXHRcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7
XG5cdFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XG5cdFx0
dmVjMyByZWN0Q29vcmRzWyA0IF07XG5cdFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgLSBo
YWxmV2lkdGggLSBoYWxmSGVpZ2h0O1x0XHRyZWN0Q29vcmRzWyAxIF0gPSBsaWdodFBvcyArIGhh
bGZXaWR0aCAtIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMiBdID0gbGlnaHRQb3MgKyBo
YWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDMgXSA9IGxpZ2h0UG9zIC0g
aGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHR2ZWMyIHV2ID0gTFRDX1V2KCBub3JtYWwsIHZp
ZXdEaXIsIHJvdWdobmVzcyApO1xuXHRcdGZsb2F0IG5vcm0gPSB0ZXh0dXJlMkQoIGx0Y01hZywg
dXYgKS5hO1xuXHRcdHZlYzQgdCA9IHRleHR1cmUyRCggbHRjTWF0LCB1diApO1xuXHRcdG1hdDMg
bUludiA9IG1hdDMoXG5cdFx0XHR2ZWMzKCAgIDEsICAgMCwgdC55ICksXG5cdFx0XHR2ZWMzKCAg
IDAsIHQueiwgICAwICksXG5cdFx0XHR2ZWMzKCB0LncsICAgMCwgdC54IClcblx0XHQpO1xuXHRc
dHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5z
cGVjdWxhckNvbG9yICogbm9ybSAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3Np
dGlvbiwgbUludiwgcmVjdENvb3JkcyApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1
c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSgg
bm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMSApLCByZWN0Q29vcmRzICk7XG5cdH1c
biNlbmRpZlxudm9pZCBSRV9EaXJlY3RfUGh5c2ljYWwoIGNvbnN0IGluIEluY2lkZW50TGlnaHQg
ZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGlu
IFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3Rl
ZExpZ2h0ICkge1xuXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1h
bCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0dmVjMyBpcnJhZGlhbmNlID0gZG90Tkwg
KiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRT
XG5cdFx0aXJyYWRpYW5jZSAqPSBQSTtcblx0I2VuZGlmXG5cdCNpZm5kZWYgU1RBTkRBUkRcblx0
XHRmbG9hdCBjbGVhckNvYXRESFIgPSBtYXRlcmlhbC5jbGVhckNvYXQgKiBjbGVhckNvYXRESFJB
cHByb3goIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcywgZG90TkwgKTtcblx0I2Vsc2Vcblx0
XHRmbG9hdCBjbGVhckNvYXRESFIgPSAwLjA7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5k
aXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyQ29hdERIUiApICogaXJyYWRpYW5jZSAqIEJS
REZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFy
Q29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XG5cdHJlZmxlY3RlZExpZ2h0LmRp
cmVjdERpZmZ1c2UgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRG
X0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG5cdCNpZm5kZWYgU1RB
TkRBUkRcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICog
bWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9t
ZXRyeSwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVh
ckNvYXRSb3VnaG5lc3MgKTtcblx0I2VuZGlmXG59XG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9Q
aHlzaWNhbCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250
ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBS
ZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJl
Y3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwu
ZGlmZnVzZUNvbG9yICk7XG59XG52b2lkIFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwoIGNv
bnN0IGluIHZlYzMgcmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJDb2F0UmFkaWFuY2UsIGNv
bnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJp
YWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHQj
aWZuZGVmIFNUQU5EQVJEXG5cdFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRy
eS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xuXHRcdGZsb2F0IGRvdE5MID0gZG90TlY7
XG5cdFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gbWF0ZXJpYWwuY2xlYXJDb2F0ICogY2xlYXJDb2F0
REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MsIGRvdE5MICk7XG5cdCNlbHNl
XG5cdFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGln
aHQuaW5kaXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyQ29hdERIUiApICogcmFkaWFuY2Ug
KiBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1
bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XG5cdCNpZm5kZWYgU1RBTkRB
UkRcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyQ29hdFJhZGlh
bmNlICogbWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQo
IGdlb21ldHJ5LCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFs
LmNsZWFyQ29hdFJvdWdobmVzcyApO1xuXHQjZW5kaWZcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRc
dFx0XHRSRV9EaXJlY3RfUGh5c2ljYWxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXHRcdFJF
X0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0
UkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJc
dFx0UkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbFxuI2RlZmluZSBNYXRlcmlhbF9CbGlublNo
aW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApICAgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50
KCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApXG4jZGVmaW5lIE1hdGVyaWFsX0NsZWFyQ29h
dF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApICAgR0dYUm91Z2huZXNzVG9CbGlu
bkV4cG9uZW50KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKVxuZmxvYXQgY29tcHV0ZVNw
ZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1i
aWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRyZXR1cm4gc2F0
dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3Vn
aG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApO1xufVxuIjsKKworCXZh
ciBsaWdodHNfdGVtcGxhdGUgPSAiXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xuZ2VvbWV0
cnkucG9zaXRpb24gPSAtIHZWaWV3UG9zaXRpb247XG5nZW9tZXRyeS5ub3JtYWwgPSBub3JtYWw7
XG5nZW9tZXRyeS52aWV3RGlyID0gbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG5JbmNpZGVu
dExpZ2h0IGRpcmVjdExpZ2h0O1xuI2lmICggTlVNX1BPSU5UX0xJR0hUUyA+IDAgKSAmJiBkZWZp
bmVkKCBSRV9EaXJlY3QgKVxuXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XG5cdGZvciAoIGludCBp
ID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCA9IHBv
aW50TGlnaHRzWyBpIF07XG5cdFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50
TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZmRlZiBVU0VfU0hBRE9XTUFQ
XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggcG9pbnRMaWdodC5zaGFkb3cs
IGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFw
WyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBw
b2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xu
XHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlh
bCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMg
PiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0
Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdHNwb3RM
aWdodCA9IHNwb3RMaWdodHNbIGkgXTtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNl
KCBzcG90TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZmRlZiBVU0VfU0hB
RE9XTUFQXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggc3BvdExpZ2h0LnNo
YWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBb
IGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90
TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQj
ZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJl
ZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkg
JiYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExp
Z2h0O1xuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0
XHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRnZXREaXJl
Y3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnks
IGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0XHRkaXJlY3RMaWdo
dC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdywgZGlyZWN0TGln
aHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRp
cmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFz
LCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRb
IGkgXSApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdl
b21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgKCBO
VU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEg
KVxuXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XG5cdGZvciAoIGludCBpID0gMDsgaSA8
IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xuXHRcdHJlY3RBcmVhTGlnaHQgPSByZWN0
QXJlYUxpZ2h0c1sgaSBdO1xuXHRcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwg
Z2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiBk
ZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRBbWJp
ZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHQjaWZkZWYgVVNFX0xJ
R0hUTUFQXG5cdFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFw
LCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZ
X0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRsaWdodE1hcElycmFkaWFuY2UgKj0gUEk7XG5cdFx0I2Vu
ZGlmXG5cdFx0aXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7XG5cdCNlbmRpZlxuXHQj
aWYgKCBOVU1fSEVNSV9MSUdIVFMgPiAwIClcblx0XHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1f
SEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0XHRpcnJhZGlhbmNlICs9IGdldEhlbWlzcGhlcmVM
aWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHR9
XG5cdCNlbmRpZlxuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFBIWVNJ
Q0FMICkgJiYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0aXJyYWRpYW5jZSAr
PSBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgOCApO1xuXHQjZW5k
aWZcblx0UkVfSW5kaXJlY3REaWZmdXNlKCBpcnJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWws
IHJlZmxlY3RlZExpZ2h0ICk7XG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYg
ZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHZlYzMgcmFkaWFuY2UgPSBnZXRMaWdo
dFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnksIE1hdGVyaWFsX0JsaW5uU2hpbmluZXNz
RXhwb25lbnQoIG1hdGVyaWFsICksIDggKTtcblx0I2lmbmRlZiBTVEFOREFSRFxuXHRcdHZlYzMg
Y2xlYXJDb2F0UmFkaWFuY2UgPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0
cnksIE1hdGVyaWFsX0NsZWFyQ29hdF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCAp
LCA4ICk7XG5cdCNlbHNlXG5cdFx0dmVjMyBjbGVhckNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCAp
O1xuXHQjZW5kaWZcblx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGNsZWFyQ29hdFJh
ZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG4jZW5kaWZcbiI7
CisKKwl2YXIgbG9nZGVwdGhidWZfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoVVNFX0xPR0RFUFRI
QlVGKSAmJiBkZWZpbmVkKFVTRV9MT0dERVBUSEJVRl9FWFQpXG5cdGdsX0ZyYWdEZXB0aEVYVCA9
IGxvZzIodkZyYWdEZXB0aCkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xuI2VuZGlmIjsKKworCXZh
ciBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0
dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VY
VFxuXHRcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcblx0I2VuZGlmXG4jZW5kaWZcbiI7CisK
Kwl2YXIgbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxu
XHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0
aDtcblx0I2VuZGlmXG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcbiNlbmRpZiI7CisK
Kwl2YXIgbG9nZGVwdGhidWZfdmVydGV4ID0gIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0Z2xf
UG9zaXRpb24ueiA9IGxvZzIobWF4KCBFUFNJTE9OLCBnbF9Qb3NpdGlvbi53ICsgMS4wICkpICog
bG9nRGVwdGhCdWZGQztcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2RnJhZ0Rl
cHRoID0gMS4wICsgZ2xfUG9zaXRpb24udztcblx0I2Vsc2Vcblx0XHRnbF9Qb3NpdGlvbi56ID0g
KGdsX1Bvc2l0aW9uLnogLSAxLjApICogZ2xfUG9zaXRpb24udztcblx0I2VuZGlmXG4jZW5kaWZc
biI7CisKKwl2YXIgbWFwX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTUFQXG5cdHZlYzQgdGV4ZWxD
b2xvciA9IHRleHR1cmUyRCggbWFwLCB2VXYgKTtcblx0dGV4ZWxDb2xvciA9IG1hcFRleGVsVG9M
aW5lYXIoIHRleGVsQ29sb3IgKTtcblx0ZGlmZnVzZUNvbG9yICo9IHRleGVsQ29sb3I7XG4jZW5k
aWZcbiI7CisKKwl2YXIgbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9NQVBcblx0dW5p
Zm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmXG4iOworCisJdmFyIG1hcF9wYXJ0aWNsZV9mcmFn
bWVudCA9ICIjaWZkZWYgVVNFX01BUFxuXHR2ZWM0IG1hcFRleGVsID0gdGV4dHVyZTJEKCBtYXAs
IHZlYzIoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55ICkgKiBvZmZzZXRS
ZXBlYXQuencgKyBvZmZzZXRSZXBlYXQueHkgKTtcblx0ZGlmZnVzZUNvbG9yICo9IG1hcFRleGVs
VG9MaW5lYXIoIG1hcFRleGVsICk7XG4jZW5kaWZcbiI7CisKKwl2YXIgbWFwX3BhcnRpY2xlX3Bh
cnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSB2ZWM0IG9mZnNldFJlcGVh
dDtcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmXG4iOworCisJdmFyIG1ldGFsbmVz
c21hcF9mcmFnbWVudCA9ICJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7XG4jaWZk
ZWYgVVNFX01FVEFMTkVTU01BUFxuXHR2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBt
ZXRhbG5lc3NNYXAsIHZVdiApO1xuXHRtZXRhbG5lc3NGYWN0b3IgKj0gdGV4ZWxNZXRhbG5lc3Mu
YjtcbiNlbmRpZlxuIjsKKworCXZhciBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZk
ZWYgVVNFX01FVEFMTkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XG4j
ZW5kaWYiOworCisJdmFyIG1vcnBobm9ybWFsX3ZlcnRleCA9ICIjaWZkZWYgVVNFX01PUlBITk9S
TUFMU1xuXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDAgLSBub3JtYWwgKSAqIG1vcnBo
VGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDEg
LSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xuXHRvYmplY3ROb3JtYWwg
Kz0gKCBtb3JwaE5vcm1hbDIgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBd
O1xuXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDMgLSBub3JtYWwgKSAqIG1vcnBoVGFy
Z2V0SW5mbHVlbmNlc1sgMyBdO1xuI2VuZGlmXG4iOworCisJdmFyIG1vcnBodGFyZ2V0X3BhcnNf
dmVydGV4ID0gIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdCNpZm5kZWYgVVNFX01PUlBITk9S
TUFMU1xuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xuXHQjZWxz
ZVxuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xuXHQjZW5kaWZc
biNlbmRpZiI7CisKKwl2YXIgbW9ycGh0YXJnZXRfdmVydGV4ID0gIiNpZmRlZiBVU0VfTU9SUEhU
QVJHRVRTXG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQwIC0gcG9zaXRpb24gKSAqIG1v
cnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0
MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0dHJhbnNmb3Jt
ZWQgKz0gKCBtb3JwaFRhcmdldDIgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2Vz
WyAyIF07XG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQzIC0gcG9zaXRpb24gKSAqIG1v
cnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0
dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDQgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJ
bmZsdWVuY2VzWyA0IF07XG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ1IC0gcG9zaXRp
b24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1v
cnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcblx0
dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDcgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJ
bmZsdWVuY2VzWyA3IF07XG5cdCNlbmRpZlxuI2VuZGlmXG4iOworCisJdmFyIG5vcm1hbF9mbGlw
ID0gIiNpZmRlZiBET1VCTEVfU0lERURcblx0ZmxvYXQgZmxpcE5vcm1hbCA9ICggZmxvYXQoIGds
X0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcbiNlbHNlXG5cdGZsb2F0IGZsaXBOb3JtYWwg
PSAxLjA7XG4jZW5kaWZcbiI7CisKKwl2YXIgbm9ybWFsX2ZyYWdtZW50ID0gIiNpZmRlZiBGTEFU
X1NIQURFRFxuXHR2ZWMzIGZkeCA9IHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4
KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcblx0dmVjMyBm
ZHkgPSB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55
ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgbm9ybWFsID0gbm9ybWFsaXpl
KCBjcm9zcyggZmR4LCBmZHkgKSApO1xuI2Vsc2Vcblx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUo
IHZOb3JtYWwgKSAqIGZsaXBOb3JtYWw7XG4jZW5kaWZcbiNpZmRlZiBVU0VfTk9STUFMTUFQXG5c
dG5vcm1hbCA9IHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsICk7XG4j
ZWxpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApXG5cdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWxBcmIo
IC12Vmlld1Bvc2l0aW9uLCBub3JtYWwsIGRIZHh5X2Z3ZCgpICk7XG4jZW5kaWZcbiI7CisKKwl2
YXIgbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9OT1JNQUxNQVBcblx0dW5p
Zm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xuXHR1bmlmb3JtIHZlYzIgbm9ybWFsU2NhbGU7XG5c
dHZlYzMgcGVydHVyYk5vcm1hbDJBcmIoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0gKSB7
XG5cdFx0dmVjMyBxMCA9IHZlYzMoIGRGZHgoIGV5ZV9wb3MueCApLCBkRmR4KCBleWVfcG9zLnkg
KSwgZEZkeCggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHExID0gdmVjMyggZEZkeSggZXllX3Bv
cy54ICksIGRGZHkoIGV5ZV9wb3MueSApLCBkRmR5KCBleWVfcG9zLnogKSApO1xuXHRcdHZlYzIg
c3QwID0gZEZkeCggdlV2LnN0ICk7XG5cdFx0dmVjMiBzdDEgPSBkRmR5KCB2VXYuc3QgKTtcblx0
XHR2ZWMzIFMgPSBub3JtYWxpemUoIHEwICogc3QxLnQgLSBxMSAqIHN0MC50ICk7XG5cdFx0dmVj
MyBUID0gbm9ybWFsaXplKCAtcTAgKiBzdDEucyArIHExICogc3QwLnMgKTtcblx0XHR2ZWMzIE4g
PSBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xuXHRcdHZlYzMgbWFwTiA9IHRleHR1cmUyRCggbm9y
bWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdFx0bWFwTi54eSA9IG5vcm1hbFNjYWxl
ICogbWFwTi54eTtcblx0XHRtYXQzIHRzbiA9IG1hdDMoIFMsIFQsIE4gKTtcblx0XHRyZXR1cm4g
bm9ybWFsaXplKCB0c24gKiBtYXBOICk7XG5cdH1cbiNlbmRpZlxuIjsKKworCXZhciBwYWNraW5n
ID0gInZlYzMgcGFja05vcm1hbFRvUkdCKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHtcblx0cmV0
dXJuIG5vcm1hbGl6ZSggbm9ybWFsICkgKiAwLjUgKyAwLjU7XG59XG52ZWMzIHVucGFja1JHQlRv
Tm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcblx0cmV0dXJuIDEuMCAtIDIuMCAqIHJnYi54
eXo7XG59XG5jb25zdCBmbG9hdCBQYWNrVXBzY2FsZSA9IDI1Ni4gLyAyNTUuO2NvbnN0IGZsb2F0
IFVucGFja0Rvd25zY2FsZSA9IDI1NS4gLyAyNTYuO1xuY29uc3QgdmVjMyBQYWNrRmFjdG9ycyA9
IHZlYzMoIDI1Ni4gKiAyNTYuICogMjU2LiwgMjU2LiAqIDI1Ni4sICAyNTYuICk7XG5jb25zdCB2
ZWM0IFVucGFja0ZhY3RvcnMgPSBVbnBhY2tEb3duc2NhbGUgLyB2ZWM0KCBQYWNrRmFjdG9ycywg
MS4gKTtcbmNvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuO1xudmVjNCBwYWNrRGVw
dGhUb1JHQkEoIGNvbnN0IGluIGZsb2F0IHYgKSB7XG5cdHZlYzQgciA9IHZlYzQoIGZyYWN0KCB2
ICogUGFja0ZhY3RvcnMgKSwgdiApO1xuXHRyLnl6dyAtPSByLnh5eiAqIFNoaWZ0UmlnaHQ4O1x0
cmV0dXJuIHIgKiBQYWNrVXBzY2FsZTtcbn1cbmZsb2F0IHVucGFja1JHQkFUb0RlcHRoKCBjb25z
dCBpbiB2ZWM0IHYgKSB7XG5cdHJldHVybiBkb3QoIHYsIFVucGFja0ZhY3RvcnMgKTtcbn1cbmZs
b2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0
IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggdmlld1og
KyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcbn1cbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9W
aWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNv
bnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFy
ICkgLSBuZWFyO1xufVxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZs
b2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5c
dHJldHVybiAoKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCggZmFyIC0gbmVhciApICogdmll
d1ogKTtcbn1cbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBp
bnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRy
ZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIg
KTtcbn1cbiI7CisKKwl2YXIgcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCA9ICIjaWZkZWYg
UFJFTVVMVElQTElFRF9BTFBIQVxuXHRnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5h
O1xuI2VuZGlmXG4iOworCisJdmFyIHByb2plY3RfdmVydGV4ID0gInZlYzQgbXZQb3NpdGlvbiA9
IG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbmdsX1Bvc2l0aW9u
ID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XG4iOworCisJdmFyIGRpdGhlcmluZ19m
cmFnbWVudCA9ICIjaWYgZGVmaW5lZCggRElUSEVSSU5HIClcbiAgZ2xfRnJhZ0NvbG9yLnJnYiA9
IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xuI2VuZGlmXG4iOworCisJdmFyIGRpdGhl
cmluZ19wYXJzX2ZyYWdtZW50ID0gIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxuXHR2ZWMzIGRp
dGhlcmluZyggdmVjMyBjb2xvciApIHtcblx0XHRmbG9hdCBncmlkX3Bvc2l0aW9uID0gcmFuZCgg
Z2xfRnJhZ0Nvb3JkLnh5ICk7XG5cdFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCID0gdmVjMyggMC4y
NSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcblx0XHRkaXRoZXJfc2hp
ZnRfUkdCID0gbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0
X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xuXHRcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9S
R0I7XG5cdH1cbiNlbmRpZlxuIjsKKworCXZhciByb3VnaG5lc3NtYXBfZnJhZ21lbnQgPSAiZmxv
YXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzO1xuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBc
blx0dmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtc
blx0cm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XG4jZW5kaWZcbiI7CisKKwl2
YXIgcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBc
blx0dW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwO1xuI2VuZGlmIjsKKworCXZhciBzaGFk
b3dtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJ
Ul9MSUdIVFMgPiAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBb
IE5VTV9ESVJfTElHSFRTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nv
b3JkWyBOVU1fRElSX0xJR0hUUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+
IDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVFMg
XTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRTIF07
XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcblx0XHR1bmlmb3JtIHNhbXBs
ZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xuXHRcdHZhcnlpbmcgdmVj
NCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xuXHQjZW5kaWZcblx0Zmxv
YXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29t
cGFyZSApIHtcblx0XHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRl
eHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcblx0fVxuXHRmbG9hdCB0ZXh0dXJlMkRTaGFkb3dM
ZXJwKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHNpemUsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUg
KSB7XG5cdFx0Y29uc3QgdmVjMiBvZmZzZXQgPSB2ZWMyKCAwLjAsIDEuMCApO1xuXHRcdHZlYzIg
dGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaXplO1xuXHRcdHZlYzIgY2VudHJvaWRVViA9IGZs
b29yKCB1diAqIHNpemUgKyAwLjUgKSAvIHNpemU7XG5cdFx0ZmxvYXQgbGIgPSB0ZXh0dXJlMkRD
b21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHgsIGNvbXBh
cmUgKTtcblx0XHRmbG9hdCBsdCA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRV
ViArIHRleGVsU2l6ZSAqIG9mZnNldC54eSwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJiID0gdGV4
dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl4
LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgcnQgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNl
bnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueXksIGNvbXBhcmUgKTtcblx0XHR2ZWMyIGYg
PSBmcmFjdCggdXYgKiBzaXplICsgMC41ICk7XG5cdFx0ZmxvYXQgYSA9IG1peCggbGIsIGx0LCBm
LnkgKTtcblx0XHRmbG9hdCBiID0gbWl4KCByYiwgcnQsIGYueSApO1xuXHRcdGZsb2F0IGMgPSBt
aXgoIGEsIGIsIGYueCApO1xuXHRcdHJldHVybiBjO1xuXHR9XG5cdGZsb2F0IGdldFNoYWRvdygg
c2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFz
LCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XG5cdFx0ZmxvYXQgc2hh
ZG93ID0gMS4wO1xuXHRcdHNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53O1xuXHRcdHNo
YWRvd0Nvb3JkLnogKz0gc2hhZG93Qmlhcztcblx0XHRidmVjNCBpbkZydXN0dW1WZWMgPSBidmVj
NCAoIHNoYWRvd0Nvb3JkLnggPj0gMC4wLCBzaGFkb3dDb29yZC54IDw9IDEuMCwgc2hhZG93Q29v
cmQueSA+PSAwLjAsIHNoYWRvd0Nvb3JkLnkgPD0gMS4wICk7XG5cdFx0Ym9vbCBpbkZydXN0dW0g
PSBhbGwoIGluRnJ1c3R1bVZlYyApO1xuXHRcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjID0gYnZlYzIo
IGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiA8PSAxLjAgKTtcblx0XHRib29sIGZydXN0dW1UZXN0
ID0gYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xuXHRcdGlmICggZnJ1c3R1bVRlc3QgKSB7XG5cdFx0
I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSA9
IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCA9IC0gdGV4ZWxT
aXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICog
c2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1Jh
ZGl1cztcblx0XHRcdGZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5c
dFx0XHRzaGFkb3cgPSAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hh
ZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0
XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4w
LCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hh
ZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnog
KSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkg
KyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRD
b21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xuXHRc
dFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMigg
ZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSgg
c2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3Jk
LnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQu
eHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJl
MkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwg
c2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxpZiBkZWZp
bmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZl
YzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCA9IC0gdGV4ZWxTaXpl
LnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hh
ZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1
cztcblx0XHRcdGZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0
XHRzaGFkb3cgPSAoXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hh
ZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29y
ZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01h
cFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiAp
ICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXpl
LCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5c
dFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hh
ZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0
XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nv
b3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBz
aGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAg
KSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93
TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNo
YWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwg
c2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dD
b29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRv
d01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQu
eiApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0c2hhZG93ID0g
dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQu
eiApO1xuXHRcdCNlbmRpZlxuXHRcdH1cblx0XHRyZXR1cm4gc2hhZG93O1xuXHR9XG5cdHZlYzIg
Y3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcblx0XHR2ZWMzIGFic1YgPSBh
YnMoIHYgKTtcblx0XHRmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgo
IGFic1YueSwgYWJzVi56ICkgKTtcblx0XHRhYnNWICo9IHNjYWxlVG9DdWJlO1xuXHRcdHYgKj0g
c2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcblx0XHR2ZWMyIHBsYW5h
ciA9IHYueHk7XG5cdFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcblx0
XHRmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7XG5cdFx0aWYgKCBhYnNWLnog
Pj0gYWxtb3N0T25lICkge1xuXHRcdFx0aWYgKCB2LnogPiAwLjAgKVxuXHRcdFx0XHRwbGFuYXIu
eCA9IDQuMCAtIHYueDtcblx0XHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xu
XHRcdFx0ZmxvYXQgc2lnblggPSBzaWduKCB2LnggKTtcblx0XHRcdHBsYW5hci54ID0gdi56ICog
c2lnblggKyAyLjAgKiBzaWduWDtcblx0XHR9IGVsc2UgaWYgKCBhYnNWLnkgPj0gYWxtb3N0T25l
ICkge1xuXHRcdFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcblx0XHRcdHBsYW5hci54ID0g
di54ICsgMi4wICogc2lnblkgKyAyLjA7XG5cdFx0XHRwbGFuYXIueSA9IHYueiAqIHNpZ25ZIC0g
Mi4wO1xuXHRcdH1cblx0XHRyZXR1cm4gdmVjMiggMC4xMjUsIDAuMjUgKSAqIHBsYW5hciArIHZl
YzIoIDAuMzc1LCAwLjc1ICk7XG5cdH1cblx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIy
RCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQg
c2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xuXHRcdHZlYzIgdGV4ZWxTaXplID0g
dmVjMiggMS4wICkgLyAoIHNoYWRvd01hcFNpemUgKiB2ZWMyKCA0LjAsIDIuMCApICk7XG5cdFx0
dmVjMyBsaWdodFRvUG9zaXRpb24gPSBzaGFkb3dDb29yZC54eXo7XG5cdFx0dmVjMyBiZDNEID0g
bm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcblx0XHRmbG9hdCBkcCA9ICggbGVuZ3RoKCBs
aWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0JpYXMgKSAvIDEwMDAuMDtcblx0XHQjaWYgZGVmaW5l
ZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NP
RlQgKVxuXHRcdFx0dmVjMiBvZmZzZXQgPSB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAq
IHRleGVsU2l6ZS55O1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSgg
c2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRw
ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNE
ICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENv
bXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUu
eSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9V
ViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0
dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBk
cCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQz
RCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRD
b21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXpl
LnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRv
VVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4
dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRl
eGVsU2l6ZS55ICksIGRwIClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbHNlXG5c
dFx0XHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwg
dGV4ZWxTaXplLnkgKSwgZHAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4iOworCisJdmFy
IHNoYWRvd21hcF9wYXJzX3ZlcnRleCA9ICIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVN
X0RJUl9MSUdIVFMgPiAwXG5cdFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4
WyBOVU1fRElSX0xJR0hUUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dD
b29yZFsgTlVNX0RJUl9MSUdIVFMgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVFMg
PiAwXG5cdFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUUyBd
O1xuXHRcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVFMgXTtc
blx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxuXHRcdHVuaWZvcm0gbWF0NCBw
b2ludFNoYWRvd01hdHJpeFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2
UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xuXHQjZW5kaWZcbiNlbmRpZlxu
IjsKKworCXZhciBzaGFkb3dtYXBfdmVydGV4ID0gIiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNp
ZiBOVU1fRElSX0xJR0hUUyA+IDBcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdI
VFM7IGkgKysgKSB7XG5cdFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSA9IGRpcmVjdGlv
bmFsU2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQj
aWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9M
SUdIVFM7IGkgKysgKSB7XG5cdFx0dlNwb3RTaGFkb3dDb29yZFsgaSBdID0gc3BvdFNoYWRvd01h
dHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lO
VF9MSUdIVFMgPiAwXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkg
KysgKSB7XG5cdFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSA9IHBvaW50U2hhZG93TWF0cml4WyBp
IF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuI2VuZGlmXG4iOworCisJdmFyIHNo
YWRvd21hc2tfcGFyc19mcmFnbWVudCA9ICJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xuXHRmbG9h
dCBzaGFkb3cgPSAxLjA7XG5cdCNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJ
R0hUUyA+IDBcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHRmb3IgKCBp
bnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExp
Z2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKj0gYm9vbCggZGlyZWN0
aW9uYWxMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkg
XSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRv
d0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dD
b29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVFMg
PiAwXG5cdFNwb3RMaWdodCBzcG90TGlnaHQ7XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9T
UE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07XG5c
dFx0c2hhZG93ICo9IGJvb2woIHNwb3RMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggc3BvdFNo
YWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0Jp
YXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4w
O1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcblx0UG9pbnRMaWdo
dCBwb2ludExpZ2h0O1xuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBp
ICsrICkge1xuXHRcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAq
PSBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93
TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFz
LCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSApIDogMS4w
O1xuXHR9XG5cdCNlbmRpZlxuXHQjZW5kaWZcblx0cmV0dXJuIHNoYWRvdztcbn1cbiI7CisKKwl2
YXIgc2tpbmJhc2VfdmVydGV4ID0gIiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBib25lTWF0
WCA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC54ICk7XG5cdG1hdDQgYm9uZU1hdFkgPSBnZXRC
b25lTWF0cml4KCBza2luSW5kZXgueSApO1xuXHRtYXQ0IGJvbmVNYXRaID0gZ2V0Qm9uZU1hdHJp
eCggc2tpbkluZGV4LnogKTtcblx0bWF0NCBib25lTWF0VyA9IGdldEJvbmVNYXRyaXgoIHNraW5J
bmRleC53ICk7XG4jZW5kaWYiOworCisJdmFyIHNraW5uaW5nX3BhcnNfdmVydGV4ID0gIiNpZmRl
ZiBVU0VfU0tJTk5JTkdcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XG5cdHVuaWZvcm0gbWF0
NCBiaW5kTWF0cml4SW52ZXJzZTtcblx0I2lmZGVmIEJPTkVfVEVYVFVSRVxuXHRcdHVuaWZvcm0g
c2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xuXHRcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtc
blx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRmbG9h
dCBqID0gaSAqIDQuMDtcblx0XHRcdGZsb2F0IHggPSBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVy
ZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgeSA9IGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJl
U2l6ZSApICk7XG5cdFx0XHRmbG9hdCBkeCA9IDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUg
KTtcblx0XHRcdGZsb2F0IGR5ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRc
dFx0eSA9IGR5ICogKCB5ICsgMC41ICk7XG5cdFx0XHR2ZWM0IHYxID0gdGV4dHVyZTJEKCBib25l
VGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAwLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYyID0g
dGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XG5c
dFx0XHR2ZWM0IHYzID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAy
LjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHY0ID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVj
MiggZHggKiAoIHggKyAzLjUgKSwgeSApICk7XG5cdFx0XHRtYXQ0IGJvbmUgPSBtYXQ0KCB2MSwg
djIsIHYzLCB2NCApO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZWxzZVxuXHRcdHVu
aWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xuXHRcdG1hdDQgZ2V0Qm9uZU1h
dHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdG1hdDQgYm9uZSA9IGJvbmVNYXRyaWNl
c1sgaW50KGkpIF07XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlm
XG4iOworCisJdmFyIHNraW5uaW5nX3ZlcnRleCA9ICIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHZl
YzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG5c
dHZlYzQgc2tpbm5lZCA9IHZlYzQoIDAuMCApO1xuXHRza2lubmVkICs9IGJvbmVNYXRYICogc2tp
blZlcnRleCAqIHNraW5XZWlnaHQueDtcblx0c2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0
ZXggKiBza2luV2VpZ2h0Lnk7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFogKiBza2luVmVydGV4ICog
c2tpbldlaWdodC56O1xuXHRza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5X
ZWlnaHQudztcblx0dHJhbnNmb3JtZWQgPSAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCAp
Lnh5ejtcbiNlbmRpZlxuIjsKKworCXZhciBza2lubm9ybWFsX3ZlcnRleCA9ICIjaWZkZWYgVVNF
X1NLSU5OSU5HXG5cdG1hdDQgc2tpbk1hdHJpeCA9IG1hdDQoIDAuMCApO1xuXHRza2luTWF0cml4
ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQu
eSAqIGJvbmVNYXRZO1xuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueiAqIGJvbmVNYXRaO1xu
XHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xuXHRza2luTWF0cml4ICA9
IGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7XG5cdG9iamVjdE5v
cm1hbCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6
O1xuI2VuZGlmXG4iOworCisJdmFyIHNwZWN1bGFybWFwX2ZyYWdtZW50ID0gImZsb2F0IHNwZWN1
bGFyU3RyZW5ndGg7XG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXG5cdHZlYzQgdGV4ZWxTcGVjdWxh
ciA9IHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApO1xuXHRzcGVjdWxhclN0cmVuZ3RoID0g
dGV4ZWxTcGVjdWxhci5yO1xuI2Vsc2Vcblx0c3BlY3VsYXJTdHJlbmd0aCA9IDEuMDtcbiNlbmRp
ZiI7CisKKwl2YXIgc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX1NQRUNV
TEFSTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwO1xuI2VuZGlmIjsKKworCXZh
ciB0b25lbWFwcGluZ19mcmFnbWVudCA9ICIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcbiAg
Z2xfRnJhZ0NvbG9yLnJnYiA9IHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5k
aWZcbiI7CisKKwl2YXIgdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCA9ICIjZGVmaW5lIHNhdHVy
YXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhw
b3N1cmU7XG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nV2hpdGVQb2ludDtcbnZlYzMgTGluZWFy
VG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJl
ICogY29sb3I7XG59XG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5c
dGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3Ig
LyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xufVxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVy
KCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAu
MDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAy
IC8gMC4zMCwgdmVjMyggMC4wICkgKVxudmVjMyBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcoIHZlYzMg
Y29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1
cmF0ZSggVW5jaGFydGVkMkhlbHBlciggY29sb3IgKSAvIFVuY2hhcnRlZDJIZWxwZXIoIHZlYzMo
IHRvbmVNYXBwaW5nV2hpdGVQb2ludCApICkgKTtcbn1cbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9u
ZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7
XG5cdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xuXHRyZXR1cm4g
cG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIg
KiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xufVxuIjsKKworCXZhciB1
dl9wYXJzX2ZyYWdtZW50ID0gIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNF
X0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQ
RUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VN
SVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVT
RV9NRVRBTE5FU1NNQVAgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2O1xuI2VuZGlmIjsKKworCXZhciB1
dl9wYXJzX3ZlcnRleCA9ICIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9C
VU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVD
VUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlT
U0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0Vf
TUVUQUxORVNTTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjtcblx0dW5pZm9ybSB2ZWM0IG9mZnNl
dFJlcGVhdDtcbiNlbmRpZlxuIjsKKworCXZhciB1dl92ZXJ0ZXggPSAiI2lmIGRlZmluZWQoIFVT
RV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxN
QVAgKSB8fCBkZWZpbmVkKCBVU0VfU1BFQ1VMQVJNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFN
QVAgKSB8fCBkZWZpbmVkKCBVU0VfRU1JU1NJVkVNQVAgKSB8fCBkZWZpbmVkKCBVU0VfUk9VR0hO
RVNTTUFQICkgfHwgZGVmaW5lZCggVVNFX01FVEFMTkVTU01BUCApXG5cdHZVdiA9IHV2ICogb2Zm
c2V0UmVwZWF0Lnp3ICsgb2Zmc2V0UmVwZWF0Lnh5O1xuI2VuZGlmIjsKKworCXZhciB1djJfcGFy
c19mcmFnbWVudCA9ICIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNF
X0FPTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiOworCisJdmFyIHV2Ml9wYXJz
X3ZlcnRleCA9ICIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FP
TUFQIClcblx0YXR0cmlidXRlIHZlYzIgdXYyO1xuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRp
ZiI7CisKKwl2YXIgdXYyX3ZlcnRleCA9ICIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwg
ZGVmaW5lZCggVVNFX0FPTUFQIClcblx0dlV2MiA9IHV2MjtcbiNlbmRpZiI7CisKKwl2YXIgd29y
bGRwb3NfdmVydGV4ID0gIiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggUEhP
TkcgKSB8fCBkZWZpbmVkKCBQSFlTSUNBTCApIHx8IGRlZmluZWQoIExBTUJFUlQgKSB8fCBkZWZp
bmVkICggVVNFX1NIQURPV01BUCApXG5cdHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4
ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuI2VuZGlmXG4iOworCisJdmFyIGN1YmVfZnJh
ZyA9ICJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xudW5pZm9ybSBmbG9hdCB0RmxpcDtcbnVu
aWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNs
dWRlIDxjb21tb24+XG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciA9IHRleHR1cmVDdWJl
KCB0Q3ViZSwgdmVjMyggdEZsaXAgKiB2V29ybGRQb3NpdGlvbi54LCB2V29ybGRQb3NpdGlvbi55
eiApICk7XG5cdGdsX0ZyYWdDb2xvci5hICo9IG9wYWNpdHk7XG59XG4iOworCisJdmFyIGN1YmVf
dmVydCA9ICJ2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxu
dm9pZCBtYWluKCkge1xuXHR2V29ybGRQb3NpdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9z
aXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNs
dWRlIDxwcm9qZWN0X3ZlcnRleD5cbn1cbiI7CisKKwl2YXIgZGVwdGhfZnJhZyA9ICIjaWYgREVQ
VEhfUEFDS0lORyA9PSAzMjAwXG5cdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNlbmRpZlxuI2lu
Y2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJh
Z21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBf
cGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2lu
Y2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQj
aW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9
IHZlYzQoIDEuMCApO1xuXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXG5cdFx0ZGlmZnVzZUNv
bG9yLmEgPSBvcGFjaXR5O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0
I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdt
ZW50PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpZiBERVBUSF9QQUNL
SU5HID09IDMyMDBcblx0XHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCB2ZWMzKCBnbF9GcmFnQ29vcmQu
eiApLCBvcGFjaXR5ICk7XG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMVxuXHRcdGdsX0Zy
YWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZ2xfRnJhZ0Nvb3JkLnogKTtcblx0I2VuZGlmXG59
XG4iOworCisJdmFyIGRlcHRoX3ZlcnQgPSAiI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1
dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4j
aW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFy
c192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8
Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8
dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaWZkZWYgVVNFX0RJ
U1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2lu
Y2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0
ZXg+XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9y
cGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVk
ZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4Plxu
XHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxh
bmVzX3ZlcnRleD5cbn1cbiI7CisKKwl2YXIgZGlzdGFuY2VSR0JBX2ZyYWcgPSAidW5pZm9ybSB2
ZWMzIGxpZ2h0UG9zO1xudmFyeWluZyB2ZWM0IHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgPGNv
bW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJz
X2ZyYWdtZW50Plxudm9pZCBtYWluICgpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19m
cmFnbWVudD5cblx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBsZW5ndGgoIHZXb3Js
ZFBvc2l0aW9uLnh5eiAtIGxpZ2h0UG9zLnh5eiApIC8gMTAwMC4wICk7XG59XG4iOworCisJdmFy
IGRpc3RhbmNlUkdCQV92ZXJ0ID0gInZhcnlpbmcgdmVjNCB2V29ybGRQb3NpdGlvbjtcbiNpbmNs
dWRlIDxjb21tb24+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVk
ZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNf
dmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQj
aW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4Plxu
XHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+
XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFu
ZXNfdmVydGV4PlxuXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb247XG59XG4iOworCisJ
dmFyIGVxdWlyZWN0X2ZyYWcgPSAidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudW5pZm9y
bSBmbG9hdCB0RmxpcDtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIDxj
b21tb24+XG52b2lkIG1haW4oKSB7XG5cdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29y
bGRQb3NpdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWO1xuXHRzYW1wbGVVVi55ID0gc2F0dXJhdGUo
IHRGbGlwICogZGlyZWN0aW9uLnkgKiAtMC41ICsgMC41ICk7XG5cdHNhbXBsZVVWLnggPSBhdGFu
KCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRn
bF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcbn1cbiI7CisK
Kwl2YXIgZXF1aXJlY3RfdmVydCA9ICJ2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4jaW5j
bHVkZSA8Y29tbW9uPlxudm9pZCBtYWluKCkge1xuXHR2V29ybGRQb3NpdGlvbiA9IHRyYW5zZm9y
bURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIDxiZWdpbl92
ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cbn1cbiI7CisKKwl2YXIgbGluZWRh
c2hlZF9mcmFnID0gInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5
O1xudW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTtcbnVuaWZvcm0gZmxvYXQgdG90YWxTaXplO1xudmFy
eWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxj
b2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1
ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVz
X3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFu
ZXNfZnJhZ21lbnQ+XG5cdGlmICggbW9kKCB2TGluZURpc3RhbmNlLCB0b3RhbFNpemUgKSA+IGRh
c2hTaXplICkge1xuXHRcdGRpc2NhcmQ7XG5cdH1cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVj
MyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSAp
O1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9m
cmFnbWVudD5cblx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdD
b2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRl
IDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdf
ZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxm
b2dfZnJhZ21lbnQ+XG59XG4iOworCisJdmFyIGxpbmVkYXNoZWRfdmVydCA9ICJ1bmlmb3JtIGZs
b2F0IHNjYWxlO1xuYXR0cmlidXRlIGZsb2F0IGxpbmVEaXN0YW5jZTtcbnZhcnlpbmcgZmxvYXQg
dkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192
ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVm
X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZv
aWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0dkxpbmVEaXN0YW5jZSA9
IHNjYWxlICogbGluZURpc3RhbmNlO1xuXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRy
aXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG5cdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1h
dHJpeCAqIG12UG9zaXRpb247XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNp
bmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5c
bn1cbiI7CisKKwl2YXIgbWVzaGJhc2ljX2ZyYWcgPSAidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51
bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVj
MyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3Bh
cnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJf
cGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxh
bHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4j
aW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19m
cmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzcGVjdWxh
cm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+
XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7
XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNv
bG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZf
ZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9m
cmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxw
aGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XG5cdFJl
ZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCAp
LCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdCNpZmRlZiBVU0Vf
TElHSFRNQVBcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdGV4dHVyZTJE
KCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuXHQjZWxzZVxuXHRc
dHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSB2ZWMzKCAxLjAgKTtcblx0I2VuZGlm
XG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RE
aWZmdXNlICo9IGRpZmZ1c2VDb2xvci5yZ2I7XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxl
Y3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcblx0I2luY2x1ZGUgPG5vcm1hbF9mbGlwPlxuXHQj
aW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2lu
Z0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBo
YV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVk
ZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxufVxuIjsK
KworCXZhciBtZXNoYmFzaWNfdmVydCA9ICIjaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2
X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxlbnZt
YXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8
Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2lu
Y2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNf
dmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFp
bigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5c
dCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5c
dCNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNp
bmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRl
eD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjZW5kaWZcblx0I2luY2x1
ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2lu
Y2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQj
aW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4
PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1h
cF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufVxuIjsKKworCXZhciBtZXNobGFt
YmVydF9mcmFnID0gInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZl
O1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xuI2lm
ZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcbiNlbmRpZlxuI2lu
Y2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19w
YXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8
dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRl
IDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50Plxu
I2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19m
cmFnbWVudD5cbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUg
PGVudm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0
c19wYXJzPlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21h
cF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cbiNp
bmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVm
X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+
XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5c
dHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0
ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVj
MyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3Np
dmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+
XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5c
blx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2Zy
YWdtZW50PlxuXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxl
bWlzc2l2ZW1hcF9mcmFnbWVudD5cblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlID0g
Z2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0I2luY2x1
ZGUgPGxpZ2h0bWFwX2ZyYWdtZW50PlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2Ug
Kj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcblx0I2lmZGVmIERP
VUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSAoIGdsX0Zyb250
RmFjaW5nICkgPyB2TGlnaHRGcm9udCA6IHZMaWdodEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVj
dGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9IHZMaWdodEZyb250O1xuXHQjZW5kaWZcblx0cmVmbGVj
dGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNv
bG9yLnJnYiApICogZ2V0U2hhZG93TWFzaygpO1xuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+
XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyBy
ZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5c
dCNpbmNsdWRlIDxub3JtYWxfZmxpcD5cblx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cblx0
Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0
I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2Zy
YWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlw
bGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cbn1c
biI7CisKKwl2YXIgbWVzaGxhbWJlcnRfdmVydCA9ICIjZGVmaW5lIExBTUJFUlRcbnZhcnlpbmcg
dmVjMyB2TGlnaHRGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZM
aWdodEJhY2s7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192
ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJz
X3ZlcnRleD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFycz5cbiNpbmNs
dWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5j
bHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192
ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2Rl
cHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRl
eD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2
Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5v
cm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRl
IDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2lu
Y2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4Plxu
XHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVy
dGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1
Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVk
ZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cblx0I2luY2x1
ZGUgPGxpZ2h0c19sYW1iZXJ0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+
XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufVxuIjsKKworCXZhciBtZXNocGhvbmdfZnJhZyA9
ICIjZGVmaW5lIFBIT05HXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlz
c2l2ZTtcbnVuaWZvcm0gdmVjMyBzcGVjdWxhcjtcbnVuaWZvcm0gZmxvYXQgc2hpbmluZXNzO1xu
dW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNr
aW5nPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9y
X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1
djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRl
IDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+
XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbWlzc2l2ZW1h
cF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1
ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21l
bnQ+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XG4jaW5jbHVkZSA8
bGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJh
Z21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1h
bG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+
XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGlu
Z19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBw
aW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNl
LCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVk
TGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCAp
ICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XG5cdCNpbmNsdWRl
IDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2lu
Y2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5c
dCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9m
cmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mbGlwPlxuXHQjaW5jbHVkZSA8bm9ybWFsX2Zy
YWdtZW50PlxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxs
aWdodHNfcGhvbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfdGVtcGxhdGU+XG5cdCNp
bmNsdWRlIDxhb21hcF9mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVk
TGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJl
ZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVj
dWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVu
dD5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEg
KTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2Rp
bmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJl
bXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVu
dD5cbn1cbiI7CisKKwl2YXIgbWVzaHBob25nX3ZlcnQgPSAiI2RlZmluZSBQSE9OR1xudmFyeWlu
ZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVj
MyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNf
dmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1l
bnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1
ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNs
dWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3Zl
cnRleD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVw
dGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4
Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYy
X3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9y
bWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUg
PHNraW5iYXNlX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5j
bHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3Jt
YWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUg
PGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1
ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+
XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3Zl
cnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRp
b24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQj
aW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5c
dCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufVxuIjsKKworCXZhciBtZXNocGh5c2ljYWxfZnJhZyA9
ICIjZGVmaW5lIFBIWVNJQ0FMXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBl
bWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xudW5pZm9ybSBmbG9hdCBtZXRhbG5l
c3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZuZGVmIFNUQU5EQVJEXG5cdHVuaWZvcm0g
ZmxvYXQgY2xlYXJDb2F0O1xuXHR1bmlmb3JtIGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcbiNl
bmRpZlxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5c
dHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1
ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVk
ZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2lu
Y2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50Plxu
I2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19m
cmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVt
aXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+
XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVk
ZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzPlxu
I2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRv
d21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNp
bmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBf
cGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudD5cbiNp
bmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3Bs
YW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdf
cGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9w
YWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdo
dCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtc
blx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxv
Z2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVk
ZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2lu
Y2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFn
bWVudD5cblx0I2luY2x1ZGUgPG1ldGFsbmVzc21hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5v
cm1hbF9mbGlwPlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW1p
c3NpdmVtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ+
XG5cdCNpbmNsdWRlIDxsaWdodHNfdGVtcGxhdGU+XG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVu
dD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAr
IHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNw
ZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVS
YWRpYW5jZTtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNv
bG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8
ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVk
ZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGRpdGhlcmluZ19m
cmFnbWVudD5cbn1cbiI7CisKKwl2YXIgbWVzaHBoeXNpY2FsX3ZlcnQgPSAiI2RlZmluZSBQSFlT
SUNBTFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5c
dHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1
ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRl
IDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0
ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3Bh
cnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNo
YWRvd21hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5c
biNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5c
dCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVk
ZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5j
bHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4Plxu
XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFs
X3ZlcnRleD5cbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJh
bnNmb3JtZWROb3JtYWwgKTtcbiNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQj
aW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4
PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2pl
Y3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8
Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54
eXo7XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBf
dmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn1cbiI7CisKKwl2YXIgbm9ybWFsX2Zy
YWcgPSAiI2RlZmluZSBOT1JNQUxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZiBkZWZpbmVk
KCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNF
X05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZu
ZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVk
ZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBt
YXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNp
bmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5j
bHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZmxpcD5cblx0
I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudD5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05v
cm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xufVxuIjsKKworCXZhciBub3JtYWxfdmVy
dCA9ICIjZGVmaW5lIE5PUk1BTFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5l
ZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2
ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWlu
ZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNs
dWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRf
cGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8
bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92
ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3Jw
aG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRl
IDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4Plxu
I2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5v
cm1hbCApO1xuI2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxt
b3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNs
dWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+
XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG4jaWYgZGVmaW5lZCggRkxBVF9TSEFE
RUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAg
KVxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZlxufVxuIjsKKwor
CXZhciBwb2ludHNfZnJhZyA9ICJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQg
b3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRl
IDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdt
ZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9w
YXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5j
bHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNp
bmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9
IHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNp
dHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFw
X3BhcnRpY2xlX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNs
dWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3Iu
cmdiO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3Iu
YSApO1xuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1
ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50
PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxufVxuIjsKKworCXZhciBwb2ludHNfdmVydCA9
ICJ1bmlmb3JtIGZsb2F0IHNpemU7XG51bmlmb3JtIGZsb2F0IHNjYWxlO1xuI2luY2x1ZGUgPGNv
bW1vbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192
ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2Rl
cHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRl
eD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUg
PGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaWZkZWYgVVNF
X1NJWkVBVFRFTlVBVElPTlxuXHRcdGdsX1BvaW50U2l6ZSA9IHNpemUgKiAoIHNjYWxlIC8gLSBt
dlBvc2l0aW9uLnogKTtcblx0I2Vsc2Vcblx0XHRnbF9Qb2ludFNpemUgPSBzaXplO1xuXHQjZW5k
aWZcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5n
X3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRl
IDxzaGFkb3dtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn1cbiI7CisKKwl2
YXIgc2hhZG93X2ZyYWcgPSAidW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1v
bj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0
c19wYXJzPlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNo
YWRvd21hc2tfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9yID0g
dmVjNCggMC4wLCAwLjAsIDAuMCwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkg
KTtcbn1cbiI7CisKKwl2YXIgc2hhZG93X3ZlcnQgPSAiI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJz
X3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2lu
Y2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQj
aW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cbn1cbiI7CisKKwl2YXIgU2hhZGVyQ2h1bmsgPSB7
CisJCWFscGhhbWFwX2ZyYWdtZW50OiBhbHBoYW1hcF9mcmFnbWVudCwKKwkJYWxwaGFtYXBfcGFy
c19mcmFnbWVudDogYWxwaGFtYXBfcGFyc19mcmFnbWVudCwKKwkJYWxwaGF0ZXN0X2ZyYWdtZW50
OiBhbHBoYXRlc3RfZnJhZ21lbnQsCisJCWFvbWFwX2ZyYWdtZW50OiBhb21hcF9mcmFnbWVudCwK
KwkJYW9tYXBfcGFyc19mcmFnbWVudDogYW9tYXBfcGFyc19mcmFnbWVudCwKKwkJYmVnaW5fdmVy
dGV4OiBiZWdpbl92ZXJ0ZXgsCisJCWJlZ2lubm9ybWFsX3ZlcnRleDogYmVnaW5ub3JtYWxfdmVy
dGV4LAorCQlic2RmczogYnNkZnMsCisJCWJ1bXBtYXBfcGFyc19mcmFnbWVudDogYnVtcG1hcF9w
YXJzX2ZyYWdtZW50LAorCQljbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IGNsaXBwaW5nX3BsYW5l
c19mcmFnbWVudCwKKwkJY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IGNsaXBwaW5nX3Bs
YW5lc19wYXJzX2ZyYWdtZW50LAorCQljbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6IGNsaXBw
aW5nX3BsYW5lc19wYXJzX3ZlcnRleCwKKwkJY2xpcHBpbmdfcGxhbmVzX3ZlcnRleDogY2xpcHBp
bmdfcGxhbmVzX3ZlcnRleCwKKwkJY29sb3JfZnJhZ21lbnQ6IGNvbG9yX2ZyYWdtZW50LAorCQlj
b2xvcl9wYXJzX2ZyYWdtZW50OiBjb2xvcl9wYXJzX2ZyYWdtZW50LAorCQljb2xvcl9wYXJzX3Zl
cnRleDogY29sb3JfcGFyc192ZXJ0ZXgsCisJCWNvbG9yX3ZlcnRleDogY29sb3JfdmVydGV4LAor
CQljb21tb246IGNvbW1vbiwKKwkJY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50OiBjdWJlX3V2
X3JlZmxlY3Rpb25fZnJhZ21lbnQsCisJCWRlZmF1bHRub3JtYWxfdmVydGV4OiBkZWZhdWx0bm9y
bWFsX3ZlcnRleCwKKwkJZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4OiBkaXNwbGFjZW1lbnRt
YXBfcGFyc192ZXJ0ZXgsCisJCWRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IGRpc3BsYWNlbWVudG1h
cF92ZXJ0ZXgsCisJCWVtaXNzaXZlbWFwX2ZyYWdtZW50OiBlbWlzc2l2ZW1hcF9mcmFnbWVudCwK
KwkJZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDogZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCwK
KwkJZW5jb2RpbmdzX2ZyYWdtZW50OiBlbmNvZGluZ3NfZnJhZ21lbnQsCisJCWVuY29kaW5nc19w
YXJzX2ZyYWdtZW50OiBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCwKKwkJZW52bWFwX2ZyYWdtZW50
OiBlbnZtYXBfZnJhZ21lbnQsCisJCWVudm1hcF9wYXJzX2ZyYWdtZW50OiBlbnZtYXBfcGFyc19m
cmFnbWVudCwKKwkJZW52bWFwX3BhcnNfdmVydGV4OiBlbnZtYXBfcGFyc192ZXJ0ZXgsCisJCWVu
dm1hcF92ZXJ0ZXg6IGVudm1hcF92ZXJ0ZXgsCisJCWZvZ192ZXJ0ZXg6IGZvZ192ZXJ0ZXgsCisJ
CWZvZ19wYXJzX3ZlcnRleDogZm9nX3BhcnNfdmVydGV4LAorCQlmb2dfZnJhZ21lbnQ6IGZvZ19m
cmFnbWVudCwKKwkJZm9nX3BhcnNfZnJhZ21lbnQ6IGZvZ19wYXJzX2ZyYWdtZW50LAorCQlncmFk
aWVudG1hcF9wYXJzX2ZyYWdtZW50OiBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50LAorCQlsaWdo
dG1hcF9mcmFnbWVudDogbGlnaHRtYXBfZnJhZ21lbnQsCisJCWxpZ2h0bWFwX3BhcnNfZnJhZ21l
bnQ6IGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQsCisJCWxpZ2h0c19sYW1iZXJ0X3ZlcnRleDogbGln
aHRzX2xhbWJlcnRfdmVydGV4LAorCQlsaWdodHNfcGFyczogbGlnaHRzX3BhcnMsCisJCWxpZ2h0
c19waG9uZ19mcmFnbWVudDogbGlnaHRzX3Bob25nX2ZyYWdtZW50LAorCQlsaWdodHNfcGhvbmdf
cGFyc19mcmFnbWVudDogbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQsCisJCWxpZ2h0c19waHlz
aWNhbF9mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50LAorCQlsaWdodHNfcGh5c2lj
YWxfcGFyc19mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQsCisJCWxpZ2h0
c190ZW1wbGF0ZTogbGlnaHRzX3RlbXBsYXRlLAorCQlsb2dkZXB0aGJ1Zl9mcmFnbWVudDogbG9n
ZGVwdGhidWZfZnJhZ21lbnQsCisJCWxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ6IGxvZ2RlcHRo
YnVmX3BhcnNfZnJhZ21lbnQsCisJCWxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiBsb2dkZXB0aGJ1
Zl9wYXJzX3ZlcnRleCwKKwkJbG9nZGVwdGhidWZfdmVydGV4OiBsb2dkZXB0aGJ1Zl92ZXJ0ZXgs
CisJCW1hcF9mcmFnbWVudDogbWFwX2ZyYWdtZW50LAorCQltYXBfcGFyc19mcmFnbWVudDogbWFw
X3BhcnNfZnJhZ21lbnQsCisJCW1hcF9wYXJ0aWNsZV9mcmFnbWVudDogbWFwX3BhcnRpY2xlX2Zy
YWdtZW50LAorCQltYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDogbWFwX3BhcnRpY2xlX3BhcnNf
ZnJhZ21lbnQsCisJCW1ldGFsbmVzc21hcF9mcmFnbWVudDogbWV0YWxuZXNzbWFwX2ZyYWdtZW50
LAorCQltZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDogbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21l
bnQsCisJCW1vcnBobm9ybWFsX3ZlcnRleDogbW9ycGhub3JtYWxfdmVydGV4LAorCQltb3JwaHRh
cmdldF9wYXJzX3ZlcnRleDogbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXgsCisJCW1vcnBodGFyZ2V0
X3ZlcnRleDogbW9ycGh0YXJnZXRfdmVydGV4LAorCQlub3JtYWxfZmxpcDogbm9ybWFsX2ZsaXAs
CisJCW5vcm1hbF9mcmFnbWVudDogbm9ybWFsX2ZyYWdtZW50LAorCQlub3JtYWxtYXBfcGFyc19m
cmFnbWVudDogbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQsCisJCXBhY2tpbmc6IHBhY2tpbmcsCisJ
CXByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6IHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21l
bnQsCisJCXByb2plY3RfdmVydGV4OiBwcm9qZWN0X3ZlcnRleCwKKwkJZGl0aGVyaW5nX2ZyYWdt
ZW50OiBkaXRoZXJpbmdfZnJhZ21lbnQsCisJCWRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiBkaXRo
ZXJpbmdfcGFyc19mcmFnbWVudCwKKwkJcm91Z2huZXNzbWFwX2ZyYWdtZW50OiByb3VnaG5lc3Nt
YXBfZnJhZ21lbnQsCisJCXJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBf
cGFyc19mcmFnbWVudCwKKwkJc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hcF9wYXJz
X2ZyYWdtZW50LAorCQlzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IHNoYWRvd21hcF9wYXJzX3ZlcnRl
eCwKKwkJc2hhZG93bWFwX3ZlcnRleDogc2hhZG93bWFwX3ZlcnRleCwKKwkJc2hhZG93bWFza19w
YXJzX2ZyYWdtZW50OiBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQsCisJCXNraW5iYXNlX3ZlcnRl
eDogc2tpbmJhc2VfdmVydGV4LAorCQlza2lubmluZ19wYXJzX3ZlcnRleDogc2tpbm5pbmdfcGFy
c192ZXJ0ZXgsCisJCXNraW5uaW5nX3ZlcnRleDogc2tpbm5pbmdfdmVydGV4LAorCQlza2lubm9y
bWFsX3ZlcnRleDogc2tpbm5vcm1hbF92ZXJ0ZXgsCisJCXNwZWN1bGFybWFwX2ZyYWdtZW50OiBz
cGVjdWxhcm1hcF9mcmFnbWVudCwKKwkJc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDogc3BlY3Vs
YXJtYXBfcGFyc19mcmFnbWVudCwKKwkJdG9uZW1hcHBpbmdfZnJhZ21lbnQ6IHRvbmVtYXBwaW5n
X2ZyYWdtZW50LAorCQl0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiB0b25lbWFwcGluZ19wYXJz
X2ZyYWdtZW50LAorCQl1dl9wYXJzX2ZyYWdtZW50OiB1dl9wYXJzX2ZyYWdtZW50LAorCQl1dl9w
YXJzX3ZlcnRleDogdXZfcGFyc192ZXJ0ZXgsCisJCXV2X3ZlcnRleDogdXZfdmVydGV4LAorCQl1
djJfcGFyc19mcmFnbWVudDogdXYyX3BhcnNfZnJhZ21lbnQsCisJCXV2Ml9wYXJzX3ZlcnRleDog
dXYyX3BhcnNfdmVydGV4LAorCQl1djJfdmVydGV4OiB1djJfdmVydGV4LAorCQl3b3JsZHBvc192
ZXJ0ZXg6IHdvcmxkcG9zX3ZlcnRleCwKKworCQljdWJlX2ZyYWc6IGN1YmVfZnJhZywKKwkJY3Vi
ZV92ZXJ0OiBjdWJlX3ZlcnQsCisJCWRlcHRoX2ZyYWc6IGRlcHRoX2ZyYWcsCisJCWRlcHRoX3Zl
cnQ6IGRlcHRoX3ZlcnQsCisJCWRpc3RhbmNlUkdCQV9mcmFnOiBkaXN0YW5jZVJHQkFfZnJhZywK
KwkJZGlzdGFuY2VSR0JBX3ZlcnQ6IGRpc3RhbmNlUkdCQV92ZXJ0LAorCQllcXVpcmVjdF9mcmFn
OiBlcXVpcmVjdF9mcmFnLAorCQllcXVpcmVjdF92ZXJ0OiBlcXVpcmVjdF92ZXJ0LAorCQlsaW5l
ZGFzaGVkX2ZyYWc6IGxpbmVkYXNoZWRfZnJhZywKKwkJbGluZWRhc2hlZF92ZXJ0OiBsaW5lZGFz
aGVkX3ZlcnQsCisJCW1lc2hiYXNpY19mcmFnOiBtZXNoYmFzaWNfZnJhZywKKwkJbWVzaGJhc2lj
X3ZlcnQ6IG1lc2hiYXNpY192ZXJ0LAorCQltZXNobGFtYmVydF9mcmFnOiBtZXNobGFtYmVydF9m
cmFnLAorCQltZXNobGFtYmVydF92ZXJ0OiBtZXNobGFtYmVydF92ZXJ0LAorCQltZXNocGhvbmdf
ZnJhZzogbWVzaHBob25nX2ZyYWcsCisJCW1lc2hwaG9uZ192ZXJ0OiBtZXNocGhvbmdfdmVydCwK
KwkJbWVzaHBoeXNpY2FsX2ZyYWc6IG1lc2hwaHlzaWNhbF9mcmFnLAorCQltZXNocGh5c2ljYWxf
dmVydDogbWVzaHBoeXNpY2FsX3ZlcnQsCisJCW5vcm1hbF9mcmFnOiBub3JtYWxfZnJhZywKKwkJ
bm9ybWFsX3ZlcnQ6IG5vcm1hbF92ZXJ0LAorCQlwb2ludHNfZnJhZzogcG9pbnRzX2ZyYWcsCisJ
CXBvaW50c192ZXJ0OiBwb2ludHNfdmVydCwKKwkJc2hhZG93X2ZyYWc6IHNoYWRvd19mcmFnLAor
CQlzaGFkb3dfdmVydDogc2hhZG93X3ZlcnQKKwl9OworCisJLyoqCisJICogQGF1dGhvciBhbHRl
cmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0
dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dv
bW8uc2UvCisJICovCisKKwl2YXIgU2hhZGVyTGliID0geworCisJCWJhc2ljOiB7CisKKwkJCXVu
aWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbCisJCQkJVW5pZm9ybXNMaWIuY29tbW9uLAor
CQkJCVVuaWZvcm1zTGliLmFvbWFwLAorCQkJCVVuaWZvcm1zTGliLmxpZ2h0bWFwLAorCQkJCVVu
aWZvcm1zTGliLmZvZworCQkJXSApLAorCisJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1l
c2hiYXNpY192ZXJ0LAorCQkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY19m
cmFnCisKKwkJfSwKKworCQlsYW1iZXJ0OiB7CisKKwkJCXVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxz
Lm1lcmdlKCBbCisJCQkJVW5pZm9ybXNMaWIuY29tbW9uLAorCQkJCVVuaWZvcm1zTGliLmFvbWFw
LAorCQkJCVVuaWZvcm1zTGliLmxpZ2h0bWFwLAorCQkJCVVuaWZvcm1zTGliLmVtaXNzaXZlbWFw
LAorCQkJCVVuaWZvcm1zTGliLmZvZywKKwkJCQlVbmlmb3Jtc0xpYi5saWdodHMsCisJCQkJewor
CQkJCQllbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0KKwkJCQl9CisJ
CQldICksCisKKwkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGxhbWJlcnRfdmVydCwK
KwkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF9mcmFnCisKKwkJfSwK
KworCQlwaG9uZzogeworCisJCQl1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggWworCQkJ
CVVuaWZvcm1zTGliLmNvbW1vbiwKKwkJCQlVbmlmb3Jtc0xpYi5hb21hcCwKKwkJCQlVbmlmb3Jt
c0xpYi5saWdodG1hcCwKKwkJCQlVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCwKKwkJCQlVbmlmb3Jt
c0xpYi5idW1wbWFwLAorCQkJCVVuaWZvcm1zTGliLm5vcm1hbG1hcCwKKwkJCQlVbmlmb3Jtc0xp
Yi5kaXNwbGFjZW1lbnRtYXAsCisJCQkJVW5pZm9ybXNMaWIuZ3JhZGllbnRtYXAsCisJCQkJVW5p
Zm9ybXNMaWIuZm9nLAorCQkJCVVuaWZvcm1zTGliLmxpZ2h0cywKKwkJCQl7CisJCQkJCWVtaXNz
aXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSwKKwkJCQkJc3BlY3VsYXI6IHsg
dmFsdWU6IG5ldyBDb2xvciggMHgxMTExMTEgKSB9LAorCQkJCQlzaGluaW5lc3M6IHsgdmFsdWU6
IDMwIH0KKwkJCQl9CisJCQldICksCisKKwkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVz
aHBob25nX3ZlcnQsCisJCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX2Zy
YWcKKworCQl9LAorCisJCXN0YW5kYXJkOiB7CisKKwkJCXVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxz
Lm1lcmdlKCBbCisJCQkJVW5pZm9ybXNMaWIuY29tbW9uLAorCQkJCVVuaWZvcm1zTGliLmFvbWFw
LAorCQkJCVVuaWZvcm1zTGliLmxpZ2h0bWFwLAorCQkJCVVuaWZvcm1zTGliLmVtaXNzaXZlbWFw
LAorCQkJCVVuaWZvcm1zTGliLmJ1bXBtYXAsCisJCQkJVW5pZm9ybXNMaWIubm9ybWFsbWFwLAor
CQkJCVVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCwKKwkJCQlVbmlmb3Jtc0xpYi5yb3VnaG5l
c3NtYXAsCisJCQkJVW5pZm9ybXNMaWIubWV0YWxuZXNzbWFwLAorCQkJCVVuaWZvcm1zTGliLmZv
ZywKKwkJCQlVbmlmb3Jtc0xpYi5saWdodHMsCisJCQkJeworCQkJCQllbWlzc2l2ZTogeyB2YWx1
ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sCisJCQkJCXJvdWdobmVzczogeyB2YWx1ZTogMC41
IH0sCisJCQkJCW1ldGFsbmVzczogeyB2YWx1ZTogMC41IH0sCisJCQkJCWVudk1hcEludGVuc2l0
eTogeyB2YWx1ZTogMSB9IC8vIHRlbXBvcmFyeQorCQkJCX0KKwkJCV0gKSwKKworCQkJdmVydGV4
U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCwKKwkJCWZyYWdtZW50U2hhZGVy
OiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfZnJhZworCisJCX0sCisKKwkJcG9pbnRzOiB7CisK
KwkJCXVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbCisJCQkJVW5pZm9ybXNMaWIucG9p
bnRzLAorCQkJCVVuaWZvcm1zTGliLmZvZworCQkJXSApLAorCisJCQl2ZXJ0ZXhTaGFkZXI6IFNo
YWRlckNodW5rLnBvaW50c192ZXJ0LAorCQkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnBv
aW50c19mcmFnCisKKwkJfSwKKworCQlkYXNoZWQ6IHsKKworCQkJdW5pZm9ybXM6IFVuaWZvcm1z
VXRpbHMubWVyZ2UoIFsKKwkJCQlVbmlmb3Jtc0xpYi5jb21tb24sCisJCQkJVW5pZm9ybXNMaWIu
Zm9nLAorCQkJCXsKKwkJCQkJc2NhbGU6IHsgdmFsdWU6IDEgfSwKKwkJCQkJZGFzaFNpemU6IHsg
dmFsdWU6IDEgfSwKKwkJCQkJdG90YWxTaXplOiB7IHZhbHVlOiAyIH0KKwkJCQl9CisJCQldICks
CisKKwkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF92ZXJ0LAorCQkJZnJh
Z21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmxpbmVkYXNoZWRfZnJhZworCisJCX0sCisKKwkJZGVw
dGg6IHsKKworCQkJdW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFsKKwkJCQlVbmlmb3Jt
c0xpYi5jb21tb24sCisJCQkJVW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwCisJCQldICksCisK
KwkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZGVwdGhfdmVydCwKKwkJCWZyYWdtZW50U2hh
ZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnCisKKwkJfSwKKworCQlub3JtYWw6IHsKKworCQkJ
dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFsKKwkJCQlVbmlmb3Jtc0xpYi5jb21tb24s
CisJCQkJVW5pZm9ybXNMaWIuYnVtcG1hcCwKKwkJCQlVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsCisJ
CQkJVW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLAorCQkJCXsKKwkJCQkJb3BhY2l0eTogeyB2
YWx1ZTogMS4wIH0KKwkJCQl9CisJCQldICksCisKKwkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1
bmsubm9ybWFsX3ZlcnQsCisJCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX2Zy
YWcKKworCQl9LAorCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8JQ3ViZSBtYXAgc2hhZGVy
CisJCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJY3ViZTogeworCisJCQl1bmlmb3Jtczogewor
CQkJCXRDdWJlOiB7IHZhbHVlOiBudWxsIH0sCisJCQkJdEZsaXA6IHsgdmFsdWU6IC0gMSB9LAor
CQkJCW9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9CisJCQl9LAorCisJCQl2ZXJ0ZXhTaGFkZXI6IFNo
YWRlckNodW5rLmN1YmVfdmVydCwKKwkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJl
X2ZyYWcKKworCQl9LAorCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8JQ3ViZSBtYXAgc2hh
ZGVyCisJCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkJZXF1aXJlY3Q6IHsKKworCQkJdW5pZm9y
bXM6IHsKKwkJCQl0RXF1aXJlY3Q6IHsgdmFsdWU6IG51bGwgfSwKKwkJCQl0RmxpcDogeyB2YWx1
ZTogLSAxIH0KKwkJCX0sCisKKwkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3Rf
dmVydCwKKwkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF9mcmFnCisKKwkJ
fSwKKworCQlkaXN0YW5jZVJHQkE6IHsKKworCQkJdW5pZm9ybXM6IHsKKwkJCQlsaWdodFBvczog
eyB2YWx1ZTogbmV3IFZlY3RvcjMoKSB9CisJCQl9LAorCisJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRl
ckNodW5rLmRpc3RhbmNlUkdCQV92ZXJ0LAorCQkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5r
LmRpc3RhbmNlUkdCQV9mcmFnCisKKwkJfQorCisJfTsKKworCVNoYWRlckxpYi5waHlzaWNhbCA9
IHsKKworCQl1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggWworCQkJU2hhZGVyTGliLnN0
YW5kYXJkLnVuaWZvcm1zLAorCQkJeworCQkJCWNsZWFyQ29hdDogeyB2YWx1ZTogMCB9LAorCQkJ
CWNsZWFyQ29hdFJvdWdobmVzczogeyB2YWx1ZTogMCB9CisJCQl9CisJCV0gKSwKKworCQl2ZXJ0
ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LAorCQlmcmFnbWVudFNoYWRl
cjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWcKKworCX07CisKKwkvKioKKwkgKiBAYXV0
aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCisJICovCisKKwlmdW5jdGlvbiBCb3gyKCBt
aW4sIG1heCApIHsKKworCQl0aGlzLm1pbiA9ICggbWluICE9PSB1bmRlZmluZWQgKSA/IG1pbiA6
IG5ldyBWZWN0b3IyKCArIEluZmluaXR5LCArIEluZmluaXR5ICk7CisJCXRoaXMubWF4ID0gKCBt
YXggIT09IHVuZGVmaW5lZCApID8gbWF4IDogbmV3IFZlY3RvcjIoIC0gSW5maW5pdHksIC0gSW5m
aW5pdHkgKTsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIEJveDIucHJvdG90eXBlLCB7CisKKwkJ
c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkgeworCisJCQl0aGlzLm1pbi5jb3B5KCBtaW4gKTsK
KwkJCXRoaXMubWF4LmNvcHkoIG1heCApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJ
CXNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkgeworCisJCQl0aGlzLm1ha2VFbXB0
eSgpOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBp
ICsrICkgeworCisJCQkJdGhpcy5leHBhbmRCeVBvaW50KCBwb2ludHNbIGkgXSApOworCisJCQl9
CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1
bmN0aW9uICgpIHsKKworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjIoKTsKKworCQkJcmV0dXJuIGZ1
bmN0aW9uIHNldEZyb21DZW50ZXJBbmRTaXplKCBjZW50ZXIsIHNpemUgKSB7CisKKwkJCQl2YXIg
aGFsZlNpemUgPSB2MS5jb3B5KCBzaXplICkubXVsdGlwbHlTY2FsYXIoIDAuNSApOworCQkJCXRo
aXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTsKKwkJCQl0aGlzLm1heC5jb3B5
KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJfTsK
KworCQl9KCksCisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlz
LmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOworCisJCX0sCisKKwkJY29weTogZnVuY3Rpb24g
KCBib3ggKSB7CisKKwkJCXRoaXMubWluLmNvcHkoIGJveC5taW4gKTsKKwkJCXRoaXMubWF4LmNv
cHkoIGJveC5tYXggKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQltYWtlRW1wdHk6
IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSArIEluZmluaXR5
OworCQkJdGhpcy5tYXgueCA9IHRoaXMubWF4LnkgPSAtIEluZmluaXR5OworCisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCWlzRW1wdHk6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gdGhpcyBp
cyBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNh
dXNlIHZvbHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXMKKworCQkJ
cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlz
Lm1pbi55ICk7CisKKwkJfSwKKworCQlnZXRDZW50ZXI6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJn
ZXQgKSB7CisKKwkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigp
OworCQkJcmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gcmVzdWx0LnNldCggMCwgMCApIDogcmVzdWx0
LmFkZFZlY3RvcnMoIHRoaXMubWluLCB0aGlzLm1heCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTsK
KworCQl9LAorCisJCWdldFNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJ
CXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpOworCQkJcmV0dXJu
IHRoaXMuaXNFbXB0eSgpID8gcmVzdWx0LnNldCggMCwgMCApIDogcmVzdWx0LnN1YlZlY3RvcnMo
IHRoaXMubWF4LCB0aGlzLm1pbiApOworCisJCX0sCisKKwkJZXhwYW5kQnlQb2ludDogZnVuY3Rp
b24gKCBwb2ludCApIHsKKworCQkJdGhpcy5taW4ubWluKCBwb2ludCApOworCQkJdGhpcy5tYXgu
bWF4KCBwb2ludCApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWV4cGFuZEJ5VmVj
dG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHsKKworCQkJdGhpcy5taW4uc3ViKCB2ZWN0b3IgKTsK
KwkJCXRoaXMubWF4LmFkZCggdmVjdG9yICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgeworCisJCQl0aGlzLm1pbi5h
ZGRTY2FsYXIoIC0gc2NhbGFyICk7CisJCQl0aGlzLm1heC5hZGRTY2FsYXIoIHNjYWxhciApOwor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICgg
cG9pbnQgKSB7CisKKwkJCXJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4g
dGhpcy5tYXgueCB8fAorCQkJCXBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlz
Lm1heC55ID8gZmFsc2UgOiB0cnVlOworCisJCX0sCisKKwkJY29udGFpbnNCb3g6IGZ1bmN0aW9u
ICggYm94ICkgeworCisJCQlyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1h
eC54IDw9IHRoaXMubWF4LnggJiYKKwkJCQl0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gu
bWF4LnkgPD0gdGhpcy5tYXgueTsKKworCQl9LAorCisJCWdldFBhcmFtZXRlcjogZnVuY3Rpb24g
KCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCS8vIFRoaXMgY2FuIHBvdGVudGlhbGx5
IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94CisJCQkvLyBoYXMgYSBzaXplIGRpbWVu
c2lvbiBvZiAwLgorCisJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3Rv
cjIoKTsKKworCQkJcmV0dXJuIHJlc3VsdC5zZXQoCisJCQkJKCBwb2ludC54IC0gdGhpcy5taW4u
eCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5taW4ueCApLAorCQkJCSggcG9pbnQueSAtIHRoaXMu
bWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKQorCQkJKTsKKworCQl9LAorCisJ
CWludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkgeworCisJCQkvLyB1c2luZyA0IHNwbGl0
dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9ucworCisJCQlyZXR1cm4gYm94Lm1h
eC54IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8CisJCQkJYm94Lm1h
eC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVl
OworCisJCX0sCisKKwkJY2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJn
ZXQgKSB7CisKKwkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigp
OworCQkJcmV0dXJuIHJlc3VsdC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5t
YXggKTsKKworCQl9LAorCisJCWRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCkgeworCisJCQl2
YXIgdjEgPSBuZXcgVmVjdG9yMigpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1Bv
aW50KCBwb2ludCApIHsKKworCQkJCXZhciBjbGFtcGVkUG9pbnQgPSB2MS5jb3B5KCBwb2ludCAp
LmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTsKKwkJCQlyZXR1cm4gY2xhbXBlZFBvaW50LnN1
YiggcG9pbnQgKS5sZW5ndGgoKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJaW50ZXJzZWN0OiBm
dW5jdGlvbiAoIGJveCApIHsKKworCQkJdGhpcy5taW4ubWF4KCBib3gubWluICk7CisJCQl0aGlz
Lm1heC5taW4oIGJveC5tYXggKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQl1bmlv
bjogZnVuY3Rpb24gKCBib3ggKSB7CisKKwkJCXRoaXMubWluLm1pbiggYm94Lm1pbiApOworCQkJ
dGhpcy5tYXgubWF4KCBib3gubWF4ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJ
dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHsKKworCQkJdGhpcy5taW4uYWRkKCBvZmZz
ZXQgKTsKKwkJCXRoaXMubWF4LmFkZCggb2Zmc2V0ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJ
CX0sCisKKwkJZXF1YWxzOiBmdW5jdGlvbiAoIGJveCApIHsKKworCQkJcmV0dXJuIGJveC5taW4u
ZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApOworCisJCX0K
KworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dv
bW8uc2UvCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8K
KwkgKi8KKworCWZ1bmN0aW9uIExlbnNGbGFyZVBsdWdpbiggcmVuZGVyZXIsIGZsYXJlcyApIHsK
KworCQl2YXIgZ2wgPSByZW5kZXJlci5jb250ZXh0OworCQl2YXIgc3RhdGUgPSByZW5kZXJlci5z
dGF0ZTsKKworCQl2YXIgdmVydGV4QnVmZmVyLCBlbGVtZW50QnVmZmVyOworCQl2YXIgc2hhZGVy
LCBwcm9ncmFtLCBhdHRyaWJ1dGVzLCB1bmlmb3JtczsKKworCQl2YXIgdGVtcFRleHR1cmUsIG9j
Y2x1c2lvblRleHR1cmU7CisKKwkJZnVuY3Rpb24gaW5pdCgpIHsKKworCQkJdmFyIHZlcnRpY2Vz
ID0gbmV3IEZsb2F0MzJBcnJheSggWworCQkJCS0gMSwgLSAxLCAgMCwgMCwKKwkJCQkgMSwgLSAx
LCAgMSwgMCwKKwkJCQkgMSwgIDEsICAxLCAxLAorCQkJCS0gMSwgIDEsICAwLCAxCisJCQldICk7
CisKKwkJCXZhciBmYWNlcyA9IG5ldyBVaW50MTZBcnJheSggWworCQkJCTAsIDEsIDIsCisJCQkJ
MCwgMiwgMworCQkJXSApOworCisJCQkvLyBidWZmZXJzCisKKwkJCXZlcnRleEJ1ZmZlciAgICAg
PSBnbC5jcmVhdGVCdWZmZXIoKTsKKwkJCWVsZW1lbnRCdWZmZXIgICAgPSBnbC5jcmVhdGVCdWZm
ZXIoKTsKKworCQkJZ2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIg
KTsKKwkJCWdsLmJ1ZmZlckRhdGEoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGljZXMsIGdsLlNUQVRJ
Q19EUkFXICk7CisKKwkJCWdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBl
bGVtZW50QnVmZmVyICk7CisJCQlnbC5idWZmZXJEYXRhKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZF
UiwgZmFjZXMsIGdsLlNUQVRJQ19EUkFXICk7CisKKwkJCS8vIHRleHR1cmVzCisKKwkJCXRlbXBU
ZXh0dXJlICAgICAgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CisJCQlvY2NsdXNpb25UZXh0dXJlID0g
Z2wuY3JlYXRlVGV4dHVyZSgpOworCisJCQlzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8y
RCwgdGVtcFRleHR1cmUgKTsKKwkJCWdsLnRleEltYWdlMkQoIGdsLlRFWFRVUkVfMkQsIDAsIGds
LlJHQiwgMTYsIDE2LCAwLCBnbC5SR0IsIGdsLlVOU0lHTkVEX0JZVEUsIG51bGwgKTsKKwkJCWds
LnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFN
UF9UT19FREdFICk7CisJCQlnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhU
VVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSApOworCQkJZ2wudGV4UGFyYW1ldGVyaSggZ2wu
VEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUICk7CisJCQlnbC50
ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5F
QVJFU1QgKTsKKworCQkJc3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIG9jY2x1c2lv
blRleHR1cmUgKTsKKwkJCWdsLnRleEltYWdlMkQoIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEs
IDE2LCAxNiwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgbnVsbCApOworCQkJZ2wudGV4
UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RP
X0VER0UgKTsKKwkJCWdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVf
V1JBUF9ULCBnbC5DTEFNUF9UT19FREdFICk7CisJCQlnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhU
VVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QgKTsKKwkJCWdsLnRleFBh
cmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVT
VCApOworCisJCQlzaGFkZXIgPSB7CisKKwkJCQl2ZXJ0ZXhTaGFkZXI6IFsKKworCQkJCQkidW5p
Zm9ybSBsb3dwIGludCByZW5kZXJUeXBlOyIsCisKKwkJCQkJInVuaWZvcm0gdmVjMyBzY3JlZW5Q
b3NpdGlvbjsiLAorCQkJCQkidW5pZm9ybSB2ZWMyIHNjYWxlOyIsCisJCQkJCSJ1bmlmb3JtIGZs
b2F0IHJvdGF0aW9uOyIsCisKKwkJCQkJInVuaWZvcm0gc2FtcGxlcjJEIG9jY2x1c2lvbk1hcDsi
LAorCisJCQkJCSJhdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsiLAorCQkJCQkiYXR0cmlidXRlIHZl
YzIgdXY7IiwKKworCQkJCQkidmFyeWluZyB2ZWMyIHZVVjsiLAorCQkJCQkidmFyeWluZyBmbG9h
dCB2VmlzaWJpbGl0eTsiLAorCisJCQkJCSJ2b2lkIG1haW4oKSB7IiwKKworCQkJCQkJInZVViA9
IHV2OyIsCisKKwkJCQkJCSJ2ZWMyIHBvcyA9IHBvc2l0aW9uOyIsCisKKwkJCQkJCSJpZiAoIHJl
bmRlclR5cGUgPT0gMiApIHsiLAorCisJCQkJCQkJInZlYzQgdmlzaWJpbGl0eSA9IHRleHR1cmUy
RCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjEsIDAuMSApICk7IiwKKwkJCQkJCQkidmlzaWJpbGl0
eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC41LCAwLjEgKSApOyIsCisJCQkJ
CQkJInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuOSwgMC4x
ICkgKTsiLAorCQkJCQkJCSJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2
ZWMyKCAwLjksIDAuNSApICk7IiwKKwkJCQkJCQkidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9j
Y2x1c2lvbk1hcCwgdmVjMiggMC45LCAwLjkgKSApOyIsCisJCQkJCQkJInZpc2liaWxpdHkgKz0g
dGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuNSwgMC45ICkgKTsiLAorCQkJCQkJCSJ2
aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjEsIDAuOSApICk7
IiwKKwkJCQkJCQkidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMigg
MC4xLCAwLjUgKSApOyIsCisJCQkJCQkJInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNp
b25NYXAsIHZlYzIoIDAuNSwgMC41ICkgKTsiLAorCisJCQkJCQkJInZWaXNpYmlsaXR5ID0gICAg
ICAgIHZpc2liaWxpdHkuciAvIDkuMDsiLAorCQkJCQkJCSJ2VmlzaWJpbGl0eSAqPSAxLjAgLSB2
aXNpYmlsaXR5LmcgLyA5LjA7IiwKKwkJCQkJCQkidlZpc2liaWxpdHkgKj0gICAgICAgdmlzaWJp
bGl0eS5iIC8gOS4wOyIsCisJCQkJCQkJInZWaXNpYmlsaXR5ICo9IDEuMCAtIHZpc2liaWxpdHku
YSAvIDkuMDsiLAorCisJCQkJCQkJInBvcy54ID0gY29zKCByb3RhdGlvbiApICogcG9zaXRpb24u
eCAtIHNpbiggcm90YXRpb24gKSAqIHBvc2l0aW9uLnk7IiwKKwkJCQkJCQkicG9zLnkgPSBzaW4o
IHJvdGF0aW9uICkgKiBwb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogcG9zaXRpb24ueTsi
LAorCisJCQkJCQkifSIsCisKKwkJCQkJCSJnbF9Qb3NpdGlvbiA9IHZlYzQoICggcG9zICogc2Nh
bGUgKyBzY3JlZW5Qb3NpdGlvbi54eSApLnh5LCBzY3JlZW5Qb3NpdGlvbi56LCAxLjAgKTsiLAor
CisJCQkJCSJ9IgorCisJCQkJXS5qb2luKCAiXG4iICksCisKKwkJCQlmcmFnbWVudFNoYWRlcjog
WworCisJCQkJCSJ1bmlmb3JtIGxvd3AgaW50IHJlbmRlclR5cGU7IiwKKworCQkJCQkidW5pZm9y
bSBzYW1wbGVyMkQgbWFwOyIsCisJCQkJCSJ1bmlmb3JtIGZsb2F0IG9wYWNpdHk7IiwKKwkJCQkJ
InVuaWZvcm0gdmVjMyBjb2xvcjsiLAorCisJCQkJCSJ2YXJ5aW5nIHZlYzIgdlVWOyIsCisJCQkJ
CSJ2YXJ5aW5nIGZsb2F0IHZWaXNpYmlsaXR5OyIsCisKKwkJCQkJInZvaWQgbWFpbigpIHsiLAor
CisJCQkJCQkvLyBwaW5rIHNxdWFyZQorCisJCQkJCQkiaWYgKCByZW5kZXJUeXBlID09IDAgKSB7
IiwKKworCQkJCQkJCSJnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMS4wLCAwLjAgKTsi
LAorCisJCQkJCQkvLyByZXN0b3JlCisKKwkJCQkJCSJ9IGVsc2UgaWYgKCByZW5kZXJUeXBlID09
IDEgKSB7IiwKKworCQkJCQkJCSJnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdlVWICk7
IiwKKworCQkJCQkJLy8gZmxhcmUKKworCQkJCQkJIn0gZWxzZSB7IiwKKworCQkJCQkJCSJ2ZWM0
IHRleHR1cmUgPSB0ZXh0dXJlMkQoIG1hcCwgdlVWICk7IiwKKwkJCQkJCQkidGV4dHVyZS5hICo9
IG9wYWNpdHkgKiB2VmlzaWJpbGl0eTsiLAorCQkJCQkJCSJnbF9GcmFnQ29sb3IgPSB0ZXh0dXJl
OyIsCisJCQkJCQkJImdsX0ZyYWdDb2xvci5yZ2IgKj0gY29sb3I7IiwKKworCQkJCQkJIn0iLAor
CisJCQkJCSJ9IgorCisJCQkJXS5qb2luKCAiXG4iICkKKworCQkJfTsKKworCQkJcHJvZ3JhbSA9
IGNyZWF0ZVByb2dyYW0oIHNoYWRlciApOworCisJCQlhdHRyaWJ1dGVzID0geworCQkJCXZlcnRl
eDogZ2wuZ2V0QXR0cmliTG9jYXRpb24gKCBwcm9ncmFtLCAicG9zaXRpb24iICksCisJCQkJdXY6
ICAgICBnbC5nZXRBdHRyaWJMb2NhdGlvbiAoIHByb2dyYW0sICJ1diIgKQorCQkJfTsKKworCQkJ
dW5pZm9ybXMgPSB7CisJCQkJcmVuZGVyVHlwZTogICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbigg
cHJvZ3JhbSwgInJlbmRlclR5cGUiICksCisJCQkJbWFwOiAgICAgICAgICAgIGdsLmdldFVuaWZv
cm1Mb2NhdGlvbiggcHJvZ3JhbSwgIm1hcCIgKSwKKwkJCQlvY2NsdXNpb25NYXA6ICAgZ2wuZ2V0
VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAib2NjbHVzaW9uTWFwIiApLAorCQkJCW9wYWNpdHk6
ICAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICJvcGFjaXR5IiApLAorCQkJ
CWNvbG9yOiAgICAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICJjb2xvciIg
KSwKKwkJCQlzY2FsZTogICAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAi
c2NhbGUiICksCisJCQkJcm90YXRpb246ICAgICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJv
Z3JhbSwgInJvdGF0aW9uIiApLAorCQkJCXNjcmVlblBvc2l0aW9uOiBnbC5nZXRVbmlmb3JtTG9j
YXRpb24oIHByb2dyYW0sICJzY3JlZW5Qb3NpdGlvbiIgKQorCQkJfTsKKworCQl9CisKKwkJLyoK
KwkJICogUmVuZGVyIGxlbnMgZmxhcmVzCisJCSAqIE1ldGhvZDogcmVuZGVycyAxNngxNiAweGZm
MDBmZi1jb2xvcmVkIHBvaW50cyBzY2F0dGVyZWQgb3ZlciB0aGUgbGlnaHQgc291cmNlIGFyZWEs
CisJCSAqICAgICAgICAgcmVhZHMgdGhlc2UgYmFjayBhbmQgY2FsY3VsYXRlcyBvY2NsdXNpb24u
CisJCSAqLworCisJCXRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhLCB2aWV3
cG9ydCApIHsKKworCQkJaWYgKCBmbGFyZXMubGVuZ3RoID09PSAwICkgcmV0dXJuOworCisJCQl2
YXIgdGVtcFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTsKKworCQkJdmFyIGludkFzcGVjdCA9IHZp
ZXdwb3J0LncgLyB2aWV3cG9ydC56LAorCQkJCWhhbGZWaWV3cG9ydFdpZHRoID0gdmlld3BvcnQu
eiAqIDAuNSwKKwkJCQloYWxmVmlld3BvcnRIZWlnaHQgPSB2aWV3cG9ydC53ICogMC41OworCisJ
CQl2YXIgc2l6ZSA9IDE2IC8gdmlld3BvcnQudywKKwkJCQlzY2FsZSA9IG5ldyBWZWN0b3IyKCBz
aXplICogaW52QXNwZWN0LCBzaXplICk7CisKKwkJCXZhciBzY3JlZW5Qb3NpdGlvbiA9IG5ldyBW
ZWN0b3IzKCAxLCAxLCAwICksCisJCQkJc2NyZWVuUG9zaXRpb25QaXhlbHMgPSBuZXcgVmVjdG9y
MiggMSwgMSApOworCisJCQl2YXIgdmFsaWRBcmVhID0gbmV3IEJveDIoKTsKKworCQkJdmFsaWRB
cmVhLm1pbi5zZXQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnkgKTsKKwkJCXZhbGlkQXJlYS5tYXgu
c2V0KCB2aWV3cG9ydC54ICsgKCB2aWV3cG9ydC56IC0gMTYgKSwgdmlld3BvcnQueSArICggdmll
d3BvcnQudyAtIDE2ICkgKTsKKworCQkJaWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7CisK
KwkJCQlpbml0KCk7CisKKwkJCX0KKworCQkJZ2wudXNlUHJvZ3JhbSggcHJvZ3JhbSApOworCisJ
CQlzdGF0ZS5pbml0QXR0cmlidXRlcygpOworCQkJc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRy
aWJ1dGVzLnZlcnRleCApOworCQkJc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnV2
ICk7CisJCQlzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpOworCisJCQkvLyBsb29wIHRo
cm91Z2ggYWxsIGxlbnMgZmxhcmVzIHRvIHVwZGF0ZSB0aGVpciBvY2NsdXNpb24gYW5kIHBvc2l0
aW9ucworCQkJLy8gc2V0dXAgZ2wgYW5kIGNvbW1vbiB1c2VkIGF0dHJpYnMvdW5pZm9ybXMKKwor
CQkJZ2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5vY2NsdXNpb25NYXAsIDAgKTsKKwkJCWdsLnVuaWZv
cm0xaSggdW5pZm9ybXMubWFwLCAxICk7CisKKwkJCWdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JV
RkZFUiwgdmVydGV4QnVmZmVyICk7CisJCQlnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBhdHRyaWJ1
dGVzLnZlcnRleCwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgMCApOworCQkJZ2wudmVydGV4
QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy51diwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwg
OCApOworCisJCQlnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVu
dEJ1ZmZlciApOworCisJCQlzdGF0ZS5kaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKTsKKwkJCXN0YXRl
LmJ1ZmZlcnMuZGVwdGguc2V0TWFzayggZmFsc2UgKTsKKworCQkJZm9yICggdmFyIGkgPSAwLCBs
ID0gZmxhcmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQlzaXplID0gMTYgLyB2aWV3
cG9ydC53OworCQkJCXNjYWxlLnNldCggc2l6ZSAqIGludkFzcGVjdCwgc2l6ZSApOworCisJCQkJ
Ly8gY2FsYyBvYmplY3Qgc2NyZWVuIHBvc2l0aW9uCisKKwkJCQl2YXIgZmxhcmUgPSBmbGFyZXNb
IGkgXTsKKworCQkJCXRlbXBQb3NpdGlvbi5zZXQoIGZsYXJlLm1hdHJpeFdvcmxkLmVsZW1lbnRz
WyAxMiBdLCBmbGFyZS5tYXRyaXhXb3JsZC5lbGVtZW50c1sgMTMgXSwgZmxhcmUubWF0cml4V29y
bGQuZWxlbWVudHNbIDE0IF0gKTsKKworCQkJCXRlbXBQb3NpdGlvbi5hcHBseU1hdHJpeDQoIGNh
bWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTsKKwkJCQl0ZW1wUG9zaXRpb24uYXBwbHlNYXRyaXg0
KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApOworCisJCQkJLy8gc2V0dXAgYXJyYXlzIGZvciBn
bCBwcm9ncmFtcworCisJCQkJc2NyZWVuUG9zaXRpb24uY29weSggdGVtcFBvc2l0aW9uICk7CisK
KwkJCQkvLyBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBs
ZWZ0IGNvcm5lciBvZiB0aGUgcGl4ZWxzIHRvIGNvcHkKKworCQkJCXNjcmVlblBvc2l0aW9uUGl4
ZWxzLnggPSB2aWV3cG9ydC54ICsgKCBzY3JlZW5Qb3NpdGlvbi54ICogaGFsZlZpZXdwb3J0V2lk
dGggKSArIGhhbGZWaWV3cG9ydFdpZHRoIC0gODsKKwkJCQlzY3JlZW5Qb3NpdGlvblBpeGVscy55
ID0gdmlld3BvcnQueSArICggc2NyZWVuUG9zaXRpb24ueSAqIGhhbGZWaWV3cG9ydEhlaWdodCAp
ICsgaGFsZlZpZXdwb3J0SGVpZ2h0IC0gODsKKworCQkJCS8vIHNjcmVlbiBjdWxsCisKKwkJCQlp
ZiAoIHZhbGlkQXJlYS5jb250YWluc1BvaW50KCBzY3JlZW5Qb3NpdGlvblBpeGVscyApID09PSB0
cnVlICkgeworCisJCQkJCS8vIHNhdmUgY3VycmVudCBSR0IgdG8gdGVtcCB0ZXh0dXJlCisKKwkJ
CQkJc3RhdGUuYWN0aXZlVGV4dHVyZSggZ2wuVEVYVFVSRTAgKTsKKwkJCQkJc3RhdGUuYmluZFRl
eHR1cmUoIGdsLlRFWFRVUkVfMkQsIG51bGwgKTsKKwkJCQkJc3RhdGUuYWN0aXZlVGV4dHVyZSgg
Z2wuVEVYVFVSRTEgKTsKKwkJCQkJc3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIHRl
bXBUZXh0dXJlICk7CisJCQkJCWdsLmNvcHlUZXhJbWFnZTJEKCBnbC5URVhUVVJFXzJELCAwLCBn
bC5SR0IsIHNjcmVlblBvc2l0aW9uUGl4ZWxzLngsIHNjcmVlblBvc2l0aW9uUGl4ZWxzLnksIDE2
LCAxNiwgMCApOworCisKKwkJCQkJLy8gcmVuZGVyIHBpbmsgcXVhZAorCisJCQkJCWdsLnVuaWZv
cm0xaSggdW5pZm9ybXMucmVuZGVyVHlwZSwgMCApOworCQkJCQlnbC51bmlmb3JtMmYoIHVuaWZv
cm1zLnNjYWxlLCBzY2FsZS54LCBzY2FsZS55ICk7CisJCQkJCWdsLnVuaWZvcm0zZiggdW5pZm9y
bXMuc2NyZWVuUG9zaXRpb24sIHNjcmVlblBvc2l0aW9uLngsIHNjcmVlblBvc2l0aW9uLnksIHNj
cmVlblBvc2l0aW9uLnogKTsKKworCQkJCQlzdGF0ZS5kaXNhYmxlKCBnbC5CTEVORCApOworCQkJ
CQlzdGF0ZS5lbmFibGUoIGdsLkRFUFRIX1RFU1QgKTsKKworCQkJCQlnbC5kcmF3RWxlbWVudHMo
IGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTsKKworCisJCQkJCS8vIGNv
cHkgcmVzdWx0IHRvIG9jY2x1c2lvbk1hcAorCisJCQkJCXN0YXRlLmFjdGl2ZVRleHR1cmUoIGds
LlRFWFRVUkUwICk7CisJCQkJCXN0YXRlLmJpbmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBvY2Ns
dXNpb25UZXh0dXJlICk7CisJCQkJCWdsLmNvcHlUZXhJbWFnZTJEKCBnbC5URVhUVVJFXzJELCAw
LCBnbC5SR0JBLCBzY3JlZW5Qb3NpdGlvblBpeGVscy54LCBzY3JlZW5Qb3NpdGlvblBpeGVscy55
LCAxNiwgMTYsIDAgKTsKKworCisJCQkJCS8vIHJlc3RvcmUgZ3JhcGhpY3MKKworCQkJCQlnbC51
bmlmb3JtMWkoIHVuaWZvcm1zLnJlbmRlclR5cGUsIDEgKTsKKwkJCQkJc3RhdGUuZGlzYWJsZSgg
Z2wuREVQVEhfVEVTVCApOworCisJCQkJCXN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUx
ICk7CisJCQkJCXN0YXRlLmJpbmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCB0ZW1wVGV4dHVyZSAp
OworCQkJCQlnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hP
UlQsIDAgKTsKKworCisJCQkJCS8vIHVwZGF0ZSBvYmplY3QgcG9zaXRpb25zCisKKwkJCQkJZmxh
cmUucG9zaXRpb25TY3JlZW4uY29weSggc2NyZWVuUG9zaXRpb24gKTsKKworCQkJCQlpZiAoIGZs
YXJlLmN1c3RvbVVwZGF0ZUNhbGxiYWNrICkgeworCisJCQkJCQlmbGFyZS5jdXN0b21VcGRhdGVD
YWxsYmFjayggZmxhcmUgKTsKKworCQkJCQl9IGVsc2UgeworCisJCQkJCQlmbGFyZS51cGRhdGVM
ZW5zRmxhcmVzKCk7CisKKwkJCQkJfQorCisJCQkJCS8vIHJlbmRlciBmbGFyZXMKKworCQkJCQln
bC51bmlmb3JtMWkoIHVuaWZvcm1zLnJlbmRlclR5cGUsIDIgKTsKKwkJCQkJc3RhdGUuZW5hYmxl
KCBnbC5CTEVORCApOworCisJCQkJCWZvciAoIHZhciBqID0gMCwgamwgPSBmbGFyZS5sZW5zRmxh
cmVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgeworCisJCQkJCQl2YXIgc3ByaXRlID0gZmxhcmUu
bGVuc0ZsYXJlc1sgaiBdOworCisJCQkJCQlpZiAoIHNwcml0ZS5vcGFjaXR5ID4gMC4wMDEgJiYg
c3ByaXRlLnNjYWxlID4gMC4wMDEgKSB7CisKKwkJCQkJCQlzY3JlZW5Qb3NpdGlvbi54ID0gc3By
aXRlLng7CisJCQkJCQkJc2NyZWVuUG9zaXRpb24ueSA9IHNwcml0ZS55OworCQkJCQkJCXNjcmVl
blBvc2l0aW9uLnogPSBzcHJpdGUuejsKKworCQkJCQkJCXNpemUgPSBzcHJpdGUuc2l6ZSAqIHNw
cml0ZS5zY2FsZSAvIHZpZXdwb3J0Lnc7CisKKwkJCQkJCQlzY2FsZS54ID0gc2l6ZSAqIGludkFz
cGVjdDsKKwkJCQkJCQlzY2FsZS55ID0gc2l6ZTsKKworCQkJCQkJCWdsLnVuaWZvcm0zZiggdW5p
Zm9ybXMuc2NyZWVuUG9zaXRpb24sIHNjcmVlblBvc2l0aW9uLngsIHNjcmVlblBvc2l0aW9uLnks
IHNjcmVlblBvc2l0aW9uLnogKTsKKwkJCQkJCQlnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnNjYWxl
LCBzY2FsZS54LCBzY2FsZS55ICk7CisJCQkJCQkJZ2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5yb3Rh
dGlvbiwgc3ByaXRlLnJvdGF0aW9uICk7CisKKwkJCQkJCQlnbC51bmlmb3JtMWYoIHVuaWZvcm1z
Lm9wYWNpdHksIHNwcml0ZS5vcGFjaXR5ICk7CisJCQkJCQkJZ2wudW5pZm9ybTNmKCB1bmlmb3Jt
cy5jb2xvciwgc3ByaXRlLmNvbG9yLnIsIHNwcml0ZS5jb2xvci5nLCBzcHJpdGUuY29sb3IuYiAp
OworCisJCQkJCQkJc3RhdGUuc2V0QmxlbmRpbmcoIHNwcml0ZS5ibGVuZGluZywgc3ByaXRlLmJs
ZW5kRXF1YXRpb24sIHNwcml0ZS5ibGVuZFNyYywgc3ByaXRlLmJsZW5kRHN0ICk7CisJCQkJCQkJ
cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCBzcHJpdGUudGV4dHVyZSwgMSApOworCisJCQkJCQkJZ2wu
ZHJhd0VsZW1lbnRzKCBnbC5UUklBTkdMRVMsIDYsIGdsLlVOU0lHTkVEX1NIT1JULCAwICk7CisK
KwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gcmVzdG9yZSBnbAor
CisJCQlzdGF0ZS5lbmFibGUoIGdsLkNVTExfRkFDRSApOworCQkJc3RhdGUuZW5hYmxlKCBnbC5E
RVBUSF9URVNUICk7CisJCQlzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTsKKwor
CQkJcmVuZGVyZXIucmVzZXRHTFN0YXRlKCk7CisKKwkJfTsKKworCQlmdW5jdGlvbiBjcmVhdGVQ
cm9ncmFtKCBzaGFkZXIgKSB7CisKKwkJCXZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgp
OworCisJCQl2YXIgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIGdsLkZSQUdNRU5U
X1NIQURFUiApOworCQkJdmFyIHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuVkVS
VEVYX1NIQURFUiApOworCisJCQl2YXIgcHJlZml4ID0gInByZWNpc2lvbiAiICsgcmVuZGVyZXIu
Z2V0UHJlY2lzaW9uKCkgKyAiIGZsb2F0O1xuIjsKKworCQkJZ2wuc2hhZGVyU291cmNlKCBmcmFn
bWVudFNoYWRlciwgcHJlZml4ICsgc2hhZGVyLmZyYWdtZW50U2hhZGVyICk7CisJCQlnbC5zaGFk
ZXJTb3VyY2UoIHZlcnRleFNoYWRlciwgcHJlZml4ICsgc2hhZGVyLnZlcnRleFNoYWRlciApOwor
CisJCQlnbC5jb21waWxlU2hhZGVyKCBmcmFnbWVudFNoYWRlciApOworCQkJZ2wuY29tcGlsZVNo
YWRlciggdmVydGV4U2hhZGVyICk7CisKKwkJCWdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZnJh
Z21lbnRTaGFkZXIgKTsKKwkJCWdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgdmVydGV4U2hhZGVy
ICk7CisKKwkJCWdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtICk7CisKKwkJCXJldHVybiBwcm9ncmFt
OworCisJCX0KKworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0
cDovL2dvbW8uc2UvCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlh
LmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFNwcml0ZVBsdWdpbiggcmVuZGVyZXIsIHNwcml0ZXMg
KSB7CisKKwkJdmFyIGdsID0gcmVuZGVyZXIuY29udGV4dDsKKwkJdmFyIHN0YXRlID0gcmVuZGVy
ZXIuc3RhdGU7CisKKwkJdmFyIHZlcnRleEJ1ZmZlciwgZWxlbWVudEJ1ZmZlcjsKKwkJdmFyIHBy
b2dyYW0sIGF0dHJpYnV0ZXMsIHVuaWZvcm1zOworCisJCXZhciB0ZXh0dXJlOworCisJCS8vIGRl
Y29tcG9zZSBtYXRyaXhXb3JsZAorCisJCXZhciBzcHJpdGVQb3NpdGlvbiA9IG5ldyBWZWN0b3Iz
KCk7CisJCXZhciBzcHJpdGVSb3RhdGlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CisJCXZhciBzcHJp
dGVTY2FsZSA9IG5ldyBWZWN0b3IzKCk7CisKKwkJZnVuY3Rpb24gaW5pdCgpIHsKKworCQkJdmFy
IHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggWworCQkJCS0gMC41LCAtIDAuNSwgIDAsIDAs
CisJCQkJICAwLjUsIC0gMC41LCAgMSwgMCwKKwkJCQkgIDAuNSwgICAwLjUsICAxLCAxLAorCQkJ
CS0gMC41LCAgIDAuNSwgIDAsIDEKKwkJCV0gKTsKKworCQkJdmFyIGZhY2VzID0gbmV3IFVpbnQx
NkFycmF5KCBbCisJCQkJMCwgMSwgMiwKKwkJCQkwLCAyLCAzCisJCQldICk7CisKKwkJCXZlcnRl
eEJ1ZmZlciAgPSBnbC5jcmVhdGVCdWZmZXIoKTsKKwkJCWVsZW1lbnRCdWZmZXIgPSBnbC5jcmVh
dGVCdWZmZXIoKTsKKworCQkJZ2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhC
dWZmZXIgKTsKKwkJCWdsLmJ1ZmZlckRhdGEoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGljZXMsIGds
LlNUQVRJQ19EUkFXICk7CisKKwkJCWdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVG
RkVSLCBlbGVtZW50QnVmZmVyICk7CisJCQlnbC5idWZmZXJEYXRhKCBnbC5FTEVNRU5UX0FSUkFZ
X0JVRkZFUiwgZmFjZXMsIGdsLlNUQVRJQ19EUkFXICk7CisKKwkJCXByb2dyYW0gPSBjcmVhdGVQ
cm9ncmFtKCk7CisKKwkJCWF0dHJpYnV0ZXMgPSB7CisJCQkJcG9zaXRpb246CQkJZ2wuZ2V0QXR0
cmliTG9jYXRpb24gKCBwcm9ncmFtLCAncG9zaXRpb24nICksCisJCQkJdXY6CQkJCQlnbC5nZXRB
dHRyaWJMb2NhdGlvbiAoIHByb2dyYW0sICd1dicgKQorCQkJfTsKKworCQkJdW5pZm9ybXMgPSB7
CisJCQkJdXZPZmZzZXQ6CQkJZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAndXZPZmZz
ZXQnICksCisJCQkJdXZTY2FsZToJCQlnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICd1
dlNjYWxlJyApLAorCisJCQkJcm90YXRpb246CQkJZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9n
cmFtLCAncm90YXRpb24nICksCisJCQkJc2NhbGU6CQkJCWdsLmdldFVuaWZvcm1Mb2NhdGlvbigg
cHJvZ3JhbSwgJ3NjYWxlJyApLAorCisJCQkJY29sb3I6CQkJCWdsLmdldFVuaWZvcm1Mb2NhdGlv
biggcHJvZ3JhbSwgJ2NvbG9yJyApLAorCQkJCW1hcDoJCQkJZ2wuZ2V0VW5pZm9ybUxvY2F0aW9u
KCBwcm9ncmFtLCAnbWFwJyApLAorCQkJCW9wYWNpdHk6CQkJZ2wuZ2V0VW5pZm9ybUxvY2F0aW9u
KCBwcm9ncmFtLCAnb3BhY2l0eScgKSwKKworCQkJCW1vZGVsVmlld01hdHJpeDogCWdsLmdldFVu
aWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ21vZGVsVmlld01hdHJpeCcgKSwKKwkJCQlwcm9qZWN0
aW9uTWF0cml4OglnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdwcm9qZWN0aW9uTWF0
cml4JyApLAorCisJCQkJZm9nVHlwZToJCQlnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0s
ICdmb2dUeXBlJyApLAorCQkJCWZvZ0RlbnNpdHk6CQkJZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBw
cm9ncmFtLCAnZm9nRGVuc2l0eScgKSwKKwkJCQlmb2dOZWFyOgkJCWdsLmdldFVuaWZvcm1Mb2Nh
dGlvbiggcHJvZ3JhbSwgJ2ZvZ05lYXInICksCisJCQkJZm9nRmFyOgkJCQlnbC5nZXRVbmlmb3Jt
TG9jYXRpb24oIHByb2dyYW0sICdmb2dGYXInICksCisJCQkJZm9nQ29sb3I6CQkJZ2wuZ2V0VW5p
Zm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nQ29sb3InICksCisKKwkJCQlhbHBoYVRlc3Q6CQkJ
Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnYWxwaGFUZXN0JyApCisJCQl9OworCisJ
CQl2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5v
cmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7CisJCQljYW52YXMud2lkdGggPSA4OworCQkJY2Fu
dmFzLmhlaWdodCA9IDg7CisKKwkJCXZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoICcy
ZCcgKTsKKwkJCWNvbnRleHQuZmlsbFN0eWxlID0gJ3doaXRlJzsKKwkJCWNvbnRleHQuZmlsbFJl
Y3QoIDAsIDAsIDgsIDggKTsKKworCQkJdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCBjYW52YXMgKTsK
KwkJCXRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOworCisJCX0KKworCQl0aGlzLnJlbmRlciA9
IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHsKKworCQkJaWYgKCBzcHJpdGVzLmxlbmd0aCA9
PT0gMCApIHJldHVybjsKKworCQkJLy8gc2V0dXAgZ2wKKworCQkJaWYgKCBwcm9ncmFtID09PSB1
bmRlZmluZWQgKSB7CisKKwkJCQlpbml0KCk7CisKKwkJCX0KKworCQkJZ2wudXNlUHJvZ3JhbSgg
cHJvZ3JhbSApOworCisJCQlzdGF0ZS5pbml0QXR0cmlidXRlcygpOworCQkJc3RhdGUuZW5hYmxl
QXR0cmlidXRlKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICk7CisJCQlzdGF0ZS5lbmFibGVBdHRyaWJ1
dGUoIGF0dHJpYnV0ZXMudXYgKTsKKwkJCXN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7
CisKKwkJCXN0YXRlLmRpc2FibGUoIGdsLkNVTExfRkFDRSApOworCQkJc3RhdGUuZW5hYmxlKCBn
bC5CTEVORCApOworCisJCQlnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1
ZmZlciApOworCQkJZ2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy5wb3NpdGlvbiwg
MiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgMCApOworCQkJZ2wudmVydGV4QXR0cmliUG9pbnRl
ciggYXR0cmlidXRlcy51diwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgOCApOworCisJCQln
bC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApOwor
CisJCQlnbC51bmlmb3JtTWF0cml4NGZ2KCB1bmlmb3Jtcy5wcm9qZWN0aW9uTWF0cml4LCBmYWxz
ZSwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMgKTsKKworCQkJc3RhdGUuYWN0aXZl
VGV4dHVyZSggZ2wuVEVYVFVSRTAgKTsKKwkJCWdsLnVuaWZvcm0xaSggdW5pZm9ybXMubWFwLCAw
ICk7CisKKwkJCXZhciBvbGRGb2dUeXBlID0gMDsKKwkJCXZhciBzY2VuZUZvZ1R5cGUgPSAwOwor
CQkJdmFyIGZvZyA9IHNjZW5lLmZvZzsKKworCQkJaWYgKCBmb2cgKSB7CisKKwkJCQlnbC51bmlm
b3JtM2YoIHVuaWZvcm1zLmZvZ0NvbG9yLCBmb2cuY29sb3IuciwgZm9nLmNvbG9yLmcsIGZvZy5j
b2xvci5iICk7CisKKwkJCQlpZiAoIGZvZy5pc0ZvZyApIHsKKworCQkJCQlnbC51bmlmb3JtMWYo
IHVuaWZvcm1zLmZvZ05lYXIsIGZvZy5uZWFyICk7CisJCQkJCWdsLnVuaWZvcm0xZiggdW5pZm9y
bXMuZm9nRmFyLCBmb2cuZmFyICk7CisKKwkJCQkJZ2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dU
eXBlLCAxICk7CisJCQkJCW9sZEZvZ1R5cGUgPSAxOworCQkJCQlzY2VuZUZvZ1R5cGUgPSAxOwor
CisJCQkJfSBlbHNlIGlmICggZm9nLmlzRm9nRXhwMiApIHsKKworCQkJCQlnbC51bmlmb3JtMWYo
IHVuaWZvcm1zLmZvZ0RlbnNpdHksIGZvZy5kZW5zaXR5ICk7CisKKwkJCQkJZ2wudW5pZm9ybTFp
KCB1bmlmb3Jtcy5mb2dUeXBlLCAyICk7CisJCQkJCW9sZEZvZ1R5cGUgPSAyOworCQkJCQlzY2Vu
ZUZvZ1R5cGUgPSAyOworCisJCQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJZ2wudW5pZm9ybTFp
KCB1bmlmb3Jtcy5mb2dUeXBlLCAwICk7CisJCQkJb2xkRm9nVHlwZSA9IDA7CisJCQkJc2NlbmVG
b2dUeXBlID0gMDsKKworCQkJfQorCisKKwkJCS8vIHVwZGF0ZSBwb3NpdGlvbnMgYW5kIHNvcnQK
KworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gc3ByaXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkg
eworCisJCQkJdmFyIHNwcml0ZSA9IHNwcml0ZXNbIGkgXTsKKworCQkJCXNwcml0ZS5tb2RlbFZp
ZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgc3By
aXRlLm1hdHJpeFdvcmxkICk7CisJCQkJc3ByaXRlLnogPSAtIHNwcml0ZS5tb2RlbFZpZXdNYXRy
aXguZWxlbWVudHNbIDE0IF07CisKKwkJCX0KKworCQkJc3ByaXRlcy5zb3J0KCBwYWludGVyU29y
dFN0YWJsZSApOworCisJCQkvLyByZW5kZXIgYWxsIHNwcml0ZXMKKworCQkJdmFyIHNjYWxlID0g
W107CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHNwcml0ZXMubGVuZ3RoOyBpIDwgbDsgaSAr
KyApIHsKKworCQkJCXZhciBzcHJpdGUgPSBzcHJpdGVzWyBpIF07CisJCQkJdmFyIG1hdGVyaWFs
ID0gc3ByaXRlLm1hdGVyaWFsOworCisJCQkJaWYgKCBtYXRlcmlhbC52aXNpYmxlID09PSBmYWxz
ZSApIGNvbnRpbnVlOworCisJCQkJc3ByaXRlLm9uQmVmb3JlUmVuZGVyKCByZW5kZXJlciwgc2Nl
bmUsIGNhbWVyYSwgdW5kZWZpbmVkLCBtYXRlcmlhbCwgdW5kZWZpbmVkICk7CisKKwkJCQlnbC51
bmlmb3JtMWYoIHVuaWZvcm1zLmFscGhhVGVzdCwgbWF0ZXJpYWwuYWxwaGFUZXN0ICk7CisJCQkJ
Z2wudW5pZm9ybU1hdHJpeDRmdiggdW5pZm9ybXMubW9kZWxWaWV3TWF0cml4LCBmYWxzZSwgc3By
aXRlLm1vZGVsVmlld01hdHJpeC5lbGVtZW50cyApOworCisJCQkJc3ByaXRlLm1hdHJpeFdvcmxk
LmRlY29tcG9zZSggc3ByaXRlUG9zaXRpb24sIHNwcml0ZVJvdGF0aW9uLCBzcHJpdGVTY2FsZSAp
OworCisJCQkJc2NhbGVbIDAgXSA9IHNwcml0ZVNjYWxlLng7CisJCQkJc2NhbGVbIDEgXSA9IHNw
cml0ZVNjYWxlLnk7CisKKwkJCQl2YXIgZm9nVHlwZSA9IDA7CisKKwkJCQlpZiAoIHNjZW5lLmZv
ZyAmJiBtYXRlcmlhbC5mb2cgKSB7CisKKwkJCQkJZm9nVHlwZSA9IHNjZW5lRm9nVHlwZTsKKwor
CQkJCX0KKworCQkJCWlmICggb2xkRm9nVHlwZSAhPT0gZm9nVHlwZSApIHsKKworCQkJCQlnbC51
bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIGZvZ1R5cGUgKTsKKwkJCQkJb2xkRm9nVHlwZSA9
IGZvZ1R5cGU7CisKKwkJCQl9CisKKwkJCQlpZiAoIG1hdGVyaWFsLm1hcCAhPT0gbnVsbCApIHsK
KworCQkJCQlnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2T2Zmc2V0LCBtYXRlcmlhbC5tYXAub2Zm
c2V0LngsIG1hdGVyaWFsLm1hcC5vZmZzZXQueSApOworCQkJCQlnbC51bmlmb3JtMmYoIHVuaWZv
cm1zLnV2U2NhbGUsIG1hdGVyaWFsLm1hcC5yZXBlYXQueCwgbWF0ZXJpYWwubWFwLnJlcGVhdC55
ICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCWdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZPZmZz
ZXQsIDAsIDAgKTsKKwkJCQkJZ2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dlNjYWxlLCAxLCAxICk7
CisKKwkJCQl9CisKKwkJCQlnbC51bmlmb3JtMWYoIHVuaWZvcm1zLm9wYWNpdHksIG1hdGVyaWFs
Lm9wYWNpdHkgKTsKKwkJCQlnbC51bmlmb3JtM2YoIHVuaWZvcm1zLmNvbG9yLCBtYXRlcmlhbC5j
b2xvci5yLCBtYXRlcmlhbC5jb2xvci5nLCBtYXRlcmlhbC5jb2xvci5iICk7CisKKwkJCQlnbC51
bmlmb3JtMWYoIHVuaWZvcm1zLnJvdGF0aW9uLCBtYXRlcmlhbC5yb3RhdGlvbiApOworCQkJCWds
LnVuaWZvcm0yZnYoIHVuaWZvcm1zLnNjYWxlLCBzY2FsZSApOworCisJCQkJc3RhdGUuc2V0Qmxl
bmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlh
bC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBo
YSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJp
YWwucHJlbXVsdGlwbGllZEFscGhhICk7CisJCQkJc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0
KCBtYXRlcmlhbC5kZXB0aFRlc3QgKTsKKwkJCQlzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2so
IG1hdGVyaWFsLmRlcHRoV3JpdGUgKTsKKworCQkJCWlmICggbWF0ZXJpYWwubWFwICkgeworCisJ
CQkJCXJlbmRlcmVyLnNldFRleHR1cmUyRCggbWF0ZXJpYWwubWFwLCAwICk7CisKKwkJCQl9IGVs
c2UgeworCisJCQkJCXJlbmRlcmVyLnNldFRleHR1cmUyRCggdGV4dHVyZSwgMCApOworCisJCQkJ
fQorCisJCQkJZ2wuZHJhd0VsZW1lbnRzKCBnbC5UUklBTkdMRVMsIDYsIGdsLlVOU0lHTkVEX1NI
T1JULCAwICk7CisKKwkJCQlzcHJpdGUub25BZnRlclJlbmRlciggcmVuZGVyZXIsIHNjZW5lLCBj
YW1lcmEsIHVuZGVmaW5lZCwgbWF0ZXJpYWwsIHVuZGVmaW5lZCApOworCisJCQl9CisKKwkJCS8v
IHJlc3RvcmUgZ2wKKworCQkJc3RhdGUuZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTsKKworCQkJcmVu
ZGVyZXIucmVzZXRHTFN0YXRlKCk7CisKKwkJfTsKKworCQlmdW5jdGlvbiBjcmVhdGVQcm9ncmFt
KCkgeworCisJCQl2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKKworCQkJdmFyIHZl
cnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuVkVSVEVYX1NIQURFUiApOworCQkJdmFy
IGZyYWdtZW50U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCBnbC5GUkFHTUVOVF9TSEFERVIgKTsK
KworCQkJZ2wuc2hhZGVyU291cmNlKCB2ZXJ0ZXhTaGFkZXIsIFsKKworCQkJCSdwcmVjaXNpb24g
JyArIHJlbmRlcmVyLmdldFByZWNpc2lvbigpICsgJyBmbG9hdDsnLAorCisJCQkJJyNkZWZpbmUg
U0hBREVSX05BTUUgJyArICdTcHJpdGVNYXRlcmlhbCcsCisKKwkJCQkndW5pZm9ybSBtYXQ0IG1v
ZGVsVmlld01hdHJpeDsnLAorCQkJCSd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLAor
CQkJCSd1bmlmb3JtIGZsb2F0IHJvdGF0aW9uOycsCisJCQkJJ3VuaWZvcm0gdmVjMiBzY2FsZTsn
LAorCQkJCSd1bmlmb3JtIHZlYzIgdXZPZmZzZXQ7JywKKwkJCQkndW5pZm9ybSB2ZWMyIHV2U2Nh
bGU7JywKKworCQkJCSdhdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsnLAorCQkJCSdhdHRyaWJ1dGUg
dmVjMiB1djsnLAorCisJCQkJJ3ZhcnlpbmcgdmVjMiB2VVY7JywKKworCQkJCSd2b2lkIG1haW4o
KSB7JywKKworCQkJCQkndlVWID0gdXZPZmZzZXQgKyB1diAqIHV2U2NhbGU7JywKKworCQkJCQkn
dmVjMiBhbGlnbmVkUG9zaXRpb24gPSBwb3NpdGlvbiAqIHNjYWxlOycsCisKKwkJCQkJJ3ZlYzIg
cm90YXRlZFBvc2l0aW9uOycsCisJCQkJCSdyb3RhdGVkUG9zaXRpb24ueCA9IGNvcyggcm90YXRp
b24gKSAqIGFsaWduZWRQb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0
aW9uLnk7JywKKwkJCQkJJ3JvdGF0ZWRQb3NpdGlvbi55ID0gc2luKCByb3RhdGlvbiApICogYWxp
Z25lZFBvc2l0aW9uLnggKyBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTsnLAor
CisJCQkJCSd2ZWM0IGZpbmFsUG9zaXRpb247JywKKworCQkJCQknZmluYWxQb3NpdGlvbiA9IG1v
ZGVsVmlld01hdHJpeCAqIHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApOycsCisJCQkJCSdmaW5h
bFBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjsnLAorCQkJCQknZmluYWxQb3NpdGlvbiA9
IHByb2plY3Rpb25NYXRyaXggKiBmaW5hbFBvc2l0aW9uOycsCisKKwkJCQkJJ2dsX1Bvc2l0aW9u
ID0gZmluYWxQb3NpdGlvbjsnLAorCisJCQkJJ30nCisKKwkJCV0uam9pbiggJ1xuJyApICk7CisK
KwkJCWdsLnNoYWRlclNvdXJjZSggZnJhZ21lbnRTaGFkZXIsIFsKKworCQkJCSdwcmVjaXNpb24g
JyArIHJlbmRlcmVyLmdldFByZWNpc2lvbigpICsgJyBmbG9hdDsnLAorCisJCQkJJyNkZWZpbmUg
U0hBREVSX05BTUUgJyArICdTcHJpdGVNYXRlcmlhbCcsCisKKwkJCQkndW5pZm9ybSB2ZWMzIGNv
bG9yOycsCisJCQkJJ3VuaWZvcm0gc2FtcGxlcjJEIG1hcDsnLAorCQkJCSd1bmlmb3JtIGZsb2F0
IG9wYWNpdHk7JywKKworCQkJCSd1bmlmb3JtIGludCBmb2dUeXBlOycsCisJCQkJJ3VuaWZvcm0g
dmVjMyBmb2dDb2xvcjsnLAorCQkJCSd1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7JywKKwkJCQkn
dW5pZm9ybSBmbG9hdCBmb2dOZWFyOycsCisJCQkJJ3VuaWZvcm0gZmxvYXQgZm9nRmFyOycsCisJ
CQkJJ3VuaWZvcm0gZmxvYXQgYWxwaGFUZXN0OycsCisKKwkJCQkndmFyeWluZyB2ZWMyIHZVVjsn
LAorCisJCQkJJ3ZvaWQgbWFpbigpIHsnLAorCisJCQkJCSd2ZWM0IHRleHR1cmUgPSB0ZXh0dXJl
MkQoIG1hcCwgdlVWICk7JywKKworCQkJCQknaWYgKCB0ZXh0dXJlLmEgPCBhbHBoYVRlc3QgKSBk
aXNjYXJkOycsCisKKwkJCQkJJ2dsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yICogdGV4dHVyZS54
eXosIHRleHR1cmUuYSAqIG9wYWNpdHkgKTsnLAorCisJCQkJCSdpZiAoIGZvZ1R5cGUgPiAwICkg
eycsCisKKwkJCQkJCSdmbG9hdCBkZXB0aCA9IGdsX0ZyYWdDb29yZC56IC8gZ2xfRnJhZ0Nvb3Jk
Lnc7JywKKwkJCQkJCSdmbG9hdCBmb2dGYWN0b3IgPSAwLjA7JywKKworCQkJCQkJJ2lmICggZm9n
VHlwZSA9PSAxICkgeycsCisKKwkJCQkJCQknZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVh
ciwgZm9nRmFyLCBkZXB0aCApOycsCisKKwkJCQkJCSd9IGVsc2UgeycsCisKKwkJCQkJCQknY29u
c3QgZmxvYXQgTE9HMiA9IDEuNDQyNjk1OycsCisJCQkJCQkJJ2ZvZ0ZhY3RvciA9IGV4cDIoIC0g
Zm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBkZXB0aCAqIGRlcHRoICogTE9HMiApOycsCisJCQkJ
CQkJJ2ZvZ0ZhY3RvciA9IDEuMCAtIGNsYW1wKCBmb2dGYWN0b3IsIDAuMCwgMS4wICk7JywKKwor
CQkJCQkJJ30nLAorCisJCQkJCQknZ2xfRnJhZ0NvbG9yID0gbWl4KCBnbF9GcmFnQ29sb3IsIHZl
YzQoIGZvZ0NvbG9yLCBnbF9GcmFnQ29sb3IudyApLCBmb2dGYWN0b3IgKTsnLAorCisJCQkJCSd9
JywKKworCQkJCSd9JworCisJCQldLmpvaW4oICdcbicgKSApOworCisJCQlnbC5jb21waWxlU2hh
ZGVyKCB2ZXJ0ZXhTaGFkZXIgKTsKKwkJCWdsLmNvbXBpbGVTaGFkZXIoIGZyYWdtZW50U2hhZGVy
ICk7CisKKwkJCWdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgdmVydGV4U2hhZGVyICk7CisJCQln
bC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGZyYWdtZW50U2hhZGVyICk7CisKKwkJCWdsLmxpbmtQ
cm9ncmFtKCBwcm9ncmFtICk7CisKKwkJCXJldHVybiBwcm9ncmFtOworCisJCX0KKworCQlmdW5j
dGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHsKKworCQkJaWYgKCBhLnJlbmRlck9yZGVy
ICE9PSBiLnJlbmRlck9yZGVyICkgeworCisJCQkJcmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJl
bmRlck9yZGVyOworCisJCQl9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHsKKworCQkJCXJldHVy
biBiLnogLSBhLno7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlyZXR1cm4gYi5pZCAtIGEuaWQ7CisK
KwkJCX0KKworCQl9CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9t
cmRvb2IuY29tLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5j
b20vCisJICovCisKKwl2YXIgbWF0ZXJpYWxJZCA9IDA7CisKKwlmdW5jdGlvbiBNYXRlcmlhbCgp
IHsKKworCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IG1hdGVy
aWFsSWQgKysgfSApOworCisJCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOworCisJ
CXRoaXMubmFtZSA9ICcnOworCQl0aGlzLnR5cGUgPSAnTWF0ZXJpYWwnOworCisJCXRoaXMuZm9n
ID0gdHJ1ZTsKKwkJdGhpcy5saWdodHMgPSB0cnVlOworCisJCXRoaXMuYmxlbmRpbmcgPSBOb3Jt
YWxCbGVuZGluZzsKKwkJdGhpcy5zaWRlID0gRnJvbnRTaWRlOworCQl0aGlzLnNoYWRpbmcgPSBT
bW9vdGhTaGFkaW5nOyAvLyBUSFJFRS5GbGF0U2hhZGluZywgVEhSRUUuU21vb3RoU2hhZGluZwor
CQl0aGlzLnZlcnRleENvbG9ycyA9IE5vQ29sb3JzOyAvLyBUSFJFRS5Ob0NvbG9ycywgVEhSRUUu
VmVydGV4Q29sb3JzLCBUSFJFRS5GYWNlQ29sb3JzCisKKwkJdGhpcy5vcGFjaXR5ID0gMTsKKwkJ
dGhpcy50cmFuc3BhcmVudCA9IGZhbHNlOworCisJCXRoaXMuYmxlbmRTcmMgPSBTcmNBbHBoYUZh
Y3RvcjsKKwkJdGhpcy5ibGVuZERzdCA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7CisJCXRoaXMu
YmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uOworCQl0aGlzLmJsZW5kU3JjQWxwaGEgPSBudWxs
OworCQl0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsOworCQl0aGlzLmJsZW5kRXF1YXRpb25BbHBo
YSA9IG51bGw7CisKKwkJdGhpcy5kZXB0aEZ1bmMgPSBMZXNzRXF1YWxEZXB0aDsKKwkJdGhpcy5k
ZXB0aFRlc3QgPSB0cnVlOworCQl0aGlzLmRlcHRoV3JpdGUgPSB0cnVlOworCisJCXRoaXMuY2xp
cHBpbmdQbGFuZXMgPSBudWxsOworCQl0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBmYWxzZTsKKwkJ
dGhpcy5jbGlwU2hhZG93cyA9IGZhbHNlOworCisJCXRoaXMuY29sb3JXcml0ZSA9IHRydWU7CisK
KwkJdGhpcy5wcmVjaXNpb24gPSBudWxsOyAvLyBvdmVycmlkZSB0aGUgcmVuZGVyZXIncyBkZWZh
dWx0IHByZWNpc2lvbiBmb3IgdGhpcyBtYXRlcmlhbAorCisJCXRoaXMucG9seWdvbk9mZnNldCA9
IGZhbHNlOworCQl0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSAwOworCQl0aGlzLnBvbHlnb25P
ZmZzZXRVbml0cyA9IDA7CisKKwkJdGhpcy5kaXRoZXJpbmcgPSBmYWxzZTsKKworCQl0aGlzLmFs
cGhhVGVzdCA9IDA7CisJCXRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2U7CisKKwkJdGhp
cy5vdmVyZHJhdyA9IDA7IC8vIE92ZXJkcmF3biBwaXhlbHMgKHR5cGljYWxseSBiZXR3ZWVuIDAg
YW5kIDEpIGZvciBmaXhpbmcgYW50aWFsaWFzaW5nIGdhcHMgaW4gQ2FudmFzUmVuZGVyZXIKKwor
CQl0aGlzLnZpc2libGUgPSB0cnVlOworCisJCXRoaXMubmVlZHNVcGRhdGUgPSB0cnVlOworCisJ
fQorCisJT2JqZWN0LmFzc2lnbiggTWF0ZXJpYWwucHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIu
cHJvdG90eXBlLCB7CisKKwkJaXNNYXRlcmlhbDogdHJ1ZSwKKworCQlvbkJlZm9yZUNvbXBpbGU6
IGZ1bmN0aW9uICgpIHt9LAorCisJCXNldFZhbHVlczogZnVuY3Rpb24gKCB2YWx1ZXMgKSB7CisK
KwkJCWlmICggdmFsdWVzID09PSB1bmRlZmluZWQgKSByZXR1cm47CisKKwkJCWZvciAoIHZhciBr
ZXkgaW4gdmFsdWVzICkgeworCisJCQkJdmFyIG5ld1ZhbHVlID0gdmFsdWVzWyBrZXkgXTsKKwor
CQkJCWlmICggbmV3VmFsdWUgPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQljb25zb2xlLndhcm4o
ICJUSFJFRS5NYXRlcmlhbDogJyIgKyBrZXkgKyAiJyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiIg
KTsKKwkJCQkJY29udGludWU7CisKKwkJCQl9CisKKwkJCQl2YXIgY3VycmVudFZhbHVlID0gdGhp
c1sga2V5IF07CisKKwkJCQlpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICkgeworCisJ
CQkJCWNvbnNvbGUud2FybiggIlRIUkVFLiIgKyB0aGlzLnR5cGUgKyAiOiAnIiArIGtleSArICIn
IGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuIiApOworCQkJCQljb250aW51ZTsK
KworCQkJCX0KKworCQkJCWlmICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc0NvbG9y
ICkgeworCisJCQkJCWN1cnJlbnRWYWx1ZS5zZXQoIG5ld1ZhbHVlICk7CisKKwkJCQl9IGVsc2Ug
aWYgKCAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNWZWN0b3IzICkgJiYgKCBuZXdW
YWx1ZSAmJiBuZXdWYWx1ZS5pc1ZlY3RvcjMgKSApIHsKKworCQkJCQljdXJyZW50VmFsdWUuY29w
eSggbmV3VmFsdWUgKTsKKworCQkJCX0gZWxzZSBpZiAoIGtleSA9PT0gJ292ZXJkcmF3JyApIHsK
KworCQkJCQkvLyBlbnN1cmUgb3ZlcmRyYXcgaXMgYmFja3dhcmRzLWNvbXBhdGlibGUgd2l0aCBs
ZWdhY3kgYm9vbGVhbiB0eXBlCisJCQkJCXRoaXNbIGtleSBdID0gTnVtYmVyKCBuZXdWYWx1ZSAp
OworCisJCQkJfSBlbHNlIHsKKworCQkJCQl0aGlzWyBrZXkgXSA9IG5ld1ZhbHVlOworCisJCQkJ
fQorCisJCQl9CisKKwkJfSwKKworCQl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKKworCQkJ
dmFyIGlzUm9vdCA9IG1ldGEgPT09IHVuZGVmaW5lZDsKKworCQkJaWYgKCBpc1Jvb3QgKSB7CisK
KwkJCQltZXRhID0geworCQkJCQl0ZXh0dXJlczoge30sCisJCQkJCWltYWdlczoge30KKwkJCQl9
OworCisJCQl9CisKKwkJCXZhciBkYXRhID0geworCQkJCW1ldGFkYXRhOiB7CisJCQkJCXZlcnNp
b246IDQuNSwKKwkJCQkJdHlwZTogJ01hdGVyaWFsJywKKwkJCQkJZ2VuZXJhdG9yOiAnTWF0ZXJp
YWwudG9KU09OJworCQkJCX0KKwkJCX07CisKKwkJCS8vIHN0YW5kYXJkIE1hdGVyaWFsIHNlcmlh
bGl6YXRpb24KKwkJCWRhdGEudXVpZCA9IHRoaXMudXVpZDsKKwkJCWRhdGEudHlwZSA9IHRoaXMu
dHlwZTsKKworCQkJaWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1l
OworCisJCQlpZiAoIHRoaXMuY29sb3IgJiYgdGhpcy5jb2xvci5pc0NvbG9yICkgZGF0YS5jb2xv
ciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7CisKKwkJCWlmICggdGhpcy5yb3VnaG5lc3MgIT09IHVu
ZGVmaW5lZCApIGRhdGEucm91Z2huZXNzID0gdGhpcy5yb3VnaG5lc3M7CisJCQlpZiAoIHRoaXMu
bWV0YWxuZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLm1ldGFsbmVzcyA9IHRoaXMubWV0YWxuZXNz
OworCisJCQlpZiAoIHRoaXMuZW1pc3NpdmUgJiYgdGhpcy5lbWlzc2l2ZS5pc0NvbG9yICkgZGF0
YS5lbWlzc2l2ZSA9IHRoaXMuZW1pc3NpdmUuZ2V0SGV4KCk7CisJCQlpZiAoIHRoaXMuc3BlY3Vs
YXIgJiYgdGhpcy5zcGVjdWxhci5pc0NvbG9yICkgZGF0YS5zcGVjdWxhciA9IHRoaXMuc3BlY3Vs
YXIuZ2V0SGV4KCk7CisJCQlpZiAoIHRoaXMuc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBkYXRh
LnNoaW5pbmVzcyA9IHRoaXMuc2hpbmluZXNzOworCQkJaWYgKCB0aGlzLmNsZWFyQ29hdCAhPT0g
dW5kZWZpbmVkICkgZGF0YS5jbGVhckNvYXQgPSB0aGlzLmNsZWFyQ29hdDsKKwkJCWlmICggdGhp
cy5jbGVhckNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJDb2F0Um91Z2hu
ZXNzID0gdGhpcy5jbGVhckNvYXRSb3VnaG5lc3M7CisKKwkJCWlmICggdGhpcy5tYXAgJiYgdGhp
cy5tYXAuaXNUZXh0dXJlICkgZGF0YS5tYXAgPSB0aGlzLm1hcC50b0pTT04oIG1ldGEgKS51dWlk
OworCQkJaWYgKCB0aGlzLmFscGhhTWFwICYmIHRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlICkgZGF0
YS5hbHBoYU1hcCA9IHRoaXMuYWxwaGFNYXAudG9KU09OKCBtZXRhICkudXVpZDsKKwkJCWlmICgg
dGhpcy5saWdodE1hcCAmJiB0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSApIGRhdGEubGlnaHRNYXAg
PSB0aGlzLmxpZ2h0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CisJCQlpZiAoIHRoaXMuYnVtcE1h
cCAmJiB0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlICkgeworCisJCQkJZGF0YS5idW1wTWFwID0gdGhp
cy5idW1wTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CisJCQkJZGF0YS5idW1wU2NhbGUgPSB0aGlz
LmJ1bXBTY2FsZTsKKworCQkJfQorCQkJaWYgKCB0aGlzLm5vcm1hbE1hcCAmJiB0aGlzLm5vcm1h
bE1hcC5pc1RleHR1cmUgKSB7CisKKwkJCQlkYXRhLm5vcm1hbE1hcCA9IHRoaXMubm9ybWFsTWFw
LnRvSlNPTiggbWV0YSApLnV1aWQ7CisJCQkJZGF0YS5ub3JtYWxTY2FsZSA9IHRoaXMubm9ybWFs
U2NhbGUudG9BcnJheSgpOworCisJCQl9CisJCQlpZiAoIHRoaXMuZGlzcGxhY2VtZW50TWFwICYm
IHRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSApIHsKKworCQkJCWRhdGEuZGlzcGxhY2Vt
ZW50TWFwID0gdGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDsKKwkJCQlk
YXRhLmRpc3BsYWNlbWVudFNjYWxlID0gdGhpcy5kaXNwbGFjZW1lbnRTY2FsZTsKKwkJCQlkYXRh
LmRpc3BsYWNlbWVudEJpYXMgPSB0aGlzLmRpc3BsYWNlbWVudEJpYXM7CisKKwkJCX0KKwkJCWlm
ICggdGhpcy5yb3VnaG5lc3NNYXAgJiYgdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0
YS5yb3VnaG5lc3NNYXAgPSB0aGlzLnJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkOwor
CQkJaWYgKCB0aGlzLm1ldGFsbmVzc01hcCAmJiB0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUg
KSBkYXRhLm1ldGFsbmVzc01hcCA9IHRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1
aWQ7CisKKwkJCWlmICggdGhpcy5lbWlzc2l2ZU1hcCAmJiB0aGlzLmVtaXNzaXZlTWFwLmlzVGV4
dHVyZSApIGRhdGEuZW1pc3NpdmVNYXAgPSB0aGlzLmVtaXNzaXZlTWFwLnRvSlNPTiggbWV0YSAp
LnV1aWQ7CisJCQlpZiAoIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1Rl
eHR1cmUgKSBkYXRhLnNwZWN1bGFyTWFwID0gdGhpcy5zcGVjdWxhck1hcC50b0pTT04oIG1ldGEg
KS51dWlkOworCisJCQlpZiAoIHRoaXMuZW52TWFwICYmIHRoaXMuZW52TWFwLmlzVGV4dHVyZSAp
IHsKKworCQkJCWRhdGEuZW52TWFwID0gdGhpcy5lbnZNYXAudG9KU09OKCBtZXRhICkudXVpZDsK
KwkJCQlkYXRhLnJlZmxlY3Rpdml0eSA9IHRoaXMucmVmbGVjdGl2aXR5OyAvLyBTY2FsZSBiZWhp
bmQgZW52TWFwCisKKwkJCX0KKworCQkJaWYgKCB0aGlzLmdyYWRpZW50TWFwICYmIHRoaXMuZ3Jh
ZGllbnRNYXAuaXNUZXh0dXJlICkgeworCisJCQkJZGF0YS5ncmFkaWVudE1hcCA9IHRoaXMuZ3Jh
ZGllbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDsKKworCQkJfQorCisJCQlpZiAoIHRoaXMuc2l6
ZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplID0gdGhpcy5zaXplOworCQkJaWYgKCB0aGlzLnNp
emVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplQXR0ZW51YXRpb24gPSB0aGlz
LnNpemVBdHRlbnVhdGlvbjsKKworCQkJaWYgKCB0aGlzLmJsZW5kaW5nICE9PSBOb3JtYWxCbGVu
ZGluZyApIGRhdGEuYmxlbmRpbmcgPSB0aGlzLmJsZW5kaW5nOworCQkJaWYgKCB0aGlzLnNoYWRp
bmcgIT09IFNtb290aFNoYWRpbmcgKSBkYXRhLnNoYWRpbmcgPSB0aGlzLnNoYWRpbmc7CisJCQlp
ZiAoIHRoaXMuc2lkZSAhPT0gRnJvbnRTaWRlICkgZGF0YS5zaWRlID0gdGhpcy5zaWRlOworCQkJ
aWYgKCB0aGlzLnZlcnRleENvbG9ycyAhPT0gTm9Db2xvcnMgKSBkYXRhLnZlcnRleENvbG9ycyA9
IHRoaXMudmVydGV4Q29sb3JzOworCisJCQlpZiAoIHRoaXMub3BhY2l0eSA8IDEgKSBkYXRhLm9w
YWNpdHkgPSB0aGlzLm9wYWNpdHk7CisJCQlpZiAoIHRoaXMudHJhbnNwYXJlbnQgPT09IHRydWUg
KSBkYXRhLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDsKKworCQkJZGF0YS5kZXB0aEZ1
bmMgPSB0aGlzLmRlcHRoRnVuYzsKKwkJCWRhdGEuZGVwdGhUZXN0ID0gdGhpcy5kZXB0aFRlc3Q7
CisJCQlkYXRhLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGU7CisKKwkJCWlmICggdGhpcy5h
bHBoYVRlc3QgPiAwICkgZGF0YS5hbHBoYVRlc3QgPSB0aGlzLmFscGhhVGVzdDsKKwkJCWlmICgg
dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSBkYXRhLnByZW11bHRpcGxpZWRBbHBo
YSA9IHRoaXMucHJlbXVsdGlwbGllZEFscGhhOworCQkJaWYgKCB0aGlzLndpcmVmcmFtZSA9PT0g
dHJ1ZSApIGRhdGEud2lyZWZyYW1lID0gdGhpcy53aXJlZnJhbWU7CisJCQlpZiAoIHRoaXMud2ly
ZWZyYW1lTGluZXdpZHRoID4gMSApIGRhdGEud2lyZWZyYW1lTGluZXdpZHRoID0gdGhpcy53aXJl
ZnJhbWVMaW5ld2lkdGg7CisJCQlpZiAoIHRoaXMud2lyZWZyYW1lTGluZWNhcCAhPT0gJ3JvdW5k
JyApIGRhdGEud2lyZWZyYW1lTGluZWNhcCA9IHRoaXMud2lyZWZyYW1lTGluZWNhcDsKKwkJCWlm
ICggdGhpcy53aXJlZnJhbWVMaW5lam9pbiAhPT0gJ3JvdW5kJyApIGRhdGEud2lyZWZyYW1lTGlu
ZWpvaW4gPSB0aGlzLndpcmVmcmFtZUxpbmVqb2luOworCisJCQlkYXRhLnNraW5uaW5nID0gdGhp
cy5za2lubmluZzsKKwkJCWRhdGEubW9ycGhUYXJnZXRzID0gdGhpcy5tb3JwaFRhcmdldHM7CisK
KwkJCWRhdGEuZGl0aGVyaW5nID0gdGhpcy5kaXRoZXJpbmc7CisKKwkJCS8vIFRPRE86IENvcGll
ZCBmcm9tIE9iamVjdDNELnRvSlNPTgorCisJCQlmdW5jdGlvbiBleHRyYWN0RnJvbUNhY2hlKCBj
YWNoZSApIHsKKworCQkJCXZhciB2YWx1ZXMgPSBbXTsKKworCQkJCWZvciAoIHZhciBrZXkgaW4g
Y2FjaGUgKSB7CisKKwkJCQkJdmFyIGRhdGEgPSBjYWNoZVsga2V5IF07CisJCQkJCWRlbGV0ZSBk
YXRhLm1ldGFkYXRhOworCQkJCQl2YWx1ZXMucHVzaCggZGF0YSApOworCisJCQkJfQorCisJCQkJ
cmV0dXJuIHZhbHVlczsKKworCQkJfQorCisJCQlpZiAoIGlzUm9vdCApIHsKKworCQkJCXZhciB0
ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTsKKwkJCQl2YXIgaW1h
Z2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTsKKworCQkJCWlmICggdGV4dHVy
ZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlczsKKwkJCQlpZiAoIGltYWdl
cy5sZW5ndGggPiAwICkgZGF0YS5pbWFnZXMgPSBpbWFnZXM7CisKKwkJCX0KKworCQkJcmV0dXJu
IGRhdGE7CisKKwkJfSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3
IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5j
dGlvbiAoIHNvdXJjZSApIHsKKworCQkJdGhpcy5uYW1lID0gc291cmNlLm5hbWU7CisKKwkJCXRo
aXMuZm9nID0gc291cmNlLmZvZzsKKwkJCXRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0czsKKwor
CQkJdGhpcy5ibGVuZGluZyA9IHNvdXJjZS5ibGVuZGluZzsKKwkJCXRoaXMuc2lkZSA9IHNvdXJj
ZS5zaWRlOworCQkJdGhpcy5zaGFkaW5nID0gc291cmNlLnNoYWRpbmc7CisJCQl0aGlzLnZlcnRl
eENvbG9ycyA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnM7CisKKwkJCXRoaXMub3BhY2l0eSA9IHNvdXJj
ZS5vcGFjaXR5OworCQkJdGhpcy50cmFuc3BhcmVudCA9IHNvdXJjZS50cmFuc3BhcmVudDsKKwor
CQkJdGhpcy5ibGVuZFNyYyA9IHNvdXJjZS5ibGVuZFNyYzsKKwkJCXRoaXMuYmxlbmREc3QgPSBz
b3VyY2UuYmxlbmREc3Q7CisJCQl0aGlzLmJsZW5kRXF1YXRpb24gPSBzb3VyY2UuYmxlbmRFcXVh
dGlvbjsKKwkJCXRoaXMuYmxlbmRTcmNBbHBoYSA9IHNvdXJjZS5ibGVuZFNyY0FscGhhOworCQkJ
dGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7CisJCQl0aGlzLmJsZW5k
RXF1YXRpb25BbHBoYSA9IHNvdXJjZS5ibGVuZEVxdWF0aW9uQWxwaGE7CisKKwkJCXRoaXMuZGVw
dGhGdW5jID0gc291cmNlLmRlcHRoRnVuYzsKKwkJCXRoaXMuZGVwdGhUZXN0ID0gc291cmNlLmRl
cHRoVGVzdDsKKwkJCXRoaXMuZGVwdGhXcml0ZSA9IHNvdXJjZS5kZXB0aFdyaXRlOworCisJCQl0
aGlzLmNvbG9yV3JpdGUgPSBzb3VyY2UuY29sb3JXcml0ZTsKKworCQkJdGhpcy5wcmVjaXNpb24g
PSBzb3VyY2UucHJlY2lzaW9uOworCisJCQl0aGlzLnBvbHlnb25PZmZzZXQgPSBzb3VyY2UucG9s
eWdvbk9mZnNldDsKKwkJCXRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IHNvdXJjZS5wb2x5Z29u
T2Zmc2V0RmFjdG9yOworCQkJdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBzb3VyY2UucG9seWdv
bk9mZnNldFVuaXRzOworCisJCQl0aGlzLmRpdGhlcmluZyA9IHNvdXJjZS5kaXRoZXJpbmc7CisK
KwkJCXRoaXMuYWxwaGFUZXN0ID0gc291cmNlLmFscGhhVGVzdDsKKworCQkJdGhpcy5wcmVtdWx0
aXBsaWVkQWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbGllZEFscGhhOworCisJCQl0aGlzLm92ZXJk
cmF3ID0gc291cmNlLm92ZXJkcmF3OworCisJCQl0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJs
ZTsKKwkJCXRoaXMuY2xpcFNoYWRvd3MgPSBzb3VyY2UuY2xpcFNoYWRvd3M7CisJCQl0aGlzLmNs
aXBJbnRlcnNlY3Rpb24gPSBzb3VyY2UuY2xpcEludGVyc2VjdGlvbjsKKworCQkJdmFyIHNyY1Bs
YW5lcyA9IHNvdXJjZS5jbGlwcGluZ1BsYW5lcywKKwkJCQlkc3RQbGFuZXMgPSBudWxsOworCisJ
CQlpZiAoIHNyY1BsYW5lcyAhPT0gbnVsbCApIHsKKworCQkJCXZhciBuID0gc3JjUGxhbmVzLmxl
bmd0aDsKKwkJCQlkc3RQbGFuZXMgPSBuZXcgQXJyYXkoIG4gKTsKKworCQkJCWZvciAoIHZhciBp
ID0gMDsgaSAhPT0gbjsgKysgaSApCisJCQkJCWRzdFBsYW5lc1sgaSBdID0gc3JjUGxhbmVzWyBp
IF0uY2xvbmUoKTsKKworCQkJfQorCisJCQl0aGlzLmNsaXBwaW5nUGxhbmVzID0gZHN0UGxhbmVz
OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWRpc3Bvc2U6IGZ1bmN0aW9uICgpIHsK
KworCQkJdGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7CisKKwkJfQor
CisJfSApOworCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVh
bGlhLmNvbS8KKwkgKgorCSAqIHBhcmFtZXRlcnMgPSB7CisJICogIGRlZmluZXM6IHsgImxhYmVs
IiA6ICJ2YWx1ZSIgfSwKKwkgKiAgdW5pZm9ybXM6IHsgInBhcmFtZXRlcjEiOiB7IHZhbHVlOiAx
LjAgfSwgInBhcmFtZXRlcjIiOiB7IHZhbHVlMjogMiB9IH0sCisJICoKKwkgKiAgZnJhZ21lbnRT
aGFkZXI6IDxzdHJpbmc+LAorCSAqICB2ZXJ0ZXhTaGFkZXI6IDxzdHJpbmc+LAorCSAqCisJICog
IHdpcmVmcmFtZTogPGJvb2xlYW4+LAorCSAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4s
CisJICoKKwkgKiAgbGlnaHRzOiA8Ym9vbD4sCisJICoKKwkgKiAgc2tpbm5pbmc6IDxib29sPiwK
KwkgKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sCisJICogIG1vcnBoTm9ybWFsczogPGJvb2w+CisJ
ICogfQorCSAqLworCisJZnVuY3Rpb24gU2hhZGVyTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CisK
KwkJTWF0ZXJpYWwuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdTaGFkZXJNYXRlcmlh
bCc7CisKKwkJdGhpcy5kZWZpbmVzID0ge307CisJCXRoaXMudW5pZm9ybXMgPSB7fTsKKworCQl0
aGlzLnZlcnRleFNoYWRlciA9ICd2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uID0gcHJvamVj
dGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0n
OworCQl0aGlzLmZyYWdtZW50U2hhZGVyID0gJ3ZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9y
ID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XG59JzsKKworCQl0aGlzLmxpbmV3aWR0aCA9
IDE7CisKKwkJdGhpcy53aXJlZnJhbWUgPSBmYWxzZTsKKwkJdGhpcy53aXJlZnJhbWVMaW5ld2lk
dGggPSAxOworCisJCXRoaXMuZm9nID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2NlbmUgZm9nCisJ
CXRoaXMubGlnaHRzID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2NlbmUgbGlnaHRzCisJCXRoaXMu
Y2xpcHBpbmcgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSB1c2VyLWRlZmluZWQgY2xpcHBpbmcgcGxh
bmVzCisKKwkJdGhpcy5za2lubmluZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNraW5uaW5nIGF0
dHJpYnV0ZSBzdHJlYW1zCisJCXRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7IC8vIHNldCB0byB1
c2UgbW9ycGggdGFyZ2V0cworCQl0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlOyAvLyBzZXQgdG8g
dXNlIG1vcnBoIG5vcm1hbHMKKworCQl0aGlzLmV4dGVuc2lvbnMgPSB7CisJCQlkZXJpdmF0aXZl
czogZmFsc2UsIC8vIHNldCB0byB1c2UgZGVyaXZhdGl2ZXMKKwkJCWZyYWdEZXB0aDogZmFsc2Us
IC8vIHNldCB0byB1c2UgZnJhZ21lbnQgZGVwdGggdmFsdWVzCisJCQlkcmF3QnVmZmVyczogZmFs
c2UsIC8vIHNldCB0byB1c2UgZHJhdyBidWZmZXJzCisJCQlzaGFkZXJUZXh0dXJlTE9EOiBmYWxz
ZSAvLyBzZXQgdG8gdXNlIHNoYWRlciB0ZXh0dXJlIExPRAorCQl9OworCisJCS8vIFdoZW4gcmVu
ZGVyZWQgZ2VvbWV0cnkgZG9lc24ndCBpbmNsdWRlIHRoZXNlIGF0dHJpYnV0ZXMgYnV0IHRoZSBt
YXRlcmlhbCBkb2VzLAorCQkvLyB1c2UgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgaW4gV2ViR0wuIFRo
aXMgYXZvaWRzIGVycm9ycyB3aGVuIGJ1ZmZlciBkYXRhIGlzIG1pc3NpbmcuCisJCXRoaXMuZGVm
YXVsdEF0dHJpYnV0ZVZhbHVlcyA9IHsKKwkJCSdjb2xvcic6IFsgMSwgMSwgMSBdLAorCQkJJ3V2
JzogWyAwLCAwIF0sCisJCQkndXYyJzogWyAwLCAwIF0KKwkJfTsKKworCQl0aGlzLmluZGV4MEF0
dHJpYnV0ZU5hbWUgPSB1bmRlZmluZWQ7CisKKwkJaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCWlmICggcGFyYW1ldGVycy5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgKSB7
CisKKwkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IGF0dHJpYnV0ZXMg
c2hvdWxkIG5vdyBiZSBkZWZpbmVkIGluIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJyAp
OworCisJCQl9CisKKwkJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CisKKwkJfQorCisJ
fQorCisJU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwu
cHJvdG90eXBlICk7CisJU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hh
ZGVyTWF0ZXJpYWw7CisKKwlTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNTaGFkZXJNYXRlcmlh
bCA9IHRydWU7CisKKwlTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICgg
c291cmNlICkgeworCisJCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJj
ZSApOworCisJCXRoaXMuZnJhZ21lbnRTaGFkZXIgPSBzb3VyY2UuZnJhZ21lbnRTaGFkZXI7CisJ
CXRoaXMudmVydGV4U2hhZGVyID0gc291cmNlLnZlcnRleFNoYWRlcjsKKworCQl0aGlzLnVuaWZv
cm1zID0gVW5pZm9ybXNVdGlscy5jbG9uZSggc291cmNlLnVuaWZvcm1zICk7CisKKwkJdGhpcy5k
ZWZpbmVzID0gc291cmNlLmRlZmluZXM7CisKKwkJdGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2ly
ZWZyYW1lOworCQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5l
d2lkdGg7CisKKwkJdGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzOworCQl0aGlzLmNsaXBwaW5n
ID0gc291cmNlLmNsaXBwaW5nOworCisJCXRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7
CisKKwkJdGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzOworCQl0aGlzLm1v
cnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7CisKKwkJdGhpcy5leHRlbnNpb25zID0g
c291cmNlLmV4dGVuc2lvbnM7CisKKwkJcmV0dXJuIHRoaXM7CisKKwl9OworCisJU2hhZGVyTWF0
ZXJpYWwucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggbWV0YSApIHsKKworCQl2YXIgZGF0
YSA9IE1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApOworCisJCWRh
dGEudW5pZm9ybXMgPSB0aGlzLnVuaWZvcm1zOworCQlkYXRhLnZlcnRleFNoYWRlciA9IHRoaXMu
dmVydGV4U2hhZGVyOworCQlkYXRhLmZyYWdtZW50U2hhZGVyID0gdGhpcy5mcmFnbWVudFNoYWRl
cjsKKworCQlyZXR1cm4gZGF0YTsKKworCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAv
IGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJl
ZHF1YWxpYS5jb20vCisJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHBzOi8vY2xhcmEuaW8KKwkg
KiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKwkg
KgorCSAqIHBhcmFtZXRlcnMgPSB7CisJICoKKwkgKiAgb3BhY2l0eTogPGZsb2F0PiwKKwkgKgor
CSAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICoKKwkgKiAgYWxwaGFN
YXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICoKKwkgKiAgZGlzcGxhY2VtZW50
TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqICBkaXNwbGFjZW1lbnRTY2Fs
ZTogPGZsb2F0PiwKKwkgKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PiwKKwkgKgorCSAqICB3
aXJlZnJhbWU6IDxib29sZWFuPiwKKwkgKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+CisJ
ICogfQorCSAqLworCisJZnVuY3Rpb24gTWVzaERlcHRoTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7
CisKKwkJTWF0ZXJpYWwuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdNZXNoRGVwdGhN
YXRlcmlhbCc7CisKKwkJdGhpcy5kZXB0aFBhY2tpbmcgPSBCYXNpY0RlcHRoUGFja2luZzsKKwor
CQl0aGlzLnNraW5uaW5nID0gZmFsc2U7CisJCXRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7CisK
KwkJdGhpcy5tYXAgPSBudWxsOworCisJCXRoaXMuYWxwaGFNYXAgPSBudWxsOworCisJCXRoaXMu
ZGlzcGxhY2VtZW50TWFwID0gbnVsbDsKKwkJdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7CisJ
CXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7CisKKwkJdGhpcy53aXJlZnJhbWUgPSBmYWxzZTsK
KwkJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxOworCisJCXRoaXMuZm9nID0gZmFsc2U7CisJ
CXRoaXMubGlnaHRzID0gZmFsc2U7CisKKwkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsK
KworCX0KKworCU1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1h
dGVyaWFsLnByb3RvdHlwZSApOworCU1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1
Y3RvciA9IE1lc2hEZXB0aE1hdGVyaWFsOworCisJTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBl
LmlzTWVzaERlcHRoTWF0ZXJpYWwgPSB0cnVlOworCisJTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90
eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworCQlNYXRlcmlhbC5wcm90b3R5cGUu
Y29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworCQl0aGlzLmRlcHRoUGFja2luZyA9IHNvdXJj
ZS5kZXB0aFBhY2tpbmc7CisKKwkJdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKKwkJ
dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzOworCisJCXRoaXMubWFwID0g
c291cmNlLm1hcDsKKworCQl0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwOworCisJCXRo
aXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDsKKwkJdGhpcy5kaXNw
bGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTsKKwkJdGhpcy5kaXNwbGFj
ZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7CisKKwkJdGhpcy53aXJlZnJhbWUg
PSBzb3VyY2Uud2lyZWZyYW1lOworCQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53
aXJlZnJhbWVMaW5ld2lkdGg7CisKKwkJcmV0dXJuIHRoaXM7CisKKwl9OworCisJLyoqCisJICog
QGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworCSAqIEBhdXRob3IgV2VzdExhbmds
ZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorCSAqLworCisJZnVuY3Rpb24gQm94
MyggbWluLCBtYXggKSB7CisKKwkJdGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZpbmVkICkgPyBt
aW4gOiBuZXcgVmVjdG9yMyggKyBJbmZpbml0eSwgKyBJbmZpbml0eSwgKyBJbmZpbml0eSApOwor
CQl0aGlzLm1heCA9ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3IzKCAt
IEluZmluaXR5LCAtIEluZmluaXR5LCAtIEluZmluaXR5ICk7CisKKwl9CisKKwlPYmplY3QuYXNz
aWduKCBCb3gzLnByb3RvdHlwZSwgeworCisJCWlzQm94MzogdHJ1ZSwKKworCQlzZXQ6IGZ1bmN0
aW9uICggbWluLCBtYXggKSB7CisKKwkJCXRoaXMubWluLmNvcHkoIG1pbiApOworCQkJdGhpcy5t
YXguY29weSggbWF4ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0RnJvbUFy
cmF5OiBmdW5jdGlvbiAoIGFycmF5ICkgeworCisJCQl2YXIgbWluWCA9ICsgSW5maW5pdHk7CisJ
CQl2YXIgbWluWSA9ICsgSW5maW5pdHk7CisJCQl2YXIgbWluWiA9ICsgSW5maW5pdHk7CisKKwkJ
CXZhciBtYXhYID0gLSBJbmZpbml0eTsKKwkJCXZhciBtYXhZID0gLSBJbmZpbml0eTsKKwkJCXZh
ciBtYXhaID0gLSBJbmZpbml0eTsKKworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVu
Z3RoOyBpIDwgbDsgaSArPSAzICkgeworCisJCQkJdmFyIHggPSBhcnJheVsgaSBdOworCQkJCXZh
ciB5ID0gYXJyYXlbIGkgKyAxIF07CisJCQkJdmFyIHogPSBhcnJheVsgaSArIDIgXTsKKworCQkJ
CWlmICggeCA8IG1pblggKSBtaW5YID0geDsKKwkJCQlpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7
CisJCQkJaWYgKCB6IDwgbWluWiApIG1pblogPSB6OworCisJCQkJaWYgKCB4ID4gbWF4WCApIG1h
eFggPSB4OworCQkJCWlmICggeSA+IG1heFkgKSBtYXhZID0geTsKKwkJCQlpZiAoIHogPiBtYXha
ICkgbWF4WiA9IHo7CisKKwkJCX0KKworCQkJdGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5a
ICk7CisJCQl0aGlzLm1heC5zZXQoIG1heFgsIG1heFksIG1heFogKTsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfSwKKworCQlzZXRGcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJp
YnV0ZSApIHsKKworCQkJdmFyIG1pblggPSArIEluZmluaXR5OworCQkJdmFyIG1pblkgPSArIElu
ZmluaXR5OworCQkJdmFyIG1pblogPSArIEluZmluaXR5OworCisJCQl2YXIgbWF4WCA9IC0gSW5m
aW5pdHk7CisJCQl2YXIgbWF4WSA9IC0gSW5maW5pdHk7CisJCQl2YXIgbWF4WiA9IC0gSW5maW5p
dHk7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkg
KysgKSB7CisKKwkJCQl2YXIgeCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7CisJCQkJdmFyIHkgPSBh
dHRyaWJ1dGUuZ2V0WSggaSApOworCQkJCXZhciB6ID0gYXR0cmlidXRlLmdldFooIGkgKTsKKwor
CQkJCWlmICggeCA8IG1pblggKSBtaW5YID0geDsKKwkJCQlpZiAoIHkgPCBtaW5ZICkgbWluWSA9
IHk7CisJCQkJaWYgKCB6IDwgbWluWiApIG1pblogPSB6OworCisJCQkJaWYgKCB4ID4gbWF4WCAp
IG1heFggPSB4OworCQkJCWlmICggeSA+IG1heFkgKSBtYXhZID0geTsKKwkJCQlpZiAoIHogPiBt
YXhaICkgbWF4WiA9IHo7CisKKwkJCX0KKworCQkJdGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBt
aW5aICk7CisJCQl0aGlzLm1heC5zZXQoIG1heFgsIG1heFksIG1heFogKTsKKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQlzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHsK
KworCQkJdGhpcy5tYWtlRW1wdHkoKTsKKworCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50
cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJCXRoaXMuZXhwYW5kQnlQb2ludCggcG9p
bnRzWyBpIF0gKTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldEZy
b21DZW50ZXJBbmRTaXplOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3Iz
KCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBz
aXplICkgeworCisJCQkJdmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2Nh
bGFyKCAwLjUgKTsKKworCQkJCXRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUg
KTsKKwkJCQl0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7CisKKwkJCQly
ZXR1cm4gdGhpczsKKworCQkJfTsKKworCQl9KCksCisKKwkJc2V0RnJvbU9iamVjdDogZnVuY3Rp
b24gKCBvYmplY3QgKSB7CisKKwkJCXRoaXMubWFrZUVtcHR5KCk7CisKKwkJCXJldHVybiB0aGlz
LmV4cGFuZEJ5T2JqZWN0KCBvYmplY3QgKTsKKworCQl9LAorCisJCWNsb25lOiBmdW5jdGlvbiAo
KSB7CisKKwkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKwor
CQl9LAorCisJCWNvcHk6IGZ1bmN0aW9uICggYm94ICkgeworCisJCQl0aGlzLm1pbi5jb3B5KCBi
b3gubWluICk7CisJCQl0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJbWFrZUVtcHR5OiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMubWluLngg
PSB0aGlzLm1pbi55ID0gdGhpcy5taW4ueiA9ICsgSW5maW5pdHk7CisJCQl0aGlzLm1heC54ID0g
dGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtIEluZmluaXR5OworCisJCQlyZXR1cm4gdGhpczsK
KworCQl9LAorCisJCWlzRW1wdHk6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gdGhpcyBpcyBhIG1v
cmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNhdXNlIHZv
bHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXMKKworCQkJcmV0dXJu
ICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55
ICkgfHwgKCB0aGlzLm1heC56IDwgdGhpcy5taW4ueiApOworCisJCX0sCisKKwkJZ2V0Q2VudGVy
OiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQl2YXIgcmVzdWx0ID0gb3B0aW9u
YWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKwkJCXJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHJl
c3VsdC5zZXQoIDAsIDAsIDAgKSA6IHJlc3VsdC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5t
YXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7CisKKwkJfSwKKworCQlnZXRTaXplOiBmdW5jdGlv
biAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQg
fHwgbmV3IFZlY3RvcjMoKTsKKwkJCXJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHJlc3VsdC5zZXQo
IDAsIDAsIDAgKSA6IHJlc3VsdC5zdWJWZWN0b3JzKCB0aGlzLm1heCwgdGhpcy5taW4gKTsKKwor
CQl9LAorCisJCWV4cGFuZEJ5UG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CisKKwkJCXRoaXMu
bWluLm1pbiggcG9pbnQgKTsKKwkJCXRoaXMubWF4Lm1heCggcG9pbnQgKTsKKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQlleHBhbmRCeVZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7
CisKKwkJCXRoaXMubWluLnN1YiggdmVjdG9yICk7CisJCQl0aGlzLm1heC5hZGQoIHZlY3RvciAp
OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWV4cGFuZEJ5U2NhbGFyOiBmdW5jdGlv
biAoIHNjYWxhciApIHsKKworCQkJdGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApOworCQkJ
dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQlleHBhbmRCeU9iamVjdDogZnVuY3Rpb24gKCkgeworCisJCQkvLyBDb21wdXRlcyB0aGUg
d29ybGQtYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBvZiBhbiBvYmplY3QgKGluY2x1ZGluZyBp
dHMgY2hpbGRyZW4pLAorCQkJLy8gYWNjb3VudGluZyBmb3IgYm90aCB0aGUgb2JqZWN0J3MsIGFu
ZCBjaGlsZHJlbidzLCB3b3JsZCB0cmFuc2Zvcm1zCisKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3Iz
KCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiBleHBhbmRCeU9iamVjdCggb2JqZWN0ICkgeworCisJ
CQkJdmFyIHNjb3BlID0gdGhpczsKKworCQkJCW9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1
ZSApOworCisJCQkJb2JqZWN0LnRyYXZlcnNlKCBmdW5jdGlvbiAoIG5vZGUgKSB7CisKKwkJCQkJ
dmFyIGksIGw7CisKKwkJCQkJdmFyIGdlb21ldHJ5ID0gbm9kZS5nZW9tZXRyeTsKKworCQkJCQlp
ZiAoIGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCWlmICggZ2VvbWV0cnkuaXNH
ZW9tZXRyeSApIHsKKworCQkJCQkJCXZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOwor
CisJCQkJCQkJZm9yICggaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkg
eworCisJCQkJCQkJCXYxLmNvcHkoIHZlcnRpY2VzWyBpIF0gKTsKKwkJCQkJCQkJdjEuYXBwbHlN
YXRyaXg0KCBub2RlLm1hdHJpeFdvcmxkICk7CisKKwkJCQkJCQkJc2NvcGUuZXhwYW5kQnlQb2lu
dCggdjEgKTsKKworCQkJCQkJCX0KKworCQkJCQkJfSBlbHNlIGlmICggZ2VvbWV0cnkuaXNCdWZm
ZXJHZW9tZXRyeSApIHsKKworCQkJCQkJCXZhciBhdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1
dGVzLnBvc2l0aW9uOworCisJCQkJCQkJaWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHsK
KworCQkJCQkJCQlmb3IgKCBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysg
KSB7CisKKwkJCQkJCQkJCXYxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaSApLmFw
cGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCApOworCisJCQkJCQkJCQlzY29wZS5leHBhbmRC
eVBvaW50KCB2MSApOworCisJCQkJCQkJCX0KKworCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJ
CX0KKworCQkJCX0gKTsKKworCQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKwor
CQljb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgeworCisJCQlyZXR1cm4gcG9pbnQu
eCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHwKKwkJCQlwb2ludC55IDwg
dGhpcy5taW4ueSB8fCBwb2ludC55ID4gdGhpcy5tYXgueSB8fAorCQkJCXBvaW50LnogPCB0aGlz
Lm1pbi56IHx8IHBvaW50LnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlOworCisJCX0sCisK
KwkJY29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkgeworCisJCQlyZXR1cm4gdGhpcy5taW4u
eCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiYKKwkJCQl0aGlzLm1p
bi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueSAmJgorCQkJCXRoaXMu
bWluLnogPD0gYm94Lm1pbi56ICYmIGJveC5tYXgueiA8PSB0aGlzLm1heC56OworCisJCX0sCisK
KwkJZ2V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHsKKwor
CQkJLy8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBi
b3gKKwkJCS8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuCisKKwkJCXZhciByZXN1bHQgPSBv
cHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gcmVzdWx0LnNldCgK
KwkJCQkoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54
ICksCisJCQkJKCBwb2ludC55IC0gdGhpcy5taW4ueSApIC8gKCB0aGlzLm1heC55IC0gdGhpcy5t
aW4ueSApLAorCQkJCSggcG9pbnQueiAtIHRoaXMubWluLnogKSAvICggdGhpcy5tYXgueiAtIHRo
aXMubWluLnogKQorCQkJKTsKKworCQl9LAorCisJCWludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICgg
Ym94ICkgeworCisJCQkvLyB1c2luZyA2IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50
ZXJzZWN0aW9ucy4KKwkJCXJldHVybiBib3gubWF4LnggPCB0aGlzLm1pbi54IHx8IGJveC5taW4u
eCA+IHRoaXMubWF4LnggfHwKKwkJCQlib3gubWF4LnkgPCB0aGlzLm1pbi55IHx8IGJveC5taW4u
eSA+IHRoaXMubWF4LnkgfHwKKwkJCQlib3gubWF4LnogPCB0aGlzLm1pbi56IHx8IGJveC5taW4u
eiA+IHRoaXMubWF4LnogPyBmYWxzZSA6IHRydWU7CisKKwkJfSwKKworCQlpbnRlcnNlY3RzU3Bo
ZXJlOiAoIGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGNsb3Nlc3RQb2ludCA9IG5ldyBWZWN0b3Iz
KCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSB7CisK
KwkJCQkvLyBGaW5kIHRoZSBwb2ludCBvbiB0aGUgQUFCQiBjbG9zZXN0IHRvIHRoZSBzcGhlcmUg
Y2VudGVyLgorCQkJCXRoaXMuY2xhbXBQb2ludCggc3BoZXJlLmNlbnRlciwgY2xvc2VzdFBvaW50
ICk7CisKKwkJCQkvLyBJZiB0aGF0IHBvaW50IGlzIGluc2lkZSB0aGUgc3BoZXJlLCB0aGUgQUFC
QiBhbmQgc3BoZXJlIGludGVyc2VjdC4KKwkJCQlyZXR1cm4gY2xvc2VzdFBvaW50LmRpc3RhbmNl
VG9TcXVhcmVkKCBzcGhlcmUuY2VudGVyICkgPD0gKCBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJh
ZGl1cyApOworCisJCQl9OworCisJCX0gKSgpLAorCisJCWludGVyc2VjdHNQbGFuZTogZnVuY3Rp
b24gKCBwbGFuZSApIHsKKworCQkJLy8gV2UgY29tcHV0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11
bSBkb3QgcHJvZHVjdCB2YWx1ZXMuIElmIHRob3NlIHZhbHVlcworCQkJLy8gYXJlIG9uIHRoZSBz
YW1lIHNpZGUgKGJhY2sgb3IgZnJvbnQpIG9mIHRoZSBwbGFuZSwgdGhlbiB0aGVyZSBpcyBubyBp
bnRlcnNlY3Rpb24uCisKKwkJCXZhciBtaW4sIG1heDsKKworCQkJaWYgKCBwbGFuZS5ub3JtYWwu
eCA+IDAgKSB7CisKKwkJCQltaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7CisJCQkJ
bWF4ID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1heC54OworCisJCQl9IGVsc2UgeworCisJCQkJ
bWluID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1heC54OworCQkJCW1heCA9IHBsYW5lLm5vcm1h
bC54ICogdGhpcy5taW4ueDsKKworCQkJfQorCisJCQlpZiAoIHBsYW5lLm5vcm1hbC55ID4gMCAp
IHsKKworCQkJCW1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWluLnk7CisJCQkJbWF4ICs9
IHBsYW5lLm5vcm1hbC55ICogdGhpcy5tYXgueTsKKworCQkJfSBlbHNlIHsKKworCQkJCW1pbiAr
PSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7CisJCQkJbWF4ICs9IHBsYW5lLm5vcm1hbC55
ICogdGhpcy5taW4ueTsKKworCQkJfQorCisJCQlpZiAoIHBsYW5lLm5vcm1hbC56ID4gMCApIHsK
KworCQkJCW1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7CisJCQkJbWF4ICs9IHBs
YW5lLm5vcm1hbC56ICogdGhpcy5tYXguejsKKworCQkJfSBlbHNlIHsKKworCQkJCW1pbiArPSBw
bGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7CisJCQkJbWF4ICs9IHBsYW5lLm5vcm1hbC56ICog
dGhpcy5taW4uejsKKworCQkJfQorCisJCQlyZXR1cm4gKCBtaW4gPD0gcGxhbmUuY29uc3RhbnQg
JiYgbWF4ID49IHBsYW5lLmNvbnN0YW50ICk7CisKKwkJfSwKKworCQljbGFtcFBvaW50OiBmdW5j
dGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJdmFyIHJlc3VsdCA9IG9wdGlv
bmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisJCQlyZXR1cm4gcmVzdWx0LmNvcHkoIHBvaW50
ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApOworCisJCX0sCisKKwkJZGlzdGFuY2VUb1Bv
aW50OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJl
dHVybiBmdW5jdGlvbiBkaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgeworCisJCQkJdmFyIGNsYW1w
ZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApOwor
CQkJCXJldHVybiBjbGFtcGVkUG9pbnQuc3ViKCBwb2ludCApLmxlbmd0aCgpOworCisJCQl9Owor
CisJCX0oKSwKKworCQlnZXRCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkgeworCisJCQl2YXIg
djEgPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gZ2V0Qm91bmRpbmdTcGhl
cmUoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0
IHx8IG5ldyBTcGhlcmUoKTsKKworCQkJCXRoaXMuZ2V0Q2VudGVyKCByZXN1bHQuY2VudGVyICk7
CisKKwkJCQlyZXN1bHQucmFkaXVzID0gdGhpcy5nZXRTaXplKCB2MSApLmxlbmd0aCgpICogMC41
OworCisJCQkJcmV0dXJuIHJlc3VsdDsKKworCQkJfTsKKworCQl9KCksCisKKwkJaW50ZXJzZWN0
OiBmdW5jdGlvbiAoIGJveCApIHsKKworCQkJdGhpcy5taW4ubWF4KCBib3gubWluICk7CisJCQl0
aGlzLm1heC5taW4oIGJveC5tYXggKTsKKworCQkJLy8gZW5zdXJlIHRoYXQgaWYgdGhlcmUgaXMg
bm8gb3ZlcmxhcCwgdGhlIHJlc3VsdCBpcyBmdWxseSBlbXB0eSwgbm90IHNsaWdodGx5IGVtcHR5
IHdpdGggbm9uLWluZi8raW5mIHZhbHVlcyB0aGF0IHdpbGwgY2F1c2Ugc3Vic2VxdWVuY2UgaW50
ZXJzZWN0cyB0byBlcnJvbmVvdXNseSByZXR1cm4gdmFsaWQgdmFsdWVzLgorCQkJaWYoIHRoaXMu
aXNFbXB0eSgpICkgdGhpcy5tYWtlRW1wdHkoKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQl1bmlvbjogZnVuY3Rpb24gKCBib3ggKSB7CisKKwkJCXRoaXMubWluLm1pbiggYm94Lm1p
biApOworCQkJdGhpcy5tYXgubWF4KCBib3gubWF4ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJ
CX0sCisKKwkJYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBwb2ludHMgPSBb
CisJCQkJbmV3IFZlY3RvcjMoKSwKKwkJCQluZXcgVmVjdG9yMygpLAorCQkJCW5ldyBWZWN0b3Iz
KCksCisJCQkJbmV3IFZlY3RvcjMoKSwKKwkJCQluZXcgVmVjdG9yMygpLAorCQkJCW5ldyBWZWN0
b3IzKCksCisJCQkJbmV3IFZlY3RvcjMoKSwKKwkJCQluZXcgVmVjdG9yMygpCisJCQldOworCisJ
CQlyZXR1cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXggKSB7CisKKwkJCQkvLyB0cmFu
c2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC4KKwkJCQlpZiggdGhpcy5pc0VtcHR5
KCkgKSByZXR1cm4gdGhpczsKKworCQkJCS8vIE5PVEU6IEkgYW0gdXNpbmcgYSBiaW5hcnkgcGF0
dGVybiB0byBzcGVjaWZ5IGFsbCAyXjMgY29tYmluYXRpb25zIGJlbG93CisJCQkJcG9pbnRzWyAw
IF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0
KCBtYXRyaXggKTsgLy8gMDAwCisJCQkJcG9pbnRzWyAxIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlz
Lm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAxCisJCQkJ
cG9pbnRzWyAyIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56ICkuYXBw
bHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDEwCisJCQkJcG9pbnRzWyAzIF0uc2V0KCB0aGlzLm1p
bi54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8g
MDExCisJCQkJcG9pbnRzWyA0IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1p
bi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAwCisJCQkJcG9pbnRzWyA1IF0uc2V0
KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRy
aXggKTsgLy8gMTAxCisJCQkJcG9pbnRzWyA2IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55
LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTEwCisJCQkJcG9pbnRz
WyA3IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRy
aXg0KCBtYXRyaXggKTsJLy8gMTExCisKKwkJCQl0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyAp
OworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCXRyYW5zbGF0ZTog
ZnVuY3Rpb24gKCBvZmZzZXQgKSB7CisKKwkJCXRoaXMubWluLmFkZCggb2Zmc2V0ICk7CisJCQl0
aGlzLm1heC5hZGQoIG9mZnNldCApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWVx
dWFsczogZnVuY3Rpb24gKCBib3ggKSB7CisKKwkJCXJldHVybiBib3gubWluLmVxdWFscyggdGhp
cy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTsKKworCQl9CisKKwl9ICk7CisK
KwkvKioKKwkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCisJICogQGF1dGhv
ciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFNwaGVyZSgg
Y2VudGVyLCByYWRpdXMgKSB7CisKKwkJdGhpcy5jZW50ZXIgPSAoIGNlbnRlciAhPT0gdW5kZWZp
bmVkICkgPyBjZW50ZXIgOiBuZXcgVmVjdG9yMygpOworCQl0aGlzLnJhZGl1cyA9ICggcmFkaXVz
ICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDA7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBT
cGhlcmUucHJvdG90eXBlLCB7CisKKwkJc2V0OiBmdW5jdGlvbiAoIGNlbnRlciwgcmFkaXVzICkg
eworCisJCQl0aGlzLmNlbnRlci5jb3B5KCBjZW50ZXIgKTsKKwkJCXRoaXMucmFkaXVzID0gcmFk
aXVzOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldEZyb21Qb2ludHM6IGZ1bmN0
aW9uICgpIHsKKworCQkJdmFyIGJveCA9IG5ldyBCb3gzKCk7CisKKwkJCXJldHVybiBmdW5jdGlv
biBzZXRGcm9tUG9pbnRzKCBwb2ludHMsIG9wdGlvbmFsQ2VudGVyICkgeworCisJCQkJdmFyIGNl
bnRlciA9IHRoaXMuY2VudGVyOworCisJCQkJaWYgKCBvcHRpb25hbENlbnRlciAhPT0gdW5kZWZp
bmVkICkgeworCisJCQkJCWNlbnRlci5jb3B5KCBvcHRpb25hbENlbnRlciApOworCisJCQkJfSBl
bHNlIHsKKworCQkJCQlib3guc2V0RnJvbVBvaW50cyggcG9pbnRzICkuZ2V0Q2VudGVyKCBjZW50
ZXIgKTsKKworCQkJCX0KKworCQkJCXZhciBtYXhSYWRpdXNTcSA9IDA7CisKKwkJCQlmb3IgKCB2
YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJCW1h
eFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFy
ZWQoIHBvaW50c1sgaSBdICkgKTsKKworCQkJCX0KKworCQkJCXRoaXMucmFkaXVzID0gTWF0aC5z
cXJ0KCBtYXhSYWRpdXNTcSApOworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgp
LAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1
Y3RvcigpLmNvcHkoIHRoaXMgKTsKKworCQl9LAorCisJCWNvcHk6IGZ1bmN0aW9uICggc3BoZXJl
ICkgeworCisJCQl0aGlzLmNlbnRlci5jb3B5KCBzcGhlcmUuY2VudGVyICk7CisJCQl0aGlzLnJh
ZGl1cyA9IHNwaGVyZS5yYWRpdXM7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZW1w
dHk6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuICggdGhpcy5yYWRpdXMgPD0gMCApOworCisJ
CX0sCisKKwkJY29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKKworCQkJcmV0dXJu
ICggcG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCB0aGlzLnJhZGl1
cyAqIHRoaXMucmFkaXVzICkgKTsKKworCQl9LAorCisJCWRpc3RhbmNlVG9Qb2ludDogZnVuY3Rp
b24gKCBwb2ludCApIHsKKworCQkJcmV0dXJuICggcG9pbnQuZGlzdGFuY2VUbyggdGhpcy5jZW50
ZXIgKSAtIHRoaXMucmFkaXVzICk7CisKKwkJfSwKKworCQlpbnRlcnNlY3RzU3BoZXJlOiBmdW5j
dGlvbiAoIHNwaGVyZSApIHsKKworCQkJdmFyIHJhZGl1c1N1bSA9IHRoaXMucmFkaXVzICsgc3Bo
ZXJlLnJhZGl1czsKKworCQkJcmV0dXJuIHNwaGVyZS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQo
IHRoaXMuY2VudGVyICkgPD0gKCByYWRpdXNTdW0gKiByYWRpdXNTdW0gKTsKKworCQl9LAorCisJ
CWludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkgeworCisJCQlyZXR1cm4gYm94LmludGVy
c2VjdHNTcGhlcmUoIHRoaXMgKTsKKworCQl9LAorCisJCWludGVyc2VjdHNQbGFuZTogZnVuY3Rp
b24gKCBwbGFuZSApIHsKKworCQkJLy8gV2UgdXNlIHRoZSBmb2xsb3dpbmcgZXF1YXRpb24gdG8g
Y29tcHV0ZSB0aGUgc2lnbmVkIGRpc3RhbmNlIGZyb20KKwkJCS8vIHRoZSBjZW50ZXIgb2YgdGhl
IHNwaGVyZSB0byB0aGUgcGxhbmUuCisJCQkvLworCQkJLy8gZGlzdGFuY2UgPSBxICogbiAtIGQK
KwkJCS8vCisJCQkvLyBJZiB0aGlzIGRpc3RhbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmFkaXVz
IG9mIHRoZSBzcGhlcmUsCisJCQkvLyB0aGVuIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi4KKwor
CQkJcmV0dXJuIE1hdGguYWJzKCB0aGlzLmNlbnRlci5kb3QoIHBsYW5lLm5vcm1hbCApIC0gcGxh
bmUuY29uc3RhbnQgKSA8PSB0aGlzLnJhZGl1czsKKworCQl9LAorCisJCWNsYW1wUG9pbnQ6IGZ1
bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQl2YXIgZGVsdGFMZW5ndGhT
cSA9IHRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApOworCisJCQl2YXIgcmVz
dWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKworCQkJcmVzdWx0LmNvcHko
IHBvaW50ICk7CisKKwkJCWlmICggZGVsdGFMZW5ndGhTcSA+ICggdGhpcy5yYWRpdXMgKiB0aGlz
LnJhZGl1cyApICkgeworCisJCQkJcmVzdWx0LnN1YiggdGhpcy5jZW50ZXIgKS5ub3JtYWxpemUo
KTsKKwkJCQlyZXN1bHQubXVsdGlwbHlTY2FsYXIoIHRoaXMucmFkaXVzICkuYWRkKCB0aGlzLmNl
bnRlciApOworCisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSwKKworCQlnZXRCb3Vu
ZGluZ0JveDogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJdmFyIGJveCA9IG9w
dGlvbmFsVGFyZ2V0IHx8IG5ldyBCb3gzKCk7CisKKwkJCWJveC5zZXQoIHRoaXMuY2VudGVyLCB0
aGlzLmNlbnRlciApOworCQkJYm94LmV4cGFuZEJ5U2NhbGFyKCB0aGlzLnJhZGl1cyApOworCisJ
CQlyZXR1cm4gYm94OworCisJCX0sCisKKwkJYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJp
eCApIHsKKworCQkJdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKKwkJCXRoaXMu
cmFkaXVzID0gdGhpcy5yYWRpdXMgKiBtYXRyaXguZ2V0TWF4U2NhbGVPbkF4aXMoKTsKKworCQkJ
cmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQl0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkg
eworCisJCQl0aGlzLmNlbnRlci5hZGQoIG9mZnNldCApOworCisJCQlyZXR1cm4gdGhpczsKKwor
CQl9LAorCisJCWVxdWFsczogZnVuY3Rpb24gKCBzcGhlcmUgKSB7CisKKwkJCXJldHVybiBzcGhl
cmUuY2VudGVyLmVxdWFscyggdGhpcy5jZW50ZXIgKSAmJiAoIHNwaGVyZS5yYWRpdXMgPT09IHRo
aXMucmFkaXVzICk7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVk
cSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8g
aHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKwkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0
cDovL2NsYXJhLmlvCisJICogQGF1dGhvciB0c2NodworCSAqLworCisJZnVuY3Rpb24gTWF0cml4
MygpIHsKKworCQl0aGlzLmVsZW1lbnRzID0gWworCisJCQkxLCAwLCAwLAorCQkJMCwgMSwgMCwK
KwkJCTAsIDAsIDEKKworCQldOworCisJCWlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7CisK
KwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9u
Z2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTsKKworCQl9CisKKwl9
CisKKwlPYmplY3QuYXNzaWduKCBNYXRyaXgzLnByb3RvdHlwZSwgeworCisJCWlzTWF0cml4Mzog
dHJ1ZSwKKworCQlzZXQ6IGZ1bmN0aW9uICggbjExLCBuMTIsIG4xMywgbjIxLCBuMjIsIG4yMywg
bjMxLCBuMzIsIG4zMyApIHsKKworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworCQkJdGVb
IDAgXSA9IG4xMTsgdGVbIDEgXSA9IG4yMTsgdGVbIDIgXSA9IG4zMTsKKwkJCXRlWyAzIF0gPSBu
MTI7IHRlWyA0IF0gPSBuMjI7IHRlWyA1IF0gPSBuMzI7CisJCQl0ZVsgNiBdID0gbjEzOyB0ZVsg
NyBdID0gbjIzOyB0ZVsgOCBdID0gbjMzOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJ
CWlkZW50aXR5OiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMuc2V0KAorCisJCQkJMSwgMCwgMCwK
KwkJCQkwLCAxLCAwLAorCQkJCTAsIDAsIDEKKworCQkJKTsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29u
c3RydWN0b3IoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTsKKworCQl9LAorCisJCWNvcHk6
IGZ1bmN0aW9uICggbSApIHsKKworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKwkJCXZhciBt
ZSA9IG0uZWxlbWVudHM7CisKKwkJCXRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEg
XTsgdGVbIDIgXSA9IG1lWyAyIF07CisJCQl0ZVsgMyBdID0gbWVbIDMgXTsgdGVbIDQgXSA9IG1l
WyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdOworCQkJdGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0g
PSBtZVsgNyBdOyB0ZVsgOCBdID0gbWVbIDggXTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQlzZXRGcm9tTWF0cml4NDogZnVuY3Rpb24gKCBtICkgeworCisJCQl2YXIgbWUgPSBtLmVs
ZW1lbnRzOworCisJCQl0aGlzLnNldCgKKworCQkJCW1lWyAwIF0sIG1lWyA0IF0sIG1lWyAgOCBd
LAorCQkJCW1lWyAxIF0sIG1lWyA1IF0sIG1lWyAgOSBdLAorCQkJCW1lWyAyIF0sIG1lWyA2IF0s
IG1lWyAxMCBdCisKKwkJCSk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJYXBwbHlU
b0J1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9y
MygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmli
dXRlICkgeworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwg
bDsgaSArKyApIHsKKworCQkJCQl2MS54ID0gYXR0cmlidXRlLmdldFgoIGkgKTsKKwkJCQkJdjEu
eSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7CisJCQkJCXYxLnogPSBhdHRyaWJ1dGUuZ2V0WiggaSAp
OworCisJCQkJCXYxLmFwcGx5TWF0cml4MyggdGhpcyApOworCisJCQkJCWF0dHJpYnV0ZS5zZXRY
WVooIGksIHYxLngsIHYxLnksIHYxLnogKTsKKworCQkJCX0KKworCQkJCXJldHVybiBhdHRyaWJ1
dGU7CisKKwkJCX07CisKKwkJfSgpLAorCisJCW11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7CisK
KwkJCXJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTsKKworCQl9LAorCisJ
CXByZW11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7CisKKwkJCXJldHVybiB0aGlzLm11bHRpcGx5
TWF0cmljZXMoIG0sIHRoaXMgKTsKKworCQl9LAorCisJCW11bHRpcGx5TWF0cmljZXM6IGZ1bmN0
aW9uICggYSwgYiApIHsKKworCQkJdmFyIGFlID0gYS5lbGVtZW50czsKKwkJCXZhciBiZSA9IGIu
ZWxlbWVudHM7CisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworCisJCQl2YXIgYTExID0gYWVb
IDAgXSwgYTEyID0gYWVbIDMgXSwgYTEzID0gYWVbIDYgXTsKKwkJCXZhciBhMjEgPSBhZVsgMSBd
LCBhMjIgPSBhZVsgNCBdLCBhMjMgPSBhZVsgNyBdOworCQkJdmFyIGEzMSA9IGFlWyAyIF0sIGEz
MiA9IGFlWyA1IF0sIGEzMyA9IGFlWyA4IF07CisKKwkJCXZhciBiMTEgPSBiZVsgMCBdLCBiMTIg
PSBiZVsgMyBdLCBiMTMgPSBiZVsgNiBdOworCQkJdmFyIGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJl
WyA0IF0sIGIyMyA9IGJlWyA3IF07CisJCQl2YXIgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDUg
XSwgYjMzID0gYmVbIDggXTsKKworCQkJdGVbIDAgXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSAr
IGExMyAqIGIzMTsKKwkJCXRlWyAzIF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBi
MzI7CisJCQl0ZVsgNiBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzOworCisJ
CQl0ZVsgMSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMxOworCQkJdGVbIDQg
XSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMjsKKwkJCXRlWyA3IF0gPSBhMjEg
KiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzM7CisKKwkJCXRlWyAyIF0gPSBhMzEgKiBiMTEg
KyBhMzIgKiBiMjEgKyBhMzMgKiBiMzE7CisJCQl0ZVsgNSBdID0gYTMxICogYjEyICsgYTMyICog
YjIyICsgYTMzICogYjMyOworCQkJdGVbIDggXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEz
MyAqIGIzMzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQltdWx0aXBseVNjYWxhcjog
ZnVuY3Rpb24gKCBzICkgeworCisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworCisJCQl0ZVsg
MCBdICo9IHM7IHRlWyAzIF0gKj0gczsgdGVbIDYgXSAqPSBzOworCQkJdGVbIDEgXSAqPSBzOyB0
ZVsgNCBdICo9IHM7IHRlWyA3IF0gKj0gczsKKwkJCXRlWyAyIF0gKj0gczsgdGVbIDUgXSAqPSBz
OyB0ZVsgOCBdICo9IHM7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZGV0ZXJtaW5h
bnQ6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworCQkJdmFy
IGEgPSB0ZVsgMCBdLCBiID0gdGVbIDEgXSwgYyA9IHRlWyAyIF0sCisJCQkJZCA9IHRlWyAzIF0s
IGUgPSB0ZVsgNCBdLCBmID0gdGVbIDUgXSwKKwkJCQlnID0gdGVbIDYgXSwgaCA9IHRlWyA3IF0s
IGkgPSB0ZVsgOCBdOworCisJCQlyZXR1cm4gYSAqIGUgKiBpIC0gYSAqIGYgKiBoIC0gYiAqIGQg
KiBpICsgYiAqIGYgKiBnICsgYyAqIGQgKiBoIC0gYyAqIGUgKiBnOworCisJCX0sCisKKwkJZ2V0
SW52ZXJzZTogZnVuY3Rpb24gKCBtYXRyaXgsIHRocm93T25EZWdlbmVyYXRlICkgeworCisJCQlp
ZiAoIG1hdHJpeCAmJiBtYXRyaXguaXNNYXRyaXg0ICkgeworCisJCQkJY29uc29sZS5lcnJvcigg
IlRIUkVFLk1hdHJpeDMuZ2V0SW52ZXJzZSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3Vt
ZW50LiIgKTsKKworCQkJfQorCisJCQl2YXIgbWUgPSBtYXRyaXguZWxlbWVudHMsCisJCQkJdGUg
PSB0aGlzLmVsZW1lbnRzLAorCisJCQkJbjExID0gbWVbIDAgXSwgbjIxID0gbWVbIDEgXSwgbjMx
ID0gbWVbIDIgXSwKKwkJCQluMTIgPSBtZVsgMyBdLCBuMjIgPSBtZVsgNCBdLCBuMzIgPSBtZVsg
NSBdLAorCQkJCW4xMyA9IG1lWyA2IF0sIG4yMyA9IG1lWyA3IF0sIG4zMyA9IG1lWyA4IF0sCisK
KwkJCQl0MTEgPSBuMzMgKiBuMjIgLSBuMzIgKiBuMjMsCisJCQkJdDEyID0gbjMyICogbjEzIC0g
bjMzICogbjEyLAorCQkJCXQxMyA9IG4yMyAqIG4xMiAtIG4yMiAqIG4xMywKKworCQkJCWRldCA9
IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMzsKKworCQkJaWYgKCBkZXQgPT09IDAg
KSB7CisKKwkJCQl2YXIgbXNnID0gIlRIUkVFLk1hdHJpeDMuZ2V0SW52ZXJzZSgpOiBjYW4ndCBp
bnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIjsKKworCQkJCWlmICggdGhyb3dPbkRlZ2Vu
ZXJhdGUgPT09IHRydWUgKSB7CisKKwkJCQkJdGhyb3cgbmV3IEVycm9yKCBtc2cgKTsKKworCQkJ
CX0gZWxzZSB7CisKKwkJCQkJY29uc29sZS53YXJuKCBtc2cgKTsKKworCQkJCX0KKworCQkJCXJl
dHVybiB0aGlzLmlkZW50aXR5KCk7CisKKwkJCX0KKworCQkJdmFyIGRldEludiA9IDEgLyBkZXQ7
CisKKwkJCXRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7CisJCQl0ZVsgMSBdID0gKCBuMzEgKiBuMjMg
LSBuMzMgKiBuMjEgKSAqIGRldEludjsKKwkJCXRlWyAyIF0gPSAoIG4zMiAqIG4yMSAtIG4zMSAq
IG4yMiApICogZGV0SW52OworCisJCQl0ZVsgMyBdID0gdDEyICogZGV0SW52OworCQkJdGVbIDQg
XSA9ICggbjMzICogbjExIC0gbjMxICogbjEzICkgKiBkZXRJbnY7CisJCQl0ZVsgNSBdID0gKCBu
MzEgKiBuMTIgLSBuMzIgKiBuMTEgKSAqIGRldEludjsKKworCQkJdGVbIDYgXSA9IHQxMyAqIGRl
dEludjsKKwkJCXRlWyA3IF0gPSAoIG4yMSAqIG4xMyAtIG4yMyAqIG4xMSApICogZGV0SW52Owor
CQkJdGVbIDggXSA9ICggbjIyICogbjExIC0gbjIxICogbjEyICkgKiBkZXRJbnY7CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJdHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZh
ciB0bXAsIG0gPSB0aGlzLmVsZW1lbnRzOworCisJCQl0bXAgPSBtWyAxIF07IG1bIDEgXSA9IG1b
IDMgXTsgbVsgMyBdID0gdG1wOworCQkJdG1wID0gbVsgMiBdOyBtWyAyIF0gPSBtWyA2IF07IG1b
IDYgXSA9IHRtcDsKKwkJCXRtcCA9IG1bIDUgXTsgbVsgNSBdID0gbVsgNyBdOyBtWyA3IF0gPSB0
bXA7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZ2V0Tm9ybWFsTWF0cml4OiBmdW5j
dGlvbiAoIG1hdHJpeDQgKSB7CisKKwkJCXJldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KCBtYXRy
aXg0ICkuZ2V0SW52ZXJzZSggdGhpcyApLnRyYW5zcG9zZSgpOworCisJCX0sCisKKwkJdHJhbnNw
b3NlSW50b0FycmF5OiBmdW5jdGlvbiAoIHIgKSB7CisKKwkJCXZhciBtID0gdGhpcy5lbGVtZW50
czsKKworCQkJclsgMCBdID0gbVsgMCBdOworCQkJclsgMSBdID0gbVsgMyBdOworCQkJclsgMiBd
ID0gbVsgNiBdOworCQkJclsgMyBdID0gbVsgMSBdOworCQkJclsgNCBdID0gbVsgNCBdOworCQkJ
clsgNSBdID0gbVsgNyBdOworCQkJclsgNiBdID0gbVsgMiBdOworCQkJclsgNyBdID0gbVsgNSBd
OworCQkJclsgOCBdID0gbVsgOCBdOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWVx
dWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7CisKKwkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7
CisJCQl2YXIgbWUgPSBtYXRyaXguZWxlbWVudHM7CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8
IDk7IGkgKysgKSB7CisKKwkJCQlpZiAoIHRlWyBpIF0gIT09IG1lWyBpIF0gKSByZXR1cm4gZmFs
c2U7CisKKwkJCX0KKworCQkJcmV0dXJuIHRydWU7CisKKwkJfSwKKworCQlmcm9tQXJyYXk6IGZ1
bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKKworCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5l
ZCApIG9mZnNldCA9IDA7CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7CisK
KwkJCQl0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdOworCisJCQl9CisK
KwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwg
b2Zmc2V0ICkgeworCisJCQlpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOwor
CQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CisKKwkJCXZhciB0ZSA9
IHRoaXMuZWxlbWVudHM7CisKKwkJCWFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07CisJCQlhcnJh
eVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTsKKwkJCWFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsg
MiBdOworCisJCQlhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTsKKwkJCWFycmF5WyBvZmZz
ZXQgKyA0IF0gPSB0ZVsgNCBdOworCQkJYXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07CisK
KwkJCWFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdOworCQkJYXJyYXlbIG9mZnNldCArIDcg
XSA9IHRlWyA3IF07CisJCQlhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTsKKworCQkJcmV0
dXJuIGFycmF5OworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgYmhvdXN0b24g
LyBodHRwOi8vY2xhcmEuaW8KKwkgKi8KKworCWZ1bmN0aW9uIFBsYW5lKCBub3JtYWwsIGNvbnN0
YW50ICkgeworCisJCXRoaXMubm9ybWFsID0gKCBub3JtYWwgIT09IHVuZGVmaW5lZCApID8gbm9y
bWFsIDogbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTsKKwkJdGhpcy5jb25zdGFudCA9ICggY29uc3Rh
bnQgIT09IHVuZGVmaW5lZCApID8gY29uc3RhbnQgOiAwOworCisJfQorCisJT2JqZWN0LmFzc2ln
biggUGxhbmUucHJvdG90eXBlLCB7CisKKwkJc2V0OiBmdW5jdGlvbiAoIG5vcm1hbCwgY29uc3Rh
bnQgKSB7CisKKwkJCXRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApOworCQkJdGhpcy5jb25zdGFu
dCA9IGNvbnN0YW50OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldENvbXBvbmVu
dHM6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHsKKworCQkJdGhpcy5ub3JtYWwuc2V0KCB4LCB5
LCB6ICk7CisJCQl0aGlzLmNvbnN0YW50ID0gdzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQlzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludDogZnVuY3Rpb24gKCBub3JtYWwsIHBv
aW50ICkgeworCisJCQl0aGlzLm5vcm1hbC5jb3B5KCBub3JtYWwgKTsKKwkJCXRoaXMuY29uc3Rh
bnQgPSAtIHBvaW50LmRvdCggdGhpcy5ub3JtYWwgKTsJLy8gbXVzdCBiZSB0aGlzLm5vcm1hbCwg
bm90IG5vcm1hbCwgYXMgdGhpcy5ub3JtYWwgaXMgbm9ybWFsaXplZAorCisJCQlyZXR1cm4gdGhp
czsKKworCQl9LAorCisJCXNldEZyb21Db3BsYW5hclBvaW50czogZnVuY3Rpb24gKCkgeworCisJ
CQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIHYyID0gbmV3IFZlY3RvcjMoKTsKKwor
CQkJcmV0dXJuIGZ1bmN0aW9uIHNldEZyb21Db3BsYW5hclBvaW50cyggYSwgYiwgYyApIHsKKwor
CQkJCXZhciBub3JtYWwgPSB2MS5zdWJWZWN0b3JzKCBjLCBiICkuY3Jvc3MoIHYyLnN1YlZlY3Rv
cnMoIGEsIGIgKSApLm5vcm1hbGl6ZSgpOworCisJCQkJLy8gUTogc2hvdWxkIGFuIGVycm9yIGJl
IHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT8KKworCQkJ
CXRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoIG5vcm1hbCwgYSApOworCisJCQkJ
cmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7
CisKKwkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKworCQl9
LAorCisJCWNvcHk6IGZ1bmN0aW9uICggcGxhbmUgKSB7CisKKwkJCXRoaXMubm9ybWFsLmNvcHko
IHBsYW5lLm5vcm1hbCApOworCQkJdGhpcy5jb25zdGFudCA9IHBsYW5lLmNvbnN0YW50OworCisJ
CQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCW5vcm1hbGl6ZTogZnVuY3Rpb24gKCkgeworCisJ
CQkvLyBOb3RlOiB3aWxsIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgcGxhbmUgaXMg
aW52YWxpZC4KKworCQkJdmFyIGludmVyc2VOb3JtYWxMZW5ndGggPSAxLjAgLyB0aGlzLm5vcm1h
bC5sZW5ndGgoKTsKKwkJCXRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKCBpbnZlcnNlTm9ybWFs
TGVuZ3RoICk7CisJCQl0aGlzLmNvbnN0YW50ICo9IGludmVyc2VOb3JtYWxMZW5ndGg7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbmVnYXRlOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRo
aXMuY29uc3RhbnQgKj0gLSAxOworCQkJdGhpcy5ub3JtYWwubmVnYXRlKCk7CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0sCisKKwkJZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkg
eworCisJCQlyZXR1cm4gdGhpcy5ub3JtYWwuZG90KCBwb2ludCApICsgdGhpcy5jb25zdGFudDsK
KworCQl9LAorCisJCWRpc3RhbmNlVG9TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkgeworCisJ
CQlyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSAtIHNwaGVyZS5y
YWRpdXM7CisKKwkJfSwKKworCQlwcm9qZWN0UG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlv
bmFsVGFyZ2V0ICkgeworCisJCQlyZXR1cm4gdGhpcy5vcnRob1BvaW50KCBwb2ludCwgb3B0aW9u
YWxUYXJnZXQgKS5zdWIoIHBvaW50ICkubmVnYXRlKCk7CisKKwkJfSwKKworCQlvcnRob1BvaW50
OiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJdmFyIHBlcnBlbmRp
Y3VsYXJNYWduaXR1ZGUgPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKTsKKworCQkJdmFy
IHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisJCQlyZXR1cm4gcmVz
dWx0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIHBlcnBlbmRpY3VsYXJNYWdu
aXR1ZGUgKTsKKworCQl9LAorCisJCWludGVyc2VjdExpbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJ
dmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdExp
bmUoIGxpbmUsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFs
VGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisKKwkJCQl2YXIgZGlyZWN0aW9uID0gbGluZS5kZWx0
YSggdjEgKTsKKworCQkJCXZhciBkZW5vbWluYXRvciA9IHRoaXMubm9ybWFsLmRvdCggZGlyZWN0
aW9uICk7CisKKwkJCQlpZiAoIGRlbm9taW5hdG9yID09PSAwICkgeworCisJCQkJCS8vIGxpbmUg
aXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW4KKwkJCQkJaWYgKCB0aGlzLmRpc3RhbmNlVG9Qb2lu
dCggbGluZS5zdGFydCApID09PSAwICkgeworCisJCQkJCQlyZXR1cm4gcmVzdWx0LmNvcHkoIGxp
bmUuc3RhcnQgKTsKKworCQkJCQl9CisKKwkJCQkJLy8gVW5zdXJlIGlmIHRoaXMgaXMgdGhlIGNv
cnJlY3QgbWV0aG9kIHRvIGhhbmRsZSB0aGlzIGNhc2UuCisJCQkJCXJldHVybiB1bmRlZmluZWQ7
CisKKwkJCQl9CisKKwkJCQl2YXIgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwg
KSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yOworCisJCQkJaWYgKCB0IDwgMCB8fCB0
ID4gMSApIHsKKworCQkJCQlyZXR1cm4gdW5kZWZpbmVkOworCisJCQkJfQorCisJCQkJcmV0dXJu
IHJlc3VsdC5jb3B5KCBkaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggbGluZS5z
dGFydCApOworCisJCQl9OworCisJCX0oKSwKKworCQlpbnRlcnNlY3RzTGluZTogZnVuY3Rpb24g
KCBsaW5lICkgeworCisJCQkvLyBOb3RlOiB0aGlzIHRlc3RzIGlmIGEgbGluZSBpbnRlcnNlY3Rz
IHRoZSBwbGFuZSwgbm90IHdoZXRoZXIgaXQgKG9yIGl0cyBlbmQtcG9pbnRzKSBhcmUgY29wbGFu
YXIgd2l0aCBpdC4KKworCQkJdmFyIHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBs
aW5lLnN0YXJ0ICk7CisJCQl2YXIgZW5kU2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5l
LmVuZCApOworCisJCQlyZXR1cm4gKCBzdGFydFNpZ24gPCAwICYmIGVuZFNpZ24gPiAwICkgfHwg
KCBlbmRTaWduIDwgMCAmJiBzdGFydFNpZ24gPiAwICk7CisKKwkJfSwKKworCQlpbnRlcnNlY3Rz
Qm94OiBmdW5jdGlvbiAoIGJveCApIHsKKworCQkJcmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUo
IHRoaXMgKTsKKworCQl9LAorCisJCWludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJl
ICkgeworCisJCQlyZXR1cm4gc3BoZXJlLmludGVyc2VjdHNQbGFuZSggdGhpcyApOworCisJCX0s
CisKKwkJY29wbGFuYXJQb2ludDogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJ
dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisJCQlyZXR1cm4g
cmVzdWx0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFu
dCApOworCisJCX0sCisKKwkJYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2
MSA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgbTEgPSBuZXcgTWF0cml4MygpOworCisJCQlyZXR1
cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXgsIG9wdGlvbmFsTm9ybWFsTWF0cml4ICkg
eworCisJCQkJdmFyIHJlZmVyZW5jZVBvaW50ID0gdGhpcy5jb3BsYW5hclBvaW50KCB2MSApLmFw
cGx5TWF0cml4NCggbWF0cml4ICk7CisKKwkJCQkvLyB0cmFuc2Zvcm0gbm9ybWFsIGJhc2VkIG9u
IHRoZW9yeSBoZXJlOgorCQkJCS8vIGh0dHA6Ly93d3cuc29uZ2hvLmNhL29wZW5nbC9nbF9ub3Jt
YWx0cmFuc2Zvcm0uaHRtbAorCQkJCXZhciBub3JtYWxNYXRyaXggPSBvcHRpb25hbE5vcm1hbE1h
dHJpeCB8fCBtMS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApOworCQkJCXZhciBub3JtYWwgPSB0
aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOworCisJ
CQkJLy8gcmVjYWxjdWxhdGUgY29uc3RhbnQgKGxpa2UgaW4gc2V0RnJvbU5vcm1hbEFuZENvcGxh
bmFyUG9pbnQpCisJCQkJdGhpcy5jb25zdGFudCA9IC0gcmVmZXJlbmNlUG9pbnQuZG90KCBub3Jt
YWwgKTsKKworCQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKworCQl0cmFuc2xh
dGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkgeworCisJCQl0aGlzLmNvbnN0YW50ID0gdGhpcy5jb25z
dGFudCAtIG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7CisKKwkJCXJldHVybiB0aGlzOworCisJ
CX0sCisKKwkJZXF1YWxzOiBmdW5jdGlvbiAoIHBsYW5lICkgeworCisJCQlyZXR1cm4gcGxhbmUu
bm9ybWFsLmVxdWFscyggdGhpcy5ub3JtYWwgKSAmJiAoIHBsYW5lLmNvbnN0YW50ID09PSB0aGlz
LmNvbnN0YW50ICk7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2Ig
LyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVy
ZWRxdWFsaWEuY29tLworCSAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KKwkg
Ki8KKworCWZ1bmN0aW9uIEZydXN0dW0oIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7CisKKwkJ
dGhpcy5wbGFuZXMgPSBbCisKKwkJCSggcDAgIT09IHVuZGVmaW5lZCApID8gcDAgOiBuZXcgUGxh
bmUoKSwKKwkJCSggcDEgIT09IHVuZGVmaW5lZCApID8gcDEgOiBuZXcgUGxhbmUoKSwKKwkJCSgg
cDIgIT09IHVuZGVmaW5lZCApID8gcDIgOiBuZXcgUGxhbmUoKSwKKwkJCSggcDMgIT09IHVuZGVm
aW5lZCApID8gcDMgOiBuZXcgUGxhbmUoKSwKKwkJCSggcDQgIT09IHVuZGVmaW5lZCApID8gcDQg
OiBuZXcgUGxhbmUoKSwKKwkJCSggcDUgIT09IHVuZGVmaW5lZCApID8gcDUgOiBuZXcgUGxhbmUo
KQorCisJCV07CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBGcnVzdHVtLnByb3RvdHlwZSwgewor
CisJCXNldDogZnVuY3Rpb24gKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkgeworCisJCQl2YXIg
cGxhbmVzID0gdGhpcy5wbGFuZXM7CisKKwkJCXBsYW5lc1sgMCBdLmNvcHkoIHAwICk7CisJCQlw
bGFuZXNbIDEgXS5jb3B5KCBwMSApOworCQkJcGxhbmVzWyAyIF0uY29weSggcDIgKTsKKwkJCXBs
YW5lc1sgMyBdLmNvcHkoIHAzICk7CisJCQlwbGFuZXNbIDQgXS5jb3B5KCBwNCApOworCQkJcGxh
bmVzWyA1IF0uY29weSggcDUgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljbG9u
ZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5
KCB0aGlzICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIGZydXN0dW0gKSB7CisKKwkJ
CXZhciBwbGFuZXMgPSB0aGlzLnBsYW5lczsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgNjsg
aSArKyApIHsKKworCQkJCXBsYW5lc1sgaSBdLmNvcHkoIGZydXN0dW0ucGxhbmVzWyBpIF0gKTsK
KworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldEZyb21NYXRyaXg6IGZ1
bmN0aW9uICggbSApIHsKKworCQkJdmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzOworCQkJdmFyIG1l
ID0gbS5lbGVtZW50czsKKwkJCXZhciBtZTAgPSBtZVsgMCBdLCBtZTEgPSBtZVsgMSBdLCBtZTIg
PSBtZVsgMiBdLCBtZTMgPSBtZVsgMyBdOworCQkJdmFyIG1lNCA9IG1lWyA0IF0sIG1lNSA9IG1l
WyA1IF0sIG1lNiA9IG1lWyA2IF0sIG1lNyA9IG1lWyA3IF07CisJCQl2YXIgbWU4ID0gbWVbIDgg
XSwgbWU5ID0gbWVbIDkgXSwgbWUxMCA9IG1lWyAxMCBdLCBtZTExID0gbWVbIDExIF07CisJCQl2
YXIgbWUxMiA9IG1lWyAxMiBdLCBtZTEzID0gbWVbIDEzIF0sIG1lMTQgPSBtZVsgMTQgXSwgbWUx
NSA9IG1lWyAxNSBdOworCisJCQlwbGFuZXNbIDAgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTAs
IG1lNyAtIG1lNCwgbWUxMSAtIG1lOCwgbWUxNSAtIG1lMTIgKS5ub3JtYWxpemUoKTsKKwkJCXBs
YW5lc1sgMSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMCwgbWU3ICsgbWU0LCBtZTExICsgbWU4
LCBtZTE1ICsgbWUxMiApLm5vcm1hbGl6ZSgpOworCQkJcGxhbmVzWyAyIF0uc2V0Q29tcG9uZW50
cyggbWUzICsgbWUxLCBtZTcgKyBtZTUsIG1lMTEgKyBtZTksIG1lMTUgKyBtZTEzICkubm9ybWFs
aXplKCk7CisJCQlwbGFuZXNbIDMgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTEsIG1lNyAtIG1l
NSwgbWUxMSAtIG1lOSwgbWUxNSAtIG1lMTMgKS5ub3JtYWxpemUoKTsKKwkJCXBsYW5lc1sgNCBd
LnNldENvbXBvbmVudHMoIG1lMyAtIG1lMiwgbWU3IC0gbWU2LCBtZTExIC0gbWUxMCwgbWUxNSAt
IG1lMTQgKS5ub3JtYWxpemUoKTsKKwkJCXBsYW5lc1sgNSBdLnNldENvbXBvbmVudHMoIG1lMyAr
IG1lMiwgbWU3ICsgbWU2LCBtZTExICsgbWUxMCwgbWUxNSArIG1lMTQgKS5ub3JtYWxpemUoKTsK
KworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlpbnRlcnNlY3RzT2JqZWN0OiBmdW5jdGlv
biAoKSB7CisKKwkJCXZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7CisKKwkJCXJldHVybiBmdW5j
dGlvbiBpbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSB7CisKKwkJCQl2YXIgZ2VvbWV0cnkgPSBv
YmplY3QuZ2VvbWV0cnk7CisKKwkJCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBu
dWxsICkKKwkJCQkJZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CisKKwkJCQlzcGhl
cmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKQorCQkJCQkuYXBwbHlNYXRyaXg0KCBv
YmplY3QubWF0cml4V29ybGQgKTsKKworCQkJCXJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUo
IHNwaGVyZSApOworCisJCQl9OworCisJCX0oKSwKKworCQlpbnRlcnNlY3RzU3ByaXRlOiBmdW5j
dGlvbiAoKSB7CisKKwkJCXZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7CisKKwkJCXJldHVybiBm
dW5jdGlvbiBpbnRlcnNlY3RzU3ByaXRlKCBzcHJpdGUgKSB7CisKKwkJCQlzcGhlcmUuY2VudGVy
LnNldCggMCwgMCwgMCApOworCQkJCXNwaGVyZS5yYWRpdXMgPSAwLjcwNzEwNjc4MTE4NjU0NzY7
CisJCQkJc3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7CisKKwkJCQly
ZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTsKKworCQkJfTsKKworCQl9KCks
CisKKwkJaW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7CisKKwkJCXZhciBw
bGFuZXMgPSB0aGlzLnBsYW5lczsKKwkJCXZhciBjZW50ZXIgPSBzcGhlcmUuY2VudGVyOworCQkJ
dmFyIG5lZ1JhZGl1cyA9IC0gc3BoZXJlLnJhZGl1czsKKworCQkJZm9yICggdmFyIGkgPSAwOyBp
IDwgNjsgaSArKyApIHsKKworCQkJCXZhciBkaXN0YW5jZSA9IHBsYW5lc1sgaSBdLmRpc3RhbmNl
VG9Qb2ludCggY2VudGVyICk7CisKKwkJCQlpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkgewor
CisJCQkJCXJldHVybiBmYWxzZTsKKworCQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsK
KworCQl9LAorCisJCWludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHAxID0g
bmV3IFZlY3RvcjMoKSwKKwkJCQlwMiA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJldHVybiBmdW5j
dGlvbiBpbnRlcnNlY3RzQm94KCBib3ggKSB7CisKKwkJCQl2YXIgcGxhbmVzID0gdGhpcy5wbGFu
ZXM7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgeworCisJCQkJCXZhciBw
bGFuZSA9IHBsYW5lc1sgaSBdOworCisJCQkJCXAxLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBi
b3gubWluLnggOiBib3gubWF4Lng7CisJCQkJCXAyLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBi
b3gubWF4LnggOiBib3gubWluLng7CisJCQkJCXAxLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBi
b3gubWluLnkgOiBib3gubWF4Lnk7CisJCQkJCXAyLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBi
b3gubWF4LnkgOiBib3gubWluLnk7CisJCQkJCXAxLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBi
b3gubWluLnogOiBib3gubWF4Lno7CisJCQkJCXAyLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBi
b3gubWF4LnogOiBib3gubWluLno7CisKKwkJCQkJdmFyIGQxID0gcGxhbmUuZGlzdGFuY2VUb1Bv
aW50KCBwMSApOworCQkJCQl2YXIgZDIgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHAyICk7CisK
KwkJCQkJLy8gaWYgYm90aCBvdXRzaWRlIHBsYW5lLCBubyBpbnRlcnNlY3Rpb24KKworCQkJCQlp
ZiAoIGQxIDwgMCAmJiBkMiA8IDAgKSB7CisKKwkJCQkJCXJldHVybiBmYWxzZTsKKworCQkJCQl9
CisKKwkJCQl9CisKKwkJCQlyZXR1cm4gdHJ1ZTsKKworCQkJfTsKKworCQl9KCksCisKKwkJY29u
dGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKKworCQkJdmFyIHBsYW5lcyA9IHRoaXMu
cGxhbmVzOworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgeworCisJCQkJaWYg
KCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgPCAwICkgeworCisJCQkJCXJl
dHVybiBmYWxzZTsKKworCQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKworCQl9CisK
Kwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFs
aWEuY29tLworCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisK
KwlmdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggX3JlbmRlcmVyLCBfbGlnaHRzLCBfb2JqZWN0cywg
Y2FwYWJpbGl0aWVzICkgeworCisJCXZhciBfZ2wgPSBfcmVuZGVyZXIuY29udGV4dCwKKwkJCV9z
dGF0ZSA9IF9yZW5kZXJlci5zdGF0ZSwKKwkJCV9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSwKKwkJ
CV9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSwKKworCQkJX2xpZ2h0U2hhZG93cyA9
IF9saWdodHMuc2hhZG93cywKKworCQkJX3NoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMigpLAor
CQkJX21heFNoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMiggY2FwYWJpbGl0aWVzLm1heFRleHR1
cmVTaXplLCBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUgKSwKKworCQkJX2xvb2tUYXJnZXQg
PSBuZXcgVmVjdG9yMygpLAorCQkJX2xpZ2h0UG9zaXRpb25Xb3JsZCA9IG5ldyBWZWN0b3IzKCks
CisKKwkJCV9Nb3JwaGluZ0ZsYWcgPSAxLAorCQkJX1NraW5uaW5nRmxhZyA9IDIsCisKKwkJCV9O
dW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgPSAoIF9Nb3JwaGluZ0ZsYWcgfCBfU2tpbm5pbmdGbGFn
ICkgKyAxLAorCisJCQlfZGVwdGhNYXRlcmlhbHMgPSBuZXcgQXJyYXkoIF9OdW1iZXJPZk1hdGVy
aWFsVmFyaWFudHMgKSwKKwkJCV9kaXN0YW5jZU1hdGVyaWFscyA9IG5ldyBBcnJheSggX051bWJl
ck9mTWF0ZXJpYWxWYXJpYW50cyApLAorCisJCQlfbWF0ZXJpYWxDYWNoZSA9IHt9OworCisJCXZh
ciBjdWJlRGlyZWN0aW9ucyA9IFsKKwkJCW5ldyBWZWN0b3IzKCAxLCAwLCAwICksIG5ldyBWZWN0
b3IzKCAtIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSwKKwkJCW5ldyBWZWN0b3Iz
KCAwLCAwLCAtIDEgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIC0g
MSwgMCApCisJCV07CisKKwkJdmFyIGN1YmVVcHMgPSBbCisJCQluZXcgVmVjdG9yMyggMCwgMSwg
MCApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLAorCQkJ
bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSwJbmV3IFZlY3Rv
cjMoIDAsIDAsIC0gMSApCisJCV07CisKKwkJdmFyIGN1YmUyRFZpZXdQb3J0cyA9IFsKKwkJCW5l
dyBWZWN0b3I0KCksIG5ldyBWZWN0b3I0KCksIG5ldyBWZWN0b3I0KCksCisJCQluZXcgVmVjdG9y
NCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpCisJCV07CisKKwkJLy8gaW5pdAorCisJ
CXZhciBkZXB0aE1hdGVyaWFsVGVtcGxhdGUgPSBuZXcgTWVzaERlcHRoTWF0ZXJpYWwoKTsKKwkJ
ZGVwdGhNYXRlcmlhbFRlbXBsYXRlLmRlcHRoUGFja2luZyA9IFJHQkFEZXB0aFBhY2tpbmc7CisJ
CWRlcHRoTWF0ZXJpYWxUZW1wbGF0ZS5jbGlwcGluZyA9IHRydWU7CisKKwkJdmFyIGRpc3RhbmNl
U2hhZGVyID0gU2hhZGVyTGliWyAiZGlzdGFuY2VSR0JBIiBdOworCQl2YXIgZGlzdGFuY2VVbmlm
b3JtcyA9IFVuaWZvcm1zVXRpbHMuY2xvbmUoIGRpc3RhbmNlU2hhZGVyLnVuaWZvcm1zICk7CisK
KwkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzOyArKyBp
ICkgeworCisJCQl2YXIgdXNlTW9ycGhpbmcgPSAoIGkgJiBfTW9ycGhpbmdGbGFnICkgIT09IDA7
CisJCQl2YXIgdXNlU2tpbm5pbmcgPSAoIGkgJiBfU2tpbm5pbmdGbGFnICkgIT09IDA7CisKKwkJ
CXZhciBkZXB0aE1hdGVyaWFsID0gZGVwdGhNYXRlcmlhbFRlbXBsYXRlLmNsb25lKCk7CisJCQlk
ZXB0aE1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9IHVzZU1vcnBoaW5nOworCQkJZGVwdGhNYXRlcmlh
bC5za2lubmluZyA9IHVzZVNraW5uaW5nOworCisJCQlfZGVwdGhNYXRlcmlhbHNbIGkgXSA9IGRl
cHRoTWF0ZXJpYWw7CisKKwkJCXZhciBkaXN0YW5jZU1hdGVyaWFsID0gbmV3IFNoYWRlck1hdGVy
aWFsKCB7CisJCQkJZGVmaW5lczogeworCQkJCQknVVNFX1NIQURPV01BUCc6ICcnCisJCQkJfSwK
KwkJCQl1bmlmb3JtczogZGlzdGFuY2VVbmlmb3JtcywKKwkJCQl2ZXJ0ZXhTaGFkZXI6IGRpc3Rh
bmNlU2hhZGVyLnZlcnRleFNoYWRlciwKKwkJCQlmcmFnbWVudFNoYWRlcjogZGlzdGFuY2VTaGFk
ZXIuZnJhZ21lbnRTaGFkZXIsCisJCQkJbW9ycGhUYXJnZXRzOiB1c2VNb3JwaGluZywKKwkJCQlz
a2lubmluZzogdXNlU2tpbm5pbmcsCisJCQkJY2xpcHBpbmc6IHRydWUKKwkJCX0gKTsKKworCQkJ
X2Rpc3RhbmNlTWF0ZXJpYWxzWyBpIF0gPSBkaXN0YW5jZU1hdGVyaWFsOworCisJCX0KKworCQkv
LworCisJCXZhciBzY29wZSA9IHRoaXM7CisKKwkJdGhpcy5lbmFibGVkID0gZmFsc2U7CisKKwkJ
dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsKKwkJdGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlOworCisJ
CXRoaXMudHlwZSA9IFBDRlNoYWRvd01hcDsKKworCQl0aGlzLnJlbmRlclJldmVyc2VTaWRlZCA9
IHRydWU7CisJCXRoaXMucmVuZGVyU2luZ2xlU2lkZWQgPSB0cnVlOworCisJCXRoaXMucmVuZGVy
ID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhICkgeworCisJCQlpZiAoIHNjb3BlLmVuYWJsZWQg
PT09IGZhbHNlICkgcmV0dXJuOworCQkJaWYgKCBzY29wZS5hdXRvVXBkYXRlID09PSBmYWxzZSAm
JiBzY29wZS5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCWlmICggX2xpZ2h0
U2hhZG93cy5sZW5ndGggPT09IDAgKSByZXR1cm47CisKKwkJCS8vIFNldCBHTCBzdGF0ZSBmb3Ig
ZGVwdGggbWFwLgorCQkJX3N0YXRlLmRpc2FibGUoIF9nbC5CTEVORCApOworCQkJX3N0YXRlLmJ1
ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIDEsIDEsIDEsIDEgKTsKKwkJCV9zdGF0ZS5idWZmZXJzLmRl
cHRoLnNldFRlc3QoIHRydWUgKTsKKwkJCV9zdGF0ZS5zZXRTY2lzc29yVGVzdCggZmFsc2UgKTsK
KworCQkJLy8gcmVuZGVyIGRlcHRoIG1hcAorCisJCQl2YXIgZmFjZUNvdW50OworCisJCQlmb3Ig
KCB2YXIgaSA9IDAsIGlsID0gX2xpZ2h0U2hhZG93cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsK
KworCQkJCXZhciBsaWdodCA9IF9saWdodFNoYWRvd3NbIGkgXTsKKwkJCQl2YXIgc2hhZG93ID0g
bGlnaHQuc2hhZG93OworCQkJCXZhciBpc1BvaW50TGlnaHQgPSBsaWdodCAmJiBsaWdodC5pc1Bv
aW50TGlnaHQ7CisKKwkJCQlpZiAoIHNoYWRvdyA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCWNv
bnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOicsIGxpZ2h0LCAnaGFzIG5vIHNoYWRv
dy4nICk7CisJCQkJCWNvbnRpbnVlOworCisJCQkJfQorCisJCQkJdmFyIHNoYWRvd0NhbWVyYSA9
IHNoYWRvdy5jYW1lcmE7CisKKwkJCQlfc2hhZG93TWFwU2l6ZS5jb3B5KCBzaGFkb3cubWFwU2l6
ZSApOworCQkJCV9zaGFkb3dNYXBTaXplLm1pbiggX21heFNoYWRvd01hcFNpemUgKTsKKworCQkJ
CWlmICggaXNQb2ludExpZ2h0ICkgeworCisJCQkJCXZhciB2cFdpZHRoID0gX3NoYWRvd01hcFNp
emUueDsKKwkJCQkJdmFyIHZwSGVpZ2h0ID0gX3NoYWRvd01hcFNpemUueTsKKworCQkJCQkvLyBU
aGVzZSB2aWV3cG9ydHMgbWFwIGEgY3ViZS1tYXAgb250byBhIDJEIHRleHR1cmUgd2l0aCB0aGUK
KwkJCQkJLy8gZm9sbG93aW5nIG9yaWVudGF0aW9uOgorCQkJCQkvLworCQkJCQkvLyAgeHpYWgor
CQkJCQkvLyAgIHkgWQorCQkJCQkvLworCQkJCQkvLyBYIC0gUG9zaXRpdmUgeCBkaXJlY3Rpb24K
KwkJCQkJLy8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uCisJCQkJCS8vIFkgLSBQb3NpdGl2ZSB5
IGRpcmVjdGlvbgorCQkJCQkvLyB5IC0gTmVnYXRpdmUgeSBkaXJlY3Rpb24KKwkJCQkJLy8gWiAt
IFBvc2l0aXZlIHogZGlyZWN0aW9uCisJCQkJCS8vIHogLSBOZWdhdGl2ZSB6IGRpcmVjdGlvbgor
CisJCQkJCS8vIHBvc2l0aXZlIFgKKwkJCQkJY3ViZTJEVmlld1BvcnRzWyAwIF0uc2V0KCB2cFdp
ZHRoICogMiwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7CisJCQkJCS8vIG5lZ2F0aXZl
IFgKKwkJCQkJY3ViZTJEVmlld1BvcnRzWyAxIF0uc2V0KCAwLCB2cEhlaWdodCwgdnBXaWR0aCwg
dnBIZWlnaHQgKTsKKwkJCQkJLy8gcG9zaXRpdmUgWgorCQkJCQljdWJlMkRWaWV3UG9ydHNbIDIg
XS5zZXQoIHZwV2lkdGggKiAzLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTsKKwkJCQkJ
Ly8gbmVnYXRpdmUgWgorCQkJCQljdWJlMkRWaWV3UG9ydHNbIDMgXS5zZXQoIHZwV2lkdGgsIHZw
SGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApOworCQkJCQkvLyBwb3NpdGl2ZSBZCisJCQkJCWN1
YmUyRFZpZXdQb3J0c1sgNCBdLnNldCggdnBXaWR0aCAqIDMsIDAsIHZwV2lkdGgsIHZwSGVpZ2h0
ICk7CisJCQkJCS8vIG5lZ2F0aXZlIFkKKwkJCQkJY3ViZTJEVmlld1BvcnRzWyA1IF0uc2V0KCB2
cFdpZHRoLCAwLCB2cFdpZHRoLCB2cEhlaWdodCApOworCisJCQkJCV9zaGFkb3dNYXBTaXplLngg
Kj0gNC4wOworCQkJCQlfc2hhZG93TWFwU2l6ZS55ICo9IDIuMDsKKworCQkJCX0KKworCQkJCWlm
ICggc2hhZG93Lm1hcCA9PT0gbnVsbCApIHsKKworCQkJCQl2YXIgcGFycyA9IHsgbWluRmlsdGVy
OiBOZWFyZXN0RmlsdGVyLCBtYWdGaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsIGZvcm1hdDogUkdCQUZv
cm1hdCB9OworCisJCQkJCXNoYWRvdy5tYXAgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIF9zaGFk
b3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnksIHBhcnMgKTsKKwkJCQkJc2hhZG93Lm1hcC50
ZXh0dXJlLm5hbWUgPSBsaWdodC5uYW1lICsgIi5zaGFkb3dNYXAiOworCisJCQkJCXNoYWRvd0Nh
bWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CisKKwkJCQl9CisKKwkJCQlpZiAoIHNoYWRv
dy5pc1Nwb3RMaWdodFNoYWRvdyApIHsKKworCQkJCQlzaGFkb3cudXBkYXRlKCBsaWdodCApOwor
CisJCQkJfQorCisJCQkJdmFyIHNoYWRvd01hcCA9IHNoYWRvdy5tYXA7CisJCQkJdmFyIHNoYWRv
d01hdHJpeCA9IHNoYWRvdy5tYXRyaXg7CisKKwkJCQlfbGlnaHRQb3NpdGlvbldvcmxkLnNldEZy
b21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKKwkJCQlzaGFkb3dDYW1lcmEu
cG9zaXRpb24uY29weSggX2xpZ2h0UG9zaXRpb25Xb3JsZCApOworCisJCQkJaWYgKCBpc1BvaW50
TGlnaHQgKSB7CisKKwkJCQkJZmFjZUNvdW50ID0gNjsKKworCQkJCQkvLyBmb3IgcG9pbnQgbGln
aHRzIHdlIHNldCB0aGUgc2hhZG93IG1hdHJpeCB0byBiZSBhIHRyYW5zbGF0aW9uLW9ubHkgbWF0
cml4CisJCQkJCS8vIGVxdWFsIHRvIGludmVyc2Ugb2YgdGhlIGxpZ2h0J3MgcG9zaXRpb24KKwor
CQkJCQlzaGFkb3dNYXRyaXgubWFrZVRyYW5zbGF0aW9uKCAtIF9saWdodFBvc2l0aW9uV29ybGQu
eCwgLSBfbGlnaHRQb3NpdGlvbldvcmxkLnksIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC56ICk7CisK
KwkJCQl9IGVsc2UgeworCisJCQkJCWZhY2VDb3VudCA9IDE7CisKKwkJCQkJX2xvb2tUYXJnZXQu
c2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTsKKwkJCQkJ
c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTsKKwkJCQkJc2hhZG93Q2FtZXJhLnVw
ZGF0ZU1hdHJpeFdvcmxkKCk7CisKKwkJCQkJLy8gY29tcHV0ZSBzaGFkb3cgbWF0cml4CisKKwkJ
CQkJc2hhZG93TWF0cml4LnNldCgKKwkJCQkJCTAuNSwgMC4wLCAwLjAsIDAuNSwKKwkJCQkJCTAu
MCwgMC41LCAwLjAsIDAuNSwKKwkJCQkJCTAuMCwgMC4wLCAwLjUsIDAuNSwKKwkJCQkJCTAuMCwg
MC4wLCAwLjAsIDEuMAorCQkJCQkpOworCisJCQkJCXNoYWRvd01hdHJpeC5tdWx0aXBseSggc2hh
ZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTsKKwkJCQkJc2hhZG93TWF0cml4Lm11bHRpcGx5
KCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7CisKKwkJCQl9CisKKwkJCQlfcmVu
ZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3dNYXAgKTsKKwkJCQlfcmVuZGVyZXIuY2xlYXIo
KTsKKworCQkJCS8vIHJlbmRlciBzaGFkb3cgbWFwIGZvciBlYWNoIGN1YmUgZmFjZSAoaWYgb21u
aS1kaXJlY3Rpb25hbCkgb3IKKwkJCQkvLyBydW4gYSBzaW5nbGUgcGFzcyBpZiBub3QKKworCQkJ
CWZvciAoIHZhciBmYWNlID0gMDsgZmFjZSA8IGZhY2VDb3VudDsgZmFjZSArKyApIHsKKworCQkJ
CQlpZiAoIGlzUG9pbnRMaWdodCApIHsKKworCQkJCQkJX2xvb2tUYXJnZXQuY29weSggc2hhZG93
Q2FtZXJhLnBvc2l0aW9uICk7CisJCQkJCQlfbG9va1RhcmdldC5hZGQoIGN1YmVEaXJlY3Rpb25z
WyBmYWNlIF0gKTsKKwkJCQkJCXNoYWRvd0NhbWVyYS51cC5jb3B5KCBjdWJlVXBzWyBmYWNlIF0g
KTsKKwkJCQkJCXNoYWRvd0NhbWVyYS5sb29rQXQoIF9sb29rVGFyZ2V0ICk7CisJCQkJCQlzaGFk
b3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTsKKworCQkJCQkJdmFyIHZwRGltZW5zaW9ucyA9
IGN1YmUyRFZpZXdQb3J0c1sgZmFjZSBdOworCQkJCQkJX3N0YXRlLnZpZXdwb3J0KCB2cERpbWVu
c2lvbnMgKTsKKworCQkJCQl9CisKKwkJCQkJLy8gdXBkYXRlIGNhbWVyYSBtYXRyaWNlcyBhbmQg
ZnJ1c3R1bQorCisJCQkJCV9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNoYWRv
d0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNl
ICk7CisJCQkJCV9mcnVzdHVtLnNldEZyb21NYXRyaXgoIF9wcm9qU2NyZWVuTWF0cml4ICk7CisK
KwkJCQkJLy8gc2V0IG9iamVjdCBtYXRyaWNlcyAmIGZydXN0dW0gY3VsbGluZworCisJCQkJCXJl
bmRlck9iamVjdCggc2NlbmUsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKTsK
KworCQkJCX0KKworCQkJfQorCisJCQkvLyBSZXN0b3JlIEdMIHN0YXRlLgorCQkJdmFyIGNsZWFy
Q29sb3IgPSBfcmVuZGVyZXIuZ2V0Q2xlYXJDb2xvcigpOworCQkJdmFyIGNsZWFyQWxwaGEgPSBf
cmVuZGVyZXIuZ2V0Q2xlYXJBbHBoYSgpOworCQkJX3JlbmRlcmVyLnNldENsZWFyQ29sb3IoIGNs
ZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTsKKworCQkJc2NvcGUubmVlZHNVcGRhdGUgPSBmYWxzZTsK
KworCQl9OworCisJCWZ1bmN0aW9uIGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWws
IGlzUG9pbnRMaWdodCwgbGlnaHRQb3NpdGlvbldvcmxkICkgeworCisJCQl2YXIgZ2VvbWV0cnkg
PSBvYmplY3QuZ2VvbWV0cnk7CisKKwkJCXZhciByZXN1bHQgPSBudWxsOworCisJCQl2YXIgbWF0
ZXJpYWxWYXJpYW50cyA9IF9kZXB0aE1hdGVyaWFsczsKKwkJCXZhciBjdXN0b21NYXRlcmlhbCA9
IG9iamVjdC5jdXN0b21EZXB0aE1hdGVyaWFsOworCisJCQlpZiAoIGlzUG9pbnRMaWdodCApIHsK
KworCQkJCW1hdGVyaWFsVmFyaWFudHMgPSBfZGlzdGFuY2VNYXRlcmlhbHM7CisJCQkJY3VzdG9t
TWF0ZXJpYWwgPSBvYmplY3QuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbDsKKworCQkJfQorCisJCQlp
ZiAoICEgY3VzdG9tTWF0ZXJpYWwgKSB7CisKKwkJCQl2YXIgdXNlTW9ycGhpbmcgPSBmYWxzZTsK
KworCQkJCWlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzICkgeworCisJCQkJCWlmICggZ2VvbWV0
cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKKworCQkJCQkJdXNlTW9ycGhpbmcg
PSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBv
c2l0aW9uICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGggPiAwOwor
CisJCQkJCX0gZWxzZSBpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7CisK
KwkJCQkJCXVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1v
cnBoVGFyZ2V0cy5sZW5ndGggPiAwOworCisJCQkJCX0KKworCQkJCX0KKworCQkJCWlmICggb2Jq
ZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmcgPT09IGZhbHNlICkgeworCisJ
CQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOiBUSFJFRS5Ta2lubmVkTWVz
aCB3aXRoIG1hdGVyaWFsLnNraW5uaW5nIHNldCB0byBmYWxzZTonLCBvYmplY3QgKTsKKworCQkJ
CX0KKworCQkJCXZhciB1c2VTa2lubmluZyA9IG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVy
aWFsLnNraW5uaW5nOworCisJCQkJdmFyIHZhcmlhbnRJbmRleCA9IDA7CisKKwkJCQlpZiAoIHVz
ZU1vcnBoaW5nICkgdmFyaWFudEluZGV4IHw9IF9Nb3JwaGluZ0ZsYWc7CisJCQkJaWYgKCB1c2VT
a2lubmluZyApIHZhcmlhbnRJbmRleCB8PSBfU2tpbm5pbmdGbGFnOworCisJCQkJcmVzdWx0ID0g
bWF0ZXJpYWxWYXJpYW50c1sgdmFyaWFudEluZGV4IF07CisKKwkJCX0gZWxzZSB7CisKKwkJCQly
ZXN1bHQgPSBjdXN0b21NYXRlcmlhbDsKKworCQkJfQorCisJCQlpZiAoIF9yZW5kZXJlci5sb2Nh
bENsaXBwaW5nRW5hYmxlZCAmJgorCQkJCQltYXRlcmlhbC5jbGlwU2hhZG93cyA9PT0gdHJ1ZSAm
JgorCQkJCQltYXRlcmlhbC5jbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IDAgKSB7CisKKwkJCQkv
LyBpbiB0aGlzIGNhc2Ugd2UgbmVlZCBhIHVuaXF1ZSBtYXRlcmlhbCBpbnN0YW5jZSByZWZsZWN0
aW5nIHRoZQorCQkJCS8vIGFwcHJvcHJpYXRlIHN0YXRlCisKKwkJCQl2YXIga2V5QSA9IHJlc3Vs
dC51dWlkLCBrZXlCID0gbWF0ZXJpYWwudXVpZDsKKworCQkJCXZhciBtYXRlcmlhbHNGb3JWYXJp
YW50ID0gX21hdGVyaWFsQ2FjaGVbIGtleUEgXTsKKworCQkJCWlmICggbWF0ZXJpYWxzRm9yVmFy
aWFudCA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCW1hdGVyaWFsc0ZvclZhcmlhbnQgPSB7fTsK
KwkJCQkJX21hdGVyaWFsQ2FjaGVbIGtleUEgXSA9IG1hdGVyaWFsc0ZvclZhcmlhbnQ7CisKKwkJ
CQl9CisKKwkJCQl2YXIgY2FjaGVkTWF0ZXJpYWwgPSBtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlC
IF07CisKKwkJCQlpZiAoIGNhY2hlZE1hdGVyaWFsID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJ
Y2FjaGVkTWF0ZXJpYWwgPSByZXN1bHQuY2xvbmUoKTsKKwkJCQkJbWF0ZXJpYWxzRm9yVmFyaWFu
dFsga2V5QiBdID0gY2FjaGVkTWF0ZXJpYWw7CisKKwkJCQl9CisKKwkJCQlyZXN1bHQgPSBjYWNo
ZWRNYXRlcmlhbDsKKworCQkJfQorCisJCQlyZXN1bHQudmlzaWJsZSA9IG1hdGVyaWFsLnZpc2li
bGU7CisJCQlyZXN1bHQud2lyZWZyYW1lID0gbWF0ZXJpYWwud2lyZWZyYW1lOworCisJCQl2YXIg
c2lkZSA9IG1hdGVyaWFsLnNpZGU7CisKKwkJCWlmICggc2NvcGUucmVuZGVyU2luZ2xlU2lkZWQg
JiYgc2lkZSA9PSBEb3VibGVTaWRlICkgeworCisJCQkJc2lkZSA9IEZyb250U2lkZTsKKworCQkJ
fQorCisJCQlpZiAoIHNjb3BlLnJlbmRlclJldmVyc2VTaWRlZCApIHsKKworCQkJCWlmICggc2lk
ZSA9PT0gRnJvbnRTaWRlICkgc2lkZSA9IEJhY2tTaWRlOworCQkJCWVsc2UgaWYgKCBzaWRlID09
PSBCYWNrU2lkZSApIHNpZGUgPSBGcm9udFNpZGU7CisKKwkJCX0KKworCQkJcmVzdWx0LnNpZGUg
PSBzaWRlOworCisJCQlyZXN1bHQuY2xpcFNoYWRvd3MgPSBtYXRlcmlhbC5jbGlwU2hhZG93czsK
KwkJCXJlc3VsdC5jbGlwcGluZ1BsYW5lcyA9IG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzOworCisJ
CQlyZXN1bHQud2lyZWZyYW1lTGluZXdpZHRoID0gbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRo
OworCQkJcmVzdWx0LmxpbmV3aWR0aCA9IG1hdGVyaWFsLmxpbmV3aWR0aDsKKworCQkJaWYgKCBp
c1BvaW50TGlnaHQgJiYgcmVzdWx0LnVuaWZvcm1zLmxpZ2h0UG9zICE9PSB1bmRlZmluZWQgKSB7
CisKKwkJCQlyZXN1bHQudW5pZm9ybXMubGlnaHRQb3MudmFsdWUuY29weSggbGlnaHRQb3NpdGlv
bldvcmxkICk7CisKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9CisKKwkJZnVuY3Rp
b24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGln
aHQgKSB7CisKKwkJCWlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuOworCisJ
CQl2YXIgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApOworCisJ
CQlpZiAoIHZpc2libGUgJiYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2Jq
ZWN0LmlzUG9pbnRzICkgKSB7CisKKwkJCQlpZiAoIG9iamVjdC5jYXN0U2hhZG93ICYmICggISBv
YmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzT2JqZWN0KCBvYmplY3Qg
KSApICkgeworCisJCQkJCW9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcygg
c2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7CisK
KwkJCQkJdmFyIGdlb21ldHJ5ID0gX29iamVjdHMudXBkYXRlKCBvYmplY3QgKTsKKwkJCQkJdmFy
IG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsOworCisJCQkJCWlmICggQXJyYXkuaXNBcnJheSgg
bWF0ZXJpYWwgKSApIHsKKworCQkJCQkJdmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwczsKKwor
CQkJCQkJZm9yICggdmFyIGsgPSAwLCBrbCA9IGdyb3Vwcy5sZW5ndGg7IGsgPCBrbDsgayArKyAp
IHsKKworCQkJCQkJCXZhciBncm91cCA9IGdyb3Vwc1sgayBdOworCQkJCQkJCXZhciBncm91cE1h
dGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTsKKworCQkJCQkJCWlmICgg
Z3JvdXBNYXRlcmlhbCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUgKSB7CisKKwkJCQkJCQkJdmFy
IGRlcHRoTWF0ZXJpYWwgPSBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIGdyb3VwTWF0ZXJpYWws
IGlzUG9pbnRMaWdodCwgX2xpZ2h0UG9zaXRpb25Xb3JsZCApOworCQkJCQkJCQlfcmVuZGVyZXIu
cmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1h
dGVyaWFsLCBvYmplY3QsIGdyb3VwICk7CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQl9
IGVsc2UgaWYgKCBtYXRlcmlhbC52aXNpYmxlICkgeworCisJCQkJCQl2YXIgZGVwdGhNYXRlcmlh
bCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgX2xp
Z2h0UG9zaXRpb25Xb3JsZCApOworCQkJCQkJX3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCgg
c2hhZG93Q2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgb2JqZWN0LCBudWxs
ICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJCXZhciBjaGlsZHJlbiA9IG9iamVj
dC5jaGlsZHJlbjsKKworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBp
IDwgbDsgaSArKyApIHsKKworCQkJCXJlbmRlck9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJh
LCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApOworCisJCQl9CisKKwkJfQorCisJfQorCisJ
LyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1
bmN0aW9uIFdlYkdMQXR0cmlidXRlcyggZ2wgKSB7CisKKwkJdmFyIGJ1ZmZlcnMgPSB7fTsKKwor
CQlmdW5jdGlvbiBjcmVhdGVCdWZmZXIoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHsKKworCQkJ
dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5OworCQkJdmFyIHVzYWdlID0gYXR0cmlidXRlLmR5
bmFtaWMgPyBnbC5EWU5BTUlDX0RSQVcgOiBnbC5TVEFUSUNfRFJBVzsKKworCQkJdmFyIGJ1ZmZl
ciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOworCisJCQlnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBi
dWZmZXIgKTsKKwkJCWdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApOwor
CisJCQlhdHRyaWJ1dGUub25VcGxvYWRDYWxsYmFjaygpOworCisJCQl2YXIgdHlwZSA9IGdsLkZM
T0FUOworCisJCQlpZiAoIGFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ICkgeworCisJCQkJ
dHlwZSA9IGdsLkZMT0FUOworCisJCQl9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0
NjRBcnJheSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMQXR0cmlidXRlczog
VW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuJyApOworCisJCQl9
IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkgeworCisJCQkJdHlwZSA9
IGdsLlVOU0lHTkVEX1NIT1JUOworCisJCQl9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIElu
dDE2QXJyYXkgKSB7CisKKwkJCQl0eXBlID0gZ2wuU0hPUlQ7CisKKwkJCX0gZWxzZSBpZiAoIGFy
cmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkgKSB7CisKKwkJCQl0eXBlID0gZ2wuVU5TSUdORURf
SU5UOworCisJCQl9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDMyQXJyYXkgKSB7CisK
KwkJCQl0eXBlID0gZ2wuSU5UOworCisJCQl9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIElu
dDhBcnJheSApIHsKKworCQkJCXR5cGUgPSBnbC5CWVRFOworCisJCQl9IGVsc2UgaWYgKCBhcnJh
eSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgKSB7CisKKwkJCQl0eXBlID0gZ2wuVU5TSUdORURfQllU
RTsKKworCQkJfQorCisJCQlyZXR1cm4geworCQkJCWJ1ZmZlcjogYnVmZmVyLAorCQkJCXR5cGU6
IHR5cGUsCisJCQkJYnl0ZXNQZXJFbGVtZW50OiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCwKKwkJ
CQl2ZXJzaW9uOiBhdHRyaWJ1dGUudmVyc2lvbgorCQkJfTsKKworCQl9CisKKwkJZnVuY3Rpb24g
dXBkYXRlQnVmZmVyKCBidWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHsKKworCQkJdmFy
IGFycmF5ID0gYXR0cmlidXRlLmFycmF5OworCQkJdmFyIHVwZGF0ZVJhbmdlID0gYXR0cmlidXRl
LnVwZGF0ZVJhbmdlOworCisJCQlnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTsK
KworCQkJaWYgKCBhdHRyaWJ1dGUuZHluYW1pYyA9PT0gZmFsc2UgKSB7CisKKwkJCQlnbC5idWZm
ZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgZ2wuU1RBVElDX0RSQVcgKTsKKworCQkJfSBlbHNl
IGlmICggdXBkYXRlUmFuZ2UuY291bnQgPT09IC0gMSApIHsKKworCQkJCS8vIE5vdCB1c2luZyB1
cGRhdGUgcmFuZ2VzCisKKwkJCQlnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCAwLCBhcnJh
eSApOworCisJCQl9IGVsc2UgaWYgKCB1cGRhdGVSYW5nZS5jb3VudCA9PT0gMCApIHsKKworCQkJ
CWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWlj
IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJh
bmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0
aW5nIG1hbnVhbGx5LicgKTsKKworCQkJfSBlbHNlIHsKKworCQkJCWdsLmJ1ZmZlclN1YkRhdGEo
IGJ1ZmZlclR5cGUsIHVwZGF0ZVJhbmdlLm9mZnNldCAqIGFycmF5LkJZVEVTX1BFUl9FTEVNRU5U
LAorCQkJCQlhcnJheS5zdWJhcnJheSggdXBkYXRlUmFuZ2Uub2Zmc2V0LCB1cGRhdGVSYW5nZS5v
ZmZzZXQgKyB1cGRhdGVSYW5nZS5jb3VudCApICk7CisKKwkJCQl1cGRhdGVSYW5nZS5jb3VudCA9
IC0xOyAvLyByZXNldCByYW5nZQorCisJCQl9CisKKwkJfQorCisJCS8vCisKKwkJZnVuY3Rpb24g
Z2V0KCBhdHRyaWJ1dGUgKSB7CisKKwkJCWlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZm
ZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTsKKworCQkJcmV0dXJuIGJ1
ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF07CisKKwkJfQorCisJCWZ1bmN0aW9uIHJlbW92ZSggYXR0
cmlidXRlICkgeworCisJCQlpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmli
dXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7CisJCQkKKwkJCXZhciBkYXRhID0gYnVm
ZmVyc1sgYXR0cmlidXRlLnV1aWQgXTsKKworCQkJaWYgKCBkYXRhICkgeworCisJCQkJZ2wuZGVs
ZXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciApOworCisJCQkJZGVsZXRlIGJ1ZmZlcnNbIGF0dHJpYnV0
ZS51dWlkIF07CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gdXBkYXRlKCBhdHRyaWJ1dGUs
IGJ1ZmZlclR5cGUgKSB7CisKKwkJCWlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJB
dHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTsKKworCQkJdmFyIGRhdGEgPSBi
dWZmZXJzWyBhdHRyaWJ1dGUudXVpZCBdOworCisJCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAp
IHsKKworCQkJCWJ1ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF0gPSBjcmVhdGVCdWZmZXIoIGF0dHJp
YnV0ZSwgYnVmZmVyVHlwZSApOworCisJCQl9IGVsc2UgaWYgKCBkYXRhLnZlcnNpb24gPCBhdHRy
aWJ1dGUudmVyc2lvbiApIHsKKworCQkJCXVwZGF0ZUJ1ZmZlciggZGF0YS5idWZmZXIsIGF0dHJp
YnV0ZSwgYnVmZmVyVHlwZSApOworCisJCQkJZGF0YS52ZXJzaW9uID0gYXR0cmlidXRlLnZlcnNp
b247CisKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIHsKKworCQkJZ2V0OiBnZXQsCisJCQlyZW1v
dmU6IHJlbW92ZSwKKwkJCXVwZGF0ZTogdXBkYXRlCisKKwkJfTsKKworCX0KKworCS8qKgorCSAq
IEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBXZXN0TGFu
Z2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisJICogQGF1dGhvciBiaG91c3Rv
biAvIGh0dHA6Ly9jbGFyYS5pbworCSAqLworCisJZnVuY3Rpb24gRXVsZXIoIHgsIHksIHosIG9y
ZGVyICkgeworCisJCXRoaXMuX3ggPSB4IHx8IDA7CisJCXRoaXMuX3kgPSB5IHx8IDA7CisJCXRo
aXMuX3ogPSB6IHx8IDA7CisJCXRoaXMuX29yZGVyID0gb3JkZXIgfHwgRXVsZXIuRGVmYXVsdE9y
ZGVyOworCisJfQorCisJRXVsZXIuUm90YXRpb25PcmRlcnMgPSBbICdYWVonLCAnWVpYJywgJ1pY
WScsICdYWlknLCAnWVhaJywgJ1pZWCcgXTsKKworCUV1bGVyLkRlZmF1bHRPcmRlciA9ICdYWVon
OworCisJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEV1bGVyLnByb3RvdHlwZSwgeworCisJCXg6
IHsKKworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQlyZXR1cm4gdGhpcy5feDsKKworCQkJ
fSwKKworCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJdGhpcy5feCA9IHZhbHVl
OworCQkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisJCQl9CisKKwkJfSwKKworCQl5OiB7
CisKKwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJcmV0dXJuIHRoaXMuX3k7CisKKwkJCX0s
CisKKwkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJCXRoaXMuX3kgPSB2YWx1ZTsK
KwkJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworCQkJfQorCisJCX0sCisKKwkJejogewor
CisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCXJldHVybiB0aGlzLl96OworCisJCQl9LAor
CisJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQl0aGlzLl96ID0gdmFsdWU7CisJ
CQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CisKKwkJCX0KKworCQl9LAorCisJCW9yZGVyOiB7
CisKKwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJcmV0dXJuIHRoaXMuX29yZGVyOworCisJ
CQl9LAorCisJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQl0aGlzLl9vcmRlciA9
IHZhbHVlOworCQkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisJCQl9CisKKwkJfQorCisJ
fSApOworCisJT2JqZWN0LmFzc2lnbiggRXVsZXIucHJvdG90eXBlLCB7CisKKwkJaXNFdWxlcjog
dHJ1ZSwKKworCQlzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgb3JkZXIgKSB7CisKKwkJCXRoaXMu
X3ggPSB4OworCQkJdGhpcy5feSA9IHk7CisJCQl0aGlzLl96ID0gejsKKwkJCXRoaXMuX29yZGVy
ID0gb3JkZXIgfHwgdGhpcy5fb3JkZXI7CisKKwkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOwor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7CisKKwkJ
CXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwg
dGhpcy5fb3JkZXIgKTsKKworCQl9LAorCisJCWNvcHk6IGZ1bmN0aW9uICggZXVsZXIgKSB7CisK
KwkJCXRoaXMuX3ggPSBldWxlci5feDsKKwkJCXRoaXMuX3kgPSBldWxlci5feTsKKwkJCXRoaXMu
X3ogPSBldWxlci5fejsKKwkJCXRoaXMuX29yZGVyID0gZXVsZXIuX29yZGVyOworCisJCQl0aGlz
Lm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRG
cm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSwgb3JkZXIsIHVwZGF0ZSApIHsKKworCQkJ
dmFyIGNsYW1wID0gX01hdGguY2xhbXA7CisKKwkJCS8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBv
ZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpCisKKwkJCXZhciB0
ZSA9IG0uZWxlbWVudHM7CisJCQl2YXIgbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEz
ID0gdGVbIDggXTsKKwkJCXZhciBtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0
ZVsgOSBdOworCQkJdmFyIG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAx
MCBdOworCisJCQlvcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyOworCisJCQlpZiAoIG9yZGVy
ID09PSAnWFlaJyApIHsKKworCQkJCXRoaXMuX3kgPSBNYXRoLmFzaW4oIGNsYW1wKCBtMTMsIC0g
MSwgMSApICk7CisKKwkJCQlpZiAoIE1hdGguYWJzKCBtMTMgKSA8IDAuOTk5OTkgKSB7CisKKwkJ
CQkJdGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTsKKwkJCQkJdGhpcy5feiA9IE1h
dGguYXRhbjIoIC0gbTEyLCBtMTEgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJdGhpcy5feCA9
IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7CisJCQkJCXRoaXMuX3ogPSAwOworCisJCQkJfQorCisJ
CQl9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1lYWicgKSB7CisKKwkJCQl0aGlzLl94ID0gTWF0aC5h
c2luKCAtIGNsYW1wKCBtMjMsIC0gMSwgMSApICk7CisKKwkJCQlpZiAoIE1hdGguYWJzKCBtMjMg
KSA8IDAuOTk5OTkgKSB7CisKKwkJCQkJdGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7
CisJCQkJCXRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0yMiApOworCisJCQkJfSBlbHNlIHsK
KworCQkJCQl0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApOworCQkJCQl0aGlzLl96
ID0gMDsKKworCQkJCX0KKworCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdaWFknICkgeworCisJ
CQkJdGhpcy5feCA9IE1hdGguYXNpbiggY2xhbXAoIG0zMiwgLSAxLCAxICkgKTsKKworCQkJCWlm
ICggTWF0aC5hYnMoIG0zMiApIDwgMC45OTk5OSApIHsKKworCQkJCQl0aGlzLl95ID0gTWF0aC5h
dGFuMiggLSBtMzEsIG0zMyApOworCQkJCQl0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0y
MiApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQl0aGlzLl95ID0gMDsKKwkJCQkJdGhpcy5feiA9
IE1hdGguYXRhbjIoIG0yMSwgbTExICk7CisKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoIG9yZGVy
ID09PSAnWllYJyApIHsKKworCQkJCXRoaXMuX3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwg
LSAxLCAxICkgKTsKKworCQkJCWlmICggTWF0aC5hYnMoIG0zMSApIDwgMC45OTk5OSApIHsKKwor
CQkJCQl0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMzMgKTsKKwkJCQkJdGhpcy5feiA9IE1h
dGguYXRhbjIoIG0yMSwgbTExICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXRoaXMuX3ggPSAw
OworCQkJCQl0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApOworCisJCQkJfQorCisJ
CQl9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1laWCcgKSB7CisKKwkJCQl0aGlzLl96ID0gTWF0aC5h
c2luKCBjbGFtcCggbTIxLCAtIDEsIDEgKSApOworCisJCQkJaWYgKCBNYXRoLmFicyggbTIxICkg
PCAwLjk5OTk5ICkgeworCisJCQkJCXRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTIyICk7
CisJCQkJCXRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTExICk7CisKKwkJCQl9IGVsc2Ug
eworCisJCQkJCXRoaXMuX3ggPSAwOworCQkJCQl0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBt
MzMgKTsKKworCQkJCX0KKworCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdYWlknICkgeworCisJ
CQkJdGhpcy5feiA9IE1hdGguYXNpbiggLSBjbGFtcCggbTEyLCAtIDEsIDEgKSApOworCisJCQkJ
aWYgKCBNYXRoLmFicyggbTEyICkgPCAwLjk5OTk5ICkgeworCisJCQkJCXRoaXMuX3ggPSBNYXRo
LmF0YW4yKCBtMzIsIG0yMiApOworCQkJCQl0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMTEg
KTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJdGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBt
MzMgKTsKKwkJCQkJdGhpcy5feSA9IDA7CisKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisKKwkJCQlj
b25zb2xlLndhcm4oICdUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVu
IHVuc3VwcG9ydGVkIG9yZGVyOiAnICsgb3JkZXIgKTsKKworCQkJfQorCisJCQl0aGlzLl9vcmRl
ciA9IG9yZGVyOworCisJCQlpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLm9uQ2hhbmdlQ2Fs
bGJhY2soKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRGcm9tUXVhdGVybmlv
bjogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKKworCQkJ
cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21RdWF0ZXJuaW9uKCBxLCBvcmRlciwgdXBkYXRlICkgewor
CisJCQkJbWF0cml4Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7CisKKwkJCQlyZXR1
cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG1hdHJpeCwgb3JkZXIsIHVwZGF0ZSApOwor
CisJCQl9OworCisJCX0oKSwKKworCQlzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24gKCB2LCBvcmRl
ciApIHsKKworCQkJcmV0dXJuIHRoaXMuc2V0KCB2LngsIHYueSwgdi56LCBvcmRlciB8fCB0aGlz
Ll9vcmRlciApOworCisJCX0sCisKKwkJcmVvcmRlcjogZnVuY3Rpb24gKCkgeworCisJCQkvLyBX
QVJOSU5HOiB0aGlzIGRpc2NhcmRzIHJldm9sdXRpb24gaW5mb3JtYXRpb24gLWJob3VzdG9uCisK
KwkJCXZhciBxID0gbmV3IFF1YXRlcm5pb24oKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHJlb3Jk
ZXIoIG5ld09yZGVyICkgeworCisJCQkJcS5zZXRGcm9tRXVsZXIoIHRoaXMgKTsKKworCQkJCXJl
dHVybiB0aGlzLnNldEZyb21RdWF0ZXJuaW9uKCBxLCBuZXdPcmRlciApOworCisJCQl9OworCisJ
CX0oKSwKKworCQllcXVhbHM6IGZ1bmN0aW9uICggZXVsZXIgKSB7CisKKwkJCXJldHVybiAoIGV1
bGVyLl94ID09PSB0aGlzLl94ICkgJiYgKCBldWxlci5feSA9PT0gdGhpcy5feSApICYmICggZXVs
ZXIuX3ogPT09IHRoaXMuX3ogKSAmJiAoIGV1bGVyLl9vcmRlciA9PT0gdGhpcy5fb3JkZXIgKTsK
KworCQl9LAorCisJCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHsKKworCQkJdGhpcy5f
eCA9IGFycmF5WyAwIF07CisJCQl0aGlzLl95ID0gYXJyYXlbIDEgXTsKKwkJCXRoaXMuX3ogPSBh
cnJheVsgMiBdOworCQkJaWYgKCBhcnJheVsgMyBdICE9PSB1bmRlZmluZWQgKSB0aGlzLl9vcmRl
ciA9IGFycmF5WyAzIF07CisKKwkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisJCQlyZXR1
cm4gdGhpczsKKworCQl9LAorCisJCXRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCAp
IHsKKworCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKKwkJCWlmICgg
b2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisJCQlhcnJheVsgb2Zmc2V0IF0g
PSB0aGlzLl94OworCQkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7CisJCQlhcnJheVsg
b2Zmc2V0ICsgMiBdID0gdGhpcy5fejsKKwkJCWFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl9v
cmRlcjsKKworCQkJcmV0dXJuIGFycmF5OworCisJCX0sCisKKwkJdG9WZWN0b3IzOiBmdW5jdGlv
biAoIG9wdGlvbmFsUmVzdWx0ICkgeworCisJCQlpZiAoIG9wdGlvbmFsUmVzdWx0ICkgeworCisJ
CQkJcmV0dXJuIG9wdGlvbmFsUmVzdWx0LnNldCggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiAp
OworCisJCQl9IGVsc2UgeworCisJCQkJcmV0dXJuIG5ldyBWZWN0b3IzKCB0aGlzLl94LCB0aGlz
Ll95LCB0aGlzLl96ICk7CisKKwkJCX0KKworCQl9LAorCisJCW9uQ2hhbmdlOiBmdW5jdGlvbiAo
IGNhbGxiYWNrICkgeworCisJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjazsKKwor
CQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlvbkNoYW5nZUNhbGxiYWNrOiBmdW5jdGlvbiAo
KSB7fQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29i
LmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIExheWVycygpIHsKKworCQl0aGlzLm1hc2sgPSAxIHwg
MDsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIExheWVycy5wcm90b3R5cGUsIHsKKworCQlzZXQ6
IGZ1bmN0aW9uICggY2hhbm5lbCApIHsKKworCQkJdGhpcy5tYXNrID0gMSA8PCBjaGFubmVsIHwg
MDsKKworCQl9LAorCisJCWVuYWJsZTogZnVuY3Rpb24gKCBjaGFubmVsICkgeworCisJCQl0aGlz
Lm1hc2sgfD0gMSA8PCBjaGFubmVsIHwgMDsKKworCQl9LAorCisJCXRvZ2dsZTogZnVuY3Rpb24g
KCBjaGFubmVsICkgeworCisJCQl0aGlzLm1hc2sgXj0gMSA8PCBjaGFubmVsIHwgMDsKKworCQl9
LAorCisJCWRpc2FibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHsKKworCQkJdGhpcy5tYXNrICY9
IH4gKCAxIDw8IGNoYW5uZWwgfCAwICk7CisKKwkJfSwKKworCQl0ZXN0OiBmdW5jdGlvbiAoIGxh
eWVycyApIHsKKworCQkJcmV0dXJuICggdGhpcy5tYXNrICYgbGF5ZXJzLm1hc2sgKSAhPT0gMDsK
KworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRv
b2IuY29tLworCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCisJ
ICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0
aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKwkgKiBAYXV0
aG9yIGVsZXBoYW50YXR3b3JrIC8gd3d3LmVsZXBoYW50YXR3b3JrLmNoCisJICovCisKKwl2YXIg
b2JqZWN0M0RJZCA9IDA7CisKKwlmdW5jdGlvbiBPYmplY3QzRCgpIHsKKworCQlPYmplY3QuZGVm
aW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IG9iamVjdDNESWQgKysgfSApOworCisJ
CXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOworCisJCXRoaXMubmFtZSA9ICcnOwor
CQl0aGlzLnR5cGUgPSAnT2JqZWN0M0QnOworCisJCXRoaXMucGFyZW50ID0gbnVsbDsKKwkJdGhp
cy5jaGlsZHJlbiA9IFtdOworCisJCXRoaXMudXAgPSBPYmplY3QzRC5EZWZhdWx0VXAuY2xvbmUo
KTsKKworCQl2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpOworCQl2YXIgcm90YXRpb24gPSBu
ZXcgRXVsZXIoKTsKKwkJdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOworCQl2YXIg
c2NhbGUgPSBuZXcgVmVjdG9yMyggMSwgMSwgMSApOworCisJCWZ1bmN0aW9uIG9uUm90YXRpb25D
aGFuZ2UoKSB7CisKKwkJCXF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCByb3RhdGlvbiwgZmFsc2Ug
KTsKKworCQl9CisKKwkJZnVuY3Rpb24gb25RdWF0ZXJuaW9uQ2hhbmdlKCkgeworCisJCQlyb3Rh
dGlvbi5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdW5kZWZpbmVkLCBmYWxzZSApOwor
CisJCX0KKworCQlyb3RhdGlvbi5vbkNoYW5nZSggb25Sb3RhdGlvbkNoYW5nZSApOworCQlxdWF0
ZXJuaW9uLm9uQ2hhbmdlKCBvblF1YXRlcm5pb25DaGFuZ2UgKTsKKworCQlPYmplY3QuZGVmaW5l
UHJvcGVydGllcyggdGhpcywgeworCQkJcG9zaXRpb246IHsKKwkJCQllbnVtZXJhYmxlOiB0cnVl
LAorCQkJCXZhbHVlOiBwb3NpdGlvbgorCQkJfSwKKwkJCXJvdGF0aW9uOiB7CisJCQkJZW51bWVy
YWJsZTogdHJ1ZSwKKwkJCQl2YWx1ZTogcm90YXRpb24KKwkJCX0sCisJCQlxdWF0ZXJuaW9uOiB7
CisJCQkJZW51bWVyYWJsZTogdHJ1ZSwKKwkJCQl2YWx1ZTogcXVhdGVybmlvbgorCQkJfSwKKwkJ
CXNjYWxlOiB7CisJCQkJZW51bWVyYWJsZTogdHJ1ZSwKKwkJCQl2YWx1ZTogc2NhbGUKKwkJCX0s
CisJCQltb2RlbFZpZXdNYXRyaXg6IHsKKwkJCQl2YWx1ZTogbmV3IE1hdHJpeDQoKQorCQkJfSwK
KwkJCW5vcm1hbE1hdHJpeDogeworCQkJCXZhbHVlOiBuZXcgTWF0cml4MygpCisJCQl9CisJCX0g
KTsKKworCQl0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CisJCXRoaXMubWF0cml4V29ybGQg
PSBuZXcgTWF0cml4NCgpOworCisJCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IE9iamVjdDNELkRl
ZmF1bHRNYXRyaXhBdXRvVXBkYXRlOworCQl0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBm
YWxzZTsKKworCQl0aGlzLmxheWVycyA9IG5ldyBMYXllcnMoKTsKKwkJdGhpcy52aXNpYmxlID0g
dHJ1ZTsKKworCQl0aGlzLmNhc3RTaGFkb3cgPSBmYWxzZTsKKwkJdGhpcy5yZWNlaXZlU2hhZG93
ID0gZmFsc2U7CisKKwkJdGhpcy5mcnVzdHVtQ3VsbGVkID0gdHJ1ZTsKKwkJdGhpcy5yZW5kZXJP
cmRlciA9IDA7CisKKwkJdGhpcy51c2VyRGF0YSA9IHt9OworCX0KKworCU9iamVjdDNELkRlZmF1
bHRVcCA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7CisJT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1
dG9VcGRhdGUgPSB0cnVlOworCisJT2JqZWN0LmFzc2lnbiggT2JqZWN0M0QucHJvdG90eXBlLCBF
dmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7CisKKwkJaXNPYmplY3QzRDogdHJ1ZSwKKworCQlv
bkJlZm9yZVJlbmRlcjogZnVuY3Rpb24gKCkge30sCisJCW9uQWZ0ZXJSZW5kZXI6IGZ1bmN0aW9u
ICgpIHt9LAorCisJCWFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKKworCQkJdGhp
cy5tYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4LCB0aGlzLm1hdHJpeCApOworCisJCQl0
aGlzLm1hdHJpeC5kZWNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhp
cy5zY2FsZSApOworCisJCX0sCisKKwkJYXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7
CisKKwkJCXRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggcSApOworCisJCQlyZXR1cm4gdGhp
czsKKworCQl9LAorCisJCXNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZTogZnVuY3Rpb24gKCBheGlz
LCBhbmdsZSApIHsKKworCQkJLy8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWQKKworCQkJdGhp
cy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7CisKKwkJfSwKKwor
CQlzZXRSb3RhdGlvbkZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciApIHsKKworCQkJdGhpcy5x
dWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIsIHRydWUgKTsKKworCQl9LAorCisJCXNldFJv
dGF0aW9uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkgeworCisJCQkvLyBhc3N1bWVzIHRoZSB1
cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKQor
CisJCQl0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtICk7CisKKwkJfSwK
KworCQlzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7CisKKwkJCS8v
IGFzc3VtZXMgcSBpcyBub3JtYWxpemVkCisKKwkJCXRoaXMucXVhdGVybmlvbi5jb3B5KCBxICk7
CisKKwkJfSwKKworCQlyb3RhdGVPbkF4aXM6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gcm90YXRl
IG9iamVjdCBvbiBheGlzIGluIG9iamVjdCBzcGFjZQorCQkJLy8gYXhpcyBpcyBhc3N1bWVkIHRv
IGJlIG5vcm1hbGl6ZWQKKworCQkJdmFyIHExID0gbmV3IFF1YXRlcm5pb24oKTsKKworCQkJcmV0
dXJuIGZ1bmN0aW9uIHJvdGF0ZU9uQXhpcyggYXhpcywgYW5nbGUgKSB7CisKKwkJCQlxMS5zZXRG
cm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApOworCisJCQkJdGhpcy5xdWF0ZXJuaW9uLm11bHRp
cGx5KCBxMSApOworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCXJv
dGF0ZVg6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAg
KTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkgeworCisJCQkJcmV0dXJu
IHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJ
cm90YXRlWTogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMSwg
MCApOworCisJCQlyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7CisKKwkJCQlyZXR1
cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApOworCisJCQl9OworCisJCX0oKSwKKwor
CQlyb3RhdGVaOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAw
LCAxICk7CisKKwkJCXJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHsKKworCQkJCXJl
dHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7CisKKwkJCX07CisKKwkJfSgpLAor
CisJCXRyYW5zbGF0ZU9uQXhpczogZnVuY3Rpb24gKCkgeworCisJCQkvLyB0cmFuc2xhdGUgb2Jq
ZWN0IGJ5IGRpc3RhbmNlIGFsb25nIGF4aXMgaW4gb2JqZWN0IHNwYWNlCisJCQkvLyBheGlzIGlz
IGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZAorCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOwor
CisJCQlyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIHsK
KworCQkJCXYxLmNvcHkoIGF4aXMgKS5hcHBseVF1YXRlcm5pb24oIHRoaXMucXVhdGVybmlvbiAp
OworCisJCQkJdGhpcy5wb3NpdGlvbi5hZGQoIHYxLm11bHRpcGx5U2NhbGFyKCBkaXN0YW5jZSAp
ICk7CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJfTsKKworCQl9KCksCisKKwkJdHJhbnNsYXRl
WDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMyggMSwgMCwgMCApOwor
CisJCQlyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWCggZGlzdGFuY2UgKSB7CisKKwkJCQlyZXR1
cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApOworCisJCQl9OworCisJCX0o
KSwKKworCQl0cmFuc2xhdGVZOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2MSA9IG5ldyBWZWN0
b3IzKCAwLCAxLCAwICk7CisKKwkJCXJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVZKCBkaXN0YW5j
ZSApIHsKKworCQkJCXJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7
CisKKwkJCX07CisKKwkJfSgpLAorCisJCXRyYW5zbGF0ZVo6IGZ1bmN0aW9uICgpIHsKKworCQkJ
dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHRy
YW5zbGF0ZVooIGRpc3RhbmNlICkgeworCisJCQkJcmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlz
KCB2MSwgZGlzdGFuY2UgKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJbG9jYWxUb1dvcmxkOiBm
dW5jdGlvbiAoIHZlY3RvciApIHsKKworCQkJcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRo
aXMubWF0cml4V29ybGQgKTsKKworCQl9LAorCisJCXdvcmxkVG9Mb2NhbDogZnVuY3Rpb24gKCkg
eworCisJCQl2YXIgbTEgPSBuZXcgTWF0cml4NCgpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gd29y
bGRUb0xvY2FsKCB2ZWN0b3IgKSB7CisKKwkJCQlyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCgg
bTEuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApICk7CisKKwkJCX07CisKKwkJfSgpLAor
CisJCWxvb2tBdDogZnVuY3Rpb24gKCkgeworCisJCQkvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBz
dXBwb3J0IG9iamVjdHMgd2l0aCByb3RhdGVkIGFuZC9vciB0cmFuc2xhdGVkIHBhcmVudChzKQor
CisJCQl2YXIgbTEgPSBuZXcgTWF0cml4NCgpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gbG9va0F0
KCB2ZWN0b3IgKSB7CisKKwkJCQlpZiAoIHRoaXMuaXNDYW1lcmEgKSB7CisKKwkJCQkJbTEubG9v
a0F0KCB0aGlzLnBvc2l0aW9uLCB2ZWN0b3IsIHRoaXMudXAgKTsKKworCQkJCX0gZWxzZSB7CisK
KwkJCQkJbTEubG9va0F0KCB2ZWN0b3IsIHRoaXMucG9zaXRpb24sIHRoaXMudXAgKTsKKworCQkJ
CX0KKworCQkJCXRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG0xICk7CisK
KwkJCX07CisKKwkJfSgpLAorCisJCWFkZDogZnVuY3Rpb24gKCBvYmplY3QgKSB7CisKKwkJCWlm
ICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBh
cmd1bWVudHMubGVuZ3RoOyBpICsrICkgeworCisJCQkJCXRoaXMuYWRkKCBhcmd1bWVudHNbIGkg
XSApOworCisJCQkJfQorCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX0KKworCQkJaWYgKCBvYmpl
Y3QgPT09IHRoaXMgKSB7CisKKwkJCQljb25zb2xlLmVycm9yKCAiVEhSRUUuT2JqZWN0M0QuYWRk
OiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIiwgb2JqZWN0ICk7
CisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX0KKworCQkJaWYgKCAoIG9iamVjdCAmJiBvYmplY3Qu
aXNPYmplY3QzRCApICkgeworCisJCQkJaWYgKCBvYmplY3QucGFyZW50ICE9PSBudWxsICkgewor
CisJCQkJCW9iamVjdC5wYXJlbnQucmVtb3ZlKCBvYmplY3QgKTsKKworCQkJCX0KKworCQkJCW9i
amVjdC5wYXJlbnQgPSB0aGlzOworCQkJCW9iamVjdC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdh
ZGRlZCcgfSApOworCisJCQkJdGhpcy5jaGlsZHJlbi5wdXNoKCBvYmplY3QgKTsKKworCQkJfSBl
bHNlIHsKKworCQkJCWNvbnNvbGUuZXJyb3IoICJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBu
b3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIiwgb2JqZWN0ICk7CisKKwkJCX0KKwor
CQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlyZW1vdmU6IGZ1bmN0aW9uICggb2JqZWN0ICkg
eworCisJCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkgeworCisJCQkJZm9yICggdmFyIGkg
PSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHsKKworCQkJCQl0aGlzLnJlbW92ZSgg
YXJndW1lbnRzWyBpIF0gKTsKKworCQkJCX0KKworCQkJCXJldHVybiB0aGlzOworCisJCQl9CisK
KwkJCXZhciBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZiggb2JqZWN0ICk7CisKKwkJCWlm
ICggaW5kZXggIT09IC0gMSApIHsKKworCQkJCW9iamVjdC5wYXJlbnQgPSBudWxsOworCisJCQkJ
b2JqZWN0LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ3JlbW92ZWQnIH0gKTsKKworCQkJCXRoaXMu
Y2hpbGRyZW4uc3BsaWNlKCBpbmRleCwgMSApOworCisJCQl9CisKKwkJCXJldHVybiB0aGlzOwor
CQkJCisJCX0sCisKKwkJZ2V0T2JqZWN0QnlJZDogZnVuY3Rpb24gKCBpZCApIHsKKworCQkJcmV0
dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ2lkJywgaWQgKTsKKworCQl9LAorCisJCWdl
dE9iamVjdEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkgeworCisJCQlyZXR1cm4gdGhpcy5nZXRP
YmplY3RCeVByb3BlcnR5KCAnbmFtZScsIG5hbWUgKTsKKworCQl9LAorCisJCWdldE9iamVjdEJ5
UHJvcGVydHk6IGZ1bmN0aW9uICggbmFtZSwgdmFsdWUgKSB7CisKKwkJCWlmICggdGhpc1sgbmFt
ZSBdID09PSB2YWx1ZSApIHJldHVybiB0aGlzOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0
aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQl2YXIgY2hpbGQgPSB0
aGlzLmNoaWxkcmVuWyBpIF07CisJCQkJdmFyIG9iamVjdCA9IGNoaWxkLmdldE9iamVjdEJ5UHJv
cGVydHkoIG5hbWUsIHZhbHVlICk7CisKKwkJCQlpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkg
eworCisJCQkJCXJldHVybiBvYmplY3Q7CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuIHVu
ZGVmaW5lZDsKKworCQl9LAorCisJCWdldFdvcmxkUG9zaXRpb246IGZ1bmN0aW9uICggb3B0aW9u
YWxUYXJnZXQgKSB7CisKKwkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVj
dG9yMygpOworCisJCQl0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7CisKKwkJCXJldHVy
biByZXN1bHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7CisKKwkJ
fSwKKworCQlnZXRXb3JsZFF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHBvc2l0
aW9uID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCk7CisKKwkJ
CXJldHVybiBmdW5jdGlvbiBnZXRXb3JsZFF1YXRlcm5pb24oIG9wdGlvbmFsVGFyZ2V0ICkgewor
CisJCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBRdWF0ZXJuaW9uKCk7CisK
KwkJCQl0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7CisKKwkJCQl0aGlzLm1hdHJpeFdv
cmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHJlc3VsdCwgc2NhbGUgKTsKKworCQkJCXJldHVybiBy
ZXN1bHQ7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWdldFdvcmxkUm90YXRpb246IGZ1bmN0aW9u
ICgpIHsKKworCQkJdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOworCisJCQlyZXR1
cm4gZnVuY3Rpb24gZ2V0V29ybGRSb3RhdGlvbiggb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCQl2
YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IEV1bGVyKCk7CisKKwkJCQl0aGlzLmdl
dFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApOworCisJCQkJcmV0dXJuIHJlc3VsdC5zZXRG
cm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdGhpcy5yb3RhdGlvbi5vcmRlciwgZmFsc2UgKTsK
KworCQkJfTsKKworCQl9KCksCisKKwkJZ2V0V29ybGRTY2FsZTogZnVuY3Rpb24gKCkgeworCisJ
CQl2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIHF1YXRlcm5pb24gPSBuZXcg
UXVhdGVybmlvbigpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRTY2FsZSggb3B0aW9u
YWxUYXJnZXQgKSB7CisKKwkJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZl
Y3RvcjMoKTsKKworCQkJCXRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKKworCQkJCXRo
aXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgcmVzdWx0ICk7
CisKKwkJCQlyZXR1cm4gcmVzdWx0OworCisJCQl9OworCisJCX0oKSwKKworCQlnZXRXb3JsZERp
cmVjdGlvbjogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJu
aW9uKCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggb3B0aW9uYWxU
YXJnZXQgKSB7CisKKwkJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3Rv
cjMoKTsKKworCQkJCXRoaXMuZ2V0V29ybGRRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7CisKKwkJ
CQlyZXR1cm4gcmVzdWx0LnNldCggMCwgMCwgMSApLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlv
biApOworCisJCQl9OworCisJCX0oKSwKKworCQlyYXljYXN0OiBmdW5jdGlvbiAoKSB7fSwKKwor
CQl0cmF2ZXJzZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKKworCQkJY2FsbGJhY2soIHRoaXMg
KTsKKworCQkJdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKKworCQkJZm9yICggdmFyIGkg
PSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCWNoaWxkcmVu
WyBpIF0udHJhdmVyc2UoIGNhbGxiYWNrICk7CisKKwkJCX0KKworCQl9LAorCisJCXRyYXZlcnNl
VmlzaWJsZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKKworCQkJaWYgKCB0aGlzLnZpc2libGUg
PT09IGZhbHNlICkgcmV0dXJuOworCisJCQljYWxsYmFjayggdGhpcyApOworCisJCQl2YXIgY2hp
bGRyZW4gPSB0aGlzLmNoaWxkcmVuOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJl
bi5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJY2hpbGRyZW5bIGkgXS50cmF2ZXJzZVZp
c2libGUoIGNhbGxiYWNrICk7CisKKwkJCX0KKworCQl9LAorCisJCXRyYXZlcnNlQW5jZXN0b3Jz
OiBmdW5jdGlvbiAoIGNhbGxiYWNrICkgeworCisJCQl2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7
CisKKwkJCWlmICggcGFyZW50ICE9PSBudWxsICkgeworCisJCQkJY2FsbGJhY2soIHBhcmVudCAp
OworCisJCQkJcGFyZW50LnRyYXZlcnNlQW5jZXN0b3JzKCBjYWxsYmFjayApOworCisJCQl9CisK
KwkJfSwKKworCQl1cGRhdGVNYXRyaXg6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5tYXRyaXgu
Y29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7CisK
KwkJCXRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJfSwKKworCQl1cGRh
dGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHsKKworCQkJaWYgKCB0aGlzLm1hdHJp
eEF1dG9VcGRhdGUgKSB0aGlzLnVwZGF0ZU1hdHJpeCgpOworCisJCQlpZiAoIHRoaXMubWF0cml4
V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSApIHsKKworCQkJCWlmICggdGhpcy5wYXJlbnQgPT09
IG51bGwgKSB7CisKKwkJCQkJdGhpcy5tYXRyaXhXb3JsZC5jb3B5KCB0aGlzLm1hdHJpeCApOwor
CisJCQkJfSBlbHNlIHsKKworCQkJCQl0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMo
IHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJpeCApOworCisJCQkJfQorCisJCQkJ
dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7CisKKwkJCQlmb3JjZSA9IHRydWU7
CisKKwkJCX0KKworCQkJLy8gdXBkYXRlIGNoaWxkcmVuCisKKwkJCXZhciBjaGlsZHJlbiA9IHRo
aXMuY2hpbGRyZW47CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsg
aSA8IGw7IGkgKysgKSB7CisKKwkJCQljaGlsZHJlblsgaSBdLnVwZGF0ZU1hdHJpeFdvcmxkKCBm
b3JjZSApOworCisJCQl9CisKKwkJfSwKKworCQl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsK
KworCQkJLy8gbWV0YSBpcyAnJyB3aGVuIGNhbGxlZCBmcm9tIEpTT04uc3RyaW5naWZ5CisJCQl2
YXIgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgbWV0YSA9PT0gJycgKTsK
KworCQkJdmFyIG91dHB1dCA9IHt9OworCisJCQkvLyBtZXRhIGlzIGEgaGFzaCB1c2VkIHRvIGNv
bGxlY3QgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLgorCQkJLy8gbm90IHByb3ZpZGluZyBpdCBpbXBs
aWVzIHRoYXQgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3QKKwkJCS8vIGJlaW5nIHNlcmlhbGl6ZWQu
CisJCQlpZiAoIGlzUm9vdE9iamVjdCApIHsKKworCQkJCS8vIGluaXRpYWxpemUgbWV0YSBvYmoK
KwkJCQltZXRhID0geworCQkJCQlnZW9tZXRyaWVzOiB7fSwKKwkJCQkJbWF0ZXJpYWxzOiB7fSwK
KwkJCQkJdGV4dHVyZXM6IHt9LAorCQkJCQlpbWFnZXM6IHt9CisJCQkJfTsKKworCQkJCW91dHB1
dC5tZXRhZGF0YSA9IHsKKwkJCQkJdmVyc2lvbjogNC41LAorCQkJCQl0eXBlOiAnT2JqZWN0JywK
KwkJCQkJZ2VuZXJhdG9yOiAnT2JqZWN0M0QudG9KU09OJworCQkJCX07CisKKwkJCX0KKworCQkJ
Ly8gc3RhbmRhcmQgT2JqZWN0M0Qgc2VyaWFsaXphdGlvbgorCisJCQl2YXIgb2JqZWN0ID0ge307
CisKKwkJCW9iamVjdC51dWlkID0gdGhpcy51dWlkOworCQkJb2JqZWN0LnR5cGUgPSB0aGlzLnR5
cGU7CisKKwkJCWlmICggdGhpcy5uYW1lICE9PSAnJyApIG9iamVjdC5uYW1lID0gdGhpcy5uYW1l
OworCQkJaWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgb2Jq
ZWN0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTsKKwkJCWlmICggdGhpcy5jYXN0U2hhZG93ID09
PSB0cnVlICkgb2JqZWN0LmNhc3RTaGFkb3cgPSB0cnVlOworCQkJaWYgKCB0aGlzLnJlY2VpdmVT
aGFkb3cgPT09IHRydWUgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IHRydWU7CisJCQlpZiAoIHRo
aXMudmlzaWJsZSA9PT0gZmFsc2UgKSBvYmplY3QudmlzaWJsZSA9IGZhbHNlOworCisJCQlvYmpl
Y3QubWF0cml4ID0gdGhpcy5tYXRyaXgudG9BcnJheSgpOworCisJCQkvLworCisJCQlmdW5jdGlv
biBzZXJpYWxpemUoIGxpYnJhcnksIGVsZW1lbnQgKSB7CisKKwkJCQlpZiAoIGxpYnJhcnlbIGVs
ZW1lbnQudXVpZCBdID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJbGlicmFyeVsgZWxlbWVudC51
dWlkIF0gPSBlbGVtZW50LnRvSlNPTiggbWV0YSApOworCisJCQkJfQorCisJCQkJcmV0dXJuIGVs
ZW1lbnQudXVpZDsKKworCQkJfQorCisJCQlpZiAoIHRoaXMuZ2VvbWV0cnkgIT09IHVuZGVmaW5l
ZCApIHsKKworCQkJCW9iamVjdC5nZW9tZXRyeSA9IHNlcmlhbGl6ZSggbWV0YS5nZW9tZXRyaWVz
LCB0aGlzLmdlb21ldHJ5ICk7CisKKwkJCX0KKworCQkJaWYgKCB0aGlzLm1hdGVyaWFsICE9PSB1
bmRlZmluZWQgKSB7CisKKwkJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMubWF0ZXJpYWwgKSAp
IHsKKworCQkJCQl2YXIgdXVpZHMgPSBbXTsKKworCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0
aGlzLm1hdGVyaWFsLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJCXV1aWRzLnB1c2go
IHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWxbIGkgXSApICk7CisKKwkJ
CQkJfQorCisJCQkJCW9iamVjdC5tYXRlcmlhbCA9IHV1aWRzOworCisJCQkJfSBlbHNlIHsKKwor
CQkJCQlvYmplY3QubWF0ZXJpYWwgPSBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1h
dGVyaWFsICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy8KKworCQkJaWYgKCB0aGlzLmNoaWxk
cmVuLmxlbmd0aCA+IDAgKSB7CisKKwkJCQlvYmplY3QuY2hpbGRyZW4gPSBbXTsKKworCQkJCWZv
ciAoIHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkgeworCisJCQkJ
CW9iamVjdC5jaGlsZHJlbi5wdXNoKCB0aGlzLmNoaWxkcmVuWyBpIF0udG9KU09OKCBtZXRhICku
b2JqZWN0ICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCBpc1Jvb3RPYmplY3QgKSB7CisK
KwkJCQl2YXIgZ2VvbWV0cmllcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuZ2VvbWV0cmllcyAp
OworCQkJCXZhciBtYXRlcmlhbHMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLm1hdGVyaWFscyAp
OworCQkJCXZhciB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTsK
KwkJCQl2YXIgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTsKKworCQkJ
CWlmICggZ2VvbWV0cmllcy5sZW5ndGggPiAwICkgb3V0cHV0Lmdlb21ldHJpZXMgPSBnZW9tZXRy
aWVzOworCQkJCWlmICggbWF0ZXJpYWxzLmxlbmd0aCA+IDAgKSBvdXRwdXQubWF0ZXJpYWxzID0g
bWF0ZXJpYWxzOworCQkJCWlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIG91dHB1dC50ZXh0dXJl
cyA9IHRleHR1cmVzOworCQkJCWlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBvdXRwdXQuaW1hZ2Vz
ID0gaW1hZ2VzOworCisJCQl9CisKKwkJCW91dHB1dC5vYmplY3QgPSBvYmplY3Q7CisKKwkJCXJl
dHVybiBvdXRwdXQ7CisKKwkJCS8vIGV4dHJhY3QgZGF0YSBmcm9tIHRoZSBjYWNoZSBoYXNoCisJ
CQkvLyByZW1vdmUgbWV0YWRhdGEgb24gZWFjaCBpdGVtCisJCQkvLyBhbmQgcmV0dXJuIGFzIGFy
cmF5CisJCQlmdW5jdGlvbiBleHRyYWN0RnJvbUNhY2hlKCBjYWNoZSApIHsKKworCQkJCXZhciB2
YWx1ZXMgPSBbXTsKKwkJCQlmb3IgKCB2YXIga2V5IGluIGNhY2hlICkgeworCisJCQkJCXZhciBk
YXRhID0gY2FjaGVbIGtleSBdOworCQkJCQlkZWxldGUgZGF0YS5tZXRhZGF0YTsKKwkJCQkJdmFs
dWVzLnB1c2goIGRhdGEgKTsKKworCQkJCX0KKwkJCQlyZXR1cm4gdmFsdWVzOworCisJCQl9CisK
KwkJfSwKKworCQljbG9uZTogZnVuY3Rpb24gKCByZWN1cnNpdmUgKSB7CisKKwkJCXJldHVybiBu
ZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMsIHJlY3Vyc2l2ZSApOworCisJCX0sCisK
KwkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHsKKworCQkJaWYgKCByZWN1
cnNpdmUgPT09IHVuZGVmaW5lZCApIHJlY3Vyc2l2ZSA9IHRydWU7CisKKwkJCXRoaXMubmFtZSA9
IHNvdXJjZS5uYW1lOworCisJCQl0aGlzLnVwLmNvcHkoIHNvdXJjZS51cCApOworCisJCQl0aGlz
LnBvc2l0aW9uLmNvcHkoIHNvdXJjZS5wb3NpdGlvbiApOworCQkJdGhpcy5xdWF0ZXJuaW9uLmNv
cHkoIHNvdXJjZS5xdWF0ZXJuaW9uICk7CisJCQl0aGlzLnNjYWxlLmNvcHkoIHNvdXJjZS5zY2Fs
ZSApOworCisJCQl0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7CisJCQl0aGlzLm1h
dHJpeFdvcmxkLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZCApOworCisJCQl0aGlzLm1hdHJpeEF1
dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTsKKwkJCXRoaXMubWF0cml4V29ybGRO
ZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlOworCisJCQl0aGlzLmxh
eWVycy5tYXNrID0gc291cmNlLmxheWVycy5tYXNrOworCQkJdGhpcy52aXNpYmxlID0gc291cmNl
LnZpc2libGU7CisKKwkJCXRoaXMuY2FzdFNoYWRvdyA9IHNvdXJjZS5jYXN0U2hhZG93OworCQkJ
dGhpcy5yZWNlaXZlU2hhZG93ID0gc291cmNlLnJlY2VpdmVTaGFkb3c7CisKKwkJCXRoaXMuZnJ1
c3R1bUN1bGxlZCA9IHNvdXJjZS5mcnVzdHVtQ3VsbGVkOworCQkJdGhpcy5yZW5kZXJPcmRlciA9
IHNvdXJjZS5yZW5kZXJPcmRlcjsKKworCQkJdGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoIEpT
T04uc3RyaW5naWZ5KCBzb3VyY2UudXNlckRhdGEgKSApOworCisJCQlpZiAoIHJlY3Vyc2l2ZSA9
PT0gdHJ1ZSApIHsKKworCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IHNvdXJjZS5jaGlsZHJlbi5s
ZW5ndGg7IGkgKysgKSB7CisKKwkJCQkJdmFyIGNoaWxkID0gc291cmNlLmNoaWxkcmVuWyBpIF07
CisJCQkJCXRoaXMuYWRkKCBjaGlsZC5jbG9uZSgpICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJ
cmV0dXJuIHRoaXM7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2Ig
LyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6
Ly9nb21vLnNlLworCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9X
ZXN0TGFuZ2xleQorCSovCisKKwlmdW5jdGlvbiBDYW1lcmEoKSB7CisKKwkJT2JqZWN0M0QuY2Fs
bCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdDYW1lcmEnOworCisJCXRoaXMubWF0cml4V29y
bGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTsKKwkJdGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gbmV3
IE1hdHJpeDQoKTsKKworCX0KKworCUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBP
YmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBD
YW1lcmEsCisKKwkJaXNDYW1lcmE6IHRydWUsCisKKwkJY29weTogZnVuY3Rpb24gKCBzb3VyY2Us
IHJlY3Vyc2l2ZSApIHsKKworCQkJT2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywg
c291cmNlLCByZWN1cnNpdmUgKTsKKworCQkJdGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSgg
c291cmNlLm1hdHJpeFdvcmxkSW52ZXJzZSApOworCQkJdGhpcy5wcm9qZWN0aW9uTWF0cml4LmNv
cHkoIHNvdXJjZS5wcm9qZWN0aW9uTWF0cml4ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0s
CisKKwkJZ2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHF1YXRlcm5p
b24gPSBuZXcgUXVhdGVybmlvbigpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGREaXJl
Y3Rpb24oIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFy
Z2V0IHx8IG5ldyBWZWN0b3IzKCk7CisKKwkJCQl0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVh
dGVybmlvbiApOworCisJCQkJcmV0dXJuIHJlc3VsdC5zZXQoIDAsIDAsIC0gMSApLmFwcGx5UXVh
dGVybmlvbiggcXVhdGVybmlvbiApOworCisJCQl9OworCisJCX0oKSwKKworCQl1cGRhdGVNYXRy
aXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHsKKworCQkJT2JqZWN0M0QucHJvdG90eXBlLnVw
ZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CisKKwkJCXRoaXMubWF0cml4V29y
bGRJbnZlcnNlLmdldEludmVyc2UoIHRoaXMubWF0cml4V29ybGQgKTsKKworCQl9LAorCisJCWNs
b25lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNv
cHkoIHRoaXMgKTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRx
IC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworCSAqIEBhdXRob3IgYXJvc2UgLyBodHRwOi8v
Z2l0aHViLmNvbS9hcm9zZQorCSAqLworCisJZnVuY3Rpb24gT3J0aG9ncmFwaGljQ2FtZXJhKCBs
ZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHsKKworCQlDYW1lcmEuY2FsbCgg
dGhpcyApOworCisJCXRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnOworCisJCXRoaXMu
em9vbSA9IDE7CisJCXRoaXMudmlldyA9IG51bGw7CisKKwkJdGhpcy5sZWZ0ID0gbGVmdDsKKwkJ
dGhpcy5yaWdodCA9IHJpZ2h0OworCQl0aGlzLnRvcCA9IHRvcDsKKwkJdGhpcy5ib3R0b20gPSBi
b3R0b207CisKKwkJdGhpcy5uZWFyID0gKCBuZWFyICE9PSB1bmRlZmluZWQgKSA/IG5lYXIgOiAw
LjE7CisJCXRoaXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMjAwMDsKKwor
CQl0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKKworCX0KKworCU9ydGhvZ3JhcGhpY0Nh
bWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDYW1lcmEucHJv
dG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogT3J0aG9ncmFwaGljQ2FtZXJhLAorCisJCWlz
T3J0aG9ncmFwaGljQ2FtZXJhOiB0cnVlLAorCisJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlLCBy
ZWN1cnNpdmUgKSB7CisKKwkJCUNhbWVyYS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3Vy
Y2UsIHJlY3Vyc2l2ZSApOworCisJCQl0aGlzLmxlZnQgPSBzb3VyY2UubGVmdDsKKwkJCXRoaXMu
cmlnaHQgPSBzb3VyY2UucmlnaHQ7CisJCQl0aGlzLnRvcCA9IHNvdXJjZS50b3A7CisJCQl0aGlz
LmJvdHRvbSA9IHNvdXJjZS5ib3R0b207CisJCQl0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjsKKwkJ
CXRoaXMuZmFyID0gc291cmNlLmZhcjsKKworCQkJdGhpcy56b29tID0gc291cmNlLnpvb207CisJ
CQl0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWdu
KCB7fSwgc291cmNlLnZpZXcgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRW
aWV3T2Zmc2V0OiBmdW5jdGlvbiggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwg
aGVpZ2h0ICkgeworCisJCQl0aGlzLnZpZXcgPSB7CisJCQkJZnVsbFdpZHRoOiBmdWxsV2lkdGgs
CisJCQkJZnVsbEhlaWdodDogZnVsbEhlaWdodCwKKwkJCQlvZmZzZXRYOiB4LAorCQkJCW9mZnNl
dFk6IHksCisJCQkJd2lkdGg6IHdpZHRoLAorCQkJCWhlaWdodDogaGVpZ2h0CisJCQl9OworCisJ
CQl0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKKworCQl9LAorCisJCWNsZWFyVmlld09m
ZnNldDogZnVuY3Rpb24oKSB7CisKKwkJCXRoaXMudmlldyA9IG51bGw7CisJCQl0aGlzLnVwZGF0
ZVByb2plY3Rpb25NYXRyaXgoKTsKKworCQl9LAorCisJCXVwZGF0ZVByb2plY3Rpb25NYXRyaXg6
IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGR4ID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkg
LyAoIDIgKiB0aGlzLnpvb20gKTsKKwkJCXZhciBkeSA9ICggdGhpcy50b3AgLSB0aGlzLmJvdHRv
bSApIC8gKCAyICogdGhpcy56b29tICk7CisJCQl2YXIgY3ggPSAoIHRoaXMucmlnaHQgKyB0aGlz
LmxlZnQgKSAvIDI7CisJCQl2YXIgY3kgPSAoIHRoaXMudG9wICsgdGhpcy5ib3R0b20gKSAvIDI7
CisKKwkJCXZhciBsZWZ0ID0gY3ggLSBkeDsKKwkJCXZhciByaWdodCA9IGN4ICsgZHg7CisJCQl2
YXIgdG9wID0gY3kgKyBkeTsKKwkJCXZhciBib3R0b20gPSBjeSAtIGR5OworCisJCQlpZiAoIHRo
aXMudmlldyAhPT0gbnVsbCApIHsKKworCQkJCXZhciB6b29tVyA9IHRoaXMuem9vbSAvICggdGhp
cy52aWV3LndpZHRoIC8gdGhpcy52aWV3LmZ1bGxXaWR0aCApOworCQkJCXZhciB6b29tSCA9IHRo
aXMuem9vbSAvICggdGhpcy52aWV3LmhlaWdodCAvIHRoaXMudmlldy5mdWxsSGVpZ2h0ICk7CisJ
CQkJdmFyIHNjYWxlVyA9ICggdGhpcy5yaWdodCAtIHRoaXMubGVmdCApIC8gdGhpcy52aWV3Lndp
ZHRoOworCQkJCXZhciBzY2FsZUggPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvIHRoaXMu
dmlldy5oZWlnaHQ7CisKKwkJCQlsZWZ0ICs9IHNjYWxlVyAqICggdGhpcy52aWV3Lm9mZnNldFgg
LyB6b29tVyApOworCQkJCXJpZ2h0ID0gbGVmdCArIHNjYWxlVyAqICggdGhpcy52aWV3LndpZHRo
IC8gem9vbVcgKTsKKwkJCQl0b3AgLT0gc2NhbGVIICogKCB0aGlzLnZpZXcub2Zmc2V0WSAvIHpv
b21IICk7CisJCQkJYm90dG9tID0gdG9wIC0gc2NhbGVIICogKCB0aGlzLnZpZXcuaGVpZ2h0IC8g
em9vbUggKTsKKworCQkJfQorCisJCQl0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3Jh
cGhpYyggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7CisK
KwkJfSwKKworCQl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKKworCQkJdmFyIGRhdGEgPSBP
YmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTsKKworCQkJZGF0YS5v
YmplY3Quem9vbSA9IHRoaXMuem9vbTsKKwkJCWRhdGEub2JqZWN0LmxlZnQgPSB0aGlzLmxlZnQ7
CisJCQlkYXRhLm9iamVjdC5yaWdodCA9IHRoaXMucmlnaHQ7CisJCQlkYXRhLm9iamVjdC50b3Ag
PSB0aGlzLnRvcDsKKwkJCWRhdGEub2JqZWN0LmJvdHRvbSA9IHRoaXMuYm90dG9tOworCQkJZGF0
YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjsKKwkJCWRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFy
OworCisJCQlpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmpl
Y3QuYXNzaWduKCB7fSwgdGhpcy52aWV3ICk7CisKKwkJCXJldHVybiBkYXRhOworCisJCX0KKwor
CX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJ
ICogQGF1dGhvciBncmVnZ21hbiAvIGh0dHA6Ly9nYW1lcy5ncmVnZ21hbi5jb20vCisJICogQGF1
dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZworCSAqIEBhdXRo
b3IgdHNjaHcKKwkgKi8KKworCWZ1bmN0aW9uIFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVj
dCwgbmVhciwgZmFyICkgeworCisJCUNhbWVyYS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBl
ID0gJ1BlcnNwZWN0aXZlQ2FtZXJhJzsKKworCQl0aGlzLmZvdiA9IGZvdiAhPT0gdW5kZWZpbmVk
ID8gZm92IDogNTA7CisJCXRoaXMuem9vbSA9IDE7CisKKwkJdGhpcy5uZWFyID0gbmVhciAhPT0g
dW5kZWZpbmVkID8gbmVhciA6IDAuMTsKKwkJdGhpcy5mYXIgPSBmYXIgIT09IHVuZGVmaW5lZCA/
IGZhciA6IDIwMDA7CisJCXRoaXMuZm9jdXMgPSAxMDsKKworCQl0aGlzLmFzcGVjdCA9IGFzcGVj
dCAhPT0gdW5kZWZpbmVkID8gYXNwZWN0IDogMTsKKwkJdGhpcy52aWV3ID0gbnVsbDsKKworCQl0
aGlzLmZpbG1HYXVnZSA9IDM1OwkvLyB3aWR0aCBvZiB0aGUgZmlsbSAoZGVmYXVsdCBpbiBtaWxs
aW1ldGVycykKKwkJdGhpcy5maWxtT2Zmc2V0ID0gMDsJLy8gaG9yaXpvbnRhbCBmaWxtIG9mZnNl
dCAoc2FtZSB1bml0IGFzIGdhdWdlKQorCisJCXRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgp
OworCisJfQorCisJUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbigg
T2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IFBl
cnNwZWN0aXZlQ2FtZXJhLAorCisJCWlzUGVyc3BlY3RpdmVDYW1lcmE6IHRydWUsCisKKwkJY29w
eTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHsKKworCQkJQ2FtZXJhLnByb3RvdHlw
ZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7CisKKwkJCXRoaXMuZm92ID0g
c291cmNlLmZvdjsKKwkJCXRoaXMuem9vbSA9IHNvdXJjZS56b29tOworCisJCQl0aGlzLm5lYXIg
PSBzb3VyY2UubmVhcjsKKwkJCXRoaXMuZmFyID0gc291cmNlLmZhcjsKKwkJCXRoaXMuZm9jdXMg
PSBzb3VyY2UuZm9jdXM7CisKKwkJCXRoaXMuYXNwZWN0ID0gc291cmNlLmFzcGVjdDsKKwkJCXRo
aXMudmlldyA9IHNvdXJjZS52aWV3ID09PSBudWxsID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oIHt9
LCBzb3VyY2UudmlldyApOworCisJCQl0aGlzLmZpbG1HYXVnZSA9IHNvdXJjZS5maWxtR2F1Z2U7
CisJCQl0aGlzLmZpbG1PZmZzZXQgPSBzb3VyY2UuZmlsbU9mZnNldDsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfSwKKworCQkvKioKKwkJICogU2V0cyB0aGUgRk9WIGJ5IGZvY2FsIGxlbmd0aCBp
biByZXNwZWN0IHRvIHRoZSBjdXJyZW50IC5maWxtR2F1Z2UuCisJCSAqCisJCSAqIFRoZSBkZWZh
dWx0IGZpbG0gZ2F1Z2UgaXMgMzUsIHNvIHRoYXQgdGhlIGZvY2FsIGxlbmd0aCBjYW4gYmUgc3Bl
Y2lmaWVkIGZvcgorCQkgKiBhIDM1bW0gKGZ1bGwgZnJhbWUpIGNhbWVyYS4KKwkJICoKKwkJICog
VmFsdWVzIGZvciBmb2NhbCBsZW5ndGggYW5kIGZpbG0gZ2F1Z2UgbXVzdCBoYXZlIHRoZSBzYW1l
IHVuaXQuCisJCSAqLworCQlzZXRGb2NhbExlbmd0aDogZnVuY3Rpb24gKCBmb2NhbExlbmd0aCAp
IHsKKworCQkJLy8gc2VlIGh0dHA6Ly93d3cuYm9iYXRraW5zLmNvbS9waG90b2dyYXBoeS90ZWNo
bmljYWwvZmllbGRfb2Zfdmlldy5odG1sCisJCQl2YXIgdkV4dGVudFNsb3BlID0gMC41ICogdGhp
cy5nZXRGaWxtSGVpZ2h0KCkgLyBmb2NhbExlbmd0aDsKKworCQkJdGhpcy5mb3YgPSBfTWF0aC5S
QUQyREVHICogMiAqIE1hdGguYXRhbiggdkV4dGVudFNsb3BlICk7CisJCQl0aGlzLnVwZGF0ZVBy
b2plY3Rpb25NYXRyaXgoKTsKKworCQl9LAorCisJCS8qKgorCQkgKiBDYWxjdWxhdGVzIHRoZSBm
b2NhbCBsZW5ndGggZnJvbSB0aGUgY3VycmVudCAuZm92IGFuZCAuZmlsbUdhdWdlLgorCQkgKi8K
KwkJZ2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHZFeHRlbnRTbG9wZSA9
IE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKTsKKworCQkJcmV0dXJu
IDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gdkV4dGVudFNsb3BlOworCisJCX0sCisKKwkJ
Z2V0RWZmZWN0aXZlRk9WOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBfTWF0aC5SQUQyREVH
ICogMiAqIE1hdGguYXRhbigKKwkJCQkJTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0
aGlzLmZvdiApIC8gdGhpcy56b29tICk7CisKKwkJfSwKKworCQlnZXRGaWxtV2lkdGg6IGZ1bmN0
aW9uICgpIHsKKworCQkJLy8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIHBvcnRyYWl0
IGZvcm1hdCAoYXNwZWN0IDwgMSkKKwkJCXJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWlu
KCB0aGlzLmFzcGVjdCwgMSApOworCisJCX0sCisKKwkJZ2V0RmlsbUhlaWdodDogZnVuY3Rpb24g
KCkgeworCisJCQkvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gbGFuZHNjYXBlIGZv
cm1hdCAoYXNwZWN0ID4gMSkKKwkJCXJldHVybiB0aGlzLmZpbG1HYXVnZSAvIE1hdGgubWF4KCB0
aGlzLmFzcGVjdCwgMSApOworCisJCX0sCisKKwkJLyoqCisJCSAqIFNldHMgYW4gb2Zmc2V0IGlu
IGEgbGFyZ2VyIGZydXN0dW0uIFRoaXMgaXMgdXNlZnVsIGZvciBtdWx0aS13aW5kb3cgb3IKKwkJ
ICogbXVsdGktbW9uaXRvci9tdWx0aS1tYWNoaW5lIHNldHVwcy4KKwkJICoKKwkJICogRm9yIGV4
YW1wbGUsIGlmIHlvdSBoYXZlIDN4MiBtb25pdG9ycyBhbmQgZWFjaCBtb25pdG9yIGlzIDE5MjB4
MTA4MCBhbmQKKwkJICogdGhlIG1vbml0b3JzIGFyZSBpbiBncmlkIGxpa2UgdGhpcworCQkgKgor
CQkgKiAgICstLS0rLS0tKy0tLSsKKwkJICogICB8IEEgfCBCIHwgQyB8CisJCSAqICAgKy0tLSst
LS0rLS0tKworCQkgKiAgIHwgRCB8IEUgfCBGIHwKKwkJICogICArLS0tKy0tLSstLS0rCisJCSAq
CisJCSAqIHRoZW4gZm9yIGVhY2ggbW9uaXRvciB5b3Ugd291bGQgY2FsbCBpdCBsaWtlIHRoaXMK
KwkJICoKKwkJICogICB2YXIgdyA9IDE5MjA7CisJCSAqICAgdmFyIGggPSAxMDgwOworCQkgKiAg
IHZhciBmdWxsV2lkdGggPSB3ICogMzsKKwkJICogICB2YXIgZnVsbEhlaWdodCA9IGggKiAyOwor
CQkgKgorCQkgKiAgIC0tQS0tCisJCSAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBm
dWxsSGVpZ2h0LCB3ICogMCwgaCAqIDAsIHcsIGggKTsKKwkJICogICAtLUItLQorCQkgKiAgIGNh
bWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAwLCB3LCBo
ICk7CisJCSAqICAgLS1DLS0KKwkJICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1
bGxIZWlnaHQsIHcgKiAyLCBoICogMCwgdywgaCApOworCQkgKiAgIC0tRC0tCisJCSAqICAgY2Ft
ZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMCwgaCAqIDEsIHcsIGgg
KTsKKwkJICogICAtLUUtLQorCQkgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVs
bEhlaWdodCwgdyAqIDEsIGggKiAxLCB3LCBoICk7CisJCSAqICAgLS1GLS0KKwkJICogICBjYW1l
cmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAyLCBoICogMSwgdywgaCAp
OworCQkgKgorCQkgKiAgIE5vdGUgdGhlcmUgaXMgbm8gcmVhc29uIG1vbml0b3JzIGhhdmUgdG8g
YmUgdGhlIHNhbWUgc2l6ZSBvciBpbiBhIGdyaWQuCisJCSAqLworCQlzZXRWaWV3T2Zmc2V0OiBm
dW5jdGlvbiAoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHsK
KworCQkJdGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0OworCisJCQl0aGlzLnZp
ZXcgPSB7CisJCQkJZnVsbFdpZHRoOiBmdWxsV2lkdGgsCisJCQkJZnVsbEhlaWdodDogZnVsbEhl
aWdodCwKKwkJCQlvZmZzZXRYOiB4LAorCQkJCW9mZnNldFk6IHksCisJCQkJd2lkdGg6IHdpZHRo
LAorCQkJCWhlaWdodDogaGVpZ2h0CisJCQl9OworCisJCQl0aGlzLnVwZGF0ZVByb2plY3Rpb25N
YXRyaXgoKTsKKworCQl9LAorCisJCWNsZWFyVmlld09mZnNldDogZnVuY3Rpb24gKCkgeworCisJ
CQl0aGlzLnZpZXcgPSBudWxsOworCQkJdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CisK
KwkJfSwKKworCQl1cGRhdGVQcm9qZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZh
ciBuZWFyID0gdGhpcy5uZWFyLAorCQkJCXRvcCA9IG5lYXIgKiBNYXRoLnRhbigKKwkJCQkJCV9N
YXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tLAorCQkJCWhlaWdodCA9
IDIgKiB0b3AsCisJCQkJd2lkdGggPSB0aGlzLmFzcGVjdCAqIGhlaWdodCwKKwkJCQlsZWZ0ID0g
LSAwLjUgKiB3aWR0aCwKKwkJCQl2aWV3ID0gdGhpcy52aWV3OworCisJCQlpZiAoIHZpZXcgIT09
IG51bGwgKSB7CisKKwkJCQl2YXIgZnVsbFdpZHRoID0gdmlldy5mdWxsV2lkdGgsCisJCQkJCWZ1
bGxIZWlnaHQgPSB2aWV3LmZ1bGxIZWlnaHQ7CisKKwkJCQlsZWZ0ICs9IHZpZXcub2Zmc2V0WCAq
IHdpZHRoIC8gZnVsbFdpZHRoOworCQkJCXRvcCAtPSB2aWV3Lm9mZnNldFkgKiBoZWlnaHQgLyBm
dWxsSGVpZ2h0OworCQkJCXdpZHRoICo9IHZpZXcud2lkdGggLyBmdWxsV2lkdGg7CisJCQkJaGVp
Z2h0ICo9IHZpZXcuaGVpZ2h0IC8gZnVsbEhlaWdodDsKKworCQkJfQorCisJCQl2YXIgc2tldyA9
IHRoaXMuZmlsbU9mZnNldDsKKwkJCWlmICggc2tldyAhPT0gMCApIGxlZnQgKz0gbmVhciAqIHNr
ZXcgLyB0aGlzLmdldEZpbG1XaWR0aCgpOworCisJCQl0aGlzLnByb2plY3Rpb25NYXRyaXgubWFr
ZVBlcnNwZWN0aXZlKCBsZWZ0LCBsZWZ0ICsgd2lkdGgsIHRvcCwgdG9wIC0gaGVpZ2h0LCBuZWFy
LCB0aGlzLmZhciApOworCisJCX0sCisKKwkJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CisK
KwkJCXZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRh
ICk7CisKKwkJCWRhdGEub2JqZWN0LmZvdiA9IHRoaXMuZm92OworCQkJZGF0YS5vYmplY3Quem9v
bSA9IHRoaXMuem9vbTsKKworCQkJZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjsKKwkJCWRh
dGEub2JqZWN0LmZhciA9IHRoaXMuZmFyOworCQkJZGF0YS5vYmplY3QuZm9jdXMgPSB0aGlzLmZv
Y3VzOworCisJCQlkYXRhLm9iamVjdC5hc3BlY3QgPSB0aGlzLmFzcGVjdDsKKworCQkJaWYgKCB0
aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30s
IHRoaXMudmlldyApOworCisJCQlkYXRhLm9iamVjdC5maWxtR2F1Z2UgPSB0aGlzLmZpbG1HYXVn
ZTsKKwkJCWRhdGEub2JqZWN0LmZpbG1PZmZzZXQgPSB0aGlzLmZpbG1PZmZzZXQ7CisKKwkJCXJl
dHVybiBkYXRhOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8g
aHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVk
cXVhbGlhLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEZhY2UzKCBhLCBiLCBjLCBub3JtYWwsIGNv
bG9yLCBtYXRlcmlhbEluZGV4ICkgeworCisJCXRoaXMuYSA9IGE7CisJCXRoaXMuYiA9IGI7CisJ
CXRoaXMuYyA9IGM7CisKKwkJdGhpcy5ub3JtYWwgPSAoIG5vcm1hbCAmJiBub3JtYWwuaXNWZWN0
b3IzICkgPyBub3JtYWwgOiBuZXcgVmVjdG9yMygpOworCQl0aGlzLnZlcnRleE5vcm1hbHMgPSBB
cnJheS5pc0FycmF5KCBub3JtYWwgKSA/IG5vcm1hbCA6IFtdOworCisJCXRoaXMuY29sb3IgPSAo
IGNvbG9yICYmIGNvbG9yLmlzQ29sb3IgKSA/IGNvbG9yIDogbmV3IENvbG9yKCk7CisJCXRoaXMu
dmVydGV4Q29sb3JzID0gQXJyYXkuaXNBcnJheSggY29sb3IgKSA/IGNvbG9yIDogW107CisKKwkJ
dGhpcy5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJp
YWxJbmRleCA6IDA7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBGYWNlMy5wcm90b3R5cGUsIHsK
KworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0
b3IoKS5jb3B5KCB0aGlzICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSAp
IHsKKworCQkJdGhpcy5hID0gc291cmNlLmE7CisJCQl0aGlzLmIgPSBzb3VyY2UuYjsKKwkJCXRo
aXMuYyA9IHNvdXJjZS5jOworCisJCQl0aGlzLm5vcm1hbC5jb3B5KCBzb3VyY2Uubm9ybWFsICk7
CisJCQl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworCisJCQl0aGlzLm1hdGVyaWFs
SW5kZXggPSBzb3VyY2UubWF0ZXJpYWxJbmRleDsKKworCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9
IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJdGhp
cy52ZXJ0ZXhOb3JtYWxzWyBpIF0gPSBzb3VyY2UudmVydGV4Tm9ybWFsc1sgaSBdLmNsb25lKCk7
CisKKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnMu
bGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQl0aGlzLnZlcnRleENvbG9yc1sgaSBdID0g
c291cmNlLnZlcnRleENvbG9yc1sgaSBdLmNsb25lKCk7CisKKwkJCX0KKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8v
bXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5v
cmcvCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkg
KiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLworCSAqIEBhdXRob3Ig
eno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKKwkgKiBAYXV0aG9yIGJo
b3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCisJICovCisKKwl2YXIgY291bnQgPSAwOworCWZ1bmN0
aW9uIEdlb21ldHJ5SWRDb3VudCgpIHsgcmV0dXJuIGNvdW50Kys7IH0KKworCWZ1bmN0aW9uIEdl
b21ldHJ5KCkgeworCisJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1
ZTogR2VvbWV0cnlJZENvdW50KCkgfSApOworCisJCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRl
VVVJRCgpOworCisJCXRoaXMubmFtZSA9ICcnOworCQl0aGlzLnR5cGUgPSAnR2VvbWV0cnknOwor
CisJCXRoaXMudmVydGljZXMgPSBbXTsKKwkJdGhpcy5jb2xvcnMgPSBbXTsKKwkJdGhpcy5mYWNl
cyA9IFtdOworCQl0aGlzLmZhY2VWZXJ0ZXhVdnMgPSBbW11dOworCisJCXRoaXMubW9ycGhUYXJn
ZXRzID0gW107CisJCXRoaXMubW9ycGhOb3JtYWxzID0gW107CisKKwkJdGhpcy5za2luV2VpZ2h0
cyA9IFtdOworCQl0aGlzLnNraW5JbmRpY2VzID0gW107CisKKwkJdGhpcy5saW5lRGlzdGFuY2Vz
ID0gW107CisKKwkJdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CisJCXRoaXMuYm91bmRpbmdTcGhl
cmUgPSBudWxsOworCisJCS8vIHVwZGF0ZSBmbGFncworCisJCXRoaXMuZWxlbWVudHNOZWVkVXBk
YXRlID0gZmFsc2U7CisJCXRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7CisJCXRoaXMu
dXZzTmVlZFVwZGF0ZSA9IGZhbHNlOworCQl0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7
CisJCXRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlOworCQl0aGlzLmxpbmVEaXN0YW5jZXNO
ZWVkVXBkYXRlID0gZmFsc2U7CisJCXRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlOworCisJ
fQorCisJT2JqZWN0LmFzc2lnbiggR2VvbWV0cnkucHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIu
cHJvdG90eXBlLCB7CisKKwkJaXNHZW9tZXRyeTogdHJ1ZSwKKworCQlhcHBseU1hdHJpeDogZnVu
Y3Rpb24gKCBtYXRyaXggKSB7CisKKwkJCXZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4Mygp
LmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7CisKKwkJCWZvciAoIHZhciBpID0gMCwgaWwgPSB0
aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJdmFyIHZlcnRleCA9
IHRoaXMudmVydGljZXNbIGkgXTsKKwkJCQl2ZXJ0ZXguYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsK
KworCQkJfQorCisJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkg
PCBpbDsgaSArKyApIHsKKworCQkJCXZhciBmYWNlID0gdGhpcy5mYWNlc1sgaSBdOworCQkJCWZh
Y2Uubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7CisKKwkJ
CQlmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGps
OyBqICsrICkgeworCisJCQkJCWZhY2UudmVydGV4Tm9ybWFsc1sgaiBdLmFwcGx5TWF0cml4Mygg
bm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCB0
aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkgeworCisJCQkJdGhpcy5jb21wdXRlQm91bmRpbmdC
b3goKTsKKworCQkJfQorCisJCQlpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7
CisKKwkJCQl0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOworCisJCQl9CisKKwkJCXRoaXMu
dmVydGljZXNOZWVkVXBkYXRlID0gdHJ1ZTsKKwkJCXRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0
cnVlOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXJvdGF0ZVg6IGZ1bmN0aW9uICgp
IHsKKworCQkJLy8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXMKKworCQkJdmFy
IG0xID0gbmV3IE1hdHJpeDQoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xl
ICkgeworCisJCQkJbTEubWFrZVJvdGF0aW9uWCggYW5nbGUgKTsKKworCQkJCXRoaXMuYXBwbHlN
YXRyaXgoIG0xICk7CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJfTsKKworCQl9KCksCisKKwkJ
cm90YXRlWTogZnVuY3Rpb24gKCkgeworCisJCQkvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdv
cmxkIHktYXhpcworCisJCQl2YXIgbTEgPSBuZXcgTWF0cml4NCgpOworCisJCQlyZXR1cm4gZnVu
Y3Rpb24gcm90YXRlWSggYW5nbGUgKSB7CisKKwkJCQltMS5tYWtlUm90YXRpb25ZKCBhbmdsZSAp
OworCisJCQkJdGhpcy5hcHBseU1hdHJpeCggbTEgKTsKKworCQkJCXJldHVybiB0aGlzOworCisJ
CQl9OworCisJCX0oKSwKKworCQlyb3RhdGVaOiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIHJvdGF0
ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzCisKKwkJCXZhciBtMSA9IG5ldyBNYXRyaXg0
KCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHsKKworCQkJCW0xLm1h
a2VSb3RhdGlvblooIGFuZ2xlICk7CisKKwkJCQl0aGlzLmFwcGx5TWF0cml4KCBtMSApOworCisJ
CQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCXRyYW5zbGF0ZTogZnVuY3Rp
b24gKCkgeworCisJCQkvLyB0cmFuc2xhdGUgZ2VvbWV0cnkKKworCQkJdmFyIG0xID0gbmV3IE1h
dHJpeDQoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiApIHsKKwor
CQkJCW0xLm1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApOworCisJCQkJdGhpcy5hcHBseU1hdHJp
eCggbTEgKTsKKworCQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKworCQlzY2Fs
ZTogZnVuY3Rpb24gKCkgeworCisJCQkvLyBzY2FsZSBnZW9tZXRyeQorCisJCQl2YXIgbTEgPSBu
ZXcgTWF0cml4NCgpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gc2NhbGUoIHgsIHksIHogKSB7CisK
KwkJCQltMS5tYWtlU2NhbGUoIHgsIHksIHogKTsKKworCQkJCXRoaXMuYXBwbHlNYXRyaXgoIG0x
ICk7CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJfTsKKworCQl9KCksCisKKwkJbG9va0F0OiBm
dW5jdGlvbiAoKSB7CisKKwkJCXZhciBvYmogPSBuZXcgT2JqZWN0M0QoKTsKKworCQkJcmV0dXJu
IGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkgeworCisJCQkJb2JqLmxvb2tBdCggdmVjdG9yICk7
CisKKwkJCQlvYmoudXBkYXRlTWF0cml4KCk7CisKKwkJCQl0aGlzLmFwcGx5TWF0cml4KCBvYmou
bWF0cml4ICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWZyb21CdWZmZXJHZW9tZXRyeTogZnVu
Y3Rpb24gKCBnZW9tZXRyeSApIHsKKworCQkJdmFyIHNjb3BlID0gdGhpczsKKworCQkJdmFyIGlu
ZGljZXMgPSBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCA/IGdlb21ldHJ5LmluZGV4LmFycmF5IDog
dW5kZWZpbmVkOworCQkJdmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOworCisJ
CQl2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTsKKwkJCXZhciBub3Jt
YWxzID0gYXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMubm9ybWFs
LmFycmF5IDogdW5kZWZpbmVkOworCQkJdmFyIGNvbG9ycyA9IGF0dHJpYnV0ZXMuY29sb3IgIT09
IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMuY29sb3IuYXJyYXkgOiB1bmRlZmluZWQ7CisJCQl2YXIg
dXZzID0gYXR0cmlidXRlcy51diAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy51di5hcnJheSA6
IHVuZGVmaW5lZDsKKwkJCXZhciB1dnMyID0gYXR0cmlidXRlcy51djIgIT09IHVuZGVmaW5lZCA/
IGF0dHJpYnV0ZXMudXYyLmFycmF5IDogdW5kZWZpbmVkOworCisJCQlpZiAoIHV2czIgIT09IHVu
ZGVmaW5lZCApIHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdID0gW107CisKKwkJCXZhciB0ZW1wTm9y
bWFscyA9IFtdOworCQkJdmFyIHRlbXBVVnMgPSBbXTsKKwkJCXZhciB0ZW1wVVZzMiA9IFtdOwor
CisJCQlmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAz
LCBqICs9IDIgKSB7CisKKwkJCQlzY29wZS52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9z
aXRpb25zWyBpIF0sIHBvc2l0aW9uc1sgaSArIDEgXSwgcG9zaXRpb25zWyBpICsgMiBdICkgKTsK
KworCQkJCWlmICggbm9ybWFscyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCXRlbXBOb3JtYWxz
LnB1c2goIG5ldyBWZWN0b3IzKCBub3JtYWxzWyBpIF0sIG5vcm1hbHNbIGkgKyAxIF0sIG5vcm1h
bHNbIGkgKyAyIF0gKSApOworCisJCQkJfQorCisJCQkJaWYgKCBjb2xvcnMgIT09IHVuZGVmaW5l
ZCApIHsKKworCQkJCQlzY29wZS5jb2xvcnMucHVzaCggbmV3IENvbG9yKCBjb2xvcnNbIGkgXSwg
Y29sb3JzWyBpICsgMSBdLCBjb2xvcnNbIGkgKyAyIF0gKSApOworCisJCQkJfQorCisJCQkJaWYg
KCB1dnMgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQl0ZW1wVVZzLnB1c2goIG5ldyBWZWN0b3Iy
KCB1dnNbIGogXSwgdXZzWyBqICsgMSBdICkgKTsKKworCQkJCX0KKworCQkJCWlmICggdXZzMiAh
PT0gdW5kZWZpbmVkICkgeworCisJCQkJCXRlbXBVVnMyLnB1c2goIG5ldyBWZWN0b3IyKCB1dnMy
WyBqIF0sIHV2czJbIGogKyAxIF0gKSApOworCisJCQkJfQorCisJCQl9CisKKwkJCWZ1bmN0aW9u
IGFkZEZhY2UoIGEsIGIsIGMsIG1hdGVyaWFsSW5kZXggKSB7CisKKwkJCQl2YXIgdmVydGV4Tm9y
bWFscyA9IG5vcm1hbHMgIT09IHVuZGVmaW5lZCA/IFsgdGVtcE5vcm1hbHNbIGEgXS5jbG9uZSgp
LCB0ZW1wTm9ybWFsc1sgYiBdLmNsb25lKCksIHRlbXBOb3JtYWxzWyBjIF0uY2xvbmUoKSBdIDog
W107CisJCQkJdmFyIHZlcnRleENvbG9ycyA9IGNvbG9ycyAhPT0gdW5kZWZpbmVkID8gWyBzY29w
ZS5jb2xvcnNbIGEgXS5jbG9uZSgpLCBzY29wZS5jb2xvcnNbIGIgXS5jbG9uZSgpLCBzY29wZS5j
b2xvcnNbIGMgXS5jbG9uZSgpIF0gOiBbXTsKKworCQkJCXZhciBmYWNlID0gbmV3IEZhY2UzKCBh
LCBiLCBjLCB2ZXJ0ZXhOb3JtYWxzLCB2ZXJ0ZXhDb2xvcnMsIG1hdGVyaWFsSW5kZXggKTsKKwor
CQkJCXNjb3BlLmZhY2VzLnB1c2goIGZhY2UgKTsKKworCQkJCWlmICggdXZzICE9PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCQkJc2NvcGUuZmFjZVZlcnRleFV2c1sgMCBdLnB1c2goIFsgdGVtcFVWc1sg
YSBdLmNsb25lKCksIHRlbXBVVnNbIGIgXS5jbG9uZSgpLCB0ZW1wVVZzWyBjIF0uY2xvbmUoKSBd
ICk7CisKKwkJCQl9CisKKwkJCQlpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQlz
Y29wZS5mYWNlVmVydGV4VXZzWyAxIF0ucHVzaCggWyB0ZW1wVVZzMlsgYSBdLmNsb25lKCksIHRl
bXBVVnMyWyBiIF0uY2xvbmUoKSwgdGVtcFVWczJbIGMgXS5jbG9uZSgpIF0gKTsKKworCQkJCX0K
KworCQkJfQorCisJCQl2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOworCisJCQlpZiAoIGdy
b3Vwcy5sZW5ndGggPiAwICkgeworCisJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxl
bmd0aDsgaSArKyApIHsKKworCQkJCQl2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTsKKworCQkJCQl2
YXIgc3RhcnQgPSBncm91cC5zdGFydDsKKwkJCQkJdmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7CisK
KwkJCQkJZm9yICggdmFyIGogPSBzdGFydCwgamwgPSBzdGFydCArIGNvdW50OyBqIDwgamw7IGog
Kz0gMyApIHsKKworCQkJCQkJaWYgKCBpbmRpY2VzICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJ
CQlhZGRGYWNlKCBpbmRpY2VzWyBqIF0sIGluZGljZXNbIGogKyAxIF0sIGluZGljZXNbIGogKyAy
IF0sIGdyb3VwLm1hdGVyaWFsSW5kZXggKTsKKworCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCWFk
ZEZhY2UoIGosIGogKyAxLCBqICsgMiwgZ3JvdXAubWF0ZXJpYWxJbmRleCApOworCisJCQkJCQl9
CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJaWYgKCBpbmRpY2VzICE9
PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5n
dGg7IGkgKz0gMyApIHsKKworCQkJCQkJYWRkRmFjZSggaW5kaWNlc1sgaSBdLCBpbmRpY2VzWyBp
ICsgMSBdLCBpbmRpY2VzWyBpICsgMiBdICk7CisKKwkJCQkJfQorCisJCQkJfSBlbHNlIHsKKwor
CQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC8gMzsgaSArPSAzICkg
eworCisJCQkJCQlhZGRGYWNlKCBpLCBpICsgMSwgaSArIDIgKTsKKworCQkJCQl9CisKKwkJCQl9
CisKKwkJCX0KKworCQkJdGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTsKKworCQkJaWYgKCBnZW9t
ZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKKworCQkJCXRoaXMuYm91bmRpbmdCb3ggPSBn
ZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpOworCisJCQl9CisKKwkJCWlmICggZ2VvbWV0cnku
Ym91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CisKKwkJCQl0aGlzLmJvdW5kaW5nU3BoZXJlID0g
Z2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhp
czsKKworCQl9LAorCisJCWNlbnRlcjogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLmNvbXB1dGVC
b3VuZGluZ0JveCgpOworCisJCQl2YXIgb2Zmc2V0ID0gdGhpcy5ib3VuZGluZ0JveC5nZXRDZW50
ZXIoKS5uZWdhdGUoKTsKKworCQkJdGhpcy50cmFuc2xhdGUoIG9mZnNldC54LCBvZmZzZXQueSwg
b2Zmc2V0LnogKTsKKworCQkJcmV0dXJuIG9mZnNldDsKKworCQl9LAorCisJCW5vcm1hbGl6ZTog
ZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOworCisJCQl2
YXIgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7CisJCQl2YXIgcmFkaXVzID0g
dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM7CisKKwkJCXZhciBzID0gcmFkaXVzID09PSAwID8g
MSA6IDEuMCAvIHJhZGl1czsKKworCQkJdmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CisJCQlt
YXRyaXguc2V0KAorCQkJCXMsIDAsIDAsIC0gcyAqIGNlbnRlci54LAorCQkJCTAsIHMsIDAsIC0g
cyAqIGNlbnRlci55LAorCQkJCTAsIDAsIHMsIC0gcyAqIGNlbnRlci56LAorCQkJCTAsIDAsIDAs
IDEKKwkJCSk7CisKKwkJCXRoaXMuYXBwbHlNYXRyaXgoIG1hdHJpeCApOworCisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCWNvbXB1dGVGYWNlTm9ybWFsczogZnVuY3Rpb24gKCkgeworCisJ
CQl2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCWZvciAo
IHZhciBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgeworCisJ
CQkJdmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07CisKKwkJCQl2YXIgdkEgPSB0aGlzLnZlcnRp
Y2VzWyBmYWNlLmEgXTsKKwkJCQl2YXIgdkIgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmIgXTsKKwkJ
CQl2YXIgdkMgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmMgXTsKKworCQkJCWNiLnN1YlZlY3RvcnMo
IHZDLCB2QiApOworCQkJCWFiLnN1YlZlY3RvcnMoIHZBLCB2QiApOworCQkJCWNiLmNyb3NzKCBh
YiApOworCisJCQkJY2Iubm9ybWFsaXplKCk7CisKKwkJCQlmYWNlLm5vcm1hbC5jb3B5KCBjYiAp
OworCisJCQl9CisKKwkJfSwKKworCQljb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCBh
cmVhV2VpZ2h0ZWQgKSB7CisKKwkJCWlmICggYXJlYVdlaWdodGVkID09PSB1bmRlZmluZWQgKSBh
cmVhV2VpZ2h0ZWQgPSB0cnVlOworCisJCQl2YXIgdiwgdmwsIGYsIGZsLCBmYWNlLCB2ZXJ0aWNl
czsKKworCQkJdmVydGljZXMgPSBuZXcgQXJyYXkoIHRoaXMudmVydGljZXMubGVuZ3RoICk7CisK
KwkJCWZvciAoIHYgPSAwLCB2bCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKysg
KSB7CisKKwkJCQl2ZXJ0aWNlc1sgdiBdID0gbmV3IFZlY3RvcjMoKTsKKworCQkJfQorCisJCQlp
ZiAoIGFyZWFXZWlnaHRlZCApIHsKKworCQkJCS8vIHZlcnRleCBub3JtYWxzIHdlaWdodGVkIGJ5
IHRyaWFuZ2xlIGFyZWFzCisJCQkJLy8gaHR0cDovL3d3dy5pcXVpbGV6bGVzLm9yZy93d3cvYXJ0
aWNsZXMvbm9ybWFscy9ub3JtYWxzLmh0bQorCisJCQkJdmFyIHZBLCB2QiwgdkM7CisJCQkJdmFy
IGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpOworCisJCQkJZm9yICggZiA9
IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKKworCQkJCQlmYWNl
ID0gdGhpcy5mYWNlc1sgZiBdOworCisJCQkJCXZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07
CisJCQkJCXZCID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5iIF07CisJCQkJCXZDID0gdGhpcy52ZXJ0
aWNlc1sgZmFjZS5jIF07CisKKwkJCQkJY2Iuc3ViVmVjdG9ycyggdkMsIHZCICk7CisJCQkJCWFi
LnN1YlZlY3RvcnMoIHZBLCB2QiApOworCQkJCQljYi5jcm9zcyggYWIgKTsKKworCQkJCQl2ZXJ0
aWNlc1sgZmFjZS5hIF0uYWRkKCBjYiApOworCQkJCQl2ZXJ0aWNlc1sgZmFjZS5iIF0uYWRkKCBj
YiApOworCQkJCQl2ZXJ0aWNlc1sgZmFjZS5jIF0uYWRkKCBjYiApOworCisJCQkJfQorCisJCQl9
IGVsc2UgeworCisJCQkJdGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTsKKworCQkJCWZvciAoIGYg
PSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CisKKwkJCQkJZmFj
ZSA9IHRoaXMuZmFjZXNbIGYgXTsKKworCQkJCQl2ZXJ0aWNlc1sgZmFjZS5hIF0uYWRkKCBmYWNl
Lm5vcm1hbCApOworCQkJCQl2ZXJ0aWNlc1sgZmFjZS5iIF0uYWRkKCBmYWNlLm5vcm1hbCApOwor
CQkJCQl2ZXJ0aWNlc1sgZmFjZS5jIF0uYWRkKCBmYWNlLm5vcm1hbCApOworCisJCQkJfQorCisJ
CQl9CisKKwkJCWZvciAoIHYgPSAwLCB2bCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyB2IDwgdmw7
IHYgKysgKSB7CisKKwkJCQl2ZXJ0aWNlc1sgdiBdLm5vcm1hbGl6ZSgpOworCisJCQl9CisKKwkJ
CWZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CisK
KwkJCQlmYWNlID0gdGhpcy5mYWNlc1sgZiBdOworCisJCQkJdmFyIHZlcnRleE5vcm1hbHMgPSBm
YWNlLnZlcnRleE5vcm1hbHM7CisKKwkJCQlpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAz
ICkgeworCisJCQkJCXZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5hIF0g
KTsKKwkJCQkJdmVydGV4Tm9ybWFsc1sgMSBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmIgXSApOwor
CQkJCQl2ZXJ0ZXhOb3JtYWxzWyAyIF0uY29weSggdmVydGljZXNbIGZhY2UuYyBdICk7CisKKwkJ
CQl9IGVsc2UgeworCisJCQkJCXZlcnRleE5vcm1hbHNbIDAgXSA9IHZlcnRpY2VzWyBmYWNlLmEg
XS5jbG9uZSgpOworCQkJCQl2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSB2ZXJ0aWNlc1sgZmFjZS5iIF0u
Y2xvbmUoKTsKKwkJCQkJdmVydGV4Tm9ybWFsc1sgMiBdID0gdmVydGljZXNbIGZhY2UuYyBdLmNs
b25lKCk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAg
KSB7CisKKwkJCQl0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTsKKworCQkJfQorCisJCX0s
CisKKwkJY29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBm
LCBmbCwgZmFjZTsKKworCQkJdGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTsKKworCQkJZm9yICgg
ZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKKworCQkJCWZh
Y2UgPSB0aGlzLmZhY2VzWyBmIF07CisKKwkJCQl2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVy
dGV4Tm9ybWFsczsKKworCQkJCWlmICggdmVydGV4Tm9ybWFscy5sZW5ndGggPT09IDMgKSB7CisK
KwkJCQkJdmVydGV4Tm9ybWFsc1sgMCBdLmNvcHkoIGZhY2Uubm9ybWFsICk7CisJCQkJCXZlcnRl
eE5vcm1hbHNbIDEgXS5jb3B5KCBmYWNlLm5vcm1hbCApOworCQkJCQl2ZXJ0ZXhOb3JtYWxzWyAy
IF0uY29weSggZmFjZS5ub3JtYWwgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJdmVydGV4Tm9y
bWFsc1sgMCBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTsKKwkJCQkJdmVydGV4Tm9ybWFsc1sgMSBd
ID0gZmFjZS5ub3JtYWwuY2xvbmUoKTsKKwkJCQkJdmVydGV4Tm9ybWFsc1sgMiBdID0gZmFjZS5u
b3JtYWwuY2xvbmUoKTsKKworCQkJCX0KKworCQkJfQorCisJCQlpZiAoIHRoaXMuZmFjZXMubGVu
Z3RoID4gMCApIHsKKworCQkJCXRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlOworCisJCQl9
CisKKwkJfSwKKworCQljb21wdXRlTW9ycGhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZh
ciBpLCBpbCwgZiwgZmwsIGZhY2U7CisKKwkJCS8vIHNhdmUgb3JpZ2luYWwgbm9ybWFscworCQkJ
Ly8gLSBjcmVhdGUgdGVtcCB2YXJpYWJsZXMgb24gZmlyc3QgYWNjZXNzCisJCQkvLyAgIG90aGVy
d2lzZSBqdXN0IGNvcHkgKGZvciBmYXN0ZXIgcmVwZWF0ZWQgY2FsbHMpCisKKwkJCWZvciAoIGYg
PSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CisKKwkJCQlmYWNl
ID0gdGhpcy5mYWNlc1sgZiBdOworCisJCQkJaWYgKCAhIGZhY2UuX19vcmlnaW5hbEZhY2VOb3Jt
YWwgKSB7CisKKwkJCQkJZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmNs
b25lKCk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCWZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwu
Y29weSggZmFjZS5ub3JtYWwgKTsKKworCQkJCX0KKworCQkJCWlmICggISBmYWNlLl9fb3JpZ2lu
YWxWZXJ0ZXhOb3JtYWxzICkgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyA9IFtdOworCisJ
CQkJZm9yICggaSA9IDAsIGlsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBp
ICsrICkgeworCisJCQkJCWlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0g
KSB7CisKKwkJCQkJCWZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXSA9IGZhY2UudmVy
dGV4Tm9ybWFsc1sgaSBdLmNsb25lKCk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJZmFjZS5f
X29yaWdpbmFsVmVydGV4Tm9ybWFsc1sgaSBdLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgaSBd
ICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJCS8vIHVzZSB0ZW1wIGdlb21ldHJ5
IHRvIGNvbXB1dGUgZmFjZSBhbmQgdmVydGV4IG5vcm1hbHMgZm9yIGVhY2ggbW9ycGgKKworCQkJ
dmFyIHRtcEdlbyA9IG5ldyBHZW9tZXRyeSgpOworCQkJdG1wR2VvLmZhY2VzID0gdGhpcy5mYWNl
czsKKworCQkJZm9yICggaSA9IDAsIGlsID0gdGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwg
aWw7IGkgKysgKSB7CisKKwkJCQkvLyBjcmVhdGUgb24gZmlyc3QgYWNjZXNzCisKKwkJCQlpZiAo
ICEgdGhpcy5tb3JwaE5vcm1hbHNbIGkgXSApIHsKKworCQkJCQl0aGlzLm1vcnBoTm9ybWFsc1sg
aSBdID0ge307CisJCQkJCXRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMgPSBbXTsK
KwkJCQkJdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzID0gW107CisKKwkJCQkJ
dmFyIGRzdE5vcm1hbHNGYWNlID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFsczsK
KwkJCQkJdmFyIGRzdE5vcm1hbHNWZXJ0ZXggPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLnZlcnRl
eE5vcm1hbHM7CisKKwkJCQkJdmFyIGZhY2VOb3JtYWwsIHZlcnRleE5vcm1hbHM7CisKKwkJCQkJ
Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKKwor
CQkJCQkJZmFjZU5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CisJCQkJCQl2ZXJ0ZXhOb3JtYWxzID0g
eyBhOiBuZXcgVmVjdG9yMygpLCBiOiBuZXcgVmVjdG9yMygpLCBjOiBuZXcgVmVjdG9yMygpIH07
CisKKwkJCQkJCWRzdE5vcm1hbHNGYWNlLnB1c2goIGZhY2VOb3JtYWwgKTsKKwkJCQkJCWRzdE5v
cm1hbHNWZXJ0ZXgucHVzaCggdmVydGV4Tm9ybWFscyApOworCisJCQkJCX0KKworCQkJCX0KKwor
CQkJCXZhciBtb3JwaE5vcm1hbHMgPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdOworCisJCQkJLy8g
c2V0IHZlcnRpY2VzIHRvIG1vcnBoIHRhcmdldAorCisJCQkJdG1wR2VvLnZlcnRpY2VzID0gdGhp
cy5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlczsKKworCQkJCS8vIGNvbXB1dGUgbW9ycGggbm9y
bWFscworCisJCQkJdG1wR2VvLmNvbXB1dGVGYWNlTm9ybWFscygpOworCQkJCXRtcEdlby5jb21w
dXRlVmVydGV4Tm9ybWFscygpOworCisJCQkJLy8gc3RvcmUgbW9ycGggbm9ybWFscworCisJCQkJ
dmFyIGZhY2VOb3JtYWwsIHZlcnRleE5vcm1hbHM7CisKKwkJCQlmb3IgKCBmID0gMCwgZmwgPSB0
aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgeworCisJCQkJCWZhY2UgPSB0aGlzLmZh
Y2VzWyBmIF07CisKKwkJCQkJZmFjZU5vcm1hbCA9IG1vcnBoTm9ybWFscy5mYWNlTm9ybWFsc1sg
ZiBdOworCQkJCQl2ZXJ0ZXhOb3JtYWxzID0gbW9ycGhOb3JtYWxzLnZlcnRleE5vcm1hbHNbIGYg
XTsKKworCQkJCQlmYWNlTm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7CisKKwkJCQkJdmVydGV4
Tm9ybWFscy5hLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMCBdICk7CisJCQkJCXZlcnRleE5v
cm1hbHMuYi5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDEgXSApOworCQkJCQl2ZXJ0ZXhOb3Jt
YWxzLmMuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAyIF0gKTsKKworCQkJCX0KKworCQkJfQor
CisJCQkvLyByZXN0b3JlIG9yaWdpbmFsIG5vcm1hbHMKKworCQkJZm9yICggZiA9IDAsIGZsID0g
dGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKKworCQkJCWZhY2UgPSB0aGlzLmZh
Y2VzWyBmIF07CisKKwkJCQlmYWNlLm5vcm1hbCA9IGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWw7
CisJCQkJZmFjZS52ZXJ0ZXhOb3JtYWxzID0gZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsczsK
KworCQkJfQorCisJCX0sCisKKwkJY29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHsK
KworCQkJdmFyIGQgPSAwOworCQkJdmFyIHZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlczsKKworCQkJ
Zm9yICggdmFyIGkgPSAwLCBpbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewor
CisJCQkJaWYgKCBpID4gMCApIHsKKworCQkJCQlkICs9IHZlcnRpY2VzWyBpIF0uZGlzdGFuY2VU
byggdmVydGljZXNbIGkgLSAxIF0gKTsKKworCQkJCX0KKworCQkJCXRoaXMubGluZURpc3RhbmNl
c1sgaSBdID0gZDsKKworCQkJfQorCisJCX0sCisKKwkJY29tcHV0ZUJvdW5kaW5nQm94OiBmdW5j
dGlvbiAoKSB7CisKKwkJCWlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHsKKworCQkJ
CXRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpOworCisJCQl9CisKKwkJCXRoaXMuYm91bmRp
bmdCb3guc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApOworCisJCX0sCisKKwkJY29tcHV0
ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7CisKKwkJCWlmICggdGhpcy5ib3VuZGluZ1Nw
aGVyZSA9PT0gbnVsbCApIHsKKworCQkJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJl
KCk7CisKKwkJCX0KKworCQkJdGhpcy5ib3VuZGluZ1NwaGVyZS5zZXRGcm9tUG9pbnRzKCB0aGlz
LnZlcnRpY2VzICk7CisKKwkJfSwKKworCQltZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgbWF0
cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgeworCisJCQlpZiAoICEgKCBnZW9tZXRyeSAmJiBn
ZW9tZXRyeS5pc0dlb21ldHJ5ICkgKSB7CisKKwkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuR2Vv
bWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkdlb21ldHJ5
LicsIGdlb21ldHJ5ICk7CisJCQkJcmV0dXJuOworCisJCQl9CisKKwkJCXZhciBub3JtYWxNYXRy
aXgsCisJCQkJdmVydGV4T2Zmc2V0ID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGgsCisJCQkJdmVydGlj
ZXMxID0gdGhpcy52ZXJ0aWNlcywKKwkJCQl2ZXJ0aWNlczIgPSBnZW9tZXRyeS52ZXJ0aWNlcywK
KwkJCQlmYWNlczEgPSB0aGlzLmZhY2VzLAorCQkJCWZhY2VzMiA9IGdlb21ldHJ5LmZhY2VzLAor
CQkJCXV2czEgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXSwKKwkJCQl1dnMyID0gZ2VvbWV0cnku
ZmFjZVZlcnRleFV2c1sgMCBdLAorCQkJCWNvbG9yczEgPSB0aGlzLmNvbG9ycywKKwkJCQljb2xv
cnMyID0gZ2VvbWV0cnkuY29sb3JzOworCisJCQlpZiAoIG1hdGVyaWFsSW5kZXhPZmZzZXQgPT09
IHVuZGVmaW5lZCApIG1hdGVyaWFsSW5kZXhPZmZzZXQgPSAwOworCisJCQlpZiAoIG1hdHJpeCAh
PT0gdW5kZWZpbmVkICkgeworCisJCQkJbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXRO
b3JtYWxNYXRyaXgoIG1hdHJpeCApOworCisJCQl9CisKKwkJCS8vIHZlcnRpY2VzCisKKwkJCWZv
ciAoIHZhciBpID0gMCwgaWwgPSB2ZXJ0aWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisK
KwkJCQl2YXIgdmVydGV4ID0gdmVydGljZXMyWyBpIF07CisKKwkJCQl2YXIgdmVydGV4Q29weSA9
IHZlcnRleC5jbG9uZSgpOworCisJCQkJaWYgKCBtYXRyaXggIT09IHVuZGVmaW5lZCApIHZlcnRl
eENvcHkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKKworCQkJCXZlcnRpY2VzMS5wdXNoKCB2ZXJ0
ZXhDb3B5ICk7CisKKwkJCX0KKworCQkJLy8gY29sb3JzCisKKwkJCWZvciAoIHZhciBpID0gMCwg
aWwgPSBjb2xvcnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJY29sb3JzMS5wdXNo
KCBjb2xvcnMyWyBpIF0uY2xvbmUoKSApOworCisJCQl9CisKKwkJCS8vIGZhY2VzCisKKwkJCWZv
ciAoIGkgPSAwLCBpbCA9IGZhY2VzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJCXZh
ciBmYWNlID0gZmFjZXMyWyBpIF0sIGZhY2VDb3B5LCBub3JtYWwsIGNvbG9yLAorCQkJCQlmYWNl
VmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscywKKwkJCQkJZmFjZVZlcnRleENvbG9y
cyA9IGZhY2UudmVydGV4Q29sb3JzOworCisJCQkJZmFjZUNvcHkgPSBuZXcgRmFjZTMoIGZhY2Uu
YSArIHZlcnRleE9mZnNldCwgZmFjZS5iICsgdmVydGV4T2Zmc2V0LCBmYWNlLmMgKyB2ZXJ0ZXhP
ZmZzZXQgKTsKKwkJCQlmYWNlQ29weS5ub3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTsKKworCQkJ
CWlmICggbm9ybWFsTWF0cml4ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJZmFjZUNvcHkubm9y
bWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7CisKKwkJCQl9CisK
KwkJCQlmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZVZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwg
amw7IGogKysgKSB7CisKKwkJCQkJbm9ybWFsID0gZmFjZVZlcnRleE5vcm1hbHNbIGogXS5jbG9u
ZSgpOworCisJCQkJCWlmICggbm9ybWFsTWF0cml4ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJ
CW5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOworCisJCQkJ
CX0KKworCQkJCQlmYWNlQ29weS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApOworCisJCQkJ
fQorCisJCQkJZmFjZUNvcHkuY29sb3IuY29weSggZmFjZS5jb2xvciApOworCisJCQkJZm9yICgg
dmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhDb2xvcnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7
CisKKwkJCQkJY29sb3IgPSBmYWNlVmVydGV4Q29sb3JzWyBqIF07CisJCQkJCWZhY2VDb3B5LnZl
cnRleENvbG9ycy5wdXNoKCBjb2xvci5jbG9uZSgpICk7CisKKwkJCQl9CisKKwkJCQlmYWNlQ29w
eS5tYXRlcmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4ICsgbWF0ZXJpYWxJbmRleE9mZnNl
dDsKKworCQkJCWZhY2VzMS5wdXNoKCBmYWNlQ29weSApOworCisJCQl9CisKKwkJCS8vIHV2cwor
CisJCQlmb3IgKCBpID0gMCwgaWwgPSB1dnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJ
CQkJdmFyIHV2ID0gdXZzMlsgaSBdLCB1dkNvcHkgPSBbXTsKKworCQkJCWlmICggdXYgPT09IHVu
ZGVmaW5lZCApIHsKKworCQkJCQljb250aW51ZTsKKworCQkJCX0KKworCQkJCWZvciAoIHZhciBq
ID0gMCwgamwgPSB1di5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKKworCQkJCQl1dkNvcHkucHVz
aCggdXZbIGogXS5jbG9uZSgpICk7CisKKwkJCQl9CisKKwkJCQl1dnMxLnB1c2goIHV2Q29weSAp
OworCisJCQl9CisKKwkJfSwKKworCQltZXJnZU1lc2g6IGZ1bmN0aW9uICggbWVzaCApIHsKKwor
CQkJaWYgKCAhICggbWVzaCAmJiBtZXNoLmlzTWVzaCApICkgeworCisJCQkJY29uc29sZS5lcnJv
ciggJ1RIUkVFLkdlb21ldHJ5Lm1lcmdlTWVzaCgpOiBtZXNoIG5vdCBhbiBpbnN0YW5jZSBvZiBU
SFJFRS5NZXNoLicsIG1lc2ggKTsKKwkJCQlyZXR1cm47CisKKwkJCX0KKworCQkJbWVzaC5tYXRy
aXhBdXRvVXBkYXRlICYmIG1lc2gudXBkYXRlTWF0cml4KCk7CisKKwkJCXRoaXMubWVyZ2UoIG1l
c2guZ2VvbWV0cnksIG1lc2gubWF0cml4ICk7CisKKwkJfSwKKworCQkvKgorCQkgKiBDaGVja3Mg
Zm9yIGR1cGxpY2F0ZSB2ZXJ0aWNlcyB3aXRoIGhhc2htYXAuCisJCSAqIER1cGxpY2F0ZWQgdmVy
dGljZXMgYXJlIHJlbW92ZWQKKwkJICogYW5kIGZhY2VzJyB2ZXJ0aWNlcyBhcmUgdXBkYXRlZC4K
KwkJICovCisKKwkJbWVyZ2VWZXJ0aWNlczogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdmVydGlj
ZXNNYXAgPSB7fTsgLy8gSGFzaG1hcCBmb3IgbG9va2luZyB1cCB2ZXJ0aWNlcyBieSBwb3NpdGlv
biBjb29yZGluYXRlcyAoYW5kIG1ha2luZyBzdXJlIHRoZXkgYXJlIHVuaXF1ZSkKKwkJCXZhciB1
bmlxdWUgPSBbXSwgY2hhbmdlcyA9IFtdOworCisJCQl2YXIgdiwga2V5OworCQkJdmFyIHByZWNp
c2lvblBvaW50cyA9IDQ7IC8vIG51bWJlciBvZiBkZWNpbWFsIHBvaW50cywgZS5nLiA0IGZvciBl
cHNpbG9uIG9mIDAuMDAwMQorCQkJdmFyIHByZWNpc2lvbiA9IE1hdGgucG93KCAxMCwgcHJlY2lz
aW9uUG9pbnRzICk7CisJCQl2YXIgaSwgaWwsIGZhY2U7CisJCQl2YXIgaW5kaWNlcywgaiwgamw7
CisKKwkJCWZvciAoIGkgPSAwLCBpbCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkg
KysgKSB7CisKKwkJCQl2ID0gdGhpcy52ZXJ0aWNlc1sgaSBdOworCQkJCWtleSA9IE1hdGgucm91
bmQoIHYueCAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi55ICogcHJlY2lzaW9u
ICkgKyAnXycgKyBNYXRoLnJvdW5kKCB2LnogKiBwcmVjaXNpb24gKTsKKworCQkJCWlmICggdmVy
dGljZXNNYXBbIGtleSBdID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJdmVydGljZXNNYXBbIGtl
eSBdID0gaTsKKwkJCQkJdW5pcXVlLnB1c2goIHRoaXMudmVydGljZXNbIGkgXSApOworCQkJCQlj
aGFuZ2VzWyBpIF0gPSB1bmlxdWUubGVuZ3RoIC0gMTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJ
Ly9jb25zb2xlLmxvZygnRHVwbGljYXRlIHZlcnRleCBmb3VuZC4gJywgaSwgJyBjb3VsZCBiZSB1
c2luZyAnLCB2ZXJ0aWNlc01hcFtrZXldKTsKKwkJCQkJY2hhbmdlc1sgaSBdID0gY2hhbmdlc1sg
dmVydGljZXNNYXBbIGtleSBdIF07CisKKwkJCQl9CisKKwkJCX0KKworCisJCQkvLyBpZiBmYWNl
cyBhcmUgY29tcGxldGVseSBkZWdlbmVyYXRlIGFmdGVyIG1lcmdpbmcgdmVydGljZXMsIHdlCisJ
CQkvLyBoYXZlIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlIGdlb21ldHJ5LgorCQkJdmFyIGZhY2VJ
bmRpY2VzVG9SZW1vdmUgPSBbXTsKKworCQkJZm9yICggaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5s
ZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJCWZhY2UgPSB0aGlzLmZhY2VzWyBpIF07CisK
KwkJCQlmYWNlLmEgPSBjaGFuZ2VzWyBmYWNlLmEgXTsKKwkJCQlmYWNlLmIgPSBjaGFuZ2VzWyBm
YWNlLmIgXTsKKwkJCQlmYWNlLmMgPSBjaGFuZ2VzWyBmYWNlLmMgXTsKKworCQkJCWluZGljZXMg
PSBbIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgXTsKKworCQkJCS8vIGlmIGFueSBkdXBsaWNhdGUg
dmVydGljZXMgYXJlIGZvdW5kIGluIGEgRmFjZTMKKwkJCQkvLyB3ZSBoYXZlIHRvIHJlbW92ZSB0
aGUgZmFjZSBhcyBub3RoaW5nIGNhbiBiZSBzYXZlZAorCQkJCWZvciAoIHZhciBuID0gMDsgbiA8
IDM7IG4gKysgKSB7CisKKwkJCQkJaWYgKCBpbmRpY2VzWyBuIF0gPT09IGluZGljZXNbICggbiAr
IDEgKSAlIDMgXSApIHsKKworCQkJCQkJZmFjZUluZGljZXNUb1JlbW92ZS5wdXNoKCBpICk7CisJ
CQkJCQlicmVhazsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQkJZm9yICggaSA9IGZh
Y2VJbmRpY2VzVG9SZW1vdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC0tICkgeworCisJCQkJdmFy
IGlkeCA9IGZhY2VJbmRpY2VzVG9SZW1vdmVbIGkgXTsKKworCQkJCXRoaXMuZmFjZXMuc3BsaWNl
KCBpZHgsIDEgKTsKKworCQkJCWZvciAoIGogPSAwLCBqbCA9IHRoaXMuZmFjZVZlcnRleFV2cy5s
ZW5ndGg7IGogPCBqbDsgaiArKyApIHsKKworCQkJCQl0aGlzLmZhY2VWZXJ0ZXhVdnNbIGogXS5z
cGxpY2UoIGlkeCwgMSApOworCisJCQkJfQorCisJCQl9CisKKwkJCS8vIFVzZSB1bmlxdWUgc2V0
IG9mIHZlcnRpY2VzCisKKwkJCXZhciBkaWZmID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGggLSB1bmlx
dWUubGVuZ3RoOworCQkJdGhpcy52ZXJ0aWNlcyA9IHVuaXF1ZTsKKwkJCXJldHVybiBkaWZmOwor
CisJCX0sCisKKwkJc29ydEZhY2VzQnlNYXRlcmlhbEluZGV4OiBmdW5jdGlvbiAoKSB7CisKKwkJ
CXZhciBmYWNlcyA9IHRoaXMuZmFjZXM7CisJCQl2YXIgbGVuZ3RoID0gZmFjZXMubGVuZ3RoOwor
CisJCQkvLyB0YWcgZmFjZXMKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsr
ICkgeworCisJCQkJZmFjZXNbIGkgXS5faWQgPSBpOworCisJCQl9CisKKwkJCS8vIHNvcnQgZmFj
ZXMKKworCQkJZnVuY3Rpb24gbWF0ZXJpYWxJbmRleFNvcnQoIGEsIGIgKSB7CisKKwkJCQlyZXR1
cm4gYS5tYXRlcmlhbEluZGV4IC0gYi5tYXRlcmlhbEluZGV4OworCisJCQl9CisKKwkJCWZhY2Vz
LnNvcnQoIG1hdGVyaWFsSW5kZXhTb3J0ICk7CisKKwkJCS8vIHNvcnQgdXZzCisKKwkJCXZhciB1
dnMxID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF07CisJCQl2YXIgdXZzMiA9IHRoaXMuZmFjZVZl
cnRleFV2c1sgMSBdOworCisJCQl2YXIgbmV3VXZzMSwgbmV3VXZzMjsKKworCQkJaWYgKCB1dnMx
ICYmIHV2czEubGVuZ3RoID09PSBsZW5ndGggKSBuZXdVdnMxID0gW107CisJCQlpZiAoIHV2czIg
JiYgdXZzMi5sZW5ndGggPT09IGxlbmd0aCApIG5ld1V2czIgPSBbXTsKKworCQkJZm9yICggdmFy
IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkgeworCisJCQkJdmFyIGlkID0gZmFjZXNbIGkgXS5f
aWQ7CisKKwkJCQlpZiAoIG5ld1V2czEgKSBuZXdVdnMxLnB1c2goIHV2czFbIGlkIF0gKTsKKwkJ
CQlpZiAoIG5ld1V2czIgKSBuZXdVdnMyLnB1c2goIHV2czJbIGlkIF0gKTsKKworCQkJfQorCisJ
CQlpZiAoIG5ld1V2czEgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXSA9IG5ld1V2czE7CisJCQlp
ZiAoIG5ld1V2czIgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IG5ld1V2czI7CisKKwkJfSwK
KworCQl0b0pTT046IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGRhdGEgPSB7CisJCQkJbWV0YWRh
dGE6IHsKKwkJCQkJdmVyc2lvbjogNC41LAorCQkJCQl0eXBlOiAnR2VvbWV0cnknLAorCQkJCQln
ZW5lcmF0b3I6ICdHZW9tZXRyeS50b0pTT04nCisJCQkJfQorCQkJfTsKKworCQkJLy8gc3RhbmRh
cmQgR2VvbWV0cnkgc2VyaWFsaXphdGlvbgorCisJCQlkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7CisJ
CQlkYXRhLnR5cGUgPSB0aGlzLnR5cGU7CisJCQlpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRh
Lm5hbWUgPSB0aGlzLm5hbWU7CisKKwkJCWlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCQl2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVyczsKKworCQkJCWZv
ciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHsKKworCQkJCQlpZiAoIHBhcmFtZXRlcnNbIGtl
eSBdICE9PSB1bmRlZmluZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdOworCisJ
CQkJfQorCisJCQkJcmV0dXJuIGRhdGE7CisKKwkJCX0KKworCQkJdmFyIHZlcnRpY2VzID0gW107
CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpICsrICkg
eworCisJCQkJdmFyIHZlcnRleCA9IHRoaXMudmVydGljZXNbIGkgXTsKKwkJCQl2ZXJ0aWNlcy5w
dXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CisKKwkJCX0KKworCQkJdmFyIGZh
Y2VzID0gW107CisJCQl2YXIgbm9ybWFscyA9IFtdOworCQkJdmFyIG5vcm1hbHNIYXNoID0ge307
CisJCQl2YXIgY29sb3JzID0gW107CisJCQl2YXIgY29sb3JzSGFzaCA9IHt9OworCQkJdmFyIHV2
cyA9IFtdOworCQkJdmFyIHV2c0hhc2ggPSB7fTsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwg
dGhpcy5mYWNlcy5sZW5ndGg7IGkgKysgKSB7CisKKwkJCQl2YXIgZmFjZSA9IHRoaXMuZmFjZXNb
IGkgXTsKKworCQkJCXZhciBoYXNNYXRlcmlhbCA9IHRydWU7CisJCQkJdmFyIGhhc0ZhY2VVdiA9
IGZhbHNlOyAvLyBkZXByZWNhdGVkCisJCQkJdmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IHRoaXMuZmFj
ZVZlcnRleFV2c1sgMCBdWyBpIF0gIT09IHVuZGVmaW5lZDsKKwkJCQl2YXIgaGFzRmFjZU5vcm1h
bCA9IGZhY2Uubm9ybWFsLmxlbmd0aCgpID4gMDsKKwkJCQl2YXIgaGFzRmFjZVZlcnRleE5vcm1h
bCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGggPiAwOworCQkJCXZhciBoYXNGYWNlQ29sb3Ig
PSBmYWNlLmNvbG9yLnIgIT09IDEgfHwgZmFjZS5jb2xvci5nICE9PSAxIHx8IGZhY2UuY29sb3Iu
YiAhPT0gMTsKKwkJCQl2YXIgaGFzRmFjZVZlcnRleENvbG9yID0gZmFjZS52ZXJ0ZXhDb2xvcnMu
bGVuZ3RoID4gMDsKKworCQkJCXZhciBmYWNlVHlwZSA9IDA7CisKKwkJCQlmYWNlVHlwZSA9IHNl
dEJpdCggZmFjZVR5cGUsIDAsIDAgKTsgLy8gaXNRdWFkCisJCQkJZmFjZVR5cGUgPSBzZXRCaXQo
IGZhY2VUeXBlLCAxLCBoYXNNYXRlcmlhbCApOworCQkJCWZhY2VUeXBlID0gc2V0Qml0KCBmYWNl
VHlwZSwgMiwgaGFzRmFjZVV2ICk7CisJCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAz
LCBoYXNGYWNlVmVydGV4VXYgKTsKKwkJCQlmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDQs
IGhhc0ZhY2VOb3JtYWwgKTsKKwkJCQlmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDUsIGhh
c0ZhY2VWZXJ0ZXhOb3JtYWwgKTsKKwkJCQlmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDYs
IGhhc0ZhY2VDb2xvciApOworCQkJCWZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNywgaGFz
RmFjZVZlcnRleENvbG9yICk7CisKKwkJCQlmYWNlcy5wdXNoKCBmYWNlVHlwZSApOworCQkJCWZh
Y2VzLnB1c2goIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgKTsKKwkJCQlmYWNlcy5wdXNoKCBmYWNl
Lm1hdGVyaWFsSW5kZXggKTsKKworCQkJCWlmICggaGFzRmFjZVZlcnRleFV2ICkgeworCisJCQkJ
CXZhciBmYWNlVmVydGV4VXZzID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF1bIGkgXTsKKworCQkJ
CQlmYWNlcy5wdXNoKAorCQkJCQkJZ2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMCBdICksCisJ
CQkJCQlnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAxIF0gKSwKKwkJCQkJCWdldFV2SW5kZXgo
IGZhY2VWZXJ0ZXhVdnNbIDIgXSApCisJCQkJCSk7CisKKwkJCQl9CisKKwkJCQlpZiAoIGhhc0Zh
Y2VOb3JtYWwgKSB7CisKKwkJCQkJZmFjZXMucHVzaCggZ2V0Tm9ybWFsSW5kZXgoIGZhY2Uubm9y
bWFsICkgKTsKKworCQkJCX0KKworCQkJCWlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHsKKwor
CQkJCQl2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFsczsKKworCQkJCQlmYWNl
cy5wdXNoKAorCQkJCQkJZ2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDAgXSApLAorCQkJ
CQkJZ2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDEgXSApLAorCQkJCQkJZ2V0Tm9ybWFs
SW5kZXgoIHZlcnRleE5vcm1hbHNbIDIgXSApCisJCQkJCSk7CisKKwkJCQl9CisKKwkJCQlpZiAo
IGhhc0ZhY2VDb2xvciApIHsKKworCQkJCQlmYWNlcy5wdXNoKCBnZXRDb2xvckluZGV4KCBmYWNl
LmNvbG9yICkgKTsKKworCQkJCX0KKworCQkJCWlmICggaGFzRmFjZVZlcnRleENvbG9yICkgewor
CisJCQkJCXZhciB2ZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9yczsKKworCQkJCQlmYWNl
cy5wdXNoKAorCQkJCQkJZ2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAwIF0gKSwKKwkJCQkJ
CWdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMSBdICksCisJCQkJCQlnZXRDb2xvckluZGV4
KCB2ZXJ0ZXhDb2xvcnNbIDIgXSApCisJCQkJCSk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJZnVu
Y3Rpb24gc2V0Qml0KCB2YWx1ZSwgcG9zaXRpb24sIGVuYWJsZWQgKSB7CisKKwkJCQlyZXR1cm4g
ZW5hYmxlZCA/IHZhbHVlIHwgKCAxIDw8IHBvc2l0aW9uICkgOiB2YWx1ZSAmICggfiAoIDEgPDwg
cG9zaXRpb24gKSApOworCisJCQl9CisKKwkJCWZ1bmN0aW9uIGdldE5vcm1hbEluZGV4KCBub3Jt
YWwgKSB7CisKKwkJCQl2YXIgaGFzaCA9IG5vcm1hbC54LnRvU3RyaW5nKCkgKyBub3JtYWwueS50
b1N0cmluZygpICsgbm9ybWFsLnoudG9TdHJpbmcoKTsKKworCQkJCWlmICggbm9ybWFsc0hhc2hb
IGhhc2ggXSAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCXJldHVybiBub3JtYWxzSGFzaFsgaGFz
aCBdOworCisJCQkJfQorCisJCQkJbm9ybWFsc0hhc2hbIGhhc2ggXSA9IG5vcm1hbHMubGVuZ3Ro
IC8gMzsKKwkJCQlub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTsK
KworCQkJCXJldHVybiBub3JtYWxzSGFzaFsgaGFzaCBdOworCisJCQl9CisKKwkJCWZ1bmN0aW9u
IGdldENvbG9ySW5kZXgoIGNvbG9yICkgeworCisJCQkJdmFyIGhhc2ggPSBjb2xvci5yLnRvU3Ry
aW5nKCkgKyBjb2xvci5nLnRvU3RyaW5nKCkgKyBjb2xvci5iLnRvU3RyaW5nKCk7CisKKwkJCQlp
ZiAoIGNvbG9yc0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCXJldHVybiBj
b2xvcnNIYXNoWyBoYXNoIF07CisKKwkJCQl9CisKKwkJCQljb2xvcnNIYXNoWyBoYXNoIF0gPSBj
b2xvcnMubGVuZ3RoOworCQkJCWNvbG9ycy5wdXNoKCBjb2xvci5nZXRIZXgoKSApOworCisJCQkJ
cmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTsKKworCQkJfQorCisJCQlmdW5jdGlvbiBnZXRVdklu
ZGV4KCB1diApIHsKKworCQkJCXZhciBoYXNoID0gdXYueC50b1N0cmluZygpICsgdXYueS50b1N0
cmluZygpOworCisJCQkJaWYgKCB1dnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHsKKwor
CQkJCQlyZXR1cm4gdXZzSGFzaFsgaGFzaCBdOworCisJCQkJfQorCisJCQkJdXZzSGFzaFsgaGFz
aCBdID0gdXZzLmxlbmd0aCAvIDI7CisJCQkJdXZzLnB1c2goIHV2LngsIHV2LnkgKTsKKworCQkJ
CXJldHVybiB1dnNIYXNoWyBoYXNoIF07CisKKwkJCX0KKworCQkJZGF0YS5kYXRhID0ge307CisK
KwkJCWRhdGEuZGF0YS52ZXJ0aWNlcyA9IHZlcnRpY2VzOworCQkJZGF0YS5kYXRhLm5vcm1hbHMg
PSBub3JtYWxzOworCQkJaWYgKCBjb2xvcnMubGVuZ3RoID4gMCApIGRhdGEuZGF0YS5jb2xvcnMg
PSBjb2xvcnM7CisJCQlpZiAoIHV2cy5sZW5ndGggPiAwICkgZGF0YS5kYXRhLnV2cyA9IFsgdXZz
IF07IC8vIHRlbXBvcmFsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKwkJCWRhdGEuZGF0YS5mYWNl
cyA9IGZhY2VzOworCisJCQlyZXR1cm4gZGF0YTsKKworCQl9LAorCisJCWNsb25lOiBmdW5jdGlv
biAoKSB7CisKKwkJCS8qCisJCQkgLy8gSGFuZGxlIHByaW1pdGl2ZXMKKworCQkJIHZhciBwYXJh
bWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzOworCisJCQkgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRl
ZmluZWQgKSB7CisKKwkJCSB2YXIgdmFsdWVzID0gW107CisKKwkJCSBmb3IgKCB2YXIga2V5IGlu
IHBhcmFtZXRlcnMgKSB7CisKKwkJCSB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTsK
KworCQkJIH0KKworCQkJIHZhciBnZW9tZXRyeSA9IE9iamVjdC5jcmVhdGUoIHRoaXMuY29uc3Ry
dWN0b3IucHJvdG90eXBlICk7CisJCQkgdGhpcy5jb25zdHJ1Y3Rvci5hcHBseSggZ2VvbWV0cnks
IHZhbHVlcyApOworCQkJIHJldHVybiBnZW9tZXRyeTsKKworCQkJIH0KKworCQkJIHJldHVybiBu
ZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKwkJCSAqLworCisJCQlyZXR1cm4g
bmV3IEdlb21ldHJ5KCkuY29weSggdGhpcyApOworCisJCX0sCisKKwkJY29weTogZnVuY3Rpb24g
KCBzb3VyY2UgKSB7CisKKwkJCXZhciBpLCBpbCwgaiwgamwsIGssIGtsOworCisJCQkvLyByZXNl
dAorCisJCQl0aGlzLnZlcnRpY2VzID0gW107CisJCQl0aGlzLmNvbG9ycyA9IFtdOworCQkJdGhp
cy5mYWNlcyA9IFtdOworCQkJdGhpcy5mYWNlVmVydGV4VXZzID0gW1tdXTsKKwkJCXRoaXMubW9y
cGhUYXJnZXRzID0gW107CisJCQl0aGlzLm1vcnBoTm9ybWFscyA9IFtdOworCQkJdGhpcy5za2lu
V2VpZ2h0cyA9IFtdOworCQkJdGhpcy5za2luSW5kaWNlcyA9IFtdOworCQkJdGhpcy5saW5lRGlz
dGFuY2VzID0gW107CisJCQl0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDsKKwkJCXRoaXMuYm91bmRp
bmdTcGhlcmUgPSBudWxsOworCisJCQkvLyBuYW1lCisKKwkJCXRoaXMubmFtZSA9IHNvdXJjZS5u
YW1lOworCisJCQkvLyB2ZXJ0aWNlcworCisJCQl2YXIgdmVydGljZXMgPSBzb3VyY2UudmVydGlj
ZXM7CisKKwkJCWZvciAoIGkgPSAwLCBpbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsr
ICkgeworCisJCQkJdGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgaSBdLmNsb25lKCkgKTsK
KworCQkJfQorCisJCQkvLyBjb2xvcnMKKworCQkJdmFyIGNvbG9ycyA9IHNvdXJjZS5jb2xvcnM7
CisKKwkJCWZvciAoIGkgPSAwLCBpbCA9IGNvbG9ycy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsK
KworCQkJCXRoaXMuY29sb3JzLnB1c2goIGNvbG9yc1sgaSBdLmNsb25lKCkgKTsKKworCQkJfQor
CisJCQkvLyBmYWNlcworCisJCQl2YXIgZmFjZXMgPSBzb3VyY2UuZmFjZXM7CisKKwkJCWZvciAo
IGkgPSAwLCBpbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJdGhpcy5m
YWNlcy5wdXNoKCBmYWNlc1sgaSBdLmNsb25lKCkgKTsKKworCQkJfQorCisJCQkvLyBmYWNlIHZl
cnRleCB1dnMKKworCQkJZm9yICggaSA9IDAsIGlsID0gc291cmNlLmZhY2VWZXJ0ZXhVdnMubGVu
Z3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQl2YXIgZmFjZVZlcnRleFV2cyA9IHNvdXJjZS5m
YWNlVmVydGV4VXZzWyBpIF07CisKKwkJCQlpZiAoIHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID09
PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJdGhpcy5mYWNlVmVydGV4VXZzWyBpIF0gPSBbXTsKKwor
CQkJCX0KKworCQkJCWZvciAoIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwg
amw7IGogKysgKSB7CisKKwkJCQkJdmFyIHV2cyA9IGZhY2VWZXJ0ZXhVdnNbIGogXSwgdXZzQ29w
eSA9IFtdOworCisJCQkJCWZvciAoIGsgPSAwLCBrbCA9IHV2cy5sZW5ndGg7IGsgPCBrbDsgayAr
KyApIHsKKworCQkJCQkJdmFyIHV2ID0gdXZzWyBrIF07CisKKwkJCQkJCXV2c0NvcHkucHVzaCgg
dXYuY2xvbmUoKSApOworCisJCQkJCX0KKworCQkJCQl0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXS5w
dXNoKCB1dnNDb3B5ICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gbW9ycGggdGFyZ2V0cwor
CisJCQl2YXIgbW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0czsKKworCQkJZm9yICgg
aSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJ
dmFyIG1vcnBoVGFyZ2V0ID0ge307CisJCQkJbW9ycGhUYXJnZXQubmFtZSA9IG1vcnBoVGFyZ2V0
c1sgaSBdLm5hbWU7CisKKwkJCQkvLyB2ZXJ0aWNlcworCisJCQkJaWYgKCBtb3JwaFRhcmdldHNb
IGkgXS52ZXJ0aWNlcyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCW1vcnBoVGFyZ2V0LnZlcnRp
Y2VzID0gW107CisKKwkJCQkJZm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0udmVy
dGljZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CisKKwkJCQkJCW1vcnBoVGFyZ2V0LnZlcnRp
Y2VzLnB1c2goIG1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzWyBqIF0uY2xvbmUoKSApOworCisJ
CQkJCX0KKworCQkJCX0KKworCQkJCS8vIG5vcm1hbHMKKworCQkJCWlmICggbW9ycGhUYXJnZXRz
WyBpIF0ubm9ybWFscyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCW1vcnBoVGFyZ2V0Lm5vcm1h
bHMgPSBbXTsKKworCQkJCQlmb3IgKCBqID0gMCwgamwgPSBtb3JwaFRhcmdldHNbIGkgXS5ub3Jt
YWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgeworCisJCQkJCQltb3JwaFRhcmdldC5ub3JtYWxz
LnB1c2goIG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHNbIGogXS5jbG9uZSgpICk7CisKKwkJCQkJ
fQorCisJCQkJfQorCisJCQkJdGhpcy5tb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTsK
KworCQkJfQorCisJCQkvLyBtb3JwaCBub3JtYWxzCisKKwkJCXZhciBtb3JwaE5vcm1hbHMgPSBz
b3VyY2UubW9ycGhOb3JtYWxzOworCisJCQlmb3IgKCBpID0gMCwgaWwgPSBtb3JwaE5vcm1hbHMu
bGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQl2YXIgbW9ycGhOb3JtYWwgPSB7fTsKKwor
CQkJCS8vIHZlcnRleCBub3JtYWxzCisKKwkJCQlpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRl
eE5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQltb3JwaE5vcm1hbC52ZXJ0ZXhOb3Jt
YWxzID0gW107CisKKwkJCQkJZm9yICggaiA9IDAsIGpsID0gbW9ycGhOb3JtYWxzWyBpIF0udmVy
dGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKKworCQkJCQkJdmFyIHNyY1ZlcnRl
eE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHNbIGogXTsKKwkJCQkJCXZh
ciBkZXN0VmVydGV4Tm9ybWFsID0ge307CisKKwkJCQkJCWRlc3RWZXJ0ZXhOb3JtYWwuYSA9IHNy
Y1ZlcnRleE5vcm1hbC5hLmNsb25lKCk7CisJCQkJCQlkZXN0VmVydGV4Tm9ybWFsLmIgPSBzcmNW
ZXJ0ZXhOb3JtYWwuYi5jbG9uZSgpOworCQkJCQkJZGVzdFZlcnRleE5vcm1hbC5jID0gc3JjVmVy
dGV4Tm9ybWFsLmMuY2xvbmUoKTsKKworCQkJCQkJbW9ycGhOb3JtYWwudmVydGV4Tm9ybWFscy5w
dXNoKCBkZXN0VmVydGV4Tm9ybWFsICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJLy8gZmFj
ZSBub3JtYWxzCisKKwkJCQlpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzICE9PSB1
bmRlZmluZWQgKSB7CisKKwkJCQkJbW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMgPSBbXTsKKworCQkJ
CQlmb3IgKCBqID0gMCwgamwgPSBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscy5sZW5ndGg7
IGogPCBqbDsgaiArKyApIHsKKworCQkJCQkJbW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMucHVzaCgg
bW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHNbIGogXS5jbG9uZSgpICk7CisKKwkJCQkJfQor
CisJCQkJfQorCisJCQkJdGhpcy5tb3JwaE5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWwgKTsKKwor
CQkJfQorCisJCQkvLyBza2luIHdlaWdodHMKKworCQkJdmFyIHNraW5XZWlnaHRzID0gc291cmNl
LnNraW5XZWlnaHRzOworCisJCQlmb3IgKCBpID0gMCwgaWwgPSBza2luV2VpZ2h0cy5sZW5ndGg7
IGkgPCBpbDsgaSArKyApIHsKKworCQkJCXRoaXMuc2tpbldlaWdodHMucHVzaCggc2tpbldlaWdo
dHNbIGkgXS5jbG9uZSgpICk7CisKKwkJCX0KKworCQkJLy8gc2tpbiBpbmRpY2VzCisKKwkJCXZh
ciBza2luSW5kaWNlcyA9IHNvdXJjZS5za2luSW5kaWNlczsKKworCQkJZm9yICggaSA9IDAsIGls
ID0gc2tpbkluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQl0aGlzLnNraW5J
bmRpY2VzLnB1c2goIHNraW5JbmRpY2VzWyBpIF0uY2xvbmUoKSApOworCisJCQl9CisKKwkJCS8v
IGxpbmUgZGlzdGFuY2VzCisKKwkJCXZhciBsaW5lRGlzdGFuY2VzID0gc291cmNlLmxpbmVEaXN0
YW5jZXM7CisKKwkJCWZvciAoIGkgPSAwLCBpbCA9IGxpbmVEaXN0YW5jZXMubGVuZ3RoOyBpIDwg
aWw7IGkgKysgKSB7CisKKwkJCQl0aGlzLmxpbmVEaXN0YW5jZXMucHVzaCggbGluZURpc3RhbmNl
c1sgaSBdICk7CisKKwkJCX0KKworCQkJLy8gYm91bmRpbmcgYm94CisKKwkJCXZhciBib3VuZGlu
Z0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDsKKworCQkJaWYgKCBib3VuZGluZ0JveCAhPT0gbnVs
bCApIHsKKworCQkJCXRoaXMuYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveC5jbG9uZSgpOworCisJ
CQl9CisKKwkJCS8vIGJvdW5kaW5nIHNwaGVyZQorCisJCQl2YXIgYm91bmRpbmdTcGhlcmUgPSBz
b3VyY2UuYm91bmRpbmdTcGhlcmU7CisKKwkJCWlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwg
KSB7CisKKwkJCQl0aGlzLmJvdW5kaW5nU3BoZXJlID0gYm91bmRpbmdTcGhlcmUuY2xvbmUoKTsK
KworCQkJfQorCisJCQkvLyB1cGRhdGUgZmxhZ3MKKworCQkJdGhpcy5lbGVtZW50c05lZWRVcGRh
dGUgPSBzb3VyY2UuZWxlbWVudHNOZWVkVXBkYXRlOworCQkJdGhpcy52ZXJ0aWNlc05lZWRVcGRh
dGUgPSBzb3VyY2UudmVydGljZXNOZWVkVXBkYXRlOworCQkJdGhpcy51dnNOZWVkVXBkYXRlID0g
c291cmNlLnV2c05lZWRVcGRhdGU7CisJCQl0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gc291cmNl
Lm5vcm1hbHNOZWVkVXBkYXRlOworCQkJdGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gc291cmNlLmNv
bG9yc05lZWRVcGRhdGU7CisJCQl0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gc291cmNl
LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlOworCQkJdGhpcy5ncm91cHNOZWVkVXBkYXRlID0gc291
cmNlLmdyb3Vwc05lZWRVcGRhdGU7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZGlz
cG9zZTogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rp
c3Bvc2UnIH0gKTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAv
IGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gQnVmZmVyQXR0cmlidXRlKCBh
cnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7CisKKwkJaWYgKCBBcnJheS5pc0FycmF5KCBh
cnJheSApICkgeworCisJCQl0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmli
dXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7CisKKwkJfQorCisJCXRoaXMu
dXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOworCQl0aGlzLm5hbWUgPSAnJzsKKworCQl0aGlz
LmFycmF5ID0gYXJyYXk7CisJCXRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTsKKwkJdGhpcy5jb3Vu
dCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyBpdGVtU2l6ZSA6IDA7CisJ
CXRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7CisKKwkJdGhpcy5keW5hbWlj
ID0gZmFsc2U7CisJCXRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9
OworCisJCXRoaXMub25VcGxvYWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OworCisJCXRoaXMu
dmVyc2lvbiA9IDA7CisKKwl9CisKKwlPYmplY3QuZGVmaW5lUHJvcGVydHkoIEJ1ZmZlckF0dHJp
YnV0ZS5wcm90b3R5cGUsICduZWVkc1VwZGF0ZScsIHsKKworCQlzZXQ6IGZ1bmN0aW9uICggdmFs
dWUgKSB7CisKKwkJCWlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7CisKKwkJ
fQorCisJfSApOworCisJT2JqZWN0LmFzc2lnbiggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwg
eworCisJCWlzQnVmZmVyQXR0cmlidXRlOiB0cnVlLAorCisJCXNldEFycmF5OiBmdW5jdGlvbiAo
IGFycmF5ICkgeworCisJCQlpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7CisKKwkJCQl0
aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQg
YmUgYSBUeXBlZCBBcnJheS4nICk7CisKKwkJCX0KKworCQkJdGhpcy5jb3VudCA9IGFycmF5ICE9
PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLml0ZW1TaXplIDogMDsKKwkJCXRoaXMu
YXJyYXkgPSBhcnJheTsKKworCQl9LAorCisJCXNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUg
KSB7CisKKwkJCXRoaXMuZHluYW1pYyA9IHZhbHVlOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9
LAorCisJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisJCQl0aGlzLmFycmF5ID0gbmV3
IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7CisJCQl0aGlzLml0ZW1T
aXplID0gc291cmNlLml0ZW1TaXplOworCQkJdGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDsKKwkJ
CXRoaXMubm9ybWFsaXplZCA9IHNvdXJjZS5ub3JtYWxpemVkOworCisJCQl0aGlzLmR5bmFtaWMg
PSBzb3VyY2UuZHluYW1pYzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljb3B5QXQ6
IGZ1bmN0aW9uICggaW5kZXgxLCBhdHRyaWJ1dGUsIGluZGV4MiApIHsKKworCQkJaW5kZXgxICo9
IHRoaXMuaXRlbVNpemU7CisJCQlpbmRleDIgKj0gYXR0cmlidXRlLml0ZW1TaXplOworCisJCQlm
b3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLml0ZW1TaXplOyBpIDwgbDsgaSArKyApIHsKKworCQkJ
CXRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsgaSBd
OworCisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY29weUFycmF5OiBmdW5j
dGlvbiAoIGFycmF5ICkgeworCisJCQl0aGlzLmFycmF5LnNldCggYXJyYXkgKTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQljb3B5Q29sb3JzQXJyYXk6IGZ1bmN0aW9uICggY29sb3Jz
ICkgeworCisJCQl2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwOworCisJCQlmb3Ig
KCB2YXIgaSA9IDAsIGwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCXZh
ciBjb2xvciA9IGNvbG9yc1sgaSBdOworCisJCQkJaWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkg
eworCisJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3Jz
QXJyYXkoKTogY29sb3IgaXMgdW5kZWZpbmVkJywgaSApOworCQkJCQljb2xvciA9IG5ldyBDb2xv
cigpOworCisJCQkJfQorCisJCQkJYXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IucjsKKwkJCQlh
cnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5nOworCQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IGNv
bG9yLmI7CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljb3B5SW5kaWNl
c0FycmF5OiBmdW5jdGlvbiAoIGluZGljZXMgKSB7CisKKwkJCXZhciBhcnJheSA9IHRoaXMuYXJy
YXksIG9mZnNldCA9IDA7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3Ro
OyBpIDwgbDsgaSArKyApIHsKKworCQkJCXZhciBpbmRleCA9IGluZGljZXNbIGkgXTsKKworCQkJ
CWFycmF5WyBvZmZzZXQgKysgXSA9IGluZGV4LmE7CisJCQkJYXJyYXlbIG9mZnNldCArKyBdID0g
aW5kZXguYjsKKwkJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSBpbmRleC5jOworCisJCQl9CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY29weVZlY3RvcjJzQXJyYXk6IGZ1bmN0aW9uICgg
dmVjdG9ycyApIHsKKworCQkJdmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDsKKwor
CQkJZm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewor
CisJCQkJdmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTsKKworCQkJCWlmICggdmVjdG9yID09PSB1
bmRlZmluZWQgKSB7CisKKwkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRl
LmNvcHlWZWN0b3Iyc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7CisJCQkJCXZl
Y3RvciA9IG5ldyBWZWN0b3IyKCk7CisKKwkJCQl9CisKKwkJCQlhcnJheVsgb2Zmc2V0ICsrIF0g
PSB2ZWN0b3IueDsKKwkJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTsKKworCQkJfQor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNvcHlWZWN0b3Izc0FycmF5OiBmdW5jdGlv
biAoIHZlY3RvcnMgKSB7CisKKwkJCXZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7
CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyAp
IHsKKworCQkJCXZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07CisKKwkJCQlpZiAoIHZlY3RvciA9
PT0gdW5kZWZpbmVkICkgeworCisJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJp
YnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApOworCQkJ
CQl2ZWN0b3IgPSBuZXcgVmVjdG9yMygpOworCisJCQkJfQorCisJCQkJYXJyYXlbIG9mZnNldCAr
KyBdID0gdmVjdG9yLng7CisJCQkJYXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7CisJCQkJ
YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLno7CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7
CisKKwkJfSwKKworCQljb3B5VmVjdG9yNHNBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkgewor
CisJCQl2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwOworCisJCQlmb3IgKCB2YXIg
aSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQl2YXIgdmVj
dG9yID0gdmVjdG9yc1sgaSBdOworCisJCQkJaWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHsK
KworCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRz
QXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTsKKwkJCQkJdmVjdG9yID0gbmV3IFZl
Y3RvcjQoKTsKKworCQkJCX0KKworCQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54Owor
CQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55OworCQkJCWFycmF5WyBvZmZzZXQgKysg
XSA9IHZlY3Rvci56OworCQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci53OworCisJCQl9
CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBv
ZmZzZXQgKSB7CisKKwkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOwor
CisJCQl0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNldCApOworCisJCQlyZXR1cm4gdGhpczsK
KworCQl9LAorCisJCWdldFg6IGZ1bmN0aW9uICggaW5kZXggKSB7CisKKwkJCXJldHVybiB0aGlz
LmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTsKKworCQl9LAorCisJCXNldFg6IGZ1bmN0
aW9uICggaW5kZXgsIHggKSB7CisKKwkJCXRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6
ZSBdID0geDsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlnZXRZOiBmdW5jdGlvbiAo
IGluZGV4ICkgeworCisJCQlyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXpl
ICsgMSBdOworCisJCX0sCisKKwkJc2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHsKKworCQkJ
dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdID0geTsKKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQlnZXRaOiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisJCQlyZXR1
cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdOworCisJCX0sCisKKwkJ
c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHsKKworCQkJdGhpcy5hcnJheVsgaW5kZXggKiB0
aGlzLml0ZW1TaXplICsgMiBdID0gejsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQln
ZXRXOiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisJCQlyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXgg
KiB0aGlzLml0ZW1TaXplICsgMyBdOworCisJCX0sCisKKwkJc2V0VzogZnVuY3Rpb24gKCBpbmRl
eCwgdyApIHsKKworCQkJdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdID0g
dzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRYWTogZnVuY3Rpb24gKCBpbmRl
eCwgeCwgeSApIHsKKworCQkJaW5kZXggKj0gdGhpcy5pdGVtU2l6ZTsKKworCQkJdGhpcy5hcnJh
eVsgaW5kZXggKyAwIF0gPSB4OworCQkJdGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5OworCisJ
CQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwg
eSwgeiApIHsKKworCQkJaW5kZXggKj0gdGhpcy5pdGVtU2l6ZTsKKworCQkJdGhpcy5hcnJheVsg
aW5kZXggKyAwIF0gPSB4OworCQkJdGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5OworCQkJdGhp
cy5hcnJheVsgaW5kZXggKyAyIF0gPSB6OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJ
CXNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7CisKKwkJCWluZGV4ICo9
IHRoaXMuaXRlbVNpemU7CisKKwkJCXRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDsKKwkJCXRo
aXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTsKKwkJCXRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0g
ejsKKwkJCXRoaXMuYXJyYXlbIGluZGV4ICsgMyBdID0gdzsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQlvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKKworCQkJdGhpcy5v
blVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9y
KCB0aGlzLmFycmF5LCB0aGlzLml0ZW1TaXplICkuY29weSggdGhpcyApOworCisJCX0KKworCX0g
KTsKKworCS8vCisKKwlmdW5jdGlvbiBJbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNp
emUgKSB7CisKKwkJQnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQ4QXJyYXkoIGFy
cmF5ICksIGl0ZW1TaXplICk7CisKKwl9CisKKwlJbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlw
ZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTsKKwlJbnQ4QnVm
ZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludDhCdWZmZXJBdHRyaWJ1dGU7
CisKKworCWZ1bmN0aW9uIFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7
CisKKwkJQnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OEFycmF5KCBhcnJheSAp
LCBpdGVtU2l6ZSApOworCisJfQorCisJVWludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0g
T2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApOworCVVpbnQ4QnVmZmVy
QXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQ4QnVmZmVyQXR0cmlidXRlOwor
CisKKwlmdW5jdGlvbiBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6
ZSApIHsKKworCQlCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQ4Q2xhbXBlZEFy
cmF5KCBhcnJheSApLCBpdGVtU2l6ZSApOworCisJfQorCisJVWludDhDbGFtcGVkQnVmZmVyQXR0
cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5
cGUgKTsKKwlVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9y
ID0gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlOworCisKKwlmdW5jdGlvbiBJbnQxNkJ1ZmZl
ckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisJCUJ1ZmZlckF0dHJpYnV0ZS5jYWxs
KCB0aGlzLCBuZXcgSW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTsKKworCX0KKworCUlu
dDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJp
YnV0ZS5wcm90b3R5cGUgKTsKKwlJbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3Ry
dWN0b3IgPSBJbnQxNkJ1ZmZlckF0dHJpYnV0ZTsKKworCisJZnVuY3Rpb24gVWludDE2QnVmZmVy
QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKwkJQnVmZmVyQXR0cmlidXRlLmNhbGwo
IHRoaXMsIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTsKKworCX0KKworCVVp
bnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRy
aWJ1dGUucHJvdG90eXBlICk7CisJVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25z
dHJ1Y3RvciA9IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTsKKworCisJZnVuY3Rpb24gSW50MzJCdWZm
ZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworCQlCdWZmZXJBdHRyaWJ1dGUuY2Fs
bCggdGhpcywgbmV3IEludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7CisKKwl9CisKKwlJ
bnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRy
aWJ1dGUucHJvdG90eXBlICk7CisJSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0
cnVjdG9yID0gSW50MzJCdWZmZXJBdHRyaWJ1dGU7CisKKworCWZ1bmN0aW9uIFVpbnQzMkJ1ZmZl
ckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisJCUJ1ZmZlckF0dHJpYnV0ZS5jYWxs
KCB0aGlzLCBuZXcgVWludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7CisKKwl9CisKKwlV
aW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0
cmlidXRlLnByb3RvdHlwZSApOworCVVpbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29u
c3RydWN0b3IgPSBVaW50MzJCdWZmZXJBdHRyaWJ1dGU7CisKKworCWZ1bmN0aW9uIEZsb2F0MzJC
dWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworCQlCdWZmZXJBdHRyaWJ1dGUu
Y2FsbCggdGhpcywgbmV3IEZsb2F0MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTsKKworCX0K
KworCUZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVm
ZmVyQXR0cmlidXRlLnByb3RvdHlwZSApOworCUZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90
eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTsKKworCisJZnVuY3Rpb24g
RmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisJCUJ1ZmZlckF0
dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgRmxvYXQ2NEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSAp
OworCisJfQorCisJRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3Jl
YXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7CisJRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0
ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGbG9hdDY0QnVmZmVyQXR0cmlidXRlOworCisJLyoq
CisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0
aW9uIERpcmVjdEdlb21ldHJ5KCkgeworCisJCXRoaXMuaW5kaWNlcyA9IFtdOworCQl0aGlzLnZl
cnRpY2VzID0gW107CisJCXRoaXMubm9ybWFscyA9IFtdOworCQl0aGlzLmNvbG9ycyA9IFtdOwor
CQl0aGlzLnV2cyA9IFtdOworCQl0aGlzLnV2czIgPSBbXTsKKworCQl0aGlzLmdyb3VwcyA9IFtd
OworCisJCXRoaXMubW9ycGhUYXJnZXRzID0ge307CisKKwkJdGhpcy5za2luV2VpZ2h0cyA9IFtd
OworCQl0aGlzLnNraW5JbmRpY2VzID0gW107CisKKwkJLy8gdGhpcy5saW5lRGlzdGFuY2VzID0g
W107CisKKwkJdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CisJCXRoaXMuYm91bmRpbmdTcGhlcmUg
PSBudWxsOworCisJCS8vIHVwZGF0ZSBmbGFncworCisJCXRoaXMudmVydGljZXNOZWVkVXBkYXRl
ID0gZmFsc2U7CisJCXRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTsKKwkJdGhpcy5jb2xv
cnNOZWVkVXBkYXRlID0gZmFsc2U7CisJCXRoaXMudXZzTmVlZFVwZGF0ZSA9IGZhbHNlOworCQl0
aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIERp
cmVjdEdlb21ldHJ5LnByb3RvdHlwZSwgeworCisJCWNvbXB1dGVHcm91cHM6IGZ1bmN0aW9uICgg
Z2VvbWV0cnkgKSB7CisKKwkJCXZhciBncm91cDsKKwkJCXZhciBncm91cHMgPSBbXTsKKwkJCXZh
ciBtYXRlcmlhbEluZGV4ID0gdW5kZWZpbmVkOworCisJCQl2YXIgZmFjZXMgPSBnZW9tZXRyeS5m
YWNlczsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgZmFjZXMubGVuZ3RoOyBpICsrICkgewor
CisJCQkJdmFyIGZhY2UgPSBmYWNlc1sgaSBdOworCisJCQkJLy8gbWF0ZXJpYWxzCisKKwkJCQlp
ZiAoIGZhY2UubWF0ZXJpYWxJbmRleCAhPT0gbWF0ZXJpYWxJbmRleCApIHsKKworCQkJCQltYXRl
cmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4OworCisJCQkJCWlmICggZ3JvdXAgIT09IHVu
ZGVmaW5lZCApIHsKKworCQkJCQkJZ3JvdXAuY291bnQgPSAoIGkgKiAzICkgLSBncm91cC5zdGFy
dDsKKwkJCQkJCWdyb3Vwcy5wdXNoKCBncm91cCApOworCisJCQkJCX0KKworCQkJCQlncm91cCA9
IHsKKwkJCQkJCXN0YXJ0OiBpICogMywKKwkJCQkJCW1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5k
ZXgKKwkJCQkJfTsKKworCQkJCX0KKworCQkJfQorCisJCQlpZiAoIGdyb3VwICE9PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCQlncm91cC5jb3VudCA9ICggaSAqIDMgKSAtIGdyb3VwLnN0YXJ0OworCQkJ
CWdyb3Vwcy5wdXNoKCBncm91cCApOworCisJCQl9CisKKwkJCXRoaXMuZ3JvdXBzID0gZ3JvdXBz
OworCisJCX0sCisKKwkJZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkgeworCisJ
CQl2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlczsKKwkJCXZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5
LnZlcnRpY2VzOworCQkJdmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZz
OworCisJCQl2YXIgaGFzRmFjZVZlcnRleFV2ID0gZmFjZVZlcnRleFV2c1sgMCBdICYmIGZhY2VW
ZXJ0ZXhVdnNbIDAgXS5sZW5ndGggPiAwOworCQkJdmFyIGhhc0ZhY2VWZXJ0ZXhVdjIgPSBmYWNl
VmVydGV4VXZzWyAxIF0gJiYgZmFjZVZlcnRleFV2c1sgMSBdLmxlbmd0aCA+IDA7CisKKwkJCS8v
IG1vcnBocworCisJCQl2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzOwor
CQkJdmFyIG1vcnBoVGFyZ2V0c0xlbmd0aCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7CisKKwkJCXZh
ciBtb3JwaFRhcmdldHNQb3NpdGlvbjsKKworCQkJaWYgKCBtb3JwaFRhcmdldHNMZW5ndGggPiAw
ICkgeworCisJCQkJbW9ycGhUYXJnZXRzUG9zaXRpb24gPSBbXTsKKworCQkJCWZvciAoIHZhciBp
ID0gMDsgaSA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaSArKyApIHsKKworCQkJCQltb3JwaFRhcmdl
dHNQb3NpdGlvblsgaSBdID0gW107CisKKwkJCQl9CisKKwkJCQl0aGlzLm1vcnBoVGFyZ2V0cy5w
b3NpdGlvbiA9IG1vcnBoVGFyZ2V0c1Bvc2l0aW9uOworCisJCQl9CisKKwkJCXZhciBtb3JwaE5v
cm1hbHMgPSBnZW9tZXRyeS5tb3JwaE5vcm1hbHM7CisJCQl2YXIgbW9ycGhOb3JtYWxzTGVuZ3Ro
ID0gbW9ycGhOb3JtYWxzLmxlbmd0aDsKKworCQkJdmFyIG1vcnBoVGFyZ2V0c05vcm1hbDsKKwor
CQkJaWYgKCBtb3JwaE5vcm1hbHNMZW5ndGggPiAwICkgeworCisJCQkJbW9ycGhUYXJnZXRzTm9y
bWFsID0gW107CisKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaE5vcm1hbHNMZW5ndGg7
IGkgKysgKSB7CisKKwkJCQkJbW9ycGhUYXJnZXRzTm9ybWFsWyBpIF0gPSBbXTsKKworCQkJCX0K
KworCQkJCXRoaXMubW9ycGhUYXJnZXRzLm5vcm1hbCA9IG1vcnBoVGFyZ2V0c05vcm1hbDsKKwor
CQkJfQorCisJCQkvLyBza2lucworCisJCQl2YXIgc2tpbkluZGljZXMgPSBnZW9tZXRyeS5za2lu
SW5kaWNlczsKKwkJCXZhciBza2luV2VpZ2h0cyA9IGdlb21ldHJ5LnNraW5XZWlnaHRzOworCisJ
CQl2YXIgaGFzU2tpbkluZGljZXMgPSBza2luSW5kaWNlcy5sZW5ndGggPT09IHZlcnRpY2VzLmxl
bmd0aDsKKwkJCXZhciBoYXNTa2luV2VpZ2h0cyA9IHNraW5XZWlnaHRzLmxlbmd0aCA9PT0gdmVy
dGljZXMubGVuZ3RoOworCisJCQkvLworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBmYWNlcy5s
ZW5ndGg7IGkgKysgKSB7CisKKwkJCQl2YXIgZmFjZSA9IGZhY2VzWyBpIF07CisKKwkJCQl0aGlz
LnZlcnRpY2VzLnB1c2goIHZlcnRpY2VzWyBmYWNlLmEgXSwgdmVydGljZXNbIGZhY2UuYiBdLCB2
ZXJ0aWNlc1sgZmFjZS5jIF0gKTsKKworCQkJCXZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0
ZXhOb3JtYWxzOworCisJCQkJaWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHsKKwor
CQkJCQl0aGlzLm5vcm1hbHMucHVzaCggdmVydGV4Tm9ybWFsc1sgMCBdLCB2ZXJ0ZXhOb3JtYWxz
WyAxIF0sIHZlcnRleE5vcm1hbHNbIDIgXSApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQl2YXIg
bm9ybWFsID0gZmFjZS5ub3JtYWw7CisKKwkJCQkJdGhpcy5ub3JtYWxzLnB1c2goIG5vcm1hbCwg
bm9ybWFsLCBub3JtYWwgKTsKKworCQkJCX0KKworCQkJCXZhciB2ZXJ0ZXhDb2xvcnMgPSBmYWNl
LnZlcnRleENvbG9yczsKKworCQkJCWlmICggdmVydGV4Q29sb3JzLmxlbmd0aCA9PT0gMyApIHsK
KworCQkJCQl0aGlzLmNvbG9ycy5wdXNoKCB2ZXJ0ZXhDb2xvcnNbIDAgXSwgdmVydGV4Q29sb3Jz
WyAxIF0sIHZlcnRleENvbG9yc1sgMiBdICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXZhciBj
b2xvciA9IGZhY2UuY29sb3I7CisKKwkJCQkJdGhpcy5jb2xvcnMucHVzaCggY29sb3IsIGNvbG9y
LCBjb2xvciApOworCisJCQkJfQorCisJCQkJaWYgKCBoYXNGYWNlVmVydGV4VXYgPT09IHRydWUg
KSB7CisKKwkJCQkJdmFyIHZlcnRleFV2cyA9IGZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdOworCisJ
CQkJCWlmICggdmVydGV4VXZzICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCXRoaXMudXZzLnB1
c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTsKKwor
CQkJCQl9IGVsc2UgeworCisJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRy
eS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICcsIGkgKTsKKworCQkJCQkJdGhp
cy51dnMucHVzaCggbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSAp
OworCisJCQkJCX0KKworCQkJCX0KKworCQkJCWlmICggaGFzRmFjZVZlcnRleFV2MiA9PT0gdHJ1
ZSApIHsKKworCQkJCQl2YXIgdmVydGV4VXZzID0gZmFjZVZlcnRleFV2c1sgMSBdWyBpIF07CisK
KwkJCQkJaWYgKCB2ZXJ0ZXhVdnMgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJdGhpcy51dnMy
LnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTsK
KworCQkJCQl9IGVsc2UgeworCisJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9t
ZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2MiAnLCBpICk7CisKKwkJCQkJ
CXRoaXMudXZzMi5wdXNoKCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9y
MigpICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJLy8gbW9ycGhzCisKKwkJCQlmb3IgKCB2
YXIgaiA9IDA7IGogPCBtb3JwaFRhcmdldHNMZW5ndGg7IGogKysgKSB7CisKKwkJCQkJdmFyIG1v
cnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBqIF0udmVydGljZXM7CisKKwkJCQkJbW9ycGhUYXJn
ZXRzUG9zaXRpb25bIGogXS5wdXNoKCBtb3JwaFRhcmdldFsgZmFjZS5hIF0sIG1vcnBoVGFyZ2V0
WyBmYWNlLmIgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYyBdICk7CisKKwkJCQl9CisKKwkJCQlmb3Ig
KCB2YXIgaiA9IDA7IGogPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGogKysgKSB7CisKKwkJCQkJdmFy
IG1vcnBoTm9ybWFsID0gbW9ycGhOb3JtYWxzWyBqIF0udmVydGV4Tm9ybWFsc1sgaSBdOworCisJ
CQkJCW1vcnBoVGFyZ2V0c05vcm1hbFsgaiBdLnB1c2goIG1vcnBoTm9ybWFsLmEsIG1vcnBoTm9y
bWFsLmIsIG1vcnBoTm9ybWFsLmMgKTsKKworCQkJCX0KKworCQkJCS8vIHNraW5zCisKKwkJCQlp
ZiAoIGhhc1NraW5JbmRpY2VzICkgeworCisJCQkJCXRoaXMuc2tpbkluZGljZXMucHVzaCggc2tp
bkluZGljZXNbIGZhY2UuYSBdLCBza2luSW5kaWNlc1sgZmFjZS5iIF0sIHNraW5JbmRpY2VzWyBm
YWNlLmMgXSApOworCisJCQkJfQorCisJCQkJaWYgKCBoYXNTa2luV2VpZ2h0cyApIHsKKworCQkJ
CQl0aGlzLnNraW5XZWlnaHRzLnB1c2goIHNraW5XZWlnaHRzWyBmYWNlLmEgXSwgc2tpbldlaWdo
dHNbIGZhY2UuYiBdLCBza2luV2VpZ2h0c1sgZmFjZS5jIF0gKTsKKworCQkJCX0KKworCQkJfQor
CisJCQl0aGlzLmNvbXB1dGVHcm91cHMoIGdlb21ldHJ5ICk7CisKKwkJCXRoaXMudmVydGljZXNO
ZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlOworCQkJdGhpcy5ub3JtYWxz
TmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlOworCQkJdGhpcy5jb2xvcnNO
ZWVkVXBkYXRlID0gZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZTsKKwkJCXRoaXMudXZzTmVlZFVw
ZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7CisJCQl0aGlzLmdyb3Vwc05lZWRVcGRhdGUg
PSBnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9CisK
Kwl9ICk7CisKKwlmdW5jdGlvbiBhcnJheU1heCggYXJyYXkgKSB7CisKKwkJaWYgKCBhcnJheS5s
ZW5ndGggPT09IDAgKSByZXR1cm4gLSBJbmZpbml0eTsKKworCQl2YXIgbWF4ID0gYXJyYXlbIDAg
XTsKKworCQlmb3IgKCB2YXIgaSA9IDEsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyArKyBpICkg
eworCisJCQlpZiAoIGFycmF5WyBpIF0gPiBtYXggKSBtYXggPSBhcnJheVsgaSBdOworCisJCX0K
KworCQlyZXR1cm4gbWF4OworCisJfQorCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0
dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRv
b2IuY29tLworCSAqLworCisJZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnkoKSB7CisKKwkJT2JqZWN0
LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBHZW9tZXRyeUlkQ291bnQoKSB9
ICk7CisKKwkJdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CisKKwkJdGhpcy5uYW1l
ID0gJyc7CisJCXRoaXMudHlwZSA9ICdCdWZmZXJHZW9tZXRyeSc7CisKKwkJdGhpcy5pbmRleCA9
IG51bGw7CisJCXRoaXMuYXR0cmlidXRlcyA9IHt9OworCisJCXRoaXMubW9ycGhBdHRyaWJ1dGVz
ID0ge307CisKKwkJdGhpcy5ncm91cHMgPSBbXTsKKworCQl0aGlzLmJvdW5kaW5nQm94ID0gbnVs
bDsKKwkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7CisKKwkJdGhpcy5kcmF3UmFuZ2UgPSB7
IHN0YXJ0OiAwLCBjb3VudDogSW5maW5pdHkgfTsKKworCX0KKworCUJ1ZmZlckdlb21ldHJ5Lk1h
eEluZGV4ID0gNjU1MzU7CisKKwlPYmplY3QuYXNzaWduKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5
cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHsKKworCQlpc0J1ZmZlckdlb21ldHJ5OiB0
cnVlLAorCisJCWdldEluZGV4OiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB0aGlzLmluZGV4
OworCisJCX0sCisKKwkJc2V0SW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7CisKKwkJCWlmICgg
QXJyYXkuaXNBcnJheSggaW5kZXggKSApIHsKKworCQkJCXRoaXMuaW5kZXggPSBuZXcgKCBhcnJh
eU1heCggaW5kZXggKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVm
ZmVyQXR0cmlidXRlICkoIGluZGV4LCAxICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQl0aGlzLmlu
ZGV4ID0gaW5kZXg7CisKKwkJCX0KKworCQl9LAorCisJCWFkZEF0dHJpYnV0ZTogZnVuY3Rpb24g
KCBuYW1lLCBhdHRyaWJ1dGUgKSB7CisKKwkJCWlmICggISAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1
dGUuaXNCdWZmZXJBdHRyaWJ1dGUgKSAmJiAhICggYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5pc0lu
dGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJF
RS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0
cmlidXRlICkuJyApOworCisJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIG5ldyBCdWZmZXJB
dHRyaWJ1dGUoIGFyZ3VtZW50c1sgMSBdLCBhcmd1bWVudHNbIDIgXSApICk7CisKKwkJCQlyZXR1
cm47CisKKwkJCX0KKworCQkJaWYgKCBuYW1lID09PSAnaW5kZXgnICkgeworCisJCQkJY29uc29s
ZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4
KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4nICk7CisJCQkJdGhpcy5zZXRJbmRleCggYXR0cmlidXRl
ICk7CisKKwkJCQlyZXR1cm47CisKKwkJCX0KKworCQkJdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0g
PSBhdHRyaWJ1dGU7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZ2V0QXR0cmlidXRl
OiBmdW5jdGlvbiAoIG5hbWUgKSB7CisKKwkJCXJldHVybiB0aGlzLmF0dHJpYnV0ZXNbIG5hbWUg
XTsKKworCQl9LAorCisJCXJlbW92ZUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkgeworCisJ
CQlkZWxldGUgdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07CisKKwkJCXJldHVybiB0aGlzOworCisJ
CX0sCisKKwkJYWRkR3JvdXA6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50LCBtYXRlcmlhbEluZGV4
ICkgeworCisJCQl0aGlzLmdyb3Vwcy5wdXNoKCB7CisKKwkJCQlzdGFydDogc3RhcnQsCisJCQkJ
Y291bnQ6IGNvdW50LAorCQkJCW1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXggIT09IHVuZGVm
aW5lZCA/IG1hdGVyaWFsSW5kZXggOiAwCisKKwkJCX0gKTsKKworCQl9LAorCisJCWNsZWFyR3Jv
dXBzOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMuZ3JvdXBzID0gW107CisKKwkJfSwKKworCQlz
ZXREcmF3UmFuZ2U6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50ICkgeworCisJCQl0aGlzLmRyYXdS
YW5nZS5zdGFydCA9IHN0YXJ0OworCQkJdGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDsKKwor
CQl9LAorCisJCWFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKKworCQkJdmFyIHBv
c2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uOworCisJCQlpZiAoIHBvc2l0aW9uICE9
PSB1bmRlZmluZWQgKSB7CisKKwkJCQltYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggcG9z
aXRpb24gKTsKKwkJCQlwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCX0KKworCQkJ
dmFyIG5vcm1hbCA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7CisKKwkJCWlmICggbm9ybWFsICE9
PSB1bmRlZmluZWQgKSB7CisKKwkJCQl2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5n
ZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApOworCisJCQkJbm9ybWFsTWF0cml4LmFwcGx5VG9CdWZm
ZXJBdHRyaWJ1dGUoIG5vcm1hbCApOworCQkJCW5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7CisK
KwkJCX0KKworCQkJaWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkgeworCisJCQkJdGhp
cy5jb21wdXRlQm91bmRpbmdCb3goKTsKKworCQkJfQorCisJCQlpZiAoIHRoaXMuYm91bmRpbmdT
cGhlcmUgIT09IG51bGwgKSB7CisKKwkJCQl0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwor
CisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJcm90YXRlWDogZnVuY3Rpb24g
KCkgeworCisJCQkvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHgtYXhpcworCisJCQl2
YXIgbTEgPSBuZXcgTWF0cml4NCgpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5n
bGUgKSB7CisKKwkJCQltMS5tYWtlUm90YXRpb25YKCBhbmdsZSApOworCisJCQkJdGhpcy5hcHBs
eU1hdHJpeCggbTEgKTsKKworCQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKwor
CQlyb3RhdGVZOiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQg
d29ybGQgeS1heGlzCisKKwkJCXZhciBtMSA9IG5ldyBNYXRyaXg0KCk7CisKKwkJCXJldHVybiBm
dW5jdGlvbiByb3RhdGVZKCBhbmdsZSApIHsKKworCQkJCW0xLm1ha2VSb3RhdGlvblkoIGFuZ2xl
ICk7CisKKwkJCQl0aGlzLmFwcGx5TWF0cml4KCBtMSApOworCisJCQkJcmV0dXJuIHRoaXM7CisK
KwkJCX07CisKKwkJfSgpLAorCisJCXJvdGF0ZVo6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gcm90
YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXMKKworCQkJdmFyIG0xID0gbmV3IE1hdHJp
eDQoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkgeworCisJCQkJbTEu
bWFrZVJvdGF0aW9uWiggYW5nbGUgKTsKKworCQkJCXRoaXMuYXBwbHlNYXRyaXgoIG0xICk7CisK
KwkJCQlyZXR1cm4gdGhpczsKKworCQkJfTsKKworCQl9KCksCisKKwkJdHJhbnNsYXRlOiBmdW5j
dGlvbiAoKSB7CisKKwkJCS8vIHRyYW5zbGF0ZSBnZW9tZXRyeQorCisJCQl2YXIgbTEgPSBuZXcg
TWF0cml4NCgpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlKCB4LCB5LCB6ICkgewor
CisJCQkJbTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICk7CisKKwkJCQl0aGlzLmFwcGx5TWF0
cml4KCBtMSApOworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCXNj
YWxlOiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIHNjYWxlIGdlb21ldHJ5CisKKwkJCXZhciBtMSA9
IG5ldyBNYXRyaXg0KCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiBzY2FsZSggeCwgeSwgeiApIHsK
KworCQkJCW0xLm1ha2VTY2FsZSggeCwgeSwgeiApOworCisJCQkJdGhpcy5hcHBseU1hdHJpeCgg
bTEgKTsKKworCQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKworCQlsb29rQXQ6
IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIG9iaiA9IG5ldyBPYmplY3QzRCgpOworCisJCQlyZXR1
cm4gZnVuY3Rpb24gbG9va0F0KCB2ZWN0b3IgKSB7CisKKwkJCQlvYmoubG9va0F0KCB2ZWN0b3Ig
KTsKKworCQkJCW9iai51cGRhdGVNYXRyaXgoKTsKKworCQkJCXRoaXMuYXBwbHlNYXRyaXgoIG9i
ai5tYXRyaXggKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJY2VudGVyOiBmdW5jdGlvbiAoKSB7
CisKKwkJCXRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7CisKKwkJCXZhciBvZmZzZXQgPSB0aGlz
LmJvdW5kaW5nQm94LmdldENlbnRlcigpLm5lZ2F0ZSgpOworCisJCQl0aGlzLnRyYW5zbGF0ZSgg
b2Zmc2V0LngsIG9mZnNldC55LCBvZmZzZXQueiApOworCisJCQlyZXR1cm4gb2Zmc2V0OworCisJ
CX0sCisKKwkJc2V0RnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7CisKKwkJCS8vIGNv
bnNvbGUubG9nKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuc2V0RnJvbU9iamVjdCgpLiBDb252ZXJ0
aW5nJywgb2JqZWN0LCB0aGlzICk7CisKKwkJCXZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRy
eTsKKworCQkJaWYgKCBvYmplY3QuaXNQb2ludHMgfHwgb2JqZWN0LmlzTGluZSApIHsKKworCQkJ
CXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkudmVy
dGljZXMubGVuZ3RoICogMywgMyApOworCQkJCXZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkJ1ZmZl
ckF0dHJpYnV0ZSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMsIDMgKTsKKworCQkJCXRoaXMu
YWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMuY29weVZlY3RvcjNzQXJyYXkoIGdl
b21ldHJ5LnZlcnRpY2VzICkgKTsKKwkJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgY29s
b3JzLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICkgKTsKKworCQkJCWlmICggZ2Vv
bWV0cnkubGluZURpc3RhbmNlcyAmJiBnZW9tZXRyeS5saW5lRGlzdGFuY2VzLmxlbmd0aCA9PT0g
Z2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkgeworCisJCQkJCXZhciBsaW5lRGlzdGFuY2VzID0g
bmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMubGVuZ3Ro
LCAxICk7CisKKwkJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBsaW5lRGlz
dGFuY2VzLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApICk7CisKKwkJCQl9CisK
KwkJCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkgeworCisJCQkJCXRo
aXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpOworCisJ
CQkJfQorCisJCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKKworCQkJ
CQl0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTsKKworCQkJ
CX0KKworCQkJfSBlbHNlIGlmICggb2JqZWN0LmlzTWVzaCApIHsKKworCQkJCWlmICggZ2VvbWV0
cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKKworCQkJCQl0aGlzLmZyb21HZW9tZXRyeSgg
Z2VvbWV0cnkgKTsKKworCQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAor
CisJCXVwZGF0ZUZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkgeworCisJCQl2YXIgZ2Vv
bWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CisKKwkJCWlmICggb2JqZWN0LmlzTWVzaCApIHsKKwor
CQkJCXZhciBkaXJlY3QgPSBnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5OworCisJCQkJaWYgKCBn
ZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPT09IHRydWUgKSB7CisKKwkJCQkJZGlyZWN0ID0g
dW5kZWZpbmVkOworCQkJCQlnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTsKKwor
CQkJCX0KKworCQkJCWlmICggZGlyZWN0ID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJcmV0dXJu
IHRoaXMuZnJvbUdlb21ldHJ5KCBnZW9tZXRyeSApOworCisJCQkJfQorCisJCQkJZGlyZWN0LnZl
cnRpY2VzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZTsKKwkJCQlkaXJl
Y3Qubm9ybWFsc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZTsKKwkJCQlk
aXJlY3QuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7CisJCQkJ
ZGlyZWN0LnV2c05lZWRVcGRhdGUgPSBnZW9tZXRyeS51dnNOZWVkVXBkYXRlOworCQkJCWRpcmVj
dC5ncm91cHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZTsKKworCQkJCWdl
b21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlOworCQkJCWdlb21ldHJ5Lm5vcm1hbHNO
ZWVkVXBkYXRlID0gZmFsc2U7CisJCQkJZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNl
OworCQkJCWdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTsKKwkJCQlnZW9tZXRyeS5ncm91
cHNOZWVkVXBkYXRlID0gZmFsc2U7CisKKwkJCQlnZW9tZXRyeSA9IGRpcmVjdDsKKworCQkJfQor
CisJCQl2YXIgYXR0cmlidXRlOworCisJCQlpZiAoIGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0
ZSA9PT0gdHJ1ZSApIHsKKworCQkJCWF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlv
bjsKKworCQkJCWlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJYXR0cmli
dXRlLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcyApOworCQkJCQlhdHRyaWJ1
dGUubmVlZHNVcGRhdGUgPSB0cnVlOworCisJCQkJfQorCisJCQkJZ2VvbWV0cnkudmVydGljZXNO
ZWVkVXBkYXRlID0gZmFsc2U7CisKKwkJCX0KKworCQkJaWYgKCBnZW9tZXRyeS5ub3JtYWxzTmVl
ZFVwZGF0ZSA9PT0gdHJ1ZSApIHsKKworCQkJCWF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5u
b3JtYWw7CisKKwkJCQlpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWF0
dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkubm9ybWFscyApOworCQkJCQlhdHRy
aWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlOworCisJCQkJfQorCisJCQkJZ2VvbWV0cnkubm9ybWFs
c05lZWRVcGRhdGUgPSBmYWxzZTsKKworCQkJfQorCisJCQlpZiAoIGdlb21ldHJ5LmNvbG9yc05l
ZWRVcGRhdGUgPT09IHRydWUgKSB7CisKKwkJCQlhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMu
Y29sb3I7CisKKwkJCQlpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWF0
dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApOworCQkJCQlhdHRyaWJ1
dGUubmVlZHNVcGRhdGUgPSB0cnVlOworCisJCQkJfQorCisJCQkJZ2VvbWV0cnkuY29sb3JzTmVl
ZFVwZGF0ZSA9IGZhbHNlOworCisJCQl9CisKKwkJCWlmICggZ2VvbWV0cnkudXZzTmVlZFVwZGF0
ZSApIHsKKworCQkJCWF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy51djsKKworCQkJCWlmICgg
YXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJYXR0cmlidXRlLmNvcHlWZWN0b3Iy
c0FycmF5KCBnZW9tZXRyeS51dnMgKTsKKwkJCQkJYXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1
ZTsKKworCQkJCX0KKworCQkJCWdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTsKKworCQkJ
fQorCisJCQlpZiAoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlICkgeworCisJCQkJ
YXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLmxpbmVEaXN0YW5jZTsKKworCQkJCWlmICggYXR0
cmlidXRlICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJYXR0cmlidXRlLmNvcHlBcnJheSggZ2Vv
bWV0cnkubGluZURpc3RhbmNlcyApOworCQkJCQlhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVl
OworCisJCQkJfQorCisJCQkJZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxz
ZTsKKworCQkJfQorCisJCQlpZiAoIGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgKSB7CisKKwkJ
CQlnZW9tZXRyeS5jb21wdXRlR3JvdXBzKCBvYmplY3QuZ2VvbWV0cnkgKTsKKwkJCQl0aGlzLmdy
b3VwcyA9IGdlb21ldHJ5Lmdyb3VwczsKKworCQkJCWdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUg
PSBmYWxzZTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWZyb21HZW9t
ZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHsKKworCQkJZ2VvbWV0cnkuX19kaXJlY3RHZW9t
ZXRyeSA9IG5ldyBEaXJlY3RHZW9tZXRyeSgpLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTsKKwor
CQkJcmV0dXJuIHRoaXMuZnJvbURpcmVjdEdlb21ldHJ5KCBnZW9tZXRyeS5fX2RpcmVjdEdlb21l
dHJ5ICk7CisKKwkJfSwKKworCQlmcm9tRGlyZWN0R2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0
cnkgKSB7CisKKwkJCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS52
ZXJ0aWNlcy5sZW5ndGggKiAzICk7CisJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywg
bmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdl
b21ldHJ5LnZlcnRpY2VzICkgKTsKKworCQkJaWYgKCBnZW9tZXRyeS5ub3JtYWxzLmxlbmd0aCA+
IDAgKSB7CisKKwkJCQl2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5Lm5v
cm1hbHMubGVuZ3RoICogMyApOworCQkJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3
IEJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRy
eS5ub3JtYWxzICkgKTsKKworCQkJfQorCisJCQlpZiAoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGgg
PiAwICkgeworCisJCQkJdmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LmNv
bG9ycy5sZW5ndGggKiAzICk7CisJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBC
dWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29s
b3JzICkgKTsKKworCQkJfQorCisJCQlpZiAoIGdlb21ldHJ5LnV2cy5sZW5ndGggPiAwICkgewor
CisJCQkJdmFyIHV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnV2cy5sZW5ndGggKiAy
ICk7CisJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2
cywgMiApLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMgKSApOworCisJCQl9CisKKwkJ
CWlmICggZ2VvbWV0cnkudXZzMi5sZW5ndGggPiAwICkgeworCisJCQkJdmFyIHV2czIgPSBuZXcg
RmxvYXQzMkFycmF5KCBnZW9tZXRyeS51dnMyLmxlbmd0aCAqIDIgKTsKKwkJCQl0aGlzLmFkZEF0
dHJpYnV0ZSggJ3V2MicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2czIsIDIgKS5jb3B5VmVjdG9y
MnNBcnJheSggZ2VvbWV0cnkudXZzMiApICk7CisKKwkJCX0KKworCQkJaWYgKCBnZW9tZXRyeS5p
bmRpY2VzLmxlbmd0aCA+IDAgKSB7CisKKwkJCQl2YXIgVHlwZUFycmF5ID0gYXJyYXlNYXgoIGdl
b21ldHJ5LmluZGljZXMgKSA+IDY1NTM1ID8gVWludDMyQXJyYXkgOiBVaW50MTZBcnJheTsKKwkJ
CQl2YXIgaW5kaWNlcyA9IG5ldyBUeXBlQXJyYXkoIGdlb21ldHJ5LmluZGljZXMubGVuZ3RoICog
MyApOworCQkJCXRoaXMuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEg
KS5jb3B5SW5kaWNlc0FycmF5KCBnZW9tZXRyeS5pbmRpY2VzICkgKTsKKworCQkJfQorCisJCQkv
LyBncm91cHMKKworCQkJdGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7CisKKwkJCS8vIG1v
cnBocworCisJCQlmb3IgKCB2YXIgbmFtZSBpbiBnZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7CisK
KwkJCQl2YXIgYXJyYXkgPSBbXTsKKwkJCQl2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9y
cGhUYXJnZXRzWyBuYW1lIF07CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBtb3JwaFRhcmdl
dHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCQl2YXIgbW9ycGhUYXJnZXQgPSBtb3Jw
aFRhcmdldHNbIGkgXTsKKworCQkJCQl2YXIgYXR0cmlidXRlID0gbmV3IEZsb2F0MzJCdWZmZXJB
dHRyaWJ1dGUoIG1vcnBoVGFyZ2V0Lmxlbmd0aCAqIDMsIDMgKTsKKworCQkJCQlhcnJheS5wdXNo
KCBhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIG1vcnBoVGFyZ2V0ICkgKTsKKworCQkJCX0K
KworCQkJCXRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTsKKworCQkJfQorCisJ
CQkvLyBza2lubmluZworCisJCQlpZiAoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCA+IDAg
KSB7CisKKwkJCQl2YXIgc2tpbkluZGljZXMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgg
Z2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICogNCwgNCApOworCQkJCXRoaXMuYWRkQXR0cmli
dXRlKCAnc2tpbkluZGV4Jywgc2tpbkluZGljZXMuY29weVZlY3RvcjRzQXJyYXkoIGdlb21ldHJ5
LnNraW5JbmRpY2VzICkgKTsKKworCQkJfQorCisJCQlpZiAoIGdlb21ldHJ5LnNraW5XZWlnaHRz
Lmxlbmd0aCA+IDAgKSB7CisKKwkJCQl2YXIgc2tpbldlaWdodHMgPSBuZXcgRmxvYXQzMkJ1ZmZl
ckF0dHJpYnV0ZSggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICogNCwgNCApOworCQkJCXRo
aXMuYWRkQXR0cmlidXRlKCAnc2tpbldlaWdodCcsIHNraW5XZWlnaHRzLmNvcHlWZWN0b3I0c0Fy
cmF5KCBnZW9tZXRyeS5za2luV2VpZ2h0cyApICk7CisKKwkJCX0KKworCQkJLy8KKworCQkJaWYg
KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHsKKworCQkJCXRoaXMuYm91bmRp
bmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpOworCisJCQl9CisKKwkJ
CWlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7CisKKwkJCQl0aGlzLmJvdW5k
aW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTsKKworCQkJfQorCisJCQlyZXR1
cm4gdGhpczsKKworCQl9LAorCisJCWNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkgewor
CisJCQlpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7CisKKwkJCQl0aGlzLmJvdW5k
aW5nQm94ID0gbmV3IEJveDMoKTsKKworCQkJfQorCisJCQl2YXIgcG9zaXRpb24gPSB0aGlzLmF0
dHJpYnV0ZXMucG9zaXRpb247CisKKwkJCWlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHsK
KworCQkJCXRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24g
KTsKKworCQkJfSBlbHNlIHsKKworCQkJCXRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7CisK
KwkJCX0KKworCQkJaWYgKCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueCApIHx8IGlzTmFO
KCB0aGlzLmJvdW5kaW5nQm94Lm1pbi55ICkgfHwgaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWlu
LnogKSApIHsKKworCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21w
dXRlQm91bmRpbmdCb3g6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBv
c2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7
CisKKwkJCX0KKworCQl9LAorCisJCWNvbXB1dGVCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkg
eworCisJCQl2YXIgYm94ID0gbmV3IEJveDMoKTsKKwkJCXZhciB2ZWN0b3IgPSBuZXcgVmVjdG9y
MygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkgeworCisJ
CQkJaWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgeworCisJCQkJCXRoaXMuYm91
bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7CisKKwkJCQl9CisKKwkJCQl2YXIgcG9zaXRpb24g
PSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247CisKKwkJCQlpZiAoIHBvc2l0aW9uICkgeworCisJ
CQkJCXZhciBjZW50ZXIgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjsKKworCQkJCQlib3gu
c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTsKKwkJCQkJYm94LmdldENlbnRlcigg
Y2VudGVyICk7CisKKwkJCQkJLy8gaG9waW5nIHRvIGZpbmQgYSBib3VuZGluZ1NwaGVyZSB3aXRo
IGEgcmFkaXVzIHNtYWxsZXIgdGhhbiB0aGUKKwkJCQkJLy8gYm91bmRpbmdTcGhlcmUgb2YgdGhl
IGJvdW5kaW5nQm94OiBzcXJ0KDMpIHNtYWxsZXIgaW4gdGhlIGJlc3QgY2FzZQorCisJCQkJCXZh
ciBtYXhSYWRpdXNTcSA9IDA7CisKKwkJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHBvc2l0aW9u
LmNvdW50OyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQkJCXZlY3Rvci54ID0gcG9zaXRpb24uZ2V0
WCggaSApOworCQkJCQkJdmVjdG9yLnkgPSBwb3NpdGlvbi5nZXRZKCBpICk7CisJCQkJCQl2ZWN0
b3IueiA9IHBvc2l0aW9uLmdldFooIGkgKTsKKwkJCQkJCW1heFJhZGl1c1NxID0gTWF0aC5tYXgo
IG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHZlY3RvciApICk7CisKKwkJ
CQkJfQorCisJCQkJCXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhS
YWRpdXNTcSApOworCisJCQkJCWlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVz
ICkgKSB7CisKKwkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21w
dXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlv
biIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApOworCisJ
CQkJCX0KKworCQkJCX0KKworCQkJfTsKKworCQl9KCksCisKKwkJY29tcHV0ZUZhY2VOb3JtYWxz
OiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisKKwkJfSwK
KworCQljb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgaW5kZXgg
PSB0aGlzLmluZGV4OworCQkJdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7CisJCQl2
YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7CisKKwkJCWlmICggYXR0cmlidXRlcy5wb3NpdGlvbiAp
IHsKKworCQkJCXZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5OworCisJ
CQkJaWYgKCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCXRoaXMu
YWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJB
cnJheSggcG9zaXRpb25zLmxlbmd0aCApLCAzICkgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJ
Ly8gcmVzZXQgZXhpc3Rpbmcgbm9ybWFscyB0byB6ZXJvCisKKwkJCQkJdmFyIGFycmF5ID0gYXR0
cmlidXRlcy5ub3JtYWwuYXJyYXk7CisKKwkJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGFycmF5
Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJCQlhcnJheVsgaSBdID0gMDsKKworCQkJ
CQl9CisKKwkJCQl9CisKKwkJCQl2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5
OworCisJCQkJdmFyIHZBLCB2QiwgdkM7CisJCQkJdmFyIHBBID0gbmV3IFZlY3RvcjMoKSwgcEIg
PSBuZXcgVmVjdG9yMygpLCBwQyA9IG5ldyBWZWN0b3IzKCk7CisJCQkJdmFyIGNiID0gbmV3IFZl
Y3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpOworCisJCQkJLy8gaW5kZXhlZCBlbGVtZW50cwor
CisJCQkJaWYgKCBpbmRleCApIHsKKworCQkJCQl2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5Owor
CisJCQkJCWlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHsKKworCQkJCQkJdGhpcy5hZGRHcm91
cCggMCwgaW5kaWNlcy5sZW5ndGggKTsKKworCQkJCQl9CisKKwkJCQkJZm9yICggdmFyIGogPSAw
LCBqbCA9IGdyb3Vwcy5sZW5ndGg7IGogPCBqbDsgKysgaiApIHsKKworCQkJCQkJdmFyIGdyb3Vw
ID0gZ3JvdXBzWyBqIF07CisKKwkJCQkJCXZhciBzdGFydCA9IGdyb3VwLnN0YXJ0OworCQkJCQkJ
dmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7CisKKwkJCQkJCWZvciAoIHZhciBpID0gc3RhcnQsIGls
ID0gc3RhcnQgKyBjb3VudDsgaSA8IGlsOyBpICs9IDMgKSB7CisKKwkJCQkJCQl2QSA9IGluZGlj
ZXNbIGkgKyAwIF0gKiAzOworCQkJCQkJCXZCID0gaW5kaWNlc1sgaSArIDEgXSAqIDM7CisJCQkJ
CQkJdkMgPSBpbmRpY2VzWyBpICsgMiBdICogMzsKKworCQkJCQkJCXBBLmZyb21BcnJheSggcG9z
aXRpb25zLCB2QSApOworCQkJCQkJCXBCLmZyb21BcnJheSggcG9zaXRpb25zLCB2QiApOworCQkJ
CQkJCXBDLmZyb21BcnJheSggcG9zaXRpb25zLCB2QyApOworCisJCQkJCQkJY2Iuc3ViVmVjdG9y
cyggcEMsIHBCICk7CisJCQkJCQkJYWIuc3ViVmVjdG9ycyggcEEsIHBCICk7CisJCQkJCQkJY2Iu
Y3Jvc3MoIGFiICk7CisKKwkJCQkJCQlub3JtYWxzWyB2QSBdICs9IGNiLng7CisJCQkJCQkJbm9y
bWFsc1sgdkEgKyAxIF0gKz0gY2IueTsKKwkJCQkJCQlub3JtYWxzWyB2QSArIDIgXSArPSBjYi56
OworCisJCQkJCQkJbm9ybWFsc1sgdkIgXSArPSBjYi54OworCQkJCQkJCW5vcm1hbHNbIHZCICsg
MSBdICs9IGNiLnk7CisJCQkJCQkJbm9ybWFsc1sgdkIgKyAyIF0gKz0gY2IuejsKKworCQkJCQkJ
CW5vcm1hbHNbIHZDIF0gKz0gY2IueDsKKwkJCQkJCQlub3JtYWxzWyB2QyArIDEgXSArPSBjYi55
OworCQkJCQkJCW5vcm1hbHNbIHZDICsgMiBdICs9IGNiLno7CisKKwkJCQkJCX0KKworCQkJCQl9
CisKKwkJCQl9IGVsc2UgeworCisJCQkJCS8vIG5vbi1pbmRleGVkIGVsZW1lbnRzICh1bmNvbm5l
Y3RlZCB0cmlhbmdsZSBzb3VwKQorCisJCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBwb3NpdGlv
bnMubGVuZ3RoOyBpIDwgaWw7IGkgKz0gOSApIHsKKworCQkJCQkJcEEuZnJvbUFycmF5KCBwb3Np
dGlvbnMsIGkgKTsKKwkJCQkJCXBCLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgMyApOworCQkJ
CQkJcEMuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKyA2ICk7CisKKwkJCQkJCWNiLnN1YlZlY3Rv
cnMoIHBDLCBwQiApOworCQkJCQkJYWIuc3ViVmVjdG9ycyggcEEsIHBCICk7CisJCQkJCQljYi5j
cm9zcyggYWIgKTsKKworCQkJCQkJbm9ybWFsc1sgaSBdID0gY2IueDsKKwkJCQkJCW5vcm1hbHNb
IGkgKyAxIF0gPSBjYi55OworCQkJCQkJbm9ybWFsc1sgaSArIDIgXSA9IGNiLno7CisKKwkJCQkJ
CW5vcm1hbHNbIGkgKyAzIF0gPSBjYi54OworCQkJCQkJbm9ybWFsc1sgaSArIDQgXSA9IGNiLnk7
CisJCQkJCQlub3JtYWxzWyBpICsgNSBdID0gY2IuejsKKworCQkJCQkJbm9ybWFsc1sgaSArIDYg
XSA9IGNiLng7CisJCQkJCQlub3JtYWxzWyBpICsgNyBdID0gY2IueTsKKwkJCQkJCW5vcm1hbHNb
IGkgKyA4IF0gPSBjYi56OworCisJCQkJCX0KKworCQkJCX0KKworCQkJCXRoaXMubm9ybWFsaXpl
Tm9ybWFscygpOworCisJCQkJYXR0cmlidXRlcy5ub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlOwor
CisJCQl9CisKKwkJfSwKKworCQltZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgb2Zmc2V0ICkg
eworCisJCQlpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkg
KSB7CisKKwkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTog
Z2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LicsIGdlb21l
dHJ5ICk7CisJCQkJcmV0dXJuOworCisJCQl9CisKKwkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmlu
ZWQgKSBvZmZzZXQgPSAwOworCisJCQl2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlczsK
KworCQkJZm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkgeworCisJCQkJaWYgKCBnZW9tZXRy
eS5hdHRyaWJ1dGVzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7CisKKwkJCQl2YXIg
YXR0cmlidXRlMSA9IGF0dHJpYnV0ZXNbIGtleSBdOworCQkJCXZhciBhdHRyaWJ1dGVBcnJheTEg
PSBhdHRyaWJ1dGUxLmFycmF5OworCisJCQkJdmFyIGF0dHJpYnV0ZTIgPSBnZW9tZXRyeS5hdHRy
aWJ1dGVzWyBrZXkgXTsKKwkJCQl2YXIgYXR0cmlidXRlQXJyYXkyID0gYXR0cmlidXRlMi5hcnJh
eTsKKworCQkJCXZhciBhdHRyaWJ1dGVTaXplID0gYXR0cmlidXRlMi5pdGVtU2l6ZTsKKworCQkJ
CWZvciAoIHZhciBpID0gMCwgaiA9IGF0dHJpYnV0ZVNpemUgKiBvZmZzZXQ7IGkgPCBhdHRyaWJ1
dGVBcnJheTIubGVuZ3RoOyBpICsrLCBqICsrICkgeworCisJCQkJCWF0dHJpYnV0ZUFycmF5MVsg
aiBdID0gYXR0cmlidXRlQXJyYXkyWyBpIF07CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQlub3JtYWxpemVOb3JtYWxzOiBmdW5jdGlvbiAoKSB7CisKKwkJ
CXZhciBub3JtYWxzID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDsKKworCQkJdmFyIHgsIHksIHos
IG47CisKKwkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBub3JtYWxzLmNvdW50OyBpIDwgaWw7IGkg
KysgKSB7CisKKwkJCQl4ID0gbm9ybWFscy5nZXRYKCBpICk7CisJCQkJeSA9IG5vcm1hbHMuZ2V0
WSggaSApOworCQkJCXogPSBub3JtYWxzLmdldFooIGkgKTsKKworCQkJCW4gPSAxLjAgLyBNYXRo
LnNxcnQoIHggKiB4ICsgeSAqIHkgKyB6ICogeiApOworCisJCQkJbm9ybWFscy5zZXRYWVooIGks
IHggKiBuLCB5ICogbiwgeiAqIG4gKTsKKworCQkJfQorCisJCX0sCisKKwkJdG9Ob25JbmRleGVk
OiBmdW5jdGlvbiAoKSB7CisKKwkJCWlmICggdGhpcy5pbmRleCA9PT0gbnVsbCApIHsKKworCQkJ
CWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9t
ZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLicgKTsKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJ
fQorCisJCQl2YXIgZ2VvbWV0cnkyID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisKKwkJCXZhciBp
bmRpY2VzID0gdGhpcy5pbmRleC5hcnJheTsKKwkJCXZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRy
aWJ1dGVzOworCisJCQlmb3IgKCB2YXIgbmFtZSBpbiBhdHRyaWJ1dGVzICkgeworCisJCQkJdmFy
IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTsKKworCQkJCXZhciBhcnJheSA9IGF0dHJp
YnV0ZS5hcnJheTsKKwkJCQl2YXIgaXRlbVNpemUgPSBhdHRyaWJ1dGUuaXRlbVNpemU7CisKKwkJ
CQl2YXIgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0
ZW1TaXplICk7CisKKwkJCQl2YXIgaW5kZXggPSAwLCBpbmRleDIgPSAwOworCisJCQkJZm9yICgg
dmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJCWlu
ZGV4ID0gaW5kaWNlc1sgaSBdICogaXRlbVNpemU7CisKKwkJCQkJZm9yICggdmFyIGogPSAwOyBq
IDwgaXRlbVNpemU7IGogKysgKSB7CisKKwkJCQkJCWFycmF5MlsgaW5kZXgyICsrIF0gPSBhcnJh
eVsgaW5kZXggKysgXTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlnZW9tZXRyeTIuYWRkQXR0
cmlidXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheTIsIGl0ZW1TaXplICkgKTsK
KworCQkJfQorCisJCQlyZXR1cm4gZ2VvbWV0cnkyOworCisJCX0sCisKKwkJdG9KU09OOiBmdW5j
dGlvbiAoKSB7CisKKwkJCXZhciBkYXRhID0geworCQkJCW1ldGFkYXRhOiB7CisJCQkJCXZlcnNp
b246IDQuNSwKKwkJCQkJdHlwZTogJ0J1ZmZlckdlb21ldHJ5JywKKwkJCQkJZ2VuZXJhdG9yOiAn
QnVmZmVyR2VvbWV0cnkudG9KU09OJworCQkJCX0KKwkJCX07CisKKwkJCS8vIHN0YW5kYXJkIEJ1
ZmZlckdlb21ldHJ5IHNlcmlhbGl6YXRpb24KKworCQkJZGF0YS51dWlkID0gdGhpcy51dWlkOwor
CQkJZGF0YS50eXBlID0gdGhpcy50eXBlOworCQkJaWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0
YS5uYW1lID0gdGhpcy5uYW1lOworCisJCQlpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5kZWZp
bmVkICkgeworCisJCQkJdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7CisKKwkJCQlm
b3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7CisKKwkJCQkJaWYgKCBwYXJhbWV0ZXJzWyBr
ZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTsKKwor
CQkJCX0KKworCQkJCXJldHVybiBkYXRhOworCisJCQl9CisKKwkJCWRhdGEuZGF0YSA9IHsgYXR0
cmlidXRlczoge30gfTsKKworCQkJdmFyIGluZGV4ID0gdGhpcy5pbmRleDsKKworCQkJaWYgKCBp
bmRleCAhPT0gbnVsbCApIHsKKworCQkJCXZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGlj
ZS5jYWxsKCBpbmRleC5hcnJheSApOworCisJCQkJZGF0YS5kYXRhLmluZGV4ID0geworCQkJCQl0
eXBlOiBpbmRleC5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLAorCQkJCQlhcnJheTogYXJyYXkKKwkJ
CQl9OworCisJCQl9CisKKwkJCXZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzOworCisJ
CQlmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7CisKKwkJCQl2YXIgYXR0cmlidXRlID0g
YXR0cmlidXRlc1sga2V5IF07CisKKwkJCQl2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xp
Y2UuY2FsbCggYXR0cmlidXRlLmFycmF5ICk7CisKKwkJCQlkYXRhLmRhdGEuYXR0cmlidXRlc1sg
a2V5IF0gPSB7CisJCQkJCWl0ZW1TaXplOiBhdHRyaWJ1dGUuaXRlbVNpemUsCisJCQkJCXR5cGU6
IGF0dHJpYnV0ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLAorCQkJCQlhcnJheTogYXJyYXksCisJ
CQkJCW5vcm1hbGl6ZWQ6IGF0dHJpYnV0ZS5ub3JtYWxpemVkCisJCQkJfTsKKworCQkJfQorCisJ
CQl2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7CisKKwkJCWlmICggZ3JvdXBzLmxlbmd0aCA+IDAg
KSB7CisKKwkJCQlkYXRhLmRhdGEuZ3JvdXBzID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnko
IGdyb3VwcyApICk7CisKKwkJCX0KKworCQkJdmFyIGJvdW5kaW5nU3BoZXJlID0gdGhpcy5ib3Vu
ZGluZ1NwaGVyZTsKKworCQkJaWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHsKKworCQkJ
CWRhdGEuZGF0YS5ib3VuZGluZ1NwaGVyZSA9IHsKKwkJCQkJY2VudGVyOiBib3VuZGluZ1NwaGVy
ZS5jZW50ZXIudG9BcnJheSgpLAorCQkJCQlyYWRpdXM6IGJvdW5kaW5nU3BoZXJlLnJhZGl1cwor
CQkJCX07CisKKwkJCX0KKworCQkJcmV0dXJuIGRhdGE7CisKKwkJfSwKKworCQljbG9uZTogZnVu
Y3Rpb24gKCkgeworCisJCQkvKgorCQkJIC8vIEhhbmRsZSBwcmltaXRpdmVzCisKKwkJCSB2YXIg
cGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVyczsKKworCQkJIGlmICggcGFyYW1ldGVycyAhPT0g
dW5kZWZpbmVkICkgeworCisJCQkgdmFyIHZhbHVlcyA9IFtdOworCisJCQkgZm9yICggdmFyIGtl
eSBpbiBwYXJhbWV0ZXJzICkgeworCisJCQkgdmFsdWVzLnB1c2goIHBhcmFtZXRlcnNbIGtleSBd
ICk7CisKKwkJCSB9CisKKwkJCSB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNv
bnN0cnVjdG9yLnByb3RvdHlwZSApOworCQkJIHRoaXMuY29uc3RydWN0b3IuYXBwbHkoIGdlb21l
dHJ5LCB2YWx1ZXMgKTsKKwkJCSByZXR1cm4gZ2VvbWV0cnk7CisKKwkJCSB9CisKKwkJCSByZXR1
cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisJCQkgKi8KKworCQkJcmV0
dXJuIG5ldyBCdWZmZXJHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTsKKworCQl9LAorCisJCWNvcHk6
IGZ1bmN0aW9uICggc291cmNlICkgeworCisJCQl2YXIgbmFtZSwgaSwgbDsKKworCQkJLy8gcmVz
ZXQKKworCQkJdGhpcy5pbmRleCA9IG51bGw7CisJCQl0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKKwkJ
CXRoaXMubW9ycGhBdHRyaWJ1dGVzID0ge307CisJCQl0aGlzLmdyb3VwcyA9IFtdOworCQkJdGhp
cy5ib3VuZGluZ0JveCA9IG51bGw7CisJCQl0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDsKKwor
CQkJLy8gbmFtZQorCisJCQl0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTsKKworCQkJLy8gaW5kZXgK
KworCQkJdmFyIGluZGV4ID0gc291cmNlLmluZGV4OworCisJCQlpZiAoIGluZGV4ICE9PSBudWxs
ICkgeworCisJCQkJdGhpcy5zZXRJbmRleCggaW5kZXguY2xvbmUoKSApOworCisJCQl9CisKKwkJ
CS8vIGF0dHJpYnV0ZXMKKworCQkJdmFyIGF0dHJpYnV0ZXMgPSBzb3VyY2UuYXR0cmlidXRlczsK
KworCQkJZm9yICggbmFtZSBpbiBhdHRyaWJ1dGVzICkgeworCisJCQkJdmFyIGF0dHJpYnV0ZSA9
IGF0dHJpYnV0ZXNbIG5hbWUgXTsKKwkJCQl0aGlzLmFkZEF0dHJpYnV0ZSggbmFtZSwgYXR0cmli
dXRlLmNsb25lKCkgKTsKKworCQkJfQorCisJCQkvLyBtb3JwaCBhdHRyaWJ1dGVzCisKKwkJCXZh
ciBtb3JwaEF0dHJpYnV0ZXMgPSBzb3VyY2UubW9ycGhBdHRyaWJ1dGVzOworCisJCQlmb3IgKCBu
YW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHsKKworCQkJCXZhciBhcnJheSA9IFtdOworCQkJCXZh
ciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdOyAvLyBtb3JwaEF0dHJp
YnV0ZTogYXJyYXkgb2YgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZXMKKworCQkJCWZvciAoIGkgPSAw
LCBsID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCQlhcnJh
eS5wdXNoKCBtb3JwaEF0dHJpYnV0ZVsgaSBdLmNsb25lKCkgKTsKKworCQkJCX0KKworCQkJCXRo
aXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTsKKworCQkJfQorCisJCQkvLyBncm91
cHMKKworCQkJdmFyIGdyb3VwcyA9IHNvdXJjZS5ncm91cHM7CisKKwkJCWZvciAoIGkgPSAwLCBs
ID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQl2YXIgZ3JvdXAgPSBncm91
cHNbIGkgXTsKKwkJCQl0aGlzLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdy
b3VwLm1hdGVyaWFsSW5kZXggKTsKKworCQkJfQorCisJCQkvLyBib3VuZGluZyBib3gKKworCQkJ
dmFyIGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94OworCisJCQlpZiAoIGJvdW5kaW5n
Qm94ICE9PSBudWxsICkgeworCisJCQkJdGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNs
b25lKCk7CisKKwkJCX0KKworCQkJLy8gYm91bmRpbmcgc3BoZXJlCisKKwkJCXZhciBib3VuZGlu
Z1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTsKKworCQkJaWYgKCBib3VuZGluZ1NwaGVy
ZSAhPT0gbnVsbCApIHsKKworCQkJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVy
ZS5jbG9uZSgpOworCisJCQl9CisKKwkJCS8vIGRyYXcgcmFuZ2UKKworCQkJdGhpcy5kcmF3UmFu
Z2Uuc3RhcnQgPSBzb3VyY2UuZHJhd1JhbmdlLnN0YXJ0OworCQkJdGhpcy5kcmF3UmFuZ2UuY291
bnQgPSBzb3VyY2UuZHJhd1JhbmdlLmNvdW50OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAor
CisJCWRpc3Bvc2U6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5
cGU6ICdkaXNwb3NlJyB9ICk7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBt
cmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczov
L2dpdGh1Yi5jb20vTXVnZW44NworCSAqLworCisJLy8gQm94R2VvbWV0cnkKKworCWZ1bmN0aW9u
IEJveEdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0
U2VnbWVudHMsIGRlcHRoU2VnbWVudHMgKSB7CisKKwkJR2VvbWV0cnkuY2FsbCggdGhpcyApOwor
CisJCXRoaXMudHlwZSA9ICdCb3hHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0gewor
CQkJd2lkdGg6IHdpZHRoLAorCQkJaGVpZ2h0OiBoZWlnaHQsCisJCQlkZXB0aDogZGVwdGgsCisJ
CQl3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLAorCQkJaGVpZ2h0U2VnbWVudHM6IGhlaWdo
dFNlZ21lbnRzLAorCQkJZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50cworCQl9OworCisJCXRo
aXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWln
aHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyAp
ICk7CisJCXRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisJfQorCisJQm94R2VvbWV0cnkucHJvdG90
eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisJQm94R2VvbWV0cnku
cHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94R2VvbWV0cnk7CisKKwkvLyBCb3hCdWZmZXJHZW9t
ZXRyeQorCisJZnVuY3Rpb24gQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRo
LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHsKKworCQlC
dWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ0JveEJ1ZmZlckdl
b21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQl3aWR0aDogd2lkdGgsCisJCQlo
ZWlnaHQ6IGhlaWdodCwKKwkJCWRlcHRoOiBkZXB0aCwKKwkJCXdpZHRoU2VnbWVudHM6IHdpZHRo
U2VnbWVudHMsCisJCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCisJCQlkZXB0aFNl
Z21lbnRzOiBkZXB0aFNlZ21lbnRzCisJCX07CisKKwkJdmFyIHNjb3BlID0gdGhpczsKKworCQkv
LyBzZWdtZW50cworCisJCXdpZHRoU2VnbWVudHMgPSBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRz
ICkgfHwgMTsKKwkJaGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyAp
IHx8IDE7CisJCWRlcHRoU2VnbWVudHMgPSBNYXRoLmZsb29yKCBkZXB0aFNlZ21lbnRzICkgfHwg
MTsKKworCQkvLyBidWZmZXJzCisKKwkJdmFyIGluZGljZXMgPSBbXTsKKwkJdmFyIHZlcnRpY2Vz
ID0gW107CisJCXZhciBub3JtYWxzID0gW107CisJCXZhciB1dnMgPSBbXTsKKworCQkvLyBoZWxw
ZXIgdmFyaWFibGVzCisKKwkJdmFyIG51bWJlck9mVmVydGljZXMgPSAwOworCQl2YXIgZ3JvdXBT
dGFydCA9IDA7CisKKwkJLy8gYnVpbGQgZWFjaCBzaWRlIG9mIHRoZSBib3ggZ2VvbWV0cnkKKwor
CQlidWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAtIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgICB3
aWR0aCwgIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAwICk7IC8vIHB4CisJCWJ1aWxk
UGxhbmUoICd6JywgJ3knLCAneCcsICAgMSwgLSAxLCBkZXB0aCwgaGVpZ2h0LCAtIHdpZHRoLCAg
ZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDEgKTsgLy8gbngKKwkJYnVpbGRQbGFuZSgg
J3gnLCAneicsICd5JywgICAxLCAgIDEsIHdpZHRoLCBkZXB0aCwgICAgaGVpZ2h0LCB3aWR0aFNl
Z21lbnRzLCBkZXB0aFNlZ21lbnRzLCAgMiApOyAvLyBweQorCQlidWlsZFBsYW5lKCAneCcsICd6
JywgJ3knLCAgIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAgLSBoZWlnaHQsIHdpZHRoU2VnbWVudHMs
IGRlcHRoU2VnbWVudHMsICAzICk7IC8vIG55CisJCWJ1aWxkUGxhbmUoICd4JywgJ3knLCAneics
ICAgMSwgLSAxLCB3aWR0aCwgaGVpZ2h0LCAgIGRlcHRoLCAgd2lkdGhTZWdtZW50cywgaGVpZ2h0
U2VnbWVudHMsIDQgKTsgLy8gcHoKKwkJYnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgLSAxLCAt
IDEsIHdpZHRoLCBoZWlnaHQsIC0gZGVwdGgsICB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50
cywgNSApOyAvLyBuegorCisJCS8vIGJ1aWxkIGdlb21ldHJ5CisKKwkJdGhpcy5zZXRJbmRleCgg
aW5kaWNlcyApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJC
dWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICdu
b3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CisJCXRo
aXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAy
ICkgKTsKKworCQlmdW5jdGlvbiBidWlsZFBsYW5lKCB1LCB2LCB3LCB1ZGlyLCB2ZGlyLCB3aWR0
aCwgaGVpZ2h0LCBkZXB0aCwgZ3JpZFgsIGdyaWRZLCBtYXRlcmlhbEluZGV4ICkgeworCisJCQl2
YXIgc2VnbWVudFdpZHRoID0gd2lkdGggLyBncmlkWDsKKwkJCXZhciBzZWdtZW50SGVpZ2h0ID0g
aGVpZ2h0IC8gZ3JpZFk7CisKKwkJCXZhciB3aWR0aEhhbGYgPSB3aWR0aCAvIDI7CisJCQl2YXIg
aGVpZ2h0SGFsZiA9IGhlaWdodCAvIDI7CisJCQl2YXIgZGVwdGhIYWxmID0gZGVwdGggLyAyOwor
CisJCQl2YXIgZ3JpZFgxID0gZ3JpZFggKyAxOworCQkJdmFyIGdyaWRZMSA9IGdyaWRZICsgMTsK
KworCQkJdmFyIHZlcnRleENvdW50ZXIgPSAwOworCQkJdmFyIGdyb3VwQ291bnQgPSAwOworCisJ
CQl2YXIgaXgsIGl5OworCisJCQl2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTsKKworCQkJLy8g
Z2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2cworCisJCQlmb3IgKCBpeSA9IDA7IGl5
IDwgZ3JpZFkxOyBpeSArKyApIHsKKworCQkJCXZhciB5ID0gaXkgKiBzZWdtZW50SGVpZ2h0IC0g
aGVpZ2h0SGFsZjsKKworCQkJCWZvciAoIGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkgewor
CisJCQkJCXZhciB4ID0gaXggKiBzZWdtZW50V2lkdGggLSB3aWR0aEhhbGY7CisKKwkJCQkJLy8g
c2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnQKKworCQkJCQl2ZWN0b3JbIHUg
XSA9IHggKiB1ZGlyOworCQkJCQl2ZWN0b3JbIHYgXSA9IHkgKiB2ZGlyOworCQkJCQl2ZWN0b3Jb
IHcgXSA9IGRlcHRoSGFsZjsKKworCQkJCQkvLyBub3cgYXBwbHkgdmVjdG9yIHRvIHZlcnRleCBi
dWZmZXIKKworCQkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56
ICk7CisKKwkJCQkJLy8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnQKKwor
CQkJCQl2ZWN0b3JbIHUgXSA9IDA7CisJCQkJCXZlY3RvclsgdiBdID0gMDsKKwkJCQkJdmVjdG9y
WyB3IF0gPSBkZXB0aCA+IDAgPyAxIDogLSAxOworCisJCQkJCS8vIG5vdyBhcHBseSB2ZWN0b3Ig
dG8gbm9ybWFsIGJ1ZmZlcgorCisJCQkJCW5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55
LCB2ZWN0b3IueiApOworCisJCQkJCS8vIHV2cworCisJCQkJCXV2cy5wdXNoKCBpeCAvIGdyaWRY
ICk7CisJCQkJCXV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTsKKworCQkJCQkvLyBjb3Vu
dGVycworCisJCQkJCXZlcnRleENvdW50ZXIgKz0gMTsKKworCQkJCX0KKworCQkJfQorCisJCQkv
LyBpbmRpY2VzCisKKwkJCS8vIDEuIHlvdSBuZWVkIHRocmVlIGluZGljZXMgdG8gZHJhdyBhIHNp
bmdsZSBmYWNlCisJCQkvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNl
cworCQkJLy8gMy4gc28gd2UgbmVlZCB0byBnZW5lcmF0ZSBzaXggKDIqMykgaW5kaWNlcyBwZXIg
c2VnbWVudAorCisJCQlmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkgeworCisJCQkJ
Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHsKKworCQkJCQl2YXIgYSA9IG51bWJl
ck9mVmVydGljZXMgKyBpeCArIGdyaWRYMSAqIGl5OworCQkJCQl2YXIgYiA9IG51bWJlck9mVmVy
dGljZXMgKyBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7CisJCQkJCXZhciBjID0gbnVtYmVyT2ZW
ZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApOworCQkJCQl2YXIgZCA9
IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogaXk7CisKKwkJCQkJLy8g
ZmFjZXMKKworCQkJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKKwkJCQkJaW5kaWNlcy5wdXNo
KCBiLCBjLCBkICk7CisKKwkJCQkJLy8gaW5jcmVhc2UgY291bnRlcgorCisJCQkJCWdyb3VwQ291
bnQgKz0gNjsKKworCQkJCX0KKworCQkJfQorCisJCQkvLyBhZGQgYSBncm91cCB0byB0aGUgZ2Vv
bWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydAorCisJCQlzY29w
ZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApOworCisJ
CQkvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHMKKworCQkJZ3JvdXBTdGFy
dCArPSBncm91cENvdW50OworCisJCQkvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2Vz
CisKKwkJCW51bWJlck9mVmVydGljZXMgKz0gdmVydGV4Q291bnRlcjsKKworCQl9CisKKwl9CisK
KwlCb3hCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9t
ZXRyeS5wcm90b3R5cGUgKTsKKwlCb3hCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0
b3IgPSBCb3hCdWZmZXJHZW9tZXRyeTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0
cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29t
L011Z2VuODcKKwkgKi8KKworCS8vIFBsYW5lR2VvbWV0cnkKKworCWZ1bmN0aW9uIFBsYW5lR2Vv
bWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkgewor
CisJCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnUGxhbmVHZW9tZXRy
eSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJd2lkdGg6IHdpZHRoLAorCQkJaGVpZ2h0
OiBoZWlnaHQsCisJCQl3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLAorCQkJaGVpZ2h0U2Vn
bWVudHM6IGhlaWdodFNlZ21lbnRzCisJCX07CisKKwkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnko
IG5ldyBQbGFuZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBo
ZWlnaHRTZWdtZW50cyApICk7CisJCXRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisJfQorCisJUGxh
bmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUg
KTsKKwlQbGFuZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBsYW5lR2VvbWV0cnk7
CisKKwkvLyBQbGFuZUJ1ZmZlckdlb21ldHJ5CisKKwlmdW5jdGlvbiBQbGFuZUJ1ZmZlckdlb21l
dHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHsKKwor
CQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1BsYW5lQnVm
ZmVyR2VvbWV0cnknOworCisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXdpZHRoOiB3aWR0aCwK
KwkJCWhlaWdodDogaGVpZ2h0LAorCQkJd2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cywKKwkJ
CWhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cworCQl9OworCisJCXZhciB3aWR0aF9oYWxm
ID0gd2lkdGggLyAyOworCQl2YXIgaGVpZ2h0X2hhbGYgPSBoZWlnaHQgLyAyOworCisJCXZhciBn
cmlkWCA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCAxOworCQl2YXIgZ3JpZFkgPSBN
YXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7CisKKwkJdmFyIGdyaWRYMSA9IGdyaWRY
ICsgMTsKKwkJdmFyIGdyaWRZMSA9IGdyaWRZICsgMTsKKworCQl2YXIgc2VnbWVudF93aWR0aCA9
IHdpZHRoIC8gZ3JpZFg7CisJCXZhciBzZWdtZW50X2hlaWdodCA9IGhlaWdodCAvIGdyaWRZOwor
CisJCXZhciBpeCwgaXk7CisKKwkJLy8gYnVmZmVycworCisJCXZhciBpbmRpY2VzID0gW107CisJ
CXZhciB2ZXJ0aWNlcyA9IFtdOworCQl2YXIgbm9ybWFscyA9IFtdOworCQl2YXIgdXZzID0gW107
CisKKwkJLy8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2cworCisJCWZvciAoIGl5
ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkgeworCisJCQl2YXIgeSA9IGl5ICogc2VnbWVudF9o
ZWlnaHQgLSBoZWlnaHRfaGFsZjsKKworCQkJZm9yICggaXggPSAwOyBpeCA8IGdyaWRYMTsgaXgg
KysgKSB7CisKKwkJCQl2YXIgeCA9IGl4ICogc2VnbWVudF93aWR0aCAtIHdpZHRoX2hhbGY7CisK
KwkJCQl2ZXJ0aWNlcy5wdXNoKCB4LCAtIHksIDAgKTsKKworCQkJCW5vcm1hbHMucHVzaCggMCwg
MCwgMSApOworCisJCQkJdXZzLnB1c2goIGl4IC8gZ3JpZFggKTsKKwkJCQl1dnMucHVzaCggMSAt
ICggaXkgLyBncmlkWSApICk7CisKKwkJCX0KKworCQl9CisKKwkJLy8gaW5kaWNlcworCisJCWZv
ciAoIGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7CisKKwkJCWZvciAoIGl4ID0gMDsgaXgg
PCBncmlkWDsgaXggKysgKSB7CisKKwkJCQl2YXIgYSA9IGl4ICsgZ3JpZFgxICogaXk7CisJCQkJ
dmFyIGIgPSBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7CisJCQkJdmFyIGMgPSAoIGl4ICsgMSAp
ICsgZ3JpZFgxICogKCBpeSArIDEgKTsKKwkJCQl2YXIgZCA9ICggaXggKyAxICkgKyBncmlkWDEg
KiBpeTsKKworCQkJCS8vIGZhY2VzCisKKwkJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKKwkJ
CQlpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTsKKworCQkJfQorCisJCX0KKworCQkvLyBidWlsZCBn
ZW9tZXRyeQorCisJCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1
dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyAp
ICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRy
aWJ1dGUoIG5vcm1hbHMsIDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZs
b2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CisKKwl9CisKKwlQbGFuZUJ1ZmZlckdl
b21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlw
ZSApOworCVBsYW5lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVC
dWZmZXJHZW9tZXRyeTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9v
Yi5jb20vCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8K
KwkgKgorCSAqIHBhcmFtZXRlcnMgPSB7CisJICogIGNvbG9yOiA8aGV4PiwKKwkgKiAgb3BhY2l0
eTogPGZsb2F0PiwKKwkgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAq
CisJICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqICBsaWdo
dE1hcEludGVuc2l0eTogPGZsb2F0PgorCSAqCisJICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVy
ZSggPEltYWdlPiApLAorCSAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PgorCSAqCisJICogIHNw
ZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqCisJICogIGFscGhh
TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqCisJICogIGVudk1hcDogbmV3
IFRIUkVFLlRleHR1cmVDdWJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0g
KSwKKwkgKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksCisJICogIHJlZmxlY3Rpdml0eTogPGZs
b2F0PiwKKwkgKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LAorCSAqCisJICogIHNoYWRpbmc6
IFRIUkVFLlNtb290aFNoYWRpbmcsCisJICogIGRlcHRoVGVzdDogPGJvb2w+LAorCSAqICBkZXB0
aFdyaXRlOiA8Ym9vbD4sCisJICoKKwkgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCisJICogIHdp
cmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PiwKKwkgKgorCSAqICBza2lubmluZzogPGJvb2w+LAor
CSAqICBtb3JwaFRhcmdldHM6IDxib29sPgorCSAqIH0KKwkgKi8KKworCWZ1bmN0aW9uIE1lc2hC
YXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsK
KworCQl0aGlzLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnOworCisJCXRoaXMuY29sb3IgPSBu
ZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGVtaXNzaXZlCisKKwkJdGhpcy5tYXAgPSBudWxsOwor
CisJCXRoaXMubGlnaHRNYXAgPSBudWxsOworCQl0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4w
OworCisJCXRoaXMuYW9NYXAgPSBudWxsOworCQl0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wOwor
CisJCXRoaXMuc3BlY3VsYXJNYXAgPSBudWxsOworCisJCXRoaXMuYWxwaGFNYXAgPSBudWxsOwor
CisJCXRoaXMuZW52TWFwID0gbnVsbDsKKwkJdGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRp
b247CisJCXRoaXMucmVmbGVjdGl2aXR5ID0gMTsKKwkJdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAw
Ljk4OworCisJCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CisJCXRoaXMud2lyZWZyYW1lTGluZXdp
ZHRoID0gMTsKKwkJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJzsKKwkJdGhpcy53aXJl
ZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CisKKwkJdGhpcy5za2lubmluZyA9IGZhbHNlOworCQl0
aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOworCisJCXRoaXMubGlnaHRzID0gZmFsc2U7CisKKwkJ
dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKKworCX0KKworCU1lc2hCYXNpY01hdGVyaWFs
LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOworCU1lc2hC
YXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hCYXNpY01hdGVyaWFsOwor
CisJTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaEJhc2ljTWF0ZXJpYWwgPSB0cnVl
OworCisJTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJj
ZSApIHsKKworCQlNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsK
KworCQl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworCisJCXRoaXMubWFwID0gc291
cmNlLm1hcDsKKworCQl0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwOworCQl0aGlzLmxp
Z2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5OworCisJCXRoaXMuYW9N
YXAgPSBzb3VyY2UuYW9NYXA7CisJCXRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJ
bnRlbnNpdHk7CisKKwkJdGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKKwor
CQl0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwOworCisJCXRoaXMuZW52TWFwID0gc291
cmNlLmVudk1hcDsKKwkJdGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7CisJCXRoaXMucmVm
bGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTsKKwkJdGhpcy5yZWZyYWN0aW9uUmF0aW8g
PSBzb3VyY2UucmVmcmFjdGlvblJhdGlvOworCisJCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndp
cmVmcmFtZTsKKwkJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGlu
ZXdpZHRoOworCQl0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNh
cDsKKwkJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsK
KworCQl0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nOworCQl0aGlzLm1vcnBoVGFyZ2V0
cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CisKKwkJcmV0dXJuIHRoaXM7CisKKwl9OworCisJLyoq
CisJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworCSAqLworCisJZnVuY3Rp
b24gUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApIHsKKworCQl0aGlzLm9yaWdpbiA9ICggb3JpZ2lu
ICE9PSB1bmRlZmluZWQgKSA/IG9yaWdpbiA6IG5ldyBWZWN0b3IzKCk7CisJCXRoaXMuZGlyZWN0
aW9uID0gKCBkaXJlY3Rpb24gIT09IHVuZGVmaW5lZCApID8gZGlyZWN0aW9uIDogbmV3IFZlY3Rv
cjMoKTsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIFJheS5wcm90b3R5cGUsIHsKKworCQlzZXQ6
IGZ1bmN0aW9uICggb3JpZ2luLCBkaXJlY3Rpb24gKSB7CisKKwkJCXRoaXMub3JpZ2luLmNvcHko
IG9yaWdpbiApOworCQkJdGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJu
IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOworCisJCX0sCisKKwkJY29weTog
ZnVuY3Rpb24gKCByYXkgKSB7CisKKwkJCXRoaXMub3JpZ2luLmNvcHkoIHJheS5vcmlnaW4gKTsK
KwkJCXRoaXMuZGlyZWN0aW9uLmNvcHkoIHJheS5kaXJlY3Rpb24gKTsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfSwKKworCQlhdDogZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKKwor
CQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJl
dHVybiByZXN1bHQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFk
ZCggdGhpcy5vcmlnaW4gKTsKKworCQl9LAorCisJCWxvb2tBdDogZnVuY3Rpb24gKCB2ICkgewor
CisJCQl0aGlzLmRpcmVjdGlvbi5jb3B5KCB2ICkuc3ViKCB0aGlzLm9yaWdpbiApLm5vcm1hbGl6
ZSgpOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXJlY2FzdDogZnVuY3Rpb24gKCkg
eworCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gcmVj
YXN0KCB0ICkgeworCisJCQkJdGhpcy5vcmlnaW4uY29weSggdGhpcy5hdCggdCwgdjEgKSApOwor
CisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWNsb3Nlc3RQb2ludFRv
UG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQl2YXIgcmVz
dWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKwkJCXJlc3VsdC5zdWJWZWN0
b3JzKCBwb2ludCwgdGhpcy5vcmlnaW4gKTsKKwkJCXZhciBkaXJlY3Rpb25EaXN0YW5jZSA9IHJl
c3VsdC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7CisKKwkJCWlmICggZGlyZWN0aW9uRGlzdGFuY2Ug
PCAwICkgeworCisJCQkJcmV0dXJuIHJlc3VsdC5jb3B5KCB0aGlzLm9yaWdpbiApOworCisJCQl9
CisKKwkJCXJldHVybiByZXN1bHQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxh
ciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7CisKKwkJfSwKKworCQlk
aXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CisKKwkJCXJldHVybiBNYXRoLnNx
cnQoIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkgKTsKKworCQl9LAorCisJCWRpc3Rh
bmNlU3FUb1BvaW50OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7
CisKKwkJCXJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSB7CisKKwkJ
CQl2YXIgZGlyZWN0aW9uRGlzdGFuY2UgPSB2MS5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5vcmln
aW4gKS5kb3QoIHRoaXMuZGlyZWN0aW9uICk7CisKKwkJCQkvLyBwb2ludCBiZWhpbmQgdGhlIHJh
eQorCisJCQkJaWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7CisKKwkJCQkJcmV0dXJuIHRo
aXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApOworCisJCQkJfQorCisJCQkJdjEu
Y29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2Ug
KS5hZGQoIHRoaXMub3JpZ2luICk7CisKKwkJCQlyZXR1cm4gdjEuZGlzdGFuY2VUb1NxdWFyZWQo
IHBvaW50ICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWRpc3RhbmNlU3FUb1NlZ21lbnQ6IGZ1
bmN0aW9uICgpIHsKKworCQkJdmFyIHNlZ0NlbnRlciA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIg
c2VnRGlyID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciBkaWZmID0gbmV3IFZlY3RvcjMoKTsKKwor
CQkJcmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlU3FUb1NlZ21lbnQoIHYwLCB2MSwgb3B0aW9uYWxQ
b2ludE9uUmF5LCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkgeworCisJCQkJLy8gZnJvbSBodHRw
Oi8vd3d3Lmdlb21ldHJpY3Rvb2xzLmNvbS9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0
ZURpc3RSYXlTZWdtZW50LmgKKwkJCQkvLyBJdCByZXR1cm5zIHRoZSBtaW4gZGlzdGFuY2UgYmV0
d2VlbiB0aGUgcmF5IGFuZCB0aGUgc2VnbWVudAorCQkJCS8vIGRlZmluZWQgYnkgdjAgYW5kIHYx
CisJCQkJLy8gSXQgY2FuIGFsc28gc2V0IHR3byBvcHRpb25hbCB0YXJnZXRzIDoKKwkJCQkvLyAt
IFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSByYXkKKwkJCQkvLyAtIFRoZSBjbG9zZXN0IHBvaW50
IG9uIHRoZSBzZWdtZW50CisKKwkJCQlzZWdDZW50ZXIuY29weSggdjAgKS5hZGQoIHYxICkubXVs
dGlwbHlTY2FsYXIoIDAuNSApOworCQkJCXNlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3Jt
YWxpemUoKTsKKwkJCQlkaWZmLmNvcHkoIHRoaXMub3JpZ2luICkuc3ViKCBzZWdDZW50ZXIgKTsK
KworCQkJCXZhciBzZWdFeHRlbnQgPSB2MC5kaXN0YW5jZVRvKCB2MSApICogMC41OworCQkJCXZh
ciBhMDEgPSAtIHRoaXMuZGlyZWN0aW9uLmRvdCggc2VnRGlyICk7CisJCQkJdmFyIGIwID0gZGlm
Zi5kb3QoIHRoaXMuZGlyZWN0aW9uICk7CisJCQkJdmFyIGIxID0gLSBkaWZmLmRvdCggc2VnRGly
ICk7CisJCQkJdmFyIGMgPSBkaWZmLmxlbmd0aFNxKCk7CisJCQkJdmFyIGRldCA9IE1hdGguYWJz
KCAxIC0gYTAxICogYTAxICk7CisJCQkJdmFyIHMwLCBzMSwgc3FyRGlzdCwgZXh0RGV0OworCisJ
CQkJaWYgKCBkZXQgPiAwICkgeworCisJCQkJCS8vIFRoZSByYXkgYW5kIHNlZ21lbnQgYXJlIG5v
dCBwYXJhbGxlbC4KKworCQkJCQlzMCA9IGEwMSAqIGIxIC0gYjA7CisJCQkJCXMxID0gYTAxICog
YjAgLSBiMTsKKwkJCQkJZXh0RGV0ID0gc2VnRXh0ZW50ICogZGV0OworCisJCQkJCWlmICggczAg
Pj0gMCApIHsKKworCQkJCQkJaWYgKCBzMSA+PSAtIGV4dERldCApIHsKKworCQkJCQkJCWlmICgg
czEgPD0gZXh0RGV0ICkgeworCisJCQkJCQkJCS8vIHJlZ2lvbiAwCisJCQkJCQkJCS8vIE1pbmlt
dW0gYXQgaW50ZXJpb3IgcG9pbnRzIG9mIHJheSBhbmQgc2VnbWVudC4KKworCQkJCQkJCQl2YXIg
aW52RGV0ID0gMSAvIGRldDsKKwkJCQkJCQkJczAgKj0gaW52RGV0OworCQkJCQkJCQlzMSAqPSBp
bnZEZXQ7CisJCQkJCQkJCXNxckRpc3QgPSBzMCAqICggczAgKyBhMDEgKiBzMSArIDIgKiBiMCAp
ICsgczEgKiAoIGEwMSAqIHMwICsgczEgKyAyICogYjEgKSArIGM7CisKKwkJCQkJCQl9IGVsc2Ug
eworCisJCQkJCQkJCS8vIHJlZ2lvbiAxCisKKwkJCQkJCQkJczEgPSBzZWdFeHRlbnQ7CisJCQkJ
CQkJCXMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTsKKwkJCQkJCQkJc3Fy
RGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYzsKKworCQkJCQkJCX0K
KworCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCS8vIHJlZ2lvbiA1CisKKwkJCQkJCQlzMSA9IC0g
c2VnRXh0ZW50OworCQkJCQkJCXMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkg
KTsKKwkJCQkJCQlzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBj
OworCisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJaWYgKCBzMSA8PSAtIGV4dERl
dCApIHsKKworCQkJCQkJCS8vIHJlZ2lvbiA0CisKKwkJCQkJCQlzMCA9IE1hdGgubWF4KCAwLCAt
ICggLSBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7CisJCQkJCQkJczEgPSAoIHMwID4gMCApID8g
LSBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNl
Z0V4dGVudCApOworCQkJCQkJCXNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICog
YjEgKSArIGM7CisKKwkJCQkJCX0gZWxzZSBpZiAoIHMxIDw9IGV4dERldCApIHsKKworCQkJCQkJ
CS8vIHJlZ2lvbiAzCisKKwkJCQkJCQlzMCA9IDA7CisJCQkJCQkJczEgPSBNYXRoLm1pbiggTWF0
aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApOworCQkJCQkJCXNxckRpc3Qg
PSBzMSAqICggczEgKyAyICogYjEgKSArIGM7CisKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQkv
LyByZWdpb24gMgorCisJCQkJCQkJczAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHNlZ0V4dGVu
dCArIGIwICkgKTsKKwkJCQkJCQlzMSA9ICggczAgPiAwICkgPyBzZWdFeHRlbnQgOiBNYXRoLm1p
biggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApOworCQkJCQkJCXNx
ckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7CisKKwkJCQkJCX0K
KworCQkJCQl9CisKKwkJCQl9IGVsc2UgeworCisJCQkJCS8vIFJheSBhbmQgc2VnbWVudCBhcmUg
cGFyYWxsZWwuCisKKwkJCQkJczEgPSAoIGEwMSA+IDAgKSA/IC0gc2VnRXh0ZW50IDogc2VnRXh0
ZW50OworCQkJCQlzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7CisJCQkJ
CXNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7CisKKwkJCQl9
CisKKwkJCQlpZiAoIG9wdGlvbmFsUG9pbnRPblJheSApIHsKKworCQkJCQlvcHRpb25hbFBvaW50
T25SYXkuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggczAgKS5hZGQoIHRo
aXMub3JpZ2luICk7CisKKwkJCQl9CisKKwkJCQlpZiAoIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQg
KSB7CisKKwkJCQkJb3B0aW9uYWxQb2ludE9uU2VnbWVudC5jb3B5KCBzZWdEaXIgKS5tdWx0aXBs
eVNjYWxhciggczEgKS5hZGQoIHNlZ0NlbnRlciApOworCisJCQkJfQorCisJCQkJcmV0dXJuIHNx
ckRpc3Q7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWludGVyc2VjdFNwaGVyZTogZnVuY3Rpb24g
KCkgeworCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24g
aW50ZXJzZWN0U3BoZXJlKCBzcGhlcmUsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQkJdjEuc3Vi
VmVjdG9ycyggc3BoZXJlLmNlbnRlciwgdGhpcy5vcmlnaW4gKTsKKwkJCQl2YXIgdGNhID0gdjEu
ZG90KCB0aGlzLmRpcmVjdGlvbiApOworCQkJCXZhciBkMiA9IHYxLmRvdCggdjEgKSAtIHRjYSAq
IHRjYTsKKwkJCQl2YXIgcmFkaXVzMiA9IHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzOwor
CisJCQkJaWYgKCBkMiA+IHJhZGl1czIgKSByZXR1cm4gbnVsbDsKKworCQkJCXZhciB0aGMgPSBN
YXRoLnNxcnQoIHJhZGl1czIgLSBkMiApOworCisJCQkJLy8gdDAgPSBmaXJzdCBpbnRlcnNlY3Qg
cG9pbnQgLSBlbnRyYW5jZSBvbiBmcm9udCBvZiBzcGhlcmUKKwkJCQl2YXIgdDAgPSB0Y2EgLSB0
aGM7CisKKwkJCQkvLyB0MSA9IHNlY29uZCBpbnRlcnNlY3QgcG9pbnQgLSBleGl0IHBvaW50IG9u
IGJhY2sgb2Ygc3BoZXJlCisJCQkJdmFyIHQxID0gdGNhICsgdGhjOworCisJCQkJLy8gdGVzdCB0
byBzZWUgaWYgYm90aCB0MCBhbmQgdDEgYXJlIGJlaGluZCB0aGUgcmF5IC0gaWYgc28sIHJldHVy
biBudWxsCisJCQkJaWYgKCB0MCA8IDAgJiYgdDEgPCAwICkgcmV0dXJuIG51bGw7CisKKwkJCQkv
LyB0ZXN0IHRvIHNlZSBpZiB0MCBpcyBiZWhpbmQgdGhlIHJheToKKwkJCQkvLyBpZiBpdCBpcywg
dGhlIHJheSBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgc28gcmV0dXJuIHRoZSBzZWNvbmQgZXhpdCBw
b2ludCBzY2FsZWQgYnkgdDEsCisJCQkJLy8gaW4gb3JkZXIgdG8gYWx3YXlzIHJldHVybiBhbiBp
bnRlcnNlY3QgcG9pbnQgdGhhdCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LgorCQkJCWlmICggdDAg
PCAwICkgcmV0dXJuIHRoaXMuYXQoIHQxLCBvcHRpb25hbFRhcmdldCApOworCisJCQkJLy8gZWxz
ZSB0MCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LCBzbyByZXR1cm4gdGhlIGZpcnN0IGNvbGxpc2lv
biBwb2ludCBzY2FsZWQgYnkgdDAKKwkJCQlyZXR1cm4gdGhpcy5hdCggdDAsIG9wdGlvbmFsVGFy
Z2V0ICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9u
ICggc3BoZXJlICkgeworCisJCQlyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5j
ZW50ZXIgKSA8PSBzcGhlcmUucmFkaXVzOworCisJCX0sCisKKwkJZGlzdGFuY2VUb1BsYW5lOiBm
dW5jdGlvbiAoIHBsYW5lICkgeworCisJCQl2YXIgZGVub21pbmF0b3IgPSBwbGFuZS5ub3JtYWwu
ZG90KCB0aGlzLmRpcmVjdGlvbiApOworCisJCQlpZiAoIGRlbm9taW5hdG9yID09PSAwICkgewor
CisJCQkJLy8gbGluZSBpcyBjb3BsYW5hciwgcmV0dXJuIG9yaWdpbgorCQkJCWlmICggcGxhbmUu
ZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApID09PSAwICkgeworCisJCQkJCXJldHVybiAw
OworCisJCQkJfQorCisJCQkJLy8gTnVsbCBpcyBwcmVmZXJhYmxlIHRvIHVuZGVmaW5lZCBzaW5j
ZSB1bmRlZmluZWQgbWVhbnMuLi4uIGl0IGlzIHVuZGVmaW5lZAorCisJCQkJcmV0dXJuIG51bGw7
CisKKwkJCX0KKworCQkJdmFyIHQgPSAtICggdGhpcy5vcmlnaW4uZG90KCBwbGFuZS5ub3JtYWwg
KSArIHBsYW5lLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjsKKworCQkJLy8gUmV0dXJuIGlmIHRo
ZSByYXkgbmV2ZXIgaW50ZXJzZWN0cyB0aGUgcGxhbmUKKworCQkJcmV0dXJuIHQgPj0gMCA/IHQg
OiAgbnVsbDsKKworCQl9LAorCisJCWludGVyc2VjdFBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lLCBv
cHRpb25hbFRhcmdldCApIHsKKworCQkJdmFyIHQgPSB0aGlzLmRpc3RhbmNlVG9QbGFuZSggcGxh
bmUgKTsKKworCQkJaWYgKCB0ID09PSBudWxsICkgeworCisJCQkJcmV0dXJuIG51bGw7CisKKwkJ
CX0KKworCQkJcmV0dXJuIHRoaXMuYXQoIHQsIG9wdGlvbmFsVGFyZ2V0ICk7CisKKwkJfSwKKwor
CQlpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7CisKKwkJCS8vIGNoZWNrIGlm
IHRoZSByYXkgbGllcyBvbiB0aGUgcGxhbmUgZmlyc3QKKworCQkJdmFyIGRpc3RUb1BvaW50ID0g
cGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApOworCisJCQlpZiAoIGRpc3RUb1Bv
aW50ID09PSAwICkgeworCisJCQkJcmV0dXJuIHRydWU7CisKKwkJCX0KKworCQkJdmFyIGRlbm9t
aW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTsKKworCQkJaWYgKCBk
ZW5vbWluYXRvciAqIGRpc3RUb1BvaW50IDwgMCApIHsKKworCQkJCXJldHVybiB0cnVlOworCisJ
CQl9CisKKwkJCS8vIHJheSBvcmlnaW4gaXMgYmVoaW5kIHRoZSBwbGFuZSAoYW5kIGlzIHBvaW50
aW5nIGJlaGluZCBpdCkKKworCQkJcmV0dXJuIGZhbHNlOworCisJCX0sCisKKwkJaW50ZXJzZWN0
Qm94OiBmdW5jdGlvbiAoIGJveCwgb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCXZhciB0bWluLCB0
bWF4LCB0eW1pbiwgdHltYXgsIHR6bWluLCB0em1heDsKKworCQkJdmFyIGludmRpcnggPSAxIC8g
dGhpcy5kaXJlY3Rpb24ueCwKKwkJCQlpbnZkaXJ5ID0gMSAvIHRoaXMuZGlyZWN0aW9uLnksCisJ
CQkJaW52ZGlyeiA9IDEgLyB0aGlzLmRpcmVjdGlvbi56OworCisJCQl2YXIgb3JpZ2luID0gdGhp
cy5vcmlnaW47CisKKwkJCWlmICggaW52ZGlyeCA+PSAwICkgeworCisJCQkJdG1pbiA9ICggYm94
Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7CisJCQkJdG1heCA9ICggYm94Lm1heC54IC0g
b3JpZ2luLnggKSAqIGludmRpcng7CisKKwkJCX0gZWxzZSB7CisKKwkJCQl0bWluID0gKCBib3gu
bWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDsKKwkJCQl0bWF4ID0gKCBib3gubWluLnggLSBv
cmlnaW4ueCApICogaW52ZGlyeDsKKworCQkJfQorCisJCQlpZiAoIGludmRpcnkgPj0gMCApIHsK
KworCQkJCXR5bWluID0gKCBib3gubWluLnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTsKKwkJCQl0
eW1heCA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7CisKKwkJCX0gZWxzZSB7
CisKKwkJCQl0eW1pbiA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7CisJCQkJ
dHltYXggPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5OworCisJCQl9CisKKwkJ
CWlmICggKCB0bWluID4gdHltYXggKSB8fCAoIHR5bWluID4gdG1heCApICkgcmV0dXJuIG51bGw7
CisKKwkJCS8vIFRoZXNlIGxpbmVzIGFsc28gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRtaW4gb3Ig
dG1heCBpcyBOYU4KKwkJCS8vIChyZXN1bHQgb2YgMCAqIEluZmluaXR5KS4geCAhPT0geCByZXR1
cm5zIHRydWUgaWYgeCBpcyBOYU4KKworCQkJaWYgKCB0eW1pbiA+IHRtaW4gfHwgdG1pbiAhPT0g
dG1pbiApIHRtaW4gPSB0eW1pbjsKKworCQkJaWYgKCB0eW1heCA8IHRtYXggfHwgdG1heCAhPT0g
dG1heCApIHRtYXggPSB0eW1heDsKKworCQkJaWYgKCBpbnZkaXJ6ID49IDAgKSB7CisKKwkJCQl0
em1pbiA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7CisJCQkJdHptYXggPSAo
IGJveC5tYXgueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6OworCisJCQl9IGVsc2UgeworCisJCQkJ
dHptaW4gPSAoIGJveC5tYXgueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6OworCQkJCXR6bWF4ID0g
KCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejsKKworCQkJfQorCisJCQlpZiAoICgg
dG1pbiA+IHR6bWF4ICkgfHwgKCB0em1pbiA+IHRtYXggKSApIHJldHVybiBudWxsOworCisJCQlp
ZiAoIHR6bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR6bWluOworCisJCQlp
ZiAoIHR6bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4ICkgdG1heCA9IHR6bWF4OworCisJCQkv
L3JldHVybiBwb2ludCBjbG9zZXN0IHRvIHRoZSByYXkgKHBvc2l0aXZlIHNpZGUpCisKKwkJCWlm
ICggdG1heCA8IDAgKSByZXR1cm4gbnVsbDsKKworCQkJcmV0dXJuIHRoaXMuYXQoIHRtaW4gPj0g
MCA/IHRtaW4gOiB0bWF4LCBvcHRpb25hbFRhcmdldCApOworCisJCX0sCisKKwkJaW50ZXJzZWN0
c0JveDogKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2ID0gbmV3IFZlY3RvcjMoKTsKKworCQkJ
cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNCb3goIGJveCApIHsKKworCQkJCXJldHVybiB0aGlz
LmludGVyc2VjdEJveCggYm94LCB2ICkgIT09IG51bGw7CisKKwkJCX07CisKKwkJfSApKCksCisK
KwkJaW50ZXJzZWN0VHJpYW5nbGU6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gQ29tcHV0ZSB0aGUg
b2Zmc2V0IG9yaWdpbiwgZWRnZXMsIGFuZCBub3JtYWwuCisJCQl2YXIgZGlmZiA9IG5ldyBWZWN0
b3IzKCk7CisJCQl2YXIgZWRnZTEgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIGVkZ2UyID0gbmV3
IFZlY3RvcjMoKTsKKwkJCXZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4g
ZnVuY3Rpb24gaW50ZXJzZWN0VHJpYW5nbGUoIGEsIGIsIGMsIGJhY2tmYWNlQ3VsbGluZywgb3B0
aW9uYWxUYXJnZXQgKSB7CisKKwkJCQkvLyBmcm9tIGh0dHA6Ly93d3cuZ2VvbWV0cmljdG9vbHMu
Y29tL0dURW5naW5lL0luY2x1ZGUvTWF0aGVtYXRpY3MvR3RlSW50clJheTNUcmlhbmdsZTMuaAor
CisJCQkJZWRnZTEuc3ViVmVjdG9ycyggYiwgYSApOworCQkJCWVkZ2UyLnN1YlZlY3RvcnMoIGMs
IGEgKTsKKwkJCQlub3JtYWwuY3Jvc3NWZWN0b3JzKCBlZGdlMSwgZWRnZTIgKTsKKworCQkJCS8v
IFNvbHZlIFEgKyB0KkQgPSBiMSpFMSArIGIyKkUyIChRID0ga0RpZmYsIEQgPSByYXkgZGlyZWN0
aW9uLAorCQkJCS8vIEUxID0ga0VkZ2UxLCBFMiA9IGtFZGdlMiwgTiA9IENyb3NzKEUxLEUyKSkg
YnkKKwkJCQkvLyAgIHxEb3QoRCxOKXwqYjEgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9zcyhR
LEUyKSkKKwkJCQkvLyAgIHxEb3QoRCxOKXwqYjIgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9z
cyhFMSxRKSkKKwkJCQkvLyAgIHxEb3QoRCxOKXwqdCA9IC1zaWduKERvdChELE4pKSpEb3QoUSxO
KQorCQkJCXZhciBEZE4gPSB0aGlzLmRpcmVjdGlvbi5kb3QoIG5vcm1hbCApOworCQkJCXZhciBz
aWduOworCisJCQkJaWYgKCBEZE4gPiAwICkgeworCisJCQkJCWlmICggYmFja2ZhY2VDdWxsaW5n
ICkgcmV0dXJuIG51bGw7CisJCQkJCXNpZ24gPSAxOworCisJCQkJfSBlbHNlIGlmICggRGROIDwg
MCApIHsKKworCQkJCQlzaWduID0gLSAxOworCQkJCQlEZE4gPSAtIERkTjsKKworCQkJCX0gZWxz
ZSB7CisKKwkJCQkJcmV0dXJuIG51bGw7CisKKwkJCQl9CisKKwkJCQlkaWZmLnN1YlZlY3RvcnMo
IHRoaXMub3JpZ2luLCBhICk7CisJCQkJdmFyIERkUXhFMiA9IHNpZ24gKiB0aGlzLmRpcmVjdGlv
bi5kb3QoIGVkZ2UyLmNyb3NzVmVjdG9ycyggZGlmZiwgZWRnZTIgKSApOworCisJCQkJLy8gYjEg
PCAwLCBubyBpbnRlcnNlY3Rpb24KKwkJCQlpZiAoIERkUXhFMiA8IDAgKSB7CisKKwkJCQkJcmV0
dXJuIG51bGw7CisKKwkJCQl9CisKKwkJCQl2YXIgRGRFMXhRID0gc2lnbiAqIHRoaXMuZGlyZWN0
aW9uLmRvdCggZWRnZTEuY3Jvc3MoIGRpZmYgKSApOworCisJCQkJLy8gYjIgPCAwLCBubyBpbnRl
cnNlY3Rpb24KKwkJCQlpZiAoIERkRTF4USA8IDAgKSB7CisKKwkJCQkJcmV0dXJuIG51bGw7CisK
KwkJCQl9CisKKwkJCQkvLyBiMStiMiA+IDEsIG5vIGludGVyc2VjdGlvbgorCQkJCWlmICggRGRR
eEUyICsgRGRFMXhRID4gRGROICkgeworCisJCQkJCXJldHVybiBudWxsOworCisJCQkJfQorCisJ
CQkJLy8gTGluZSBpbnRlcnNlY3RzIHRyaWFuZ2xlLCBjaGVjayBpZiByYXkgZG9lcy4KKwkJCQl2
YXIgUWROID0gLSBzaWduICogZGlmZi5kb3QoIG5vcm1hbCApOworCisJCQkJLy8gdCA8IDAsIG5v
IGludGVyc2VjdGlvbgorCQkJCWlmICggUWROIDwgMCApIHsKKworCQkJCQlyZXR1cm4gbnVsbDsK
KworCQkJCX0KKworCQkJCS8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLgorCQkJCXJldHVybiB0
aGlzLmF0KCBRZE4gLyBEZE4sIG9wdGlvbmFsVGFyZ2V0ICk7CisKKwkJCX07CisKKwkJfSgpLAor
CisJCWFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXg0ICkgeworCisJCQl0aGlzLm9yaWdp
bi5hcHBseU1hdHJpeDQoIG1hdHJpeDQgKTsKKwkJCXRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURp
cmVjdGlvbiggbWF0cml4NCApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWVxdWFs
czogZnVuY3Rpb24gKCByYXkgKSB7CisKKwkJCXJldHVybiByYXkub3JpZ2luLmVxdWFscyggdGhp
cy5vcmlnaW4gKSAmJiByYXkuZGlyZWN0aW9uLmVxdWFscyggdGhpcy5kaXJlY3Rpb24gKTsKKwor
CQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJh
LmlvCisJICovCisKKwlmdW5jdGlvbiBMaW5lMyggc3RhcnQsIGVuZCApIHsKKworCQl0aGlzLnN0
YXJ0ID0gKCBzdGFydCAhPT0gdW5kZWZpbmVkICkgPyBzdGFydCA6IG5ldyBWZWN0b3IzKCk7CisJ
CXRoaXMuZW5kID0gKCBlbmQgIT09IHVuZGVmaW5lZCApID8gZW5kIDogbmV3IFZlY3RvcjMoKTsK
KworCX0KKworCU9iamVjdC5hc3NpZ24oIExpbmUzLnByb3RvdHlwZSwgeworCisJCXNldDogZnVu
Y3Rpb24gKCBzdGFydCwgZW5kICkgeworCisJCQl0aGlzLnN0YXJ0LmNvcHkoIHN0YXJ0ICk7CisJ
CQl0aGlzLmVuZC5jb3B5KCBlbmQgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlj
bG9uZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5j
b3B5KCB0aGlzICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIGxpbmUgKSB7CisKKwkJ
CXRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApOworCQkJdGhpcy5lbmQuY29weSggbGluZS5l
bmQgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlnZXRDZW50ZXI6IGZ1bmN0aW9u
ICggb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8
fCBuZXcgVmVjdG9yMygpOworCQkJcmV0dXJuIHJlc3VsdC5hZGRWZWN0b3JzKCB0aGlzLnN0YXJ0
LCB0aGlzLmVuZCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTsKKworCQl9LAorCisJCWRlbHRhOiBm
dW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxU
YXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKwkJCXJldHVybiByZXN1bHQuc3ViVmVjdG9ycyggdGhp
cy5lbmQsIHRoaXMuc3RhcnQgKTsKKworCQl9LAorCisJCWRpc3RhbmNlU3E6IGZ1bmN0aW9uICgp
IHsKKworCQkJcmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuZW5kICk7
CisKKwkJfSwKKworCQlkaXN0YW5jZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5z
dGFydC5kaXN0YW5jZVRvKCB0aGlzLmVuZCApOworCisJCX0sCisKKwkJYXQ6IGZ1bmN0aW9uICgg
dCwgb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8
fCBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gdGhpcy5kZWx0YSggcmVzdWx0ICkubXVsdGlw
bHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTsKKworCQl9LAorCisJCWNsb3Nlc3RQb2lu
dFRvUG9pbnRQYXJhbWV0ZXI6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHN0YXJ0UCA9IG5ldyBW
ZWN0b3IzKCk7CisJCQl2YXIgc3RhcnRFbmQgPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4g
ZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5l
ICkgeworCisJCQkJc3RhcnRQLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLnN0YXJ0ICk7CisJCQkJ
c3RhcnRFbmQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTsKKworCQkJCXZhciBz
dGFydEVuZDIgPSBzdGFydEVuZC5kb3QoIHN0YXJ0RW5kICk7CisJCQkJdmFyIHN0YXJ0RW5kX3N0
YXJ0UCA9IHN0YXJ0RW5kLmRvdCggc3RhcnRQICk7CisKKwkJCQl2YXIgdCA9IHN0YXJ0RW5kX3N0
YXJ0UCAvIHN0YXJ0RW5kMjsKKworCQkJCWlmICggY2xhbXBUb0xpbmUgKSB7CisKKwkJCQkJdCA9
IF9NYXRoLmNsYW1wKCB0LCAwLCAxICk7CisKKwkJCQl9CisKKwkJCQlyZXR1cm4gdDsKKworCQkJ
fTsKKworCQl9KCksCisKKwkJY2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwg
Y2xhbXBUb0xpbmUsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQl2YXIgdCA9IHRoaXMuY2xvc2Vz
dFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICk7CisKKwkJCXZhciBy
ZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gdGhp
cy5kZWx0YSggcmVzdWx0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTsK
KworCQl9LAorCisJCWFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7CisKKwkJCXRo
aXMuc3RhcnQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKKwkJCXRoaXMuZW5kLmFwcGx5TWF0cml4
NCggbWF0cml4ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZXF1YWxzOiBmdW5j
dGlvbiAoIGxpbmUgKSB7CisKKwkJCXJldHVybiBsaW5lLnN0YXJ0LmVxdWFscyggdGhpcy5zdGFy
dCApICYmIGxpbmUuZW5kLmVxdWFscyggdGhpcy5lbmQgKTsKKworCQl9CisKKwl9ICk7CisKKwkv
KioKKwkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCisJICogQGF1dGhvciBt
cmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFRyaWFuZ2xlKCBh
LCBiLCBjICkgeworCisJCXRoaXMuYSA9ICggYSAhPT0gdW5kZWZpbmVkICkgPyBhIDogbmV3IFZl
Y3RvcjMoKTsKKwkJdGhpcy5iID0gKCBiICE9PSB1bmRlZmluZWQgKSA/IGIgOiBuZXcgVmVjdG9y
MygpOworCQl0aGlzLmMgPSAoIGMgIT09IHVuZGVmaW5lZCApID8gYyA6IG5ldyBWZWN0b3IzKCk7
CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBUcmlhbmdsZSwgeworCisJCW5vcm1hbDogZnVuY3Rp
b24gKCkgeworCisJCQl2YXIgdjAgPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gZnVuY3Rp
b24gbm9ybWFsKCBhLCBiLCBjLCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJCXZhciByZXN1bHQg
PSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCisJCQkJcmVzdWx0LnN1YlZlY3Rv
cnMoIGMsIGIgKTsKKwkJCQl2MC5zdWJWZWN0b3JzKCBhLCBiICk7CisJCQkJcmVzdWx0LmNyb3Nz
KCB2MCApOworCisJCQkJdmFyIHJlc3VsdExlbmd0aFNxID0gcmVzdWx0Lmxlbmd0aFNxKCk7CisJ
CQkJaWYgKCByZXN1bHRMZW5ndGhTcSA+IDAgKSB7CisKKwkJCQkJcmV0dXJuIHJlc3VsdC5tdWx0
aXBseVNjYWxhciggMSAvIE1hdGguc3FydCggcmVzdWx0TGVuZ3RoU3EgKSApOworCisJCQkJfQor
CisJCQkJcmV0dXJuIHJlc3VsdC5zZXQoIDAsIDAsIDAgKTsKKworCQkJfTsKKworCQl9KCksCisK
KwkJLy8gc3RhdGljL2luc3RhbmNlIG1ldGhvZCB0byBjYWxjdWxhdGUgYmFyeWNlbnRyaWMgY29v
cmRpbmF0ZXMKKwkJLy8gYmFzZWQgb246IGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9w
b2ludGlucG9seS9kZWZhdWx0Lmh0bWwKKwkJYmFyeWNvb3JkRnJvbVBvaW50OiBmdW5jdGlvbiAo
KSB7CisKKwkJCXZhciB2MCA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgdjEgPSBuZXcgVmVjdG9y
MygpOworCQkJdmFyIHYyID0gbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGJh
cnljb29yZEZyb21Qb2ludCggcG9pbnQsIGEsIGIsIGMsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJ
CQkJdjAuc3ViVmVjdG9ycyggYywgYSApOworCQkJCXYxLnN1YlZlY3RvcnMoIGIsIGEgKTsKKwkJ
CQl2Mi5zdWJWZWN0b3JzKCBwb2ludCwgYSApOworCisJCQkJdmFyIGRvdDAwID0gdjAuZG90KCB2
MCApOworCQkJCXZhciBkb3QwMSA9IHYwLmRvdCggdjEgKTsKKwkJCQl2YXIgZG90MDIgPSB2MC5k
b3QoIHYyICk7CisJCQkJdmFyIGRvdDExID0gdjEuZG90KCB2MSApOworCQkJCXZhciBkb3QxMiA9
IHYxLmRvdCggdjIgKTsKKworCQkJCXZhciBkZW5vbSA9ICggZG90MDAgKiBkb3QxMSAtIGRvdDAx
ICogZG90MDEgKTsKKworCQkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVj
dG9yMygpOworCisJCQkJLy8gY29sbGluZWFyIG9yIHNpbmd1bGFyIHRyaWFuZ2xlCisJCQkJaWYg
KCBkZW5vbSA9PT0gMCApIHsKKworCQkJCQkvLyBhcmJpdHJhcnkgbG9jYXRpb24gb3V0c2lkZSBv
ZiB0cmlhbmdsZT8KKwkJCQkJLy8gbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgYmVzdCBpZGVhLCBt
YXliZSBzaG91bGQgYmUgcmV0dXJuaW5nIHVuZGVmaW5lZAorCQkJCQlyZXR1cm4gcmVzdWx0LnNl
dCggLSAyLCAtIDEsIC0gMSApOworCisJCQkJfQorCisJCQkJdmFyIGludkRlbm9tID0gMSAvIGRl
bm9tOworCQkJCXZhciB1ID0gKCBkb3QxMSAqIGRvdDAyIC0gZG90MDEgKiBkb3QxMiApICogaW52
RGVub207CisJCQkJdmFyIHYgPSAoIGRvdDAwICogZG90MTIgLSBkb3QwMSAqIGRvdDAyICkgKiBp
bnZEZW5vbTsKKworCQkJCS8vIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIG11c3QgYWx3YXlzIHN1
bSB0byAxCisJCQkJcmV0dXJuIHJlc3VsdC5zZXQoIDEgLSB1IC0gdiwgdiwgdSApOworCisJCQl9
OworCisJCX0oKSwKKworCQljb250YWluc1BvaW50OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2
MSA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiBjb250YWluc1BvaW50KCBw
b2ludCwgYSwgYiwgYyApIHsKKworCQkJCXZhciByZXN1bHQgPSBUcmlhbmdsZS5iYXJ5Y29vcmRG
cm9tUG9pbnQoIHBvaW50LCBhLCBiLCBjLCB2MSApOworCisJCQkJcmV0dXJuICggcmVzdWx0Lngg
Pj0gMCApICYmICggcmVzdWx0LnkgPj0gMCApICYmICggKCByZXN1bHQueCArIHJlc3VsdC55ICkg
PD0gMSApOworCisJCQl9OworCisJCX0oKQorCisJfSApOworCisJT2JqZWN0LmFzc2lnbiggVHJp
YW5nbGUucHJvdG90eXBlLCB7CisKKwkJc2V0OiBmdW5jdGlvbiAoIGEsIGIsIGMgKSB7CisKKwkJ
CXRoaXMuYS5jb3B5KCBhICk7CisJCQl0aGlzLmIuY29weSggYiApOworCQkJdGhpcy5jLmNvcHko
IGMgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRGcm9tUG9pbnRzQW5kSW5k
aWNlczogZnVuY3Rpb24gKCBwb2ludHMsIGkwLCBpMSwgaTIgKSB7CisKKwkJCXRoaXMuYS5jb3B5
KCBwb2ludHNbIGkwIF0gKTsKKwkJCXRoaXMuYi5jb3B5KCBwb2ludHNbIGkxIF0gKTsKKwkJCXRo
aXMuYy5jb3B5KCBwb2ludHNbIGkyIF0gKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKwor
CQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3Io
KS5jb3B5KCB0aGlzICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIHRyaWFuZ2xlICkg
eworCisJCQl0aGlzLmEuY29weSggdHJpYW5nbGUuYSApOworCQkJdGhpcy5iLmNvcHkoIHRyaWFu
Z2xlLmIgKTsKKwkJCXRoaXMuYy5jb3B5KCB0cmlhbmdsZS5jICk7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJYXJlYTogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdjAgPSBuZXcgVmVj
dG9yMygpOworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9u
IGFyZWEoKSB7CisKKwkJCQl2MC5zdWJWZWN0b3JzKCB0aGlzLmMsIHRoaXMuYiApOworCQkJCXYx
LnN1YlZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICk7CisKKwkJCQlyZXR1cm4gdjAuY3Jvc3MoIHYx
ICkubGVuZ3RoKCkgKiAwLjU7CisKKwkJCX07CisKKwkJfSgpLAorCisJCW1pZHBvaW50OiBmdW5j
dGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJn
ZXQgfHwgbmV3IFZlY3RvcjMoKTsKKwkJCXJldHVybiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5h
LCB0aGlzLmIgKS5hZGQoIHRoaXMuYyApLm11bHRpcGx5U2NhbGFyKCAxIC8gMyApOworCisJCX0s
CisKKwkJbm9ybWFsOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQlyZXR1cm4g
VHJpYW5nbGUubm9ybWFsKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCBvcHRpb25hbFRhcmdldCAp
OworCisJCX0sCisKKwkJcGxhbmU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJ
CXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgUGxhbmUoKTsKKworCQkJcmV0dXJu
IHJlc3VsdC5zZXRGcm9tQ29wbGFuYXJQb2ludHMoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTsK
KworCQl9LAorCisJCWJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9u
YWxUYXJnZXQgKSB7CisKKwkJCXJldHVybiBUcmlhbmdsZS5iYXJ5Y29vcmRGcm9tUG9pbnQoIHBv
aW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCBvcHRpb25hbFRhcmdldCApOworCisJCX0sCisK
KwkJY29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKKworCQkJcmV0dXJuIFRyaWFu
Z2xlLmNvbnRhaW5zUG9pbnQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7CisKKwkJ
fSwKKworCQljbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBwbGFu
ZSA9IG5ldyBQbGFuZSgpOworCQkJdmFyIGVkZ2VMaXN0ID0gWyBuZXcgTGluZTMoKSwgbmV3IExp
bmUzKCksIG5ldyBMaW5lMygpIF07CisJCQl2YXIgcHJvamVjdGVkUG9pbnQgPSBuZXcgVmVjdG9y
MygpOworCQkJdmFyIGNsb3Nlc3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJldHVybiBm
dW5jdGlvbiBjbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CisK
KwkJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKwkJCQl2
YXIgbWluRGlzdGFuY2UgPSBJbmZpbml0eTsKKworCQkJCS8vIHByb2plY3QgdGhlIHBvaW50IG9u
dG8gdGhlIHBsYW5lIG9mIHRoZSB0cmlhbmdsZQorCisJCQkJcGxhbmUuc2V0RnJvbUNvcGxhbmFy
UG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7CisJCQkJcGxhbmUucHJvamVjdFBvaW50
KCBwb2ludCwgcHJvamVjdGVkUG9pbnQgKTsKKworCQkJCS8vIGNoZWNrIGlmIHRoZSBwcm9qZWN0
aW9uIGxpZXMgd2l0aGluIHRoZSB0cmlhbmdsZQorCisJCQkJaWYoIHRoaXMuY29udGFpbnNQb2lu
dCggcHJvamVjdGVkUG9pbnQgKSA9PT0gdHJ1ZSApIHsKKworCQkJCQkvLyBpZiBzbywgdGhpcyBp
cyB0aGUgY2xvc2VzdCBwb2ludAorCisJCQkJCXJlc3VsdC5jb3B5KCBwcm9qZWN0ZWRQb2ludCAp
OworCisJCQkJfSBlbHNlIHsKKworCQkJCQkvLyBpZiBub3QsIHRoZSBwb2ludCBmYWxscyBvdXRz
aWRlIHRoZSB0cmlhbmdsZS4gdGhlIHJlc3VsdCBpcyB0aGUgY2xvc2VzdCBwb2ludCB0byB0aGUg
dHJpYW5nbGUncyBlZGdlcyBvciB2ZXJ0aWNlcworCisJCQkJCWVkZ2VMaXN0WyAwIF0uc2V0KCB0
aGlzLmEsIHRoaXMuYiApOworCQkJCQllZGdlTGlzdFsgMSBdLnNldCggdGhpcy5iLCB0aGlzLmMg
KTsKKwkJCQkJZWRnZUxpc3RbIDIgXS5zZXQoIHRoaXMuYywgdGhpcy5hICk7CisKKwkJCQkJZm9y
KCB2YXIgaSA9IDA7IGkgPCBlZGdlTGlzdC5sZW5ndGg7IGkgKysgKSB7CisKKwkJCQkJCWVkZ2VM
aXN0WyBpIF0uY2xvc2VzdFBvaW50VG9Qb2ludCggcHJvamVjdGVkUG9pbnQsIHRydWUsIGNsb3Nl
c3RQb2ludCApOworCisJCQkJCQl2YXIgZGlzdGFuY2UgPSBwcm9qZWN0ZWRQb2ludC5kaXN0YW5j
ZVRvU3F1YXJlZCggY2xvc2VzdFBvaW50ICk7CisKKwkJCQkJCWlmKCBkaXN0YW5jZSA8IG1pbkRp
c3RhbmNlICkgeworCisJCQkJCQkJbWluRGlzdGFuY2UgPSBkaXN0YW5jZTsKKworCQkJCQkJCXJl
c3VsdC5jb3B5KCBjbG9zZXN0UG9pbnQgKTsKKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCX0K
KworCQkJCXJldHVybiByZXN1bHQ7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWVxdWFsczogZnVu
Y3Rpb24gKCB0cmlhbmdsZSApIHsKKworCQkJcmV0dXJuIHRyaWFuZ2xlLmEuZXF1YWxzKCB0aGlz
LmEgKSAmJiB0cmlhbmdsZS5iLmVxdWFscyggdGhpcy5iICkgJiYgdHJpYW5nbGUuYy5lcXVhbHMo
IHRoaXMuYyApOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8g
aHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVk
cXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNl
LworCSAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25vYnIxLmNvbS8KKwkgKi8KKworCWZ1
bmN0aW9uIE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHsKKworCQlPYmplY3QzRC5jYWxsKCB0
aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ01lc2gnOworCisJCXRoaXMuZ2VvbWV0cnkgPSBnZW9t
ZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKwkJ
dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBN
ZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTsK
KworCQl0aGlzLmRyYXdNb2RlID0gVHJpYW5nbGVzRHJhd01vZGU7CisKKwkJdGhpcy51cGRhdGVN
b3JwaFRhcmdldHMoKTsKKworCX0KKworCU1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbigg
T2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3Rvcjog
TWVzaCwKKworCQlpc01lc2g6IHRydWUsCisKKwkJc2V0RHJhd01vZGU6IGZ1bmN0aW9uICggdmFs
dWUgKSB7CisKKwkJCXRoaXMuZHJhd01vZGUgPSB2YWx1ZTsKKworCQl9LAorCisJCWNvcHk6IGZ1
bmN0aW9uICggc291cmNlICkgeworCisJCQlPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0
aGlzLCBzb3VyY2UgKTsKKworCQkJdGhpcy5kcmF3TW9kZSA9IHNvdXJjZS5kcmF3TW9kZTsKKwor
CQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQl1cGRhdGVNb3JwaFRhcmdldHM6IGZ1bmN0aW9u
ICgpIHsKKworCQkJdmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKKwkJCXZhciBtLCBtbCwg
bmFtZTsKKworCQkJaWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgeworCisJCQkJdmFy
IG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlczsKKwkJCQl2YXIga2V5
cyA9IE9iamVjdC5rZXlzKCBtb3JwaEF0dHJpYnV0ZXMgKTsKKworCQkJCWlmICgga2V5cy5sZW5n
dGggPiAwICkgeworCisJCQkJCXZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sg
a2V5c1sgMCBdIF07CisKKwkJCQkJaWYgKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkg
eworCisJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdOworCQkJCQkJdGhpcy5t
b3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTsKKworCQkJCQkJZm9yICggbSA9IDAsIG1sID0gbW9y
cGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7CisKKwkJCQkJCQluYW1lID0gbW9y
cGhBdHRyaWJ1dGVbIG0gXS5uYW1lIHx8IFN0cmluZyggbSApOworCisJCQkJCQkJdGhpcy5tb3Jw
aFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApOworCQkJCQkJCXRoaXMubW9ycGhUYXJnZXREaWN0
aW9uYXJ5WyBuYW1lIF0gPSBtOworCisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9
IGVsc2UgeworCisJCQkJdmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0czsK
KworCQkJCWlmICggbW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgJiYgbW9ycGhUYXJnZXRzLmxl
bmd0aCA+IDAgKSB7CisKKwkJCQkJdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTsKKwkJ
CQkJdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTsKKworCQkJCQlmb3IgKCBtID0gMCwg
bWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7CisKKwkJCQkJCW5hbWUg
PSBtb3JwaFRhcmdldHNbIG0gXS5uYW1lIHx8IFN0cmluZyggbSApOworCisJCQkJCQl0aGlzLm1v
cnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7CisJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0RGlj
dGlvbmFyeVsgbmFtZSBdID0gbTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQl9LAor
CisJCXJheWNhc3Q6ICggZnVuY3Rpb24gKCkgeworCisJCQl2YXIgaW52ZXJzZU1hdHJpeCA9IG5l
dyBNYXRyaXg0KCk7CisJCQl2YXIgcmF5ID0gbmV3IFJheSgpOworCQkJdmFyIHNwaGVyZSA9IG5l
dyBTcGhlcmUoKTsKKworCQkJdmFyIHZBID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciB2QiA9IG5l
dyBWZWN0b3IzKCk7CisJCQl2YXIgdkMgPSBuZXcgVmVjdG9yMygpOworCisJCQl2YXIgdGVtcEEg
PSBuZXcgVmVjdG9yMygpOworCQkJdmFyIHRlbXBCID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciB0
ZW1wQyA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXZhciB1dkEgPSBuZXcgVmVjdG9yMigpOworCQkJ
dmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7CisJCQl2YXIgdXZDID0gbmV3IFZlY3RvcjIoKTsKKwor
CQkJdmFyIGJhcnljb29yZCA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXZhciBpbnRlcnNlY3Rpb25Q
b2ludCA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCA9IG5l
dyBWZWN0b3IzKCk7CisKKwkJCWZ1bmN0aW9uIHV2SW50ZXJzZWN0aW9uKCBwb2ludCwgcDEsIHAy
LCBwMywgdXYxLCB1djIsIHV2MyApIHsKKworCQkJCVRyaWFuZ2xlLmJhcnljb29yZEZyb21Qb2lu
dCggcG9pbnQsIHAxLCBwMiwgcDMsIGJhcnljb29yZCApOworCisJCQkJdXYxLm11bHRpcGx5U2Nh
bGFyKCBiYXJ5Y29vcmQueCApOworCQkJCXV2Mi5tdWx0aXBseVNjYWxhciggYmFyeWNvb3JkLnkg
KTsKKwkJCQl1djMubXVsdGlwbHlTY2FsYXIoIGJhcnljb29yZC56ICk7CisKKwkJCQl1djEuYWRk
KCB1djIgKS5hZGQoIHV2MyApOworCisJCQkJcmV0dXJuIHV2MS5jbG9uZSgpOworCisJCQl9CisK
KwkJCWZ1bmN0aW9uIGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3QsIHJheWNhc3RlciwgcmF5LCBw
QSwgcEIsIHBDLCBwb2ludCApIHsKKworCQkJCXZhciBpbnRlcnNlY3Q7CisJCQkJdmFyIG1hdGVy
aWFsID0gb2JqZWN0Lm1hdGVyaWFsOworCisJCQkJaWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNr
U2lkZSApIHsKKworCQkJCQlpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBDLCBw
QiwgcEEsIHRydWUsIHBvaW50ICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCWludGVyc2VjdCA9
IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEEsIHBCLCBwQywgbWF0ZXJpYWwuc2lkZSAhPT0gRG91
YmxlU2lkZSwgcG9pbnQgKTsKKworCQkJCX0KKworCQkJCWlmICggaW50ZXJzZWN0ID09PSBudWxs
ICkgcmV0dXJuIG51bGw7CisKKwkJCQlpbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNvcHkoIHBvaW50
ICk7CisJCQkJaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRy
aXhXb3JsZCApOworCisJCQkJdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlz
dGFuY2VUbyggaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCApOworCisJCQkJaWYgKCBkaXN0YW5jZSA8
IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybiBudWxs
OworCisJCQkJcmV0dXJuIHsKKwkJCQkJZGlzdGFuY2U6IGRpc3RhbmNlLAorCQkJCQlwb2ludDog
aW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jbG9uZSgpLAorCQkJCQlvYmplY3Q6IG9iamVjdAorCQkJ
CX07CisKKwkJCX0KKworCQkJZnVuY3Rpb24gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlv
biggb2JqZWN0LCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICkgeworCisJ
CQkJdkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGEgKTsKKwkJCQl2Qi5mcm9tQnVm
ZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYiApOworCQkJCXZDLmZyb21CdWZmZXJBdHRyaWJ1dGUo
IHBvc2l0aW9uLCBjICk7CisKKwkJCQl2YXIgaW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rp
b24oIG9iamVjdCwgcmF5Y2FzdGVyLCByYXksIHZBLCB2QiwgdkMsIGludGVyc2VjdGlvblBvaW50
ICk7CisKKwkJCQlpZiAoIGludGVyc2VjdGlvbiApIHsKKworCQkJCQlpZiAoIHV2ICkgeworCisJ
CQkJCQl1dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGEgKTsKKwkJCQkJCXV2Qi5mcm9tQnVm
ZmVyQXR0cmlidXRlKCB1diwgYiApOworCQkJCQkJdXZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2
LCBjICk7CisKKwkJCQkJCWludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNl
Y3Rpb25Qb2ludCwgdkEsIHZCLCB2QywgdXZBLCB1dkIsIHV2QyApOworCisJCQkJCX0KKworCQkJ
CQlpbnRlcnNlY3Rpb24uZmFjZSA9IG5ldyBGYWNlMyggYSwgYiwgYywgVHJpYW5nbGUubm9ybWFs
KCB2QSwgdkIsIHZDICkgKTsKKwkJCQkJaW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IGE7CisKKwkJ
CQl9CisKKwkJCQlyZXR1cm4gaW50ZXJzZWN0aW9uOworCisJCQl9CisKKwkJCXJldHVybiBmdW5j
dGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7CisKKwkJCQl2YXIgZ2VvbWV0
cnkgPSB0aGlzLmdlb21ldHJ5OworCQkJCXZhciBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7CisJ
CQkJdmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDsKKworCQkJCWlmICggbWF0ZXJp
YWwgPT09IHVuZGVmaW5lZCApIHJldHVybjsKKworCQkJCS8vIENoZWNraW5nIGJvdW5kaW5nU3Bo
ZXJlIGRpc3RhbmNlIHRvIHJheQorCisJCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9
PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOworCisJCQkJc3BoZXJl
LmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7CisJCQkJc3BoZXJlLmFwcGx5TWF0cml4
NCggbWF0cml4V29ybGQgKTsKKworCQkJCWlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3Bo
ZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCQkvLworCisJCQkJaW52ZXJz
ZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApOworCQkJCXJheS5jb3B5KCByYXljYXN0
ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBpbnZlcnNlTWF0cml4ICk7CisKKwkJCQkvLyBDaGVjayBi
b3VuZGluZ0JveCBiZWZvcmUgY29udGludWluZworCisJCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGlu
Z0JveCAhPT0gbnVsbCApIHsKKworCQkJCQlpZiAoIHJheS5pbnRlcnNlY3RzQm94KCBnZW9tZXRy
eS5ib3VuZGluZ0JveCApID09PSBmYWxzZSApIHJldHVybjsKKworCQkJCX0KKworCQkJCXZhciBp
bnRlcnNlY3Rpb247CisKKwkJCQlpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisK
KwkJCQkJdmFyIGEsIGIsIGM7CisJCQkJCXZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4OworCQkJ
CQl2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOworCQkJCQl2YXIg
dXYgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2OworCQkJCQl2YXIgaSwgbDsKKworCQkJCQlpZiAo
IGluZGV4ICE9PSBudWxsICkgeworCisJCQkJCQkvLyBpbmRleGVkIGJ1ZmZlciBnZW9tZXRyeQor
CisJCQkJCQlmb3IgKCBpID0gMCwgbCA9IGluZGV4LmNvdW50OyBpIDwgbDsgaSArPSAzICkgewor
CisJCQkJCQkJYSA9IGluZGV4LmdldFgoIGkgKTsKKwkJCQkJCQliID0gaW5kZXguZ2V0WCggaSAr
IDEgKTsKKwkJCQkJCQljID0gaW5kZXguZ2V0WCggaSArIDIgKTsKKworCQkJCQkJCWludGVyc2Vj
dGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3Rlciwg
cmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKTsKKworCQkJCQkJCWlmICggaW50ZXJzZWN0aW9u
ICkgeworCisJCQkJCQkJCWludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBpIC8g
MyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gaW5kaWNlcyBidWZmZXIgc2VtYW50aWNzCisJCQkJ
CQkJCWludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7CisKKwkJCQkJCQl9CisKKwkJCQkJ
CX0KKworCQkJCQl9IGVsc2UgeworCisJCQkJCQkvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0
cnkKKworCQkJCQkJZm9yICggaSA9IDAsIGwgPSBwb3NpdGlvbi5jb3VudDsgaSA8IGw7IGkgKz0g
MyApIHsKKworCQkJCQkJCWEgPSBpOworCQkJCQkJCWIgPSBpICsgMTsKKwkJCQkJCQljID0gaSAr
IDI7CisKKwkJCQkJCQlpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0
aW9uKCB0aGlzLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICk7CisKKwkJ
CQkJCQlpZiAoIGludGVyc2VjdGlvbiApIHsKKworCQkJCQkJCQlpbnRlcnNlY3Rpb24uaW5kZXgg
PSBhOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gcG9zaXRpb25zIGJ1ZmZlciBzZW1hbnRpY3MKKwkJ
CQkJCQkJaW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTsKKworCQkJCQkJCX0KKworCQkJ
CQkJfQorCisJCQkJCX0KKworCQkJCX0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7
CisKKwkJCQkJdmFyIGZ2QSwgZnZCLCBmdkM7CisJCQkJCXZhciBpc011bHRpTWF0ZXJpYWwgPSBB
cnJheS5pc0FycmF5KCBtYXRlcmlhbCApOworCisJCQkJCXZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5
LnZlcnRpY2VzOworCQkJCQl2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlczsKKwkJCQkJdmFyIHV2
czsKKworCQkJCQl2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAg
XTsKKwkJCQkJaWYgKCBmYWNlVmVydGV4VXZzLmxlbmd0aCA+IDAgKSB1dnMgPSBmYWNlVmVydGV4
VXZzOworCisJCQkJCWZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsg
ZiArKyApIHsKKworCQkJCQkJdmFyIGZhY2UgPSBmYWNlc1sgZiBdOworCQkJCQkJdmFyIGZhY2VN
YXRlcmlhbCA9IGlzTXVsdGlNYXRlcmlhbCA/IG1hdGVyaWFsWyBmYWNlLm1hdGVyaWFsSW5kZXgg
XSA6IG1hdGVyaWFsOworCisJCQkJCQlpZiAoIGZhY2VNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkg
Y29udGludWU7CisKKwkJCQkJCWZ2QSA9IHZlcnRpY2VzWyBmYWNlLmEgXTsKKwkJCQkJCWZ2QiA9
IHZlcnRpY2VzWyBmYWNlLmIgXTsKKwkJCQkJCWZ2QyA9IHZlcnRpY2VzWyBmYWNlLmMgXTsKKwor
CQkJCQkJaWYgKCBmYWNlTWF0ZXJpYWwubW9ycGhUYXJnZXRzID09PSB0cnVlICkgeworCisJCQkJ
CQkJdmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0czsKKwkJCQkJCQl2YXIg
bW9ycGhJbmZsdWVuY2VzID0gdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM7CisKKwkJCQkJCQl2
QS5zZXQoIDAsIDAsIDAgKTsKKwkJCQkJCQl2Qi5zZXQoIDAsIDAsIDAgKTsKKwkJCQkJCQl2Qy5z
ZXQoIDAsIDAsIDAgKTsKKworCQkJCQkJCWZvciAoIHZhciB0ID0gMCwgdGwgPSBtb3JwaFRhcmdl
dHMubGVuZ3RoOyB0IDwgdGw7IHQgKysgKSB7CisKKwkJCQkJCQkJdmFyIGluZmx1ZW5jZSA9IG1v
cnBoSW5mbHVlbmNlc1sgdCBdOworCisJCQkJCQkJCWlmICggaW5mbHVlbmNlID09PSAwICkgY29u
dGludWU7CisKKwkJCQkJCQkJdmFyIHRhcmdldHMgPSBtb3JwaFRhcmdldHNbIHQgXS52ZXJ0aWNl
czsKKworCQkJCQkJCQl2QS5hZGRTY2FsZWRWZWN0b3IoIHRlbXBBLnN1YlZlY3RvcnMoIHRhcmdl
dHNbIGZhY2UuYSBdLCBmdkEgKSwgaW5mbHVlbmNlICk7CisJCQkJCQkJCXZCLmFkZFNjYWxlZFZl
Y3RvciggdGVtcEIuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5iIF0sIGZ2QiApLCBpbmZsdWVu
Y2UgKTsKKwkJCQkJCQkJdkMuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQy5zdWJWZWN0b3JzKCB0YXJn
ZXRzWyBmYWNlLmMgXSwgZnZDICksIGluZmx1ZW5jZSApOworCisJCQkJCQkJfQorCisJCQkJCQkJ
dkEuYWRkKCBmdkEgKTsKKwkJCQkJCQl2Qi5hZGQoIGZ2QiApOworCQkJCQkJCXZDLmFkZCggZnZD
ICk7CisKKwkJCQkJCQlmdkEgPSB2QTsKKwkJCQkJCQlmdkIgPSB2QjsKKwkJCQkJCQlmdkMgPSB2
QzsKKworCQkJCQkJfQorCisJCQkJCQlpbnRlcnNlY3Rpb24gPSBjaGVja0ludGVyc2VjdGlvbigg
dGhpcywgcmF5Y2FzdGVyLCByYXksIGZ2QSwgZnZCLCBmdkMsIGludGVyc2VjdGlvblBvaW50ICk7
CisKKwkJCQkJCWlmICggaW50ZXJzZWN0aW9uICkgeworCisJCQkJCQkJaWYgKCB1dnMgJiYgdXZz
WyBmIF0gKSB7CisKKwkJCQkJCQkJdmFyIHV2c19mID0gdXZzWyBmIF07CisJCQkJCQkJCXV2QS5j
b3B5KCB1dnNfZlsgMCBdICk7CisJCQkJCQkJCXV2Qi5jb3B5KCB1dnNfZlsgMSBdICk7CisJCQkJ
CQkJCXV2Qy5jb3B5KCB1dnNfZlsgMiBdICk7CisKKwkJCQkJCQkJaW50ZXJzZWN0aW9uLnV2ID0g
dXZJbnRlcnNlY3Rpb24oIGludGVyc2VjdGlvblBvaW50LCBmdkEsIGZ2QiwgZnZDLCB1dkEsIHV2
QiwgdXZDICk7CisKKwkJCQkJCQl9CisKKwkJCQkJCQlpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7
CisJCQkJCQkJaW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IGY7CisJCQkJCQkJaW50ZXJzZWN0cy5w
dXNoKCBpbnRlcnNlY3Rpb24gKTsKKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCX0KKworCQkJ
fTsKKworCQl9KCkgKSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3
IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0
aGlzICk7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRw
Oi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFdlYkdMQmFja2dyb3VuZCggcmVuZGVy
ZXIsIHN0YXRlLCBvYmplY3RzLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7CisKKwkJdmFyIGNsZWFy
Q29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7CisJCXZhciBjbGVhckFscGhhID0gMDsKKwor
CQl2YXIgcGxhbmVDYW1lcmEsIHBsYW5lTWVzaDsKKwkJdmFyIGJveENhbWVyYSwgYm94TWVzaDsK
KworCQlmdW5jdGlvbiByZW5kZXIoIHNjZW5lLCBjYW1lcmEsIGZvcmNlQ2xlYXIgKSB7CisKKwkJ
CXZhciBiYWNrZ3JvdW5kID0gc2NlbmUuYmFja2dyb3VuZDsKKworCQkJaWYgKCBiYWNrZ3JvdW5k
ID09PSBudWxsICkgeworCisJCQkJc2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTsK
KworCQkJfSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29sb3IgKSB7CisK
KwkJCQlzZXRDbGVhciggYmFja2dyb3VuZCwgMSApOworCQkJCWZvcmNlQ2xlYXIgPSB0cnVlOwor
CisJCQl9CisKKwkJCWlmICggcmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7CisK
KwkJCQlyZW5kZXJlci5jbGVhciggcmVuZGVyZXIuYXV0b0NsZWFyQ29sb3IsIHJlbmRlcmVyLmF1
dG9DbGVhckRlcHRoLCByZW5kZXJlci5hdXRvQ2xlYXJTdGVuY2lsICk7CisKKwkJCX0KKworCQkJ
aWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNDdWJlVGV4dHVyZSApIHsKKworCQkJCWlm
ICggYm94Q2FtZXJhID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJYm94Q2FtZXJhID0gbmV3IFBl
cnNwZWN0aXZlQ2FtZXJhKCk7CisKKwkJCQkJYm94TWVzaCA9IG5ldyBNZXNoKAorCQkJCQkJbmV3
IEJveEJ1ZmZlckdlb21ldHJ5KCA1LCA1LCA1ICksCisJCQkJCQluZXcgU2hhZGVyTWF0ZXJpYWwo
IHsKKwkJCQkJCQl1bmlmb3JtczogU2hhZGVyTGliLmN1YmUudW5pZm9ybXMsCisJCQkJCQkJdmVy
dGV4U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS52ZXJ0ZXhTaGFkZXIsCisJCQkJCQkJZnJhZ21lbnRT
aGFkZXI6IFNoYWRlckxpYi5jdWJlLmZyYWdtZW50U2hhZGVyLAorCQkJCQkJCXNpZGU6IEJhY2tT
aWRlLAorCQkJCQkJCWRlcHRoVGVzdDogZmFsc2UsCisJCQkJCQkJZGVwdGhXcml0ZTogZmFsc2Us
CisJCQkJCQkJZm9nOiBmYWxzZQorCQkJCQkJfSApCisJCQkJCSk7CisKKwkJCQl9CisKKwkJCQli
b3hDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCAp
OworCisJCQkJYm94Q2FtZXJhLm1hdHJpeFdvcmxkLmV4dHJhY3RSb3RhdGlvbiggY2FtZXJhLm1h
dHJpeFdvcmxkICk7CisJCQkJYm94Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNl
KCBib3hDYW1lcmEubWF0cml4V29ybGQgKTsKKworCQkJCWJveE1lc2gubWF0ZXJpYWwudW5pZm9y
bXNbICJ0Q3ViZSIgXS52YWx1ZSA9IGJhY2tncm91bmQ7CisJCQkJYm94TWVzaC5tb2RlbFZpZXdN
YXRyaXgubXVsdGlwbHlNYXRyaWNlcyggYm94Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgYm94
TWVzaC5tYXRyaXhXb3JsZCApOworCisJCQkJb2JqZWN0cy51cGRhdGUoIGJveE1lc2ggKTsKKwor
CQkJCXJlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggYm94Q2FtZXJhLCBudWxsLCBib3hNZXNo
Lmdlb21ldHJ5LCBib3hNZXNoLm1hdGVyaWFsLCBib3hNZXNoLCBudWxsICk7CisKKwkJCX0gZWxz
ZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgKSB7CisKKwkJCQlpZiAo
IHBsYW5lQ2FtZXJhID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJcGxhbmVDYW1lcmEgPSBuZXcg
T3J0aG9ncmFwaGljQ2FtZXJhKCAtIDEsIDEsIDEsIC0gMSwgMCwgMSApOworCisJCQkJCXBsYW5l
TWVzaCA9IG5ldyBNZXNoKAorCQkJCQkJbmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIDIsIDIgKSwK
KwkJCQkJCW5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdy
aXRlOiBmYWxzZSwgZm9nOiBmYWxzZSB9ICkKKwkJCQkJKTsKKworCQkJCX0KKworCQkJCXBsYW5l
TWVzaC5tYXRlcmlhbC5tYXAgPSBiYWNrZ3JvdW5kOworCisJCQkJb2JqZWN0cy51cGRhdGUoIHBs
YW5lTWVzaCApOworCisJCQkJcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBwbGFuZUNhbWVy
YSwgbnVsbCwgcGxhbmVNZXNoLmdlb21ldHJ5LCBwbGFuZU1lc2gubWF0ZXJpYWwsIHBsYW5lTWVz
aCwgbnVsbCApOworCisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIHNldENsZWFyKCBjb2xvciwg
YWxwaGEgKSB7CisKKwkJCXN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIGNvbG9yLnIsIGNv
bG9yLmcsIGNvbG9yLmIsIGFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKTsKKworCQl9CisKKwkJ
cmV0dXJuIHsKKworCQkJZ2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCkgeworCisJCQkJcmV0dXJu
IGNsZWFyQ29sb3I7CisKKwkJCX0sCisJCQlzZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoIGNvbG9y
LCBhbHBoYSApIHsKKworCQkJCWNsZWFyQ29sb3Iuc2V0KCBjb2xvciApOworCQkJCWNsZWFyQWxw
aGEgPSBhbHBoYSAhPT0gdW5kZWZpbmVkID8gYWxwaGEgOiAxOworCQkJCXNldENsZWFyKCBjbGVh
ckNvbG9yLCBjbGVhckFscGhhICk7CisKKwkJCX0sCisJCQlnZXRDbGVhckFscGhhOiBmdW5jdGlv
biAoKSB7CisKKwkJCQlyZXR1cm4gY2xlYXJBbHBoYTsKKworCQkJfSwKKwkJCXNldENsZWFyQWxw
aGE6IGZ1bmN0aW9uICggYWxwaGEgKSB7CisKKwkJCQljbGVhckFscGhhID0gYWxwaGE7CisJCQkJ
c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTsKKworCQkJfSwKKwkJCXJlbmRlcjog
cmVuZGVyCisKKwkJfTsKKworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDov
L21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiAp
IHsKKworCQlpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7CisKKwkJCXJl
dHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjsKKworCQl9IGVsc2UgaWYgKCBhLnBy
b2dyYW0gJiYgYi5wcm9ncmFtICYmIGEucHJvZ3JhbSAhPT0gYi5wcm9ncmFtICkgeworCisJCQly
ZXR1cm4gYS5wcm9ncmFtLmlkIC0gYi5wcm9ncmFtLmlkOworCisJCX0gZWxzZSBpZiAoIGEubWF0
ZXJpYWwuaWQgIT09IGIubWF0ZXJpYWwuaWQgKSB7CisKKwkJCXJldHVybiBhLm1hdGVyaWFsLmlk
IC0gYi5tYXRlcmlhbC5pZDsKKworCQl9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHsKKworCQkJ
cmV0dXJuIGEueiAtIGIuejsKKworCQl9IGVsc2UgeworCisJCQlyZXR1cm4gYS5pZCAtIGIuaWQ7
CisKKwkJfQorCisJfQorCisJZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBi
ICkgeworCisJCWlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHsKKworCQkJ
cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyOworCisJCX0gaWYgKCBhLnogIT09
IGIueiApIHsKKworCQkJcmV0dXJuIGIueiAtIGEuejsKKworCQl9IGVsc2UgeworCisJCQlyZXR1
cm4gYS5pZCAtIGIuaWQ7CisKKwkJfQorCisJfQorCisJZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0
KCkgeworCisJCXZhciBvcGFxdWUgPSBbXTsKKwkJdmFyIG9wYXF1ZUxhc3RJbmRleCA9IC0gMTsK
KworCQl2YXIgdHJhbnNwYXJlbnQgPSBbXTsKKwkJdmFyIHRyYW5zcGFyZW50TGFzdEluZGV4ID0g
LSAxOworCisJCWZ1bmN0aW9uIGluaXQoKSB7CisKKwkJCW9wYXF1ZUxhc3RJbmRleCA9IC0gMTsK
KwkJCXRyYW5zcGFyZW50TGFzdEluZGV4ID0gLSAxOworCisJCX0KKworCQlmdW5jdGlvbiBwdXNo
KCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgeiwgZ3JvdXAgKSB7CisKKwkJCXZhciBhcnJh
eSwgaW5kZXg7CisKKwkJCS8vIGFsbG9jYXRlIHRoZSBuZXh0IHBvc2l0aW9uIGluIHRoZSBhcHBy
b3ByaWF0ZSBhcnJheQorCisJCQlpZiAoIG1hdGVyaWFsLnRyYW5zcGFyZW50ICkgeworCisJCQkJ
YXJyYXkgPSB0cmFuc3BhcmVudDsKKwkJCQlpbmRleCA9ICsrIHRyYW5zcGFyZW50TGFzdEluZGV4
OworCisJCQl9IGVsc2UgeworCisJCQkJYXJyYXkgPSBvcGFxdWU7CisJCQkJaW5kZXggPSArKyBv
cGFxdWVMYXN0SW5kZXg7CisKKwkJCX0KKworCQkJLy8gcmVjeWNsZSBleGlzdGluZyByZW5kZXIg
aXRlbSBvciBncm93IHRoZSBhcnJheQorCisJCQl2YXIgcmVuZGVySXRlbSA9IGFycmF5WyBpbmRl
eCBdOworCisJCQlpZiAoIHJlbmRlckl0ZW0gKSB7CisKKwkJCQlyZW5kZXJJdGVtLmlkID0gb2Jq
ZWN0LmlkOworCQkJCXJlbmRlckl0ZW0ub2JqZWN0ID0gb2JqZWN0OworCQkJCXJlbmRlckl0ZW0u
Z2VvbWV0cnkgPSBnZW9tZXRyeTsKKwkJCQlyZW5kZXJJdGVtLm1hdGVyaWFsID0gbWF0ZXJpYWw7
CisJCQkJcmVuZGVySXRlbS5wcm9ncmFtID0gbWF0ZXJpYWwucHJvZ3JhbTsKKwkJCQlyZW5kZXJJ
dGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyOworCQkJCXJlbmRlckl0ZW0ueiA9
IHo7CisJCQkJcmVuZGVySXRlbS5ncm91cCA9IGdyb3VwOworCisJCQl9IGVsc2UgeworCisJCQkJ
cmVuZGVySXRlbSA9IHsKKwkJCQkJaWQ6IG9iamVjdC5pZCwKKwkJCQkJb2JqZWN0OiBvYmplY3Qs
CisJCQkJCWdlb21ldHJ5OiBnZW9tZXRyeSwKKwkJCQkJbWF0ZXJpYWw6IG1hdGVyaWFsLAorCQkJ
CQlwcm9ncmFtOiBtYXRlcmlhbC5wcm9ncmFtLAorCQkJCQlyZW5kZXJPcmRlcjogb2JqZWN0LnJl
bmRlck9yZGVyLAorCQkJCQl6OiB6LAorCQkJCQlncm91cDogZ3JvdXAKKwkJCQl9OworCisJCQkJ
Ly8gYXNzZXJ0KCBpbmRleCA9PT0gYXJyYXkubGVuZ3RoICk7CisJCQkJYXJyYXkucHVzaCggcmVu
ZGVySXRlbSApOworCisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIGZpbmlzaCgpIHsKKworCQkJ
b3BhcXVlLmxlbmd0aCA9IG9wYXF1ZUxhc3RJbmRleCArIDE7CisJCQl0cmFuc3BhcmVudC5sZW5n
dGggPSB0cmFuc3BhcmVudExhc3RJbmRleCArIDE7CisKKwkJfQorCisJCWZ1bmN0aW9uIHNvcnQo
KSB7CisKKwkJCW9wYXF1ZS5zb3J0KCBwYWludGVyU29ydFN0YWJsZSApOworCQkJdHJhbnNwYXJl
bnQuc29ydCggcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7CisKKwkJfQorCisJCXJldHVybiB7
CisJCQlvcGFxdWU6IG9wYXF1ZSwKKwkJCXRyYW5zcGFyZW50OiB0cmFuc3BhcmVudCwKKworCQkJ
aW5pdDogaW5pdCwKKwkJCXB1c2g6IHB1c2gsCisJCQlmaW5pc2g6IGZpbmlzaCwKKworCQkJc29y
dDogc29ydAorCQl9OworCisJfQorCisJZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0cygpIHsKKwor
CQl2YXIgbGlzdHMgPSB7fTsKKworCQlmdW5jdGlvbiBnZXQoIHNjZW5lLCBjYW1lcmEgKSB7CisK
KwkJCXZhciBoYXNoID0gc2NlbmUuaWQgKyAnLCcgKyBjYW1lcmEuaWQ7CisJCQl2YXIgbGlzdCA9
IGxpc3RzWyBoYXNoIF07CisKKwkJCWlmICggbGlzdCA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJ
Ly8gY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlckxpc3RzOicsIGhhc2ggKTsKKworCQkJ
CWxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0KCk7CisJCQkJbGlzdHNbIGhhc2ggXSA9IGxpc3Q7
CisKKwkJCX0KKworCQkJcmV0dXJuIGxpc3Q7CisKKwkJfQorCisJCWZ1bmN0aW9uIGRpc3Bvc2Uo
KSB7CisKKwkJCWxpc3RzID0ge307CisKKwkJfQorCisJCXJldHVybiB7CisJCQlnZXQ6IGdldCwK
KwkJCWRpc3Bvc2U6IGRpc3Bvc2UKKwkJfTsKKworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbXJk
b29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBXZWJHTEluZGV4ZWRC
dWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm9SZW5kZXIgKSB7CisKKwkJdmFyIG1v
ZGU7CisKKwkJZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7CisKKwkJCW1vZGUgPSB2YWx1ZTsK
KworCQl9CisKKwkJdmFyIHR5cGUsIGJ5dGVzUGVyRWxlbWVudDsKKworCQlmdW5jdGlvbiBzZXRJ
bmRleCggdmFsdWUgKSB7CisKKwkJCXR5cGUgPSB2YWx1ZS50eXBlOworCQkJYnl0ZXNQZXJFbGVt
ZW50ID0gdmFsdWUuYnl0ZXNQZXJFbGVtZW50OworCisJCX0KKworCQlmdW5jdGlvbiByZW5kZXIo
IHN0YXJ0LCBjb3VudCApIHsKKworCQkJZ2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlw
ZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQgKTsKKworCQkJaW5mb1JlbmRlci5jYWxscyArKzsK
KwkJCWluZm9SZW5kZXIudmVydGljZXMgKz0gY291bnQ7CisKKwkJCWlmICggbW9kZSA9PT0gZ2wu
VFJJQU5HTEVTICkgaW5mb1JlbmRlci5mYWNlcyArPSBjb3VudCAvIDM7CisKKwkJfQorCisJCWZ1
bmN0aW9uIHJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIHN0YXJ0LCBjb3VudCApIHsKKworCQkJ
dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycg
KTsKKworCQkJaWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7CisKKwkJCQljb25zb2xlLmVycm9y
KCAnVEhSRUUuV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNl
ZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBB
TkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTsKKwkJCQlyZXR1cm47CisKKwkJCX0KKworCQkJZXh0
ZW5zaW9uLmRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFKCBtb2RlLCBjb3VudCwgdHlwZSwgc3Rh
cnQgKiBieXRlc1BlckVsZW1lbnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7CisKKwkJ
CWluZm9SZW5kZXIuY2FsbHMgKys7CisJCQlpbmZvUmVuZGVyLnZlcnRpY2VzICs9IGNvdW50ICog
Z2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQ7CisKKwkJCWlmICggbW9kZSA9PT0gZ2wuVFJJQU5H
TEVTICkgaW5mb1JlbmRlci5mYWNlcyArPSBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCAqIGNv
dW50IC8gMzsKKworCQl9CisKKwkJLy8KKworCQl0aGlzLnNldE1vZGUgPSBzZXRNb2RlOworCQl0
aGlzLnNldEluZGV4ID0gc2V0SW5kZXg7CisJCXRoaXMucmVuZGVyID0gcmVuZGVyOworCQl0aGlz
LnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlczsKKworCX0KKworCS8qKgorCSAqIEBh
dXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBXZWJH
TEJ1ZmZlclJlbmRlcmVyKCBnbCwgZXh0ZW5zaW9ucywgaW5mb1JlbmRlciApIHsKKworCQl2YXIg
bW9kZTsKKworCQlmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHsKKworCQkJbW9kZSA9IHZhbHVl
OworCisJCX0KKworCQlmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHsKKworCQkJZ2wu
ZHJhd0FycmF5cyggbW9kZSwgc3RhcnQsIGNvdW50ICk7CisKKwkJCWluZm9SZW5kZXIuY2FsbHMg
Kys7CisJCQlpbmZvUmVuZGVyLnZlcnRpY2VzICs9IGNvdW50OworCisJCQlpZiAoIG1vZGUgPT09
IGdsLlRSSUFOR0xFUyApIGluZm9SZW5kZXIuZmFjZXMgKz0gY291bnQgLyAzOworCisJCX0KKwor
CQlmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBzdGFydCwgY291bnQgKSB7CisK
KwkJCXZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJh
eXMnICk7CisKKwkJCWlmICggZXh0ZW5zaW9uID09PSBudWxsICkgeworCisJCQkJY29uc29sZS5l
cnJvciggJ1RIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1
ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdM
RV9pbnN0YW5jZWRfYXJyYXlzLicgKTsKKwkJCQlyZXR1cm47CisKKwkJCX0KKworCQkJdmFyIHBv
c2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKKworCQkJaWYgKCBwb3NpdGlv
bi5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgeworCisJCQkJY291bnQgPSBwb3NpdGlv
bi5kYXRhLmNvdW50OworCisJCQkJZXh0ZW5zaW9uLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSgg
bW9kZSwgMCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7CisKKwkJCX0gZWxz
ZSB7CisKKwkJCQlleHRlbnNpb24uZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFKCBtb2RlLCBzdGFy
dCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7CisKKwkJCX0KKworCQkJaW5m
b1JlbmRlci5jYWxscyArKzsKKwkJCWluZm9SZW5kZXIudmVydGljZXMgKz0gY291bnQgKiBnZW9t
ZXRyeS5tYXhJbnN0YW5jZWRDb3VudDsKKworCQkJaWYgKCBtb2RlID09PSBnbC5UUklBTkdMRVMg
KSBpbmZvUmVuZGVyLmZhY2VzICs9IGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICogY291bnQg
LyAzOworCisJCX0KKworCQkvLworCisJCXRoaXMuc2V0TW9kZSA9IHNldE1vZGU7CisJCXRoaXMu
cmVuZGVyID0gcmVuZGVyOworCQl0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNl
czsKKworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20v
CisJICovCisKKwlmdW5jdGlvbiBXZWJHTEdlb21ldHJpZXMoIGdsLCBhdHRyaWJ1dGVzLCBpbmZv
TWVtb3J5ICkgeworCisJCXZhciBnZW9tZXRyaWVzID0ge307CisJCXZhciB3aXJlZnJhbWVBdHRy
aWJ1dGVzID0ge307CisKKwkJZnVuY3Rpb24gb25HZW9tZXRyeURpc3Bvc2UoIGV2ZW50ICkgewor
CisJCQl2YXIgZ2VvbWV0cnkgPSBldmVudC50YXJnZXQ7CisJCQl2YXIgYnVmZmVyZ2VvbWV0cnkg
PSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdOworCisJCQlpZiAoIGJ1ZmZlcmdlb21ldHJ5Lmlu
ZGV4ICE9PSBudWxsICkgeworCisJCQkJYXR0cmlidXRlcy5yZW1vdmUoIGJ1ZmZlcmdlb21ldHJ5
LmluZGV4ICk7CisKKwkJCX0KKworCQkJZm9yICggdmFyIG5hbWUgaW4gYnVmZmVyZ2VvbWV0cnku
YXR0cmlidXRlcyApIHsKKworCQkJCWF0dHJpYnV0ZXMucmVtb3ZlKCBidWZmZXJnZW9tZXRyeS5h
dHRyaWJ1dGVzWyBuYW1lIF0gKTsKKworCQkJfQorCisJCQlnZW9tZXRyeS5yZW1vdmVFdmVudExp
c3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7CisKKwkJCWRlbGV0ZSBnZW9t
ZXRyaWVzWyBnZW9tZXRyeS5pZCBdOworCisJCQkvLyBUT0RPIFJlbW92ZSBkdXBsaWNhdGUgY29k
ZQorCisJCQl2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQg
XTsKKworCQkJaWYgKCBhdHRyaWJ1dGUgKSB7CisKKwkJCQlhdHRyaWJ1dGVzLnJlbW92ZSggYXR0
cmlidXRlICk7CisJCQkJZGVsZXRlIHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF07
CisKKwkJCX0KKworCQkJYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgYnVmZmVyZ2Vv
bWV0cnkuaWQgXTsKKworCQkJaWYgKCBhdHRyaWJ1dGUgKSB7CisKKwkJCQlhdHRyaWJ1dGVzLnJl
bW92ZSggYXR0cmlidXRlICk7CisJCQkJZGVsZXRlIHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZl
cmdlb21ldHJ5LmlkIF07CisKKwkJCX0KKworCQkJLy8KKworCQkJaW5mb01lbW9yeS5nZW9tZXRy
aWVzIC0tOworCisJCX0KKworCQlmdW5jdGlvbiBnZXQoIG9iamVjdCwgZ2VvbWV0cnkgKSB7CisK
KwkJCXZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF07CisKKwkJ
CWlmICggYnVmZmVyZ2VvbWV0cnkgKSByZXR1cm4gYnVmZmVyZ2VvbWV0cnk7CisKKwkJCWdlb21l
dHJ5LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTsKKwor
CQkJaWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgeworCisJCQkJYnVmZmVyZ2VvbWV0
cnkgPSBnZW9tZXRyeTsKKworCQkJfSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsK
KworCQkJCWlmICggZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7CisK
KwkJCQkJZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuc2V0
RnJvbU9iamVjdCggb2JqZWN0ICk7CisKKwkJCQl9CisKKwkJCQlidWZmZXJnZW9tZXRyeSA9IGdl
b21ldHJ5Ll9idWZmZXJHZW9tZXRyeTsKKworCQkJfQorCisJCQlnZW9tZXRyaWVzWyBnZW9tZXRy
eS5pZCBdID0gYnVmZmVyZ2VvbWV0cnk7CisKKwkJCWluZm9NZW1vcnkuZ2VvbWV0cmllcyArKzsK
KworCQkJcmV0dXJuIGJ1ZmZlcmdlb21ldHJ5OworCisJCX0KKworCQlmdW5jdGlvbiB1cGRhdGUo
IGdlb21ldHJ5ICkgeworCisJCQl2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDsKKwkJCXZhciBn
ZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOworCisJCQlpZiAoIGluZGV4
ICE9PSBudWxsICkgeworCisJCQkJYXR0cmlidXRlcy51cGRhdGUoIGluZGV4LCBnbC5FTEVNRU5U
X0FSUkFZX0JVRkZFUiApOworCisJCQl9CisKKwkJCWZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5
QXR0cmlidXRlcyApIHsKKworCQkJCWF0dHJpYnV0ZXMudXBkYXRlKCBnZW9tZXRyeUF0dHJpYnV0
ZXNbIG5hbWUgXSwgZ2wuQVJSQVlfQlVGRkVSICk7CisKKwkJCX0KKworCQkJLy8gbW9ycGggdGFy
Z2V0cworCisJCQl2YXIgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVz
OworCisJCQlmb3IgKCB2YXIgbmFtZSBpbiBtb3JwaEF0dHJpYnV0ZXMgKSB7CisKKwkJCQl2YXIg
YXJyYXkgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsKKworCQkJCWZvciAoIHZhciBpID0gMCwg
bCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJYXR0cmlidXRlcy51cGRh
dGUoIGFycmF5WyBpIF0sIGdsLkFSUkFZX0JVRkZFUiApOworCisJCQkJfQorCisJCQl9CisKKwkJ
fQorCisJCWZ1bmN0aW9uIGdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKSB7CisKKwkJ
CXZhciBhdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdOworCisJ
CQlpZiAoIGF0dHJpYnV0ZSApIHJldHVybiBhdHRyaWJ1dGU7CisKKwkJCXZhciBpbmRpY2VzID0g
W107CisKKwkJCXZhciBnZW9tZXRyeUluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CisJCQl2YXIgZ2Vv
bWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKKworCQkJLy8gY29uc29sZS50
aW1lKCAnd2lyZWZyYW1lJyApOworCisJCQlpZiAoIGdlb21ldHJ5SW5kZXggIT09IG51bGwgKSB7
CisKKwkJCQl2YXIgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5OworCisJCQkJZm9yICggdmFy
IGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkgeworCisJCQkJCXZhciBh
ID0gYXJyYXlbIGkgKyAwIF07CisJCQkJCXZhciBiID0gYXJyYXlbIGkgKyAxIF07CisJCQkJCXZh
ciBjID0gYXJyYXlbIGkgKyAyIF07CisKKwkJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBj
LCBhICk7CisKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisKKwkJCQl2YXIgYXJyYXkgPSBnZW9tZXRy
eUF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSAo
IGFycmF5Lmxlbmd0aCAvIDMgKSAtIDE7IGkgPCBsOyBpICs9IDMgKSB7CisKKwkJCQkJdmFyIGEg
PSBpICsgMDsKKwkJCQkJdmFyIGIgPSBpICsgMTsKKwkJCQkJdmFyIGMgPSBpICsgMjsKKworCQkJ
CQlpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTsKKworCQkJCX0KKworCQkJfQorCisJ
CQkvLyBjb25zb2xlLnRpbWVFbmQoICd3aXJlZnJhbWUnICk7CisKKwkJCWF0dHJpYnV0ZSA9IG5l
dyAoIGFycmF5TWF4KCBpbmRpY2VzICkgPiA2NTUzNSA/IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA6
IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSApKCBpbmRpY2VzLCAxICk7CisKKwkJCWF0dHJpYnV0ZXMu
dXBkYXRlKCBhdHRyaWJ1dGUsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7CisKKwkJCXdpcmVm
cmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF0gPSBhdHRyaWJ1dGU7CisKKwkJCXJldHVybiBh
dHRyaWJ1dGU7CisKKwkJfQorCisJCXJldHVybiB7CisKKwkJCWdldDogZ2V0LAorCQkJdXBkYXRl
OiB1cGRhdGUsCisKKwkJCWdldFdpcmVmcmFtZUF0dHJpYnV0ZTogZ2V0V2lyZWZyYW1lQXR0cmli
dXRlCisKKwkJfTsKKworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21y
ZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBXZWJHTExpZ2h0cygpIHsKKworCQl2YXIgbGln
aHRzID0ge307CisKKwkJcmV0dXJuIHsKKworCQkJZ2V0OiBmdW5jdGlvbiAoIGxpZ2h0ICkgewor
CisJCQkJaWYgKCBsaWdodHNbIGxpZ2h0LmlkIF0gIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQly
ZXR1cm4gbGlnaHRzWyBsaWdodC5pZCBdOworCisJCQkJfQorCisJCQkJdmFyIHVuaWZvcm1zOwor
CisJCQkJc3dpdGNoICggbGlnaHQudHlwZSApIHsKKworCQkJCQljYXNlICdEaXJlY3Rpb25hbExp
Z2h0JzoKKwkJCQkJCXVuaWZvcm1zID0geworCQkJCQkJCWRpcmVjdGlvbjogbmV3IFZlY3RvcjMo
KSwKKwkJCQkJCQljb2xvcjogbmV3IENvbG9yKCksCisKKwkJCQkJCQlzaGFkb3c6IGZhbHNlLAor
CQkJCQkJCXNoYWRvd0JpYXM6IDAsCisJCQkJCQkJc2hhZG93UmFkaXVzOiAxLAorCQkJCQkJCXNo
YWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCkKKwkJCQkJCX07CisJCQkJCQlicmVhazsKKworCQkJ
CQljYXNlICdTcG90TGlnaHQnOgorCQkJCQkJdW5pZm9ybXMgPSB7CisJCQkJCQkJcG9zaXRpb246
IG5ldyBWZWN0b3IzKCksCisJCQkJCQkJZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLAorCQkJCQkJ
CWNvbG9yOiBuZXcgQ29sb3IoKSwKKwkJCQkJCQlkaXN0YW5jZTogMCwKKwkJCQkJCQljb25lQ29z
OiAwLAorCQkJCQkJCXBlbnVtYnJhQ29zOiAwLAorCQkJCQkJCWRlY2F5OiAwLAorCisJCQkJCQkJ
c2hhZG93OiBmYWxzZSwKKwkJCQkJCQlzaGFkb3dCaWFzOiAwLAorCQkJCQkJCXNoYWRvd1JhZGl1
czogMSwKKwkJCQkJCQlzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpCisJCQkJCQl9OworCQkJ
CQkJYnJlYWs7CisKKwkJCQkJY2FzZSAnUG9pbnRMaWdodCc6CisJCQkJCQl1bmlmb3JtcyA9IHsK
KwkJCQkJCQlwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSwKKwkJCQkJCQljb2xvcjogbmV3IENvbG9y
KCksCisJCQkJCQkJZGlzdGFuY2U6IDAsCisJCQkJCQkJZGVjYXk6IDAsCisKKwkJCQkJCQlzaGFk
b3c6IGZhbHNlLAorCQkJCQkJCXNoYWRvd0JpYXM6IDAsCisJCQkJCQkJc2hhZG93UmFkaXVzOiAx
LAorCQkJCQkJCXNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCkKKwkJCQkJCX07CisJCQkJCQli
cmVhazsKKworCQkJCQljYXNlICdIZW1pc3BoZXJlTGlnaHQnOgorCQkJCQkJdW5pZm9ybXMgPSB7
CisJCQkJCQkJZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLAorCQkJCQkJCXNreUNvbG9yOiBuZXcg
Q29sb3IoKSwKKwkJCQkJCQlncm91bmRDb2xvcjogbmV3IENvbG9yKCkKKwkJCQkJCX07CisJCQkJ
CQlicmVhazsKKworCQkJCQljYXNlICdSZWN0QXJlYUxpZ2h0JzoKKwkJCQkJCXVuaWZvcm1zID0g
eworCQkJCQkJCWNvbG9yOiBuZXcgQ29sb3IoKSwKKwkJCQkJCQlwb3NpdGlvbjogbmV3IFZlY3Rv
cjMoKSwKKwkJCQkJCQloYWxmV2lkdGg6IG5ldyBWZWN0b3IzKCksCisJCQkJCQkJaGFsZkhlaWdo
dDogbmV3IFZlY3RvcjMoKQorCQkJCQkJCS8vIFRPRE8gKGFiZWxuYXRpb24pOiBzZXQgUmVjdEFy
ZWFMaWdodCBzaGFkb3cgdW5pZm9ybXMKKwkJCQkJCX07CisJCQkJCQlicmVhazsKKworCQkJCX0K
KworCQkJCWxpZ2h0c1sgbGlnaHQuaWQgXSA9IHVuaWZvcm1zOworCisJCQkJcmV0dXJuIHVuaWZv
cm1zOworCisJCQl9CisKKwkJfTsKKworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8g
aHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBXZWJHTE9iamVjdHMoIGdsLCBn
ZW9tZXRyaWVzLCBpbmZvUmVuZGVyICkgeworCisJCXZhciB1cGRhdGVMaXN0ID0ge307CisKKwkJ
ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QgKSB7CisKKwkJCXZhciBmcmFtZSA9IGluZm9SZW5kZXIu
ZnJhbWU7CisKKwkJCXZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTsKKwkJCXZhciBidWZm
ZXJnZW9tZXRyeSA9IGdlb21ldHJpZXMuZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICk7CisKKwkJCS8v
IFVwZGF0ZSBvbmNlIHBlciBmcmFtZQorCisJCQlpZiAoIHVwZGF0ZUxpc3RbIGJ1ZmZlcmdlb21l
dHJ5LmlkIF0gIT09IGZyYW1lICkgeworCisJCQkJaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkg
eworCisJCQkJCWJ1ZmZlcmdlb21ldHJ5LnVwZGF0ZUZyb21PYmplY3QoIG9iamVjdCApOworCisJ
CQkJfQorCisJCQkJZ2VvbWV0cmllcy51cGRhdGUoIGJ1ZmZlcmdlb21ldHJ5ICk7CisKKwkJCQl1
cGRhdGVMaXN0WyBidWZmZXJnZW9tZXRyeS5pZCBdID0gZnJhbWU7CisKKwkJCX0KKworCQkJcmV0
dXJuIGJ1ZmZlcmdlb21ldHJ5OworCisJCX0KKworCQlmdW5jdGlvbiBjbGVhcigpIHsKKworCQkJ
dXBkYXRlTGlzdCA9IHt9OworCisJCX0KKworCQlyZXR1cm4geworCisJCQl1cGRhdGU6IHVwZGF0
ZSwKKwkJCWNsZWFyOiBjbGVhcgorCisJCX07CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1y
ZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gYWRkTGluZU51bWJl
cnMoIHN0cmluZyApIHsKKworCQl2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoICdcbicgKTsKKwor
CQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkgKysgKSB7CisKKwkJCWxpbmVz
WyBpIF0gPSAoIGkgKyAxICkgKyAnOiAnICsgbGluZXNbIGkgXTsKKworCQl9CisKKwkJcmV0dXJu
IGxpbmVzLmpvaW4oICdcbicgKTsKKworCX0KKworCWZ1bmN0aW9uIFdlYkdMU2hhZGVyKCBnbCwg
dHlwZSwgc3RyaW5nICkgeworCisJCXZhciBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIHR5cGUg
KTsKKworCQlnbC5zaGFkZXJTb3VyY2UoIHNoYWRlciwgc3RyaW5nICk7CisJCWdsLmNvbXBpbGVT
aGFkZXIoIHNoYWRlciApOworCisJCWlmICggZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKCBzaGFkZXIs
IGdsLkNPTVBJTEVfU1RBVFVTICkgPT09IGZhbHNlICkgeworCisJCQljb25zb2xlLmVycm9yKCAn
VEhSRUUuV2ViR0xTaGFkZXI6IFNoYWRlciBjb3VsZG5cJ3QgY29tcGlsZS4nICk7CisKKwkJfQor
CisJCWlmICggZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICkgIT09ICcnICkgeworCisJCQlj
b25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpJywg
dHlwZSA9PT0gZ2wuVkVSVEVYX1NIQURFUiA/ICd2ZXJ0ZXgnIDogJ2ZyYWdtZW50JywgZ2wuZ2V0
U2hhZGVySW5mb0xvZyggc2hhZGVyICksIGFkZExpbmVOdW1iZXJzKCBzdHJpbmcgKSApOworCisJ
CX0KKworCQkvLyAtLWVuYWJsZS1wcml2aWxlZ2VkLXdlYmdsLWV4dGVuc2lvbgorCQkvLyBjb25z
b2xlLmxvZyggdHlwZSwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5n
ZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBzaGFkZXIgKSApOworCisJCXJldHVybiBzaGFkZXI7
CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwor
CSAqLworCisJdmFyIHByb2dyYW1JZENvdW50ID0gMDsKKworCWZ1bmN0aW9uIGdldEVuY29kaW5n
Q29tcG9uZW50cyggZW5jb2RpbmcgKSB7CisKKwkJc3dpdGNoICggZW5jb2RpbmcgKSB7CisKKwkJ
CWNhc2UgTGluZWFyRW5jb2Rpbmc6CisJCQkJcmV0dXJuIFsgJ0xpbmVhcicsJyggdmFsdWUgKScg
XTsKKwkJCWNhc2Ugc1JHQkVuY29kaW5nOgorCQkJCXJldHVybiBbICdzUkdCJywnKCB2YWx1ZSAp
JyBdOworCQkJY2FzZSBSR0JFRW5jb2Rpbmc6CisJCQkJcmV0dXJuIFsgJ1JHQkUnLCcoIHZhbHVl
ICknIF07CisJCQljYXNlIFJHQk03RW5jb2Rpbmc6CisJCQkJcmV0dXJuIFsgJ1JHQk0nLCcoIHZh
bHVlLCA3LjAgKScgXTsKKwkJCWNhc2UgUkdCTTE2RW5jb2Rpbmc6CisJCQkJcmV0dXJuIFsgJ1JH
Qk0nLCcoIHZhbHVlLCAxNi4wICknIF07CisJCQljYXNlIFJHQkRFbmNvZGluZzoKKwkJCQlyZXR1
cm4gWyAnUkdCRCcsJyggdmFsdWUsIDI1Ni4wICknIF07CisJCQljYXNlIEdhbW1hRW5jb2Rpbmc6
CisJCQkJcmV0dXJuIFsgJ0dhbW1hJywnKCB2YWx1ZSwgZmxvYXQoIEdBTU1BX0ZBQ1RPUiApICkn
IF07CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBFcnJvciggJ3Vuc3VwcG9ydGVkIGVuY29k
aW5nOiAnICsgZW5jb2RpbmcgKTsKKworCQl9CisKKwl9CisKKwlmdW5jdGlvbiBnZXRUZXhlbERl
Y29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7CisKKwkJdmFyIGNvbXBv
bmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7CisJCXJldHVybiAidmVj
NCAiICsgZnVuY3Rpb25OYW1lICsgIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICIgKyBjb21wb25l
bnRzWyAwIF0gKyAiVG9MaW5lYXIiICsgY29tcG9uZW50c1sgMSBdICsgIjsgfSI7CisKKwl9CisK
KwlmdW5jdGlvbiBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2Rp
bmcgKSB7CisKKwkJdmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29k
aW5nICk7CisJCXJldHVybiAidmVjNCAiICsgZnVuY3Rpb25OYW1lICsgIiggdmVjNCB2YWx1ZSAp
IHsgcmV0dXJuIExpbmVhclRvIiArIGNvbXBvbmVudHNbIDAgXSArIGNvbXBvbmVudHNbIDEgXSAr
ICI7IH0iOworCisJfQorCisJZnVuY3Rpb24gZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiggZnVuY3Rp
b25OYW1lLCB0b25lTWFwcGluZyApIHsKKworCQl2YXIgdG9uZU1hcHBpbmdOYW1lOworCisJCXN3
aXRjaCAoIHRvbmVNYXBwaW5nICkgeworCisJCQljYXNlIExpbmVhclRvbmVNYXBwaW5nOgorCQkJ
CXRvbmVNYXBwaW5nTmFtZSA9ICJMaW5lYXIiOworCQkJCWJyZWFrOworCisJCQljYXNlIFJlaW5o
YXJkVG9uZU1hcHBpbmc6CisJCQkJdG9uZU1hcHBpbmdOYW1lID0gIlJlaW5oYXJkIjsKKwkJCQli
cmVhazsKKworCQkJY2FzZSBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmc6CisJCQkJdG9uZU1hcHBpbmdO
YW1lID0gIlVuY2hhcnRlZDIiOworCQkJCWJyZWFrOworCisJCQljYXNlIENpbmVvblRvbmVNYXBw
aW5nOgorCQkJCXRvbmVNYXBwaW5nTmFtZSA9ICJPcHRpbWl6ZWRDaW5lb24iOworCQkJCWJyZWFr
OworCisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBFcnJvciggJ3Vuc3VwcG9ydGVkIHRvbmVN
YXBwaW5nOiAnICsgdG9uZU1hcHBpbmcgKTsKKworCQl9CisKKwkJcmV0dXJuICJ2ZWMzICIgKyBm
dW5jdGlvbk5hbWUgKyAiKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gIiArIHRvbmVNYXBwaW5nTmFt
ZSArICJUb25lTWFwcGluZyggY29sb3IgKTsgfSI7CisKKwl9CisKKwlmdW5jdGlvbiBnZW5lcmF0
ZUV4dGVuc2lvbnMoIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMsIHJlbmRlcmVyRXh0ZW5zaW9ucyAp
IHsKKworCQlleHRlbnNpb25zID0gZXh0ZW5zaW9ucyB8fCB7fTsKKworCQl2YXIgY2h1bmtzID0g
WworCQkJKCBleHRlbnNpb25zLmRlcml2YXRpdmVzIHx8IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVW
IHx8IHBhcmFtZXRlcnMuYnVtcE1hcCB8fCBwYXJhbWV0ZXJzLm5vcm1hbE1hcCB8fCBwYXJhbWV0
ZXJzLmZsYXRTaGFkaW5nICkgPyAnI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2
ZXMgOiBlbmFibGUnIDogJycsCisJCQkoIGV4dGVuc2lvbnMuZnJhZ0RlcHRoIHx8IHBhcmFtZXRl
cnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdF
WFRfZnJhZ19kZXB0aCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxl
JyA6ICcnLAorCQkJKCBleHRlbnNpb25zLmRyYXdCdWZmZXJzICkgJiYgcmVuZGVyZXJFeHRlbnNp
b25zLmdldCggJ1dFQkdMX2RyYXdfYnVmZmVycycgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3
X2J1ZmZlcnMgOiByZXF1aXJlJyA6ICcnLAorCQkJKCBleHRlbnNpb25zLnNoYWRlclRleHR1cmVM
T0QgfHwgcGFyYW1ldGVycy5lbnZNYXAgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhU
X3NoYWRlcl90ZXh0dXJlX2xvZCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVy
ZV9sb2QgOiBlbmFibGUnIDogJycKKwkJXTsKKworCQlyZXR1cm4gY2h1bmtzLmZpbHRlciggZmls
dGVyRW1wdHlMaW5lICkuam9pbiggJ1xuJyApOworCisJfQorCisJZnVuY3Rpb24gZ2VuZXJhdGVE
ZWZpbmVzKCBkZWZpbmVzICkgeworCisJCXZhciBjaHVua3MgPSBbXTsKKworCQlmb3IgKCB2YXIg
bmFtZSBpbiBkZWZpbmVzICkgeworCisJCQl2YXIgdmFsdWUgPSBkZWZpbmVzWyBuYW1lIF07CisK
KwkJCWlmICggdmFsdWUgPT09IGZhbHNlICkgY29udGludWU7CisKKwkJCWNodW5rcy5wdXNoKCAn
I2RlZmluZSAnICsgbmFtZSArICcgJyArIHZhbHVlICk7CisKKwkJfQorCisJCXJldHVybiBjaHVu
a3Muam9pbiggJ1xuJyApOworCisJfQorCisJZnVuY3Rpb24gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlv
bnMoIGdsLCBwcm9ncmFtLCBpZGVudGlmaWVycyApIHsKKworCQl2YXIgYXR0cmlidXRlcyA9IHt9
OworCisJCXZhciBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZF
X0FUVFJJQlVURVMgKTsKKworCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyBpICsrICkgeworCisJ
CQl2YXIgaW5mbyA9IGdsLmdldEFjdGl2ZUF0dHJpYiggcHJvZ3JhbSwgaSApOworCQkJdmFyIG5h
bWUgPSBpbmZvLm5hbWU7CisKKwkJCS8vIGNvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFByb2dyYW06
IEFDVElWRSBWRVJURVggQVRUUklCVVRFOiIsIG5hbWUsIGkgKTsKKworCQkJYXR0cmlidXRlc1sg
bmFtZSBdID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sIG5hbWUgKTsKKworCQl9CisK
KwkJcmV0dXJuIGF0dHJpYnV0ZXM7CisKKwl9CisKKwlmdW5jdGlvbiBmaWx0ZXJFbXB0eUxpbmUo
IHN0cmluZyApIHsKKworCQlyZXR1cm4gc3RyaW5nICE9PSAnJzsKKworCX0KKworCWZ1bmN0aW9u
IHJlcGxhY2VMaWdodE51bXMoIHN0cmluZywgcGFyYW1ldGVycyApIHsKKworCQlyZXR1cm4gc3Ry
aW5nCisJCQkucmVwbGFjZSggL05VTV9ESVJfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtRGlyTGln
aHRzICkKKwkJCS5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtU3Bv
dExpZ2h0cyApCisJCQkucmVwbGFjZSggL05VTV9SRUNUX0FSRUFfTElHSFRTL2csIHBhcmFtZXRl
cnMubnVtUmVjdEFyZWFMaWdodHMgKQorCQkJLnJlcGxhY2UoIC9OVU1fUE9JTlRfTElHSFRTL2cs
IHBhcmFtZXRlcnMubnVtUG9pbnRMaWdodHMgKQorCQkJLnJlcGxhY2UoIC9OVU1fSEVNSV9MSUdI
VFMvZywgcGFyYW1ldGVycy5udW1IZW1pTGlnaHRzICk7CisKKwl9CisKKwlmdW5jdGlvbiBwYXJz
ZUluY2x1ZGVzKCBzdHJpbmcgKSB7CisKKwkJdmFyIHBhdHRlcm4gPSAvXlsgXHRdKiNpbmNsdWRl
ICs8KFtcd1xkLl0rKT4vZ207CisKKwkJZnVuY3Rpb24gcmVwbGFjZSggbWF0Y2gsIGluY2x1ZGUg
KSB7CisKKwkJCXZhciByZXBsYWNlID0gU2hhZGVyQ2h1bmtbIGluY2x1ZGUgXTsKKworCQkJaWYg
KCByZXBsYWNlID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQl0aHJvdyBuZXcgRXJyb3IoICdDYW4g
bm90IHJlc29sdmUgI2luY2x1ZGUgPCcgKyBpbmNsdWRlICsgJz4nICk7CisKKwkJCX0KKworCQkJ
cmV0dXJuIHBhcnNlSW5jbHVkZXMoIHJlcGxhY2UgKTsKKworCQl9CisKKwkJcmV0dXJuIHN0cmlu
Zy5yZXBsYWNlKCBwYXR0ZXJuLCByZXBsYWNlICk7CisKKwl9CisKKwlmdW5jdGlvbiB1bnJvbGxM
b29wcyggc3RyaW5nICkgeworCisJCXZhciBwYXR0ZXJuID0gL2ZvciBcKCBpbnQgaSBcPSAoXGQr
KVw7IGkgPCAoXGQrKVw7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nOworCisJCWZ1
bmN0aW9uIHJlcGxhY2UoIG1hdGNoLCBzdGFydCwgZW5kLCBzbmlwcGV0ICkgeworCisJCQl2YXIg
dW5yb2xsID0gJyc7CisKKwkJCWZvciAoIHZhciBpID0gcGFyc2VJbnQoIHN0YXJ0ICk7IGkgPCBw
YXJzZUludCggZW5kICk7IGkgKysgKSB7CisKKwkJCQl1bnJvbGwgKz0gc25pcHBldC5yZXBsYWNl
KCAvXFsgaSBcXS9nLCAnWyAnICsgaSArICcgXScgKTsKKworCQkJfQorCisJCQlyZXR1cm4gdW5y
b2xsOworCisJCX0KKworCQlyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2Ug
KTsKKworCX0KKworCWZ1bmN0aW9uIFdlYkdMUHJvZ3JhbSggcmVuZGVyZXIsIGNvZGUsIG1hdGVy
aWFsLCBzaGFkZXIsIHBhcmFtZXRlcnMgKSB7CisKKwkJdmFyIGdsID0gcmVuZGVyZXIuY29udGV4
dDsKKworCQl2YXIgZXh0ZW5zaW9ucyA9IG1hdGVyaWFsLmV4dGVuc2lvbnM7CisJCXZhciBkZWZp
bmVzID0gbWF0ZXJpYWwuZGVmaW5lczsKKworCQl2YXIgdmVydGV4U2hhZGVyID0gc2hhZGVyLnZl
cnRleFNoYWRlcjsKKwkJdmFyIGZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVy
OworCisJCXZhciBzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX0JBU0lDJzsK
KworCQlpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gUENGU2hhZG93TWFwICkgewor
CisJCQlzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRic7CisKKwkJfSBl
bHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTb2Z0U2hhZG93TWFwICkg
eworCisJCQlzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRl9TT0ZUJzsK
KworCQl9CisKKwkJdmFyIGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7CisJ
CXZhciBlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRkxFQ1RJT04nOworCQl2YXIg
ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJzsKKworCQlp
ZiAoIHBhcmFtZXRlcnMuZW52TWFwICkgeworCisJCQlzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAu
bWFwcGluZyApIHsKKworCQkJCWNhc2UgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOgorCQkJCWNhc2Ug
Q3ViZVJlZnJhY3Rpb25NYXBwaW5nOgorCQkJCQllbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9U
WVBFX0NVQkUnOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgQ3ViZVVWUmVmbGVjdGlvbk1hcHBp
bmc6CisJCQkJY2FzZSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZzoKKwkJCQkJZW52TWFwVHlwZURl
ZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFX1VWJzsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEVx
dWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOgorCQkJCWNhc2UgRXF1aXJlY3Rhbmd1bGFy
UmVmcmFjdGlvbk1hcHBpbmc6CisJCQkJCWVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVf
RVFVSVJFQyc7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBTcGhlcmljYWxSZWZsZWN0aW9uTWFw
cGluZzoKKwkJCQkJZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9TUEhFUkUnOworCQkJ
CQlicmVhazsKKworCQkJfQorCisJCQlzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyAp
IHsKKworCQkJCWNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOgorCQkJCWNhc2UgRXF1aXJlY3Rh
bmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6CisJCQkJCWVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQ
X01PREVfUkVGUkFDVElPTic7CisJCQkJCWJyZWFrOworCisJCQl9CisKKwkJCXN3aXRjaCAoIG1h
dGVyaWFsLmNvbWJpbmUgKSB7CisKKwkJCQljYXNlIE11bHRpcGx5T3BlcmF0aW9uOgorCQkJCQll
bnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFknOworCQkJCQli
cmVhazsKKworCQkJCWNhc2UgTWl4T3BlcmF0aW9uOgorCQkJCQllbnZNYXBCbGVuZGluZ0RlZmlu
ZSA9ICdFTlZNQVBfQkxFTkRJTkdfTUlYJzsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEFkZE9w
ZXJhdGlvbjoKKwkJCQkJZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX0FE
RCc7CisJCQkJCWJyZWFrOworCisJCQl9CisKKwkJfQorCisJCXZhciBnYW1tYUZhY3RvckRlZmlu
ZSA9ICggcmVuZGVyZXIuZ2FtbWFGYWN0b3IgPiAwICkgPyByZW5kZXJlci5nYW1tYUZhY3RvciA6
IDEuMDsKKworCQkvLyBjb25zb2xlLmxvZyggJ2J1aWxkaW5nIG5ldyBwcm9ncmFtICcgKTsKKwor
CQkvLworCisJCXZhciBjdXN0b21FeHRlbnNpb25zID0gZ2VuZXJhdGVFeHRlbnNpb25zKCBleHRl
bnNpb25zLCBwYXJhbWV0ZXJzLCByZW5kZXJlci5leHRlbnNpb25zICk7CisKKwkJdmFyIGN1c3Rv
bURlZmluZXMgPSBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKTsKKworCQkvLworCisJCXZhciBw
cm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpOworCisJCXZhciBwcmVmaXhWZXJ0ZXgsIHByZWZp
eEZyYWdtZW50OworCisJCWlmICggbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCApIHsKKwor
CQkJcHJlZml4VmVydGV4ID0gWworCisJCQkJY3VzdG9tRGVmaW5lcywKKworCQkJCSdcbicKKwor
CQkJXS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcbicgKTsKKworCQkJcHJlZml4
RnJhZ21lbnQgPSBbCisKKwkJCQljdXN0b21FeHRlbnNpb25zLAorCQkJCWN1c3RvbURlZmluZXMs
CisKKwkJCQknXG4nCisKKwkJCV0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXG4n
ICk7CisKKwkJfSBlbHNlIHsKKworCQkJcHJlZml4VmVydGV4ID0gWworCisJCQkJJ3ByZWNpc2lv
biAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsCisJCQkJJ3ByZWNpc2lvbiAn
ICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGludDsnLAorCisJCQkJJyNkZWZpbmUgU0hBREVS
X05BTUUgJyArIHNoYWRlci5uYW1lLAorCisJCQkJY3VzdG9tRGVmaW5lcywKKworCQkJCXBhcmFt
ZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFZFUlRFWF9URVhUVVJFUycg
OiAnJywKKworCQkJCScjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAnICsgZ2FtbWFGYWN0b3JEZWZpbmUs
CisKKwkJCQknI2RlZmluZSBNQVhfQk9ORVMgJyArIHBhcmFtZXRlcnMubWF4Qm9uZXMsCisJCQkJ
KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZP
RycgOiAnJywKKwkJCQkoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nRXhwICkg
PyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJywKKworCQkJCXBhcmFtZXRlcnMubWFwID8gJyNkZWZp
bmUgVVNFX01BUCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9F
TlZNQVAnIDogJycsCisJCQkJcGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFw
TW9kZURlZmluZSA6ICcnLAorCQkJCXBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0Vf
TElHSFRNQVAnIDogJycsCisJCQkJcGFyYW1ldGVycy5hb01hcCA/ICcjZGVmaW5lIFVTRV9BT01B
UCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNT
SVZFTUFQJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1Q
TUFQJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMubm9ybWFsTWFwID8gJyNkZWZpbmUgVVNFX05PUk1B
TE1BUCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcCAmJiBwYXJhbWV0ZXJz
LnN1cHBvcnRzVmVydGV4VGV4dHVyZXMgPyAnI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQJyA6
ICcnLAorCQkJCXBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJN
QVAnIDogJycsCisJCQkJcGFyYW1ldGVycy5yb3VnaG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfUk9V
R0hORVNTTUFQJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUg
VVNFX01FVEFMTkVTU01BUCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZp
bmUgVVNFX0FMUEhBTUFQJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMudmVydGV4Q29sb3JzID8gJyNk
ZWZpbmUgVVNFX0NPTE9SJyA6ICcnLAorCisJCQkJcGFyYW1ldGVycy5mbGF0U2hhZGluZyA/ICcj
ZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLAorCisJCQkJcGFyYW1ldGVycy5za2lubmluZyA/ICcj
ZGVmaW5lIFVTRV9TS0lOTklORycgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLnVzZVZlcnRleFRleHR1
cmUgPyAnI2RlZmluZSBCT05FX1RFWFRVUkUnIDogJycsCisKKwkJCQlwYXJhbWV0ZXJzLm1vcnBo
VGFyZ2V0cyA/ICcjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMnIDogJycsCisJCQkJcGFyYW1ldGVy
cy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAnI2Rl
ZmluZSBVU0VfTU9SUEhOT1JNQUxTJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMuZG91YmxlU2lkZWQg
PyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsCisJCQkJcGFyYW1ldGVycy5mbGlwU2lkZWQg
PyAnI2RlZmluZSBGTElQX1NJREVEJyA6ICcnLAorCisJCQkJJyNkZWZpbmUgTlVNX0NMSVBQSU5H
X1BMQU5FUyAnICsgcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcywKKworCQkJCXBhcmFtZXRl
cnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsCisJCQkJ
cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgJyArIHNoYWRvd01hcFR5cGVE
ZWZpbmUgOiAnJywKKworCQkJCXBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uID8gJyNkZWZpbmUg
VVNFX1NJWkVBVFRFTlVBVElPTicgOiAnJywKKworCQkJCXBhcmFtZXRlcnMubG9nYXJpdGhtaWNE
ZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJywKKwkJCQlwYXJhbWV0
ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgJiYgcmVuZGVyZXIuZXh0ZW5zaW9ucy5nZXQoICdF
WFRfZnJhZ19kZXB0aCcgKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsCisK
KwkJCQkndW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OycsCisJCQkJJ3VuaWZvcm0gbWF0NCBtb2Rl
bFZpZXdNYXRyaXg7JywKKwkJCQkndW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7JywKKwkJ
CQkndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7JywKKwkJCQkndW5pZm9ybSBtYXQzIG5vcm1hbE1h
dHJpeDsnLAorCQkJCSd1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247JywKKworCQkJCSdhdHRy
aWJ1dGUgdmVjMyBwb3NpdGlvbjsnLAorCQkJCSdhdHRyaWJ1dGUgdmVjMyBub3JtYWw7JywKKwkJ
CQknYXR0cmlidXRlIHZlYzIgdXY7JywKKworCQkJCScjaWZkZWYgVVNFX0NPTE9SJywKKworCQkJ
CScJYXR0cmlidXRlIHZlYzMgY29sb3I7JywKKworCQkJCScjZW5kaWYnLAorCisJCQkJJyNpZmRl
ZiBVU0VfTU9SUEhUQVJHRVRTJywKKworCQkJCScJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQw
OycsCisJCQkJJwlhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDE7JywKKwkJCQknCWF0dHJpYnV0
ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsnLAorCQkJCScJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQz
OycsCisKKwkJCQknCSNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTJywKKworCQkJCScJCWF0dHJpYnV0
ZSB2ZWMzIG1vcnBoTm9ybWFsMDsnLAorCQkJCScJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFs
MTsnLAorCQkJCScJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsnLAorCQkJCScJCWF0dHJp
YnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMzsnLAorCisJCQkJJwkjZWxzZScsCisKKwkJCQknCQlhdHRy
aWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7JywKKwkJCQknCQlhdHRyaWJ1dGUgdmVjMyBtb3JwaFRh
cmdldDU7JywKKwkJCQknCQlhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDY7JywKKwkJCQknCQlh
dHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7JywKKworCQkJCScJI2VuZGlmJywKKworCQkJCScj
ZW5kaWYnLAorCisJCQkJJyNpZmRlZiBVU0VfU0tJTk5JTkcnLAorCisJCQkJJwlhdHRyaWJ1dGUg
dmVjNCBza2luSW5kZXg7JywKKwkJCQknCWF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7JywKKwor
CQkJCScjZW5kaWYnLAorCisJCQkJJ1xuJworCisJCQldLmZpbHRlciggZmlsdGVyRW1wdHlMaW5l
ICkuam9pbiggJ1xuJyApOworCisJCQlwcmVmaXhGcmFnbWVudCA9IFsKKworCQkJCWN1c3RvbUV4
dGVuc2lvbnMsCisKKwkJCQkncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcg
ZmxvYXQ7JywKKwkJCQkncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50
OycsCisKKwkJCQknI2RlZmluZSBTSEFERVJfTkFNRSAnICsgc2hhZGVyLm5hbWUsCisKKwkJCQlj
dXN0b21EZWZpbmVzLAorCisJCQkJcGFyYW1ldGVycy5hbHBoYVRlc3QgPyAnI2RlZmluZSBBTFBI
QVRFU1QgJyArIHBhcmFtZXRlcnMuYWxwaGFUZXN0IDogJycsCisKKwkJCQknI2RlZmluZSBHQU1N
QV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLAorCisJCQkJKCBwYXJhbWV0ZXJzLnVzZUZv
ZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJywKKwkJCQkoIHBh
cmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nRXhwICkgPyAnI2RlZmluZSBGT0dfRVhQ
MicgOiAnJywKKworCQkJCXBhcmFtZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJywK
KwkJCQlwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsCisJCQkJ
cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwVHlwZURlZmluZSA6ICcnLAor
CQkJCXBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcE1vZGVEZWZpbmUgOiAn
JywKKwkJCQlwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBCbGVuZGluZ0Rl
ZmluZSA6ICcnLAorCQkJCXBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRN
QVAnIDogJycsCisJCQkJcGFyYW1ldGVycy5hb01hcCA/ICcjZGVmaW5lIFVTRV9BT01BUCcgOiAn
JywKKwkJCQlwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQ
JyA6ICcnLAorCQkJCXBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6
ICcnLAorCQkJCXBhcmFtZXRlcnMubm9ybWFsTWFwID8gJyNkZWZpbmUgVVNFX05PUk1BTE1BUCcg
OiAnJywKKwkJCQlwYXJhbWV0ZXJzLnNwZWN1bGFyTWFwID8gJyNkZWZpbmUgVVNFX1NQRUNVTEFS
TUFQJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JP
VUdITkVTU01BUCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5l
IFVTRV9NRVRBTE5FU1NNQVAnIDogJycsCisJCQkJcGFyYW1ldGVycy5hbHBoYU1hcCA/ICcjZGVm
aW5lIFVTRV9BTFBIQU1BUCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcj
ZGVmaW5lIFVTRV9DT0xPUicgOiAnJywKKworCQkJCXBhcmFtZXRlcnMuZ3JhZGllbnRNYXAgPyAn
I2RlZmluZSBVU0VfR1JBRElFTlRNQVAnIDogJycsCisKKwkJCQlwYXJhbWV0ZXJzLmZsYXRTaGFk
aW5nID8gJyNkZWZpbmUgRkxBVF9TSEFERUQnIDogJycsCisKKwkJCQlwYXJhbWV0ZXJzLmRvdWJs
ZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMuZmxp
cFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJywKKworCQkJCScjZGVmaW5lIE5VTV9D
TElQUElOR19QTEFORVMgJyArIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMsCisJCQkJJyNk
ZWZpbmUgVU5JT05fQ0xJUFBJTkdfUExBTkVTICcgKyAocGFyYW1ldGVycy5udW1DbGlwcGluZ1Bs
YW5lcyAtIHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbiksCisKKwkJCQlwYXJhbWV0ZXJz
LnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLAorCQkJCXBh
cmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVm
aW5lIDogJycsCisKKwkJCQlwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA/ICIjZGVmaW5l
IFBSRU1VTFRJUExJRURfQUxQSEEiIDogJycsCisKKwkJCQlwYXJhbWV0ZXJzLnBoeXNpY2FsbHlD
b3JyZWN0TGlnaHRzID8gIiNkZWZpbmUgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyIgOiAnJywK
KworCQkJCXBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9M
T0dERVBUSEJVRicgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIg
JiYgcmVuZGVyZXIuZXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZGVmaW5l
IFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsCisKKwkJCQlwYXJhbWV0ZXJzLmVudk1hcCAmJiBy
ZW5kZXJlci5leHRlbnNpb25zLmdldCggJ0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkgPyAnI2Rl
ZmluZSBURVhUVVJFX0xPRF9FWFQnIDogJycsCisKKwkJCQkndW5pZm9ybSBtYXQ0IHZpZXdNYXRy
aXg7JywKKwkJCQkndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsCisKKwkJCQkoIHBhcmFt
ZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/ICIjZGVmaW5lIFRPTkVfTUFQ
UElORyIgOiAnJywKKwkJCQkoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBp
bmcgKSA/IFNoYWRlckNodW5rWyAndG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAg
Ly8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB0
b25lTWFwcGluZygpIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3cKKwkJCQkoIHBhcmFtZXRlcnMudG9u
ZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oICJ0
b25lTWFwcGluZyIsIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgKSA6ICcnLAorCisJCQkJcGFyYW1l
dGVycy5kaXRoZXJpbmcgPyAnI2RlZmluZSBESVRIRVJJTkcnIDogJycsCisKKwkJCQkoIHBhcmFt
ZXRlcnMub3V0cHV0RW5jb2RpbmcgfHwgcGFyYW1ldGVycy5tYXBFbmNvZGluZyB8fCBwYXJhbWV0
ZXJzLmVudk1hcEVuY29kaW5nIHx8IHBhcmFtZXRlcnMuZW1pc3NpdmVNYXBFbmNvZGluZyApID8g
U2hhZGVyQ2h1bmtbICdlbmNvZGluZ3NfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAvLyB0aGlzIGNv
ZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlIHZhcmlvdXMgZW5j
b2RpbmcvZGVjb2RpbmcgZnVuY3Rpb24gZGVmaW5lZCBiZWxvdworCQkJCXBhcmFtZXRlcnMubWFw
RW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdtYXBUZXhlbFRvTGluZWFyJywg
cGFyYW1ldGVycy5tYXBFbmNvZGluZyApIDogJycsCisJCQkJcGFyYW1ldGVycy5lbnZNYXBFbmNv
ZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ2Vudk1hcFRleGVsVG9MaW5lYXInLCBw
YXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nICkgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLmVtaXNzaXZl
TWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbWlzc2l2ZU1hcFRleGVs
VG9MaW5lYXInLCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA6ICcnLAorCQkJCXBh
cmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgPyBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oICJsaW5l
YXJUb091dHB1dFRleGVsIiwgcGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyApIDogJycsCisKKwkJ
CQlwYXJhbWV0ZXJzLmRlcHRoUGFja2luZyA/ICIjZGVmaW5lIERFUFRIX1BBQ0tJTkcgIiArIG1h
dGVyaWFsLmRlcHRoUGFja2luZyA6ICcnLAorCisJCQkJJ1xuJworCisJCQldLmZpbHRlciggZmls
dGVyRW1wdHlMaW5lICkuam9pbiggJ1xuJyApOworCisJCX0KKworCQl2ZXJ0ZXhTaGFkZXIgPSBw
YXJzZUluY2x1ZGVzKCB2ZXJ0ZXhTaGFkZXIgKTsKKwkJdmVydGV4U2hhZGVyID0gcmVwbGFjZUxp
Z2h0TnVtcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7CisKKwkJZnJhZ21lbnRTaGFkZXIg
PSBwYXJzZUluY2x1ZGVzKCBmcmFnbWVudFNoYWRlciApOworCQlmcmFnbWVudFNoYWRlciA9IHJl
cGxhY2VMaWdodE51bXMoIGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzICk7CisKKwkJaWYgKCAh
IG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgKSB7CisKKwkJCXZlcnRleFNoYWRlciA9IHVucm9s
bExvb3BzKCB2ZXJ0ZXhTaGFkZXIgKTsKKwkJCWZyYWdtZW50U2hhZGVyID0gdW5yb2xsTG9vcHMo
IGZyYWdtZW50U2hhZGVyICk7CisKKwkJfQorCisJCXZhciB2ZXJ0ZXhHbHNsID0gcHJlZml4VmVy
dGV4ICsgdmVydGV4U2hhZGVyOworCQl2YXIgZnJhZ21lbnRHbHNsID0gcHJlZml4RnJhZ21lbnQg
KyBmcmFnbWVudFNoYWRlcjsKKworCQkvLyBjb25zb2xlLmxvZyggJypWRVJURVgqJywgdmVydGV4
R2xzbCApOworCQkvLyBjb25zb2xlLmxvZyggJypGUkFHTUVOVConLCBmcmFnbWVudEdsc2wgKTsK
KworCQl2YXIgZ2xWZXJ0ZXhTaGFkZXIgPSBXZWJHTFNoYWRlciggZ2wsIGdsLlZFUlRFWF9TSEFE
RVIsIHZlcnRleEdsc2wgKTsKKwkJdmFyIGdsRnJhZ21lbnRTaGFkZXIgPSBXZWJHTFNoYWRlcigg
Z2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRHbHNsICk7CisKKwkJZ2wuYXR0YWNoU2hh
ZGVyKCBwcm9ncmFtLCBnbFZlcnRleFNoYWRlciApOworCQlnbC5hdHRhY2hTaGFkZXIoIHByb2dy
YW0sIGdsRnJhZ21lbnRTaGFkZXIgKTsKKworCQkvLyBGb3JjZSBhIHBhcnRpY3VsYXIgYXR0cmli
dXRlIHRvIGluZGV4IDAuCisKKwkJaWYgKCBtYXRlcmlhbC5pbmRleDBBdHRyaWJ1dGVOYW1lICE9
PSB1bmRlZmluZWQgKSB7CisKKwkJCWdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwg
bWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSApOworCisJCX0gZWxzZSBpZiAoIHBhcmFtZXRl
cnMubW9ycGhUYXJnZXRzID09PSB0cnVlICkgeworCisJCQkvLyBwcm9ncmFtcyB3aXRoIG1vcnBo
VGFyZ2V0cyBkaXNwbGFjZSBwb3NpdGlvbiBvdXQgb2YgYXR0cmlidXRlIDAKKwkJCWdsLmJpbmRB
dHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgJ3Bvc2l0aW9uJyApOworCisJCX0KKworCQlnbC5s
aW5rUHJvZ3JhbSggcHJvZ3JhbSApOworCisJCXZhciBwcm9ncmFtTG9nID0gZ2wuZ2V0UHJvZ3Jh
bUluZm9Mb2coIHByb2dyYW0gKTsKKwkJdmFyIHZlcnRleExvZyA9IGdsLmdldFNoYWRlckluZm9M
b2coIGdsVmVydGV4U2hhZGVyICk7CisJCXZhciBmcmFnbWVudExvZyA9IGdsLmdldFNoYWRlcklu
Zm9Mb2coIGdsRnJhZ21lbnRTaGFkZXIgKTsKKworCQl2YXIgcnVubmFibGUgPSB0cnVlOworCQl2
YXIgaGF2ZURpYWdub3N0aWNzID0gdHJ1ZTsKKworCQkvLyBjb25zb2xlLmxvZyggJyoqVkVSVEVY
KionLCBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0
ZWRTaGFkZXJTb3VyY2UoIGdsVmVydGV4U2hhZGVyICkgKTsKKwkJLy8gY29uc29sZS5sb2coICcq
KkZSQUdNRU5UKionLCBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdl
dFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoIGdsRnJhZ21lbnRTaGFkZXIgKSApOworCisJCWlmICgg
Z2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMgKSA9PT0gZmFs
c2UgKSB7CisKKwkJCXJ1bm5hYmxlID0gZmFsc2U7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJF
RS5XZWJHTFByb2dyYW06IHNoYWRlciBlcnJvcjogJywgZ2wuZ2V0RXJyb3IoKSwgJ2dsLlZBTElE
QVRFX1NUQVRVUycsIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLlZBTElEQVRF
X1NUQVRVUyApLCAnZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cnLCBwcm9ncmFtTG9nLCB2ZXJ0ZXhMb2cs
IGZyYWdtZW50TG9nICk7CisKKwkJfSBlbHNlIGlmICggcHJvZ3JhbUxvZyAhPT0gJycgKSB7CisK
KwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogZ2wuZ2V0UHJvZ3JhbUluZm9M
b2coKScsIHByb2dyYW1Mb2cgKTsKKworCQl9IGVsc2UgaWYgKCB2ZXJ0ZXhMb2cgPT09ICcnIHx8
IGZyYWdtZW50TG9nID09PSAnJyApIHsKKworCQkJaGF2ZURpYWdub3N0aWNzID0gZmFsc2U7CisK
KwkJfQorCisJCWlmICggaGF2ZURpYWdub3N0aWNzICkgeworCisJCQl0aGlzLmRpYWdub3N0aWNz
ID0geworCisJCQkJcnVubmFibGU6IHJ1bm5hYmxlLAorCQkJCW1hdGVyaWFsOiBtYXRlcmlhbCwK
KworCQkJCXByb2dyYW1Mb2c6IHByb2dyYW1Mb2csCisKKwkJCQl2ZXJ0ZXhTaGFkZXI6IHsKKwor
CQkJCQlsb2c6IHZlcnRleExvZywKKwkJCQkJcHJlZml4OiBwcmVmaXhWZXJ0ZXgKKworCQkJCX0s
CisKKwkJCQlmcmFnbWVudFNoYWRlcjogeworCisJCQkJCWxvZzogZnJhZ21lbnRMb2csCisJCQkJ
CXByZWZpeDogcHJlZml4RnJhZ21lbnQKKworCQkJCX0KKworCQkJfTsKKworCQl9CisKKwkJLy8g
Y2xlYW4gdXAKKworCQlnbC5kZWxldGVTaGFkZXIoIGdsVmVydGV4U2hhZGVyICk7CisJCWdsLmRl
bGV0ZVNoYWRlciggZ2xGcmFnbWVudFNoYWRlciApOworCisJCS8vIHNldCB1cCBjYWNoaW5nIGZv
ciB1bmlmb3JtIGxvY2F0aW9ucworCisJCXZhciBjYWNoZWRVbmlmb3JtczsKKworCQl0aGlzLmdl
dFVuaWZvcm1zID0gZnVuY3Rpb24oKSB7CisKKwkJCWlmICggY2FjaGVkVW5pZm9ybXMgPT09IHVu
ZGVmaW5lZCApIHsKKworCQkJCWNhY2hlZFVuaWZvcm1zID0KKwkJCQkJbmV3IFdlYkdMVW5pZm9y
bXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApOworCisJCQl9CisKKwkJCXJldHVybiBjYWNoZWRV
bmlmb3JtczsKKworCQl9OworCisJCS8vIHNldCB1cCBjYWNoaW5nIGZvciBhdHRyaWJ1dGUgbG9j
YXRpb25zCisKKwkJdmFyIGNhY2hlZEF0dHJpYnV0ZXM7CisKKwkJdGhpcy5nZXRBdHRyaWJ1dGVz
ID0gZnVuY3Rpb24oKSB7CisKKwkJCWlmICggY2FjaGVkQXR0cmlidXRlcyA9PT0gdW5kZWZpbmVk
ICkgeworCisJCQkJY2FjaGVkQXR0cmlidXRlcyA9IGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBn
bCwgcHJvZ3JhbSApOworCisJCQl9CisKKwkJCXJldHVybiBjYWNoZWRBdHRyaWJ1dGVzOworCisJ
CX07CisKKwkJLy8gZnJlZSByZXNvdXJjZQorCisJCXRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkg
eworCisJCQlnbC5kZWxldGVQcm9ncmFtKCBwcm9ncmFtICk7CisJCQl0aGlzLnByb2dyYW0gPSB1
bmRlZmluZWQ7CisKKwkJfTsKKworCQkvLyBERVBSRUNBVEVECisKKwkJT2JqZWN0LmRlZmluZVBy
b3BlcnRpZXMoIHRoaXMsIHsKKworCQkJdW5pZm9ybXM6IHsKKwkJCQlnZXQ6IGZ1bmN0aW9uKCkg
eworCisJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogLnVuaWZvcm1zIGlz
IG5vdyAuZ2V0VW5pZm9ybXMoKS4nICk7CisJCQkJCXJldHVybiB0aGlzLmdldFVuaWZvcm1zKCk7
CisKKwkJCQl9CisJCQl9LAorCisJCQlhdHRyaWJ1dGVzOiB7CisJCQkJZ2V0OiBmdW5jdGlvbigp
IHsKKworCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IC5hdHRyaWJ1dGVz
IGlzIG5vdyAuZ2V0QXR0cmlidXRlcygpLicgKTsKKwkJCQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmli
dXRlcygpOworCisJCQkJfQorCQkJfQorCisJCX0gKTsKKworCisJCS8vCisKKwkJdGhpcy5pZCA9
IHByb2dyYW1JZENvdW50ICsrOworCQl0aGlzLmNvZGUgPSBjb2RlOworCQl0aGlzLnVzZWRUaW1l
cyA9IDE7CisJCXRoaXMucHJvZ3JhbSA9IHByb2dyYW07CisJCXRoaXMudmVydGV4U2hhZGVyID0g
Z2xWZXJ0ZXhTaGFkZXI7CisJCXRoaXMuZnJhZ21lbnRTaGFkZXIgPSBnbEZyYWdtZW50U2hhZGVy
OworCisJCXJldHVybiB0aGlzOworCisJfQorCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBo
dHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFdlYkdMUHJvZ3JhbXMoIHJlbmRl
cmVyLCBjYXBhYmlsaXRpZXMgKSB7CisKKwkJdmFyIHByb2dyYW1zID0gW107CisKKwkJdmFyIHNo
YWRlcklEcyA9IHsKKwkJCU1lc2hEZXB0aE1hdGVyaWFsOiAnZGVwdGgnLAorCQkJTWVzaE5vcm1h
bE1hdGVyaWFsOiAnbm9ybWFsJywKKwkJCU1lc2hCYXNpY01hdGVyaWFsOiAnYmFzaWMnLAorCQkJ
TWVzaExhbWJlcnRNYXRlcmlhbDogJ2xhbWJlcnQnLAorCQkJTWVzaFBob25nTWF0ZXJpYWw6ICdw
aG9uZycsCisJCQlNZXNoVG9vbk1hdGVyaWFsOiAncGhvbmcnLAorCQkJTWVzaFN0YW5kYXJkTWF0
ZXJpYWw6ICdwaHlzaWNhbCcsCisJCQlNZXNoUGh5c2ljYWxNYXRlcmlhbDogJ3BoeXNpY2FsJywK
KwkJCUxpbmVCYXNpY01hdGVyaWFsOiAnYmFzaWMnLAorCQkJTGluZURhc2hlZE1hdGVyaWFsOiAn
ZGFzaGVkJywKKwkJCVBvaW50c01hdGVyaWFsOiAncG9pbnRzJworCQl9OworCisJCXZhciBwYXJh
bWV0ZXJOYW1lcyA9IFsKKwkJCSJwcmVjaXNpb24iLCAic3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyIs
ICJtYXAiLCAibWFwRW5jb2RpbmciLCAiZW52TWFwIiwgImVudk1hcE1vZGUiLCAiZW52TWFwRW5j
b2RpbmciLAorCQkJImxpZ2h0TWFwIiwgImFvTWFwIiwgImVtaXNzaXZlTWFwIiwgImVtaXNzaXZl
TWFwRW5jb2RpbmciLCAiYnVtcE1hcCIsICJub3JtYWxNYXAiLCAiZGlzcGxhY2VtZW50TWFwIiwg
InNwZWN1bGFyTWFwIiwKKwkJCSJyb3VnaG5lc3NNYXAiLCAibWV0YWxuZXNzTWFwIiwgImdyYWRp
ZW50TWFwIiwKKwkJCSJhbHBoYU1hcCIsICJjb21iaW5lIiwgInZlcnRleENvbG9ycyIsICJmb2ci
LCAidXNlRm9nIiwgImZvZ0V4cCIsCisJCQkiZmxhdFNoYWRpbmciLCAic2l6ZUF0dGVudWF0aW9u
IiwgImxvZ2FyaXRobWljRGVwdGhCdWZmZXIiLCAic2tpbm5pbmciLAorCQkJIm1heEJvbmVzIiwg
InVzZVZlcnRleFRleHR1cmUiLCAibW9ycGhUYXJnZXRzIiwgIm1vcnBoTm9ybWFscyIsCisJCQki
bWF4TW9ycGhUYXJnZXRzIiwgIm1heE1vcnBoTm9ybWFscyIsICJwcmVtdWx0aXBsaWVkQWxwaGEi
LAorCQkJIm51bURpckxpZ2h0cyIsICJudW1Qb2ludExpZ2h0cyIsICJudW1TcG90TGlnaHRzIiwg
Im51bUhlbWlMaWdodHMiLCAibnVtUmVjdEFyZWFMaWdodHMiLAorCQkJInNoYWRvd01hcEVuYWJs
ZWQiLCAic2hhZG93TWFwVHlwZSIsICJ0b25lTWFwcGluZyIsICdwaHlzaWNhbGx5Q29ycmVjdExp
Z2h0cycsCisJCQkiYWxwaGFUZXN0IiwgImRvdWJsZVNpZGVkIiwgImZsaXBTaWRlZCIsICJudW1D
bGlwcGluZ1BsYW5lcyIsICJudW1DbGlwSW50ZXJzZWN0aW9uIiwgImRlcHRoUGFja2luZyIsICJk
aXRoZXJpbmciCisJCV07CisKKworCQlmdW5jdGlvbiBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSB7
CisKKwkJCXZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjsKKwkJCXZhciBib25lcyA9IHNr
ZWxldG9uLmJvbmVzOworCisJCQlpZiAoIGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVz
ICkgeworCisJCQkJcmV0dXJuIDEwMjQ7CisKKwkJCX0gZWxzZSB7CisKKwkJCQkvLyBkZWZhdWx0
IGZvciB3aGVuIG9iamVjdCBpcyBub3Qgc3BlY2lmaWVkCisJCQkJLy8gKCBmb3IgZXhhbXBsZSB3
aGVuIHByZWJ1aWxkaW5nIHNoYWRlciB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgb2JqZWN0cyAp
CisJCQkJLy8KKwkJCQkvLyAgLSBsZWF2ZSBzb21lIGV4dHJhIHNwYWNlIGZvciBvdGhlciB1bmlm
b3JtcworCQkJCS8vICAtIGxpbWl0IGhlcmUgaXMgQU5HTEUncyAyNTQgbWF4IHVuaWZvcm0gdmVj
dG9ycworCQkJCS8vICAgICh1cCB0byA1NCBzaG91bGQgYmUgc2FmZSkKKworCQkJCXZhciBuVmVy
dGV4VW5pZm9ybXMgPSBjYXBhYmlsaXRpZXMubWF4VmVydGV4VW5pZm9ybXM7CisJCQkJdmFyIG5W
ZXJ0ZXhNYXRyaWNlcyA9IE1hdGguZmxvb3IoICggblZlcnRleFVuaWZvcm1zIC0gMjAgKSAvIDQg
KTsKKworCQkJCXZhciBtYXhCb25lcyA9IE1hdGgubWluKCBuVmVydGV4TWF0cmljZXMsIGJvbmVz
Lmxlbmd0aCApOworCisJCQkJaWYgKCBtYXhCb25lcyA8IGJvbmVzLmxlbmd0aCApIHsKKworCQkJ
CQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgJyArIGJv
bmVzLmxlbmd0aCArICcgYm9uZXMuIFRoaXMgR1BVIHN1cHBvcnRzICcgKyBtYXhCb25lcyArICcu
JyApOworCQkJCQlyZXR1cm4gMDsKKworCQkJCX0KKworCQkJCXJldHVybiBtYXhCb25lczsKKwor
CQkJfQorCisJCX0KKworCQlmdW5jdGlvbiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXAs
IGdhbW1hT3ZlcnJpZGVMaW5lYXIgKSB7CisKKwkJCXZhciBlbmNvZGluZzsKKworCQkJaWYgKCAh
IG1hcCApIHsKKworCQkJCWVuY29kaW5nID0gTGluZWFyRW5jb2Rpbmc7CisKKwkJCX0gZWxzZSBp
ZiAoIG1hcC5pc1RleHR1cmUgKSB7CisKKwkJCQllbmNvZGluZyA9IG1hcC5lbmNvZGluZzsKKwor
CQkJfSBlbHNlIGlmICggbWFwLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7CisKKwkJCQljb25zb2xl
Lndhcm4oICJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRv
bid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHBy
b3BlcnR5IGluc3RlYWQuIiApOworCQkJCWVuY29kaW5nID0gbWFwLnRleHR1cmUuZW5jb2Rpbmc7
CisKKwkJCX0KKworCQkJLy8gYWRkIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBXZWJHTFJl
bmRlcmVyLmdhbW1hSW5wdXQvZ2FtbWFPdXRwdXQgcGFyYW1ldGVyLCBzaG91bGQgcHJvYmFibHkg
YmUgcmVtb3ZlZCBhdCBzb21lIHBvaW50LgorCQkJaWYgKCBlbmNvZGluZyA9PT0gTGluZWFyRW5j
b2RpbmcgJiYgZ2FtbWFPdmVycmlkZUxpbmVhciApIHsKKworCQkJCWVuY29kaW5nID0gR2FtbWFF
bmNvZGluZzsKKworCQkJfQorCisJCQlyZXR1cm4gZW5jb2Rpbmc7CisKKwkJfQorCisJCXRoaXMu
Z2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIGxpZ2h0cywgZm9nLCBuQ2xpcFBs
YW5lcywgbkNsaXBJbnRlcnNlY3Rpb24sIG9iamVjdCApIHsKKworCQkJdmFyIHNoYWRlcklEID0g
c2hhZGVySURzWyBtYXRlcmlhbC50eXBlIF07CisKKwkJCS8vIGhldXJpc3RpY3MgdG8gY3JlYXRl
IHNoYWRlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBsaWdodHMgaW4gdGhlIHNjZW5lCisJCQkv
LyAobm90IHRvIGJsb3cgb3ZlciBtYXhMaWdodHMgYnVkZ2V0KQorCisJCQl2YXIgbWF4Qm9uZXMg
PSBvYmplY3QuaXNTa2lubmVkTWVzaCA/IGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIDogMDsKKwkJ
CXZhciBwcmVjaXNpb24gPSByZW5kZXJlci5nZXRQcmVjaXNpb24oKTsKKworCQkJaWYgKCBtYXRl
cmlhbC5wcmVjaXNpb24gIT09IG51bGwgKSB7CisKKwkJCQlwcmVjaXNpb24gPSBjYXBhYmlsaXRp
ZXMuZ2V0TWF4UHJlY2lzaW9uKCBtYXRlcmlhbC5wcmVjaXNpb24gKTsKKworCQkJCWlmICggcHJl
Y2lzaW9uICE9PSBtYXRlcmlhbC5wcmVjaXNpb24gKSB7CisKKwkJCQkJY29uc29sZS53YXJuKCAn
VEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6JywgbWF0ZXJpYWwucHJlY2lzaW9uLCAn
bm90IHN1cHBvcnRlZCwgdXNpbmcnLCBwcmVjaXNpb24sICdpbnN0ZWFkLicgKTsKKworCQkJCX0K
KworCQkJfQorCisJCQl2YXIgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRl
clRhcmdldCgpOworCisJCQl2YXIgcGFyYW1ldGVycyA9IHsKKworCQkJCXNoYWRlcklEOiBzaGFk
ZXJJRCwKKworCQkJCXByZWNpc2lvbjogcHJlY2lzaW9uLAorCQkJCXN1cHBvcnRzVmVydGV4VGV4
dHVyZXM6IGNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcywKKwkJCQlvdXRwdXRFbmNvZGluZzog
Z2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggKCAhIGN1cnJlbnRSZW5kZXJUYXJnZXQgKSA/IG51
bGwgOiBjdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUsIHJlbmRlcmVyLmdhbW1hT3V0cHV0ICks
CisJCQkJbWFwOiAhISBtYXRlcmlhbC5tYXAsCisJCQkJbWFwRW5jb2Rpbmc6IGdldFRleHR1cmVF
bmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLm1hcCwgcmVuZGVyZXIuZ2FtbWFJbnB1dCApLAorCQkJ
CWVudk1hcDogISEgbWF0ZXJpYWwuZW52TWFwLAorCQkJCWVudk1hcE1vZGU6IG1hdGVyaWFsLmVu
dk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAubWFwcGluZywKKwkJCQllbnZNYXBFbmNvZGluZzogZ2V0
VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW52TWFwLCByZW5kZXJlci5nYW1tYUlu
cHV0ICksCisJCQkJZW52TWFwQ3ViZVVWOiAoICEhIG1hdGVyaWFsLmVudk1hcCApICYmICggKCBt
YXRlcmlhbC5lbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSB8fCAo
IG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyApICks
CisJCQkJbGlnaHRNYXA6ICEhIG1hdGVyaWFsLmxpZ2h0TWFwLAorCQkJCWFvTWFwOiAhISBtYXRl
cmlhbC5hb01hcCwKKwkJCQllbWlzc2l2ZU1hcDogISEgbWF0ZXJpYWwuZW1pc3NpdmVNYXAsCisJ
CQkJZW1pc3NpdmVNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJp
YWwuZW1pc3NpdmVNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSwKKwkJCQlidW1wTWFwOiAhISBt
YXRlcmlhbC5idW1wTWFwLAorCQkJCW5vcm1hbE1hcDogISEgbWF0ZXJpYWwubm9ybWFsTWFwLAor
CQkJCWRpc3BsYWNlbWVudE1hcDogISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwLAorCQkJCXJv
dWdobmVzc01hcDogISEgbWF0ZXJpYWwucm91Z2huZXNzTWFwLAorCQkJCW1ldGFsbmVzc01hcDog
ISEgbWF0ZXJpYWwubWV0YWxuZXNzTWFwLAorCQkJCXNwZWN1bGFyTWFwOiAhISBtYXRlcmlhbC5z
cGVjdWxhck1hcCwKKwkJCQlhbHBoYU1hcDogISEgbWF0ZXJpYWwuYWxwaGFNYXAsCisKKwkJCQln
cmFkaWVudE1hcDogISEgbWF0ZXJpYWwuZ3JhZGllbnRNYXAsCisKKwkJCQljb21iaW5lOiBtYXRl
cmlhbC5jb21iaW5lLAorCisJCQkJdmVydGV4Q29sb3JzOiBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMs
CisKKwkJCQlmb2c6ICEhIGZvZywKKwkJCQl1c2VGb2c6IG1hdGVyaWFsLmZvZywKKwkJCQlmb2dF
eHA6ICggZm9nICYmIGZvZy5pc0ZvZ0V4cDIgKSwKKworCQkJCWZsYXRTaGFkaW5nOiBtYXRlcmlh
bC5zaGFkaW5nID09PSBGbGF0U2hhZGluZywKKworCQkJCXNpemVBdHRlbnVhdGlvbjogbWF0ZXJp
YWwuc2l6ZUF0dGVudWF0aW9uLAorCQkJCWxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGNhcGFiaWxp
dGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLAorCisJCQkJc2tpbm5pbmc6IG1hdGVyaWFsLnNr
aW5uaW5nICYmIG1heEJvbmVzID4gMCwKKwkJCQltYXhCb25lczogbWF4Qm9uZXMsCisJCQkJdXNl
VmVydGV4VGV4dHVyZTogY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMsCisKKwkJCQlt
b3JwaFRhcmdldHM6IG1hdGVyaWFsLm1vcnBoVGFyZ2V0cywKKwkJCQltb3JwaE5vcm1hbHM6IG1h
dGVyaWFsLm1vcnBoTm9ybWFscywKKwkJCQltYXhNb3JwaFRhcmdldHM6IHJlbmRlcmVyLm1heE1v
cnBoVGFyZ2V0cywKKwkJCQltYXhNb3JwaE5vcm1hbHM6IHJlbmRlcmVyLm1heE1vcnBoTm9ybWFs
cywKKworCQkJCW51bURpckxpZ2h0czogbGlnaHRzLmRpcmVjdGlvbmFsLmxlbmd0aCwKKwkJCQlu
dW1Qb2ludExpZ2h0czogbGlnaHRzLnBvaW50Lmxlbmd0aCwKKwkJCQludW1TcG90TGlnaHRzOiBs
aWdodHMuc3BvdC5sZW5ndGgsCisJCQkJbnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJl
YS5sZW5ndGgsCisJCQkJbnVtSGVtaUxpZ2h0czogbGlnaHRzLmhlbWkubGVuZ3RoLAorCisJCQkJ
bnVtQ2xpcHBpbmdQbGFuZXM6IG5DbGlwUGxhbmVzLAorCQkJCW51bUNsaXBJbnRlcnNlY3Rpb246
IG5DbGlwSW50ZXJzZWN0aW9uLAorCisJCQkJZGl0aGVyaW5nOiBtYXRlcmlhbC5kaXRoZXJpbmcs
CisKKwkJCQlzaGFkb3dNYXBFbmFibGVkOiByZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCAmJiBv
YmplY3QucmVjZWl2ZVNoYWRvdyAmJiBsaWdodHMuc2hhZG93cy5sZW5ndGggPiAwLAorCQkJCXNo
YWRvd01hcFR5cGU6IHJlbmRlcmVyLnNoYWRvd01hcC50eXBlLAorCisJCQkJdG9uZU1hcHBpbmc6
IHJlbmRlcmVyLnRvbmVNYXBwaW5nLAorCQkJCXBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzOiByZW5k
ZXJlci5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cywKKworCQkJCXByZW11bHRpcGxpZWRBbHBoYTog
bWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhLAorCisJCQkJYWxwaGFUZXN0OiBtYXRlcmlhbC5h
bHBoYVRlc3QsCisJCQkJZG91YmxlU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUs
CisJCQkJZmxpcFNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSwKKworCQkJCWRlcHRo
UGFja2luZzogKCBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJp
YWwuZGVwdGhQYWNraW5nIDogZmFsc2UKKworCQkJfTsKKworCQkJcmV0dXJuIHBhcmFtZXRlcnM7
CisKKwkJfTsKKworCQl0aGlzLmdldFByb2dyYW1Db2RlID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwg
cGFyYW1ldGVycyApIHsKKworCQkJdmFyIGFycmF5ID0gW107CisKKwkJCWlmICggcGFyYW1ldGVy
cy5zaGFkZXJJRCApIHsKKworCQkJCWFycmF5LnB1c2goIHBhcmFtZXRlcnMuc2hhZGVySUQgKTsK
KworCQkJfSBlbHNlIHsKKworCQkJCWFycmF5LnB1c2goIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVy
ICk7CisJCQkJYXJyYXkucHVzaCggbWF0ZXJpYWwudmVydGV4U2hhZGVyICk7CisKKwkJCX0KKwor
CQkJaWYgKCBtYXRlcmlhbC5kZWZpbmVzICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQlmb3IgKCB2
YXIgbmFtZSBpbiBtYXRlcmlhbC5kZWZpbmVzICkgeworCisJCQkJCWFycmF5LnB1c2goIG5hbWUg
KTsKKwkJCQkJYXJyYXkucHVzaCggbWF0ZXJpYWwuZGVmaW5lc1sgbmFtZSBdICk7CisKKwkJCQl9
CisKKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3Ro
OyBpICsrICkgeworCisJCQkJYXJyYXkucHVzaCggcGFyYW1ldGVyc1sgcGFyYW1ldGVyTmFtZXNb
IGkgXSBdICk7CisKKwkJCX0KKworCQkJYXJyYXkucHVzaCggbWF0ZXJpYWwub25CZWZvcmVDb21w
aWxlLnRvU3RyaW5nKCkgKTsKKworCQkJYXJyYXkucHVzaCggcmVuZGVyZXIuZ2FtbWFPdXRwdXQg
KTsKKworCQkJcmV0dXJuIGFycmF5LmpvaW4oKTsKKworCQl9OworCisJCXRoaXMuYWNxdWlyZVBy
b2dyYW0gPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBzaGFkZXIsIHBhcmFtZXRlcnMsIGNvZGUgKSB7
CisKKwkJCXZhciBwcm9ncmFtOworCisJCQkvLyBDaGVjayBpZiBjb2RlIGhhcyBiZWVuIGFscmVh
ZHkgY29tcGlsZWQKKwkJCWZvciAoIHZhciBwID0gMCwgcGwgPSBwcm9ncmFtcy5sZW5ndGg7IHAg
PCBwbDsgcCArKyApIHsKKworCQkJCXZhciBwcm9ncmFtSW5mbyA9IHByb2dyYW1zWyBwIF07CisK
KwkJCQlpZiAoIHByb2dyYW1JbmZvLmNvZGUgPT09IGNvZGUgKSB7CisKKwkJCQkJcHJvZ3JhbSA9
IHByb2dyYW1JbmZvOworCQkJCQkrKyBwcm9ncmFtLnVzZWRUaW1lczsKKworCQkJCQlicmVhazsK
KworCQkJCX0KKworCQkJfQorCisJCQlpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHsKKwor
CQkJCXByb2dyYW0gPSBuZXcgV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgY29kZSwgbWF0ZXJpYWws
IHNoYWRlciwgcGFyYW1ldGVycyApOworCQkJCXByb2dyYW1zLnB1c2goIHByb2dyYW0gKTsKKwor
CQkJfQorCisJCQlyZXR1cm4gcHJvZ3JhbTsKKworCQl9OworCisJCXRoaXMucmVsZWFzZVByb2dy
YW0gPSBmdW5jdGlvbiAoIHByb2dyYW0gKSB7CisKKwkJCWlmICggLS0gcHJvZ3JhbS51c2VkVGlt
ZXMgPT09IDAgKSB7CisKKwkJCQkvLyBSZW1vdmUgZnJvbSB1bm9yZGVyZWQgc2V0CisJCQkJdmFy
IGkgPSBwcm9ncmFtcy5pbmRleE9mKCBwcm9ncmFtICk7CisJCQkJcHJvZ3JhbXNbIGkgXSA9IHBy
b2dyYW1zWyBwcm9ncmFtcy5sZW5ndGggLSAxIF07CisJCQkJcHJvZ3JhbXMucG9wKCk7CisKKwkJ
CQkvLyBGcmVlIFdlYkdMIHJlc291cmNlcworCQkJCXByb2dyYW0uZGVzdHJveSgpOworCisJCQl9
CisKKwkJfTsKKworCQkvLyBFeHBvc2VkIGZvciByZXNvdXJjZSBtb25pdG9yaW5nICYgZXJyb3Ig
ZmVlZGJhY2sgdmlhIHJlbmRlcmVyLmluZm86CisJCXRoaXMucHJvZ3JhbXMgPSBwcm9ncmFtczsK
KworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJ
ICovCisKKwlmdW5jdGlvbiBXZWJHTFRleHR1cmVzKCBfZ2wsIGV4dGVuc2lvbnMsIHN0YXRlLCBw
cm9wZXJ0aWVzLCBjYXBhYmlsaXRpZXMsIHBhcmFtVGhyZWVUb0dMLCBpbmZvTWVtb3J5ICkgewor
CisJCXZhciBfaXNXZWJHTDIgPSAoIHR5cGVvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ICE9PSAn
dW5kZWZpbmVkJyAmJiBfZ2wgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ICk7CisK
KwkJLy8KKworCQlmdW5jdGlvbiBjbGFtcFRvTWF4U2l6ZSggaW1hZ2UsIG1heFNpemUgKSB7CisK
KwkJCWlmICggaW1hZ2Uud2lkdGggPiBtYXhTaXplIHx8IGltYWdlLmhlaWdodCA+IG1heFNpemUg
KSB7CisKKwkJCQkvLyBXYXJuaW5nOiBTY2FsaW5nIHRocm91Z2ggdGhlIGNhbnZhcyB3aWxsIG9u
bHkgd29yayB3aXRoIGltYWdlcyB0aGF0IHVzZQorCQkJCS8vIHByZW11bHRpcGxpZWQgYWxwaGEu
CisKKwkJCQl2YXIgc2NhbGUgPSBtYXhTaXplIC8gTWF0aC5tYXgoIGltYWdlLndpZHRoLCBpbWFn
ZS5oZWlnaHQgKTsKKworCQkJCXZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMo
ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTsKKwkJCQljYW52YXMu
d2lkdGggPSBNYXRoLmZsb29yKCBpbWFnZS53aWR0aCAqIHNjYWxlICk7CisJCQkJY2FudmFzLmhl
aWdodCA9IE1hdGguZmxvb3IoIGltYWdlLmhlaWdodCAqIHNjYWxlICk7CisKKwkJCQl2YXIgY29u
dGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7CisJCQkJY29udGV4dC5kcmF3SW1hZ2Uo
IGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCAwLCBjYW52YXMud2lk
dGgsIGNhbnZhcy5oZWlnaHQgKTsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVu
ZGVyZXI6IGltYWdlIGlzIHRvbyBiaWcgKCcgKyBpbWFnZS53aWR0aCArICd4JyArIGltYWdlLmhl
aWdodCArICcpLiBSZXNpemVkIHRvICcgKyBjYW52YXMud2lkdGggKyAneCcgKyBjYW52YXMuaGVp
Z2h0LCBpbWFnZSApOworCisJCQkJcmV0dXJuIGNhbnZhczsKKworCQkJfQorCisJCQlyZXR1cm4g
aW1hZ2U7CisKKwkJfQorCisJCWZ1bmN0aW9uIGlzUG93ZXJPZlR3byggaW1hZ2UgKSB7CisKKwkJ
CXJldHVybiBfTWF0aC5pc1Bvd2VyT2ZUd28oIGltYWdlLndpZHRoICkgJiYgX01hdGguaXNQb3dl
ck9mVHdvKCBpbWFnZS5oZWlnaHQgKTsKKworCQl9CisKKwkJZnVuY3Rpb24gbWFrZVBvd2VyT2ZU
d28oIGltYWdlICkgeworCisJCQlpZiAoIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVu
dCB8fCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkgeworCisJCQkJdmFyIGNh
bnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkv
eGh0bWwnLCAnY2FudmFzJyApOworCQkJCWNhbnZhcy53aWR0aCA9IF9NYXRoLm5lYXJlc3RQb3dl
ck9mVHdvKCBpbWFnZS53aWR0aCApOworCQkJCWNhbnZhcy5oZWlnaHQgPSBfTWF0aC5uZWFyZXN0
UG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7CisKKwkJCQl2YXIgY29udGV4dCA9IGNhbnZhcy5n
ZXRDb250ZXh0KCAnMmQnICk7CisJCQkJY29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBj
YW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQgKTsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVF
LldlYkdMUmVuZGVyZXI6IGltYWdlIGlzIG5vdCBwb3dlciBvZiB0d28gKCcgKyBpbWFnZS53aWR0
aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLiBSZXNpemVkIHRvICcgKyBjYW52YXMud2lkdGgg
KyAneCcgKyBjYW52YXMuaGVpZ2h0LCBpbWFnZSApOworCisJCQkJcmV0dXJuIGNhbnZhczsKKwor
CQkJfQorCisJCQlyZXR1cm4gaW1hZ2U7CisKKwkJfQorCisJCWZ1bmN0aW9uIHRleHR1cmVOZWVk
c1Bvd2VyT2ZUd28oIHRleHR1cmUgKSB7CisKKwkJCXJldHVybiAoIHRleHR1cmUud3JhcFMgIT09
IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFw
cGluZyApIHx8CisJCQkJKCB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVhcmVzdEZpbHRlciAmJiB0
ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyICk7CisKKwkJfQorCisJCWZ1bmN0aW9u
IHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNQb3dlck9mVHdvICkgewor
CisJCQlyZXR1cm4gdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgJiYgaXNQb3dlck9mVHdvICYmCisJ
CQkJdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0
ZXIgIT09IExpbmVhckZpbHRlcjsKKworCQl9CisKKwkJLy8gRmFsbGJhY2sgZmlsdGVycyBmb3Ig
bm9uLXBvd2VyLW9mLTIgdGV4dHVyZXMKKworCQlmdW5jdGlvbiBmaWx0ZXJGYWxsYmFjayggZiAp
IHsKKworCQkJaWYgKCBmID09PSBOZWFyZXN0RmlsdGVyIHx8IGYgPT09IE5lYXJlc3RNaXBNYXBO
ZWFyZXN0RmlsdGVyIHx8IGYgPT09IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgKSB7CisKKwkJ
CQlyZXR1cm4gX2dsLk5FQVJFU1Q7CisKKwkJCX0KKworCQkJcmV0dXJuIF9nbC5MSU5FQVI7CisK
KwkJfQorCisJCS8vCisKKwkJZnVuY3Rpb24gb25UZXh0dXJlRGlzcG9zZSggZXZlbnQgKSB7CisK
KwkJCXZhciB0ZXh0dXJlID0gZXZlbnQudGFyZ2V0OworCisJCQl0ZXh0dXJlLnJlbW92ZUV2ZW50
TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApOworCisJCQlkZWFsbG9jYXRl
VGV4dHVyZSggdGV4dHVyZSApOworCisJCQlpbmZvTWVtb3J5LnRleHR1cmVzIC0tOworCisKKwkJ
fQorCisJCWZ1bmN0aW9uIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSggZXZlbnQgKSB7CisKKwkJCXZh
ciByZW5kZXJUYXJnZXQgPSBldmVudC50YXJnZXQ7CisKKwkJCXJlbmRlclRhcmdldC5yZW1vdmVF
dmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApOworCisJCQlk
ZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTsKKworCQkJaW5mb01lbW9yeS50
ZXh0dXJlcyAtLTsKKworCQl9CisKKwkJLy8KKworCQlmdW5jdGlvbiBkZWFsbG9jYXRlVGV4dHVy
ZSggdGV4dHVyZSApIHsKKworCQkJdmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5n
ZXQoIHRleHR1cmUgKTsKKworCQkJaWYgKCB0ZXh0dXJlLmltYWdlICYmIHRleHR1cmVQcm9wZXJ0
aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKSB7CisKKwkJCQkvLyBjdWJlIHRleHR1cmUK
KworCQkJCV9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJn
bFRleHR1cmVDdWJlICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQkvLyAyRCB0ZXh0dXJlCisKKwkJ
CQlpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID09PSB1bmRlZmluZWQgKSByZXR1
cm47CisKKwkJCQlfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRl
eHR1cmUgKTsKKworCQkJfQorCisJCQkvLyByZW1vdmUgYWxsIHdlYmdsIHByb3BlcnRpZXMKKwkJ
CXByb3BlcnRpZXMucmVtb3ZlKCB0ZXh0dXJlICk7CisKKwkJfQorCisJCWZ1bmN0aW9uIGRlYWxs
b2NhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHsKKworCQkJdmFyIHJlbmRlclRhcmdl
dFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7CisJCQl2YXIgdGV4
dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTsK
KworCQkJaWYgKCAhIHJlbmRlclRhcmdldCApIHJldHVybjsKKworCQkJaWYgKCB0ZXh0dXJlUHJv
cGVydGllcy5fX3dlYmdsVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJX2dsLmRlbGV0
ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7CisKKwkJCX0KKwor
CQkJaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkgeworCisJCQkJcmVuZGVyVGFyZ2V0
LmRlcHRoVGV4dHVyZS5kaXNwb3NlKCk7CisKKwkJCX0KKworCQkJaWYgKCByZW5kZXJUYXJnZXQu
aXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2
OyBpICsrICkgeworCisJCQkJCV9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJv
cGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApOworCQkJCQlpZiAoIHJlbmRlclRhcmdl
dFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlcigg
cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSApOworCisJCQkJ
fQorCisJCQl9IGVsc2UgeworCisJCQkJX2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJn
ZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApOworCQkJCWlmICggcmVuZGVyVGFyZ2V0
UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKSBfZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKCBy
ZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApOworCisJCQl9CisKKwkJ
CXByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQudGV4dHVyZSApOworCQkJcHJvcGVydGll
cy5yZW1vdmUoIHJlbmRlclRhcmdldCApOworCisJCX0KKworCQkvLworCisKKworCQlmdW5jdGlv
biBzZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7CisKKwkJCXZhciB0ZXh0dXJlUHJvcGVy
dGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7CisKKwkJCWlmICggdGV4dHVyZS52ZXJz
aW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lv
biApIHsKKworCQkJCXZhciBpbWFnZSA9IHRleHR1cmUuaW1hZ2U7CisKKwkJCQlpZiAoIGltYWdl
ID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5k
ZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgdW5kZWZpbmVkJywg
dGV4dHVyZSApOworCisJCQkJfSBlbHNlIGlmICggaW1hZ2UuY29tcGxldGUgPT09IGZhbHNlICkg
eworCisJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFy
a2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIGluY29tcGxldGUnLCB0ZXh0dXJlICk7CisKKwkJ
CQl9IGVsc2UgeworCisJCQkJCXVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0
dXJlLCBzbG90ICk7CisJCQkJCXJldHVybjsKKworCQkJCX0KKworCQkJfQorCisJCQlzdGF0ZS5h
Y3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7CisJCQlzdGF0ZS5iaW5kVGV4dHVy
ZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7CisK
KwkJfQorCisJCWZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkgeworCisJ
CQl2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApOworCisJ
CQlpZiAoIHRleHR1cmUuaW1hZ2UubGVuZ3RoID09PSA2ICkgeworCisJCQkJaWYgKCB0ZXh0dXJl
LnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52
ZXJzaW9uICkgeworCisJCQkJCWlmICggISB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJn
bFRleHR1cmVDdWJlICkgeworCisJCQkJCQl0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNw
b3NlJywgb25UZXh0dXJlRGlzcG9zZSApOworCisJCQkJCQl0ZXh0dXJlUHJvcGVydGllcy5fX2lt
YWdlX193ZWJnbFRleHR1cmVDdWJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTsKKworCQkJCQkJaW5m
b01lbW9yeS50ZXh0dXJlcyArKzsKKworCQkJCQl9CisKKwkJCQkJc3RhdGUuYWN0aXZlVGV4dHVy
ZSggX2dsLlRFWFRVUkUwICsgc2xvdCApOworCQkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRF
WFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1
YmUgKTsKKworCQkJCQlfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0
ZXh0dXJlLmZsaXBZICk7CisKKwkJCQkJdmFyIGlzQ29tcHJlc3NlZCA9ICggdGV4dHVyZSAmJiB0
ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgKTsKKwkJCQkJdmFyIGlzRGF0YVRleHR1cmUgPSAo
IHRleHR1cmUuaW1hZ2VbIDAgXSAmJiB0ZXh0dXJlLmltYWdlWyAwIF0uaXNEYXRhVGV4dHVyZSAp
OworCisJCQkJCXZhciBjdWJlSW1hZ2UgPSBbXTsKKworCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkg
PCA2OyBpICsrICkgeworCisJCQkJCQlpZiAoICEgaXNDb21wcmVzc2VkICYmICEgaXNEYXRhVGV4
dHVyZSApIHsKKworCQkJCQkJCWN1YmVJbWFnZVsgaSBdID0gY2xhbXBUb01heFNpemUoIHRleHR1
cmUuaW1hZ2VbIGkgXSwgY2FwYWJpbGl0aWVzLm1heEN1YmVtYXBTaXplICk7CisKKwkJCQkJCX0g
ZWxzZSB7CisKKwkJCQkJCQljdWJlSW1hZ2VbIGkgXSA9IGlzRGF0YVRleHR1cmUgPyB0ZXh0dXJl
LmltYWdlWyBpIF0uaW1hZ2UgOiB0ZXh0dXJlLmltYWdlWyBpIF07CisKKwkJCQkJCX0KKworCQkJ
CQl9CisKKwkJCQkJdmFyIGltYWdlID0gY3ViZUltYWdlWyAwIF0sCisJCQkJCWlzUG93ZXJPZlR3
b0ltYWdlID0gaXNQb3dlck9mVHdvKCBpbWFnZSApLAorCQkJCQlnbEZvcm1hdCA9IHBhcmFtVGhy
ZWVUb0dMKCB0ZXh0dXJlLmZvcm1hdCApLAorCQkJCQlnbFR5cGUgPSBwYXJhbVRocmVlVG9HTCgg
dGV4dHVyZS50eXBlICk7CisKKwkJCQkJc2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJF
X0NVQkVfTUFQLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApOworCisJCQkJCWZvciAoIHZh
ciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CisKKwkJCQkJCWlmICggISBpc0NvbXByZXNzZWQgKSB7
CisKKwkJCQkJCQlpZiAoIGlzRGF0YVRleHR1cmUgKSB7CisKKwkJCQkJCQkJc3RhdGUudGV4SW1h
Z2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIGdsRm9ybWF0LCBj
dWJlSW1hZ2VbIGkgXS53aWR0aCwgY3ViZUltYWdlWyBpIF0uaGVpZ2h0LCAwLCBnbEZvcm1hdCwg
Z2xUeXBlLCBjdWJlSW1hZ2VbIGkgXS5kYXRhICk7CisKKwkJCQkJCQl9IGVsc2UgeworCisJCQkJ
CQkJCXN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBp
LCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0gKTsKKworCQkJ
CQkJCX0KKworCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCXZhciBtaXBtYXAsIG1pcG1hcHMgPSBj
dWJlSW1hZ2VbIGkgXS5taXBtYXBzOworCisJCQkJCQkJZm9yICggdmFyIGogPSAwLCBqbCA9IG1p
cG1hcHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CisKKwkJCQkJCQkJbWlwbWFwID0gbWlwbWFw
c1sgaiBdOworCisJCQkJCQkJCWlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYg
dGV4dHVyZS5mb3JtYXQgIT09IFJHQkZvcm1hdCApIHsKKworCQkJCQkJCQkJaWYgKCBzdGF0ZS5n
ZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkg
eworCisJCQkJCQkJCQkJc3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NV
QkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAu
aGVpZ2h0LCAwLCBtaXBtYXAuZGF0YSApOworCisJCQkJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJ
CQkJY29uc29sZS53YXJuKCAiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVu
c3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnNldFRleHR1cmVDdWJlKCki
ICk7CisKKwkJCQkJCQkJCX0KKworCQkJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJCQlzdGF0ZS50
ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3Jt
YXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlw
bWFwLmRhdGEgKTsKKworCQkJCQkJCQl9CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQl9
CisKKwkJCQkJaWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzUG93
ZXJPZlR3b0ltYWdlICkgKSB7CisKKwkJCQkJCV9nbC5nZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRV
UkVfQ1VCRV9NQVAgKTsKKworCQkJCQl9CisKKwkJCQkJdGV4dHVyZVByb3BlcnRpZXMuX192ZXJz
aW9uID0gdGV4dHVyZS52ZXJzaW9uOworCisJCQkJCWlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRl
eHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJc3RhdGUu
YWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApOworCQkJCQlzdGF0ZS5iaW5kVGV4
dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dl
YmdsVGV4dHVyZUN1YmUgKTsKKworCQkJCX0KKworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiBz
ZXRUZXh0dXJlQ3ViZUR5bmFtaWMoIHRleHR1cmUsIHNsb3QgKSB7CisKKwkJCXN0YXRlLmFjdGl2
ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTsKKwkJCXN0YXRlLmJpbmRUZXh0dXJlKCBf
Z2wuVEVYVFVSRV9DVUJFX01BUCwgcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4
dHVyZSApOworCisJCX0KKworCQlmdW5jdGlvbiBzZXRUZXh0dXJlUGFyYW1ldGVycyggdGV4dHVy
ZVR5cGUsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICkgeworCisJCQl2YXIgZXh0ZW5zaW9u
OworCisJCQlpZiAoIGlzUG93ZXJPZlR3b0ltYWdlICkgeworCisJCQkJX2dsLnRleFBhcmFtZXRl
cmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1MsIHBhcmFtVGhyZWVUb0dMKCB0ZXh0
dXJlLndyYXBTICkgKTsKKwkJCQlfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5U
RVhUVVJFX1dSQVBfVCwgcGFyYW1UaHJlZVRvR0woIHRleHR1cmUud3JhcFQgKSApOworCisJCQkJ
X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBw
YXJhbVRocmVlVG9HTCggdGV4dHVyZS5tYWdGaWx0ZXIgKSApOworCQkJCV9nbC50ZXhQYXJhbWV0
ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgcGFyYW1UaHJlZVRvR0wo
IHRleHR1cmUubWluRmlsdGVyICkgKTsKKworCQkJfSBlbHNlIHsKKworCQkJCV9nbC50ZXhQYXJh
bWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9TLCBfZ2wuQ0xBTVBfVE9fRURH
RSApOworCQkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JB
UF9ULCBfZ2wuQ0xBTVBfVE9fRURHRSApOworCisJCQkJaWYgKCB0ZXh0dXJlLndyYXBTICE9PSBD
bGFtcFRvRWRnZVdyYXBwaW5nIHx8IHRleHR1cmUud3JhcFQgIT09IENsYW1wVG9FZGdlV3JhcHBp
bmcgKSB7CisKKwkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVy
ZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLndyYXBTIGFuZCBUZXh0dXJlLndyYXBUIHNo
b3VsZCBiZSBzZXQgdG8gVEhSRUUuQ2xhbXBUb0VkZ2VXcmFwcGluZy4nLCB0ZXh0dXJlICk7CisK
KwkJCQl9CisKKwkJCQlfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJF
X01BR19GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1hZ0ZpbHRlciApICk7CisJCQkJ
X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBm
aWx0ZXJGYWxsYmFjayggdGV4dHVyZS5taW5GaWx0ZXIgKSApOworCisJCQkJaWYgKCB0ZXh0dXJl
Lm1pbkZpbHRlciAhPT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGlu
ZWFyRmlsdGVyICkgeworCisJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6
IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxkIGJl
IHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4nLCB0ZXh0
dXJlICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQo
ICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7CisKKwkJCWlmICggZXh0ZW5zaW9u
ICkgeworCisJCQkJaWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSAmJiBleHRlbnNpb25z
LmdldCggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKSA9PT0gbnVsbCApIHJldHVybjsKKwkJ
CQlpZiAoIHRleHR1cmUudHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCgg
J09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApID09PSBudWxsICkgcmV0dXJuOworCisJ
CQkJaWYgKCB0ZXh0dXJlLmFuaXNvdHJvcHkgPiAxIHx8IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJl
ICkuX19jdXJyZW50QW5pc290cm9weSApIHsKKworCQkJCQlfZ2wudGV4UGFyYW1ldGVyZiggdGV4
dHVyZVR5cGUsIGV4dGVuc2lvbi5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgTWF0aC5taW4o
IHRleHR1cmUuYW5pc290cm9weSwgY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKSApICk7
CisJCQkJCXByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSA9IHRl
eHR1cmUuYW5pc290cm9weTsKKworCQkJCX0KKworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiB1
cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApIHsKKworCQkJ
aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkgeworCisJ
CQkJdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPSB0cnVlOworCisJCQkJdGV4dHVyZS5h
ZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTsKKworCQkJCXRl
eHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTsKKwor
CQkJCWluZm9NZW1vcnkudGV4dHVyZXMgKys7CisKKwkJCX0KKworCQkJc3RhdGUuYWN0aXZlVGV4
dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApOworCQkJc3RhdGUuYmluZFRleHR1cmUoIF9nbC5U
RVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApOworCisJCQlfZ2wu
cGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZICk7CisJ
CQlfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRl
eHR1cmUucHJlbXVsdGlwbHlBbHBoYSApOworCQkJX2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNL
X0FMSUdOTUVOVCwgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTsKKworCQkJdmFyIGltYWdlID0g
Y2xhbXBUb01heFNpemUoIHRleHR1cmUuaW1hZ2UsIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6
ZSApOworCisJCQlpZiAoIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSAmJiBpc1Bv
d2VyT2ZUd28oIGltYWdlICkgPT09IGZhbHNlICkgeworCisJCQkJaW1hZ2UgPSBtYWtlUG93ZXJP
ZlR3byggaW1hZ2UgKTsKKworCQkJfQorCisJCQl2YXIgaXNQb3dlck9mVHdvSW1hZ2UgPSBpc1Bv
d2VyT2ZUd28oIGltYWdlICksCisJCQlnbEZvcm1hdCA9IHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJl
LmZvcm1hdCApLAorCQkJZ2xUeXBlID0gcGFyYW1UaHJlZVRvR0woIHRleHR1cmUudHlwZSApOwor
CisJCQlzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGlzUG93
ZXJPZlR3b0ltYWdlICk7CisKKwkJCXZhciBtaXBtYXAsIG1pcG1hcHMgPSB0ZXh0dXJlLm1pcG1h
cHM7CisKKwkJCWlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHsKKworCQkJCS8vIHBvcHVs
YXRlIGRlcHRoIHRleHR1cmUgd2l0aCBkdW1teSBkYXRhCisKKwkJCQl2YXIgaW50ZXJuYWxGb3Jt
YXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UOworCisJCQkJaWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZs
b2F0VHlwZSApIHsKKworCQkJCQlpZiAoICFfaXNXZWJHTDIgKSB0aHJvdyBuZXcgRXJyb3IoJ0Zs
b2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAnKTsKKwkJCQkJaW50
ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMzJGOworCisJCQkJfSBlbHNlIGlmICgg
X2lzV2ViR0wyICkgeworCisJCQkJCS8vIFdlYkdMIDIuMCByZXF1aXJlcyBzaWduZWQgaW50ZXJu
YWxmb3JtYXQgZm9yIGdsVGV4SW1hZ2UyRAorCQkJCQlpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBU
SF9DT01QT05FTlQxNjsKKworCQkJCX0KKworCQkJCWlmICggdGV4dHVyZS5mb3JtYXQgPT09IERl
cHRoRm9ybWF0ICYmIGludGVybmFsRm9ybWF0ID09PSBfZ2wuREVQVEhfQ09NUE9ORU5UICkgewor
CisJCQkJCS8vIFRoZSBlcnJvciBJTlZBTElEX09QRVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4
SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFsZm9ybWF0IGFyZQorCQkJCQkvLyBERVBUSF9D
T01QT05FTlQgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX1NIT1JUIG9yIFVOU0lHTkVEX0lOVAor
CQkJCQkvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9u
cy9XRUJHTF9kZXB0aF90ZXh0dXJlLykKKwkJCQkJaWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2ln
bmVkU2hvcnRUeXBlICYmIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRJbnRUeXBlICkgeworCisJ
CQkJCSAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2ln
bmVkU2hvcnRUeXBlIG9yIFVuc2lnbmVkSW50VHlwZSBmb3IgRGVwdGhGb3JtYXQgRGVwdGhUZXh0
dXJlLicgKTsKKworCQkJCQkJdGV4dHVyZS50eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7CisJCQkJ
CQlnbFR5cGUgPSBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS50eXBlICk7CisKKwkJCQkJfQorCisJ
CQkJfQorCisJCQkJLy8gRGVwdGggc3RlbmNpbCB0ZXh0dXJlcyBuZWVkIHRoZSBERVBUSF9TVEVO
Q0lMIGludGVybmFsIGZvcm1hdAorCQkJCS8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdp
c3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKQorCQkJCWlmICggdGV4
dHVyZS5mb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHsKKworCQkJCQlpbnRlcm5hbEZv
cm1hdCA9IF9nbC5ERVBUSF9TVEVOQ0lMOworCisJCQkJCS8vIFRoZSBlcnJvciBJTlZBTElEX09Q
RVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFs
Zm9ybWF0IGFyZQorCQkJCQkvLyBERVBUSF9TVEVOQ0lMIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05F
RF9JTlRfMjRfOF9XRUJHTC4KKwkJCQkJLy8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lz
dHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pCisJCQkJCWlmICggdGV4
dHVyZS50eXBlICE9PSBVbnNpZ25lZEludDI0OFR5cGUgKSB7CisKKwkJCQkJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRo
U3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuJyApOworCisJCQkJCQl0ZXh0dXJlLnR5cGUgPSBV
bnNpZ25lZEludDI0OFR5cGU7CisJCQkJCQlnbFR5cGUgPSBwYXJhbVRocmVlVG9HTCggdGV4dHVy
ZS50eXBlICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJc3RhdGUudGV4SW1hZ2UyRCggX2ds
LlRFWFRVUkVfMkQsIDAsIGludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0
LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7CisKKwkJCX0gZWxzZSBpZiAoIHRleHR1cmUu
aXNEYXRhVGV4dHVyZSApIHsKKworCQkJCS8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMg
aWYgYXZhaWxhYmxlCisJCQkJLy8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzCisJCQkJ
Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBt
aXBtYXAgbGV2ZWxzCisKKwkJCQlpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBpc1Bvd2VyT2ZU
d29JbWFnZSApIHsKKworCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7
IGkgPCBpbDsgaSArKyApIHsKKworCQkJCQkJbWlwbWFwID0gbWlwbWFwc1sgaSBdOworCQkJCQkJ
c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lk
dGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7CisK
KwkJCQkJfQorCisJCQkJCXRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CisKKwkJCQl9
IGVsc2UgeworCisJCQkJCXN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZv
cm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1h
Z2UuZGF0YSApOworCisJCQkJfQorCisJCQl9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzQ29tcHJlc3Nl
ZFRleHR1cmUgKSB7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7
IGkgPCBpbDsgaSArKyApIHsKKworCQkJCQltaXBtYXAgPSBtaXBtYXBzWyBpIF07CisKKwkJCQkJ
aWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0g
UkdCRm9ybWF0ICkgeworCisJCQkJCQlpZiAoIHN0YXRlLmdldENvbXByZXNzZWRUZXh0dXJlRm9y
bWF0cygpLmluZGV4T2YoIGdsRm9ybWF0ICkgPiAtIDEgKSB7CisKKwkJCQkJCQlzdGF0ZS5jb21w
cmVzc2VkVGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lk
dGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7CisKKwkJCQkJCX0gZWxzZSB7CisK
KwkJCQkJCQljb25zb2xlLndhcm4oICJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxv
YWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVy
ZSgpIiApOworCisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJc3RhdGUudGV4SW1h
Z2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5o
ZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7CisKKwkJCQkJfQorCisJ
CQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJLy8gcmVndWxhciBUZXh0dXJlIChpbWFnZSwgdmlk
ZW8sIGNhbnZhcykKKworCQkJCS8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZh
aWxhYmxlCisJCQkJLy8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzCisJCQkJLy8gc2V0
IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBtaXBtYXAg
bGV2ZWxzCisKKwkJCQlpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBpc1Bvd2VyT2ZUd29JbWFn
ZSApIHsKKworCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBp
bDsgaSArKyApIHsKKworCQkJCQkJbWlwbWFwID0gbWlwbWFwc1sgaSBdOworCQkJCQkJc3RhdGUu
dGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBl
LCBtaXBtYXAgKTsKKworCQkJCQl9CisKKwkJCQkJdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBm
YWxzZTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJc3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRV
UkVfMkQsIDAsIGdsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZSApOworCisJCQkJfQor
CisJCQl9CisKKwkJCWlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBp
c1Bvd2VyT2ZUd29JbWFnZSApICkgX2dsLmdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV8yRCAp
OworCisJCQl0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247CisK
KwkJCWlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTsK
KworCQl9CisKKwkJLy8gUmVuZGVyIHRhcmdldHMKKworCQkvLyBTZXR1cCBzdG9yYWdlIGZvciB0
YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyCisJCWZ1bmN0
aW9uIHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBh
dHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0ICkgeworCisJCQl2YXIgZ2xGb3JtYXQgPSBwYXJhbVRo
cmVlVG9HTCggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ICk7CisJCQl2YXIgZ2xUeXBlID0g
cGFyYW1UaHJlZVRvR0woIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTsKKwkJCXN0YXRlLnRl
eEltYWdlMkQoIHRleHR1cmVUYXJnZXQsIDAsIGdsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgs
IHJlbmRlclRhcmdldC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTsKKwkJCV9n
bC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTsKKwkJCV9n
bC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCB0ZXh0
dXJlVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKS5fX3dlYmds
VGV4dHVyZSwgMCApOworCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBu
dWxsICk7CisKKwkJfQorCisJCS8vIFNldHVwIHN0b3JhZ2UgZm9yIGludGVybmFsIGRlcHRoL3N0
ZW5jaWwgYnVmZmVycyBhbmQgYmluZCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyCisJCWZ1bmN0aW9u
IHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyYnVmZmVyLCByZW5kZXJUYXJnZXQgKSB7
CisKKwkJCV9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZm
ZXIgKTsKKworCQkJaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgJiYgISByZW5kZXJUYXJn
ZXQuc3RlbmNpbEJ1ZmZlciApIHsKKworCQkJCV9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wu
UkVOREVSQlVGRkVSLCBfZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHJlbmRlclRhcmdldC53aWR0aCwg
cmVuZGVyVGFyZ2V0LmhlaWdodCApOworCQkJCV9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigg
X2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlJFTkRFUkJVRkZFUiwg
cmVuZGVyYnVmZmVyICk7CisKKwkJCX0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZl
ciAmJiByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHsKKworCQkJCV9nbC5yZW5kZXJidWZm
ZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTCwgcmVuZGVyVGFy
Z2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7CisJCQkJX2dsLmZyYW1lYnVmZmVyUmVu
ZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQs
IF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApOworCisJCQl9IGVsc2UgeworCisJCQkJ
Ly8gRklYTUU6IFdlIGRvbid0IHN1cHBvcnQgIWRlcHRoICFzdGVuY2lsCisJCQkJX2dsLnJlbmRl
cmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIF9nbC5SR0JBNCwgcmVuZGVyVGFyZ2V0
LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7CisKKwkJCX0KKworCQkJX2dsLmJpbmRSZW5k
ZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIG51bGwgKTsKKworCQl9CisKKwkJLy8gU2V0dXAg
cmVzb3VyY2VzIGZvciBhIERlcHRoIFRleHR1cmUgZm9yIGEgRkJPIChuZWVkcyBhbiBleHRlbnNp
b24pCisJCWZ1bmN0aW9uIHNldHVwRGVwdGhUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFy
Z2V0ICkgeworCisJCQl2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0
LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICk7CisJCQlpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBF
cnJvcignRGVwdGggVGV4dHVyZSB3aXRoIGN1YmUgcmVuZGVyIHRhcmdldHMgaXMgbm90IHN1cHBv
cnRlZCEnKTsKKworCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFt
ZWJ1ZmZlciApOworCisJCQlpZiAoICEoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgJiYgcmVu
ZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApICkgeworCisJCQkJdGhyb3cg
bmV3IEVycm9yKCdyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlIG11c3QgYmUgYW4gaW5zdGFuY2Ug
b2YgVEhSRUUuRGVwdGhUZXh0dXJlJyk7CisKKwkJCX0KKworCQkJLy8gdXBsb2FkIGFuIGVtcHR5
IGRlcHRoIHRleHR1cmUgd2l0aCBmcmFtZWJ1ZmZlciBzaXplCisJCQlpZiAoICFwcm9wZXJ0aWVz
LmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlIHx8CisJCQkJ
CXJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53
aWR0aCB8fAorCQkJCQlyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0g
cmVuZGVyVGFyZ2V0LmhlaWdodCApIHsKKwkJCQlyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmlt
YWdlLndpZHRoID0gcmVuZGVyVGFyZ2V0LndpZHRoOworCQkJCXJlbmRlclRhcmdldC5kZXB0aFRl
eHR1cmUuaW1hZ2UuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LmhlaWdodDsKKwkJCQlyZW5kZXJUYXJn
ZXQuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKwkJCX0KKworCQkJc2V0VGV4dHVy
ZTJEKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwICk7CisKKwkJCXZhciB3ZWJnbERlcHRo
VGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkuX193
ZWJnbFRleHR1cmU7CisKKwkJCWlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5mb3JtYXQg
PT09IERlcHRoRm9ybWF0ICkgeworCisJCQkJX2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wu
RlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9BVFRBQ0hNRU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xE
ZXB0aFRleHR1cmUsIDAgKTsKKworCQkJfSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4
dHVyZS5mb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHsKKworCQkJCV9nbC5mcmFtZWJ1
ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hN
RU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTsKKworCQkJfSBlbHNl
IHsKKworCQkJCXRocm93IG5ldyBFcnJvcignVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0JykK
KworCQkJfQorCisJCX0KKworCQkvLyBTZXR1cCBHTCByZXNvdXJjZXMgZm9yIGEgbm9uLXRleHR1
cmUgZGVwdGggYnVmZmVyCisJCWZ1bmN0aW9uIHNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRl
clRhcmdldCApIHsKKworCQkJdmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVz
LmdldCggcmVuZGVyVGFyZ2V0ICk7CisKKwkJCXZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldC5p
c1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA9PT0gdHJ1ZSApOworCisJCQlpZiAoIHJlbmRlclRhcmdl
dC5kZXB0aFRleHR1cmUgKSB7CisKKwkJCQlpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvcign
dGFyZ2V0LmRlcHRoVGV4dHVyZSBub3Qgc3VwcG9ydGVkIGluIEN1YmUgcmVuZGVyIHRhcmdldHMn
KTsKKworCQkJCXNldHVwRGVwdGhUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2Vi
Z2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlpZiAo
IGlzQ3ViZSApIHsKKworCQkJCQlyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1
ZmZlciA9IFtdOworCisJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CisKKwkJ
CQkJCV9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJv
cGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApOworCQkJCQkJcmVuZGVyVGFyZ2V0UHJv
cGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIo
KTsKKwkJCQkJCXNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGll
cy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0ICk7CisKKwkJCQkJfQorCisJ
CQkJfSBlbHNlIHsKKworCQkJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIs
IHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7CisJCQkJCXJlbmRl
clRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gX2dsLmNyZWF0ZVJlbmRlcmJ1
ZmZlcigpOworCQkJCQlzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlclRhcmdldFByb3Bl
cnRpZXMuX193ZWJnbERlcHRoYnVmZmVyLCByZW5kZXJUYXJnZXQgKTsKKworCQkJCX0KKworCQkJ
fQorCisJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTsKKwor
CQl9CisKKwkJLy8gU2V0IHVwIEdMIHJlc291cmNlcyBmb3IgdGhlIHJlbmRlciB0YXJnZXQKKwkJ
ZnVuY3Rpb24gc2V0dXBSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHsKKworCQkJdmFyIHJl
bmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7CisJ
CQl2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRl
eHR1cmUgKTsKKworCQkJcmVuZGVyVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywg
b25SZW5kZXJUYXJnZXREaXNwb3NlICk7CisKKwkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xU
ZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTsKKworCQkJaW5mb01lbW9yeS50ZXh0dXJlcyAr
KzsKKworCQkJdmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRD
dWJlID09PSB0cnVlICk7CisJCQl2YXIgaXNUYXJnZXRQb3dlck9mVHdvID0gaXNQb3dlck9mVHdv
KCByZW5kZXJUYXJnZXQgKTsKKworCQkJLy8gU2V0dXAgZnJhbWVidWZmZXIKKworCQkJaWYgKCBp
c0N1YmUgKSB7CisKKwkJCQlyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZl
ciA9IFtdOworCisJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHsKKworCQkJCQly
ZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0
ZUZyYW1lYnVmZmVyKCk7CisKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisKKwkJCQlyZW5kZXJUYXJn
ZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigp
OworCisJCQl9CisKKwkJCS8vIFNldHVwIGNvbG9yIGJ1ZmZlcgorCisJCQlpZiAoIGlzQ3ViZSAp
IHsKKworCQkJCXN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVy
ZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTsKKwkJCQlzZXRUZXh0dXJlUGFyYW1ldGVycygg
X2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2Vy
T2ZUd28gKTsKKworCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CisKKwkJCQkJ
c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZy
YW1lYnVmZmVyWyBpIF0sIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wu
VEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSApOworCisJCQkJfQorCisJCQkJaWYgKCB0
ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1Rhcmdl
dFBvd2VyT2ZUd28gKSApIF9nbC5nZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAg
KTsKKwkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIG51bGwgKTsK
KworCQkJfSBlbHNlIHsKKworCQkJCXN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwg
dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTsKKwkJCQlzZXRUZXh0dXJlUGFyYW1l
dGVycyggX2dsLlRFWFRVUkVfMkQsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2Vy
T2ZUd28gKTsKKwkJCQlzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVy
dGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1F
TlQwLCBfZ2wuVEVYVFVSRV8yRCApOworCisJCQkJaWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1p
cG1hcHMoIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKSApIF9nbC5n
ZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQgKTsKKwkJCQlzdGF0ZS5iaW5kVGV4dHVyZSgg
X2dsLlRFWFRVUkVfMkQsIG51bGwgKTsKKworCQkJfQorCisJCQkvLyBTZXR1cCBkZXB0aCBhbmQg
c3RlbmNpbCBidWZmZXJzCisKKwkJCWlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICkgewor
CisJCQkJc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7CisKKwkJCX0KKwor
CQl9CisKKwkJZnVuY3Rpb24gdXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQg
KSB7CisKKwkJCXZhciB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7CisJCQl2YXIgaXNU
YXJnZXRQb3dlck9mVHdvID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKTsKKworCQkJaWYg
KCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzVGFyZ2V0UG93ZXJPZlR3
byApICkgeworCisJCQkJdmFyIHRhcmdldCA9IHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFy
Z2V0Q3ViZSA/IF9nbC5URVhUVVJFX0NVQkVfTUFQIDogX2dsLlRFWFRVUkVfMkQ7CisJCQkJdmFy
IHdlYmdsVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmU7
CisKKwkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggdGFyZ2V0LCB3ZWJnbFRleHR1cmUgKTsKKwkJCQlf
Z2wuZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApOworCQkJCXN0YXRlLmJpbmRUZXh0dXJlKCB0YXJn
ZXQsIG51bGwgKTsKKworCQkJfQorCisJCX0KKworCQl0aGlzLnNldFRleHR1cmUyRCA9IHNldFRl
eHR1cmUyRDsKKwkJdGhpcy5zZXRUZXh0dXJlQ3ViZSA9IHNldFRleHR1cmVDdWJlOworCQl0aGlz
LnNldFRleHR1cmVDdWJlRHluYW1pYyA9IHNldFRleHR1cmVDdWJlRHluYW1pYzsKKwkJdGhpcy5z
ZXR1cFJlbmRlclRhcmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0OworCQl0aGlzLnVwZGF0ZVJlbmRl
clRhcmdldE1pcG1hcCA9IHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcDsKKworCX0KKworCS8qKgor
CSAqIEBhdXRob3IgZm9yZGFjaW91cyAvIGZvcmRhY2lvdXMuZ2l0aHViLmlvCisJICovCisKKwlm
dW5jdGlvbiBXZWJHTFByb3BlcnRpZXMoKSB7CisKKwkJdmFyIHByb3BlcnRpZXMgPSB7fTsKKwor
CQlmdW5jdGlvbiBnZXQoIG9iamVjdCApIHsKKworCQkJdmFyIHV1aWQgPSBvYmplY3QudXVpZDsK
KwkJCXZhciBtYXAgPSBwcm9wZXJ0aWVzWyB1dWlkIF07CisKKwkJCWlmICggbWFwID09PSB1bmRl
ZmluZWQgKSB7CisKKwkJCQltYXAgPSB7fTsKKwkJCQlwcm9wZXJ0aWVzWyB1dWlkIF0gPSBtYXA7
CisKKwkJCX0KKworCQkJcmV0dXJuIG1hcDsKKworCQl9CisKKwkJZnVuY3Rpb24gcmVtb3ZlKCBv
YmplY3QgKSB7CisKKwkJCWRlbGV0ZSBwcm9wZXJ0aWVzWyBvYmplY3QudXVpZCBdOworCisJCX0K
KworCQlmdW5jdGlvbiBjbGVhcigpIHsKKworCQkJcHJvcGVydGllcyA9IHt9OworCisJCX0KKwor
CQlyZXR1cm4geworCQkJZ2V0OiBnZXQsCisJCQlyZW1vdmU6IHJlbW92ZSwKKwkJCWNsZWFyOiBj
bGVhcgorCQl9OworCisJfQorCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJk
b29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFdlYkdMU3RhdGUoIGdsLCBleHRlbnNpb25zLCBw
YXJhbVRocmVlVG9HTCApIHsKKworCQlmdW5jdGlvbiBDb2xvckJ1ZmZlcigpIHsKKworCQkJdmFy
IGxvY2tlZCA9IGZhbHNlOworCisJCQl2YXIgY29sb3IgPSBuZXcgVmVjdG9yNCgpOworCQkJdmFy
IGN1cnJlbnRDb2xvck1hc2sgPSBudWxsOworCQkJdmFyIGN1cnJlbnRDb2xvckNsZWFyID0gbmV3
IFZlY3RvcjQoKTsKKworCQkJcmV0dXJuIHsKKworCQkJCXNldE1hc2s6IGZ1bmN0aW9uICggY29s
b3JNYXNrICkgeworCisJCQkJCWlmICggY3VycmVudENvbG9yTWFzayAhPT0gY29sb3JNYXNrICYm
ICEgbG9ja2VkICkgeworCisJCQkJCQlnbC5jb2xvck1hc2soIGNvbG9yTWFzaywgY29sb3JNYXNr
LCBjb2xvck1hc2ssIGNvbG9yTWFzayApOworCQkJCQkJY3VycmVudENvbG9yTWFzayA9IGNvbG9y
TWFzazsKKworCQkJCQl9CisKKwkJCQl9LAorCisJCQkJc2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxv
Y2sgKSB7CisKKwkJCQkJbG9ja2VkID0gbG9jazsKKworCQkJCX0sCisKKwkJCQlzZXRDbGVhcjog
ZnVuY3Rpb24gKCByLCBnLCBiLCBhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7CisKKwkJCQkJaWYg
KCBwcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSB7CisKKwkJCQkJCXIgKj0gYTsgZyAqPSBh
OyBiICo9IGE7CisKKwkJCQkJfQorCisJCQkJCWNvbG9yLnNldCggciwgZywgYiwgYSApOworCisJ
CQkJCWlmICggY3VycmVudENvbG9yQ2xlYXIuZXF1YWxzKCBjb2xvciApID09PSBmYWxzZSApIHsK
KworCQkJCQkJZ2wuY2xlYXJDb2xvciggciwgZywgYiwgYSApOworCQkJCQkJY3VycmVudENvbG9y
Q2xlYXIuY29weSggY29sb3IgKTsKKworCQkJCQl9CisKKwkJCQl9LAorCisJCQkJcmVzZXQ6IGZ1
bmN0aW9uICgpIHsKKworCQkJCQlsb2NrZWQgPSBmYWxzZTsKKworCQkJCQljdXJyZW50Q29sb3JN
YXNrID0gbnVsbDsKKwkJCQkJY3VycmVudENvbG9yQ2xlYXIuc2V0KCAwLCAwLCAwLCAxICk7CisK
KwkJCQl9CisKKwkJCX07CisKKwkJfQorCisJCWZ1bmN0aW9uIERlcHRoQnVmZmVyKCkgeworCisJ
CQl2YXIgbG9ja2VkID0gZmFsc2U7CisKKwkJCXZhciBjdXJyZW50RGVwdGhNYXNrID0gbnVsbDsK
KwkJCXZhciBjdXJyZW50RGVwdGhGdW5jID0gbnVsbDsKKwkJCXZhciBjdXJyZW50RGVwdGhDbGVh
ciA9IG51bGw7CisKKwkJCXJldHVybiB7CisKKwkJCQlzZXRUZXN0OiBmdW5jdGlvbiAoIGRlcHRo
VGVzdCApIHsKKworCQkJCQlpZiAoIGRlcHRoVGVzdCApIHsKKworCQkJCQkJZW5hYmxlKCBnbC5E
RVBUSF9URVNUICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJZGlzYWJsZSggZ2wuREVQVEhf
VEVTVCApOworCisJCQkJCX0KKworCQkJCX0sCisKKwkJCQlzZXRNYXNrOiBmdW5jdGlvbiAoIGRl
cHRoTWFzayApIHsKKworCQkJCQlpZiAoIGN1cnJlbnREZXB0aE1hc2sgIT09IGRlcHRoTWFzayAm
JiAhIGxvY2tlZCApIHsKKworCQkJCQkJZ2wuZGVwdGhNYXNrKCBkZXB0aE1hc2sgKTsKKwkJCQkJ
CWN1cnJlbnREZXB0aE1hc2sgPSBkZXB0aE1hc2s7CisKKwkJCQkJfQorCisJCQkJfSwKKworCQkJ
CXNldEZ1bmM6IGZ1bmN0aW9uICggZGVwdGhGdW5jICkgeworCisJCQkJCWlmICggY3VycmVudERl
cHRoRnVuYyAhPT0gZGVwdGhGdW5jICkgeworCisJCQkJCQlpZiAoIGRlcHRoRnVuYyApIHsKKwor
CQkJCQkJCXN3aXRjaCAoIGRlcHRoRnVuYyApIHsKKworCQkJCQkJCQljYXNlIE5ldmVyRGVwdGg6
CisKKwkJCQkJCQkJCWdsLmRlcHRoRnVuYyggZ2wuTkVWRVIgKTsKKwkJCQkJCQkJCWJyZWFrOwor
CisJCQkJCQkJCWNhc2UgQWx3YXlzRGVwdGg6CisKKwkJCQkJCQkJCWdsLmRlcHRoRnVuYyggZ2wu
QUxXQVlTICk7CisJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQljYXNlIExlc3NEZXB0aDoKKwor
CQkJCQkJCQkJZ2wuZGVwdGhGdW5jKCBnbC5MRVNTICk7CisJCQkJCQkJCQlicmVhazsKKworCQkJ
CQkJCQljYXNlIExlc3NFcXVhbERlcHRoOgorCisJCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIGdsLkxF
UVVBTCApOworCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJY2FzZSBFcXVhbERlcHRoOgorCisJ
CQkJCQkJCQlnbC5kZXB0aEZ1bmMoIGdsLkVRVUFMICk7CisJCQkJCQkJCQlicmVhazsKKworCQkJ
CQkJCQljYXNlIEdyZWF0ZXJFcXVhbERlcHRoOgorCisJCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIGds
LkdFUVVBTCApOworCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJY2FzZSBHcmVhdGVyRGVwdGg6
CisKKwkJCQkJCQkJCWdsLmRlcHRoRnVuYyggZ2wuR1JFQVRFUiApOworCQkJCQkJCQkJYnJlYWs7
CisKKwkJCQkJCQkJY2FzZSBOb3RFcXVhbERlcHRoOgorCisJCQkJCQkJCQlnbC5kZXB0aEZ1bmMo
IGdsLk5PVEVRVUFMICk7CisJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQlkZWZhdWx0OgorCisJ
CQkJCQkJCQlnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApOworCisJCQkJCQkJfQorCisJCQkJCQl9
IGVsc2UgeworCisJCQkJCQkJZ2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTsKKworCQkJCQkJfQor
CisJCQkJCQljdXJyZW50RGVwdGhGdW5jID0gZGVwdGhGdW5jOworCisJCQkJCX0KKworCQkJCX0s
CisKKwkJCQlzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHsKKworCQkJCQlsb2NrZWQgPSBs
b2NrOworCisJCQkJfSwKKworCQkJCXNldENsZWFyOiBmdW5jdGlvbiAoIGRlcHRoICkgeworCisJ
CQkJCWlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkgeworCisJCQkJCQlnbC5jbGVh
ckRlcHRoKCBkZXB0aCApOworCQkJCQkJY3VycmVudERlcHRoQ2xlYXIgPSBkZXB0aDsKKworCQkJ
CQl9CisKKwkJCQl9LAorCisJCQkJcmVzZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCQlsb2NrZWQg
PSBmYWxzZTsKKworCQkJCQljdXJyZW50RGVwdGhNYXNrID0gbnVsbDsKKwkJCQkJY3VycmVudERl
cHRoRnVuYyA9IG51bGw7CisJCQkJCWN1cnJlbnREZXB0aENsZWFyID0gbnVsbDsKKworCQkJCX0K
KworCQkJfTsKKworCQl9CisKKwkJZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHsKKworCQkJdmFy
IGxvY2tlZCA9IGZhbHNlOworCisJCQl2YXIgY3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDsKKwkJ
CXZhciBjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsOworCQkJdmFyIGN1cnJlbnRTdGVuY2lsUmVm
ID0gbnVsbDsKKwkJCXZhciBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDsKKwkJCXZhciBj
dXJyZW50U3RlbmNpbEZhaWwgPSBudWxsOworCQkJdmFyIGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBu
dWxsOworCQkJdmFyIGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsOworCQkJdmFyIGN1cnJlbnRT
dGVuY2lsQ2xlYXIgPSBudWxsOworCisJCQlyZXR1cm4geworCisJCQkJc2V0VGVzdDogZnVuY3Rp
b24gKCBzdGVuY2lsVGVzdCApIHsKKworCQkJCQlpZiAoIHN0ZW5jaWxUZXN0ICkgeworCisJCQkJ
CQllbmFibGUoIGdsLlNURU5DSUxfVEVTVCApOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWRp
c2FibGUoIGdsLlNURU5DSUxfVEVTVCApOworCisJCQkJCX0KKworCQkJCX0sCisKKwkJCQlzZXRN
YXNrOiBmdW5jdGlvbiAoIHN0ZW5jaWxNYXNrICkgeworCisJCQkJCWlmICggY3VycmVudFN0ZW5j
aWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHsKKworCQkJCQkJZ2wuc3RlbmNp
bE1hc2soIHN0ZW5jaWxNYXNrICk7CisJCQkJCQljdXJyZW50U3RlbmNpbE1hc2sgPSBzdGVuY2ls
TWFzazsKKworCQkJCQl9CisKKwkJCQl9LAorCisJCQkJc2V0RnVuYzogZnVuY3Rpb24gKCBzdGVu
Y2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKSB7CisKKwkJCQkJaWYgKCBjdXJyZW50
U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8CisJCQkJCSAgICAgY3VycmVudFN0ZW5jaWxS
ZWYgCSE9PSBzdGVuY2lsUmVmIAl8fAorCQkJCQkgICAgIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sg
IT09IHN0ZW5jaWxNYXNrICkgeworCisJCQkJCQlnbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMs
IHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICk7CisKKwkJCQkJCWN1cnJlbnRTdGVuY2lsRnVuYyA9
IHN0ZW5jaWxGdW5jOworCQkJCQkJY3VycmVudFN0ZW5jaWxSZWYgPSBzdGVuY2lsUmVmOworCQkJ
CQkJY3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IHN0ZW5jaWxNYXNrOworCisJCQkJCX0KKworCQkJ
CX0sCisKKwkJCQlzZXRPcDogZnVuY3Rpb24gKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBz
dGVuY2lsWlBhc3MgKSB7CisKKwkJCQkJaWYgKCBjdXJyZW50U3RlbmNpbEZhaWwJICE9PSBzdGVu
Y2lsRmFpbCAJfHwKKwkJCQkJICAgICBjdXJyZW50U3RlbmNpbFpGYWlsICE9PSBzdGVuY2lsWkZh
aWwgfHwKKwkJCQkJICAgICBjdXJyZW50U3RlbmNpbFpQYXNzICE9PSBzdGVuY2lsWlBhc3MgKSB7
CisKKwkJCQkJCWdsLnN0ZW5jaWxPcCggc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFpbCwgc3RlbmNp
bFpQYXNzICk7CisKKwkJCQkJCWN1cnJlbnRTdGVuY2lsRmFpbCA9IHN0ZW5jaWxGYWlsOworCQkJ
CQkJY3VycmVudFN0ZW5jaWxaRmFpbCA9IHN0ZW5jaWxaRmFpbDsKKwkJCQkJCWN1cnJlbnRTdGVu
Y2lsWlBhc3MgPSBzdGVuY2lsWlBhc3M7CisKKwkJCQkJfQorCisJCQkJfSwKKworCQkJCXNldExv
Y2tlZDogZnVuY3Rpb24gKCBsb2NrICkgeworCisJCQkJCWxvY2tlZCA9IGxvY2s7CisKKwkJCQl9
LAorCisJCQkJc2V0Q2xlYXI6IGZ1bmN0aW9uICggc3RlbmNpbCApIHsKKworCQkJCQlpZiAoIGN1
cnJlbnRTdGVuY2lsQ2xlYXIgIT09IHN0ZW5jaWwgKSB7CisKKwkJCQkJCWdsLmNsZWFyU3RlbmNp
bCggc3RlbmNpbCApOworCQkJCQkJY3VycmVudFN0ZW5jaWxDbGVhciA9IHN0ZW5jaWw7CisKKwkJ
CQkJfQorCisJCQkJfSwKKworCQkJCXJlc2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQkJbG9ja2Vk
ID0gZmFsc2U7CisKKwkJCQkJY3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDsKKwkJCQkJY3VycmVu
dFN0ZW5jaWxGdW5jID0gbnVsbDsKKwkJCQkJY3VycmVudFN0ZW5jaWxSZWYgPSBudWxsOworCQkJ
CQljdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDsKKwkJCQkJY3VycmVudFN0ZW5jaWxGYWls
ID0gbnVsbDsKKwkJCQkJY3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7CisJCQkJCWN1cnJlbnRT
dGVuY2lsWlBhc3MgPSBudWxsOworCQkJCQljdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDsKKwor
CQkJCX0KKworCQkJfTsKKworCQl9CisKKwkJLy8KKworCQl2YXIgY29sb3JCdWZmZXIgPSBuZXcg
Q29sb3JCdWZmZXIoKTsKKwkJdmFyIGRlcHRoQnVmZmVyID0gbmV3IERlcHRoQnVmZmVyKCk7CisJ
CXZhciBzdGVuY2lsQnVmZmVyID0gbmV3IFN0ZW5jaWxCdWZmZXIoKTsKKworCQl2YXIgbWF4VmVy
dGV4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7
CisJCXZhciBuZXdBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0
ZXMgKTsKKwkJdmFyIGVuYWJsZWRBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRl
eEF0dHJpYnV0ZXMgKTsKKwkJdmFyIGF0dHJpYnV0ZURpdmlzb3JzID0gbmV3IFVpbnQ4QXJyYXko
IG1heFZlcnRleEF0dHJpYnV0ZXMgKTsKKworCQl2YXIgY2FwYWJpbGl0aWVzID0ge307CisKKwkJ
dmFyIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7CisKKwkJdmFyIGN1cnJlbnRCbGVu
ZGluZyA9IG51bGw7CisJCXZhciBjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7CisJCXZhciBj
dXJyZW50QmxlbmRTcmMgPSBudWxsOworCQl2YXIgY3VycmVudEJsZW5kRHN0ID0gbnVsbDsKKwkJ
dmFyIGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsOworCQl2YXIgY3VycmVudEJsZW5k
U3JjQWxwaGEgPSBudWxsOworCQl2YXIgY3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsOworCQl2
YXIgY3VycmVudFByZW11bHRpcGxlZEFscGhhID0gZmFsc2U7CisKKwkJdmFyIGN1cnJlbnRGbGlw
U2lkZWQgPSBudWxsOworCQl2YXIgY3VycmVudEN1bGxGYWNlID0gbnVsbDsKKworCQl2YXIgY3Vy
cmVudExpbmVXaWR0aCA9IG51bGw7CisKKwkJdmFyIGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9y
ID0gbnVsbDsKKwkJdmFyIGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSBudWxsOworCisJCXZh
ciBjdXJyZW50U2Npc3NvclRlc3QgPSBudWxsOworCisJCXZhciBtYXhUZXh0dXJlcyA9IGdsLmdl
dFBhcmFtZXRlciggZ2wuTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTsKKworCQl2
YXIgdmVyc2lvbiA9IHBhcnNlRmxvYXQoIC9eV2ViR0xcIChbMC05XSkvLmV4ZWMoIGdsLmdldFBh
cmFtZXRlciggZ2wuVkVSU0lPTiApIClbIDEgXSApOworCQl2YXIgbGluZVdpZHRoQXZhaWxhYmxl
ID0gcGFyc2VGbG9hdCggdmVyc2lvbiApID49IDEuMDsKKworCQl2YXIgY3VycmVudFRleHR1cmVT
bG90ID0gbnVsbDsKKwkJdmFyIGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307CisKKwkJdmFyIGN1
cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKTsKKwkJdmFyIGN1cnJlbnRWaWV3cG9ydCA9IG5l
dyBWZWN0b3I0KCk7CisKKwkJZnVuY3Rpb24gY3JlYXRlVGV4dHVyZSggdHlwZSwgdGFyZ2V0LCBj
b3VudCApIHsKKworCQkJdmFyIGRhdGEgPSBuZXcgVWludDhBcnJheSggNCApOyAvLyA0IGlzIHJl
cXVpcmVkIHRvIG1hdGNoIGRlZmF1bHQgdW5wYWNrIGFsaWdubWVudCBvZiA0LgorCQkJdmFyIHRl
eHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CisKKwkJCWdsLmJpbmRUZXh0dXJlKCB0eXBlLCB0
ZXh0dXJlICk7CisJCQlnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCBnbC5URVhUVVJFX01JTl9GSUxU
RVIsIGdsLk5FQVJFU1QgKTsKKwkJCWdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVf
TUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApOworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb3Vu
dDsgaSArKyApIHsKKworCQkJCWdsLnRleEltYWdlMkQoIHRhcmdldCArIGksIDAsIGdsLlJHQkEs
IDEsIDEsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGRhdGEgKTsKKworCQkJfQorCisJ
CQlyZXR1cm4gdGV4dHVyZTsKKworCQl9CisKKwkJdmFyIGVtcHR5VGV4dHVyZXMgPSB7fTsKKwkJ
ZW1wdHlUZXh0dXJlc1sgZ2wuVEVYVFVSRV8yRCBdID0gY3JlYXRlVGV4dHVyZSggZ2wuVEVYVFVS
RV8yRCwgZ2wuVEVYVFVSRV8yRCwgMSApOworCQllbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFX0NV
QkVfTUFQIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFX0NVQkVfTUFQLCBnbC5URVhUVVJF
X0NVQkVfTUFQX1BPU0lUSVZFX1gsIDYgKTsKKworCQkvLworCisJCWZ1bmN0aW9uIGluaXQoKSB7
CisKKwkJCWNvbG9yQnVmZmVyLnNldENsZWFyKCAwLCAwLCAwLCAxICk7CisJCQlkZXB0aEJ1ZmZl
ci5zZXRDbGVhciggMSApOworCQkJc3RlbmNpbEJ1ZmZlci5zZXRDbGVhciggMCApOworCisJCQll
bmFibGUoIGdsLkRFUFRIX1RFU1QgKTsKKwkJCWRlcHRoQnVmZmVyLnNldEZ1bmMoIExlc3NFcXVh
bERlcHRoICk7CisKKwkJCXNldEZsaXBTaWRlZCggZmFsc2UgKTsKKwkJCXNldEN1bGxGYWNlKCBD
dWxsRmFjZUJhY2sgKTsKKwkJCWVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7CisKKwkJCWVuYWJsZSgg
Z2wuQkxFTkQgKTsKKwkJCXNldEJsZW5kaW5nKCBOb3JtYWxCbGVuZGluZyApOworCisJCX0KKwor
CQlmdW5jdGlvbiBpbml0QXR0cmlidXRlcygpIHsKKworCQkJZm9yICggdmFyIGkgPSAwLCBsID0g
bmV3QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJbmV3QXR0cmlidXRl
c1sgaSBdID0gMDsKKworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGUo
IGF0dHJpYnV0ZSApIHsKKworCQkJbmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxOworCisJ
CQlpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9PT0gMCApIHsKKworCQkJCWds
LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTsKKwkJCQllbmFibGVkQXR0cmli
dXRlc1sgYXR0cmlidXRlIF0gPSAxOworCisJCQl9CisKKwkJCWlmICggYXR0cmlidXRlRGl2aXNv
cnNbIGF0dHJpYnV0ZSBdICE9PSAwICkgeworCisJCQkJdmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lv
bnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTsKKworCQkJCWV4dGVuc2lvbi52ZXJ0
ZXhBdHRyaWJEaXZpc29yQU5HTEUoIGF0dHJpYnV0ZSwgMCApOworCQkJCWF0dHJpYnV0ZURpdmlz
b3JzWyBhdHRyaWJ1dGUgXSA9IDA7CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gZW5hYmxl
QXR0cmlidXRlQW5kRGl2aXNvciggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICkgeworCisJ
CQluZXdBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7CisKKwkJCWlmICggZW5hYmxlZEF0dHJp
YnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkgeworCisJCQkJZ2wuZW5hYmxlVmVydGV4QXR0cmli
QXJyYXkoIGF0dHJpYnV0ZSApOworCQkJCWVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9
IDE7CisKKwkJCX0KKworCQkJaWYgKCBhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09
IG1lc2hQZXJBdHRyaWJ1dGUgKSB7CisKKwkJCQl2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5n
ZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApOworCisJCQkJZXh0ZW5zaW9uLnZlcnRleEF0
dHJpYkRpdmlzb3JBTkdMRSggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7CisJCQkJYXR0
cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdID0gbWVzaFBlckF0dHJpYnV0ZTsKKworCQkJfQor
CisJCX0KKworCQlmdW5jdGlvbiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpIHsKKworCQkJZm9y
ICggdmFyIGkgPSAwLCBsID0gZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICE9PSBsOyArKyBp
ICkgeworCisJCQkJaWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdICE9PSBuZXdBdHRyaWJ1dGVz
WyBpIF0gKSB7CisKKwkJCQkJZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7CisJCQkJ
CWVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwOworCisJCQkJfQorCisJCQl9CisKKwkJfQorCisJ
CWZ1bmN0aW9uIGVuYWJsZSggaWQgKSB7CisKKwkJCWlmICggY2FwYWJpbGl0aWVzWyBpZCBdICE9
PSB0cnVlICkgeworCisJCQkJZ2wuZW5hYmxlKCBpZCApOworCQkJCWNhcGFiaWxpdGllc1sgaWQg
XSA9IHRydWU7CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gZGlzYWJsZSggaWQgKSB7CisK
KwkJCWlmICggY2FwYWJpbGl0aWVzWyBpZCBdICE9PSBmYWxzZSApIHsKKworCQkJCWdsLmRpc2Fi
bGUoIGlkICk7CisJCQkJY2FwYWJpbGl0aWVzWyBpZCBdID0gZmFsc2U7CisKKwkJCX0KKworCQl9
CisKKwkJZnVuY3Rpb24gZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkgeworCisJCQlpZiAo
IGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9PT0gbnVsbCApIHsKKworCQkJCWNvbXByZXNzZWRU
ZXh0dXJlRm9ybWF0cyA9IFtdOworCisJCQkJaWYgKCBleHRlbnNpb25zLmdldCggJ1dFQkdMX2Nv
bXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fAorCQkJCSAgICAgZXh0ZW5zaW9ucy5nZXQoICdX
RUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fAorCQkJCSAgICAgZXh0ZW5zaW9ucy5n
ZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKSApIHsKKworCQkJCQl2YXIgZm9y
bWF0cyA9IGdsLmdldFBhcmFtZXRlciggZ2wuQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgKTsK
KworCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBmb3JtYXRzLmxlbmd0aDsgaSArKyApIHsKKwor
CQkJCQkJY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLnB1c2goIGZvcm1hdHNbIGkgXSApOworCisJ
CQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gY29tcHJlc3NlZFRleHR1cmVGb3Jt
YXRzOworCisJCX0KKworCQlmdW5jdGlvbiBzZXRCbGVuZGluZyggYmxlbmRpbmcsIGJsZW5kRXF1
YXRpb24sIGJsZW5kU3JjLCBibGVuZERzdCwgYmxlbmRFcXVhdGlvbkFscGhhLCBibGVuZFNyY0Fs
cGhhLCBibGVuZERzdEFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7CisKKwkJCWlmICggYmxl
bmRpbmcgIT09IE5vQmxlbmRpbmcgKSB7CisKKwkJCQllbmFibGUoIGdsLkJMRU5EICk7CisKKwkJ
CX0gZWxzZSB7CisKKwkJCQlkaXNhYmxlKCBnbC5CTEVORCApOworCisJCQl9CisKKwkJCWlmICgg
KCBibGVuZGluZyAhPT0gQ3VzdG9tQmxlbmRpbmcgKSAmJiAoIGJsZW5kaW5nICE9PSBjdXJyZW50
QmxlbmRpbmcgfHwgcHJlbXVsdGlwbGllZEFscGhhICE9PSBjdXJyZW50UHJlbXVsdGlwbGVkQWxw
aGEgKSApIHsKKworCQkJCWlmICggYmxlbmRpbmcgPT09IEFkZGl0aXZlQmxlbmRpbmcgKSB7CisK
KwkJCQkJaWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7CisKKwkJCQkJCWdsLmJsZW5kRXF1YXRp
b25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7CisJCQkJCQlnbC5ibGVuZEZ1
bmNTZXBhcmF0ZSggZ2wuT05FLCBnbC5PTkUsIGdsLk9ORSwgZ2wuT05FICk7CisKKwkJCQkJfSBl
bHNlIHsKKworCQkJCQkJZ2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTsKKwkJCQkJCWds
LmJsZW5kRnVuYyggZ2wuU1JDX0FMUEhBLCBnbC5PTkUgKTsKKworCQkJCQl9CisKKwkJCQl9IGVs
c2UgaWYgKCBibGVuZGluZyA9PT0gU3VidHJhY3RpdmVCbGVuZGluZyApIHsKKworCQkJCQlpZiAo
IHByZW11bHRpcGxpZWRBbHBoYSApIHsKKworCQkJCQkJZ2wuYmxlbmRFcXVhdGlvblNlcGFyYXRl
KCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTsKKwkJCQkJCWdsLmJsZW5kRnVuY1NlcGFyYXRl
KCBnbC5aRVJPLCBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SLCBnbC5PTkVfTUlOVVNf
U1JDX0FMUEhBICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJZ2wuYmxlbmRFcXVhdGlvbigg
Z2wuRlVOQ19BREQgKTsKKwkJCQkJCWdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuT05FX01JTlVT
X1NSQ19DT0xPUiApOworCisJCQkJCX0KKworCQkJCX0gZWxzZSBpZiAoIGJsZW5kaW5nID09PSBN
dWx0aXBseUJsZW5kaW5nICkgeworCisJCQkJCWlmICggcHJlbXVsdGlwbGllZEFscGhhICkgewor
CisJCQkJCQlnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FE
RCApOworCQkJCQkJZ2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLlNSQ19DT0xPUiwg
Z2wuWkVSTywgZ2wuU1JDX0FMUEhBICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJZ2wuYmxl
bmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTsKKwkJCQkJCWdsLmJsZW5kRnVuYyggZ2wuWkVSTywg
Z2wuU1JDX0NPTE9SICk7CisKKwkJCQkJfQorCisJCQkJfSBlbHNlIHsKKworCQkJCQlpZiAoIHBy
ZW11bHRpcGxpZWRBbHBoYSApIHsKKworCQkJCQkJZ2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBn
bC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTsKKwkJCQkJCWdsLmJsZW5kRnVuY1NlcGFyYXRlKCBn
bC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19B
TFBIQSApOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWdsLmJsZW5kRXF1YXRpb25TZXBhcmF0
ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7CisJCQkJCQlnbC5ibGVuZEZ1bmNTZXBhcmF0
ZSggZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9N
SU5VU19TUkNfQUxQSEEgKTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQljdXJyZW50QmxlbmRp
bmcgPSBibGVuZGluZzsKKwkJCQljdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBwcmVtdWx0aXBs
aWVkQWxwaGE7CisKKwkJCX0KKworCQkJaWYgKCBibGVuZGluZyA9PT0gQ3VzdG9tQmxlbmRpbmcg
KSB7CisKKwkJCQlibGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGEgfHwgYmxl
bmRFcXVhdGlvbjsKKwkJCQlibGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYSB8fCBibGVuZFNy
YzsKKwkJCQlibGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYSB8fCBibGVuZERzdDsKKworCQkJ
CWlmICggYmxlbmRFcXVhdGlvbiAhPT0gY3VycmVudEJsZW5kRXF1YXRpb24gfHwgYmxlbmRFcXVh
dGlvbkFscGhhICE9PSBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhICkgeworCisJCQkJCWdsLmJs
ZW5kRXF1YXRpb25TZXBhcmF0ZSggcGFyYW1UaHJlZVRvR0woIGJsZW5kRXF1YXRpb24gKSwgcGFy
YW1UaHJlZVRvR0woIGJsZW5kRXF1YXRpb25BbHBoYSApICk7CisKKwkJCQkJY3VycmVudEJsZW5k
RXF1YXRpb24gPSBibGVuZEVxdWF0aW9uOworCQkJCQljdXJyZW50QmxlbmRFcXVhdGlvbkFscGhh
ID0gYmxlbmRFcXVhdGlvbkFscGhhOworCisJCQkJfQorCisJCQkJaWYgKCBibGVuZFNyYyAhPT0g
Y3VycmVudEJsZW5kU3JjIHx8IGJsZW5kRHN0ICE9PSBjdXJyZW50QmxlbmREc3QgfHwgYmxlbmRT
cmNBbHBoYSAhPT0gY3VycmVudEJsZW5kU3JjQWxwaGEgfHwgYmxlbmREc3RBbHBoYSAhPT0gY3Vy
cmVudEJsZW5kRHN0QWxwaGEgKSB7CisKKwkJCQkJZ2wuYmxlbmRGdW5jU2VwYXJhdGUoIHBhcmFt
VGhyZWVUb0dMKCBibGVuZFNyYyApLCBwYXJhbVRocmVlVG9HTCggYmxlbmREc3QgKSwgcGFyYW1U
aHJlZVRvR0woIGJsZW5kU3JjQWxwaGEgKSwgcGFyYW1UaHJlZVRvR0woIGJsZW5kRHN0QWxwaGEg
KSApOworCisJCQkJCWN1cnJlbnRCbGVuZFNyYyA9IGJsZW5kU3JjOworCQkJCQljdXJyZW50Qmxl
bmREc3QgPSBibGVuZERzdDsKKwkJCQkJY3VycmVudEJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0Fs
cGhhOworCQkJCQljdXJyZW50QmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGE7CisKKwkJCQl9
CisKKwkJCX0gZWxzZSB7CisKKwkJCQljdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7CisJCQkJ
Y3VycmVudEJsZW5kU3JjID0gbnVsbDsKKwkJCQljdXJyZW50QmxlbmREc3QgPSBudWxsOworCQkJ
CWN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsOworCQkJCWN1cnJlbnRCbGVuZFNyY0Fs
cGhhID0gbnVsbDsKKwkJCQljdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7CisKKwkJCX0KKwor
CQl9CisKKwkJZnVuY3Rpb24gc2V0TWF0ZXJpYWwoIG1hdGVyaWFsICkgeworCisJCQltYXRlcmlh
bC5zaWRlID09PSBEb3VibGVTaWRlCisJCQkJPyBkaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKQorCQkJ
CTogZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTsKKworCQkJc2V0RmxpcFNpZGVkKCBtYXRlcmlhbC5z
aWRlID09PSBCYWNrU2lkZSApOworCisJCQltYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZQor
CQkJCT8gc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0
aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5k
RXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RB
bHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhICkKKwkJCQk6IHNldEJsZW5kaW5nKCBO
b0JsZW5kaW5nICk7CisKKwkJCWRlcHRoQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLmRlcHRoRnVu
YyApOworCQkJZGVwdGhCdWZmZXIuc2V0VGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7CisJCQlk
ZXB0aEJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7CisJCQljb2xvckJ1ZmZl
ci5zZXRNYXNrKCBtYXRlcmlhbC5jb2xvcldyaXRlICk7CisKKwkJCXNldFBvbHlnb25PZmZzZXQo
IG1hdGVyaWFsLnBvbHlnb25PZmZzZXQsIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3IsIG1h
dGVyaWFsLnBvbHlnb25PZmZzZXRVbml0cyApOworCisJCX0KKworCQkvLworCisJCWZ1bmN0aW9u
IHNldEZsaXBTaWRlZCggZmxpcFNpZGVkICkgeworCisJCQlpZiAoIGN1cnJlbnRGbGlwU2lkZWQg
IT09IGZsaXBTaWRlZCApIHsKKworCQkJCWlmICggZmxpcFNpZGVkICkgeworCisJCQkJCWdsLmZy
b250RmFjZSggZ2wuQ1cgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJZ2wuZnJvbnRGYWNlKCBn
bC5DQ1cgKTsKKworCQkJCX0KKworCQkJCWN1cnJlbnRGbGlwU2lkZWQgPSBmbGlwU2lkZWQ7CisK
KwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gc2V0Q3VsbEZhY2UoIGN1bGxGYWNlICkgeworCisJ
CQlpZiAoIGN1bGxGYWNlICE9PSBDdWxsRmFjZU5vbmUgKSB7CisKKwkJCQllbmFibGUoIGdsLkNV
TExfRkFDRSApOworCisJCQkJaWYgKCBjdWxsRmFjZSAhPT0gY3VycmVudEN1bGxGYWNlICkgewor
CisJCQkJCWlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlQmFjayApIHsKKworCQkJCQkJZ2wuY3Vs
bEZhY2UoIGdsLkJBQ0sgKTsKKworCQkJCQl9IGVsc2UgaWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZh
Y2VGcm9udCApIHsKKworCQkJCQkJZ2wuY3VsbEZhY2UoIGdsLkZST05UICk7CisKKwkJCQkJfSBl
bHNlIHsKKworCQkJCQkJZ2wuY3VsbEZhY2UoIGdsLkZST05UX0FORF9CQUNLICk7CisKKwkJCQkJ
fQorCisJCQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7
CisKKwkJCX0KKworCQkJY3VycmVudEN1bGxGYWNlID0gY3VsbEZhY2U7CisKKwkJfQorCisJCWZ1
bmN0aW9uIHNldExpbmVXaWR0aCggd2lkdGggKSB7CisKKwkJCWlmICggd2lkdGggIT09IGN1cnJl
bnRMaW5lV2lkdGggKSB7CisKKwkJCQlpZiAoIGxpbmVXaWR0aEF2YWlsYWJsZSApIGdsLmxpbmVX
aWR0aCggd2lkdGggKTsKKworCQkJCWN1cnJlbnRMaW5lV2lkdGggPSB3aWR0aDsKKworCQkJfQor
CisJCX0KKworCQlmdW5jdGlvbiBzZXRQb2x5Z29uT2Zmc2V0KCBwb2x5Z29uT2Zmc2V0LCBmYWN0
b3IsIHVuaXRzICkgeworCisJCQlpZiAoIHBvbHlnb25PZmZzZXQgKSB7CisKKwkJCQllbmFibGUo
IGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTsKKworCQkJCWlmICggY3VycmVudFBvbHlnb25PZmZz
ZXRGYWN0b3IgIT09IGZhY3RvciB8fCBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzICE9PSB1bml0
cyApIHsKKworCQkJCQlnbC5wb2x5Z29uT2Zmc2V0KCBmYWN0b3IsIHVuaXRzICk7CisKKwkJCQkJ
Y3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBmYWN0b3I7CisJCQkJCWN1cnJlbnRQb2x5Z29u
T2Zmc2V0VW5pdHMgPSB1bml0czsKKworCQkJCX0KKworCQkJfSBlbHNlIHsKKworCQkJCWRpc2Fi
bGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTsKKworCQkJfQorCisJCX0KKworCQlmdW5jdGlv
biBnZXRTY2lzc29yVGVzdCgpIHsKKworCQkJcmV0dXJuIGN1cnJlbnRTY2lzc29yVGVzdDsKKwor
CQl9CisKKwkJZnVuY3Rpb24gc2V0U2Npc3NvclRlc3QoIHNjaXNzb3JUZXN0ICkgeworCisJCQlj
dXJyZW50U2Npc3NvclRlc3QgPSBzY2lzc29yVGVzdDsKKworCQkJaWYgKCBzY2lzc29yVGVzdCAp
IHsKKworCQkJCWVuYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7CisKKwkJCX0gZWxzZSB7CisKKwkJ
CQlkaXNhYmxlKCBnbC5TQ0lTU09SX1RFU1QgKTsKKworCQkJfQorCisJCX0KKworCQkvLyB0ZXh0
dXJlCisKKwkJZnVuY3Rpb24gYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICkgeworCisJCQlpZiAo
IHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkgd2ViZ2xTbG90ID0gZ2wuVEVYVFVSRTAgKyBtYXhU
ZXh0dXJlcyAtIDE7CisKKwkJCWlmICggY3VycmVudFRleHR1cmVTbG90ICE9PSB3ZWJnbFNsb3Qg
KSB7CisKKwkJCQlnbC5hY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKTsKKwkJCQljdXJyZW50VGV4
dHVyZVNsb3QgPSB3ZWJnbFNsb3Q7CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gYmluZFRl
eHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlICkgeworCisJCQlpZiAoIGN1cnJlbnRUZXh0
dXJlU2xvdCA9PT0gbnVsbCApIHsKKworCQkJCWFjdGl2ZVRleHR1cmUoKTsKKworCQkJfQorCisJ
CQl2YXIgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJl
U2xvdCBdOworCisJCQlpZiAoIGJvdW5kVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJ
Ym91bmRUZXh0dXJlID0geyB0eXBlOiB1bmRlZmluZWQsIHRleHR1cmU6IHVuZGVmaW5lZCB9Owor
CQkJCWN1cnJlbnRCb3VuZFRleHR1cmVzWyBjdXJyZW50VGV4dHVyZVNsb3QgXSA9IGJvdW5kVGV4
dHVyZTsKKworCQkJfQorCisJCQlpZiAoIGJvdW5kVGV4dHVyZS50eXBlICE9PSB3ZWJnbFR5cGUg
fHwgYm91bmRUZXh0dXJlLnRleHR1cmUgIT09IHdlYmdsVGV4dHVyZSApIHsKKworCQkJCWdsLmJp
bmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSB8fCBlbXB0eVRleHR1cmVzWyB3ZWJn
bFR5cGUgXSApOworCisJCQkJYm91bmRUZXh0dXJlLnR5cGUgPSB3ZWJnbFR5cGU7CisJCQkJYm91
bmRUZXh0dXJlLnRleHR1cmUgPSB3ZWJnbFRleHR1cmU7CisKKwkJCX0KKworCQl9CisKKwkJZnVu
Y3Rpb24gY29tcHJlc3NlZFRleEltYWdlMkQoKSB7CisKKwkJCXRyeSB7CisKKwkJCQlnbC5jb21w
cmVzc2VkVGV4SW1hZ2UyRC5hcHBseSggZ2wsIGFyZ3VtZW50cyApOworCisJCQl9IGNhdGNoICgg
ZXJyb3IgKSB7CisKKwkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJv
ciApOworCisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIHRleEltYWdlMkQoKSB7CisKKwkJCXRy
eSB7CisKKwkJCQlnbC50ZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7CisKKwkJCX0g
Y2F0Y2ggKCBlcnJvciApIHsKKworCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRl
OicsIGVycm9yICk7CisKKwkJCX0KKworCQl9CisKKwkJLy8KKworCQlmdW5jdGlvbiBzY2lzc29y
KCBzY2lzc29yICkgeworCisJCQlpZiAoIGN1cnJlbnRTY2lzc29yLmVxdWFscyggc2Npc3NvciAp
ID09PSBmYWxzZSApIHsKKworCQkJCWdsLnNjaXNzb3IoIHNjaXNzb3IueCwgc2Npc3Nvci55LCBz
Y2lzc29yLnosIHNjaXNzb3IudyApOworCQkJCWN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3Ig
KTsKKworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiB2aWV3cG9ydCggdmlld3BvcnQgKSB7CisK
KwkJCWlmICggY3VycmVudFZpZXdwb3J0LmVxdWFscyggdmlld3BvcnQgKSA9PT0gZmFsc2UgKSB7
CisKKwkJCQlnbC52aWV3cG9ydCggdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQueiwg
dmlld3BvcnQudyApOworCQkJCWN1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApOworCisJ
CQl9CisKKwkJfQorCisJCS8vCisKKwkJZnVuY3Rpb24gcmVzZXQoKSB7CisKKwkJCWZvciAoIHZh
ciBpID0gMDsgaSA8IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSArKyApIHsKKworCQkJCWlm
ICggZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9PT0gMSApIHsKKworCQkJCQlnbC5kaXNhYmxlVmVy
dGV4QXR0cmliQXJyYXkoIGkgKTsKKwkJCQkJZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9IDA7CisK
KwkJCQl9CisKKwkJCX0KKworCQkJY2FwYWJpbGl0aWVzID0ge307CisKKwkJCWNvbXByZXNzZWRU
ZXh0dXJlRm9ybWF0cyA9IG51bGw7CisKKwkJCWN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7CisJ
CQljdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9OworCisJCQljdXJyZW50QmxlbmRpbmcgPSBudWxs
OworCisJCQljdXJyZW50RmxpcFNpZGVkID0gbnVsbDsKKwkJCWN1cnJlbnRDdWxsRmFjZSA9IG51
bGw7CisKKwkJCWNvbG9yQnVmZmVyLnJlc2V0KCk7CisJCQlkZXB0aEJ1ZmZlci5yZXNldCgpOwor
CQkJc3RlbmNpbEJ1ZmZlci5yZXNldCgpOworCisJCX0KKworCQlyZXR1cm4geworCisJCQlidWZm
ZXJzOiB7CisJCQkJY29sb3I6IGNvbG9yQnVmZmVyLAorCQkJCWRlcHRoOiBkZXB0aEJ1ZmZlciwK
KwkJCQlzdGVuY2lsOiBzdGVuY2lsQnVmZmVyCisJCQl9LAorCisJCQlpbml0OiBpbml0LAorCQkJ
aW5pdEF0dHJpYnV0ZXM6IGluaXRBdHRyaWJ1dGVzLAorCQkJZW5hYmxlQXR0cmlidXRlOiBlbmFi
bGVBdHRyaWJ1dGUsCisJCQllbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yOiBlbmFibGVBdHRyaWJ1
dGVBbmREaXZpc29yLAorCQkJZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXM6IGRpc2FibGVVbnVzZWRB
dHRyaWJ1dGVzLAorCQkJZW5hYmxlOiBlbmFibGUsCisJCQlkaXNhYmxlOiBkaXNhYmxlLAorCQkJ
Z2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzOiBnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMs
CisKKwkJCXNldEJsZW5kaW5nOiBzZXRCbGVuZGluZywKKwkJCXNldE1hdGVyaWFsOiBzZXRNYXRl
cmlhbCwKKworCQkJc2V0RmxpcFNpZGVkOiBzZXRGbGlwU2lkZWQsCisJCQlzZXRDdWxsRmFjZTog
c2V0Q3VsbEZhY2UsCisKKwkJCXNldExpbmVXaWR0aDogc2V0TGluZVdpZHRoLAorCQkJc2V0UG9s
eWdvbk9mZnNldDogc2V0UG9seWdvbk9mZnNldCwKKworCQkJZ2V0U2Npc3NvclRlc3Q6IGdldFNj
aXNzb3JUZXN0LAorCQkJc2V0U2Npc3NvclRlc3Q6IHNldFNjaXNzb3JUZXN0LAorCisJCQlhY3Rp
dmVUZXh0dXJlOiBhY3RpdmVUZXh0dXJlLAorCQkJYmluZFRleHR1cmU6IGJpbmRUZXh0dXJlLAor
CQkJY29tcHJlc3NlZFRleEltYWdlMkQ6IGNvbXByZXNzZWRUZXhJbWFnZTJELAorCQkJdGV4SW1h
Z2UyRDogdGV4SW1hZ2UyRCwKKworCQkJc2Npc3Nvcjogc2Npc3NvciwKKwkJCXZpZXdwb3J0OiB2
aWV3cG9ydCwKKworCQkJcmVzZXQ6IHJlc2V0CisKKwkJfTsKKworCX0KKworCS8qKgorCSAqIEBh
dXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBXZWJH
TENhcGFiaWxpdGllcyggZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKSB7CisKKwkJdmFyIG1h
eEFuaXNvdHJvcHk7CisKKwkJZnVuY3Rpb24gZ2V0TWF4QW5pc290cm9weSgpIHsKKworCQkJaWYg
KCBtYXhBbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gbWF4QW5pc290cm9weTsKKwor
CQkJdmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2Fu
aXNvdHJvcGljJyApOworCisJCQlpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHsKKworCQkJCW1h
eEFuaXNvdHJvcHkgPSBnbC5nZXRQYXJhbWV0ZXIoIGV4dGVuc2lvbi5NQVhfVEVYVFVSRV9NQVhf
QU5JU09UUk9QWV9FWFQgKTsKKworCQkJfSBlbHNlIHsKKworCQkJCW1heEFuaXNvdHJvcHkgPSAw
OworCisJCQl9CisKKwkJCXJldHVybiBtYXhBbmlzb3Ryb3B5OworCisJCX0KKworCQlmdW5jdGlv
biBnZXRNYXhQcmVjaXNpb24oIHByZWNpc2lvbiApIHsKKworCQkJaWYgKCBwcmVjaXNpb24gPT09
ICdoaWdocCcgKSB7CisKKwkJCQlpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wu
VkVSVEVYX1NIQURFUiwgZ2wuSElHSF9GTE9BVCApLnByZWNpc2lvbiA+IDAgJiYKKwkJCQkgICAg
IGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuRlJBR01FTlRfU0hBREVSLCBnbC5ISUdI
X0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHsKKworCQkJCQlyZXR1cm4gJ2hpZ2hwJzsKKworCQkJ
CX0KKworCQkJCXByZWNpc2lvbiA9ICdtZWRpdW1wJzsKKworCQkJfQorCisJCQlpZiAoIHByZWNp
c2lvbiA9PT0gJ21lZGl1bXAnICkgeworCisJCQkJaWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25G
b3JtYXQoIGdsLlZFUlRFWF9TSEFERVIsIGdsLk1FRElVTV9GTE9BVCApLnByZWNpc2lvbiA+IDAg
JiYKKwkJCQkgICAgIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuRlJBR01FTlRfU0hB
REVSLCBnbC5NRURJVU1fRkxPQVQgKS5wcmVjaXNpb24gPiAwICkgeworCisJCQkJCXJldHVybiAn
bWVkaXVtcCc7CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuICdsb3dwJzsKKworCQl9CisK
KwkJdmFyIHByZWNpc2lvbiA9IHBhcmFtZXRlcnMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgPyBw
YXJhbWV0ZXJzLnByZWNpc2lvbiA6ICdoaWdocCc7CisJCXZhciBtYXhQcmVjaXNpb24gPSBnZXRN
YXhQcmVjaXNpb24oIHByZWNpc2lvbiApOworCisJCWlmICggbWF4UHJlY2lzaW9uICE9PSBwcmVj
aXNpb24gKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6JywgcHJl
Y2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBtYXhQcmVjaXNpb24sICdpbnN0ZWFkLicg
KTsKKwkJCXByZWNpc2lvbiA9IG1heFByZWNpc2lvbjsKKworCQl9CisKKwkJdmFyIGxvZ2FyaXRo
bWljRGVwdGhCdWZmZXIgPSBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPT09IHRy
dWUgJiYgISEgZXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKTsKKworCQl2YXIgbWF4
VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTICk7
CisJCXZhciBtYXhWZXJ0ZXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRF
WF9URVhUVVJFX0lNQUdFX1VOSVRTICk7CisJCXZhciBtYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBh
cmFtZXRlciggZ2wuTUFYX1RFWFRVUkVfU0laRSApOworCQl2YXIgbWF4Q3ViZW1hcFNpemUgPSBn
bC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgKTsKKworCQl2YXIg
bWF4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7
CisJCXZhciBtYXhWZXJ0ZXhVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRF
WF9VTklGT1JNX1ZFQ1RPUlMgKTsKKwkJdmFyIG1heFZhcnlpbmdzID0gZ2wuZ2V0UGFyYW1ldGVy
KCBnbC5NQVhfVkFSWUlOR19WRUNUT1JTICk7CisJCXZhciBtYXhGcmFnbWVudFVuaWZvcm1zID0g
Z2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTICk7CisKKwkJ
dmFyIHZlcnRleFRleHR1cmVzID0gbWF4VmVydGV4VGV4dHVyZXMgPiAwOworCQl2YXIgZmxvYXRG
cmFnbWVudFRleHR1cmVzID0gISEgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcg
KTsKKwkJdmFyIGZsb2F0VmVydGV4VGV4dHVyZXMgPSB2ZXJ0ZXhUZXh0dXJlcyAmJiBmbG9hdEZy
YWdtZW50VGV4dHVyZXM7CisKKwkJcmV0dXJuIHsKKworCQkJZ2V0TWF4QW5pc290cm9weTogZ2V0
TWF4QW5pc290cm9weSwKKwkJCWdldE1heFByZWNpc2lvbjogZ2V0TWF4UHJlY2lzaW9uLAorCisJ
CQlwcmVjaXNpb246IHByZWNpc2lvbiwKKwkJCWxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGxvZ2Fy
aXRobWljRGVwdGhCdWZmZXIsCisKKwkJCW1heFRleHR1cmVzOiBtYXhUZXh0dXJlcywKKwkJCW1h
eFZlcnRleFRleHR1cmVzOiBtYXhWZXJ0ZXhUZXh0dXJlcywKKwkJCW1heFRleHR1cmVTaXplOiBt
YXhUZXh0dXJlU2l6ZSwKKwkJCW1heEN1YmVtYXBTaXplOiBtYXhDdWJlbWFwU2l6ZSwKKworCQkJ
bWF4QXR0cmlidXRlczogbWF4QXR0cmlidXRlcywKKwkJCW1heFZlcnRleFVuaWZvcm1zOiBtYXhW
ZXJ0ZXhVbmlmb3JtcywKKwkJCW1heFZhcnlpbmdzOiBtYXhWYXJ5aW5ncywKKwkJCW1heEZyYWdt
ZW50VW5pZm9ybXM6IG1heEZyYWdtZW50VW5pZm9ybXMsCisKKwkJCXZlcnRleFRleHR1cmVzOiB2
ZXJ0ZXhUZXh0dXJlcywKKwkJCWZsb2F0RnJhZ21lbnRUZXh0dXJlczogZmxvYXRGcmFnbWVudFRl
eHR1cmVzLAorCQkJZmxvYXRWZXJ0ZXhUZXh0dXJlczogZmxvYXRWZXJ0ZXhUZXh0dXJlcworCisJ
CX07CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29t
LworCSAqLworCisJZnVuY3Rpb24gQXJyYXlDYW1lcmEoIGFycmF5ICkgeworCisJCVBlcnNwZWN0
aXZlQ2FtZXJhLmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLmNhbWVyYXMgPSBhcnJheSB8fCBbXTsK
KworCX0KKworCUFycmF5Q2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5j
cmVhdGUoIFBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6
IEFycmF5Q2FtZXJhLAorCisJCWlzQXJyYXlDYW1lcmE6IHRydWUKKworCX0gKTsKKworCS8qKgor
CSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlv
biBXZWJWUk1hbmFnZXIoIHJlbmRlcmVyICkgeworCisJCXZhciBzY29wZSA9IHRoaXM7CisKKwkJ
dmFyIGRldmljZSA9IG51bGw7CisJCXZhciBmcmFtZURhdGEgPSBudWxsOworCisJCWlmICggJ1ZS
RnJhbWVEYXRhJyBpbiB3aW5kb3cgKSB7CisKKwkJCWZyYW1lRGF0YSA9IG5ldyB3aW5kb3cuVlJG
cmFtZURhdGEoKTsKKworCQl9CisKKwkJdmFyIG1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRy
aXg0KCk7CisKKwkJdmFyIHN0YW5kaW5nTWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKKwkJdmFyIHN0
YW5kaW5nTWF0cml4SW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7CisKKwkJdmFyIGNhbWVyYUwgPSBu
ZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTsKKwkJY2FtZXJhTC5ib3VuZHMgPSBuZXcgVmVjdG9yNCgg
MC4wLCAwLjAsIDAuNSwgMS4wICk7CisJCWNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApOworCisJ
CXZhciBjYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7CisJCWNhbWVyYVIuYm91bmRz
ID0gbmV3IFZlY3RvcjQoIDAuNSwgMC4wLCAwLjUsIDEuMCApOworCQljYW1lcmFSLmxheWVycy5l
bmFibGUoIDIgKTsKKworCQl2YXIgY2FtZXJhVlIgPSBuZXcgQXJyYXlDYW1lcmEoIFsgY2FtZXJh
TCwgY2FtZXJhUiBdICk7CisJCWNhbWVyYVZSLmxheWVycy5lbmFibGUoIDEgKTsKKwkJY2FtZXJh
VlIubGF5ZXJzLmVuYWJsZSggMiApOworCisJCS8vCisKKwkJdmFyIGN1cnJlbnRTaXplLCBjdXJy
ZW50UGl4ZWxSYXRpbzsKKworCQlmdW5jdGlvbiBvblZSRGlzcGxheVByZXNlbnRDaGFuZ2UoKSB7
CisKKwkJCWlmICggZGV2aWNlLmlzUHJlc2VudGluZyApIHsKKworCQkJCXZhciBleWVQYXJhbWV0
ZXJzID0gZGV2aWNlLmdldEV5ZVBhcmFtZXRlcnMoICdsZWZ0JyApOworCQkJCXZhciByZW5kZXJX
aWR0aCA9IGV5ZVBhcmFtZXRlcnMucmVuZGVyV2lkdGg7CisJCQkJdmFyIHJlbmRlckhlaWdodCA9
IGV5ZVBhcmFtZXRlcnMucmVuZGVySGVpZ2h0OworCisJCQkJY3VycmVudFBpeGVsUmF0aW8gPSBy
ZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7CisJCQkJY3VycmVudFNpemUgPSByZW5kZXJlci5nZXRT
aXplKCk7CisKKwkJCQlyZW5kZXJlci5zZXREcmF3aW5nQnVmZmVyU2l6ZSggcmVuZGVyV2lkdGgg
KiAyLCByZW5kZXJIZWlnaHQsIDEgKTsKKworCQkJfSBlbHNlIGlmICggc2NvcGUuZW5hYmxlZCAp
IHsKKworCQkJCXJlbmRlcmVyLnNldERyYXdpbmdCdWZmZXJTaXplKCBjdXJyZW50U2l6ZS53aWR0
aCwgY3VycmVudFNpemUuaGVpZ2h0LCBjdXJyZW50UGl4ZWxSYXRpbyApOworCisJCQl9CisKKwkJ
fQorCisJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAndnJkaXNwbGF5cHJlc2VudGNoYW5nZScs
IG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSwgZmFsc2UgKTsKKworCQkvLworCisJCXRoaXMuZW5h
YmxlZCA9IGZhbHNlOworCQl0aGlzLnN0YW5kaW5nID0gZmFsc2U7CisKKwkJdGhpcy5nZXREZXZp
Y2UgPSBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBkZXZpY2U7CisKKwkJfTsKKworCQl0aGlz
LnNldERldmljZSA9IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCWlmICggdmFsdWUgIT09IHVu
ZGVmaW5lZCApIGRldmljZSA9IHZhbHVlOworCisJCX07CisKKwkJdGhpcy5nZXRDYW1lcmEgPSBm
dW5jdGlvbiAoIGNhbWVyYSApIHsKKworCQkJaWYgKCBkZXZpY2UgPT09IG51bGwgKSByZXR1cm4g
Y2FtZXJhOworCisJCQlkZXZpY2UuZGVwdGhOZWFyID0gY2FtZXJhLm5lYXI7CisJCQlkZXZpY2Uu
ZGVwdGhGYXIgPSBjYW1lcmEuZmFyOworCisJCQlkZXZpY2UuZ2V0RnJhbWVEYXRhKCBmcmFtZURh
dGEgKTsKKworCQkJLy8KKworCQkJdmFyIHBvc2UgPSBmcmFtZURhdGEucG9zZTsKKworCQkJaWYg
KCBwb3NlLnBvc2l0aW9uICE9PSBudWxsICkgeworCisJCQkJY2FtZXJhLnBvc2l0aW9uLmZyb21B
cnJheSggcG9zZS5wb3NpdGlvbiApOworCisJCQl9IGVsc2UgeworCisJCQkJY2FtZXJhLnBvc2l0
aW9uLnNldCggMCwgMCwgMCApOworCisJCQl9CisKKwkJCWlmICggcG9zZS5vcmllbnRhdGlvbiAh
PT0gbnVsbCApIHsKKworCQkJCWNhbWVyYS5xdWF0ZXJuaW9uLmZyb21BcnJheSggcG9zZS5vcmll
bnRhdGlvbiApOworCisJCQl9CisKKwkJCWNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpOworCisJ
CQl2YXIgc3RhZ2VQYXJhbWV0ZXJzID0gZGV2aWNlLnN0YWdlUGFyYW1ldGVyczsKKworCQkJaWYg
KCB0aGlzLnN0YW5kaW5nICYmIHN0YWdlUGFyYW1ldGVycyApIHsKKworCQkJCXN0YW5kaW5nTWF0
cml4LmZyb21BcnJheSggc3RhZ2VQYXJhbWV0ZXJzLnNpdHRpbmdUb1N0YW5kaW5nVHJhbnNmb3Jt
ICk7CisJCQkJc3RhbmRpbmdNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHN0YW5kaW5nTWF0cml4
ICk7CisKKwkJCQljYW1lcmEubWF0cml4V29ybGQubXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4ICk7
CisJCQkJY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseSggc3RhbmRpbmdNYXRyaXhJ
bnZlcnNlICk7CisKKwkJCX0KKworCQkJaWYgKCBkZXZpY2UuaXNQcmVzZW50aW5nID09PSBmYWxz
ZSApIHJldHVybiBjYW1lcmE7CisKKwkJCS8vCisKKwkJCWNhbWVyYVZSLm1hdHJpeFdvcmxkLmNv
cHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApOworCQkJY2FtZXJhVlIubWF0cml4V29ybGRJbnZlcnNl
LmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTsKKworCQkJY2FtZXJhTC5tYXRyaXhX
b3JsZEludmVyc2UuZnJvbUFycmF5KCBmcmFtZURhdGEubGVmdFZpZXdNYXRyaXggKTsKKwkJCWNh
bWVyYVIubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheSggZnJhbWVEYXRhLnJpZ2h0Vmlld01h
dHJpeCApOworCisJCQlpZiAoIHRoaXMuc3RhbmRpbmcgJiYgc3RhZ2VQYXJhbWV0ZXJzICkgewor
CisJCQkJY2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4
SW52ZXJzZSApOworCQkJCWNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBzdGFu
ZGluZ01hdHJpeEludmVyc2UgKTsKKworCQkJfQorCisJCQl2YXIgcGFyZW50ID0gY2FtZXJhLnBh
cmVudDsKKworCQkJaWYgKCBwYXJlbnQgIT09IG51bGwgKSB7CisKKwkJCQltYXRyaXhXb3JsZElu
dmVyc2UuZ2V0SW52ZXJzZSggcGFyZW50Lm1hdHJpeFdvcmxkICk7CisKKwkJCQljYW1lcmFMLm1h
dHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseSggbWF0cml4V29ybGRJbnZlcnNlICk7CisJCQkJY2Ft
ZXJhUi5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIG1hdHJpeFdvcmxkSW52ZXJzZSApOwor
CisJCQl9CisKKwkJCS8vIGVudk1hcCBhbmQgTWlycm9yIG5lZWRzIGNhbWVyYS5tYXRyaXhXb3Js
ZAorCisJCQljYW1lcmFMLm1hdHJpeFdvcmxkLmdldEludmVyc2UoIGNhbWVyYUwubWF0cml4V29y
bGRJbnZlcnNlICk7CisJCQljYW1lcmFSLm1hdHJpeFdvcmxkLmdldEludmVyc2UoIGNhbWVyYVIu
bWF0cml4V29ybGRJbnZlcnNlICk7CisKKwkJCWNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5mcm9t
QXJyYXkoIGZyYW1lRGF0YS5sZWZ0UHJvamVjdGlvbk1hdHJpeCApOworCQkJY2FtZXJhUi5wcm9q
ZWN0aW9uTWF0cml4LmZyb21BcnJheSggZnJhbWVEYXRhLnJpZ2h0UHJvamVjdGlvbk1hdHJpeCAp
OworCisJCQkvLyBIQUNLIEBtcmRvb2IKKwkJCS8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2Mvd2Vi
dnIvaXNzdWVzLzIwMworCisJCQljYW1lcmFWUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVy
YUwucHJvamVjdGlvbk1hdHJpeCApOworCisJCQkvLworCisJCQl2YXIgbGF5ZXJzID0gZGV2aWNl
LmdldExheWVycygpOworCisJCQlpZiAoIGxheWVycy5sZW5ndGggKSB7CisKKwkJCQl2YXIgbGF5
ZXIgPSBsYXllcnNbIDAgXTsKKworCQkJCWlmICggbGF5ZXIubGVmdEJvdW5kcyAhPT0gbnVsbCAm
JiBsYXllci5sZWZ0Qm91bmRzLmxlbmd0aCA9PT0gNCApIHsKKworCQkJCQljYW1lcmFMLmJvdW5k
cy5mcm9tQXJyYXkoIGxheWVyLmxlZnRCb3VuZHMgKTsKKworCQkJCX0KKworCQkJCWlmICggbGF5
ZXIucmlnaHRCb3VuZHMgIT09IG51bGwgJiYgbGF5ZXIucmlnaHRCb3VuZHMubGVuZ3RoID09PSA0
ICkgeworCisJCQkJCWNhbWVyYVIuYm91bmRzLmZyb21BcnJheSggbGF5ZXIucmlnaHRCb3VuZHMg
KTsKKworCQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gY2FtZXJhVlI7CisKKwkJfTsKKworCQl0
aGlzLmdldFN0YW5kaW5nTWF0cml4ID0gZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gc3RhbmRp
bmdNYXRyaXg7CisKKwkJfTsKKworCQl0aGlzLnN1Ym1pdEZyYW1lID0gZnVuY3Rpb24gKCkgewor
CisJCQlpZiAoIGRldmljZSAmJiBkZXZpY2UuaXNQcmVzZW50aW5nICkgZGV2aWNlLnN1Ym1pdEZy
YW1lKCk7CisKKwkJfTsKKworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDov
L21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBXZWJHTEV4dGVuc2lvbnMoIGdsICkgewor
CisJCXZhciBleHRlbnNpb25zID0ge307CisKKwkJcmV0dXJuIHsKKworCQkJZ2V0OiBmdW5jdGlv
biAoIG5hbWUgKSB7CisKKwkJCQlpZiAoIGV4dGVuc2lvbnNbIG5hbWUgXSAhPT0gdW5kZWZpbmVk
ICkgeworCisJCQkJCXJldHVybiBleHRlbnNpb25zWyBuYW1lIF07CisKKwkJCQl9CisKKwkJCQl2
YXIgZXh0ZW5zaW9uOworCisJCQkJc3dpdGNoICggbmFtZSApIHsKKworCQkJCQljYXNlICdXRUJH
TF9kZXB0aF90ZXh0dXJlJzoKKwkJCQkJCWV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dF
QkdMX2RlcHRoX3RleHR1cmUnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2RlcHRo
X3RleHR1cmUnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2RlcHRoX3RleHR1
cmUnICk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5p
c290cm9waWMnOgorCQkJCQkJZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX3RleHR1
cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9FWFRfdGV4
dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX0VY
VF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNh
c2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJzoKKwkJCQkJCWV4dGVuc2lvbiA9IGds
LmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdl
dEV4dGVuc2lvbiggJ01PWl9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fCBnbC5n
ZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7CisJ
CQkJCQlicmVhazsKKworCQkJCQljYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMn
OgorCQkJCQkJZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90
ZXh0dXJlX3B2cnRjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVz
c2VkX3RleHR1cmVfcHZydGMnICk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICdXRUJHTF9j
b21wcmVzc2VkX3RleHR1cmVfZXRjMSc6CisJCQkJCQlleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNp
b24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKTsKKwkJCQkJCWJyZWFrOworCisJ
CQkJCWRlZmF1bHQ6CisJCQkJCQlleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oIG5hbWUgKTsK
KworCQkJCX0KKworCQkJCWlmICggZXh0ZW5zaW9uID09PSBudWxsICkgeworCisJCQkJCWNvbnNv
bGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBuYW1lICsgJyBleHRlbnNpb24gbm90
IHN1cHBvcnRlZC4nICk7CisKKwkJCQl9CisKKwkJCQlleHRlbnNpb25zWyBuYW1lIF0gPSBleHRl
bnNpb247CisKKwkJCQlyZXR1cm4gZXh0ZW5zaW9uOworCisJCQl9CisKKwkJfTsKKworCX0KKwor
CS8qKgorCSAqIEBhdXRob3IgdHNjaHcKKwkgKi8KKworCWZ1bmN0aW9uIFdlYkdMQ2xpcHBpbmco
KSB7CisKKwkJdmFyIHNjb3BlID0gdGhpcywKKworCQkJZ2xvYmFsU3RhdGUgPSBudWxsLAorCQkJ
bnVtR2xvYmFsUGxhbmVzID0gMCwKKwkJCWxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsCisJ
CQlyZW5kZXJpbmdTaGFkb3dzID0gZmFsc2UsCisKKwkJCXBsYW5lID0gbmV3IFBsYW5lKCksCisJ
CQl2aWV3Tm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKSwKKworCQkJdW5pZm9ybSA9IHsgdmFs
dWU6IG51bGwsIG5lZWRzVXBkYXRlOiBmYWxzZSB9OworCisJCXRoaXMudW5pZm9ybSA9IHVuaWZv
cm07CisJCXRoaXMubnVtUGxhbmVzID0gMDsKKwkJdGhpcy5udW1JbnRlcnNlY3Rpb24gPSAwOwor
CisJCXRoaXMuaW5pdCA9IGZ1bmN0aW9uKCBwbGFuZXMsIGVuYWJsZUxvY2FsQ2xpcHBpbmcsIGNh
bWVyYSApIHsKKworCQkJdmFyIGVuYWJsZWQgPQorCQkJCXBsYW5lcy5sZW5ndGggIT09IDAgfHwK
KwkJCQllbmFibGVMb2NhbENsaXBwaW5nIHx8CisJCQkJLy8gZW5hYmxlIHN0YXRlIG9mIHByZXZp
b3VzIGZyYW1lIC0gdGhlIGNsaXBwaW5nIGNvZGUgaGFzIHRvCisJCQkJLy8gcnVuIGFub3RoZXIg
ZnJhbWUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHN0YXRlOgorCQkJCW51bUdsb2JhbFBsYW5lcyAh
PT0gMCB8fAorCQkJCWxvY2FsQ2xpcHBpbmdFbmFibGVkOworCisJCQlsb2NhbENsaXBwaW5nRW5h
YmxlZCA9IGVuYWJsZUxvY2FsQ2xpcHBpbmc7CisKKwkJCWdsb2JhbFN0YXRlID0gcHJvamVjdFBs
YW5lcyggcGxhbmVzLCBjYW1lcmEsIDAgKTsKKwkJCW51bUdsb2JhbFBsYW5lcyA9IHBsYW5lcy5s
ZW5ndGg7CisKKwkJCXJldHVybiBlbmFibGVkOworCisJCX07CisKKwkJdGhpcy5iZWdpblNoYWRv
d3MgPSBmdW5jdGlvbigpIHsKKworCQkJcmVuZGVyaW5nU2hhZG93cyA9IHRydWU7CisJCQlwcm9q
ZWN0UGxhbmVzKCBudWxsICk7CisKKwkJfTsKKworCQl0aGlzLmVuZFNoYWRvd3MgPSBmdW5jdGlv
bigpIHsKKworCQkJcmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlOworCQkJcmVzZXRHbG9iYWxTdGF0
ZSgpOworCisJCX07CisKKwkJdGhpcy5zZXRTdGF0ZSA9IGZ1bmN0aW9uKCBwbGFuZXMsIGNsaXBJ
bnRlcnNlY3Rpb24sIGNsaXBTaGFkb3dzLCBjYW1lcmEsIGNhY2hlLCBmcm9tQ2FjaGUgKSB7CisK
KwkJCWlmICggISBsb2NhbENsaXBwaW5nRW5hYmxlZCB8fAorCQkJCQlwbGFuZXMgPT09IG51bGwg
fHwgcGxhbmVzLmxlbmd0aCA9PT0gMCB8fAorCQkJCQlyZW5kZXJpbmdTaGFkb3dzICYmICEgY2xp
cFNoYWRvd3MgKSB7CisJCQkJLy8gdGhlcmUncyBubyBsb2NhbCBjbGlwcGluZworCisJCQkJaWYg
KCByZW5kZXJpbmdTaGFkb3dzICkgeworCQkJCQkvLyB0aGVyZSdzIG5vIGdsb2JhbCBjbGlwcGlu
ZworCisJCQkJCXByb2plY3RQbGFuZXMoIG51bGwgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJ
cmVzZXRHbG9iYWxTdGF0ZSgpOworCQkJCX0KKworCQkJfSBlbHNlIHsKKworCQkJCXZhciBuR2xv
YmFsID0gcmVuZGVyaW5nU2hhZG93cyA/IDAgOiBudW1HbG9iYWxQbGFuZXMsCisJCQkJCWxHbG9i
YWwgPSBuR2xvYmFsICogNCwKKworCQkJCQlkc3RBcnJheSA9IGNhY2hlLmNsaXBwaW5nU3RhdGUg
fHwgbnVsbDsKKworCQkJCXVuaWZvcm0udmFsdWUgPSBkc3RBcnJheTsgLy8gZW5zdXJlIHVuaXF1
ZSBzdGF0ZQorCisJCQkJZHN0QXJyYXkgPSBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwg
bEdsb2JhbCwgZnJvbUNhY2hlICk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IGxHbG9i
YWw7ICsrIGkgKSB7CisKKwkJCQkJZHN0QXJyYXlbIGkgXSA9IGdsb2JhbFN0YXRlWyBpIF07CisK
KwkJCQl9CisKKwkJCQljYWNoZS5jbGlwcGluZ1N0YXRlID0gZHN0QXJyYXk7CisJCQkJdGhpcy5u
dW1JbnRlcnNlY3Rpb24gPSBjbGlwSW50ZXJzZWN0aW9uID8gdGhpcy5udW1QbGFuZXMgOiAwOwor
CQkJCXRoaXMubnVtUGxhbmVzICs9IG5HbG9iYWw7CisKKwkJCX0KKworCisJCX07CisKKwkJZnVu
Y3Rpb24gcmVzZXRHbG9iYWxTdGF0ZSgpIHsKKworCQkJaWYgKCB1bmlmb3JtLnZhbHVlICE9PSBn
bG9iYWxTdGF0ZSApIHsKKworCQkJCXVuaWZvcm0udmFsdWUgPSBnbG9iYWxTdGF0ZTsKKwkJCQl1
bmlmb3JtLm5lZWRzVXBkYXRlID0gbnVtR2xvYmFsUGxhbmVzID4gMDsKKworCQkJfQorCisJCQlz
Y29wZS5udW1QbGFuZXMgPSBudW1HbG9iYWxQbGFuZXM7CisJCQlzY29wZS5udW1JbnRlcnNlY3Rp
b24gPSAwOworCisJCX0KKworCQlmdW5jdGlvbiBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVy
YSwgZHN0T2Zmc2V0LCBza2lwVHJhbnNmb3JtICkgeworCisJCQl2YXIgblBsYW5lcyA9IHBsYW5l
cyAhPT0gbnVsbCA/IHBsYW5lcy5sZW5ndGggOiAwLAorCQkJCWRzdEFycmF5ID0gbnVsbDsKKwor
CQkJaWYgKCBuUGxhbmVzICE9PSAwICkgeworCisJCQkJZHN0QXJyYXkgPSB1bmlmb3JtLnZhbHVl
OworCisJCQkJaWYgKCBza2lwVHJhbnNmb3JtICE9PSB0cnVlIHx8IGRzdEFycmF5ID09PSBudWxs
ICkgeworCisJCQkJCXZhciBmbGF0U2l6ZSA9IGRzdE9mZnNldCArIG5QbGFuZXMgKiA0LAorCQkJ
CQkJdmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7CisKKwkJCQkJdmlld05v
cm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHZpZXdNYXRyaXggKTsKKworCQkJCQlpZiAoIGRz
dEFycmF5ID09PSBudWxsIHx8IGRzdEFycmF5Lmxlbmd0aCA8IGZsYXRTaXplICkgeworCisJCQkJ
CQlkc3RBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIGZsYXRTaXplICk7CisKKwkJCQkJfQorCisJ
CQkJCWZvciAoIHZhciBpID0gMCwgaTQgPSBkc3RPZmZzZXQ7CisJCQkJCQkJCQkJaSAhPT0gblBs
YW5lczsgKysgaSwgaTQgKz0gNCApIHsKKworCQkJCQkJcGxhbmUuY29weSggcGxhbmVzWyBpIF0g
KS4KKwkJCQkJCQkJYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4LCB2aWV3Tm9ybWFsTWF0cml4ICk7
CisKKwkJCQkJCXBsYW5lLm5vcm1hbC50b0FycmF5KCBkc3RBcnJheSwgaTQgKTsKKwkJCQkJCWRz
dEFycmF5WyBpNCArIDMgXSA9IHBsYW5lLmNvbnN0YW50OworCisJCQkJCX0KKworCQkJCX0KKwor
CQkJCXVuaWZvcm0udmFsdWUgPSBkc3RBcnJheTsKKwkJCQl1bmlmb3JtLm5lZWRzVXBkYXRlID0g
dHJ1ZTsKKworCQkJfQorCisJCQlzY29wZS5udW1QbGFuZXMgPSBuUGxhbmVzOworCQkJCisJCQly
ZXR1cm4gZHN0QXJyYXk7CisKKwkJfQorCisJfQorCisJLy8gaW1wb3J0IHsgU3BoZXJlIH0gZnJv
bSAnLi4vbWF0aC9TcGhlcmUnOworCS8qKgorCSAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0
cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJk
b29iLmNvbS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29t
LworCSAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay8KKwkgKiBA
YXV0aG9yIHRzY2h3CisJICovCisKKwlmdW5jdGlvbiBXZWJHTFJlbmRlcmVyKCBwYXJhbWV0ZXJz
ICkgeworCisJCWNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcicsIFJFVklTSU9OICk7
CisKKwkJcGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307CisKKwkJdmFyIF9jYW52YXMgPSBw
YXJhbWV0ZXJzLmNhbnZhcyAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jYW52YXMgOiBkb2N1
bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2Nh
bnZhcycgKSwKKwkJCV9jb250ZXh0ID0gcGFyYW1ldGVycy5jb250ZXh0ICE9PSB1bmRlZmluZWQg
PyBwYXJhbWV0ZXJzLmNvbnRleHQgOiBudWxsLAorCisJCQlfYWxwaGEgPSBwYXJhbWV0ZXJzLmFs
cGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmFscGhhIDogZmFsc2UsCisJCQlfZGVwdGgg
PSBwYXJhbWV0ZXJzLmRlcHRoICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmRlcHRoIDogdHJ1
ZSwKKwkJCV9zdGVuY2lsID0gcGFyYW1ldGVycy5zdGVuY2lsICE9PSB1bmRlZmluZWQgPyBwYXJh
bWV0ZXJzLnN0ZW5jaWwgOiB0cnVlLAorCQkJX2FudGlhbGlhcyA9IHBhcmFtZXRlcnMuYW50aWFs
aWFzICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmFudGlhbGlhcyA6IGZhbHNlLAorCQkJX3By
ZW11bHRpcGxpZWRBbHBoYSA9IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhICE9PSB1bmRl
ZmluZWQgPyBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA6IHRydWUsCisJCQlfcHJlc2Vy
dmVEcmF3aW5nQnVmZmVyID0gcGFyYW1ldGVycy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgIT09IHVu
ZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyIDogZmFsc2U7CisKKwkJ
dmFyIGxpZ2h0cyA9IFtdOworCisJCXZhciBjdXJyZW50UmVuZGVyTGlzdCA9IG51bGw7CisKKwkJ
dmFyIG1vcnBoSW5mbHVlbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKTsKKworCQl2YXIgc3By
aXRlcyA9IFtdOworCQl2YXIgbGVuc0ZsYXJlcyA9IFtdOworCisJCS8vIHB1YmxpYyBwcm9wZXJ0
aWVzCisKKwkJdGhpcy5kb21FbGVtZW50ID0gX2NhbnZhczsKKwkJdGhpcy5jb250ZXh0ID0gbnVs
bDsKKworCQkvLyBjbGVhcmluZworCisJCXRoaXMuYXV0b0NsZWFyID0gdHJ1ZTsKKwkJdGhpcy5h
dXRvQ2xlYXJDb2xvciA9IHRydWU7CisJCXRoaXMuYXV0b0NsZWFyRGVwdGggPSB0cnVlOworCQl0
aGlzLmF1dG9DbGVhclN0ZW5jaWwgPSB0cnVlOworCisJCS8vIHNjZW5lIGdyYXBoCisKKwkJdGhp
cy5zb3J0T2JqZWN0cyA9IHRydWU7CisKKwkJLy8gdXNlci1kZWZpbmVkIGNsaXBwaW5nCisKKwkJ
dGhpcy5jbGlwcGluZ1BsYW5lcyA9IFtdOworCQl0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkID0g
ZmFsc2U7CisKKwkJLy8gcGh5c2ljYWxseSBiYXNlZCBzaGFkaW5nCisKKwkJdGhpcy5nYW1tYUZh
Y3RvciA9IDIuMDsJLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisJCXRoaXMuZ2FtbWFJ
bnB1dCA9IGZhbHNlOworCQl0aGlzLmdhbW1hT3V0cHV0ID0gZmFsc2U7CisKKwkJLy8gcGh5c2lj
YWwgbGlnaHRzCisKKwkJdGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA9IGZhbHNlOworCisJ
CS8vIHRvbmUgbWFwcGluZworCisJCXRoaXMudG9uZU1hcHBpbmcgPSBMaW5lYXJUb25lTWFwcGlu
ZzsKKwkJdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wOworCQl0aGlzLnRvbmVNYXBwaW5n
V2hpdGVQb2ludCA9IDEuMDsKKworCQkvLyBtb3JwaHMKKworCQl0aGlzLm1heE1vcnBoVGFyZ2V0
cyA9IDg7CisJCXRoaXMubWF4TW9ycGhOb3JtYWxzID0gNDsKKworCQkvLyBpbnRlcm5hbCBwcm9w
ZXJ0aWVzCisKKwkJdmFyIF90aGlzID0gdGhpcywKKworCQkJLy8gaW50ZXJuYWwgc3RhdGUgY2Fj
aGUKKworCQkJX2N1cnJlbnRQcm9ncmFtID0gbnVsbCwKKwkJCV9jdXJyZW50UmVuZGVyVGFyZ2V0
ID0gbnVsbCwKKwkJCV9jdXJyZW50RnJhbWVidWZmZXIgPSBudWxsLAorCQkJX2N1cnJlbnRNYXRl
cmlhbElkID0gLSAxLAorCQkJX2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJywKKworCQkJX2N1
cnJlbnRDYW1lcmEgPSBudWxsLAorCQkJX2N1cnJlbnRBcnJheUNhbWVyYSA9IG51bGwsCisKKwkJ
CV9jdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCksCisJCQlfY3VycmVudFNjaXNzb3JUZXN0
ID0gbnVsbCwKKworCQkJX2N1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCksCisKKwkJCS8v
CisKKwkJCV91c2VkVGV4dHVyZVVuaXRzID0gMCwKKworCQkJLy8KKworCQkJX3dpZHRoID0gX2Nh
bnZhcy53aWR0aCwKKwkJCV9oZWlnaHQgPSBfY2FudmFzLmhlaWdodCwKKworCQkJX3BpeGVsUmF0
aW8gPSAxLAorCisJCQlfc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCBfd2lkdGgsIF9oZWln
aHQgKSwKKwkJCV9zY2lzc29yVGVzdCA9IGZhbHNlLAorCisJCQlfdmlld3BvcnQgPSBuZXcgVmVj
dG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksCisKKwkJCS8vIGZydXN0dW0KKworCQkJX2Zy
dXN0dW0gPSBuZXcgRnJ1c3R1bSgpLAorCisJCQkvLyBjbGlwcGluZworCisJCQlfY2xpcHBpbmcg
PSBuZXcgV2ViR0xDbGlwcGluZygpLAorCQkJX2NsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLAorCQkJ
X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsCisKKwkJCS8vIGNhbWVyYSBtYXRyaWNlcyBj
YWNoZQorCisJCQlfcHJvalNjcmVlbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCksCisKKwkJCV92ZWN0
b3IzID0gbmV3IFZlY3RvcjMoKSwKKwkJCV9tYXRyaXg0ID0gbmV3IE1hdHJpeDQoKSwKKwkJCV9t
YXRyaXg0MiA9IG5ldyBNYXRyaXg0KCksCisKKwkJCS8vIGxpZ2h0IGFycmF5cyBjYWNoZQorCisJ
CQlfbGlnaHRzID0geworCisJCQkJaGFzaDogJycsCisKKwkJCQlhbWJpZW50OiBbIDAsIDAsIDAg
XSwKKwkJCQlkaXJlY3Rpb25hbDogW10sCisJCQkJZGlyZWN0aW9uYWxTaGFkb3dNYXA6IFtdLAor
CQkJCWRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiBbXSwKKwkJCQlzcG90OiBbXSwKKwkJCQlzcG90
U2hhZG93TWFwOiBbXSwKKwkJCQlzcG90U2hhZG93TWF0cml4OiBbXSwKKwkJCQlyZWN0QXJlYTog
W10sCisJCQkJcG9pbnQ6IFtdLAorCQkJCXBvaW50U2hhZG93TWFwOiBbXSwKKwkJCQlwb2ludFNo
YWRvd01hdHJpeDogW10sCisJCQkJaGVtaTogW10sCisKKwkJCQlzaGFkb3dzOiBbXQorCisJCQl9
LAorCisJCQkvLyBpbmZvCisKKwkJCV9pbmZvTWVtb3J5ID0geworCQkJCWdlb21ldHJpZXM6IDAs
CisJCQkJdGV4dHVyZXM6IDAKKwkJCX0sCisKKwkJCV9pbmZvUmVuZGVyID0geworCisJCQkJZnJh
bWU6IDAsCisJCQkJY2FsbHM6IDAsCisJCQkJdmVydGljZXM6IDAsCisJCQkJZmFjZXM6IDAsCisJ
CQkJcG9pbnRzOiAwCisKKwkJCX07CisKKwkJdGhpcy5pbmZvID0geworCisJCQlyZW5kZXI6IF9p
bmZvUmVuZGVyLAorCQkJbWVtb3J5OiBfaW5mb01lbW9yeSwKKwkJCXByb2dyYW1zOiBudWxsCisK
KwkJfTsKKworCisJCS8vIGluaXRpYWxpemUKKworCQl2YXIgX2dsOworCisJCXRyeSB7CisKKwkJ
CXZhciBjb250ZXh0QXR0cmlidXRlcyA9IHsKKwkJCQlhbHBoYTogX2FscGhhLAorCQkJCWRlcHRo
OiBfZGVwdGgsCisJCQkJc3RlbmNpbDogX3N0ZW5jaWwsCisJCQkJYW50aWFsaWFzOiBfYW50aWFs
aWFzLAorCQkJCXByZW11bHRpcGxpZWRBbHBoYTogX3ByZW11bHRpcGxpZWRBbHBoYSwKKwkJCQlw
cmVzZXJ2ZURyYXdpbmdCdWZmZXI6IF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIKKwkJCX07CisKKwkJ
CV9nbCA9IF9jb250ZXh0IHx8IF9jYW52YXMuZ2V0Q29udGV4dCggJ3dlYmdsJywgY29udGV4dEF0
dHJpYnV0ZXMgKSB8fCBfY2FudmFzLmdldENvbnRleHQoICdleHBlcmltZW50YWwtd2ViZ2wnLCBj
b250ZXh0QXR0cmlidXRlcyApOworCisJCQlpZiAoIF9nbCA9PT0gbnVsbCApIHsKKworCQkJCWlm
ICggX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnICkgIT09IG51bGwgKSB7CisKKwkJCQkJdGhy
b3cgJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJp
YnV0ZXMuJzsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJdGhyb3cgJ0Vycm9yIGNyZWF0aW5nIFdl
YkdMIGNvbnRleHQuJzsKKworCQkJCX0KKworCQkJfQorCisJCQkvLyBTb21lIGV4cGVyaW1lbnRh
bC13ZWJnbCBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IGhhdmUgZ2V0U2hhZGVyUHJlY2lzaW9uRm9y
bWF0CisKKwkJCWlmICggX2dsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9PT0gdW5kZWZpbmVk
ICkgeworCisJCQkJX2dsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9IGZ1bmN0aW9uICgpIHsK
KworCQkJCQlyZXR1cm4geyAncmFuZ2VNaW4nOiAxLCAncmFuZ2VNYXgnOiAxLCAncHJlY2lzaW9u
JzogMSB9OworCisJCQkJfTsKKworCQkJfQorCisJCQlfY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIo
ICd3ZWJnbGNvbnRleHRsb3N0Jywgb25Db250ZXh0TG9zdCwgZmFsc2UgKTsKKworCQl9IGNhdGNo
ICggZXJyb3IgKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAn
ICsgZXJyb3IgKTsKKworCQl9CisKKwkJdmFyIGV4dGVuc2lvbnMgPSBuZXcgV2ViR0xFeHRlbnNp
b25zKCBfZ2wgKTsKKworCQlleHRlbnNpb25zLmdldCggJ1dFQkdMX2RlcHRoX3RleHR1cmUnICk7
CisJCWV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7CisJCWV4dGVuc2lvbnMu
Z2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApOworCQlleHRlbnNpb25zLmdldCggJ09F
U190ZXh0dXJlX2hhbGZfZmxvYXQnICk7CisJCWV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVf
aGFsZl9mbG9hdF9saW5lYXInICk7CisJCWV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rl
cml2YXRpdmVzJyApOworCQlleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMn
ICk7CisKKwkJaWYgKCBleHRlbnNpb25zLmdldCggJ09FU19lbGVtZW50X2luZGV4X3VpbnQnICkg
KSB7CisKKwkJCUJ1ZmZlckdlb21ldHJ5Lk1heEluZGV4ID0gNDI5NDk2NzI5NjsKKworCQl9CisK
KwkJdmFyIGNhcGFiaWxpdGllcyA9IG5ldyBXZWJHTENhcGFiaWxpdGllcyggX2dsLCBleHRlbnNp
b25zLCBwYXJhbWV0ZXJzICk7CisKKwkJdmFyIHN0YXRlID0gbmV3IFdlYkdMU3RhdGUoIF9nbCwg
ZXh0ZW5zaW9ucywgcGFyYW1UaHJlZVRvR0wgKTsKKworCQl2YXIgcHJvcGVydGllcyA9IG5ldyBX
ZWJHTFByb3BlcnRpZXMoKTsKKwkJdmFyIHRleHR1cmVzID0gbmV3IFdlYkdMVGV4dHVyZXMoIF9n
bCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgcGFyYW1UaHJl
ZVRvR0wsIF9pbmZvTWVtb3J5ICk7CisJCXZhciBhdHRyaWJ1dGVzID0gbmV3IFdlYkdMQXR0cmli
dXRlcyggX2dsICk7CisJCXZhciBnZW9tZXRyaWVzID0gbmV3IFdlYkdMR2VvbWV0cmllcyggX2ds
LCBhdHRyaWJ1dGVzLCBfaW5mb01lbW9yeSApOworCQl2YXIgb2JqZWN0cyA9IG5ldyBXZWJHTE9i
amVjdHMoIF9nbCwgZ2VvbWV0cmllcywgX2luZm9SZW5kZXIgKTsKKwkJdmFyIHByb2dyYW1DYWNo
ZSA9IG5ldyBXZWJHTFByb2dyYW1zKCB0aGlzLCBjYXBhYmlsaXRpZXMgKTsKKwkJdmFyIGxpZ2h0
Q2FjaGUgPSBuZXcgV2ViR0xMaWdodHMoKTsKKwkJdmFyIHJlbmRlckxpc3RzID0gbmV3IFdlYkdM
UmVuZGVyTGlzdHMoKTsKKworCQl2YXIgYmFja2dyb3VuZCA9IG5ldyBXZWJHTEJhY2tncm91bmQo
IHRoaXMsIHN0YXRlLCBvYmplY3RzLCBfcHJlbXVsdGlwbGllZEFscGhhICk7CisJCXZhciB2ciA9
IG5ldyBXZWJWUk1hbmFnZXIoIHRoaXMgKTsKKworCQl0aGlzLmluZm8ucHJvZ3JhbXMgPSBwcm9n
cmFtQ2FjaGUucHJvZ3JhbXM7CisKKwkJdmFyIGJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMQnVm
ZmVyUmVuZGVyZXIoIF9nbCwgZXh0ZW5zaW9ucywgX2luZm9SZW5kZXIgKTsKKwkJdmFyIGluZGV4
ZWRCdWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggX2dsLCBl
eHRlbnNpb25zLCBfaW5mb1JlbmRlciApOworCisJCS8vCisKKwkJZnVuY3Rpb24gZ2V0VGFyZ2V0
UGl4ZWxSYXRpbygpIHsKKworCQkJcmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxs
ID8gX3BpeGVsUmF0aW8gOiAxOworCisJCX0KKworCQlmdW5jdGlvbiBzZXREZWZhdWx0R0xTdGF0
ZSgpIHsKKworCQkJc3RhdGUuaW5pdCgpOworCisJCQlzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNj
aXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApOwor
CQkJc3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVs
dGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTsKKworCQl9CisKKwkJZnVuY3Rpb24gcmVzZXRH
TFN0YXRlKCkgeworCisJCQlfY3VycmVudFByb2dyYW0gPSBudWxsOworCQkJX2N1cnJlbnRDYW1l
cmEgPSBudWxsOworCisJCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnOworCQkJX2N1cnJl
bnRNYXRlcmlhbElkID0gLSAxOworCisJCQlzdGF0ZS5yZXNldCgpOworCisJCX0KKworCQlzZXRE
ZWZhdWx0R0xTdGF0ZSgpOworCisJCXRoaXMuY29udGV4dCA9IF9nbDsKKwkJdGhpcy5jYXBhYmls
aXRpZXMgPSBjYXBhYmlsaXRpZXM7CisJCXRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7CisJ
CXRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJCXRoaXMucmVuZGVyTGlzdHMgPSByZW5k
ZXJMaXN0czsKKwkJdGhpcy5zdGF0ZSA9IHN0YXRlOworCQl0aGlzLnZyID0gdnI7CisKKwkJLy8g
c2hhZG93IG1hcAorCisJCXZhciBzaGFkb3dNYXAgPSBuZXcgV2ViR0xTaGFkb3dNYXAoIHRoaXMs
IF9saWdodHMsIG9iamVjdHMsIGNhcGFiaWxpdGllcyApOworCisJCXRoaXMuc2hhZG93TWFwID0g
c2hhZG93TWFwOworCisKKwkJLy8gUGx1Z2lucworCisJCXZhciBzcHJpdGVQbHVnaW4gPSBuZXcg
U3ByaXRlUGx1Z2luKCB0aGlzLCBzcHJpdGVzICk7CisJCXZhciBsZW5zRmxhcmVQbHVnaW4gPSBu
ZXcgTGVuc0ZsYXJlUGx1Z2luKCB0aGlzLCBsZW5zRmxhcmVzICk7CisKKwkJLy8gQVBJCisKKwkJ
dGhpcy5nZXRDb250ZXh0ID0gZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gX2dsOworCisJCX07
CisKKwkJdGhpcy5nZXRDb250ZXh0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0
dXJuIF9nbC5nZXRDb250ZXh0QXR0cmlidXRlcygpOworCisJCX07CisKKwkJdGhpcy5mb3JjZUNv
bnRleHRMb3NzID0gZnVuY3Rpb24gKCkgeworCisJCQl2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9u
cy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7CisJCQlpZiAoIGV4dGVuc2lvbiApIGV4dGVu
c2lvbi5sb3NlQ29udGV4dCgpOworCisJCX07CisKKwkJdGhpcy5nZXRNYXhBbmlzb3Ryb3B5ID0g
ZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHko
KTsKKworCQl9OworCisJCXRoaXMuZ2V0UHJlY2lzaW9uID0gZnVuY3Rpb24gKCkgeworCisJCQly
ZXR1cm4gY2FwYWJpbGl0aWVzLnByZWNpc2lvbjsKKworCQl9OworCisJCXRoaXMuZ2V0UGl4ZWxS
YXRpbyA9IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIF9waXhlbFJhdGlvOworCisJCX07CisK
KwkJdGhpcy5zZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJaWYgKCB2
YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOworCisJCQlfcGl4ZWxSYXRpbyA9IHZhbHVlOwor
CisJCQl0aGlzLnNldFNpemUoIF93aWR0aCwgX2hlaWdodCwgZmFsc2UgKTsKKworCQl9OworCisJ
CXRoaXMuZ2V0U2l6ZSA9IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHsKKwkJCQl3aWR0aDog
X3dpZHRoLAorCQkJCWhlaWdodDogX2hlaWdodAorCQkJfTsKKworCQl9OworCisJCXRoaXMuc2V0
U2l6ZSA9IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCwgdXBkYXRlU3R5bGUgKSB7CisKKwkJCXZh
ciBkZXZpY2UgPSB2ci5nZXREZXZpY2UoKTsKKworCQkJaWYgKCBkZXZpY2UgJiYgZGV2aWNlLmlz
UHJlc2VudGluZyApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6
IENhblwndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4nICk7CisJ
CQkJcmV0dXJuOworCisJCQl9CisKKwkJCV93aWR0aCA9IHdpZHRoOworCQkJX2hlaWdodCA9IGhl
aWdodDsKKworCQkJX2NhbnZhcy53aWR0aCA9IHdpZHRoICogX3BpeGVsUmF0aW87CisJCQlfY2Fu
dmFzLmhlaWdodCA9IGhlaWdodCAqIF9waXhlbFJhdGlvOworCisJCQlpZiAoIHVwZGF0ZVN0eWxl
ICE9PSBmYWxzZSApIHsKKworCQkJCV9jYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7
CisJCQkJX2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnOworCisJCQl9CisKKwkJ
CXRoaXMuc2V0Vmlld3BvcnQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKKworCQl9OworCisJCXRo
aXMuZ2V0RHJhd2luZ0J1ZmZlclNpemUgPSBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB7CisJ
CQkJd2lkdGg6IF93aWR0aCAqIF9waXhlbFJhdGlvLAorCQkJCWhlaWdodDogX2hlaWdodCAqIF9w
aXhlbFJhdGlvCisJCQl9OworCisJCX07CisKKwkJdGhpcy5zZXREcmF3aW5nQnVmZmVyU2l6ZSA9
IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCwgcGl4ZWxSYXRpbyApIHsKKworCQkJX3dpZHRoID0g
d2lkdGg7CisJCQlfaGVpZ2h0ID0gaGVpZ2h0OworCisJCQlfcGl4ZWxSYXRpbyA9IHBpeGVsUmF0
aW87CisKKwkJCV9jYW52YXMud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87CisJCQlfY2FudmFz
LmhlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87CisKKwkJCXRoaXMuc2V0Vmlld3BvcnQoIDAs
IDAsIHdpZHRoLCBoZWlnaHQgKTsKKworCQl9OworCisJCXRoaXMuc2V0Vmlld3BvcnQgPSBmdW5j
dGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7CisKKwkJCV92aWV3cG9ydC5zZXQoIHgsIF9o
ZWlnaHQgLSB5IC0gaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0ICk7CisJCQlzdGF0ZS52aWV3cG9ydCgg
X2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVs
UmF0aW8gKSApOworCisJCX07CisKKwkJdGhpcy5zZXRTY2lzc29yID0gZnVuY3Rpb24gKCB4LCB5
LCB3aWR0aCwgaGVpZ2h0ICkgeworCisJCQlfc2Npc3Nvci5zZXQoIHgsIF9oZWlnaHQgLSB5IC0g
aGVpZ2h0LCB3aWR0aCwgaGVpZ2h0ICk7CisJCQlzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNz
b3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApOworCisJ
CX07CisKKwkJdGhpcy5zZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHsKKwor
CQkJc3RhdGUuc2V0U2Npc3NvclRlc3QoIF9zY2lzc29yVGVzdCA9IGJvb2xlYW4gKTsKKworCQl9
OworCisJCS8vIENsZWFyaW5nCisKKwkJdGhpcy5nZXRDbGVhckNvbG9yID0gYmFja2dyb3VuZC5n
ZXRDbGVhckNvbG9yOworCQl0aGlzLnNldENsZWFyQ29sb3IgPSBiYWNrZ3JvdW5kLnNldENsZWFy
Q29sb3I7CisJCXRoaXMuZ2V0Q2xlYXJBbHBoYSA9IGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYTsK
KwkJdGhpcy5zZXRDbGVhckFscGhhID0gYmFja2dyb3VuZC5zZXRDbGVhckFscGhhOworCisJCXRo
aXMuY2xlYXIgPSBmdW5jdGlvbiAoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHsKKworCQkJdmFy
IGJpdHMgPSAwOworCisJCQlpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgfHwgY29sb3IgKSBiaXRz
IHw9IF9nbC5DT0xPUl9CVUZGRVJfQklUOworCQkJaWYgKCBkZXB0aCA9PT0gdW5kZWZpbmVkIHx8
IGRlcHRoICkgYml0cyB8PSBfZ2wuREVQVEhfQlVGRkVSX0JJVDsKKwkJCWlmICggc3RlbmNpbCA9
PT0gdW5kZWZpbmVkIHx8IHN0ZW5jaWwgKSBiaXRzIHw9IF9nbC5TVEVOQ0lMX0JVRkZFUl9CSVQ7
CisKKwkJCV9nbC5jbGVhciggYml0cyApOworCisJCX07CisKKwkJdGhpcy5jbGVhckNvbG9yID0g
ZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLmNsZWFyKCB0cnVlLCBmYWxzZSwgZmFsc2UgKTsKKwor
CQl9OworCisJCXRoaXMuY2xlYXJEZXB0aCA9IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5jbGVh
ciggZmFsc2UsIHRydWUsIGZhbHNlICk7CisKKwkJfTsKKworCQl0aGlzLmNsZWFyU3RlbmNpbCA9
IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5jbGVhciggZmFsc2UsIGZhbHNlLCB0cnVlICk7CisK
KwkJfTsKKworCQl0aGlzLmNsZWFyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIGNv
bG9yLCBkZXB0aCwgc3RlbmNpbCApIHsKKworCQkJdGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRl
clRhcmdldCApOworCQkJdGhpcy5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7CisKKwkJ
fTsKKworCQkvLyBSZXNldAorCisJCXRoaXMucmVzZXRHTFN0YXRlID0gcmVzZXRHTFN0YXRlOwor
CisJCXRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsKKworCQkJX2NhbnZhcy5yZW1vdmVFdmVu
dExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0bG9zdCcsIG9uQ29udGV4dExvc3QsIGZhbHNlICk7CisK
KwkJCXJlbmRlckxpc3RzLmRpc3Bvc2UoKTsKKworCQl9OworCisJCS8vIEV2ZW50cworCisJCWZ1
bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkgeworCisJCQlldmVudC5wcmV2ZW50RGVmYXVs
dCgpOworCisJCQlyZXNldEdMU3RhdGUoKTsKKwkJCXNldERlZmF1bHRHTFN0YXRlKCk7CisKKwkJ
CXByb3BlcnRpZXMuY2xlYXIoKTsKKwkJCW9iamVjdHMuY2xlYXIoKTsKKworCQl9CisKKwkJZnVu
Y3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkgeworCisJCQl2YXIgbWF0ZXJpYWwgPSBl
dmVudC50YXJnZXQ7CisKKwkJCW1hdGVyaWFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3Nl
Jywgb25NYXRlcmlhbERpc3Bvc2UgKTsKKworCQkJZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlh
bCApOworCisJCX0KKworCQkvLyBCdWZmZXIgZGVhbGxvY2F0aW9uCisKKwkJZnVuY3Rpb24gZGVh
bGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApIHsKKworCQkJcmVsZWFzZU1hdGVyaWFsUHJvZ3Jh
bVJlZmVyZW5jZSggbWF0ZXJpYWwgKTsKKworCQkJcHJvcGVydGllcy5yZW1vdmUoIG1hdGVyaWFs
ICk7CisKKwkJfQorCisKKwkJZnVuY3Rpb24gcmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5j
ZSggbWF0ZXJpYWwgKSB7CisKKwkJCXZhciBwcm9ncmFtSW5mbyA9IHByb3BlcnRpZXMuZ2V0KCBt
YXRlcmlhbCApLnByb2dyYW07CisKKwkJCW1hdGVyaWFsLnByb2dyYW0gPSB1bmRlZmluZWQ7CisK
KwkJCWlmICggcHJvZ3JhbUluZm8gIT09IHVuZGVmaW5lZCApIHsKKworCQkJCXByb2dyYW1DYWNo
ZS5yZWxlYXNlUHJvZ3JhbSggcHJvZ3JhbUluZm8gKTsKKworCQkJfQorCisJCX0KKworCQkvLyBC
dWZmZXIgcmVuZGVyaW5nCisKKwkJZnVuY3Rpb24gcmVuZGVyT2JqZWN0SW1tZWRpYXRlKCBvYmpl
Y3QsIHByb2dyYW0sIG1hdGVyaWFsICkgeworCisJCQlvYmplY3QucmVuZGVyKCBmdW5jdGlvbiAo
IG9iamVjdCApIHsKKworCQkJCV90aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZSggb2JqZWN0LCBw
cm9ncmFtLCBtYXRlcmlhbCApOworCisJCQl9ICk7CisKKwkJfQorCisJCXRoaXMucmVuZGVyQnVm
ZmVySW1tZWRpYXRlID0gZnVuY3Rpb24gKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICkgewor
CisJCQlzdGF0ZS5pbml0QXR0cmlidXRlcygpOworCisJCQl2YXIgYnVmZmVycyA9IHByb3BlcnRp
ZXMuZ2V0KCBvYmplY3QgKTsKKworCQkJaWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICYmICEgYnVm
ZmVycy5wb3NpdGlvbiApIGJ1ZmZlcnMucG9zaXRpb24gPSBfZ2wuY3JlYXRlQnVmZmVyKCk7CisJ
CQlpZiAoIG9iamVjdC5oYXNOb3JtYWxzICYmICEgYnVmZmVycy5ub3JtYWwgKSBidWZmZXJzLm5v
cm1hbCA9IF9nbC5jcmVhdGVCdWZmZXIoKTsKKwkJCWlmICggb2JqZWN0Lmhhc1V2cyAmJiAhIGJ1
ZmZlcnMudXYgKSBidWZmZXJzLnV2ID0gX2dsLmNyZWF0ZUJ1ZmZlcigpOworCQkJaWYgKCBvYmpl
Y3QuaGFzQ29sb3JzICYmICEgYnVmZmVycy5jb2xvciApIGJ1ZmZlcnMuY29sb3IgPSBfZ2wuY3Jl
YXRlQnVmZmVyKCk7CisKKwkJCXZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0
cmlidXRlcygpOworCisJCQlpZiAoIG9iamVjdC5oYXNQb3NpdGlvbnMgKSB7CisKKwkJCQlfZ2wu
YmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy5wb3NpdGlvbiApOworCQkJCV9n
bC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QucG9zaXRpb25BcnJheSwgX2ds
LkRZTkFNSUNfRFJBVyApOworCisJCQkJc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0
cmlidXRlcy5wb3NpdGlvbiApOworCQkJCV9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFt
QXR0cmlidXRlcy5wb3NpdGlvbiwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApOworCisJCQl9
CisKKwkJCWlmICggb2JqZWN0Lmhhc05vcm1hbHMgKSB7CisKKwkJCQlfZ2wuYmluZEJ1ZmZlcigg
X2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy5ub3JtYWwgKTsKKworCQkJCWlmICggISBtYXRlcmlh
bC5pc01lc2hQaG9uZ01hdGVyaWFsICYmCisJCQkJCSEgbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRN
YXRlcmlhbCAmJgorCQkJCQkhIG1hdGVyaWFsLmlzTWVzaE5vcm1hbE1hdGVyaWFsICYmCisJCQkJ
CW1hdGVyaWFsLnNoYWRpbmcgPT09IEZsYXRTaGFkaW5nICkgeworCisJCQkJCWZvciAoIHZhciBp
ID0gMCwgbCA9IG9iamVjdC5jb3VudCAqIDM7IGkgPCBsOyBpICs9IDkgKSB7CisKKwkJCQkJCXZh
ciBhcnJheSA9IG9iamVjdC5ub3JtYWxBcnJheTsKKworCQkJCQkJdmFyIG54ID0gKCBhcnJheVsg
aSArIDAgXSArIGFycmF5WyBpICsgMyBdICsgYXJyYXlbIGkgKyA2IF0gKSAvIDM7CisJCQkJCQl2
YXIgbnkgPSAoIGFycmF5WyBpICsgMSBdICsgYXJyYXlbIGkgKyA0IF0gKyBhcnJheVsgaSArIDcg
XSApIC8gMzsKKwkJCQkJCXZhciBueiA9ICggYXJyYXlbIGkgKyAyIF0gKyBhcnJheVsgaSArIDUg
XSArIGFycmF5WyBpICsgOCBdICkgLyAzOworCisJCQkJCQlhcnJheVsgaSArIDAgXSA9IG54Owor
CQkJCQkJYXJyYXlbIGkgKyAxIF0gPSBueTsKKwkJCQkJCWFycmF5WyBpICsgMiBdID0gbno7CisK
KwkJCQkJCWFycmF5WyBpICsgMyBdID0gbng7CisJCQkJCQlhcnJheVsgaSArIDQgXSA9IG55Owor
CQkJCQkJYXJyYXlbIGkgKyA1IF0gPSBuejsKKworCQkJCQkJYXJyYXlbIGkgKyA2IF0gPSBueDsK
KwkJCQkJCWFycmF5WyBpICsgNyBdID0gbnk7CisJCQkJCQlhcnJheVsgaSArIDggXSA9IG56Owor
CisJCQkJCX0KKworCQkJCX0KKworCQkJCV9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVS
LCBvYmplY3Qubm9ybWFsQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTsKKworCQkJCXN0YXRlLmVu
YWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMubm9ybWFsICk7CisKKwkJCQlfZ2wudmVy
dGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMubm9ybWFsLCAzLCBfZ2wuRkxPQVQs
IGZhbHNlLCAwLCAwICk7CisKKwkJCX0KKworCQkJaWYgKCBvYmplY3QuaGFzVXZzICYmIG1hdGVy
aWFsLm1hcCApIHsKKworCQkJCV9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZm
ZXJzLnV2ICk7CisJCQkJX2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC51
dkFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7CisKKwkJCQlzdGF0ZS5lbmFibGVBdHRyaWJ1dGUo
IHByb2dyYW1BdHRyaWJ1dGVzLnV2ICk7CisKKwkJCQlfZ2wudmVydGV4QXR0cmliUG9pbnRlcigg
YXR0cmlidXRlcy51diwgMiwgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApOworCisJCQl9CisKKwkJ
CWlmICggb2JqZWN0Lmhhc0NvbG9ycyAmJiBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgIT09IE5vQ29s
b3JzICkgeworCisJCQkJX2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMu
Y29sb3IgKTsKKwkJCQlfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LmNv
bG9yQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTsKKworCQkJCXN0YXRlLmVuYWJsZUF0dHJpYnV0
ZSggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IgKTsKKworCQkJCV9nbC52ZXJ0ZXhBdHRyaWJQb2lu
dGVyKCBwcm9ncmFtQXR0cmlidXRlcy5jb2xvciwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCAp
OworCisJCQl9CisKKwkJCXN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7CisKKwkJCV9n
bC5kcmF3QXJyYXlzKCBfZ2wuVFJJQU5HTEVTLCAwLCBvYmplY3QuY291bnQgKTsKKworCQkJb2Jq
ZWN0LmNvdW50ID0gMDsKKworCQl9OworCisJCWZ1bmN0aW9uIGFic051bWVyaWNhbFNvcnQoIGEs
IGIgKSB7CisKKwkJCXJldHVybiBNYXRoLmFicyggYlsgMCBdICkgLSBNYXRoLmFicyggYVsgMCBd
ICk7CisKKwkJfQorCisJCXRoaXMucmVuZGVyQnVmZmVyRGlyZWN0ID0gZnVuY3Rpb24gKCBjYW1l
cmEsIGZvZywgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICkgeworCisJCQlzdGF0
ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwgKTsKKworCQkJdmFyIHByb2dyYW0gPSBzZXRQcm9ncmFt
KCBjYW1lcmEsIGZvZywgbWF0ZXJpYWwsIG9iamVjdCApOworCQkJdmFyIGdlb21ldHJ5UHJvZ3Jh
bSA9IGdlb21ldHJ5LmlkICsgJ18nICsgcHJvZ3JhbS5pZCArICdfJyArICggbWF0ZXJpYWwud2ly
ZWZyYW1lID09PSB0cnVlICk7CisKKwkJCXZhciB1cGRhdGVCdWZmZXJzID0gZmFsc2U7CisKKwkJ
CWlmICggZ2VvbWV0cnlQcm9ncmFtICE9PSBfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSApIHsKKwor
CQkJCV9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gZ2VvbWV0cnlQcm9ncmFtOworCQkJCXVwZGF0
ZUJ1ZmZlcnMgPSB0cnVlOworCisJCQl9CisKKwkJCS8vIG1vcnBoIHRhcmdldHMKKworCQkJdmFy
IG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7CisK
KwkJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkv
LyBUT0RPIFJlbW92ZSBhbGxvY2F0aW9ucworCisJCQkJdmFyIGFjdGl2ZUluZmx1ZW5jZXMgPSBb
XTsKKworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IG1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5sZW5n
dGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJCXZhciBpbmZsdWVuY2UgPSBtb3JwaFRhcmdldElu
Zmx1ZW5jZXNbIGkgXTsKKwkJCQkJYWN0aXZlSW5mbHVlbmNlcy5wdXNoKCBbIGluZmx1ZW5jZSwg
aSBdICk7CisKKwkJCQl9CisKKwkJCQlhY3RpdmVJbmZsdWVuY2VzLnNvcnQoIGFic051bWVyaWNh
bFNvcnQgKTsKKworCQkJCWlmICggYWN0aXZlSW5mbHVlbmNlcy5sZW5ndGggPiA4ICkgeworCisJ
CQkJCWFjdGl2ZUluZmx1ZW5jZXMubGVuZ3RoID0gODsKKworCQkJCX0KKworCQkJCXZhciBtb3Jw
aEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7CisKKwkJCQlmb3IgKCB2YXIg
aSA9IDAsIGwgPSBhY3RpdmVJbmZsdWVuY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJ
CQkJdmFyIGluZmx1ZW5jZSA9IGFjdGl2ZUluZmx1ZW5jZXNbIGkgXTsKKwkJCQkJbW9ycGhJbmZs
dWVuY2VzWyBpIF0gPSBpbmZsdWVuY2VbIDAgXTsKKworCQkJCQlpZiAoIGluZmx1ZW5jZVsgMCBd
ICE9PSAwICkgeworCisJCQkJCQl2YXIgaW5kZXggPSBpbmZsdWVuY2VbIDEgXTsKKworCQkJCQkJ
aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPT09IHRydWUgJiYgbW9ycGhBdHRyaWJ1dGVzLnBv
c2l0aW9uICkgZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnbW9ycGhUYXJnZXQnICsgaSwgbW9ycGhB
dHRyaWJ1dGVzLnBvc2l0aW9uWyBpbmRleCBdICk7CisJCQkJCQlpZiAoIG1hdGVyaWFsLm1vcnBo
Tm9ybWFscyA9PT0gdHJ1ZSAmJiBtb3JwaEF0dHJpYnV0ZXMubm9ybWFsICkgZ2VvbWV0cnkuYWRk
QXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSwgbW9ycGhBdHRyaWJ1dGVzLm5vcm1hbFsgaW5k
ZXggXSApOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWlmICggbWF0ZXJpYWwubW9ycGhUYXJn
ZXRzID09PSB0cnVlICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhUYXJnZXQnICsg
aSApOworCQkJCQkJaWYgKCBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgPT09IHRydWUgKSBnZW9tZXRy
eS5yZW1vdmVBdHRyaWJ1dGUoICdtb3JwaE5vcm1hbCcgKyBpICk7CisKKwkJCQkJfQorCisJCQkJ
fQorCisJCQkJZm9yICggdmFyIGkgPSBhY3RpdmVJbmZsdWVuY2VzLmxlbmd0aCwgaWwgPSBtb3Jw
aEluZmx1ZW5jZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQkJbW9ycGhJbmZsdWVu
Y2VzWyBpIF0gPSAwLjA7CisKKwkJCQl9CisKKwkJCQlwcm9ncmFtLmdldFVuaWZvcm1zKCkuc2V0
VmFsdWUoIF9nbCwgJ21vcnBoVGFyZ2V0SW5mbHVlbmNlcycsIG1vcnBoSW5mbHVlbmNlcyApOwor
CisJCQkJdXBkYXRlQnVmZmVycyA9IHRydWU7CisKKwkJCX0KKworCQkJLy8KKworCQkJdmFyIGlu
ZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CisJCQl2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1
dGVzLnBvc2l0aW9uOworCQkJdmFyIHJhbmdlRmFjdG9yID0gMTsKKworCQkJaWYgKCBtYXRlcmlh
bC53aXJlZnJhbWUgPT09IHRydWUgKSB7CisKKwkJCQlpbmRleCA9IGdlb21ldHJpZXMuZ2V0V2ly
ZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApOworCQkJCXJhbmdlRmFjdG9yID0gMjsKKworCQkJ
fQorCisJCQl2YXIgYXR0cmlidXRlOworCQkJdmFyIHJlbmRlcmVyID0gYnVmZmVyUmVuZGVyZXI7
CisKKwkJCWlmICggaW5kZXggIT09IG51bGwgKSB7CisKKwkJCQlhdHRyaWJ1dGUgPSBhdHRyaWJ1
dGVzLmdldCggaW5kZXggKTsKKworCQkJCXJlbmRlcmVyID0gaW5kZXhlZEJ1ZmZlclJlbmRlcmVy
OworCQkJCXJlbmRlcmVyLnNldEluZGV4KCBhdHRyaWJ1dGUgKTsKKworCQkJfQorCisJCQlpZiAo
IHVwZGF0ZUJ1ZmZlcnMgKSB7CisKKwkJCQlzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG1hdGVyaWFs
LCBwcm9ncmFtLCBnZW9tZXRyeSApOworCisJCQkJaWYgKCBpbmRleCAhPT0gbnVsbCApIHsKKwor
CQkJCQlfZ2wuYmluZEJ1ZmZlciggX2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBhdHRyaWJ1dGUu
YnVmZmVyICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy8KKworCQkJdmFyIGRhdGFDb3VudCA9
IDA7CisKKwkJCWlmICggaW5kZXggIT09IG51bGwgKSB7CisKKwkJCQlkYXRhQ291bnQgPSBpbmRl
eC5jb3VudDsKKworCQkJfSBlbHNlIGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHsKKwor
CQkJCWRhdGFDb3VudCA9IHBvc2l0aW9uLmNvdW50OworCisJCQl9CisKKwkJCXZhciByYW5nZVN0
YXJ0ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLnN0YXJ0ICogcmFuZ2VGYWN0b3I7CisJCQl2YXIgcmFu
Z2VDb3VudCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5jb3VudCAqIHJhbmdlRmFjdG9yOworCisJCQl2
YXIgZ3JvdXBTdGFydCA9IGdyb3VwICE9PSBudWxsID8gZ3JvdXAuc3RhcnQgKiByYW5nZUZhY3Rv
ciA6IDA7CisJCQl2YXIgZ3JvdXBDb3VudCA9IGdyb3VwICE9PSBudWxsID8gZ3JvdXAuY291bnQg
KiByYW5nZUZhY3RvciA6IEluZmluaXR5OworCisJCQl2YXIgZHJhd1N0YXJ0ID0gTWF0aC5tYXgo
IHJhbmdlU3RhcnQsIGdyb3VwU3RhcnQgKTsKKwkJCXZhciBkcmF3RW5kID0gTWF0aC5taW4oIGRh
dGFDb3VudCwgcmFuZ2VTdGFydCArIHJhbmdlQ291bnQsIGdyb3VwU3RhcnQgKyBncm91cENvdW50
ICkgLSAxOworCisJCQl2YXIgZHJhd0NvdW50ID0gTWF0aC5tYXgoIDAsIGRyYXdFbmQgLSBkcmF3
U3RhcnQgKyAxICk7CisKKwkJCWlmICggZHJhd0NvdW50ID09PSAwICkgcmV0dXJuOworCisJCQkv
LworCisJCQlpZiAoIG9iamVjdC5pc01lc2ggKSB7CisKKwkJCQlpZiAoIG1hdGVyaWFsLndpcmVm
cmFtZSA9PT0gdHJ1ZSApIHsKKworCQkJCQlzdGF0ZS5zZXRMaW5lV2lkdGgoIG1hdGVyaWFsLndp
cmVmcmFtZUxpbmV3aWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSApOworCQkJCQlyZW5kZXJl
ci5zZXRNb2RlKCBfZ2wuTElORVMgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJc3dpdGNoICgg
b2JqZWN0LmRyYXdNb2RlICkgeworCisJCQkJCQljYXNlIFRyaWFuZ2xlc0RyYXdNb2RlOgorCQkJ
CQkJCXJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRVMgKTsKKwkJCQkJCQlicmVhazsKKwor
CQkJCQkJY2FzZSBUcmlhbmdsZVN0cmlwRHJhd01vZGU6CisJCQkJCQkJcmVuZGVyZXIuc2V0TW9k
ZSggX2dsLlRSSUFOR0xFX1NUUklQICk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgVHJp
YW5nbGVGYW5EcmF3TW9kZToKKwkJCQkJCQlyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVf
RkFOICk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJfQorCisJCQkJfQorCisKKwkJCX0gZWxzZSBp
ZiAoIG9iamVjdC5pc0xpbmUgKSB7CisKKwkJCQl2YXIgbGluZVdpZHRoID0gbWF0ZXJpYWwubGlu
ZXdpZHRoOworCisJCQkJaWYgKCBsaW5lV2lkdGggPT09IHVuZGVmaW5lZCApIGxpbmVXaWR0aCA9
IDE7IC8vIE5vdCB1c2luZyBMaW5lKk1hdGVyaWFsCisKKwkJCQlzdGF0ZS5zZXRMaW5lV2lkdGgo
IGxpbmVXaWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSApOworCisJCQkJaWYgKCBvYmplY3Qu
aXNMaW5lU2VnbWVudHMgKSB7CisKKwkJCQkJcmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7
CisKKwkJCQl9IGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lTG9vcCApIHsKKworCQkJCQlyZW5kZXJl
ci5zZXRNb2RlKCBfZ2wuTElORV9MT09QICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXJlbmRl
cmVyLnNldE1vZGUoIF9nbC5MSU5FX1NUUklQICk7CisKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAo
IG9iamVjdC5pc1BvaW50cyApIHsKKworCQkJCXJlbmRlcmVyLnNldE1vZGUoIF9nbC5QT0lOVFMg
KTsKKworCQkJfQorCisJCQlpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVm
ZmVyR2VvbWV0cnkgKSB7CisKKwkJCQlpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID4g
MCApIHsKKworCQkJCQlyZW5kZXJlci5yZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBkcmF3U3Rh
cnQsIGRyYXdDb3VudCApOworCisJCQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJcmVuZGVyZXIu
cmVuZGVyKCBkcmF3U3RhcnQsIGRyYXdDb3VudCApOworCisJCQl9CisKKwkJfTsKKworCQlmdW5j
dGlvbiBzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSwg
c3RhcnRJbmRleCApIHsKKworCQkJaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0luc3RhbmNl
ZEJ1ZmZlckdlb21ldHJ5ICkgeworCisJCQkJaWYgKCBleHRlbnNpb25zLmdldCggJ0FOR0xFX2lu
c3RhbmNlZF9hcnJheXMnICkgPT09IG51bGwgKSB7CisKKwkJCQkJY29uc29sZS5lcnJvciggJ1RI
UkVFLldlYkdMUmVuZGVyZXIuc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzOiB1c2luZyBUSFJFRS5JbnN0
YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNp
b24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7CisJCQkJCXJldHVybjsKKworCQkJCX0KKwor
CQkJfQorCisJCQlpZiAoIHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCApIHN0YXJ0SW5kZXggPSAw
OworCisJCQlzdGF0ZS5pbml0QXR0cmlidXRlcygpOworCisJCQl2YXIgZ2VvbWV0cnlBdHRyaWJ1
dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKKworCQkJdmFyIHByb2dyYW1BdHRyaWJ1dGVzID0g
cHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7CisKKwkJCXZhciBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1
dGVWYWx1ZXMgPSBtYXRlcmlhbC5kZWZhdWx0QXR0cmlidXRlVmFsdWVzOworCisJCQlmb3IgKCB2
YXIgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcyApIHsKKworCQkJCXZhciBwcm9ncmFtQXR0cmli
dXRlID0gcHJvZ3JhbUF0dHJpYnV0ZXNbIG5hbWUgXTsKKworCQkJCWlmICggcHJvZ3JhbUF0dHJp
YnV0ZSA+PSAwICkgeworCisJCQkJCXZhciBnZW9tZXRyeUF0dHJpYnV0ZSA9IGdlb21ldHJ5QXR0
cmlidXRlc1sgbmFtZSBdOworCisJCQkJCWlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgIT09IHVuZGVm
aW5lZCApIHsKKworCQkJCQkJdmFyIG5vcm1hbGl6ZWQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5ub3Jt
YWxpemVkOworCQkJCQkJdmFyIHNpemUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZTsKKwor
CQkJCQkJdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeUF0dHJpYnV0ZSAp
OworCisJCQkJCQl2YXIgYnVmZmVyID0gYXR0cmlidXRlLmJ1ZmZlcjsKKwkJCQkJCXZhciB0eXBl
ID0gYXR0cmlidXRlLnR5cGU7CisJCQkJCQl2YXIgYnl0ZXNQZXJFbGVtZW50ID0gYXR0cmlidXRl
LmJ5dGVzUGVyRWxlbWVudDsKKworCQkJCQkJaWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0ludGVy
bGVhdmVkQnVmZmVyQXR0cmlidXRlICkgeworCisJCQkJCQkJdmFyIGRhdGEgPSBnZW9tZXRyeUF0
dHJpYnV0ZS5kYXRhOworCQkJCQkJCXZhciBzdHJpZGUgPSBkYXRhLnN0cmlkZTsKKwkJCQkJCQl2
YXIgb2Zmc2V0ID0gZ2VvbWV0cnlBdHRyaWJ1dGUub2Zmc2V0OworCisJCQkJCQkJaWYgKCBkYXRh
ICYmIGRhdGEuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciApIHsKKworCQkJCQkJCQlzdGF0
ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBkYXRhLm1lc2hQ
ZXJBdHRyaWJ1dGUgKTsKKworCQkJCQkJCQlpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50
ID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCQkJCWdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50
ID0gZGF0YS5tZXNoUGVyQXR0cmlidXRlICogZGF0YS5jb3VudDsKKworCQkJCQkJCQl9CisKKwkJ
CQkJCQl9IGVsc2UgeworCisJCQkJCQkJCXN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0
dHJpYnV0ZSApOworCisJCQkJCQkJfQorCisJCQkJCQkJX2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJB
WV9CVUZGRVIsIGJ1ZmZlciApOworCQkJCQkJCV9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9n
cmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUgKiBieXRlc1BlckVs
ZW1lbnQsICggc3RhcnRJbmRleCAqIHN0cmlkZSArIG9mZnNldCApICogYnl0ZXNQZXJFbGVtZW50
ICk7CisKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQlpZiAoIGdlb21ldHJ5QXR0cmlidXRlLmlz
SW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkgeworCisJCQkJCQkJCXN0YXRlLmVuYWJsZUF0dHJp
YnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIGdlb21ldHJ5QXR0cmlidXRlLm1lc2hQ
ZXJBdHRyaWJ1dGUgKTsKKworCQkJCQkJCQlpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50
ID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCQkJCWdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50
ID0gZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSAqIGdlb21ldHJ5QXR0cmlidXRl
LmNvdW50OworCisJCQkJCQkJCX0KKworCQkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQkJc3RhdGUu
ZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlICk7CisKKwkJCQkJCQl9CisKKwkJCQkJ
CQlfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVyICk7CisJCQkJCQkJX2ds
LnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGUsIHNpemUsIHR5cGUsIG5vcm1h
bGl6ZWQsIDAsIHN0YXJ0SW5kZXggKiBzaXplICogYnl0ZXNQZXJFbGVtZW50ICk7CisKKwkJCQkJ
CX0KKworCQkJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgIT09
IHVuZGVmaW5lZCApIHsKKworCQkJCQkJdmFyIHZhbHVlID0gbWF0ZXJpYWxEZWZhdWx0QXR0cmli
dXRlVmFsdWVzWyBuYW1lIF07CisKKwkJCQkJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsK
KworCQkJCQkJCXN3aXRjaCAoIHZhbHVlLmxlbmd0aCApIHsKKworCQkJCQkJCQljYXNlIDI6CisJ
CQkJCQkJCQlfZ2wudmVydGV4QXR0cmliMmZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApOwor
CQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJY2FzZSAzOgorCQkJCQkJCQkJX2dsLnZlcnRleEF0
dHJpYjNmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTsKKwkJCQkJCQkJCWJyZWFrOworCisJ
CQkJCQkJCWNhc2UgNDoKKwkJCQkJCQkJCV9nbC52ZXJ0ZXhBdHRyaWI0ZnYoIHByb2dyYW1BdHRy
aWJ1dGUsIHZhbHVlICk7CisJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQlkZWZhdWx0OgorCQkJ
CQkJCQkJX2dsLnZlcnRleEF0dHJpYjFmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTsKKwor
CQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQlzdGF0
ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpOworCisJCX0KKworCQkvLyBDb21waWxlCisKKwkJ
dGhpcy5jb21waWxlID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhICkgeworCisJCQlsaWdodHMg
PSBbXTsKKworCQkJc2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkgeworCisJCQkJ
aWYgKCBvYmplY3QuaXNMaWdodCApIHsKKworCQkJCQlsaWdodHMucHVzaCggb2JqZWN0ICk7CisK
KwkJCQl9CisKKwkJCX0gKTsKKworCQkJc2V0dXBMaWdodHMoIGxpZ2h0cywgY2FtZXJhICk7CisK
KwkJCXNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHsKKworCQkJCWlmICggb2Jq
ZWN0Lm1hdGVyaWFsICkgeworCisJCQkJCWlmICggQXJyYXkuaXNBcnJheSggb2JqZWN0Lm1hdGVy
aWFsICkgKSB7CisKKwkJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IG9iamVjdC5tYXRlcmlhbC5s
ZW5ndGg7IGkgKysgKSB7CisKKwkJCQkJCQlpbml0TWF0ZXJpYWwoIG9iamVjdC5tYXRlcmlhbFsg
aSBdLCBzY2VuZS5mb2csIG9iamVjdCApOworCisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIHsKKwor
CQkJCQkJaW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWwsIHNjZW5lLmZvZywgb2JqZWN0ICk7
CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9ICk7CisKKwkJfTsKKworCQkvLyBSZW5kZXJpbmcK
KworCQl0aGlzLmFuaW1hdGUgPSBmdW5jdGlvbiAoIGNhbGxiYWNrICkgeworCisJCQlmdW5jdGlv
biBvbkZyYW1lKCkgeworCisJCQkJY2FsbGJhY2soKTsKKworCQkJCSggdnIuZ2V0RGV2aWNlKCkg
fHwgd2luZG93ICkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBvbkZyYW1lICk7CisKKwkJCX0KKwor
CQkJKCB2ci5nZXREZXZpY2UoKSB8fCB3aW5kb3cgKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIG9u
RnJhbWUgKTsKKworCQl9OworCisJCXRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzY2VuZSwgY2Ft
ZXJhLCByZW5kZXJUYXJnZXQsIGZvcmNlQ2xlYXIgKSB7CisKKwkJCWlmICggISAoIGNhbWVyYSAm
JiBjYW1lcmEuaXNDYW1lcmEgKSApIHsKKworCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJH
TFJlbmRlcmVyLnJlbmRlcjogY2FtZXJhIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5DYW1l
cmEuJyApOworCQkJCXJldHVybjsKKworCQkJfQorCisJCQkvLyByZXNldCBjYWNoaW5nIGZvciB0
aGlzIGZyYW1lCisKKwkJCV9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gJyc7CisJCQlfY3VycmVu
dE1hdGVyaWFsSWQgPSAtIDE7CisJCQlfY3VycmVudENhbWVyYSA9IG51bGw7CisKKwkJCS8vIHVw
ZGF0ZSBzY2VuZSBncmFwaAorCisJCQlpZiAoIHNjZW5lLmF1dG9VcGRhdGUgPT09IHRydWUgKSBz
Y2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpOworCisJCQkvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2Vz
IGFuZCBmcnVzdHVtCisKKwkJCWlmICggY2FtZXJhLnBhcmVudCA9PT0gbnVsbCApIGNhbWVyYS51
cGRhdGVNYXRyaXhXb3JsZCgpOworCisJCQlpZiAoIHZyLmVuYWJsZWQgKSB7CisKKwkJCQljYW1l
cmEgPSB2ci5nZXRDYW1lcmEoIGNhbWVyYSApOworCisJCQl9CisKKwkJCV9wcm9qU2NyZWVuTWF0
cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0
cml4V29ybGRJbnZlcnNlICk7CisJCQlfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfcHJvalNjcmVl
bk1hdHJpeCApOworCisJCQlsaWdodHMubGVuZ3RoID0gMDsKKwkJCXNwcml0ZXMubGVuZ3RoID0g
MDsKKwkJCWxlbnNGbGFyZXMubGVuZ3RoID0gMDsKKworCQkJX2xvY2FsQ2xpcHBpbmdFbmFibGVk
ID0gdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZDsKKwkJCV9jbGlwcGluZ0VuYWJsZWQgPSBfY2xp
cHBpbmcuaW5pdCggdGhpcy5jbGlwcGluZ1BsYW5lcywgX2xvY2FsQ2xpcHBpbmdFbmFibGVkLCBj
YW1lcmEgKTsKKworCQkJY3VycmVudFJlbmRlckxpc3QgPSByZW5kZXJMaXN0cy5nZXQoIHNjZW5l
LCBjYW1lcmEgKTsKKwkJCWN1cnJlbnRSZW5kZXJMaXN0LmluaXQoKTsKKworCQkJcHJvamVjdE9i
amVjdCggc2NlbmUsIGNhbWVyYSwgX3RoaXMuc29ydE9iamVjdHMgKTsKKworCQkJY3VycmVudFJl
bmRlckxpc3QuZmluaXNoKCk7CisKKwkJCWlmICggX3RoaXMuc29ydE9iamVjdHMgPT09IHRydWUg
KSB7CisKKwkJCQljdXJyZW50UmVuZGVyTGlzdC5zb3J0KCk7CisKKwkJCX0KKworCQkJLy8KKwor
CQkJaWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmJlZ2luU2hhZG93cygpOworCisJ
CQlzZXR1cFNoYWRvd3MoIGxpZ2h0cyApOworCisJCQlzaGFkb3dNYXAucmVuZGVyKCBzY2VuZSwg
Y2FtZXJhICk7CisKKwkJCXNldHVwTGlnaHRzKCBsaWdodHMsIGNhbWVyYSApOworCisJCQlpZiAo
IF9jbGlwcGluZ0VuYWJsZWQgKSBfY2xpcHBpbmcuZW5kU2hhZG93cygpOworCisJCQkvLworCisJ
CQlfaW5mb1JlbmRlci5mcmFtZSArKzsKKwkJCV9pbmZvUmVuZGVyLmNhbGxzID0gMDsKKwkJCV9p
bmZvUmVuZGVyLnZlcnRpY2VzID0gMDsKKwkJCV9pbmZvUmVuZGVyLmZhY2VzID0gMDsKKwkJCV9p
bmZvUmVuZGVyLnBvaW50cyA9IDA7CisKKwkJCWlmICggcmVuZGVyVGFyZ2V0ID09PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCQlyZW5kZXJUYXJnZXQgPSBudWxsOworCisJCQl9CisKKwkJCXRoaXMuc2V0
UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTsKKworCQkJLy8KKworCQkJYmFja2dyb3VuZC5y
ZW5kZXIoIHNjZW5lLCBjYW1lcmEsIGZvcmNlQ2xlYXIgKTsKKworCQkJLy8gcmVuZGVyIHNjZW5l
CisKKwkJCXZhciBvcGFxdWVPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3Qub3BhcXVlOworCQkJ
dmFyIHRyYW5zcGFyZW50T2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0LnRyYW5zcGFyZW50Owor
CisJCQlpZiAoIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgKSB7CisKKwkJCQl2YXIgb3ZlcnJpZGVN
YXRlcmlhbCA9IHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWw7CisKKwkJCQlpZiAoIG9wYXF1ZU9iamVj
dHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSwg
b3ZlcnJpZGVNYXRlcmlhbCApOworCQkJCWlmICggdHJhbnNwYXJlbnRPYmplY3RzLmxlbmd0aCAp
IHJlbmRlck9iamVjdHMoIHRyYW5zcGFyZW50T2JqZWN0cywgc2NlbmUsIGNhbWVyYSwgb3ZlcnJp
ZGVNYXRlcmlhbCApOworCisJCQl9IGVsc2UgeworCisJCQkJLy8gb3BhcXVlIHBhc3MgKGZyb250
LXRvLWJhY2sgb3JkZXIpCisKKwkJCQlpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoICkgcmVuZGVy
T2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSApOworCisJCQkJLy8gdHJhbnNw
YXJlbnQgcGFzcyAoYmFjay10by1mcm9udCBvcmRlcikKKworCQkJCWlmICggdHJhbnNwYXJlbnRP
YmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIHRyYW5zcGFyZW50T2JqZWN0cywgc2NlbmUs
IGNhbWVyYSApOworCisJCQl9CisKKwkJCS8vIGN1c3RvbSByZW5kZXIgcGx1Z2lucyAocG9zdCBw
YXNzKQorCisJCQlzcHJpdGVQbHVnaW4ucmVuZGVyKCBzY2VuZSwgY2FtZXJhICk7CisJCQlsZW5z
RmxhcmVQbHVnaW4ucmVuZGVyKCBzY2VuZSwgY2FtZXJhLCBfY3VycmVudFZpZXdwb3J0ICk7CisK
KwkJCS8vIEdlbmVyYXRlIG1pcG1hcCBpZiB3ZSdyZSB1c2luZyBhbnkga2luZCBvZiBtaXBtYXAg
ZmlsdGVyaW5nCisKKwkJCWlmICggcmVuZGVyVGFyZ2V0ICkgeworCisJCQkJdGV4dHVyZXMudXBk
YXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQgKTsKKworCQkJfQorCisJCQkvLyBF
bnN1cmUgZGVwdGggYnVmZmVyIHdyaXRpbmcgaXMgZW5hYmxlZCBzbyBpdCBjYW4gYmUgY2xlYXJl
ZCBvbiBuZXh0IHJlbmRlcgorCisJCQlzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUg
KTsKKwkJCXN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayggdHJ1ZSApOworCQkJc3RhdGUuYnVm
ZmVycy5jb2xvci5zZXRNYXNrKCB0cnVlICk7CisKKwkJCWlmICggY2FtZXJhLmlzQXJyYXlDYW1l
cmEgKSB7CisKKwkJCQlfdGhpcy5zZXRTY2lzc29yVGVzdCggZmFsc2UgKTsKKworCQkJfQorCisJ
CQlpZiAoIHZyLmVuYWJsZWQgKSB7CisKKwkJCQl2ci5zdWJtaXRGcmFtZSgpOworCisJCQl9CisK
KwkJCS8vIF9nbC5maW5pc2goKTsKKworCQl9OworCisJCS8qCisJCS8vIFRPRE8gRHVwbGljYXRl
ZCBjb2RlIChGcnVzdHVtKQorCisJCXZhciBfc3BoZXJlID0gbmV3IFNwaGVyZSgpOworCisJCWZ1
bmN0aW9uIGlzT2JqZWN0Vmlld2FibGUoIG9iamVjdCApIHsKKworCQkJdmFyIGdlb21ldHJ5ID0g
b2JqZWN0Lmdlb21ldHJ5OworCisJCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBu
dWxsICkKKwkJCQlnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKKworCQkJX3NwaGVy
ZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApLgorCQkJYXBwbHlNYXRyaXg0KCBvYmpl
Y3QubWF0cml4V29ybGQgKTsKKworCQkJcmV0dXJuIGlzU3BoZXJlVmlld2FibGUoIF9zcGhlcmUg
KTsKKworCQl9CisKKwkJZnVuY3Rpb24gaXNTcHJpdGVWaWV3YWJsZSggc3ByaXRlICkgeworCisJ
CQlfc3BoZXJlLmNlbnRlci5zZXQoIDAsIDAsIDAgKTsKKwkJCV9zcGhlcmUucmFkaXVzID0gMC43
MDcxMDY3ODExODY1NDc2OworCQkJX3NwaGVyZS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhX
b3JsZCApOworCisJCQlyZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSApOworCisJCX0K
KworCQlmdW5jdGlvbiBpc1NwaGVyZVZpZXdhYmxlKCBzcGhlcmUgKSB7CisKKwkJCWlmICggISBf
ZnJ1c3R1bS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSApIHJldHVybiBmYWxzZTsKKworCQkJ
dmFyIG51bVBsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7CisKKwkJCWlmICggbnVtUGxhbmVz
ID09PSAwICkgcmV0dXJuIHRydWU7CisKKwkJCXZhciBwbGFuZXMgPSBfdGhpcy5jbGlwcGluZ1Bs
YW5lcywKKworCQkJCWNlbnRlciA9IHNwaGVyZS5jZW50ZXIsCisJCQkJbmVnUmFkID0gLSBzcGhl
cmUucmFkaXVzLAorCQkJCWkgPSAwOworCisJCQlkbyB7CisKKwkJCQkvLyBvdXQgd2hlbiBkZWVw
ZXIgdGhhbiByYWRpdXMgaW4gdGhlIG5lZ2F0aXZlIGhhbGZzcGFjZQorCQkJCWlmICggcGxhbmVz
WyBpIF0uZGlzdGFuY2VUb1BvaW50KCBjZW50ZXIgKSA8IG5lZ1JhZCApIHJldHVybiBmYWxzZTsK
KworCQkJfSB3aGlsZSAoICsrIGkgIT09IG51bVBsYW5lcyApOworCisJCQlyZXR1cm4gdHJ1ZTsK
KworCQl9CisJCSovCisKKwkJZnVuY3Rpb24gcHJvamVjdE9iamVjdCggb2JqZWN0LCBjYW1lcmEs
IHNvcnRPYmplY3RzICkgeworCisJCQlpZiAoICEgb2JqZWN0LnZpc2libGUgKSByZXR1cm47CisK
KwkJCXZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7CisK
KwkJCWlmICggdmlzaWJsZSApIHsKKworCQkJCWlmICggb2JqZWN0LmlzTGlnaHQgKSB7CisKKwkJ
CQkJbGlnaHRzLnB1c2goIG9iamVjdCApOworCisJCQkJfSBlbHNlIGlmICggb2JqZWN0LmlzU3By
aXRlICkgeworCisJCQkJCWlmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5p
bnRlcnNlY3RzU3ByaXRlKCBvYmplY3QgKSApIHsKKworCQkJCQkJc3ByaXRlcy5wdXNoKCBvYmpl
Y3QgKTsKKworCQkJCQl9CisKKwkJCQl9IGVsc2UgaWYgKCBvYmplY3QuaXNMZW5zRmxhcmUgKSB7
CisKKwkJCQkJbGVuc0ZsYXJlcy5wdXNoKCBvYmplY3QgKTsKKworCQkJCX0gZWxzZSBpZiAoIG9i
amVjdC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCApIHsKKworCQkJCQlpZiAoIHNvcnRPYmplY3Rz
ICkgeworCisJCQkJCQlfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRy
aXhXb3JsZCApCisJCQkJCQkJLmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTsKKwor
CQkJCQl9CisKKwkJCQkJY3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBudWxsLCBvYmpl
Y3QubWF0ZXJpYWwsIF92ZWN0b3IzLnosIG51bGwgKTsKKworCQkJCX0gZWxzZSBpZiAoIG9iamVj
dC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSB7CisKKwkJCQkJ
aWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCApIHsKKworCQkJCQkJb2JqZWN0LnNrZWxldG9uLnVw
ZGF0ZSgpOworCisJCQkJCX0KKworCQkJCQlpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwg
X2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSB7CisKKwkJCQkJCWlmICggc29y
dE9iamVjdHMgKSB7CisKKwkJCQkJCQlfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9i
amVjdC5tYXRyaXhXb3JsZCApCisJCQkJCQkJCS5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0
cml4ICk7CisKKwkJCQkJCX0KKworCQkJCQkJdmFyIGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUo
IG9iamVjdCApOworCQkJCQkJdmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsOworCisJCQkJ
CQlpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7CisKKwkJCQkJCQl2YXIgZ3JvdXBz
ID0gZ2VvbWV0cnkuZ3JvdXBzOworCisJCQkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gZ3JvdXBz
Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJCQkJdmFyIGdyb3VwID0gZ3JvdXBzWyBp
IF07CisJCQkJCQkJCXZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFs
SW5kZXggXTsKKworCQkJCQkJCQlpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52
aXNpYmxlICkgeworCisJCQkJCQkJCQljdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIGdl
b21ldHJ5LCBncm91cE1hdGVyaWFsLCBfdmVjdG9yMy56LCBncm91cCApOworCisJCQkJCQkJCX0K
KworCQkJCQkJCX0KKworCQkJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHsKKwor
CQkJCQkJCWN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFs
LCBfdmVjdG9yMy56LCBudWxsICk7CisKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9CisKKwkJ
CX0KKworCQkJdmFyIGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuOworCisJCQlmb3IgKCB2YXIg
aSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJcHJvamVj
dE9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzb3J0T2JqZWN0cyApOworCisJCQl9CisK
KwkJfQorCisJCWZ1bmN0aW9uIHJlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1l
cmEsIG92ZXJyaWRlTWF0ZXJpYWwgKSB7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHJlbmRl
ckxpc3QubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCXZhciByZW5kZXJJdGVtID0gcmVu
ZGVyTGlzdFsgaSBdOworCisJCQkJdmFyIG9iamVjdCA9IHJlbmRlckl0ZW0ub2JqZWN0OworCQkJ
CXZhciBnZW9tZXRyeSA9IHJlbmRlckl0ZW0uZ2VvbWV0cnk7CisJCQkJdmFyIG1hdGVyaWFsID0g
b3ZlcnJpZGVNYXRlcmlhbCA9PT0gdW5kZWZpbmVkID8gcmVuZGVySXRlbS5tYXRlcmlhbCA6IG92
ZXJyaWRlTWF0ZXJpYWw7CisJCQkJdmFyIGdyb3VwID0gcmVuZGVySXRlbS5ncm91cDsKKworCQkJ
CWlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgKSB7CisKKwkJCQkJX2N1cnJlbnRBcnJheUNhbWVy
YSA9IGNhbWVyYTsKKworCQkJCQl2YXIgY2FtZXJhcyA9IGNhbWVyYS5jYW1lcmFzOworCisJCQkJ
CWZvciAoIHZhciBqID0gMCwgamwgPSBjYW1lcmFzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgewor
CisJCQkJCQl2YXIgY2FtZXJhMiA9IGNhbWVyYXNbIGogXTsKKworCQkJCQkJaWYgKCBvYmplY3Qu
bGF5ZXJzLnRlc3QoIGNhbWVyYTIubGF5ZXJzICkgKSB7CisKKwkJCQkJCQl2YXIgYm91bmRzID0g
Y2FtZXJhMi5ib3VuZHM7CisKKwkJCQkJCQl2YXIgeCA9IGJvdW5kcy54ICogX3dpZHRoOworCQkJ
CQkJCXZhciB5ID0gYm91bmRzLnkgKiBfaGVpZ2h0OworCQkJCQkJCXZhciB3aWR0aCA9IGJvdW5k
cy56ICogX3dpZHRoOworCQkJCQkJCXZhciBoZWlnaHQgPSBib3VuZHMudyAqIF9oZWlnaHQ7CisK
KwkJCQkJCQlfdGhpcy5zZXRWaWV3cG9ydCggeCwgeSwgd2lkdGgsIGhlaWdodCApOworCQkJCQkJ
CV90aGlzLnNldFNjaXNzb3IoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTsKKwkJCQkJCQlfdGhpcy5z
ZXRTY2lzc29yVGVzdCggdHJ1ZSApOworCisJCQkJCQkJcmVuZGVyT2JqZWN0KCBvYmplY3QsIHNj
ZW5lLCBjYW1lcmEyLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7CisKKwkJCQkJCX0KKwor
CQkJCQl9CisKKwkJCQl9IGVsc2UgeworCisJCQkJCV9jdXJyZW50QXJyYXlDYW1lcmEgPSBudWxs
OworCisJCQkJCXJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwg
bWF0ZXJpYWwsIGdyb3VwICk7CisKKwkJCQl9CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24g
cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwg
Z3JvdXAgKSB7CisKKwkJCW9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcygg
Y2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7CisJCQlvYmpl
Y3Qubm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggb2JqZWN0Lm1vZGVsVmlld01hdHJpeCAp
OworCisJCQlvYmplY3Qub25CZWZvcmVSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9t
ZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7CisKKwkJCWlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVu
ZGVyT2JqZWN0ICkgeworCisJCQkJc3RhdGUuc2V0TWF0ZXJpYWwoIG1hdGVyaWFsICk7CisKKwkJ
CQl2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgc2NlbmUuZm9nLCBtYXRlcmlhbCwg
b2JqZWN0ICk7CisKKwkJCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnOworCisJCQkJcmVu
ZGVyT2JqZWN0SW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICk7CisKKwkJCX0g
ZWxzZSB7CisKKwkJCQlfdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QoIGNhbWVyYSwgc2NlbmUuZm9n
LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTsKKworCQkJfQorCisJCQlvYmpl
Y3Qub25BZnRlclJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlh
bCwgZ3JvdXAgKTsKKworCQl9CisKKwkJZnVuY3Rpb24gaW5pdE1hdGVyaWFsKCBtYXRlcmlhbCwg
Zm9nLCBvYmplY3QgKSB7CisKKwkJCXZhciBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVz
LmdldCggbWF0ZXJpYWwgKTsKKworCQkJdmFyIHBhcmFtZXRlcnMgPSBwcm9ncmFtQ2FjaGUuZ2V0
UGFyYW1ldGVycygKKwkJCQltYXRlcmlhbCwgX2xpZ2h0cywgZm9nLCBfY2xpcHBpbmcubnVtUGxh
bmVzLCBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uLCBvYmplY3QgKTsKKworCQkJdmFyIGNvZGUg
PSBwcm9ncmFtQ2FjaGUuZ2V0UHJvZ3JhbUNvZGUoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICk7CisK
KwkJCXZhciBwcm9ncmFtID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW07CisJCQl2YXIgcHJv
Z3JhbUNoYW5nZSA9IHRydWU7CisKKwkJCWlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkgewor
CisJCQkJLy8gbmV3IG1hdGVyaWFsCisJCQkJbWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lciggJ2Rp
c3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApOworCisJCQl9IGVsc2UgaWYgKCBwcm9ncmFtLmNv
ZGUgIT09IGNvZGUgKSB7CisKKwkJCQkvLyBjaGFuZ2VkIGdsc2wgb3IgcGFyYW1ldGVycworCQkJ
CXJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7CisKKwkJCX0gZWxz
ZSBpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCS8vIHNh
bWUgZ2xzbCBhbmQgdW5pZm9ybSBsaXN0CisJCQkJcmV0dXJuOworCisJCQl9IGVsc2UgeworCisJ
CQkJLy8gb25seSByZWJ1aWxkIHVuaWZvcm0gbGlzdAorCQkJCXByb2dyYW1DaGFuZ2UgPSBmYWxz
ZTsKKworCQkJfQorCisJCQlpZiAoIHByb2dyYW1DaGFuZ2UgKSB7CisKKwkJCQlpZiAoIHBhcmFt
ZXRlcnMuc2hhZGVySUQgKSB7CisKKwkJCQkJdmFyIHNoYWRlciA9IFNoYWRlckxpYlsgcGFyYW1l
dGVycy5zaGFkZXJJRCBdOworCisJCQkJCW1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIgPSB7CisJ
CQkJCQluYW1lOiBtYXRlcmlhbC50eXBlLAorCQkJCQkJdW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMu
Y2xvbmUoIHNoYWRlci51bmlmb3JtcyApLAorCQkJCQkJdmVydGV4U2hhZGVyOiBzaGFkZXIudmVy
dGV4U2hhZGVyLAorCQkJCQkJZnJhZ21lbnRTaGFkZXI6IHNoYWRlci5mcmFnbWVudFNoYWRlcgor
CQkJCQl9OworCisJCQkJfSBlbHNlIHsKKworCQkJCQltYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVy
ID0geworCQkJCQkJbmFtZTogbWF0ZXJpYWwudHlwZSwKKwkJCQkJCXVuaWZvcm1zOiBtYXRlcmlh
bC51bmlmb3JtcywKKwkJCQkJCXZlcnRleFNoYWRlcjogbWF0ZXJpYWwudmVydGV4U2hhZGVyLAor
CQkJCQkJZnJhZ21lbnRTaGFkZXI6IG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyCisJCQkJCX07CisK
KwkJCQl9CisKKwkJCQltYXRlcmlhbC5vbkJlZm9yZUNvbXBpbGUoIG1hdGVyaWFsUHJvcGVydGll
cy5zaGFkZXIgKTsKKworCQkJCXByb2dyYW0gPSBwcm9ncmFtQ2FjaGUuYWNxdWlyZVByb2dyYW0o
IG1hdGVyaWFsLCBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLCBwYXJhbWV0ZXJzLCBjb2RlICk7
CisKKwkJCQltYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9IHByb2dyYW07CisJCQkJbWF0ZXJp
YWwucHJvZ3JhbSA9IHByb2dyYW07CisKKwkJCX0KKworCQkJdmFyIHByb2dyYW1BdHRyaWJ1dGVz
ID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7CisKKwkJCWlmICggbWF0ZXJpYWwubW9ycGhUYXJn
ZXRzICkgeworCisJCQkJbWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzID0gMDsKKwor
CQkJCWZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoVGFyZ2V0czsgaSArKyApIHsK
KworCQkJCQlpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhUYXJnZXQnICsgaSBdID49IDAg
KSB7CisKKwkJCQkJCW1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyArKzsKKworCQkJ
CQl9CisKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgKSB7
CisKKwkJCQltYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMgPSAwOworCisJCQkJZm9y
ICggdmFyIGkgPSAwOyBpIDwgX3RoaXMubWF4TW9ycGhOb3JtYWxzOyBpICsrICkgeworCisJCQkJ
CWlmICggcHJvZ3JhbUF0dHJpYnV0ZXNbICdtb3JwaE5vcm1hbCcgKyBpIF0gPj0gMCApIHsKKwor
CQkJCQkJbWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzICsrOworCisJCQkJCX0KKwor
CQkJCX0KKworCQkJfQorCisJCQl2YXIgdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuc2hh
ZGVyLnVuaWZvcm1zOworCisJCQlpZiAoICEgbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCAmJgor
CQkJCSEgbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCB8fAorCQkJCW1hdGVyaWFsLmNsaXBw
aW5nID09PSB0cnVlICkgeworCisJCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxh
bmVzID0gX2NsaXBwaW5nLm51bVBsYW5lczsKKwkJCQltYXRlcmlhbFByb3BlcnRpZXMubnVtSW50
ZXJzZWN0aW9uID0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbjsKKwkJCQl1bmlmb3Jtcy5jbGlw
cGluZ1BsYW5lcyA9IF9jbGlwcGluZy51bmlmb3JtOworCisJCQl9CisKKwkJCW1hdGVyaWFsUHJv
cGVydGllcy5mb2cgPSBmb2c7CisKKwkJCS8vIHN0b3JlIHRoZSBsaWdodCBzZXR1cCBpdCB3YXMg
Y3JlYXRlZCBmb3IKKworCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c0hhc2ggPSBfbGlnaHRz
Lmhhc2g7CisKKwkJCWlmICggbWF0ZXJpYWwubGlnaHRzICkgeworCisJCQkJLy8gd2lyZSB1cCB0
aGUgbWF0ZXJpYWwgdG8gdGhpcyByZW5kZXJlcidzIGxpZ2h0aW5nIHN0YXRlCisKKwkJCQl1bmlm
b3Jtcy5hbWJpZW50TGlnaHRDb2xvci52YWx1ZSA9IF9saWdodHMuYW1iaWVudDsKKwkJCQl1bmlm
b3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZSA9IF9saWdodHMuZGlyZWN0aW9uYWw7CisJCQkJ
dW5pZm9ybXMuc3BvdExpZ2h0cy52YWx1ZSA9IF9saWdodHMuc3BvdDsKKwkJCQl1bmlmb3Jtcy5y
ZWN0QXJlYUxpZ2h0cy52YWx1ZSA9IF9saWdodHMucmVjdEFyZWE7CisJCQkJdW5pZm9ybXMucG9p
bnRMaWdodHMudmFsdWUgPSBfbGlnaHRzLnBvaW50OworCQkJCXVuaWZvcm1zLmhlbWlzcGhlcmVM
aWdodHMudmFsdWUgPSBfbGlnaHRzLmhlbWk7CisKKwkJCQl1bmlmb3Jtcy5kaXJlY3Rpb25hbFNo
YWRvd01hcC52YWx1ZSA9IF9saWdodHMuZGlyZWN0aW9uYWxTaGFkb3dNYXA7CisJCQkJdW5pZm9y
bXMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWUgPSBfbGlnaHRzLmRpcmVjdGlvbmFsU2hh
ZG93TWF0cml4OworCQkJCXVuaWZvcm1zLnNwb3RTaGFkb3dNYXAudmFsdWUgPSBfbGlnaHRzLnNw
b3RTaGFkb3dNYXA7CisJCQkJdW5pZm9ybXMuc3BvdFNoYWRvd01hdHJpeC52YWx1ZSA9IF9saWdo
dHMuc3BvdFNoYWRvd01hdHJpeDsKKwkJCQl1bmlmb3Jtcy5wb2ludFNoYWRvd01hcC52YWx1ZSA9
IF9saWdodHMucG9pbnRTaGFkb3dNYXA7CisJCQkJdW5pZm9ybXMucG9pbnRTaGFkb3dNYXRyaXgu
dmFsdWUgPSBfbGlnaHRzLnBvaW50U2hhZG93TWF0cml4OworCQkJCS8vIFRPRE8gKGFiZWxuYXRp
b24pOiBhZGQgYXJlYSBsaWdodHMgc2hhZG93IGluZm8gdG8gdW5pZm9ybXMKKworCQkJfQorCisJ
CQl2YXIgcHJvZ1VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0uZ2V0VW5pZm9y
bXMoKSwKKwkJCQl1bmlmb3Jtc0xpc3QgPQorCQkJCQlXZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1
ZSggcHJvZ1VuaWZvcm1zLnNlcSwgdW5pZm9ybXMgKTsKKworCQkJbWF0ZXJpYWxQcm9wZXJ0aWVz
LnVuaWZvcm1zTGlzdCA9IHVuaWZvcm1zTGlzdDsKKworCQl9CisKKwkJZnVuY3Rpb24gc2V0UHJv
Z3JhbSggY2FtZXJhLCBmb2csIG1hdGVyaWFsLCBvYmplY3QgKSB7CisKKwkJCV91c2VkVGV4dHVy
ZVVuaXRzID0gMDsKKworCQkJdmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0
KCBtYXRlcmlhbCApOworCisJCQlpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSB7CisKKwkJCQlpZiAo
IF9sb2NhbENsaXBwaW5nRW5hYmxlZCB8fCBjYW1lcmEgIT09IF9jdXJyZW50Q2FtZXJhICkgewor
CisJCQkJCXZhciB1c2VDYWNoZSA9CisJCQkJCQljYW1lcmEgPT09IF9jdXJyZW50Q2FtZXJhICYm
CisJCQkJCQltYXRlcmlhbC5pZCA9PT0gX2N1cnJlbnRNYXRlcmlhbElkOworCisJCQkJCS8vIHdl
IG1pZ2h0IHdhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggc29tZSBDbGlwcGluZ0dyb3Vw
CisJCQkJCS8vIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBtYXRlcmlhbCwgb25jZSBpdCBiZWNvbWVz
IGZlYXNpYmxlCisJCQkJCS8vICgjODQ2NSwgIzgzNzkpCisJCQkJCV9jbGlwcGluZy5zZXRTdGF0
ZSgKKwkJCQkJCW1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzLCBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0
aW9uLCBtYXRlcmlhbC5jbGlwU2hhZG93cywKKwkJCQkJCWNhbWVyYSwgbWF0ZXJpYWxQcm9wZXJ0
aWVzLCB1c2VDYWNoZSApOworCisJCQkJfQorCisJCQl9CisKKwkJCWlmICggbWF0ZXJpYWwubmVl
ZHNVcGRhdGUgPT09IGZhbHNlICkgeworCisJCQkJaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMucHJv
Z3JhbSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCW1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1
ZTsKKworCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmZvZyAmJiBtYXRlcmlhbFByb3BlcnRpZXMu
Zm9nICE9PSBmb2cgKSB7CisKKwkJCQkJbWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlOworCisJ
CQkJfSBlbHNlIGlmICggbWF0ZXJpYWwubGlnaHRzICYmIG1hdGVyaWFsUHJvcGVydGllcy5saWdo
dHNIYXNoICE9PSBfbGlnaHRzLmhhc2ggKSB7CisKKwkJCQkJbWF0ZXJpYWwubmVlZHNVcGRhdGUg
PSB0cnVlOworCisJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5n
UGxhbmVzICE9PSB1bmRlZmluZWQgJiYKKwkJCQkJKCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xp
cHBpbmdQbGFuZXMgIT09IF9jbGlwcGluZy5udW1QbGFuZXMgfHwKKwkJCQkJbWF0ZXJpYWxQcm9w
ZXJ0aWVzLm51bUludGVyc2VjdGlvbiAhPT0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbiApICkg
eworCisJCQkJCW1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQkJCX0KKworCQkJfQor
CisJCQlpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlICkgeworCisJCQkJaW5pdE1hdGVyaWFsKCBt
YXRlcmlhbCwgZm9nLCBvYmplY3QgKTsKKwkJCQltYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IGZhbHNl
OworCisJCQl9CisKKwkJCXZhciByZWZyZXNoUHJvZ3JhbSA9IGZhbHNlOworCQkJdmFyIHJlZnJl
c2hNYXRlcmlhbCA9IGZhbHNlOworCQkJdmFyIHJlZnJlc2hMaWdodHMgPSBmYWxzZTsKKworCQkJ
dmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSwKKwkJCQlwX3VuaWZvcm1z
ID0gcHJvZ3JhbS5nZXRVbmlmb3JtcygpLAorCQkJCW1fdW5pZm9ybXMgPSBtYXRlcmlhbFByb3Bl
cnRpZXMuc2hhZGVyLnVuaWZvcm1zOworCisJCQlpZiAoIHByb2dyYW0uaWQgIT09IF9jdXJyZW50
UHJvZ3JhbSApIHsKKworCQkJCV9nbC51c2VQcm9ncmFtKCBwcm9ncmFtLnByb2dyYW0gKTsKKwkJ
CQlfY3VycmVudFByb2dyYW0gPSBwcm9ncmFtLmlkOworCisJCQkJcmVmcmVzaFByb2dyYW0gPSB0
cnVlOworCQkJCXJlZnJlc2hNYXRlcmlhbCA9IHRydWU7CisJCQkJcmVmcmVzaExpZ2h0cyA9IHRy
dWU7CisKKwkJCX0KKworCQkJaWYgKCBtYXRlcmlhbC5pZCAhPT0gX2N1cnJlbnRNYXRlcmlhbElk
ICkgeworCisJCQkJX2N1cnJlbnRNYXRlcmlhbElkID0gbWF0ZXJpYWwuaWQ7CisKKwkJCQlyZWZy
ZXNoTWF0ZXJpYWwgPSB0cnVlOworCisJCQl9CisKKwkJCWlmICggcmVmcmVzaFByb2dyYW0gfHwg
Y2FtZXJhICE9PSBfY3VycmVudENhbWVyYSApIHsKKworCQkJCXBfdW5pZm9ybXMuc2V0VmFsdWUo
IF9nbCwgJ3Byb2plY3Rpb25NYXRyaXgnLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApOworCisJ
CQkJaWYgKCBjYXBhYmlsaXRpZXMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApIHsKKworCQkJCQlw
X3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdsb2dEZXB0aEJ1ZkZDJywKKwkJCQkJCTIuMCAvICgg
TWF0aC5sb2coIGNhbWVyYS5mYXIgKyAxLjAgKSAvIE1hdGguTE4yICkgKTsKKworCQkJCX0KKwor
CQkJCS8vIEF2b2lkIHVubmVlZGVkIHVuaWZvcm0gdXBkYXRlcyBwZXIgQXJyYXlDYW1lcmEncyBz
dWItY2FtZXJhCisKKwkJCQlpZiAoIF9jdXJyZW50Q2FtZXJhICE9PSAoIF9jdXJyZW50QXJyYXlD
YW1lcmEgfHwgY2FtZXJhICkgKSB7CisKKwkJCQkJX2N1cnJlbnRDYW1lcmEgPSAoIF9jdXJyZW50
QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7CisKKwkJCQkJLy8gbGlnaHRpbmcgdW5pZm9ybXMgZGVw
ZW5kIG9uIHRoZSBjYW1lcmEgc28gZW5mb3JjZSBhbiB1cGRhdGUKKwkJCQkJLy8gbm93LCBpbiBj
YXNlIHRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgbGlnaHRzIC0gb3IgbGF0ZXIsIHdoZW4KKwkJCQkJ
Ly8gdGhlIG5leHQgbWF0ZXJpYWwgdGhhdCBkb2VzIGdldHMgYWN0aXZhdGVkOgorCisJCQkJCXJl
ZnJlc2hNYXRlcmlhbCA9IHRydWU7CQkvLyBzZXQgdG8gdHJ1ZSBvbiBtYXRlcmlhbCBjaGFuZ2UK
KwkJCQkJcmVmcmVzaExpZ2h0cyA9IHRydWU7CQkvLyByZW1haW5zIHNldCB1bnRpbCB1cGRhdGUg
ZG9uZQorCisJCQkJfQorCisJCQkJLy8gbG9hZCBtYXRlcmlhbCBzcGVjaWZpYyB1bmlmb3Jtcwor
CQkJCS8vIChzaGFkZXIgbWF0ZXJpYWwgYWxzbyBnZXRzIHRoZW0gZm9yIHRoZSBzYWtlIG9mIGdl
bmVyaWNpdHkpCisKKwkJCQlpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHwKKwkJCQkJ
bWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fAorCQkJCQltYXRlcmlhbC5pc01lc2hTdGFu
ZGFyZE1hdGVyaWFsIHx8CisJCQkJCW1hdGVyaWFsLmVudk1hcCApIHsKKworCQkJCQl2YXIgdUNh
bVBvcyA9IHBfdW5pZm9ybXMubWFwLmNhbWVyYVBvc2l0aW9uOworCisJCQkJCWlmICggdUNhbVBv
cyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCQl1Q2FtUG9zLnNldFZhbHVlKCBfZ2wsCisJCQkJ
CQkJX3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKSAp
OworCisJCQkJCX0KKworCQkJCX0KKworCQkJCWlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRl
cmlhbCB8fAorCQkJCQltYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgfHwKKwkJCQkJbWF0
ZXJpYWwuaXNNZXNoQmFzaWNNYXRlcmlhbCB8fAorCQkJCQltYXRlcmlhbC5pc01lc2hTdGFuZGFy
ZE1hdGVyaWFsIHx8CisJCQkJCW1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHwKKwkJCQkJbWF0
ZXJpYWwuc2tpbm5pbmcgKSB7CisKKwkJCQkJcF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndmll
d01hdHJpeCcsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTsKKworCQkJCX0KKworCQkJfQor
CisJCQkvLyBza2lubmluZyB1bmlmb3JtcyBtdXN0IGJlIHNldCBldmVuIGlmIG1hdGVyaWFsIGRp
ZG4ndCBjaGFuZ2UKKwkJCS8vIGF1dG8tc2V0dGluZyBvZiB0ZXh0dXJlIHVuaXQgZm9yIGJvbmUg
dGV4dHVyZSBtdXN0IGdvIGJlZm9yZSBvdGhlciB0ZXh0dXJlcworCQkJLy8gbm90IHN1cmUgd2h5
LCBidXQgb3RoZXJ3aXNlIHdlaXJkIHRoaW5ncyBoYXBwZW4KKworCQkJaWYgKCBtYXRlcmlhbC5z
a2lubmluZyApIHsKKworCQkJCXBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAn
YmluZE1hdHJpeCcgKTsKKwkJCQlwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwg
J2JpbmRNYXRyaXhJbnZlcnNlJyApOworCisJCQkJdmFyIHNrZWxldG9uID0gb2JqZWN0LnNrZWxl
dG9uOworCisJCQkJaWYgKCBza2VsZXRvbiApIHsKKworCQkJCQl2YXIgYm9uZXMgPSBza2VsZXRv
bi5ib25lczsKKworCQkJCQlpZiAoIGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzICkg
eworCisJCQkJCQlpZiAoIHNrZWxldG9uLmJvbmVUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7CisK
KwkJCQkJCQkvLyBsYXlvdXQgKDEgbWF0cml4ID0gNCBwaXhlbHMpCisJCQkJCQkJLy8gICAgICBS
R0JBIFJHQkEgUkdCQSBSR0JBICg9PiBjb2x1bW4xLCBjb2x1bW4yLCBjb2x1bW4zLCBjb2x1bW40
KQorCQkJCQkJCS8vICB3aXRoICA4eDggIHBpeGVsIHRleHR1cmUgbWF4ICAgMTYgYm9uZXMgKiA0
IHBpeGVscyA9ICAoOCAqIDgpCisJCQkJCQkJLy8gICAgICAgMTZ4MTYgcGl4ZWwgdGV4dHVyZSBt
YXggICA2NCBib25lcyAqIDQgcGl4ZWxzID0gKDE2ICogMTYpCisJCQkJCQkJLy8gICAgICAgMzJ4
MzIgcGl4ZWwgdGV4dHVyZSBtYXggIDI1NiBib25lcyAqIDQgcGl4ZWxzID0gKDMyICogMzIpCisJ
CQkJCQkJLy8gICAgICAgNjR4NjQgcGl4ZWwgdGV4dHVyZSBtYXggMTAyNCBib25lcyAqIDQgcGl4
ZWxzID0gKDY0ICogNjQpCisKKworCQkJCQkJCXZhciBzaXplID0gTWF0aC5zcXJ0KCBib25lcy5s
ZW5ndGggKiA0ICk7IC8vIDQgcGl4ZWxzIG5lZWRlZCBmb3IgMSBtYXRyaXgKKwkJCQkJCQlzaXpl
ID0gX01hdGgubmV4dFBvd2VyT2ZUd28oIE1hdGguY2VpbCggc2l6ZSApICk7CisJCQkJCQkJc2l6
ZSA9IE1hdGgubWF4KCBzaXplLCA0ICk7CisKKwkJCQkJCQl2YXIgYm9uZU1hdHJpY2VzID0gbmV3
IEZsb2F0MzJBcnJheSggc2l6ZSAqIHNpemUgKiA0ICk7IC8vIDQgZmxvYXRzIHBlciBSR0JBIHBp
eGVsCisJCQkJCQkJYm9uZU1hdHJpY2VzLnNldCggc2tlbGV0b24uYm9uZU1hdHJpY2VzICk7IC8v
IGNvcHkgY3VycmVudCB2YWx1ZXMKKworCQkJCQkJCXZhciBib25lVGV4dHVyZSA9IG5ldyBEYXRh
VGV4dHVyZSggYm9uZU1hdHJpY2VzLCBzaXplLCBzaXplLCBSR0JBRm9ybWF0LCBGbG9hdFR5cGUg
KTsKKworCQkJCQkJCXNrZWxldG9uLmJvbmVNYXRyaWNlcyA9IGJvbmVNYXRyaWNlczsKKwkJCQkJ
CQlza2VsZXRvbi5ib25lVGV4dHVyZSA9IGJvbmVUZXh0dXJlOworCQkJCQkJCXNrZWxldG9uLmJv
bmVUZXh0dXJlU2l6ZSA9IHNpemU7CisKKwkJCQkJCX0KKworCQkJCQkJcF91bmlmb3Jtcy5zZXRW
YWx1ZSggX2dsLCAnYm9uZVRleHR1cmUnLCBza2VsZXRvbi5ib25lVGV4dHVyZSApOworCQkJCQkJ
cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmVTaXplJywgc2tlbGV0b24uYm9u
ZVRleHR1cmVTaXplICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJcF91bmlmb3Jtcy5zZXRP
cHRpb25hbCggX2dsLCBza2VsZXRvbiwgJ2JvbmVNYXRyaWNlcycgKTsKKworCQkJCQl9CisKKwkJ
CQl9CisKKwkJCX0KKworCQkJaWYgKCByZWZyZXNoTWF0ZXJpYWwgKSB7CisKKwkJCQlwX3VuaWZv
cm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ0V4cG9zdXJlJywgX3RoaXMudG9uZU1hcHBp
bmdFeHBvc3VyZSApOworCQkJCXBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5n
V2hpdGVQb2ludCcsIF90aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludCApOworCisJCQkJaWYgKCBt
YXRlcmlhbC5saWdodHMgKSB7CisKKwkJCQkJLy8gdGhlIGN1cnJlbnQgbWF0ZXJpYWwgcmVxdWly
ZXMgbGlnaHRpbmcgaW5mbworCisJCQkJCS8vIG5vdGU6IGFsbCBsaWdodGluZyB1bmlmb3JtcyBh
cmUgYWx3YXlzIHNldCBjb3JyZWN0bHkKKwkJCQkJLy8gdGhleSBzaW1wbHkgcmVmZXJlbmNlIHRo
ZSByZW5kZXJlcidzIHN0YXRlIGZvciB0aGVpcgorCQkJCQkvLyB2YWx1ZXMKKwkJCQkJLy8KKwkJ
CQkJLy8gdXNlIHRoZSBjdXJyZW50IG1hdGVyaWFsJ3MgLm5lZWRzVXBkYXRlIGZsYWdzIHRvIHNl
dAorCQkJCQkvLyB0aGUgR0wgc3RhdGUgd2hlbiByZXF1aXJlZAorCisJCQkJCW1hcmtVbmlmb3Jt
c0xpZ2h0c05lZWRzVXBkYXRlKCBtX3VuaWZvcm1zLCByZWZyZXNoTGlnaHRzICk7CisKKwkJCQl9
CisKKwkJCQkvLyByZWZyZXNoIHVuaWZvcm1zIGNvbW1vbiB0byBzZXZlcmFsIG1hdGVyaWFscwor
CisJCQkJaWYgKCBmb2cgJiYgbWF0ZXJpYWwuZm9nICkgeworCisJCQkJCXJlZnJlc2hVbmlmb3Jt
c0ZvZyggbV91bmlmb3JtcywgZm9nICk7CisKKwkJCQl9CisKKwkJCQlpZiAoIG1hdGVyaWFsLmlz
TWVzaEJhc2ljTWF0ZXJpYWwgfHwKKwkJCQkJbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFs
IHx8CisJCQkJCW1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHwKKwkJCQkJbWF0ZXJpYWwu
aXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fAorCQkJCQltYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRl
cmlhbCB8fAorCQkJCQltYXRlcmlhbC5pc01lc2hEZXB0aE1hdGVyaWFsICkgeworCisJCQkJCXJl
ZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKKworCQkJCX0KKwor
CQkJCS8vIHJlZnJlc2ggc2luZ2xlIG1hdGVyaWFsIHNwZWNpZmljIHVuaWZvcm1zCisKKwkJCQlp
ZiAoIG1hdGVyaWFsLmlzTGluZUJhc2ljTWF0ZXJpYWwgKSB7CisKKwkJCQkJcmVmcmVzaFVuaWZv
cm1zTGluZSggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKKworCQkJCX0gZWxzZSBpZiAoIG1hdGVy
aWFsLmlzTGluZURhc2hlZE1hdGVyaWFsICkgeworCisJCQkJCXJlZnJlc2hVbmlmb3Jtc0xpbmUo
IG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CisJCQkJCXJlZnJlc2hVbmlmb3Jtc0Rhc2goIG1fdW5p
Zm9ybXMsIG1hdGVyaWFsICk7CisKKwkJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1BvaW50c01h
dGVyaWFsICkgeworCisJCQkJCXJlZnJlc2hVbmlmb3Jtc1BvaW50cyggbV91bmlmb3JtcywgbWF0
ZXJpYWwgKTsKKworCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlh
bCApIHsKKworCQkJCQlyZWZyZXNoVW5pZm9ybXNMYW1iZXJ0KCBtX3VuaWZvcm1zLCBtYXRlcmlh
bCApOworCisJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsICkgewor
CisJCQkJCXJlZnJlc2hVbmlmb3Jtc1Rvb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CisKKwkJ
CQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsICkgeworCisJCQkJCXJl
ZnJlc2hVbmlmb3Jtc1Bob25nKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOworCisJCQkJfSBlbHNl
IGlmICggbWF0ZXJpYWwuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCApIHsKKworCQkJCQlyZWZyZXNo
VW5pZm9ybXNQaHlzaWNhbCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKKworCQkJCX0gZWxzZSBp
ZiAoIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgKSB7CisKKwkJCQkJcmVmcmVzaFVu
aWZvcm1zU3RhbmRhcmQoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CisKKwkJCQl9IGVsc2UgaWYg
KCBtYXRlcmlhbC5pc01lc2hEZXB0aE1hdGVyaWFsICkgeworCisJCQkJCWlmICggbWF0ZXJpYWwu
ZGlzcGxhY2VtZW50TWFwICkgeworCisJCQkJCQltX3VuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52
YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDsKKwkJCQkJCW1fdW5pZm9ybXMuZGlzcGxh
Y2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTsKKwkJCQkJCW1f
dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJp
YXM7CisKKwkJCQkJfQorCisJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTm9ybWFsTWF0
ZXJpYWwgKSB7CisKKwkJCQkJcmVmcmVzaFVuaWZvcm1zTm9ybWFsKCBtX3VuaWZvcm1zLCBtYXRl
cmlhbCApOworCisJCQkJfQorCisJCQkJLy8gUmVjdEFyZWFMaWdodCBUZXh0dXJlCisJCQkJLy8g
VE9ETyAobXJkb29iKTogRmluZCBhIG5pY2VyIGltcGxlbWVudGF0aW9uCisKKwkJCQlpZiAoIG1f
dW5pZm9ybXMubHRjTWF0ICE9PSB1bmRlZmluZWQgKSBtX3VuaWZvcm1zLmx0Y01hdC52YWx1ZSA9
IFVuaWZvcm1zTGliLkxUQ19NQVRfVEVYVFVSRTsKKwkJCQlpZiAoIG1fdW5pZm9ybXMubHRjTWFn
ICE9PSB1bmRlZmluZWQgKSBtX3VuaWZvcm1zLmx0Y01hZy52YWx1ZSA9IFVuaWZvcm1zTGliLkxU
Q19NQUdfVEVYVFVSRTsKKworCQkJCVdlYkdMVW5pZm9ybXMudXBsb2FkKAorCQkJCQlfZ2wsIG1h
dGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QsIG1fdW5pZm9ybXMsIF90aGlzICk7CisKKwkJ
CX0KKworCisJCQkvLyBjb21tb24gbWF0cmljZXMKKworCQkJcF91bmlmb3Jtcy5zZXRWYWx1ZSgg
X2dsLCAnbW9kZWxWaWV3TWF0cml4Jywgb2JqZWN0Lm1vZGVsVmlld01hdHJpeCApOworCQkJcF91
bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbm9ybWFsTWF0cml4Jywgb2JqZWN0Lm5vcm1hbE1hdHJp
eCApOworCQkJcF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxNYXRyaXgnLCBvYmplY3Qu
bWF0cml4V29ybGQgKTsKKworCQkJcmV0dXJuIHByb2dyYW07CisKKwkJfQorCisJCS8vIFVuaWZv
cm1zIChyZWZyZXNoIHVuaWZvcm1zIG9iamVjdHMpCisKKwkJZnVuY3Rpb24gcmVmcmVzaFVuaWZv
cm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7CisKKwkJCXVuaWZvcm1zLm9wYWNpdHku
dmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5OworCisJCQl1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0g
bWF0ZXJpYWwuY29sb3I7CisKKwkJCWlmICggbWF0ZXJpYWwuZW1pc3NpdmUgKSB7CisKKwkJCQl1
bmlmb3Jtcy5lbWlzc2l2ZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5lbWlzc2l2ZSApLm11bHRpcGx5
U2NhbGFyKCBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSApOworCisJCQl9CisKKwkJCXVuaWZv
cm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDsKKwkJCXVuaWZvcm1zLnNwZWN1bGFyTWFwLnZh
bHVlID0gbWF0ZXJpYWwuc3BlY3VsYXJNYXA7CisJCQl1bmlmb3Jtcy5hbHBoYU1hcC52YWx1ZSA9
IG1hdGVyaWFsLmFscGhhTWFwOworCisJCQlpZiAoIG1hdGVyaWFsLmxpZ2h0TWFwICkgeworCisJ
CQkJdW5pZm9ybXMubGlnaHRNYXAudmFsdWUgPSBtYXRlcmlhbC5saWdodE1hcDsKKwkJCQl1bmlm
b3Jtcy5saWdodE1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5
OworCisJCQl9CisKKwkJCWlmICggbWF0ZXJpYWwuYW9NYXAgKSB7CisKKwkJCQl1bmlmb3Jtcy5h
b01hcC52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwOworCQkJCXVuaWZvcm1zLmFvTWFwSW50ZW5zaXR5
LnZhbHVlID0gbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHk7CisKKwkJCX0KKworCQkJLy8gdXYgcmVw
ZWF0IGFuZCBvZmZzZXQgc2V0dGluZyBwcmlvcml0aWVzCisJCQkvLyAxLiBjb2xvciBtYXAKKwkJ
CS8vIDIuIHNwZWN1bGFyIG1hcAorCQkJLy8gMy4gbm9ybWFsIG1hcAorCQkJLy8gNC4gYnVtcCBt
YXAKKwkJCS8vIDUuIGFscGhhIG1hcAorCQkJLy8gNi4gZW1pc3NpdmUgbWFwCisKKwkJCXZhciB1
dlNjYWxlTWFwOworCisJCQlpZiAoIG1hdGVyaWFsLm1hcCApIHsKKworCQkJCXV2U2NhbGVNYXAg
PSBtYXRlcmlhbC5tYXA7CisKKwkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkg
eworCisJCQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwOworCisJCQl9IGVsc2Ug
aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7CisKKwkJCQl1dlNjYWxlTWFwID0gbWF0
ZXJpYWwuZGlzcGxhY2VtZW50TWFwOworCisJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5ub3JtYWxN
YXAgKSB7CisKKwkJCQl1dlNjYWxlTWFwID0gbWF0ZXJpYWwubm9ybWFsTWFwOworCisJCQl9IGVs
c2UgaWYgKCBtYXRlcmlhbC5idW1wTWFwICkgeworCisJCQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFs
LmJ1bXBNYXA7CisKKwkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHsKKwor
CQkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7CisKKwkJCX0gZWxzZSBpZiAo
IG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHsKKworCQkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5t
ZXRhbG5lc3NNYXA7CisKKwkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkgeworCisJ
CQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFsLmFscGhhTWFwOworCisJCQl9IGVsc2UgaWYgKCBtYXRl
cmlhbC5lbWlzc2l2ZU1hcCApIHsKKworCQkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5lbWlzc2l2
ZU1hcDsKKworCQkJfQorCisJCQlpZiAoIHV2U2NhbGVNYXAgIT09IHVuZGVmaW5lZCApIHsKKwor
CQkJCS8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisJCQkJaWYgKCB1dlNjYWxlTWFwLmlzV2Vi
R0xSZW5kZXJUYXJnZXQgKSB7CisKKwkJCQkJdXZTY2FsZU1hcCA9IHV2U2NhbGVNYXAudGV4dHVy
ZTsKKworCQkJCX0KKworCQkJCXZhciBvZmZzZXQgPSB1dlNjYWxlTWFwLm9mZnNldDsKKwkJCQl2
YXIgcmVwZWF0ID0gdXZTY2FsZU1hcC5yZXBlYXQ7CisKKwkJCQl1bmlmb3Jtcy5vZmZzZXRSZXBl
YXQudmFsdWUuc2V0KCBvZmZzZXQueCwgb2Zmc2V0LnksIHJlcGVhdC54LCByZXBlYXQueSApOwor
CisJCQl9CisKKwkJCXVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDsKKwor
CQkJLy8gZG9uJ3QgZmxpcCBDdWJlVGV4dHVyZSBlbnZNYXBzLCBmbGlwIGV2ZXJ5dGhpbmcgZWxz
ZToKKwkJCS8vICBXZWJHTFJlbmRlclRhcmdldEN1YmUgd2lsbCBiZSBmbGlwcGVkIGZvciBiYWNr
d2FyZHMgY29tcGF0aWJpbGl0eQorCQkJLy8gIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJl
IHdpbGwgYmUgZmxpcHBlZCBiZWNhdXNlIGl0J3MgYSBUZXh0dXJlIGFuZCBOT1QgYSBDdWJlVGV4
dHVyZQorCQkJLy8gdGhpcyBjaGVjayBtdXN0IGJlIGhhbmRsZWQgZGlmZmVyZW50bHksIG9yIHJl
bW92ZWQgZW50aXJlbHksIGlmIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSB1c2VzIGEgQ3ViZVRleHR1
cmUgaW4gdGhlIGZ1dHVyZQorCQkJdW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZSA9ICggISAoIG1h
dGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAuaXNDdWJlVGV4dHVyZSApICkgPyAxIDog
LSAxOworCisJCQl1bmlmb3Jtcy5yZWZsZWN0aXZpdHkudmFsdWUgPSBtYXRlcmlhbC5yZWZsZWN0
aXZpdHk7CisJCQl1bmlmb3Jtcy5yZWZyYWN0aW9uUmF0aW8udmFsdWUgPSBtYXRlcmlhbC5yZWZy
YWN0aW9uUmF0aW87CisKKwkJfQorCisJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xpbmUoIHVu
aWZvcm1zLCBtYXRlcmlhbCApIHsKKworCQkJdW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVy
aWFsLmNvbG9yOworCQkJdW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7
CisKKwkJfQorCisJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rhc2goIHVuaWZvcm1zLCBtYXRl
cmlhbCApIHsKKworCQkJdW5pZm9ybXMuZGFzaFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6
ZTsKKwkJCXVuaWZvcm1zLnRvdGFsU2l6ZS52YWx1ZSA9IG1hdGVyaWFsLmRhc2hTaXplICsgbWF0
ZXJpYWwuZ2FwU2l6ZTsKKwkJCXVuaWZvcm1zLnNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuc2NhbGU7
CisKKwkJfQorCisJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggdW5pZm9ybXMsIG1h
dGVyaWFsICkgeworCisJCQl1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7
CisJCQl1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTsKKwkJCXVuaWZv
cm1zLnNpemUudmFsdWUgPSBtYXRlcmlhbC5zaXplICogX3BpeGVsUmF0aW87CisJCQl1bmlmb3Jt
cy5zY2FsZS52YWx1ZSA9IF9oZWlnaHQgKiAwLjU7CisKKwkJCXVuaWZvcm1zLm1hcC52YWx1ZSA9
IG1hdGVyaWFsLm1hcDsKKworCQkJaWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7CisKKwkJ
CQl2YXIgb2Zmc2V0ID0gbWF0ZXJpYWwubWFwLm9mZnNldDsKKwkJCQl2YXIgcmVwZWF0ID0gbWF0
ZXJpYWwubWFwLnJlcGVhdDsKKworCQkJCXVuaWZvcm1zLm9mZnNldFJlcGVhdC52YWx1ZS5zZXQo
IG9mZnNldC54LCBvZmZzZXQueSwgcmVwZWF0LngsIHJlcGVhdC55ICk7CisKKwkJCX0KKworCQl9
CisKKwkJZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRm9nKCB1bmlmb3JtcywgZm9nICkgeworCisJ
CQl1bmlmb3Jtcy5mb2dDb2xvci52YWx1ZSA9IGZvZy5jb2xvcjsKKworCQkJaWYgKCBmb2cuaXNG
b2cgKSB7CisKKwkJCQl1bmlmb3Jtcy5mb2dOZWFyLnZhbHVlID0gZm9nLm5lYXI7CisJCQkJdW5p
Zm9ybXMuZm9nRmFyLnZhbHVlID0gZm9nLmZhcjsKKworCQkJfSBlbHNlIGlmICggZm9nLmlzRm9n
RXhwMiApIHsKKworCQkJCXVuaWZvcm1zLmZvZ0RlbnNpdHkudmFsdWUgPSBmb2cuZGVuc2l0eTsK
KworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMYW1iZXJ0KCB1bmlm
b3JtcywgbWF0ZXJpYWwgKSB7CisKKwkJCWlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7CisK
KwkJCQl1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwOwor
CisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3Jt
cywgbWF0ZXJpYWwgKSB7CisKKwkJCXVuaWZvcm1zLnNwZWN1bGFyLnZhbHVlID0gbWF0ZXJpYWwu
c3BlY3VsYXI7CisJCQl1bmlmb3Jtcy5zaGluaW5lc3MudmFsdWUgPSBNYXRoLm1heCggbWF0ZXJp
YWwuc2hpbmluZXNzLCAxZS00ICk7IC8vIHRvIHByZXZlbnQgcG93KCAwLjAsIDAuMCApCisKKwkJ
CWlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7CisKKwkJCQl1bmlmb3Jtcy5lbWlzc2l2ZU1h
cC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwOworCisJCQl9CisKKwkJCWlmICggbWF0ZXJp
YWwuYnVtcE1hcCApIHsKKworCQkJCXVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5i
dW1wTWFwOworCQkJCXVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2Fs
ZTsKKworCQkJfQorCisJCQlpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHsKKworCQkJCXVuaWZv
cm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDsKKwkJCQl1bmlmb3Jtcy5u
b3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApOworCisJCQl9CisK
KwkJCWlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkgeworCisJCQkJdW5pZm9ybXMuZGlz
cGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwOworCQkJCXVuaWZv
cm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7
CisJCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNl
bWVudEJpYXM7CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zVG9v
biggdW5pZm9ybXMsIG1hdGVyaWFsICkgeworCisJCQlyZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5p
Zm9ybXMsIG1hdGVyaWFsICk7CisKKwkJCWlmICggbWF0ZXJpYWwuZ3JhZGllbnRNYXAgKSB7CisK
KwkJCQl1bmlmb3Jtcy5ncmFkaWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmdyYWRpZW50TWFwOwor
CisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlm
b3JtcywgbWF0ZXJpYWwgKSB7CisKKwkJCXVuaWZvcm1zLnJvdWdobmVzcy52YWx1ZSA9IG1hdGVy
aWFsLnJvdWdobmVzczsKKwkJCXVuaWZvcm1zLm1ldGFsbmVzcy52YWx1ZSA9IG1hdGVyaWFsLm1l
dGFsbmVzczsKKworCQkJaWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgKSB7CisKKwkJCQl1bmlm
b3Jtcy5yb3VnaG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7CisKKwkJCX0K
KworCQkJaWYgKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgKSB7CisKKwkJCQl1bmlmb3Jtcy5tZXRh
bG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7CisKKwkJCX0KKworCQkJaWYg
KCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHsKKworCQkJCXVuaWZvcm1zLmVtaXNzaXZlTWFwLnZh
bHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7CisKKwkJCX0KKworCQkJaWYgKCBtYXRlcmlhbC5i
dW1wTWFwICkgeworCisJCQkJdW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBN
YXA7CisJCQkJdW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlOwor
CisJCQl9CisKKwkJCWlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkgeworCisJCQkJdW5pZm9ybXMu
bm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwOworCQkJCXVuaWZvcm1zLm5vcm1h
bFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7CisKKwkJCX0KKworCQkJ
aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7CisKKwkJCQl1bmlmb3Jtcy5kaXNwbGFj
ZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7CisJCQkJdW5pZm9ybXMu
ZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTsKKwkJ
CQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50
QmlhczsKKworCQkJfQorCisJCQlpZiAoIG1hdGVyaWFsLmVudk1hcCApIHsKKworCQkJCS8vdW5p
Zm9ybXMuZW52TWFwLnZhbHVlID0gbWF0ZXJpYWwuZW52TWFwOyAvLyBwYXJ0IG9mIHVuaWZvcm1z
IGNvbW1vbgorCQkJCXVuaWZvcm1zLmVudk1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmVu
dk1hcEludGVuc2l0eTsKKworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiByZWZyZXNoVW5pZm9y
bXNQaHlzaWNhbCggdW5pZm9ybXMsIG1hdGVyaWFsICkgeworCisJCQl1bmlmb3Jtcy5jbGVhckNv
YXQudmFsdWUgPSBtYXRlcmlhbC5jbGVhckNvYXQ7CisJCQl1bmlmb3Jtcy5jbGVhckNvYXRSb3Vn
aG5lc3MudmFsdWUgPSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3M7CisKKwkJCXJlZnJlc2hV
bmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTsKKworCQl9CisKKwkJZnVuY3Rp
b24gcmVmcmVzaFVuaWZvcm1zTm9ybWFsKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7CisKKwkJCWlm
ICggbWF0ZXJpYWwuYnVtcE1hcCApIHsKKworCQkJCXVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBt
YXRlcmlhbC5idW1wTWFwOworCQkJCXVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFs
LmJ1bXBTY2FsZTsKKworCQkJfQorCisJCQlpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHsKKwor
CQkJCXVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDsKKwkJCQl1
bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApOwor
CisJCQl9CisKKwkJCWlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkgeworCisJCQkJdW5p
Zm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwOwor
CQkJCXVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2Vt
ZW50U2NhbGU7CisJCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFs
LmRpc3BsYWNlbWVudEJpYXM7CisKKwkJCX0KKworCQl9CisKKwkJLy8gSWYgdW5pZm9ybXMgYXJl
IG1hcmtlZCBhcyBjbGVhbiwgdGhleSBkb24ndCBuZWVkIHRvIGJlIGxvYWRlZCB0byB0aGUgR1BV
LgorCisJCWZ1bmN0aW9uIG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCB1bmlmb3Jtcywg
dmFsdWUgKSB7CisKKwkJCXVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlID0g
dmFsdWU7CisKKwkJCXVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFs
dWU7CisJCQl1bmlmb3Jtcy5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlOworCQkJdW5p
Zm9ybXMuc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlOworCQkJdW5pZm9ybXMucmVjdEFy
ZWFMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTsKKwkJCXVuaWZvcm1zLmhlbWlzcGhlcmVMaWdo
dHMubmVlZHNVcGRhdGUgPSB2YWx1ZTsKKworCQl9CisKKwkJLy8gTGlnaHRpbmcKKworCQlmdW5j
dGlvbiBzZXR1cFNoYWRvd3MoIGxpZ2h0cyApIHsKKworCQkJdmFyIGxpZ2h0U2hhZG93c0xlbmd0
aCA9IDA7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBp
ICsrICkgeworCisJCQkJdmFyIGxpZ2h0ID0gbGlnaHRzWyBpIF07CisKKwkJCQlpZiAoIGxpZ2h0
LmNhc3RTaGFkb3cgKSB7CisKKwkJCQkJX2xpZ2h0cy5zaGFkb3dzWyBsaWdodFNoYWRvd3NMZW5n
dGggXSA9IGxpZ2h0OworCQkJCQlsaWdodFNoYWRvd3NMZW5ndGggKys7CisKKwkJCQl9CisKKwkJ
CX0KKworCQkJX2xpZ2h0cy5zaGFkb3dzLmxlbmd0aCA9IGxpZ2h0U2hhZG93c0xlbmd0aDsKKwor
CQl9CisKKwkJZnVuY3Rpb24gc2V0dXBMaWdodHMoIGxpZ2h0cywgY2FtZXJhICkgeworCisJCQl2
YXIgbCwgbGwsIGxpZ2h0LCBzaGFkb3csCisJCQkJciA9IDAsIGcgPSAwLCBiID0gMCwKKwkJCQlj
b2xvciwKKwkJCQlpbnRlbnNpdHksCisJCQkJZGlzdGFuY2UsCisJCQkJc2hhZG93TWFwLAorCisJ
CQkJdmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsCisKKwkJCQlkaXJlY3Rp
b25hbExlbmd0aCA9IDAsCisJCQkJcG9pbnRMZW5ndGggPSAwLAorCQkJCXNwb3RMZW5ndGggPSAw
LAorCQkJCXJlY3RBcmVhTGVuZ3RoID0gMCwKKwkJCQloZW1pTGVuZ3RoID0gMDsKKworCQkJZm9y
ICggbCA9IDAsIGxsID0gbGlnaHRzLmxlbmd0aDsgbCA8IGxsOyBsICsrICkgeworCisJCQkJbGln
aHQgPSBsaWdodHNbIGwgXTsKKworCQkJCWNvbG9yID0gbGlnaHQuY29sb3I7CisJCQkJaW50ZW5z
aXR5ID0gbGlnaHQuaW50ZW5zaXR5OworCQkJCWRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7CisK
KwkJCQlzaGFkb3dNYXAgPSAoIGxpZ2h0LnNoYWRvdyAmJiBsaWdodC5zaGFkb3cubWFwICkgPyBs
aWdodC5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsOworCisJCQkJaWYgKCBsaWdodC5pc0FtYmll
bnRMaWdodCApIHsKKworCQkJCQlyICs9IGNvbG9yLnIgKiBpbnRlbnNpdHk7CisJCQkJCWcgKz0g
Y29sb3IuZyAqIGludGVuc2l0eTsKKwkJCQkJYiArPSBjb2xvci5iICogaW50ZW5zaXR5OworCisJ
CQkJfSBlbHNlIGlmICggbGlnaHQuaXNEaXJlY3Rpb25hbExpZ2h0ICkgeworCisJCQkJCXZhciB1
bmlmb3JtcyA9IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApOworCisJCQkJCXVuaWZvcm1zLmNvbG9y
LmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApOwor
CQkJCQl1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRy
aXhXb3JsZCApOworCQkJCQlfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRh
cmdldC5tYXRyaXhXb3JsZCApOworCQkJCQl1bmlmb3Jtcy5kaXJlY3Rpb24uc3ViKCBfdmVjdG9y
MyApOworCQkJCQl1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0
cml4ICk7CisKKwkJCQkJdW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdzsKKworCQkJ
CQlpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7CisKKwkJCQkJCXNoYWRvdyA9IGxpZ2h0LnNoYWRv
dzsKKworCQkJCQkJdW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzOworCQkJCQkJdW5p
Zm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1czsKKwkJCQkJCXVuaWZvcm1zLnNoYWRv
d01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTsKKworCQkJCQl9CisKKwkJCQkJX2xpZ2h0cy5kaXJl
Y3Rpb25hbFNoYWRvd01hcFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHNoYWRvd01hcDsKKwkJCQkJ
X2xpZ2h0cy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IGxp
Z2h0LnNoYWRvdy5tYXRyaXg7CisJCQkJCV9saWdodHMuZGlyZWN0aW9uYWxbIGRpcmVjdGlvbmFs
TGVuZ3RoIF0gPSB1bmlmb3JtczsKKworCQkJCQlkaXJlY3Rpb25hbExlbmd0aCArKzsKKworCQkJ
CX0gZWxzZSBpZiAoIGxpZ2h0LmlzU3BvdExpZ2h0ICkgeworCisJCQkJCXZhciB1bmlmb3JtcyA9
IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApOworCisJCQkJCXVuaWZvcm1zLnBvc2l0aW9uLnNldEZy
b21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKKwkJCQkJdW5pZm9ybXMucG9z
aXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7CisKKwkJCQkJdW5pZm9ybXMuY29sb3Iu
Y29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7CisJCQkJCXVuaWZvcm1z
LmRpc3RhbmNlID0gZGlzdGFuY2U7CisKKwkJCQkJdW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21N
YXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKKwkJCQkJX3ZlY3RvcjMuc2V0RnJv
bU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTsKKwkJCQkJdW5pZm9y
bXMuZGlyZWN0aW9uLnN1YiggX3ZlY3RvcjMgKTsKKwkJCQkJdW5pZm9ybXMuZGlyZWN0aW9uLnRy
YW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApOworCisJCQkJCXVuaWZvcm1zLmNvbmVDb3Mg
PSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKTsKKwkJCQkJdW5pZm9ybXMucGVudW1icmFDb3MgPSBN
YXRoLmNvcyggbGlnaHQuYW5nbGUgKiAoIDEgLSBsaWdodC5wZW51bWJyYSApICk7CisJCQkJCXVu
aWZvcm1zLmRlY2F5ID0gKCBsaWdodC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVj
YXk7CisKKwkJCQkJdW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdzsKKworCQkJCQlp
ZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7CisKKwkJCQkJCXNoYWRvdyA9IGxpZ2h0LnNoYWRvdzsK
KworCQkJCQkJdW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzOworCQkJCQkJdW5pZm9y
bXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1czsKKwkJCQkJCXVuaWZvcm1zLnNoYWRvd01h
cFNpemUgPSBzaGFkb3cubWFwU2l6ZTsKKworCQkJCQl9CisKKwkJCQkJX2xpZ2h0cy5zcG90U2hh
ZG93TWFwWyBzcG90TGVuZ3RoIF0gPSBzaGFkb3dNYXA7CisJCQkJCV9saWdodHMuc3BvdFNoYWRv
d01hdHJpeFsgc3BvdExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDsKKwkJCQkJX2xpZ2h0
cy5zcG90WyBzcG90TGVuZ3RoIF0gPSB1bmlmb3JtczsKKworCQkJCQlzcG90TGVuZ3RoICsrOwor
CisJCQkJfSBlbHNlIGlmICggbGlnaHQuaXNSZWN0QXJlYUxpZ2h0ICkgeworCisJCQkJCXZhciB1
bmlmb3JtcyA9IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApOworCisJCQkJCS8vIChhKSBpbnRlbnNp
dHkgY29udHJvbHMgaXJyYWRpYW5jZSBvZiBlbnRpcmUgbGlnaHQKKwkJCQkJdW5pZm9ybXMuY29s
b3IKKwkJCQkJCS5jb3B5KCBjb2xvciApCisJCQkJCQkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0
eSAvICggbGlnaHQud2lkdGggKiBsaWdodC5oZWlnaHQgKSApOworCisJCQkJCS8vIChiKSBpbnRl
bnNpdHkgY29udHJvbHMgdGhlIHJhZGlhbmNlIHBlciBsaWdodCBhcmVhCisJCQkJCS8vIHVuaWZv
cm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApOworCisJ
CQkJCXVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4
V29ybGQgKTsKKwkJCQkJdW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4
ICk7CisKKwkJCQkJLy8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUg
d2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9ycworCQkJCQlfbWF0cml4NDIuaWRlbnRpdHkoKTsKKwkJ
CQkJX21hdHJpeDQuY29weSggbGlnaHQubWF0cml4V29ybGQgKTsKKwkJCQkJX21hdHJpeDQucHJl
bXVsdGlwbHkoIHZpZXdNYXRyaXggKTsKKwkJCQkJX21hdHJpeDQyLmV4dHJhY3RSb3RhdGlvbigg
X21hdHJpeDQgKTsKKworCQkJCQl1bmlmb3Jtcy5oYWxmV2lkdGguc2V0KCBsaWdodC53aWR0aCAq
IDAuNSwgICAgICAgICAgICAgICAgMC4wLCAwLjAgKTsKKwkJCQkJdW5pZm9ybXMuaGFsZkhlaWdo
dC5zZXQoICAgICAgICAgICAgICAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7CisKKwkJ
CQkJdW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggX21hdHJpeDQyICk7CisJCQkJCXVu
aWZvcm1zLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KCBfbWF0cml4NDIgKTsKKworCQkJCQkvLyBU
T0RPIChhYmVsbmF0aW9uKTogUmVjdEFyZWFMaWdodCBkaXN0YW5jZT8KKwkJCQkJLy8gdW5pZm9y
bXMuZGlzdGFuY2UgPSBkaXN0YW5jZTsKKworCQkJCQlfbGlnaHRzLnJlY3RBcmVhWyByZWN0QXJl
YUxlbmd0aCBdID0gdW5pZm9ybXM7CisKKwkJCQkJcmVjdEFyZWFMZW5ndGggKys7CisKKwkJCQl9
IGVsc2UgaWYgKCBsaWdodC5pc1BvaW50TGlnaHQgKSB7CisKKwkJCQkJdmFyIHVuaWZvcm1zID0g
bGlnaHRDYWNoZS5nZXQoIGxpZ2h0ICk7CisKKwkJCQkJdW5pZm9ybXMucG9zaXRpb24uc2V0RnJv
bU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApOworCQkJCQl1bmlmb3Jtcy5wb3Np
dGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTsKKworCQkJCQl1bmlmb3Jtcy5jb2xvci5j
b3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBsaWdodC5pbnRlbnNpdHkgKTsKKwkJ
CQkJdW5pZm9ybXMuZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTsKKwkJCQkJdW5pZm9ybXMuZGVj
YXkgPSAoIGxpZ2h0LmRpc3RhbmNlID09PSAwICkgPyAwLjAgOiBsaWdodC5kZWNheTsKKworCQkJ
CQl1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93OworCisJCQkJCWlmICggbGlnaHQu
Y2FzdFNoYWRvdyApIHsKKworCQkJCQkJc2hhZG93ID0gbGlnaHQuc2hhZG93OworCisJCQkJCQl1
bmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7CisJCQkJCQl1bmlmb3Jtcy5zaGFkb3dS
YWRpdXMgPSBzaGFkb3cucmFkaXVzOworCQkJCQkJdW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNo
YWRvdy5tYXBTaXplOworCisJCQkJCX0KKworCQkJCQlfbGlnaHRzLnBvaW50U2hhZG93TWFwWyBw
b2ludExlbmd0aCBdID0gc2hhZG93TWFwOworCQkJCQlfbGlnaHRzLnBvaW50U2hhZG93TWF0cml4
WyBwb2ludExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDsKKwkJCQkJX2xpZ2h0cy5wb2lu
dFsgcG9pbnRMZW5ndGggXSA9IHVuaWZvcm1zOworCisJCQkJCXBvaW50TGVuZ3RoICsrOworCisJ
CQkJfSBlbHNlIGlmICggbGlnaHQuaXNIZW1pc3BoZXJlTGlnaHQgKSB7CisKKwkJCQkJdmFyIHVu
aWZvcm1zID0gbGlnaHRDYWNoZS5nZXQoIGxpZ2h0ICk7CisKKwkJCQkJdW5pZm9ybXMuZGlyZWN0
aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKKwkJCQkJdW5p
Zm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApOworCQkJCQl1
bmlmb3Jtcy5kaXJlY3Rpb24ubm9ybWFsaXplKCk7CisKKwkJCQkJdW5pZm9ybXMuc2t5Q29sb3Iu
Y29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7CisJCQkJCXVu
aWZvcm1zLmdyb3VuZENvbG9yLmNvcHkoIGxpZ2h0Lmdyb3VuZENvbG9yICkubXVsdGlwbHlTY2Fs
YXIoIGludGVuc2l0eSApOworCisJCQkJCV9saWdodHMuaGVtaVsgaGVtaUxlbmd0aCBdID0gdW5p
Zm9ybXM7CisKKwkJCQkJaGVtaUxlbmd0aCArKzsKKworCQkJCX0KKworCQkJfQorCisJCQlfbGln
aHRzLmFtYmllbnRbIDAgXSA9IHI7CisJCQlfbGlnaHRzLmFtYmllbnRbIDEgXSA9IGc7CisJCQlf
bGlnaHRzLmFtYmllbnRbIDIgXSA9IGI7CisKKwkJCV9saWdodHMuZGlyZWN0aW9uYWwubGVuZ3Ro
ID0gZGlyZWN0aW9uYWxMZW5ndGg7CisJCQlfbGlnaHRzLnNwb3QubGVuZ3RoID0gc3BvdExlbmd0
aDsKKwkJCV9saWdodHMucmVjdEFyZWEubGVuZ3RoID0gcmVjdEFyZWFMZW5ndGg7CisJCQlfbGln
aHRzLnBvaW50Lmxlbmd0aCA9IHBvaW50TGVuZ3RoOworCQkJX2xpZ2h0cy5oZW1pLmxlbmd0aCA9
IGhlbWlMZW5ndGg7CisKKwkJCS8vIFRPRE8gKHNhbS1nLXN0ZWVsKSB3aHkgYXJlbid0IHdlIHVz
aW5nIGpvaW4KKwkJCV9saWdodHMuaGFzaCA9IGRpcmVjdGlvbmFsTGVuZ3RoICsgJywnICsgcG9p
bnRMZW5ndGggKyAnLCcgKyBzcG90TGVuZ3RoICsgJywnICsgcmVjdEFyZWFMZW5ndGggKyAnLCcg
KyBoZW1pTGVuZ3RoICsgJywnICsgX2xpZ2h0cy5zaGFkb3dzLmxlbmd0aDsKKworCQl9CisKKwkJ
Ly8gR0wgc3RhdGUgc2V0dGluZworCisJCXRoaXMuc2V0RmFjZUN1bGxpbmcgPSBmdW5jdGlvbiAo
IGN1bGxGYWNlLCBmcm9udEZhY2VEaXJlY3Rpb24gKSB7CisKKwkJCXN0YXRlLnNldEN1bGxGYWNl
KCBjdWxsRmFjZSApOworCQkJc3RhdGUuc2V0RmxpcFNpZGVkKCBmcm9udEZhY2VEaXJlY3Rpb24g
PT09IEZyb250RmFjZURpcmVjdGlvbkNXICk7CisKKwkJfTsKKworCQkvLyBUZXh0dXJlcworCisJ
CWZ1bmN0aW9uIGFsbG9jVGV4dHVyZVVuaXQoKSB7CisKKwkJCXZhciB0ZXh0dXJlVW5pdCA9IF91
c2VkVGV4dHVyZVVuaXRzOworCisJCQlpZiAoIHRleHR1cmVVbml0ID49IGNhcGFiaWxpdGllcy5t
YXhUZXh0dXJlcyApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6
IFRyeWluZyB0byB1c2UgJyArIHRleHR1cmVVbml0ICsgJyB0ZXh0dXJlIHVuaXRzIHdoaWxlIHRo
aXMgR1BVIHN1cHBvcnRzIG9ubHkgJyArIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlcyApOworCisJ
CQl9CisKKwkJCV91c2VkVGV4dHVyZVVuaXRzICs9IDE7CisKKwkJCXJldHVybiB0ZXh0dXJlVW5p
dDsKKworCQl9CisKKwkJdGhpcy5hbGxvY1RleHR1cmVVbml0ID0gYWxsb2NUZXh0dXJlVW5pdDsK
KworCQkvLyB0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDsKKwkJdGhpcy5zZXRUZXh0
dXJlMkQgPSAoIGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHdhcm5lZCA9IGZhbHNlOworCisJCQkv
LyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogcGVlbCB0ZXh0dXJlLnRleHR1cmUKKwkJCXJldHVy
biBmdW5jdGlvbiBzZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7CisKKwkJCQlpZiAoIHRl
eHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkgeworCisJCQkJCWlmICggISB3
YXJuZWQgKSB7CisKKwkJCQkJCWNvbnNvbGUud2FybiggIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0
VGV4dHVyZTJEOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVp
ciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLiIgKTsKKwkJCQkJCXdhcm5lZCA9IHRydWU7CisK
KwkJCQkJfQorCisJCQkJCXRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7CisKKwkJCQl9CisKKwkJ
CQl0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTsKKworCQkJfTsKKworCQl9
KCkgKTsKKworCQl0aGlzLnNldFRleHR1cmUgPSAoIGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHdh
cm5lZCA9IGZhbHNlOworCisJCQlyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZSggdGV4dHVyZSwg
c2xvdCApIHsKKworCQkJCWlmICggISB3YXJuZWQgKSB7CisKKwkJCQkJY29uc29sZS53YXJuKCAi
VEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUgaXMgZGVwcmVjYXRlZCwgdXNlIHNldFRl
eHR1cmUyRCBpbnN0ZWFkLiIgKTsKKwkJCQkJd2FybmVkID0gdHJ1ZTsKKworCQkJCX0KKworCQkJ
CXRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApOworCisJCQl9OworCisJCX0o
KSApOworCisJCXRoaXMuc2V0VGV4dHVyZUN1YmUgPSAoIGZ1bmN0aW9uICgpIHsKKworCQkJdmFy
IHdhcm5lZCA9IGZhbHNlOworCisJCQlyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZUN1YmUoIHRl
eHR1cmUsIHNsb3QgKSB7CisKKwkJCQkvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogcGVlbCB0
ZXh0dXJlLnRleHR1cmUKKwkJCQlpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVy
VGFyZ2V0Q3ViZSApIHsKKworCQkJCQlpZiAoICEgd2FybmVkICkgeworCisJCQkJCQljb25zb2xl
Lndhcm4oICJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3Vi
ZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5
IGluc3RlYWQuIiApOworCQkJCQkJd2FybmVkID0gdHJ1ZTsKKworCQkJCQl9CisKKwkJCQkJdGV4
dHVyZSA9IHRleHR1cmUudGV4dHVyZTsKKworCQkJCX0KKworCQkJCS8vIGN1cnJlbnRseSByZWx5
aW5nIG9uIHRoZSBmYWN0IHRoYXQgV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnRleHR1cmUgaXMgYSBU
ZXh0dXJlIGFuZCBOT1QgYSBDdWJlVGV4dHVyZQorCQkJCS8vIFRPRE86IHVuaWZ5IHRoZXNlIGNv
ZGUgcGF0aHMKKwkJCQlpZiAoICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB8
fAorCQkJCQkoIEFycmF5LmlzQXJyYXkoIHRleHR1cmUuaW1hZ2UgKSAmJiB0ZXh0dXJlLmltYWdl
Lmxlbmd0aCA9PT0gNiApICkgeworCisJCQkJCS8vIENvbXByZXNzZWRUZXh0dXJlIGNhbiBoYXZl
IEFycmF5IGluIGltYWdlIDovCisKKwkJCQkJLy8gdGhpcyBmdW5jdGlvbiBhbG9uZSBzaG91bGQg
dGFrZSBjYXJlIG9mIGN1YmUgdGV4dHVyZXMKKwkJCQkJdGV4dHVyZXMuc2V0VGV4dHVyZUN1YmUo
IHRleHR1cmUsIHNsb3QgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJLy8gYXNzdW1lZDogdGV4
dHVyZSBwcm9wZXJ0eSBvZiBUSFJFRS5XZWJHTFJlbmRlclRhcmdldEN1YmUKKworCQkJCQl0ZXh0
dXJlcy5zZXRUZXh0dXJlQ3ViZUR5bmFtaWMoIHRleHR1cmUsIHNsb3QgKTsKKworCQkJCX0KKwor
CQkJfTsKKworCQl9KCkgKTsKKworCQl0aGlzLmdldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICgp
IHsKKworCQkJcmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0OworCisJCX07CisKKwkJdGhpcy5z
ZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCApIHsKKworCQkJX2N1cnJl
bnRSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7CisKKwkJCWlmICggcmVuZGVyVGFyZ2V0ICYm
IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXIgPT09IHVu
ZGVmaW5lZCApIHsKKworCQkJCXRleHR1cmVzLnNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJn
ZXQgKTsKKworCQkJfQorCisJCQl2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVy
VGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICk7CisJCQl2YXIgZnJhbWVidWZmZXI7CisK
KwkJCWlmICggcmVuZGVyVGFyZ2V0ICkgeworCisJCQkJdmFyIHJlbmRlclRhcmdldFByb3BlcnRp
ZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7CisKKwkJCQlpZiAoIGlzQ3ViZSAp
IHsKKworCQkJCQlmcmFtZWJ1ZmZlciA9IHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZy
YW1lYnVmZmVyWyByZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgXTsKKworCQkJCX0gZWxzZSB7
CisKKwkJCQkJZnJhbWVidWZmZXIgPSByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFt
ZWJ1ZmZlcjsKKworCQkJCX0KKworCQkJCV9jdXJyZW50U2Npc3Nvci5jb3B5KCByZW5kZXJUYXJn
ZXQuc2Npc3NvciApOworCQkJCV9jdXJyZW50U2Npc3NvclRlc3QgPSByZW5kZXJUYXJnZXQuc2Np
c3NvclRlc3Q7CisKKwkJCQlfY3VycmVudFZpZXdwb3J0LmNvcHkoIHJlbmRlclRhcmdldC52aWV3
cG9ydCApOworCisJCQl9IGVsc2UgeworCisJCQkJZnJhbWVidWZmZXIgPSBudWxsOworCisJCQkJ
X2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJh
dGlvICk7CisJCQkJX2N1cnJlbnRTY2lzc29yVGVzdCA9IF9zY2lzc29yVGVzdDsKKworCQkJCV9j
dXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJh
dGlvICk7CisKKwkJCX0KKworCQkJaWYgKCBfY3VycmVudEZyYW1lYnVmZmVyICE9PSBmcmFtZWJ1
ZmZlciApIHsKKworCQkJCV9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJh
bWVidWZmZXIgKTsKKwkJCQlfY3VycmVudEZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXI7CisKKwkJ
CX0KKworCQkJc3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yICk7CisJCQlzdGF0ZS5zZXRT
Y2lzc29yVGVzdCggX2N1cnJlbnRTY2lzc29yVGVzdCApOworCisJCQlzdGF0ZS52aWV3cG9ydCgg
X2N1cnJlbnRWaWV3cG9ydCApOworCisJCQlpZiAoIGlzQ3ViZSApIHsKKworCQkJCXZhciB0ZXh0
dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApOwor
CQkJCV9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuQ09MT1Jf
QVRUQUNITUVOVDAsIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyByZW5kZXJUYXJn
ZXQuYWN0aXZlQ3ViZUZhY2UsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCByZW5k
ZXJUYXJnZXQuYWN0aXZlTWlwTWFwTGV2ZWwgKTsKKworCQkJfQorCisJCX07CisKKwkJdGhpcy5y
ZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIHgsIHksIHdp
ZHRoLCBoZWlnaHQsIGJ1ZmZlciApIHsKKworCQkJaWYgKCAhICggcmVuZGVyVGFyZ2V0ICYmIHJl
bmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkgKSB7CisKKwkJCQljb25zb2xlLmVycm9y
KCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJn
ZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LicgKTsKKwkJCQlyZXR1cm47CisKKwkJ
CX0KKworCQkJdmFyIGZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCAp
Ll9fd2ViZ2xGcmFtZWJ1ZmZlcjsKKworCQkJaWYgKCBmcmFtZWJ1ZmZlciApIHsKKworCQkJCXZh
ciByZXN0b3JlID0gZmFsc2U7CisKKwkJCQlpZiAoIGZyYW1lYnVmZmVyICE9PSBfY3VycmVudEZy
YW1lYnVmZmVyICkgeworCisJCQkJCV9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZF
UiwgZnJhbWVidWZmZXIgKTsKKworCQkJCQlyZXN0b3JlID0gdHJ1ZTsKKworCQkJCX0KKworCQkJ
CXRyeSB7CisKKwkJCQkJdmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTsKKwkJCQkJ
dmFyIHRleHR1cmVGb3JtYXQgPSB0ZXh0dXJlLmZvcm1hdDsKKwkJCQkJdmFyIHRleHR1cmVUeXBl
ID0gdGV4dHVyZS50eXBlOworCisJCQkJCWlmICggdGV4dHVyZUZvcm1hdCAhPT0gUkdCQUZvcm1h
dCAmJiBwYXJhbVRocmVlVG9HTCggdGV4dHVyZUZvcm1hdCApICE9PSBfZ2wuZ2V0UGFyYW1ldGVy
KCBfZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQgKSApIHsKKworCQkJCQkJY29u
c29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczog
cmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9y
bWF0LicgKTsKKwkJCQkJCXJldHVybjsKKworCQkJCQl9CisKKwkJCQkJaWYgKCB0ZXh0dXJlVHlw
ZSAhPT0gVW5zaWduZWRCeXRlVHlwZSAmJiBwYXJhbVRocmVlVG9HTCggdGV4dHVyZVR5cGUgKSAh
PT0gX2dsLmdldFBhcmFtZXRlciggX2dsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSAp
ICYmIC8vIElFMTEsIEVkZ2UgYW5kIENocm9tZSBNYWMgPCA1MiAoIzk1MTMpCisJCQkJCQkhICgg
dGV4dHVyZVR5cGUgPT09IEZsb2F0VHlwZSAmJiAoIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1
cmVfZmxvYXQnICkgfHwgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQn
ICkgKSApICYmIC8vIENocm9tZSBNYWMgPj0gNTIgYW5kIEZpcmVmb3gKKwkJCQkJCSEgKCB0ZXh0
dXJlVHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9i
dWZmZXJfaGFsZl9mbG9hdCcgKSApICkgeworCisJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUu
V2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90
IGluIFVuc2lnbmVkQnl0ZVR5cGUgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLicgKTsK
KwkJCQkJCXJldHVybjsKKworCQkJCQl9CisKKwkJCQkJaWYgKCBfZ2wuY2hlY2tGcmFtZWJ1ZmZl
clN0YXR1cyggX2dsLkZSQU1FQlVGRkVSICkgPT09IF9nbC5GUkFNRUJVRkZFUl9DT01QTEVURSAp
IHsKKworCQkJCQkJLy8gdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZW5zdXJlcyB2YWxpZCBy
ZWFkIHJlcXVlc3RzIChubyBvdXQtb2YtYm91bmRzIHBpeGVscywgc2VlICM4NjA0KQorCisJCQkJ
CQlpZiAoICggeCA+PSAwICYmIHggPD0gKCByZW5kZXJUYXJnZXQud2lkdGggLSB3aWR0aCApICkg
JiYgKCB5ID49IDAgJiYgeSA8PSAoIHJlbmRlclRhcmdldC5oZWlnaHQgLSBoZWlnaHQgKSApICkg
eworCisJCQkJCQkJX2dsLnJlYWRQaXhlbHMoIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBhcmFtVGhy
ZWVUb0dMKCB0ZXh0dXJlRm9ybWF0ICksIHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlVHlwZSApLCBi
dWZmZXIgKTsKKworCQkJCQkJfQorCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWNvbnNvbGUuZXJy
b3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlYWRQaXhl
bHMgZnJvbSByZW5kZXJUYXJnZXQgZmFpbGVkLiBGcmFtZWJ1ZmZlciBub3QgY29tcGxldGUuJyAp
OworCisJCQkJCX0KKworCQkJCX0gZmluYWxseSB7CisKKwkJCQkJaWYgKCByZXN0b3JlICkgewor
CisJCQkJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9jdXJyZW50RnJh
bWVidWZmZXIgKTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQl9OworCisJCS8vIE1h
cCB0aHJlZS5qcyBjb25zdGFudHMgdG8gV2ViR0wgY29uc3RhbnRzCisKKwkJZnVuY3Rpb24gcGFy
YW1UaHJlZVRvR0woIHAgKSB7CisKKwkJCXZhciBleHRlbnNpb247CisKKwkJCWlmICggcCA9PT0g
UmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gX2dsLlJFUEVBVDsKKwkJCWlmICggcCA9PT0gQ2xhbXBU
b0VkZ2VXcmFwcGluZyApIHJldHVybiBfZ2wuQ0xBTVBfVE9fRURHRTsKKwkJCWlmICggcCA9PT0g
TWlycm9yZWRSZXBlYXRXcmFwcGluZyApIHJldHVybiBfZ2wuTUlSUk9SRURfUkVQRUFUOworCisJ
CQlpZiAoIHAgPT09IE5lYXJlc3RGaWx0ZXIgKSByZXR1cm4gX2dsLk5FQVJFU1Q7CisJCQlpZiAo
IHAgPT09IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIF9nbC5ORUFSRVNUX01J
UE1BUF9ORUFSRVNUOworCQkJaWYgKCBwID09PSBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyICkg
cmV0dXJuIF9nbC5ORUFSRVNUX01JUE1BUF9MSU5FQVI7CisKKwkJCWlmICggcCA9PT0gTGluZWFy
RmlsdGVyICkgcmV0dXJuIF9nbC5MSU5FQVI7CisJCQlpZiAoIHAgPT09IExpbmVhck1pcE1hcE5l
YXJlc3RGaWx0ZXIgKSByZXR1cm4gX2dsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVDsKKwkJCWlmICgg
cCA9PT0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyICkgcmV0dXJuIF9nbC5MSU5FQVJfTUlQTUFQ
X0xJTkVBUjsKKworCQkJaWYgKCBwID09PSBVbnNpZ25lZEJ5dGVUeXBlICkgcmV0dXJuIF9nbC5V
TlNJR05FRF9CWVRFOworCQkJaWYgKCBwID09PSBVbnNpZ25lZFNob3J0NDQ0NFR5cGUgKSByZXR1
cm4gX2dsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7CisJCQlpZiAoIHAgPT09IFVuc2lnbmVkU2hv
cnQ1NTUxVHlwZSApIHJldHVybiBfZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMTsKKwkJCWlmICgg
cCA9PT0gVW5zaWduZWRTaG9ydDU2NVR5cGUgKSByZXR1cm4gX2dsLlVOU0lHTkVEX1NIT1JUXzVf
Nl81OworCisJCQlpZiAoIHAgPT09IEJ5dGVUeXBlICkgcmV0dXJuIF9nbC5CWVRFOworCQkJaWYg
KCBwID09PSBTaG9ydFR5cGUgKSByZXR1cm4gX2dsLlNIT1JUOworCQkJaWYgKCBwID09PSBVbnNp
Z25lZFNob3J0VHlwZSApIHJldHVybiBfZ2wuVU5TSUdORURfU0hPUlQ7CisJCQlpZiAoIHAgPT09
IEludFR5cGUgKSByZXR1cm4gX2dsLklOVDsKKwkJCWlmICggcCA9PT0gVW5zaWduZWRJbnRUeXBl
ICkgcmV0dXJuIF9nbC5VTlNJR05FRF9JTlQ7CisJCQlpZiAoIHAgPT09IEZsb2F0VHlwZSApIHJl
dHVybiBfZ2wuRkxPQVQ7CisKKwkJCWlmICggcCA9PT0gSGFsZkZsb2F0VHlwZSApIHsKKworCQkJ
CWV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTsK
KworCQkJCWlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgcmV0dXJuIGV4dGVuc2lvbi5IQUxGX0ZM
T0FUX09FUzsKKworCQkJfQorCisJCQlpZiAoIHAgPT09IEFscGhhRm9ybWF0ICkgcmV0dXJuIF9n
bC5BTFBIQTsKKwkJCWlmICggcCA9PT0gUkdCRm9ybWF0ICkgcmV0dXJuIF9nbC5SR0I7CisJCQlp
ZiAoIHAgPT09IFJHQkFGb3JtYXQgKSByZXR1cm4gX2dsLlJHQkE7CisJCQlpZiAoIHAgPT09IEx1
bWluYW5jZUZvcm1hdCApIHJldHVybiBfZ2wuTFVNSU5BTkNFOworCQkJaWYgKCBwID09PSBMdW1p
bmFuY2VBbHBoYUZvcm1hdCApIHJldHVybiBfZ2wuTFVNSU5BTkNFX0FMUEhBOworCQkJaWYgKCBw
ID09PSBEZXB0aEZvcm1hdCApIHJldHVybiBfZ2wuREVQVEhfQ09NUE9ORU5UOworCQkJaWYgKCBw
ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSByZXR1cm4gX2dsLkRFUFRIX1NURU5DSUw7CisKKwkJ
CWlmICggcCA9PT0gQWRkRXF1YXRpb24gKSByZXR1cm4gX2dsLkZVTkNfQUREOworCQkJaWYgKCBw
ID09PSBTdWJ0cmFjdEVxdWF0aW9uICkgcmV0dXJuIF9nbC5GVU5DX1NVQlRSQUNUOworCQkJaWYg
KCBwID09PSBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBfZ2wuRlVOQ19SRVZFUlNF
X1NVQlRSQUNUOworCisJCQlpZiAoIHAgPT09IFplcm9GYWN0b3IgKSByZXR1cm4gX2dsLlpFUk87
CisJCQlpZiAoIHAgPT09IE9uZUZhY3RvciApIHJldHVybiBfZ2wuT05FOworCQkJaWYgKCBwID09
PSBTcmNDb2xvckZhY3RvciApIHJldHVybiBfZ2wuU1JDX0NPTE9SOworCQkJaWYgKCBwID09PSBP
bmVNaW51c1NyY0NvbG9yRmFjdG9yICkgcmV0dXJuIF9nbC5PTkVfTUlOVVNfU1JDX0NPTE9SOwor
CQkJaWYgKCBwID09PSBTcmNBbHBoYUZhY3RvciApIHJldHVybiBfZ2wuU1JDX0FMUEhBOworCQkJ
aWYgKCBwID09PSBPbmVNaW51c1NyY0FscGhhRmFjdG9yICkgcmV0dXJuIF9nbC5PTkVfTUlOVVNf
U1JDX0FMUEhBOworCQkJaWYgKCBwID09PSBEc3RBbHBoYUZhY3RvciApIHJldHVybiBfZ2wuRFNU
X0FMUEhBOworCQkJaWYgKCBwID09PSBPbmVNaW51c0RzdEFscGhhRmFjdG9yICkgcmV0dXJuIF9n
bC5PTkVfTUlOVVNfRFNUX0FMUEhBOworCisJCQlpZiAoIHAgPT09IERzdENvbG9yRmFjdG9yICkg
cmV0dXJuIF9nbC5EU1RfQ09MT1I7CisJCQlpZiAoIHAgPT09IE9uZU1pbnVzRHN0Q29sb3JGYWN0
b3IgKSByZXR1cm4gX2dsLk9ORV9NSU5VU19EU1RfQ09MT1I7CisJCQlpZiAoIHAgPT09IFNyY0Fs
cGhhU2F0dXJhdGVGYWN0b3IgKSByZXR1cm4gX2dsLlNSQ19BTFBIQV9TQVRVUkFURTsKKworCQkJ
aWYgKCBwID09PSBSR0JfUzNUQ19EWFQxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUMV9G
b3JtYXQgfHwKKwkJCQlwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9T
M1RDX0RYVDVfRm9ybWF0ICkgeworCisJCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdX
RUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTsKKworCQkJCWlmICggZXh0ZW5zaW9uICE9
PSBudWxsICkgeworCisJCQkJCWlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1
cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ7CisJCQkJCWlmICggcCA9
PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JH
QkFfUzNUQ19EWFQxX0VYVDsKKwkJCQkJaWYgKCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQg
KSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUOworCQkJCQlp
ZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJF
U1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ7CisKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCBwID09
PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1h
dCB8fAorCQkJCXAgPT09IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1BW
UlRDXzJCUFBWMV9Gb3JtYXQgKSB7CisKKwkJCQlleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCgg
J1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTsKKworCQkJCWlmICggZXh0ZW5zaW9u
ICE9PSBudWxsICkgeworCisJCQkJCWlmICggcCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQg
KSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUc7CisJCQkJ
CWlmICggcCA9PT0gUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNP
TVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUc7CisJCQkJCWlmICggcCA9PT0gUkdCQV9QVlJU
Q180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENf
NEJQUFYxX0lNRzsKKwkJCQkJaWYgKCBwID09PSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSBy
ZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HOworCisJCQkJ
fQorCisJCQl9CisKKwkJCWlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0ICkgeworCisJCQkJZXh0
ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScg
KTsKKworCQkJCWlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgcmV0dXJuIGV4dGVuc2lvbi5DT01Q
UkVTU0VEX1JHQl9FVEMxX1dFQkdMOworCisJCQl9CisKKwkJCWlmICggcCA9PT0gTWluRXF1YXRp
b24gfHwgcCA9PT0gTWF4RXF1YXRpb24gKSB7CisKKwkJCQlleHRlbnNpb24gPSBleHRlbnNpb25z
LmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7CisKKwkJCQlpZiAoIGV4dGVuc2lvbiAhPT0gbnVs
bCApIHsKKworCQkJCQlpZiAoIHAgPT09IE1pbkVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5N
SU5fRVhUOworCQkJCQlpZiAoIHAgPT09IE1heEVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5N
QVhfRVhUOworCisJCQkJfQorCisJCQl9CisKKwkJCWlmICggcCA9PT0gVW5zaWduZWRJbnQyNDhU
eXBlICkgeworCisJCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90
ZXh0dXJlJyApOworCisJCQkJaWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5z
aW9uLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMOworCisJCQl9CisKKwkJCXJldHVybiAwOworCisJ
CX0KKworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20v
CisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKi8K
KworCWZ1bmN0aW9uIEZvZ0V4cDIgKCBjb2xvciwgZGVuc2l0eSApIHsKKworCQl0aGlzLm5hbWUg
PSAnJzsKKworCQl0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApOworCQl0aGlzLmRlbnNp
dHkgPSAoIGRlbnNpdHkgIT09IHVuZGVmaW5lZCApID8gZGVuc2l0eSA6IDAuMDAwMjU7CisKKwl9
CisKKwlGb2dFeHAyLnByb3RvdHlwZS5pc0ZvZ0V4cDIgPSB0cnVlOworCisJRm9nRXhwMi5wcm90
b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7CisKKwkJcmV0dXJuIG5ldyBGb2dFeHAyKCB0aGlz
LmNvbG9yLmdldEhleCgpLCB0aGlzLmRlbnNpdHkgKTsKKworCX07CisKKwlGb2dFeHAyLnByb3Rv
dHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIG1ldGEgKSB7CisKKwkJcmV0dXJuIHsKKwkJCXR5cGU6
ICdGb2dFeHAyJywKKwkJCWNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLAorCQkJZGVuc2l0eTog
dGhpcy5kZW5zaXR5CisJCX07CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBo
dHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRx
dWFsaWEuY29tLworCSAqLworCisJZnVuY3Rpb24gRm9nICggY29sb3IsIG5lYXIsIGZhciApIHsK
KworCQl0aGlzLm5hbWUgPSAnJzsKKworCQl0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciAp
OworCisJCXRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFyIDogMTsKKwkJ
dGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAxMDAwOworCisJfQorCisJ
Rm9nLnByb3RvdHlwZS5pc0ZvZyA9IHRydWU7CisKKwlGb2cucHJvdG90eXBlLmNsb25lID0gZnVu
Y3Rpb24gKCkgeworCisJCXJldHVybiBuZXcgRm9nKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlz
Lm5lYXIsIHRoaXMuZmFyICk7CisKKwl9OworCisJRm9nLnByb3RvdHlwZS50b0pTT04gPSBmdW5j
dGlvbiAoIG1ldGEgKSB7CisKKwkJcmV0dXJuIHsKKwkJCXR5cGU6ICdGb2cnLAorCQkJY29sb3I6
IHRoaXMuY29sb3IuZ2V0SGV4KCksCisJCQluZWFyOiB0aGlzLm5lYXIsCisJCQlmYXI6IHRoaXMu
ZmFyCisJCX07CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJk
b29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFNjZW5lICgpIHsKKworCQlPYmplY3QzRC5jYWxs
KCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1NjZW5lJzsKKworCQl0aGlzLmJhY2tncm91bmQg
PSBudWxsOworCQl0aGlzLmZvZyA9IG51bGw7CisJCXRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IG51
bGw7CisKKwkJdGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsgLy8gY2hlY2tlZCBieSB0aGUgcmVuZGVy
ZXIKKworCX0KKworCVNjZW5lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVh
dGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IFNjZW5lLAorCisJ
CWNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7CisKKwkJCU9iamVjdDNELnBy
b3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7CisKKwkJCWlmICgg
c291cmNlLmJhY2tncm91bmQgIT09IG51bGwgKSB0aGlzLmJhY2tncm91bmQgPSBzb3VyY2UuYmFj
a2dyb3VuZC5jbG9uZSgpOworCQkJaWYgKCBzb3VyY2UuZm9nICE9PSBudWxsICkgdGhpcy5mb2cg
PSBzb3VyY2UuZm9nLmNsb25lKCk7CisJCQlpZiAoIHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsICE9
PSBudWxsICkgdGhpcy5vdmVycmlkZU1hdGVyaWFsID0gc291cmNlLm92ZXJyaWRlTWF0ZXJpYWwu
Y2xvbmUoKTsKKworCQkJdGhpcy5hdXRvVXBkYXRlID0gc291cmNlLmF1dG9VcGRhdGU7CisJCQl0
aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKKworCQkJ
dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTsK
KworCQkJaWYgKCB0aGlzLmJhY2tncm91bmQgIT09IG51bGwgKSBkYXRhLm9iamVjdC5iYWNrZ3Jv
dW5kID0gdGhpcy5iYWNrZ3JvdW5kLnRvSlNPTiggbWV0YSApOworCQkJaWYgKCB0aGlzLmZvZyAh
PT0gbnVsbCApIGRhdGEub2JqZWN0LmZvZyA9IHRoaXMuZm9nLnRvSlNPTigpOworCisJCQlyZXR1
cm4gZGF0YTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1pa2FlbCBlbXRp
bmdlciAvIGh0dHA6Ly9nb21vLnNlLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0
ZXJlZHF1YWxpYS5jb20vCisJICovCisKKwlmdW5jdGlvbiBMZW5zRmxhcmUoIHRleHR1cmUsIHNp
emUsIGRpc3RhbmNlLCBibGVuZGluZywgY29sb3IgKSB7CisKKwkJT2JqZWN0M0QuY2FsbCggdGhp
cyApOworCisJCXRoaXMubGVuc0ZsYXJlcyA9IFtdOworCisJCXRoaXMucG9zaXRpb25TY3JlZW4g
PSBuZXcgVmVjdG9yMygpOworCQl0aGlzLmN1c3RvbVVwZGF0ZUNhbGxiYWNrID0gdW5kZWZpbmVk
OworCisJCWlmICggdGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgeworCisJCQl0aGlzLmFkZCggdGV4
dHVyZSwgc2l6ZSwgZGlzdGFuY2UsIGJsZW5kaW5nLCBjb2xvciApOworCisJCX0KKworCX0KKwor
CUxlbnNGbGFyZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmpl
Y3QzRC5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBMZW5zRmxhcmUsCisKKwkJaXNM
ZW5zRmxhcmU6IHRydWUsCisKKwkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJCU9i
amVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOworCisJCQl0aGlzLnBv
c2l0aW9uU2NyZWVuLmNvcHkoIHNvdXJjZS5wb3NpdGlvblNjcmVlbiApOworCQkJdGhpcy5jdXN0
b21VcGRhdGVDYWxsYmFjayA9IHNvdXJjZS5jdXN0b21VcGRhdGVDYWxsYmFjazsKKworCQkJZm9y
ICggdmFyIGkgPSAwLCBsID0gc291cmNlLmxlbnNGbGFyZXMubGVuZ3RoOyBpIDwgbDsgaSArKyAp
IHsKKworCQkJCXRoaXMubGVuc0ZsYXJlcy5wdXNoKCBzb3VyY2UubGVuc0ZsYXJlc1sgaSBdICk7
CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlhZGQ6IGZ1bmN0aW9uICgg
dGV4dHVyZSwgc2l6ZSwgZGlzdGFuY2UsIGJsZW5kaW5nLCBjb2xvciwgb3BhY2l0eSApIHsKKwor
CQkJaWYgKCBzaXplID09PSB1bmRlZmluZWQgKSBzaXplID0gLSAxOworCQkJaWYgKCBkaXN0YW5j
ZSA9PT0gdW5kZWZpbmVkICkgZGlzdGFuY2UgPSAwOworCQkJaWYgKCBvcGFjaXR5ID09PSB1bmRl
ZmluZWQgKSBvcGFjaXR5ID0gMTsKKwkJCWlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9y
ID0gbmV3IENvbG9yKCAweGZmZmZmZiApOworCQkJaWYgKCBibGVuZGluZyA9PT0gdW5kZWZpbmVk
ICkgYmxlbmRpbmcgPSBOb3JtYWxCbGVuZGluZzsKKworCQkJZGlzdGFuY2UgPSBNYXRoLm1pbigg
ZGlzdGFuY2UsIE1hdGgubWF4KCAwLCBkaXN0YW5jZSApICk7CisKKwkJCXRoaXMubGVuc0ZsYXJl
cy5wdXNoKCB7CisJCQkJdGV4dHVyZTogdGV4dHVyZSwJLy8gVEhSRUUuVGV4dHVyZQorCQkJCXNp
emU6IHNpemUsIAkJLy8gc2l6ZSBpbiBwaXhlbHMgKC0xID0gdXNlIHRleHR1cmUud2lkdGgpCisJ
CQkJZGlzdGFuY2U6IGRpc3RhbmNlLCAJLy8gZGlzdGFuY2UgKDAtMSkgZnJvbSBsaWdodCBzb3Vy
Y2UgKDA9YXQgbGlnaHQgc291cmNlKQorCQkJCXg6IDAsIHk6IDAsIHo6IDAsCS8vIHNjcmVlbiBw
b3NpdGlvbiAoLTEgPT4gMSkgeiA9IDAgaXMgaW4gZnJvbnQgeiA9IDEgaXMgYmFjaworCQkJCXNj
YWxlOiAxLCAJCS8vIHNjYWxlCisJCQkJcm90YXRpb246IDAsIAkJLy8gcm90YXRpb24KKwkJCQlv
cGFjaXR5OiBvcGFjaXR5LAkvLyBvcGFjaXR5CisJCQkJY29sb3I6IGNvbG9yLAkJLy8gY29sb3IK
KwkJCQlibGVuZGluZzogYmxlbmRpbmcJLy8gYmxlbmRpbmcKKwkJCX0gKTsKKworCQl9LAorCisJ
CS8qCisJCSAqIFVwZGF0ZSBsZW5zIGZsYXJlcyB1cGRhdGUgcG9zaXRpb25zIG9uIGFsbCBmbGFy
ZXMgYmFzZWQgb24gdGhlIHNjcmVlbiBwb3NpdGlvbgorCQkgKiBTZXQgbXlMZW5zRmxhcmUuY3Vz
dG9tVXBkYXRlQ2FsbGJhY2sgdG8gYWx0ZXIgdGhlIGZsYXJlcyBpbiB5b3VyIHByb2plY3Qgc3Bl
Y2lmaWMgd2F5LgorCQkgKi8KKworCQl1cGRhdGVMZW5zRmxhcmVzOiBmdW5jdGlvbiAoKSB7CisK
KwkJCXZhciBmLCBmbCA9IHRoaXMubGVuc0ZsYXJlcy5sZW5ndGg7CisJCQl2YXIgZmxhcmU7CisJ
CQl2YXIgdmVjWCA9IC0gdGhpcy5wb3NpdGlvblNjcmVlbi54ICogMjsKKwkJCXZhciB2ZWNZID0g
LSB0aGlzLnBvc2l0aW9uU2NyZWVuLnkgKiAyOworCisJCQlmb3IgKCBmID0gMDsgZiA8IGZsOyBm
ICsrICkgeworCisJCQkJZmxhcmUgPSB0aGlzLmxlbnNGbGFyZXNbIGYgXTsKKworCQkJCWZsYXJl
LnggPSB0aGlzLnBvc2l0aW9uU2NyZWVuLnggKyB2ZWNYICogZmxhcmUuZGlzdGFuY2U7CisJCQkJ
ZmxhcmUueSA9IHRoaXMucG9zaXRpb25TY3JlZW4ueSArIHZlY1kgKiBmbGFyZS5kaXN0YW5jZTsK
KworCQkJCWZsYXJlLndhbnRlZFJvdGF0aW9uID0gZmxhcmUueCAqIE1hdGguUEkgKiAwLjI1Owor
CQkJCWZsYXJlLnJvdGF0aW9uICs9ICggZmxhcmUud2FudGVkUm90YXRpb24gLSBmbGFyZS5yb3Rh
dGlvbiApICogMC4yNTsKKworCQkJfQorCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRo
b3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICoKKwkgKiBwYXJhbWV0
ZXJzID0geworCSAqICBjb2xvcjogPGhleD4sCisJICogIG9wYWNpdHk6IDxmbG9hdD4sCisJICog
IG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKgorCSAqCXV2T2Zmc2V0OiBu
ZXcgVEhSRUUuVmVjdG9yMigpLAorCSAqCXV2U2NhbGU6IG5ldyBUSFJFRS5WZWN0b3IyKCkKKwkg
KiB9CisJICovCisKKwlmdW5jdGlvbiBTcHJpdGVNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKKwor
CQlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1Nwcml0ZU1hdGVyaWFs
JzsKKworCQl0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOworCQl0aGlzLm1hcCA9
IG51bGw7CisKKwkJdGhpcy5yb3RhdGlvbiA9IDA7CisKKwkJdGhpcy5mb2cgPSBmYWxzZTsKKwkJ
dGhpcy5saWdodHMgPSBmYWxzZTsKKworCQl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOwor
CisJfQorCisJU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJp
YWwucHJvdG90eXBlICk7CisJU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0g
U3ByaXRlTWF0ZXJpYWw7CisJU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmlzU3ByaXRlTWF0ZXJp
YWwgPSB0cnVlOworCisJU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAo
IHNvdXJjZSApIHsKKworCQlNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3Vy
Y2UgKTsKKworCQl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworCQl0aGlzLm1hcCA9
IHNvdXJjZS5tYXA7CisKKwkJdGhpcy5yb3RhdGlvbiA9IHNvdXJjZS5yb3RhdGlvbjsKKworCQly
ZXR1cm4gdGhpczsKKworCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAv
IGh0dHA6Ly9nb21vLnNlLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1
YWxpYS5jb20vCisJICovCisKKwlmdW5jdGlvbiBTcHJpdGUoIG1hdGVyaWFsICkgeworCisJCU9i
amVjdDNELmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnU3ByaXRlJzsKKworCQl0aGlz
Lm1hdGVyaWFsID0gKCBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbCA6IG5ldyBT
cHJpdGVNYXRlcmlhbCgpOworCisJfQorCisJU3ByaXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3Np
Z24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0
b3I6IFNwcml0ZSwKKworCQlpc1Nwcml0ZTogdHJ1ZSwKKworCQlyYXljYXN0OiAoIGZ1bmN0aW9u
ICgpIHsKKworCQkJdmFyIGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciB3
b3JsZFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciB3b3JsZFNjYWxlID0gbmV3IFZl
Y3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJz
ZWN0cyApIHsKKworCQkJCXdvcmxkUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlz
Lm1hdHJpeFdvcmxkICk7CisJCQkJcmF5Y2FzdGVyLnJheS5jbG9zZXN0UG9pbnRUb1BvaW50KCB3
b3JsZFBvc2l0aW9uLCBpbnRlcnNlY3RQb2ludCApOworCisJCQkJd29ybGRTY2FsZS5zZXRGcm9t
TWF0cml4U2NhbGUoIHRoaXMubWF0cml4V29ybGQgKTsKKwkJCQl2YXIgZ3Vlc3NTaXplU3EgPSB3
b3JsZFNjYWxlLnggKiB3b3JsZFNjYWxlLnkgLyA0OworCisJCQkJaWYgKCB3b3JsZFBvc2l0aW9u
LmRpc3RhbmNlVG9TcXVhcmVkKCBpbnRlcnNlY3RQb2ludCApID4gZ3Vlc3NTaXplU3EgKSByZXR1
cm47CisKKwkJCQl2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRv
KCBpbnRlcnNlY3RQb2ludCApOworCisJCQkJaWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFy
IHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjsKKworCQkJCWludGVyc2VjdHMu
cHVzaCggeworCisJCQkJCWRpc3RhbmNlOiBkaXN0YW5jZSwKKwkJCQkJcG9pbnQ6IGludGVyc2Vj
dFBvaW50LmNsb25lKCksCisJCQkJCWZhY2U6IG51bGwsCisJCQkJCW9iamVjdDogdGhpcworCisJ
CQkJfSApOworCisJCQl9OworCisJCX0oKSApLAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7CisK
KwkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRo
aXMgKTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdl
ciAvIGh0dHA6Ly9nb21vLnNlLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJl
ZHF1YWxpYS5jb20vCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkg
Ki8KKworCWZ1bmN0aW9uIExPRCgpIHsKKworCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CisKKwkJ
dGhpcy50eXBlID0gJ0xPRCc7CisKKwkJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHsK
KwkJCWxldmVsczogeworCQkJCWVudW1lcmFibGU6IHRydWUsCisJCQkJdmFsdWU6IFtdCisJCQl9
CisJCX0gKTsKKworCX0KKworCUxPRC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3Qu
Y3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBMT0QsCisK
KwkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJCU9iamVjdDNELnByb3RvdHlwZS5j
b3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgZmFsc2UgKTsKKworCQkJdmFyIGxldmVscyA9IHNvdXJj
ZS5sZXZlbHM7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBs
OyBpICsrICkgeworCisJCQkJdmFyIGxldmVsID0gbGV2ZWxzWyBpIF07CisKKwkJCQl0aGlzLmFk
ZExldmVsKCBsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFuY2UgKTsKKworCQkJfQor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWFkZExldmVsOiBmdW5jdGlvbiAoIG9iamVj
dCwgZGlzdGFuY2UgKSB7CisKKwkJCWlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3Rh
bmNlID0gMDsKKworCQkJZGlzdGFuY2UgPSBNYXRoLmFicyggZGlzdGFuY2UgKTsKKworCQkJdmFy
IGxldmVscyA9IHRoaXMubGV2ZWxzOworCisJCQlmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMu
bGVuZ3RoOyBsICsrICkgeworCisJCQkJaWYgKCBkaXN0YW5jZSA8IGxldmVsc1sgbCBdLmRpc3Rh
bmNlICkgeworCisJCQkJCWJyZWFrOworCisJCQkJfQorCisJCQl9CisKKwkJCWxldmVscy5zcGxp
Y2UoIGwsIDAsIHsgZGlzdGFuY2U6IGRpc3RhbmNlLCBvYmplY3Q6IG9iamVjdCB9ICk7CisKKwkJ
CXRoaXMuYWRkKCBvYmplY3QgKTsKKworCQl9LAorCisJCWdldE9iamVjdEZvckRpc3RhbmNlOiBm
dW5jdGlvbiAoIGRpc3RhbmNlICkgeworCisJCQl2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7CisK
KwkJCWZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewor
CisJCQkJaWYgKCBkaXN0YW5jZSA8IGxldmVsc1sgaSBdLmRpc3RhbmNlICkgeworCisJCQkJCWJy
ZWFrOworCisJCQkJfQorCisJCQl9CisKKwkJCXJldHVybiBsZXZlbHNbIGkgLSAxIF0ub2JqZWN0
OworCisJCX0sCisKKwkJcmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBtYXRyaXhQ
b3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiByYXljYXN0KCBy
YXljYXN0ZXIsIGludGVyc2VjdHMgKSB7CisKKwkJCQltYXRyaXhQb3NpdGlvbi5zZXRGcm9tTWF0
cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTsKKworCQkJCXZhciBkaXN0YW5jZSA9IHJh
eWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIG1hdHJpeFBvc2l0aW9uICk7CisKKwkJCQl0
aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKCBkaXN0YW5jZSApLnJheWNhc3QoIHJheWNhc3Rlciwg
aW50ZXJzZWN0cyApOworCisJCQl9OworCisJCX0oKSApLAorCisJCXVwZGF0ZTogZnVuY3Rpb24g
KCkgeworCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIHYyID0gbmV3IFZlY3Rv
cjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkgeworCisJCQkJdmFy
IGxldmVscyA9IHRoaXMubGV2ZWxzOworCisJCQkJaWYgKCBsZXZlbHMubGVuZ3RoID4gMSApIHsK
KworCQkJCQl2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApOwor
CQkJCQl2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTsKKworCQkJ
CQl2YXIgZGlzdGFuY2UgPSB2MS5kaXN0YW5jZVRvKCB2MiApOworCisJCQkJCWxldmVsc1sgMCBd
Lm9iamVjdC52aXNpYmxlID0gdHJ1ZTsKKworCQkJCQlmb3IgKCB2YXIgaSA9IDEsIGwgPSBsZXZl
bHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCQkJaWYgKCBkaXN0YW5jZSA+PSBsZXZl
bHNbIGkgXS5kaXN0YW5jZSApIHsKKworCQkJCQkJCWxldmVsc1sgaSAtIDEgXS5vYmplY3Qudmlz
aWJsZSA9IGZhbHNlOworCQkJCQkJCWxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTsK
KworCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCWJyZWFrOworCisJCQkJCQl9CisKKwkJCQkJfQor
CisJCQkJCWZvciAoIDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJCWxldmVsc1sgaSBdLm9iamVj
dC52aXNpYmxlID0gZmFsc2U7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9OworCisJCX0oKSwK
KworCQl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKKworCQkJdmFyIGRhdGEgPSBPYmplY3Qz
RC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTsKKworCQkJZGF0YS5vYmplY3Qu
bGV2ZWxzID0gW107CisKKwkJCXZhciBsZXZlbHMgPSB0aGlzLmxldmVsczsKKworCQkJZm9yICgg
dmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQl2YXIg
bGV2ZWwgPSBsZXZlbHNbIGkgXTsKKworCQkJCWRhdGEub2JqZWN0LmxldmVscy5wdXNoKCB7CisJ
CQkJCW9iamVjdDogbGV2ZWwub2JqZWN0LnV1aWQsCisJCQkJCWRpc3RhbmNlOiBsZXZlbC5kaXN0
YW5jZQorCQkJCX0gKTsKKworCQkJfQorCisJCQlyZXR1cm4gZGF0YTsKKworCQl9CisKKwl9ICk7
CisKKwkvKioKKwkgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLwor
CSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICogQGF1
dGhvciBtaWNoYWVsIGd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb20KKwkgKiBA
YXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb20KKwkgKi8KKworCWZ1bmN0aW9uIFNrZWxl
dG9uKCBib25lcywgYm9uZUludmVyc2VzICkgeworCisJCS8vIGNvcHkgdGhlIGJvbmUgYXJyYXkK
KworCQlib25lcyA9IGJvbmVzIHx8IFtdOworCisJCXRoaXMuYm9uZXMgPSBib25lcy5zbGljZSgg
MCApOworCQl0aGlzLmJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHRoaXMuYm9uZXMu
bGVuZ3RoICogMTYgKTsKKworCQkvLyB1c2UgdGhlIHN1cHBsaWVkIGJvbmUgaW52ZXJzZXMgb3Ig
Y2FsY3VsYXRlIHRoZSBpbnZlcnNlcworCisJCWlmICggYm9uZUludmVyc2VzID09PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCXRoaXMuY2FsY3VsYXRlSW52ZXJzZXMoKTsKKworCQl9IGVsc2UgeworCisJ
CQlpZiAoIHRoaXMuYm9uZXMubGVuZ3RoID09PSBib25lSW52ZXJzZXMubGVuZ3RoICkgeworCisJ
CQkJdGhpcy5ib25lSW52ZXJzZXMgPSBib25lSW52ZXJzZXMuc2xpY2UoIDAgKTsKKworCQkJfSBl
bHNlIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uIGJvbmVJbnZlcnNlcyBp
cyB0aGUgd3JvbmcgbGVuZ3RoLicgKTsKKworCQkJCXRoaXMuYm9uZUludmVyc2VzID0gW107CisK
KwkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSAr
KyApIHsKKworCQkJCQl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKCBuZXcgTWF0cml4NCgpICk7CisK
KwkJCQl9CisKKwkJCX0KKworCQl9CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBTa2VsZXRvbi5w
cm90b3R5cGUsIHsKKworCQljYWxjdWxhdGVJbnZlcnNlczogZnVuY3Rpb24gKCkgeworCisJCQl0
aGlzLmJvbmVJbnZlcnNlcyA9IFtdOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5i
b25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJCXZhciBpbnZlcnNlID0gbmV3IE1h
dHJpeDQoKTsKKworCQkJCWlmICggdGhpcy5ib25lc1sgaSBdICkgeworCisJCQkJCWludmVyc2Uu
Z2V0SW52ZXJzZSggdGhpcy5ib25lc1sgaSBdLm1hdHJpeFdvcmxkICk7CisKKwkJCQl9CisKKwkJ
CQl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKCBpbnZlcnNlICk7CisKKwkJCX0KKworCQl9LAorCisJ
CXBvc2U6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGJvbmUsIGksIGlsOworCisJCQkvLyByZWNv
dmVyIHRoZSBiaW5kLXRpbWUgd29ybGQgbWF0cmljZXMKKworCQkJZm9yICggaSA9IDAsIGlsID0g
dGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJCWJvbmUgPSB0aGlzLmJv
bmVzWyBpIF07CisKKwkJCQlpZiAoIGJvbmUgKSB7CisKKwkJCQkJYm9uZS5tYXRyaXhXb3JsZC5n
ZXRJbnZlcnNlKCB0aGlzLmJvbmVJbnZlcnNlc1sgaSBdICk7CisKKwkJCQl9CisKKwkJCX0KKwor
CQkJLy8gY29tcHV0ZSB0aGUgbG9jYWwgbWF0cmljZXMsIHBvc2l0aW9ucywgcm90YXRpb25zIGFu
ZCBzY2FsZXMKKworCQkJZm9yICggaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBp
bDsgaSArKyApIHsKKworCQkJCWJvbmUgPSB0aGlzLmJvbmVzWyBpIF07CisKKwkJCQlpZiAoIGJv
bmUgKSB7CisKKwkJCQkJaWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7
CisKKwkJCQkJCWJvbmUubWF0cml4LmdldEludmVyc2UoIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxk
ICk7CisJCQkJCQlib25lLm1hdHJpeC5tdWx0aXBseSggYm9uZS5tYXRyaXhXb3JsZCApOworCisJ
CQkJCX0gZWxzZSB7CisKKwkJCQkJCWJvbmUubWF0cml4LmNvcHkoIGJvbmUubWF0cml4V29ybGQg
KTsKKworCQkJCQl9CisKKwkJCQkJYm9uZS5tYXRyaXguZGVjb21wb3NlKCBib25lLnBvc2l0aW9u
LCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTsKKworCQkJCX0KKworCQkJfQorCisJCX0s
CisKKwkJdXBkYXRlOiAoIGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIG9mZnNldE1hdHJpeCA9IG5l
dyBNYXRyaXg0KCk7CisJCQl2YXIgaWRlbnRpdHlNYXRyaXggPSBuZXcgTWF0cml4NCgpOworCisJ
CQlyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkgeworCisJCQkJdmFyIGJvbmVzID0gdGhpcy5ib25l
czsKKwkJCQl2YXIgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7CisJCQkJdmFyIGJv
bmVNYXRyaWNlcyA9IHRoaXMuYm9uZU1hdHJpY2VzOworCQkJCXZhciBib25lVGV4dHVyZSA9IHRo
aXMuYm9uZVRleHR1cmU7CisKKwkJCQkvLyBmbGF0dGVuIGJvbmUgbWF0cmljZXMgdG8gYXJyYXkK
KworCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyAp
IHsKKworCQkJCQkvLyBjb21wdXRlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQg
dGhlIG9yaWdpbmFsIHRyYW5zZm9ybQorCisJCQkJCXZhciBtYXRyaXggPSBib25lc1sgaSBdID8g
Ym9uZXNbIGkgXS5tYXRyaXhXb3JsZCA6IGlkZW50aXR5TWF0cml4OworCisJCQkJCW9mZnNldE1h
dHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIGJvbmVJbnZlcnNlc1sgaSBdICk7CisJCQkJ
CW9mZnNldE1hdHJpeC50b0FycmF5KCBib25lTWF0cmljZXMsIGkgKiAxNiApOworCisJCQkJfQor
CisJCQkJaWYgKCBib25lVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWJvbmVUZXh0
dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQkJCX0KKworCQkJfTsKKworCQl9ICkoKSwKKwor
CQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IFNrZWxldG9uKCB0aGlzLmJv
bmVzLCB0aGlzLmJvbmVJbnZlcnNlcyApOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBh
dXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCisJICogQGF1dGhvciBhbHRl
cmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIGlrZXJyIC8gaHR0
cDovL3Zlcm9sZC5jb20KKwkgKi8KKworCWZ1bmN0aW9uIEJvbmUoKSB7CisKKwkJT2JqZWN0M0Qu
Y2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdCb25lJzsKKworCX0KKworCUJvbmUucHJv
dG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBl
ICksIHsKKworCQljb25zdHJ1Y3RvcjogQm9uZSwKKworCQlpc0JvbmU6IHRydWUKKworCX0gKTsK
KworCS8qKgorCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCisJ
ICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0
aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb20KKwkgKi8KKworCWZ1bmN0aW9uIFNraW5uZWRN
ZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7CisKKwkJTWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRy
eSwgbWF0ZXJpYWwgKTsKKworCQl0aGlzLnR5cGUgPSAnU2tpbm5lZE1lc2gnOworCisJCXRoaXMu
YmluZE1vZGUgPSAnYXR0YWNoZWQnOworCQl0aGlzLmJpbmRNYXRyaXggPSBuZXcgTWF0cml4NCgp
OworCQl0aGlzLmJpbmRNYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTsKKworCQl2YXIgYm9u
ZXMgPSB0aGlzLmluaXRCb25lcygpOworCQl2YXIgc2tlbGV0b24gPSBuZXcgU2tlbGV0b24oIGJv
bmVzICk7CisKKwkJdGhpcy5iaW5kKCBza2VsZXRvbiwgdGhpcy5tYXRyaXhXb3JsZCApOworCisJ
CXRoaXMubm9ybWFsaXplU2tpbldlaWdodHMoKTsKKworCX0KKworCVNraW5uZWRNZXNoLnByb3Rv
dHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICksIHsK
KworCQljb25zdHJ1Y3RvcjogU2tpbm5lZE1lc2gsCisKKwkJaXNTa2lubmVkTWVzaDogdHJ1ZSwK
KworCQlpbml0Qm9uZXM6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGJvbmVzID0gW10sIGJvbmUs
IGdib25lOworCQkJdmFyIGksIGlsOworCisJCQlpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5n
ZW9tZXRyeS5ib25lcyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJLy8gZmlyc3QsIGNyZWF0ZSBh
cnJheSBvZiAnQm9uZScgb2JqZWN0cyBmcm9tIGdlb21ldHJ5IGRhdGEKKworCQkJCWZvciAoIGkg
PSAwLCBpbCA9IHRoaXMuZ2VvbWV0cnkuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisK
KwkJCQkJZ2JvbmUgPSB0aGlzLmdlb21ldHJ5LmJvbmVzWyBpIF07CisKKwkJCQkJLy8gY3JlYXRl
IG5ldyAnQm9uZScgb2JqZWN0CisKKwkJCQkJYm9uZSA9IG5ldyBCb25lKCk7CisJCQkJCWJvbmVz
LnB1c2goIGJvbmUgKTsKKworCQkJCQkvLyBhcHBseSB2YWx1ZXMKKworCQkJCQlib25lLm5hbWUg
PSBnYm9uZS5uYW1lOworCQkJCQlib25lLnBvc2l0aW9uLmZyb21BcnJheSggZ2JvbmUucG9zICk7
CisJCQkJCWJvbmUucXVhdGVybmlvbi5mcm9tQXJyYXkoIGdib25lLnJvdHEgKTsKKwkJCQkJaWYg
KCBnYm9uZS5zY2wgIT09IHVuZGVmaW5lZCApIGJvbmUuc2NhbGUuZnJvbUFycmF5KCBnYm9uZS5z
Y2wgKTsKKworCQkJCX0KKworCQkJCS8vIHNlY29uZCwgY3JlYXRlIGJvbmUgaGllcmFyY2h5CisK
KwkJCQlmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGls
OyBpICsrICkgeworCisJCQkJCWdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdOworCisJ
CQkJCWlmICggKCBnYm9uZS5wYXJlbnQgIT09IC0gMSApICYmICggZ2JvbmUucGFyZW50ICE9PSBu
dWxsICkgJiYgKCBib25lc1sgZ2JvbmUucGFyZW50IF0gIT09IHVuZGVmaW5lZCApICkgeworCisJ
CQkJCQkvLyBzdWJzZXF1ZW50IGJvbmVzIGluIHRoZSBoaWVyYXJjaHkKKworCQkJCQkJYm9uZXNb
IGdib25lLnBhcmVudCBdLmFkZCggYm9uZXNbIGkgXSApOworCisJCQkJCX0gZWxzZSB7CisKKwkJ
CQkJCS8vIHRvcG1vc3QgYm9uZSwgaW1tZWRpYXRlIGNoaWxkIG9mIHRoZSBza2lubmVkIG1lc2gK
KworCQkJCQkJdGhpcy5hZGQoIGJvbmVzWyBpIF0gKTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJ
CX0KKworCQkJLy8gbm93IHRoZSBib25lcyBhcmUgcGFydCBvZiB0aGUgc2NlbmUgZ3JhcGggYW5k
IGNoaWxkcmVuIG9mIHRoZSBza2lubmVkIG1lc2guCisJCQkvLyBsZXQncyB1cGRhdGUgdGhlIGNv
cnJlc3BvbmRpbmcgbWF0cmljZXMKKworCQkJdGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSAp
OworCisJCQlyZXR1cm4gYm9uZXM7CisKKwkJfSwKKworCQliaW5kOiBmdW5jdGlvbiAoIHNrZWxl
dG9uLCBiaW5kTWF0cml4ICkgeworCisJCQl0aGlzLnNrZWxldG9uID0gc2tlbGV0b247CisKKwkJ
CWlmICggYmluZE1hdHJpeCA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJdGhpcy51cGRhdGVNYXRy
aXhXb3JsZCggdHJ1ZSApOworCisJCQkJdGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygp
OworCisJCQkJYmluZE1hdHJpeCA9IHRoaXMubWF0cml4V29ybGQ7CisKKwkJCX0KKworCQkJdGhp
cy5iaW5kTWF0cml4LmNvcHkoIGJpbmRNYXRyaXggKTsKKwkJCXRoaXMuYmluZE1hdHJpeEludmVy
c2UuZ2V0SW52ZXJzZSggYmluZE1hdHJpeCApOworCisJCX0sCisKKwkJcG9zZTogZnVuY3Rpb24g
KCkgeworCisJCQl0aGlzLnNrZWxldG9uLnBvc2UoKTsKKworCQl9LAorCisJCW5vcm1hbGl6ZVNr
aW5XZWlnaHRzOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBzY2FsZSwgaTsKKworCQkJaWYgKCB0
aGlzLmdlb21ldHJ5ICYmIHRoaXMuZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKKworCQkJCWZvciAo
IGkgPSAwOyBpIDwgdGhpcy5nZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGg7IGkgKysgKSB7CisK
KwkJCQkJdmFyIHN3ID0gdGhpcy5nZW9tZXRyeS5za2luV2VpZ2h0c1sgaSBdOworCisJCQkJCXNj
YWxlID0gMS4wIC8gc3cubGVuZ3RoTWFuaGF0dGFuKCk7CisKKwkJCQkJaWYgKCBzY2FsZSAhPT0g
SW5maW5pdHkgKSB7CisKKwkJCQkJCXN3Lm11bHRpcGx5U2NhbGFyKCBzY2FsZSApOworCisJCQkJ
CX0gZWxzZSB7CisKKwkJCQkJCXN3LnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcg
cmVhc29uYWJsZQorCisJCQkJCX0KKworCQkJCX0KKworCQkJfSBlbHNlIGlmICggdGhpcy5nZW9t
ZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisKKwkJCQl2YXIgdmVj
ID0gbmV3IFZlY3RvcjQoKTsKKworCQkJCXZhciBza2luV2VpZ2h0ID0gdGhpcy5nZW9tZXRyeS5h
dHRyaWJ1dGVzLnNraW5XZWlnaHQ7CisKKwkJCQlmb3IgKCBpID0gMDsgaSA8IHNraW5XZWlnaHQu
Y291bnQ7IGkgKysgKSB7CisKKwkJCQkJdmVjLnggPSBza2luV2VpZ2h0LmdldFgoIGkgKTsKKwkJ
CQkJdmVjLnkgPSBza2luV2VpZ2h0LmdldFkoIGkgKTsKKwkJCQkJdmVjLnogPSBza2luV2VpZ2h0
LmdldFooIGkgKTsKKwkJCQkJdmVjLncgPSBza2luV2VpZ2h0LmdldFcoIGkgKTsKKworCQkJCQlz
Y2FsZSA9IDEuMCAvIHZlYy5sZW5ndGhNYW5oYXR0YW4oKTsKKworCQkJCQlpZiAoIHNjYWxlICE9
PSBJbmZpbml0eSApIHsKKworCQkJCQkJdmVjLm11bHRpcGx5U2NhbGFyKCBzY2FsZSApOworCisJ
CQkJCX0gZWxzZSB7CisKKwkJCQkJCXZlYy5zZXQoIDEsIDAsIDAsIDAgKTsgLy8gZG8gc29tZXRo
aW5nIHJlYXNvbmFibGUKKworCQkJCQl9CisKKwkJCQkJc2tpbldlaWdodC5zZXRYWVpXKCBpLCB2
ZWMueCwgdmVjLnksIHZlYy56LCB2ZWMudyApOworCisJCQkJfQorCisJCQl9CisKKwkJfSwKKwor
CQl1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHsKKworCQkJTWVzaC5wcm90
b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTsKKworCQkJaWYgKCB0
aGlzLmJpbmRNb2RlID09PSAnYXR0YWNoZWQnICkgeworCisJCQkJdGhpcy5iaW5kTWF0cml4SW52
ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7CisKKwkJCX0gZWxzZSBpZiAoIHRo
aXMuYmluZE1vZGUgPT09ICdkZXRhY2hlZCcgKSB7CisKKwkJCQl0aGlzLmJpbmRNYXRyaXhJbnZl
cnNlLmdldEludmVyc2UoIHRoaXMuYmluZE1hdHJpeCApOworCisJCQl9IGVsc2UgeworCisJCQkJ
Y29uc29sZS53YXJuKCAnVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTog
JyArIHRoaXMuYmluZE1vZGUgKTsKKworCQkJfQorCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9u
ICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0
aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAq
IEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBhbHRlcmVk
cSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKgorCSAqIHBhcmFtZXRlcnMgPSB7CisJ
ICogIGNvbG9yOiA8aGV4PiwKKwkgKiAgb3BhY2l0eTogPGZsb2F0PiwKKwkgKgorCSAqICBsaW5l
d2lkdGg6IDxmbG9hdD4sCisJICogIGxpbmVjYXA6ICJyb3VuZCIsCisJICogIGxpbmVqb2luOiAi
cm91bmQiCisJICogfQorCSAqLworCisJZnVuY3Rpb24gTGluZUJhc2ljTWF0ZXJpYWwoIHBhcmFt
ZXRlcnMgKSB7CisKKwkJTWF0ZXJpYWwuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdM
aW5lQmFzaWNNYXRlcmlhbCc7CisKKwkJdGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYg
KTsKKworCQl0aGlzLmxpbmV3aWR0aCA9IDE7CisJCXRoaXMubGluZWNhcCA9ICdyb3VuZCc7CisJ
CXRoaXMubGluZWpvaW4gPSAncm91bmQnOworCisJCXRoaXMubGlnaHRzID0gZmFsc2U7CisKKwkJ
dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKKworCX0KKworCUxpbmVCYXNpY01hdGVyaWFs
LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOworCUxpbmVC
YXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVCYXNpY01hdGVyaWFsOwor
CisJTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWwgPSB0cnVl
OworCisJTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJj
ZSApIHsKKworCQlNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsK
KworCQl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworCisJCXRoaXMubGluZXdpZHRo
ID0gc291cmNlLmxpbmV3aWR0aDsKKwkJdGhpcy5saW5lY2FwID0gc291cmNlLmxpbmVjYXA7CisJ
CXRoaXMubGluZWpvaW4gPSBzb3VyY2UubGluZWpvaW47CisKKwkJcmV0dXJuIHRoaXM7CisKKwl9
OworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8K
KworCWZ1bmN0aW9uIExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCwgbW9kZSApIHsKKworCQlpZiAo
IG1vZGUgPT09IDEgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmU6IHBhcmFtZXRl
ciBUSFJFRS5MaW5lUGllY2VzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIENyZWF0ZWQgVEhSRUUuTGlu
ZVNlZ21lbnRzIGluc3RlYWQuJyApOworCQkJcmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIGdlb21l
dHJ5LCBtYXRlcmlhbCApOworCisJCX0KKworCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CisKKwkJ
dGhpcy50eXBlID0gJ0xpbmUnOworCisJCXRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5k
ZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKwkJdGhpcy5tYXRlcmlh
bCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBMaW5lQmFzaWNNYXRl
cmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTsKKworCX0KKworCUxp
bmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJv
dG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogTGluZSwKKworCQlpc0xpbmU6IHRydWUsCisK
KwkJcmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBpbnZlcnNlTWF0cml4ID0gbmV3
IE1hdHJpeDQoKTsKKwkJCXZhciByYXkgPSBuZXcgUmF5KCk7CisJCQl2YXIgc3BoZXJlID0gbmV3
IFNwaGVyZSgpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRl
cnNlY3RzICkgeworCisJCQkJdmFyIHByZWNpc2lvbiA9IHJheWNhc3Rlci5saW5lUHJlY2lzaW9u
OworCQkJCXZhciBwcmVjaXNpb25TcSA9IHByZWNpc2lvbiAqIHByZWNpc2lvbjsKKworCQkJCXZh
ciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CisJCQkJdmFyIG1hdHJpeFdvcmxkID0gdGhpcy5t
YXRyaXhXb3JsZDsKKworCQkJCS8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRv
IHJheQorCisJCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21l
dHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOworCisJCQkJc3BoZXJlLmNvcHkoIGdlb21ldHJ5
LmJvdW5kaW5nU3BoZXJlICk7CisJCQkJc3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQg
KTsKKworCQkJCWlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9
PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCQkvLworCisJCQkJaW52ZXJzZU1hdHJpeC5nZXRJbnZl
cnNlKCBtYXRyaXhXb3JsZCApOworCQkJCXJheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlN
YXRyaXg0KCBpbnZlcnNlTWF0cml4ICk7CisKKwkJCQl2YXIgdlN0YXJ0ID0gbmV3IFZlY3RvcjMo
KTsKKwkJCQl2YXIgdkVuZCA9IG5ldyBWZWN0b3IzKCk7CisJCQkJdmFyIGludGVyU2VnbWVudCA9
IG5ldyBWZWN0b3IzKCk7CisJCQkJdmFyIGludGVyUmF5ID0gbmV3IFZlY3RvcjMoKTsKKwkJCQl2
YXIgc3RlcCA9ICh0aGlzICYmIHRoaXMuaXNMaW5lU2VnbWVudHMpID8gMiA6IDE7CisKKwkJCQlp
ZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisKKwkJCQkJdmFyIGluZGV4ID0gZ2Vv
bWV0cnkuaW5kZXg7CisJCQkJCXZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsK
KwkJCQkJdmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7CisKKwkJCQkJ
aWYgKCBpbmRleCAhPT0gbnVsbCApIHsKKworCQkJCQkJdmFyIGluZGljZXMgPSBpbmRleC5hcnJh
eTsKKworCQkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGggLSAxOyBpIDwg
bDsgaSArPSBzdGVwICkgeworCisJCQkJCQkJdmFyIGEgPSBpbmRpY2VzWyBpIF07CisJCQkJCQkJ
dmFyIGIgPSBpbmRpY2VzWyBpICsgMSBdOworCisJCQkJCQkJdlN0YXJ0LmZyb21BcnJheSggcG9z
aXRpb25zLCBhICogMyApOworCQkJCQkJCXZFbmQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGIgKiAz
ICk7CisKKwkJCQkJCQl2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZTdGFy
dCwgdkVuZCwgaW50ZXJSYXksIGludGVyU2VnbWVudCApOworCisJCQkJCQkJaWYgKCBkaXN0U3Eg
PiBwcmVjaXNpb25TcSApIGNvbnRpbnVlOworCisJCQkJCQkJaW50ZXJSYXkuYXBwbHlNYXRyaXg0
KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0
YW5jZSBjYWxjdWxhdGlvbgorCisJCQkJCQkJdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5v
cmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTsKKworCQkJCQkJCWlmICggZGlzdGFuY2UgPCBy
YXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTsKKwor
CQkJCQkJCWludGVyc2VjdHMucHVzaCggeworCisJCQkJCQkJCWRpc3RhbmNlOiBkaXN0YW5jZSwK
KwkJCQkJCQkJLy8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJh
eSBvciBvbiB0aGUgc2VnbWVudD8/CisJCQkJCQkJCS8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0
KCBkaXN0YW5jZSApLAorCQkJCQkJCQlwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlN
YXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksCisJCQkJCQkJCWluZGV4OiBpLAorCQkJCQkJCQlm
YWNlOiBudWxsLAorCQkJCQkJCQlmYWNlSW5kZXg6IG51bGwsCisJCQkJCQkJCW9iamVjdDogdGhp
cworCisJCQkJCQkJfSApOworCisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJZm9y
ICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOyBpIDwgbDsgaSArPSBz
dGVwICkgeworCisJCQkJCQkJdlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSApOwor
CQkJCQkJCXZFbmQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIDMgKiBpICsgMyApOworCisJCQkJCQkJ
dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVy
UmF5LCBpbnRlclNlZ21lbnQgKTsKKworCQkJCQkJCWlmICggZGlzdFNxID4gcHJlY2lzaW9uU3Eg
KSBjb250aW51ZTsKKworCQkJCQkJCWludGVyUmF5LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhX
b3JsZCApOyAvL01vdmUgYmFjayB0byB3b3JsZCBzcGFjZSBmb3IgZGlzdGFuY2UgY2FsY3VsYXRp
b24KKworCQkJCQkJCXZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNl
VG8oIGludGVyUmF5ICk7CisKKwkJCQkJCQlpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIg
fHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgY29udGludWU7CisKKwkJCQkJCQlpbnRlcnNl
Y3RzLnB1c2goIHsKKworCQkJCQkJCQlkaXN0YW5jZTogZGlzdGFuY2UsCisJCQkJCQkJCS8vIFdo
YXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNl
Z21lbnQ/PworCQkJCQkJCQkvLyBwb2ludDogcmF5Y2FzdGVyLnJheS5hdCggZGlzdGFuY2UgKSwK
KwkJCQkJCQkJcG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggdGhpcy5t
YXRyaXhXb3JsZCApLAorCQkJCQkJCQlpbmRleDogaSwKKwkJCQkJCQkJZmFjZTogbnVsbCwKKwkJ
CQkJCQkJZmFjZUluZGV4OiBudWxsLAorCQkJCQkJCQlvYmplY3Q6IHRoaXMKKworCQkJCQkJCX0g
KTsKKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCX0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2Vv
bWV0cnkgKSB7CisKKwkJCQkJdmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7CisJCQkJ
CXZhciBuYlZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoOworCisJCQkJCWZvciAoIHZhciBpID0g
MDsgaSA8IG5iVmVydGljZXMgLSAxOyBpICs9IHN0ZXAgKSB7CisKKwkJCQkJCXZhciBkaXN0U3Eg
PSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggdmVydGljZXNbIGkgXSwgdmVydGljZXNbIGkgKyAx
IF0sIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTsKKworCQkJCQkJaWYgKCBkaXN0U3EgPiBwcmVj
aXNpb25TcSApIGNvbnRpbnVlOworCisJCQkJCQlpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMu
bWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNh
bGN1bGF0aW9uCisKKwkJCQkJCXZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRp
c3RhbmNlVG8oIGludGVyUmF5ICk7CisKKwkJCQkJCWlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIu
bmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTsKKworCQkJCQkJaW50
ZXJzZWN0cy5wdXNoKCB7CisKKwkJCQkJCQlkaXN0YW5jZTogZGlzdGFuY2UsCisJCQkJCQkJLy8g
V2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUg
c2VnbWVudD8/CisJCQkJCQkJLy8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICks
CisJCQkJCQkJcG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggdGhpcy5t
YXRyaXhXb3JsZCApLAorCQkJCQkJCWluZGV4OiBpLAorCQkJCQkJCWZhY2U6IG51bGwsCisJCQkJ
CQkJZmFjZUluZGV4OiBudWxsLAorCQkJCQkJCW9iamVjdDogdGhpcworCisJCQkJCQl9ICk7CisK
KwkJCQkJfQorCisJCQkJfQorCisJCQl9OworCisJCX0oKSApLAorCisJCWNsb25lOiBmdW5jdGlv
biAoKSB7CisKKwkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwg
dGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkg
KiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24g
TGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7CisKKwkJTGluZS5jYWxsKCB0aGlz
LCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKKworCQl0aGlzLnR5cGUgPSAnTGluZVNlZ21lbnRzJzsK
KworCX0KKworCUxpbmVTZWdtZW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3Qu
Y3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IExpbmVTZWdtZW50
cywKKworCQlpc0xpbmVTZWdtZW50czogdHJ1ZQorCisJfSApOworCisJLyoqCisJICogQGF1dGhv
ciBtZ3JldGVyIC8gaHR0cDovL2dpdGh1Yi5jb20vbWdyZXRlcgorCSAqLworCisJZnVuY3Rpb24g
TGluZUxvb3AoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHsKKworCQlMaW5lLmNhbGwoIHRoaXMsIGdl
b21ldHJ5LCBtYXRlcmlhbCApOworCisJCXRoaXMudHlwZSA9ICdMaW5lTG9vcCc7CisKKwl9CisK
KwlMaW5lTG9vcC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5l
LnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IExpbmVMb29wLAorCisJCWlzTGluZUxv
b3A6IHRydWUsCisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9t
cmRvb2IuY29tLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5j
b20vCisJICoKKwkgKiBwYXJhbWV0ZXJzID0geworCSAqICBjb2xvcjogPGhleD4sCisJICogIG9w
YWNpdHk6IDxmbG9hdD4sCisJICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwK
KwkgKgorCSAqICBzaXplOiA8ZmxvYXQ+LAorCSAqICBzaXplQXR0ZW51YXRpb246IDxib29sPgor
CSAqIH0KKwkgKi8KKworCWZ1bmN0aW9uIFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewor
CisJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJp
YWwnOworCisJCXRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7CisKKwkJdGhpcy5t
YXAgPSBudWxsOworCisJCXRoaXMuc2l6ZSA9IDE7CisJCXRoaXMuc2l6ZUF0dGVudWF0aW9uID0g
dHJ1ZTsKKworCQl0aGlzLmxpZ2h0cyA9IGZhbHNlOworCisJCXRoaXMuc2V0VmFsdWVzKCBwYXJh
bWV0ZXJzICk7CisKKwl9CisKKwlQb2ludHNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3Jl
YXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKKwlQb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29u
c3RydWN0b3IgPSBQb2ludHNNYXRlcmlhbDsKKworCVBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5p
c1BvaW50c01hdGVyaWFsID0gdHJ1ZTsKKworCVBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5jb3B5
ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2Fs
bCggdGhpcywgc291cmNlICk7CisKKwkJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsK
KworCQl0aGlzLm1hcCA9IHNvdXJjZS5tYXA7CisKKwkJdGhpcy5zaXplID0gc291cmNlLnNpemU7
CisJCXRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRlbnVhdGlvbjsKKworCQly
ZXR1cm4gdGhpczsKKworCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDov
L2FsdGVyZWRxdWFsaWEuY29tLworCSAqLworCisJZnVuY3Rpb24gUG9pbnRzKCBnZW9tZXRyeSwg
bWF0ZXJpYWwgKSB7CisKKwkJT2JqZWN0M0QuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9
ICdQb2ludHMnOworCisJCXRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8g
Z2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKwkJdGhpcy5tYXRlcmlhbCA9IG1hdGVy
aWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBQb2ludHNNYXRlcmlhbCggeyBjb2xv
cjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTsKKworCX0KKworCVBvaW50cy5wcm90b3R5
cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwg
eworCisJCWNvbnN0cnVjdG9yOiBQb2ludHMsCisKKwkJaXNQb2ludHM6IHRydWUsCisKKwkJcmF5
Y2FzdDogKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJp
eDQoKTsKKwkJCXZhciByYXkgPSBuZXcgUmF5KCk7CisJCQl2YXIgc3BoZXJlID0gbmV3IFNwaGVy
ZSgpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3Rz
ICkgeworCisJCQkJdmFyIG9iamVjdCA9IHRoaXM7CisJCQkJdmFyIGdlb21ldHJ5ID0gdGhpcy5n
ZW9tZXRyeTsKKwkJCQl2YXIgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkOworCQkJCXZh
ciB0aHJlc2hvbGQgPSByYXljYXN0ZXIucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7CisKKwkJCQkv
LyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXkKKworCQkJCWlmICggZ2Vv
bWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdT
cGhlcmUoKTsKKworCQkJCXNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApOwor
CQkJCXNwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7CisJCQkJc3BoZXJlLnJhZGl1
cyArPSB0aHJlc2hvbGQ7CisKKwkJCQlpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVy
ZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuOworCisJCQkJLy8KKworCQkJCWludmVyc2VN
YXRyaXguZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTsKKwkJCQlyYXkuY29weSggcmF5Y2FzdGVy
LnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApOworCisJCQkJdmFyIGxvY2FsVGhy
ZXNob2xkID0gdGhyZXNob2xkIC8gKCAoIHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSArIHRo
aXMuc2NhbGUueiApIC8gMyApOworCQkJCXZhciBsb2NhbFRocmVzaG9sZFNxID0gbG9jYWxUaHJl
c2hvbGQgKiBsb2NhbFRocmVzaG9sZDsKKwkJCQl2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygp
OworCisJCQkJZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXggKSB7CisKKwkJCQkJdmFy
IHJheVBvaW50RGlzdGFuY2VTcSA9IHJheS5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKTsKKwor
CQkJCQlpZiAoIHJheVBvaW50RGlzdGFuY2VTcSA8IGxvY2FsVGhyZXNob2xkU3EgKSB7CisKKwkJ
CQkJCXZhciBpbnRlcnNlY3RQb2ludCA9IHJheS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCAp
OworCQkJCQkJaW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApOworCisJ
CQkJCQl2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRl
cnNlY3RQb2ludCApOworCisJCQkJCQlpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwg
ZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuOworCisJCQkJCQlpbnRlcnNlY3RzLnB1
c2goIHsKKworCQkJCQkJCWRpc3RhbmNlOiBkaXN0YW5jZSwKKwkJCQkJCQlkaXN0YW5jZVRvUmF5
OiBNYXRoLnNxcnQoIHJheVBvaW50RGlzdGFuY2VTcSApLAorCQkJCQkJCXBvaW50OiBpbnRlcnNl
Y3RQb2ludC5jbG9uZSgpLAorCQkJCQkJCWluZGV4OiBpbmRleCwKKwkJCQkJCQlmYWNlOiBudWxs
LAorCQkJCQkJCW9iamVjdDogb2JqZWN0CisKKwkJCQkJCX0gKTsKKworCQkJCQl9CisKKwkJCQl9
CisKKwkJCQlpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisKKwkJCQkJdmFyIGlu
ZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CisJCQkJCXZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0
cmlidXRlczsKKwkJCQkJdmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7
CisKKwkJCQkJaWYgKCBpbmRleCAhPT0gbnVsbCApIHsKKworCQkJCQkJdmFyIGluZGljZXMgPSBp
bmRleC5hcnJheTsKKworCQkJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGluZGljZXMubGVuZ3Ro
OyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQkJCQl2YXIgYSA9IGluZGljZXNbIGkgXTsKKworCQkJ
CQkJCXBvc2l0aW9uLmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApOworCisJCQkJCQkJdGVz
dFBvaW50KCBwb3NpdGlvbiwgYSApOworCisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIHsKKworCQkJ
CQkJZm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgPCBsOyBpICsr
ICkgeworCisJCQkJCQkJcG9zaXRpb24uZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKiAzICk7CisK
KwkJCQkJCQl0ZXN0UG9pbnQoIHBvc2l0aW9uLCBpICk7CisKKwkJCQkJCX0KKworCQkJCQl9CisK
KwkJCQl9IGVsc2UgeworCisJCQkJCXZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOwor
CisJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysg
KSB7CisKKwkJCQkJCXRlc3RQb2ludCggdmVydGljZXNbIGkgXSwgaSApOworCisJCQkJCX0KKwor
CQkJCX0KKworCQkJfTsKKworCQl9KCkgKSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJ
CQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJp
YWwgKS5jb3B5KCB0aGlzICk7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBt
cmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEdyb3VwKCkgewor
CisJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnR3JvdXAnOworCisJ
fQorCisJR3JvdXAucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2Jq
ZWN0M0QucHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogR3JvdXAKKworCX0gKTsKKwor
CS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlm
dW5jdGlvbiBWaWRlb1RleHR1cmUoIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0Zp
bHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7CisKKwkJVGV4dHVy
ZS5jYWxsKCB0aGlzLCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1p
bkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7CisKKwkJdGhpcy5nZW5lcmF0ZU1p
cG1hcHMgPSBmYWxzZTsKKworCQl2YXIgc2NvcGUgPSB0aGlzOworCisJCWZ1bmN0aW9uIHVwZGF0
ZSgpIHsKKworCQkJcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCB1cGRhdGUgKTsKKworCQkJaWYgKCB2
aWRlby5yZWFkeVN0YXRlID49IHZpZGVvLkhBVkVfQ1VSUkVOVF9EQVRBICkgeworCisJCQkJc2Nv
cGUubmVlZHNVcGRhdGUgPSB0cnVlOworCisJCQl9CisKKwkJfQorCisJCXVwZGF0ZSgpOworCisJ
fQorCisJVmlkZW9UZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJv
dG90eXBlICk7CisJVmlkZW9UZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZpZGVvVGV4
dHVyZTsKKworCS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxp
YS5jb20vCisJICovCisKKwlmdW5jdGlvbiBDb21wcmVzc2VkVGV4dHVyZSggbWlwbWFwcywgd2lk
dGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRl
ciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHsKKworCQlUZXh0dXJlLmNhbGwo
IHRoaXMsIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIs
IGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTsKKworCQl0aGlzLmltYWdlID0g
eyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07CisJCXRoaXMubWlwbWFwcyA9IG1pcG1h
cHM7CisKKwkJLy8gbm8gZmxpcHBpbmcgZm9yIGN1YmUgdGV4dHVyZXMKKwkJLy8gKGFsc28gZmxp
cHBpbmcgZG9lc24ndCB3b3JrIGZvciBjb21wcmVzc2VkIHRleHR1cmVzICkKKworCQl0aGlzLmZs
aXBZID0gZmFsc2U7CisKKwkJLy8gY2FuJ3QgZ2VuZXJhdGUgbWlwbWFwcyBmb3IgY29tcHJlc3Nl
ZCB0ZXh0dXJlcworCQkvLyBtaXBzIG11c3QgYmUgZW1iZWRkZWQgaW4gRERTIGZpbGVzCisKKwkJ
dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTsKKworCX0KKworCUNvbXByZXNzZWRUZXh0dXJl
LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7CisJQ29tcHJl
c3NlZFRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29tcHJlc3NlZFRleHR1cmU7CisK
KwlDb21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZSA9IHRydWU7
CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLwor
CisJZnVuY3Rpb24gQ2FudmFzVGV4dHVyZSggY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQs
IG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7CisKKwkJ
VGV4dHVyZS5jYWxsKCB0aGlzLCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmls
dGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApOworCisJCXRoaXMubmVl
ZHNVcGRhdGUgPSB0cnVlOworCisJfQorCisJQ2FudmFzVGV4dHVyZS5wcm90b3R5cGUgPSBPYmpl
Y3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApOworCUNhbnZhc1RleHR1cmUucHJvdG90eXBl
LmNvbnN0cnVjdG9yID0gQ2FudmFzVGV4dHVyZTsKKworCS8qKgorCSAqIEBhdXRob3IgTWF0dCBE
ZXNMYXVyaWVycyAvIEBtYXR0ZGVzbAorCSAqIEBhdXRob3IgYXRpeCAvIGFydGh1cnNpbGJlci5k
ZQorCSAqLworCisJZnVuY3Rpb24gRGVwdGhUZXh0dXJlKCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBt
YXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBm
b3JtYXQgKSB7CisKKwkJZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBE
ZXB0aEZvcm1hdDsKKworCQlpZiAoIGZvcm1hdCAhPT0gRGVwdGhGb3JtYXQgJiYgZm9ybWF0ICE9
PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7CisKKwkJCXRocm93IG5ldyBFcnJvciggJ0RlcHRoVGV4
dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVw
dGhTdGVuY2lsRm9ybWF0JyApCisKKwkJfQorCisJCWlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYm
IGZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7CisJCWlm
ICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkg
dHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTsKKworCQlUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGws
IG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlw
ZSwgYW5pc290cm9weSApOworCisJCXRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0
OiBoZWlnaHQgfTsKKworCQl0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVk
ID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjsKKwkJdGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0
ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7CisKKwkJdGhpcy5m
bGlwWSA9IGZhbHNlOworCQl0aGlzLmdlbmVyYXRlTWlwbWFwcwk9IGZhbHNlOworCisJfQorCisJ
RGVwdGhUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBl
ICk7CisJRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERlcHRoVGV4dHVyZTsK
KwlEZXB0aFRleHR1cmUucHJvdG90eXBlLmlzRGVwdGhUZXh0dXJlID0gdHJ1ZTsKKworCS8qKgor
CSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBNdWdl
bjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKwkgKi8KKworCWZ1bmN0aW9uIFdpcmVm
cmFtZUdlb21ldHJ5KCBnZW9tZXRyeSApIHsKKworCQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlz
ICk7CisKKwkJdGhpcy50eXBlID0gJ1dpcmVmcmFtZUdlb21ldHJ5JzsKKworCQkvLyBidWZmZXIK
KworCQl2YXIgdmVydGljZXMgPSBbXTsKKworCQkvLyBoZWxwZXIgdmFyaWFibGVzCisKKwkJdmFy
IGksIGosIGwsIG8sIG9sOworCQl2YXIgZWRnZSA9IFsgMCwgMCBdLCBlZGdlcyA9IHt9LCBlLCBl
ZGdlMSwgZWRnZTI7CisJCXZhciBrZXksIGtleXMgPSBbICdhJywgJ2InLCAnYycgXTsKKwkJdmFy
IHZlcnRleDsKKworCQkvLyBkaWZmZXJlbnQgbG9naWMgZm9yIEdlb21ldHJ5IGFuZCBCdWZmZXJH
ZW9tZXRyeQorCisJCWlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKKwor
CQkJLy8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWRnZXMgd2l0
aG91dCBkdXBsaWNhdGVzCisKKwkJCXZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzOworCisJCQlm
b3IgKCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQl2YXIg
ZmFjZSA9IGZhY2VzWyBpIF07CisKKwkJCQlmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7CisK
KwkJCQkJZWRnZTEgPSBmYWNlWyBrZXlzWyBqIF0gXTsKKwkJCQkJZWRnZTIgPSBmYWNlWyBrZXlz
WyAoIGogKyAxICkgJSAzIF0gXTsKKwkJCQkJZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBl
ZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1cGxpY2F0ZXMKKwkJCQkJZWRnZVsgMSBdID0g
TWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApOworCisJCQkJCWtleSA9IGVkZ2VbIDAgXSArICcsJyAr
IGVkZ2VbIDEgXTsKKworCQkJCQlpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkgewor
CisJCQkJCQllZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2Vb
IDEgXSB9OworCisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQkvLyBnZW5lcmF0ZSB2ZXJ0
aWNlcworCisJCQlmb3IgKCBrZXkgaW4gZWRnZXMgKSB7CisKKwkJCQllID0gZWRnZXNbIGtleSBd
OworCisJCQkJdmVydGV4ID0gZ2VvbWV0cnkudmVydGljZXNbIGUuaW5kZXgxIF07CisJCQkJdmVy
dGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJCQkJdmVydGV4
ID0gZ2VvbWV0cnkudmVydGljZXNbIGUuaW5kZXgyIF07CisJCQkJdmVydGljZXMucHVzaCggdmVy
dGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJCQl9CisKKwkJfSBlbHNlIGlmICggZ2Vv
bWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKKworCQkJdmFyIHBvc2l0aW9u
LCBpbmRpY2VzLCBncm91cHM7CisJCQl2YXIgZ3JvdXAsIHN0YXJ0LCBjb3VudDsKKwkJCXZhciBp
bmRleDEsIGluZGV4MjsKKworCQkJdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKKworCQkJaWYgKCBn
ZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHsKKworCQkJCS8vIGluZGV4ZWQgQnVmZmVyR2VvbWV0
cnkKKworCQkJCXBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKKwkJCQlp
bmRpY2VzID0gZ2VvbWV0cnkuaW5kZXg7CisJCQkJZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOwor
CisJCQkJaWYgKCBncm91cHMubGVuZ3RoID09PSAwICkgeworCisJCQkJCWdyb3VwcyA9IFsgeyBz
dGFydDogMCwgY291bnQ6IGluZGljZXMuY291bnQsIG1hdGVyaWFsSW5kZXg6IDAgfSBdOworCisJ
CQkJfQorCisJCQkJLy8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwg
ZWdlcyB3aXRob3V0IGR1cGxpY2F0ZXMKKworCQkJCWZvciAoIG8gPSAwLCBvbCA9IGdyb3Vwcy5s
ZW5ndGg7IG8gPCBvbDsgKysgbyApIHsKKworCQkJCQlncm91cCA9IGdyb3Vwc1sgbyBdOworCisJ
CQkJCXN0YXJ0ID0gZ3JvdXAuc3RhcnQ7CisJCQkJCWNvdW50ID0gZ3JvdXAuY291bnQ7CisKKwkJ
CQkJZm9yICggaSA9IHN0YXJ0LCBsID0gKCBzdGFydCArIGNvdW50ICk7IGkgPCBsOyBpICs9IDMg
KSB7CisKKwkJCQkJCWZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHsKKworCQkJCQkJCWVkZ2Ux
ID0gaW5kaWNlcy5nZXRYKCBpICsgaiApOworCQkJCQkJCWVkZ2UyID0gaW5kaWNlcy5nZXRYKCBp
ICsgKCBqICsgMSApICUgMyApOworCQkJCQkJCWVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwg
ZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzCisJCQkJCQkJZWRnZVsgMSBd
ID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApOworCisJCQkJCQkJa2V5ID0gZWRnZVsgMCBdICsg
JywnICsgZWRnZVsgMSBdOworCisJCQkJCQkJaWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5l
ZCApIHsKKworCQkJCQkJCQllZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRl
eDI6IGVkZ2VbIDEgXSB9OworCisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJ
fQorCisJCQkJLy8gZ2VuZXJhdGUgdmVydGljZXMKKworCQkJCWZvciAoIGtleSBpbiBlZGdlcyAp
IHsKKworCQkJCQllID0gZWRnZXNbIGtleSBdOworCisJCQkJCXZlcnRleC5mcm9tQnVmZmVyQXR0
cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDEgKTsKKwkJCQkJdmVydGljZXMucHVzaCggdmVydGV4
LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJCQkJCXZlcnRleC5mcm9tQnVmZmVyQXR0cmli
dXRlKCBwb3NpdGlvbiwgZS5pbmRleDIgKTsKKwkJCQkJdmVydGljZXMucHVzaCggdmVydGV4Lngs
IHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJCQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJLy8g
bm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkKKworCQkJCXBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0
cmlidXRlcy5wb3NpdGlvbjsKKworCQkJCWZvciAoIGkgPSAwLCBsID0gKCBwb3NpdGlvbi5jb3Vu
dCAvIDMgKTsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJZm9yICggaiA9IDA7IGogPCAzOyBqICsr
ICkgeworCisJCQkJCQkvLyB0aHJlZSBlZGdlcyBwZXIgdHJpYW5nbGUsIGFuIGVkZ2UgaXMgcmVw
cmVzZW50ZWQgYXMgKGluZGV4MSwgaW5kZXgyKQorCQkJCQkJLy8gZS5nLiB0aGUgZmlyc3QgdHJp
YW5nbGUgaGFzIHRoZSBmb2xsb3dpbmcgZWRnZXM6ICgwLDEpLCgxLDIpLCgyLDApCisKKwkJCQkJ
CWluZGV4MSA9IDMgKiBpICsgajsKKwkJCQkJCXZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBw
b3NpdGlvbiwgaW5kZXgxICk7CisJCQkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4
LnksIHZlcnRleC56ICk7CisKKwkJCQkJCWluZGV4MiA9IDMgKiBpICsgKCAoIGogKyAxICkgJSAz
ICk7CisJCQkJCQl2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MiAp
OworCQkJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwor
CisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCX0KKworCQkvLyBidWlsZCBnZW9tZXRyeQor
CisJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJp
YnV0ZSggdmVydGljZXMsIDMgKSApOworCisJfQorCisJV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90
eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisJV2lyZWZy
YW1lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gV2lyZWZyYW1lR2VvbWV0cnk7CisK
KwkvKioKKwkgKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NQorCSAqIEBh
dXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisJICoKKwkgKiBQYXJh
bWV0cmljIFN1cmZhY2VzIEdlb21ldHJ5CisJICogYmFzZWQgb24gdGhlIGJyaWxsaWFudCBhcnRp
Y2xlIGJ5IEBwcmlkZW91dCBodHRwOi8vcHJpZGVvdXQubmV0L2Jsb2cvP3A9NDQKKwkgKi8KKwor
CS8vIFBhcmFtZXRyaWNHZW9tZXRyeQorCisJZnVuY3Rpb24gUGFyYW1ldHJpY0dlb21ldHJ5KCBm
dW5jLCBzbGljZXMsIHN0YWNrcyApIHsKKworCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJ
dGhpcy50eXBlID0gJ1BhcmFtZXRyaWNHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0g
eworCQkJZnVuYzogZnVuYywKKwkJCXNsaWNlczogc2xpY2VzLAorCQkJc3RhY2tzOiBzdGFja3MK
KwkJfTsKKworCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBhcmFtZXRyaWNCdWZmZXJH
ZW9tZXRyeSggZnVuYywgc2xpY2VzLCBzdGFja3MgKSApOworCQl0aGlzLm1lcmdlVmVydGljZXMo
KTsKKworCX0KKworCVBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRl
KCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlQYXJhbWV0cmljR2VvbWV0cnkucHJvdG90eXBlLmNv
bnN0cnVjdG9yID0gUGFyYW1ldHJpY0dlb21ldHJ5OworCisJLy8gUGFyYW1ldHJpY0J1ZmZlckdl
b21ldHJ5CisKKwlmdW5jdGlvbiBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkoIGZ1bmMsIHNsaWNl
cywgc3RhY2tzICkgeworCisJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlz
LnR5cGUgPSAnUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMg
PSB7CisJCQlmdW5jOiBmdW5jLAorCQkJc2xpY2VzOiBzbGljZXMsCisJCQlzdGFja3M6IHN0YWNr
cworCQl9OworCisJCS8vIGJ1ZmZlcnMKKworCQl2YXIgaW5kaWNlcyA9IFtdOworCQl2YXIgdmVy
dGljZXMgPSBbXTsKKwkJdmFyIG5vcm1hbHMgPSBbXTsKKwkJdmFyIHV2cyA9IFtdOworCisJCXZh
ciBFUFMgPSAwLjAwMDAxOworCisJCXZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOworCisJCXZh
ciBwMCA9IG5ldyBWZWN0b3IzKCksIHAxID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIHB1ID0gbmV3
IFZlY3RvcjMoKSwgcHYgPSBuZXcgVmVjdG9yMygpOworCisJCXZhciBpLCBqOworCisJCS8vIGdl
bmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKKworCQl2YXIgc2xpY2VDb3VudCA9IHNs
aWNlcyArIDE7CisKKwkJZm9yICggaSA9IDA7IGkgPD0gc3RhY2tzOyBpICsrICkgeworCisJCQl2
YXIgdiA9IGkgLyBzdGFja3M7CisKKwkJCWZvciAoIGogPSAwOyBqIDw9IHNsaWNlczsgaiArKyAp
IHsKKworCQkJCXZhciB1ID0gaiAvIHNsaWNlczsKKworCQkJCS8vIHZlcnRleAorCisJCQkJcDAg
PSBmdW5jKCB1LCB2LCBwMCApOworCQkJCXZlcnRpY2VzLnB1c2goIHAwLngsIHAwLnksIHAwLnog
KTsKKworCQkJCS8vIG5vcm1hbAorCisJCQkJLy8gYXBwcm94aW1hdGUgdGFuZ2VudCB2ZWN0b3Jz
IHZpYSBmaW5pdGUgZGlmZmVyZW5jZXMKKworCQkJCWlmICggdSAtIEVQUyA+PSAwICkgeworCisJ
CQkJCXAxID0gZnVuYyggdSAtIEVQUywgdiwgcDEgKTsKKwkJCQkJcHUuc3ViVmVjdG9ycyggcDAs
IHAxICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXAxID0gZnVuYyggdSArIEVQUywgdiwgcDEg
KTsKKwkJCQkJcHUuc3ViVmVjdG9ycyggcDEsIHAwICk7CisKKwkJCQl9CisKKwkJCQlpZiAoIHYg
LSBFUFMgPj0gMCApIHsKKworCQkJCQlwMSA9IGZ1bmMoIHUsIHYgLSBFUFMsIHAxICk7CisJCQkJ
CXB2LnN1YlZlY3RvcnMoIHAwLCBwMSApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQlwMSA9IGZ1
bmMoIHUsIHYgKyBFUFMsIHAxICk7CisJCQkJCXB2LnN1YlZlY3RvcnMoIHAxLCBwMCApOworCisJ
CQkJfQorCisJCQkJLy8gY3Jvc3MgcHJvZHVjdCBvZiB0YW5nZW50IHZlY3RvcnMgcmV0dXJucyBz
dXJmYWNlIG5vcm1hbAorCisJCQkJbm9ybWFsLmNyb3NzVmVjdG9ycyggcHUsIHB2ICkubm9ybWFs
aXplKCk7CisJCQkJbm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7
CisKKwkJCQkvLyB1dgorCisJCQkJdXZzLnB1c2goIHUsIHYgKTsKKworCQkJfQorCisJCX0KKwor
CQkvLyBnZW5lcmF0ZSBpbmRpY2VzCisKKwkJZm9yICggaSA9IDA7IGkgPCBzdGFja3M7IGkgKysg
KSB7CisKKwkJCWZvciAoIGogPSAwOyBqIDwgc2xpY2VzOyBqICsrICkgeworCisJCQkJdmFyIGEg
PSBpICogc2xpY2VDb3VudCArIGo7CisJCQkJdmFyIGIgPSBpICogc2xpY2VDb3VudCArIGogKyAx
OworCQkJCXZhciBjID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGogKyAxOworCQkJCXZhciBk
ID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGo7CisKKwkJCQkvLyBmYWNlcyBvbmUgYW5kIHR3
bworCisJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CisJCQkJaW5kaWNlcy5wdXNoKCBiLCBj
LCBkICk7CisKKwkJCX0KKworCQl9CisKKwkJLy8gYnVpbGQgZ2VvbWV0cnkKKworCQl0aGlzLnNl
dEluZGV4KCBpbmRpY2VzICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcg
RmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworCQl0aGlzLmFkZEF0dHJp
YnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkg
KTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRl
KCB1dnMsIDIgKSApOworCisJfQorCisJUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlw
ZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOworCVBhcmFtZXRy
aWNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljQnVmZmVy
R2VvbWV0cnk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGNsb2Nrd29ya2dlZWsgLyBodHRwczovL2dp
dGh1Yi5jb20vY2xvY2t3b3JrZ2VlaworCSAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRw
czovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXkKKwkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8g
aHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKwkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRw
czovL2dpdGh1Yi5jb20vTXVnZW44NworCSAqLworCisJLy8gUG9seWhlZHJvbkdlb21ldHJ5CisK
KwlmdW5jdGlvbiBQb2x5aGVkcm9uR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMs
IGRldGFpbCApIHsKKworCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0g
J1BvbHloZWRyb25HZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJdmVydGlj
ZXM6IHZlcnRpY2VzLAorCQkJaW5kaWNlczogaW5kaWNlcywKKwkJCXJhZGl1czogcmFkaXVzLAor
CQkJZGV0YWlsOiBkZXRhaWwKKwkJfTsKKworCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3
IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0
YWlsICkgKTsKKwkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CisKKwl9CisKKwlQb2x5aGVkcm9uR2Vv
bWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisJ
UG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbHloZWRyb25HZW9t
ZXRyeTsKKworCS8vIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeQorCisJZnVuY3Rpb24gUG9seWhl
ZHJvbkJ1ZmZlckdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSB7
CisKKwkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdQb2x5
aGVkcm9uQnVmZmVyR2VvbWV0cnknOworCisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXZlcnRp
Y2VzOiB2ZXJ0aWNlcywKKwkJCWluZGljZXM6IGluZGljZXMsCisJCQlyYWRpdXM6IHJhZGl1cywK
KwkJCWRldGFpbDogZGV0YWlsCisJCX07CisKKwkJcmFkaXVzID0gcmFkaXVzIHx8IDE7CisJCWRl
dGFpbCA9IGRldGFpbCB8fCAwOworCisJCS8vIGRlZmF1bHQgYnVmZmVyIGRhdGEKKworCQl2YXIg
dmVydGV4QnVmZmVyID0gW107CisJCXZhciB1dkJ1ZmZlciA9IFtdOworCisJCS8vIHRoZSBzdWJk
aXZpc2lvbiBjcmVhdGVzIHRoZSB2ZXJ0ZXggYnVmZmVyIGRhdGEKKworCQlzdWJkaXZpZGUoIGRl
dGFpbCApOworCisJCS8vIGFsbCB2ZXJ0aWNlcyBzaG91bGQgbGllIG9uIGEgY29uY2VwdHVhbCBz
cGhlcmUgd2l0aCBhIGdpdmVuIHJhZGl1cworCisJCWFwcHBseVJhZGl1cyggcmFkaXVzICk7CisK
KwkJLy8gZmluYWxseSwgY3JlYXRlIHRoZSB1diBkYXRhCisKKwkJZ2VuZXJhdGVVVnMoKTsKKwor
CQkvLyBidWlsZCBub24taW5kZXhlZCBnZW9tZXRyeQorCisJCXRoaXMuYWRkQXR0cmlidXRlKCAn
cG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGV4QnVmZmVyLCAzICkg
KTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJp
YnV0ZSggdmVydGV4QnVmZmVyLnNsaWNlKCksIDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSgg
J3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QnVmZmVyLCAyICkgKTsKKworCQlp
ZiAoIGRldGFpbCA9PT0gMCApIHsKKworCQkJdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOyAv
LyBmbGF0IG5vcm1hbHMKKworCQl9IGVsc2UgeworCisJCQl0aGlzLm5vcm1hbGl6ZU5vcm1hbHMo
KTsgLy8gc21vb3RoIG5vcm1hbHMKKworCQl9CisKKwkJLy8gaGVscGVyIGZ1bmN0aW9ucworCisJ
CWZ1bmN0aW9uIHN1YmRpdmlkZSggZGV0YWlsICkgeworCisJCQl2YXIgYSA9IG5ldyBWZWN0b3Iz
KCk7CisJCQl2YXIgYiA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgYyA9IG5ldyBWZWN0b3IzKCk7
CisKKwkJCS8vIGl0ZXJhdGUgb3ZlciBhbGwgZmFjZXMgYW5kIGFwcGx5IGEgc3ViZGl2aXNvbiB3
aXRoIHRoZSBnaXZlbiBkZXRhaWwgdmFsdWUKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgaW5k
aWNlcy5sZW5ndGg7IGkgKz0gMyApIHsKKworCQkJCS8vIGdldCB0aGUgdmVydGljZXMgb2YgdGhl
IGZhY2UKKworCQkJCWdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAwIF0sIGEgKTsKKwkJ
CQlnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMSBdLCBiICk7CisJCQkJZ2V0VmVydGV4
QnlJbmRleCggaW5kaWNlc1sgaSArIDIgXSwgYyApOworCisJCQkJLy8gcGVyZm9ybSBzdWJkaXZp
c2lvbgorCisJCQkJc3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICk7CisKKwkJCX0KKwor
CQl9CisKKwkJZnVuY3Rpb24gc3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICkgeworCisJ
CQl2YXIgY29scyA9IE1hdGgucG93KCAyLCBkZXRhaWwgKTsKKworCQkJLy8gd2UgdXNlIHRoaXMg
bXVsdGlkaW1lbnNpb25hbCBhcnJheSBhcyBhIGRhdGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyB0
aGUgc3ViZGl2aXNpb24KKworCQkJdmFyIHYgPSBbXTsKKworCQkJdmFyIGksIGo7CisKKwkJCS8v
IGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlzaW9uCisKKwkJ
CWZvciAoIGkgPSAwOyBpIDw9IGNvbHM7IGkgKysgKSB7CisKKwkJCQl2WyBpIF0gPSBbXTsKKwor
CQkJCXZhciBhaiA9IGEuY2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApOworCQkJCXZhciBiaiA9
IGIuY2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApOworCisJCQkJdmFyIHJvd3MgPSBjb2xzIC0g
aTsKKworCQkJCWZvciAoIGogPSAwOyBqIDw9IHJvd3M7IGogKysgKSB7CisKKwkJCQkJaWYgKCBq
ID09PSAwICYmIGkgPT09IGNvbHMgKSB7CisKKwkJCQkJCXZbIGkgXVsgaiBdID0gYWo7CisKKwkJ
CQkJfSBlbHNlIHsKKworCQkJCQkJdlsgaSBdWyBqIF0gPSBhai5jbG9uZSgpLmxlcnAoIGJqLCBq
IC8gcm93cyApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQkvLyBjb25zdHJ1Y3Qg
YWxsIG9mIHRoZSBmYWNlcworCisJCQlmb3IgKCBpID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7CisK
KwkJCQlmb3IgKCBqID0gMDsgaiA8IDIgKiAoIGNvbHMgLSBpICkgLSAxOyBqICsrICkgeworCisJ
CQkJCXZhciBrID0gTWF0aC5mbG9vciggaiAvIDIgKTsKKworCQkJCQlpZiAoIGogJSAyID09PSAw
ICkgeworCisJCQkJCQlwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTsKKwkJCQkJCXB1c2hW
ZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApOworCQkJCQkJcHVzaFZlcnRleCggdlsgaSBdWyBrIF0g
KTsKKworCQkJCQl9IGVsc2UgeworCisJCQkJCQlwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0g
KTsKKwkJCQkJCXB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgKyAxIF0gKTsKKwkJCQkJCXB1c2hW
ZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJ
CX0KKworCQlmdW5jdGlvbiBhcHBwbHlSYWRpdXMoIHJhZGl1cyApIHsKKworCQkJdmFyIHZlcnRl
eCA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCS8vIGl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGJ1ZmZl
ciBhbmQgYXBwbHkgdGhlIHJhZGl1cyB0byBlYWNoIHZlcnRleAorCisJCQlmb3IgKCB2YXIgaSA9
IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7CisKKwkJCQl2ZXJ0ZXgueCA9
IHZlcnRleEJ1ZmZlclsgaSArIDAgXTsKKwkJCQl2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSAr
IDEgXTsKKwkJCQl2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTsKKworCQkJCXZlcnRl
eC5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggcmFkaXVzICk7CisKKwkJCQl2ZXJ0ZXhCdWZm
ZXJbIGkgKyAwIF0gPSB2ZXJ0ZXgueDsKKwkJCQl2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0gPSB2ZXJ0
ZXgueTsKKwkJCQl2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gPSB2ZXJ0ZXguejsKKworCQkJfQorCisJ
CX0KKworCQlmdW5jdGlvbiBnZW5lcmF0ZVVWcygpIHsKKworCQkJdmFyIHZlcnRleCA9IG5ldyBW
ZWN0b3IzKCk7CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7
IGkgKz0gMyApIHsKKworCQkJCXZlcnRleC54ID0gdmVydGV4QnVmZmVyWyBpICsgMCBdOworCQkJ
CXZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdOworCQkJCXZlcnRleC56ID0gdmVydGV4
QnVmZmVyWyBpICsgMiBdOworCisJCQkJdmFyIHUgPSBhemltdXRoKCB2ZXJ0ZXggKSAvIDIgLyBN
YXRoLlBJICsgMC41OworCQkJCXZhciB2ID0gaW5jbGluYXRpb24oIHZlcnRleCApIC8gTWF0aC5Q
SSArIDAuNTsKKwkJCQl1dkJ1ZmZlci5wdXNoKCB1LCAxIC0gdiApOworCisJCQl9CisKKwkJCWNv
cnJlY3RVVnMoKTsKKworCQkJY29ycmVjdFNlYW0oKTsKKworCQl9CisKKwkJZnVuY3Rpb24gY29y
cmVjdFNlYW0oKSB7CisKKwkJCS8vIGhhbmRsZSBjYXNlIHdoZW4gZmFjZSBzdHJhZGRsZXMgdGhl
IHNlYW0sIHNlZSAjMzI2OQorCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB1dkJ1ZmZlci5sZW5n
dGg7IGkgKz0gNiApIHsKKworCQkJCS8vIHV2IGRhdGEgb2YgYSBzaW5nbGUgZmFjZQorCisJCQkJ
dmFyIHgwID0gdXZCdWZmZXJbIGkgKyAwIF07CisJCQkJdmFyIHgxID0gdXZCdWZmZXJbIGkgKyAy
IF07CisJCQkJdmFyIHgyID0gdXZCdWZmZXJbIGkgKyA0IF07CisKKwkJCQl2YXIgbWF4ID0gTWF0
aC5tYXgoIHgwLCB4MSwgeDIgKTsKKwkJCQl2YXIgbWluID0gTWF0aC5taW4oIHgwLCB4MSwgeDIg
KTsKKworCQkJCS8vIDAuOSBpcyBzb21ld2hhdCBhcmJpdHJhcnkKKworCQkJCWlmICggbWF4ID4g
MC45ICYmIG1pbiA8IDAuMSApIHsKKworCQkJCQlpZiAoIHgwIDwgMC4yICkgdXZCdWZmZXJbIGkg
KyAwIF0gKz0gMTsKKwkJCQkJaWYgKCB4MSA8IDAuMiApIHV2QnVmZmVyWyBpICsgMiBdICs9IDE7
CisJCQkJCWlmICggeDIgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDQgXSArPSAxOworCisJCQkJfQor
CisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIHB1c2hWZXJ0ZXgoIHZlcnRleCApIHsKKworCQkJ
dmVydGV4QnVmZmVyLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworCQl9
CisKKwkJZnVuY3Rpb24gZ2V0VmVydGV4QnlJbmRleCggaW5kZXgsIHZlcnRleCApIHsKKworCQkJ
dmFyIHN0cmlkZSA9IGluZGV4ICogMzsKKworCQkJdmVydGV4LnggPSB2ZXJ0aWNlc1sgc3RyaWRl
ICsgMCBdOworCQkJdmVydGV4LnkgPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMSBdOworCQkJdmVydGV4
LnogPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMiBdOworCisJCX0KKworCQlmdW5jdGlvbiBjb3JyZWN0
VVZzKCkgeworCisJCQl2YXIgYSA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgYiA9IG5ldyBWZWN0
b3IzKCk7CisJCQl2YXIgYyA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXZhciBjZW50cm9pZCA9IG5l
dyBWZWN0b3IzKCk7CisKKwkJCXZhciB1dkEgPSBuZXcgVmVjdG9yMigpOworCQkJdmFyIHV2QiA9
IG5ldyBWZWN0b3IyKCk7CisJCQl2YXIgdXZDID0gbmV3IFZlY3RvcjIoKTsKKworCQkJZm9yICgg
dmFyIGkgPSAwLCBqID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gOSwgaiArPSA2
ICkgeworCisJCQkJYS5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDAgXSwgdmVydGV4QnVmZmVyWyBp
ICsgMSBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gKTsKKwkJCQliLnNldCggdmVydGV4QnVmZmVy
WyBpICsgMyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA0IF0sIHZlcnRleEJ1ZmZlclsgaSArIDUgXSAp
OworCQkJCWMuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyA2IF0sIHZlcnRleEJ1ZmZlclsgaSArIDcg
XSwgdmVydGV4QnVmZmVyWyBpICsgOCBdICk7CisKKwkJCQl1dkEuc2V0KCB1dkJ1ZmZlclsgaiAr
IDAgXSwgdXZCdWZmZXJbIGogKyAxIF0gKTsKKwkJCQl1dkIuc2V0KCB1dkJ1ZmZlclsgaiArIDIg
XSwgdXZCdWZmZXJbIGogKyAzIF0gKTsKKwkJCQl1dkMuc2V0KCB1dkJ1ZmZlclsgaiArIDQgXSwg
dXZCdWZmZXJbIGogKyA1IF0gKTsKKworCQkJCWNlbnRyb2lkLmNvcHkoIGEgKS5hZGQoIGIgKS5h
ZGQoIGMgKS5kaXZpZGVTY2FsYXIoIDMgKTsKKworCQkJCXZhciBhemkgPSBhemltdXRoKCBjZW50
cm9pZCApOworCisJCQkJY29ycmVjdFVWKCB1dkEsIGogKyAwLCBhLCBhemkgKTsKKwkJCQljb3Jy
ZWN0VVYoIHV2QiwgaiArIDIsIGIsIGF6aSApOworCQkJCWNvcnJlY3RVViggdXZDLCBqICsgNCwg
YywgYXppICk7CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gY29ycmVjdFVWKCB1diwgc3Ry
aWRlLCB2ZWN0b3IsIGF6aW11dGggKSB7CisKKwkJCWlmICggKCBhemltdXRoIDwgMCApICYmICgg
dXYueCA9PT0gMSApICkgeworCisJCQkJdXZCdWZmZXJbIHN0cmlkZSBdID0gdXYueCAtIDE7CisK
KwkJCX0KKworCQkJaWYgKCAoIHZlY3Rvci54ID09PSAwICkgJiYgKCB2ZWN0b3IueiA9PT0gMCAp
ICkgeworCisJCQkJdXZCdWZmZXJbIHN0cmlkZSBdID0gYXppbXV0aCAvIDIgLyBNYXRoLlBJICsg
MC41OworCisJCQl9CisKKwkJfQorCisJCS8vIEFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzLCBjb3Vu
dGVyLWNsb2Nrd2lzZSB3aGVuIGxvb2tpbmcgZnJvbSBhYm92ZS4KKworCQlmdW5jdGlvbiBhemlt
dXRoKCB2ZWN0b3IgKSB7CisKKwkJCXJldHVybiBNYXRoLmF0YW4yKCB2ZWN0b3IueiwgLSB2ZWN0
b3IueCApOworCisJCX0KKworCisJCS8vIEFuZ2xlIGFib3ZlIHRoZSBYWiBwbGFuZS4KKworCQlm
dW5jdGlvbiBpbmNsaW5hdGlvbiggdmVjdG9yICkgeworCisJCQlyZXR1cm4gTWF0aC5hdGFuMigg
LSB2ZWN0b3IueSwgTWF0aC5zcXJ0KCAoIHZlY3Rvci54ICogdmVjdG9yLnggKSArICggdmVjdG9y
LnogKiB2ZWN0b3IueiApICkgKTsKKworCQl9CisKKwl9CisKKwlQb2x5aGVkcm9uQnVmZmVyR2Vv
bWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBl
ICk7CisJUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBv
bHloZWRyb25CdWZmZXJHZW9tZXRyeTsKKworCS8qKgorCSAqIEBhdXRob3IgdGltb3RoeXByYXRs
ZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXkKKwkgKiBAYXV0aG9yIE11Z2Vu
ODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NworCSAqLworCisJLy8gVGV0cmFoZWRyb25H
ZW9tZXRyeQorCisJZnVuY3Rpb24gVGV0cmFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwg
KSB7CisKKwkJR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdUZXRyYWhl
ZHJvbkdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXM6IHJhZGl1
cywKKwkJCWRldGFpbDogZGV0YWlsCisJCX07CisKKwkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnko
IG5ldyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7CisJCXRo
aXMubWVyZ2VWZXJ0aWNlcygpOworCisJfQorCisJVGV0cmFoZWRyb25HZW9tZXRyeS5wcm90b3R5
cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlUZXRyYWhlZHJvbkdl
b21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uR2VvbWV0cnk7CisKKwkv
LyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5CisKKwlmdW5jdGlvbiBUZXRyYWhlZHJvbkJ1ZmZl
ckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKKworCQl2YXIgdmVydGljZXMgPSBbCisJCQkx
LCAgMSwgIDEsICAgLSAxLCAtIDEsICAxLCAgIC0gMSwgIDEsIC0gMSwgICAgMSwgLSAxLCAtIDEK
KwkJXTsKKworCQl2YXIgaW5kaWNlcyA9IFsKKwkJCTIsICAxLCAgMCwgICAgMCwgIDMsICAyLCAg
ICAxLCAgMywgIDAsICAgIDIsICAzLCAgMQorCQldOworCisJCVBvbHloZWRyb25CdWZmZXJHZW9t
ZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTsKKwor
CQl0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJh
bWV0ZXJzID0geworCQkJcmFkaXVzOiByYWRpdXMsCisJCQlkZXRhaWw6IGRldGFpbAorCQl9Owor
CisJfQorCisJVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3Jl
YXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisJVGV0cmFoZWRyb25C
dWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkJ1ZmZlckdl
b21ldHJ5OworCisJLyoqCisJICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0
aHViLmNvbS90aW1vdGh5cHJhdGxleQorCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0
aHViLmNvbS9NdWdlbjg3CisJICovCisKKwkvLyBPY3RhaGVkcm9uR2VvbWV0cnkKKworCWZ1bmN0
aW9uIE9jdGFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7CisKKwkJR2VvbWV0cnku
Y2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdPY3RhaGVkcm9uR2VvbWV0cnknOworCisJ
CXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXJhZGl1czogcmFkaXVzLAorCQkJZGV0YWlsOiBkZXRh
aWwKKwkJfTsKKworCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IE9jdGFoZWRyb25CdWZm
ZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApOworCQl0aGlzLm1lcmdlVmVydGljZXMoKTsK
KworCX0KKworCU9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBH
ZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlPY3RhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0
cnVjdG9yID0gT2N0YWhlZHJvbkdlb21ldHJ5OworCisJLy8gT2N0YWhlZHJvbkJ1ZmZlckdlb21l
dHJ5CisKKwlmdW5jdGlvbiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWls
ICkgeworCisJCXZhciB2ZXJ0aWNlcyA9IFsKKwkJCTEsIDAsIDAsICAgLSAxLCAwLCAwLCAgICAw
LCAxLCAwLCAgICAwLCAtIDEsIDAsICAgIDAsIDAsIDEsICAgIDAsIDAsIC0gMQorCQldOworCisJ
CXZhciBpbmRpY2VzID0gWworCQkJMCwgMiwgNCwgICAgMCwgNCwgMywgICAgMCwgMywgNSwgICAg
MCwgNSwgMiwgICAgMSwgMiwgNSwgICAgMSwgNSwgMywgICAgMSwgMywgNCwgICAgMSwgNCwgMgor
CQldOworCisJCVBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywg
aW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTsKKworCQl0aGlzLnR5cGUgPSAnT2N0YWhlZHJvbkJ1
ZmZlckdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXM6IHJhZGl1
cywKKwkJCWRldGFpbDogZGV0YWlsCisJCX07CisKKwl9CisKKwlPY3RhaGVkcm9uQnVmZmVyR2Vv
bWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5
LnByb3RvdHlwZSApOworCU9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3Ry
dWN0b3IgPSBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk7CisKKwkvKioKKwkgKiBAYXV0aG9yIHRp
bW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5CisJICogQGF1
dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKwkgKi8KKworCS8vIElj
b3NhaGVkcm9uR2VvbWV0cnkKKworCWZ1bmN0aW9uIEljb3NhaGVkcm9uR2VvbWV0cnkoIHJhZGl1
cywgZGV0YWlsICkgeworCisJIAlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBl
ID0gJ0ljb3NhaGVkcm9uR2VvbWV0cnknOworCisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXJh
ZGl1czogcmFkaXVzLAorCQkJZGV0YWlsOiBkZXRhaWwKKwkJfTsKKworCQl0aGlzLmZyb21CdWZm
ZXJHZW9tZXRyeSggbmV3IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWls
ICkgKTsKKwkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CisKKwl9CisKKwlJY29zYWhlZHJvbkdlb21l
dHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOworCUlj
b3NhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25HZW9t
ZXRyeTsKKworCS8vIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkKKworCWZ1bmN0aW9uIEljb3Nh
aGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgeworCisJCXZhciB0ID0gKCAx
ICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7CisKKwkJdmFyIHZlcnRpY2VzID0gWworCQkJLSAxLCAg
dCwgIDAsICAgIDEsICB0LCAgMCwgICAtIDEsIC0gdCwgIDAsICAgIDEsIC0gdCwgIDAsCisJCQkg
MCwgLSAxLCAgdCwgICAgMCwgIDEsICB0LCAgICAwLCAtIDEsIC0gdCwgICAgMCwgIDEsIC0gdCwK
KwkJCSB0LCAgMCwgLSAxLCAgICB0LCAgMCwgIDEsICAgLSB0LCAgMCwgLSAxLCAgIC0gdCwgIDAs
ICAxCisJCV07CisKKwkJdmFyIGluZGljZXMgPSBbCisJCQkgMCwgMTEsICA1LCAgICAwLCAgNSwg
IDEsICAgIDAsICAxLCAgNywgICAgMCwgIDcsIDEwLCAgICAwLCAxMCwgMTEsCisJCQkgMSwgIDUs
ICA5LCAgICA1LCAxMSwgIDQsICAgMTEsIDEwLCAgMiwgICAxMCwgIDcsICA2LCAgICA3LCAgMSwg
IDgsCisJCQkgMywgIDksICA0LCAgICAzLCAgNCwgIDIsICAgIDMsICAyLCAgNiwgICAgMywgIDYs
ICA4LCAgICAzLCAgOCwgIDksCisJCQkgNCwgIDksICA1LCAgICAyLCAgNCwgMTEsICAgIDYsICAy
LCAxMCwgICAgOCwgIDYsICA3LCAgICA5LCAgOCwgIDEKKwkJXTsKKworCQlQb2x5aGVkcm9uQnVm
ZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWls
ICk7CisKKwkJdGhpcy50eXBlID0gJ0ljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnknOworCisJCXRo
aXMucGFyYW1ldGVycyA9IHsKKwkJCXJhZGl1czogcmFkaXVzLAorCQkJZGV0YWlsOiBkZXRhaWwK
KwkJfTsKKworCX0KKworCUljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2Jq
ZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOworCUljb3Nh
aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25C
dWZmZXJHZW9tZXRyeTsKKworCS8qKgorCSAqIEBhdXRob3IgQWJlIFBhem9zIC8gaHR0cHM6Ly9o
YW1vaWQuY29tCisJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2Vu
ODcKKwkgKi8KKworCS8vIERvZGVjYWhlZHJvbkdlb21ldHJ5CisKKwlmdW5jdGlvbiBEb2RlY2Fo
ZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7CisKKwkJR2VvbWV0cnkuY2FsbCggdGhp
cyApOworCisJCXRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25HZW9tZXRyeSc7CisKKwkJdGhpcy5w
YXJhbWV0ZXJzID0geworCQkJcmFkaXVzOiByYWRpdXMsCisJCQlkZXRhaWw6IGRldGFpbAorCQl9
OworCisJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgRG9kZWNhaGVkcm9uQnVmZmVyR2Vv
bWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTsKKwkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CisKKwl9
CisKKwlEb2RlY2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9t
ZXRyeS5wcm90b3R5cGUgKTsKKwlEb2RlY2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3Ry
dWN0b3IgPSBEb2RlY2FoZWRyb25HZW9tZXRyeTsKKworCS8vIERvZGVjYWhlZHJvbkJ1ZmZlckdl
b21ldHJ5CisKKwlmdW5jdGlvbiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBk
ZXRhaWwgKSB7CisKKwkJdmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjsKKwkJdmFy
IHIgPSAxIC8gdDsKKworCQl2YXIgdmVydGljZXMgPSBbCisKKwkJCS8vICjCsTEsIMKxMSwgwrEx
KQorCQkJLSAxLCAtIDEsIC0gMSwgICAgLSAxLCAtIDEsICAxLAorCQkJLSAxLCAgMSwgLSAxLCAg
ICAtIDEsICAxLCAgMSwKKwkJCSAgMSwgLSAxLCAtIDEsICAgICAxLCAtIDEsICAxLAorCQkJICAx
LCAgMSwgLSAxLCAgICAgMSwgIDEsICAxLAorCisJCQkvLyAoMCwgwrExL8+GLCDCsc+GKQorCQkJ
IDAsIC0gciwgLSB0LCAgICAgMCwgLSByLCAgdCwKKwkJCSAwLCAgciwgLSB0LCAgICAgMCwgIHIs
ICB0LAorCisJCQkvLyAowrExL8+GLCDCsc+GLCAwKQorCQkJLSByLCAtIHQsICAwLCAgICAtIHIs
ICB0LCAgMCwKKwkJCSByLCAtIHQsICAwLCAgICAgciwgIHQsICAwLAorCisJCQkvLyAowrHPhiwg
MCwgwrExL8+GKQorCQkJLSB0LCAgMCwgLSByLCAgICAgdCwgIDAsIC0gciwKKwkJCS0gdCwgIDAs
ICByLCAgICAgdCwgIDAsICByCisJCV07CisKKwkJdmFyIGluZGljZXMgPSBbCisJCQkgMywgMTEs
ICA3LCAgICAgIDMsICA3LCAxNSwgICAgICAzLCAxNSwgMTMsCisJCQkgNywgMTksIDE3LCAgICAg
IDcsIDE3LCAgNiwgICAgICA3LCAgNiwgMTUsCisJCQkxNywgIDQsICA4LCAgICAgMTcsICA4LCAx
MCwgICAgIDE3LCAxMCwgIDYsCisJCQkgOCwgIDAsIDE2LCAgICAgIDgsIDE2LCAgMiwgICAgICA4
LCAgMiwgMTAsCisJCQkgMCwgMTIsICAxLCAgICAgIDAsICAxLCAxOCwgICAgICAwLCAxOCwgMTYs
CisJCQkgNiwgMTAsICAyLCAgICAgIDYsICAyLCAxMywgICAgICA2LCAxMywgMTUsCisJCQkgMiwg
MTYsIDE4LCAgICAgIDIsIDE4LCAgMywgICAgICAyLCAgMywgMTMsCisJCQkxOCwgIDEsICA5LCAg
ICAgMTgsICA5LCAxMSwgICAgIDE4LCAxMSwgIDMsCisJCQkgNCwgMTQsIDEyLCAgICAgIDQsIDEy
LCAgMCwgICAgICA0LCAgMCwgIDgsCisJCQkxMSwgIDksICA1LCAgICAgMTEsICA1LCAxOSwgICAg
IDExLCAxOSwgIDcsCisJCQkxOSwgIDUsIDE0LCAgICAgMTksIDE0LCAgNCwgICAgIDE5LCAgNCwg
MTcsCisJCQkgMSwgMTIsIDE0LCAgICAgIDEsIDE0LCAgNSwgICAgICAxLCAgNSwgIDkKKwkJXTsK
KworCQlQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGlj
ZXMsIHJhZGl1cywgZGV0YWlsICk7CisKKwkJdGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkJ1ZmZl
ckdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXM6IHJhZGl1cywK
KwkJCWRldGFpbDogZGV0YWlsCisJCX07CisKKwl9CisKKwlEb2RlY2FoZWRyb25CdWZmZXJHZW9t
ZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnku
cHJvdG90eXBlICk7CisJRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0
cnVjdG9yID0gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk7CisKKwkvKioKKwkgKiBAYXV0aG9y
IG9vc21veGllY29kZSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9vb3Ntb3hpZWNvZGUKKwkgKiBAYXV0
aG9yIFdlc3RMYW5nbGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisJICogQGF1
dGhvciB6ejg1IC8gaHR0cHM6Ly9naXRodWIuY29tL3p6ODUKKwkgKiBAYXV0aG9yIG1pbmluZ29s
ZCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9taW5pbmdvbGQKKwkgKiBAYXV0aG9yIGpvbm9icjEgLyBo
dHRwczovL2dpdGh1Yi5jb20vam9ub2JyMQorCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8v
Z2l0aHViLmNvbS9NdWdlbjg3CisJICoKKwkgKi8KKworCS8vIFR1YmVHZW9tZXRyeQorCisJZnVu
Y3Rpb24gVHViZUdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFs
U2VnbWVudHMsIGNsb3NlZCwgdGFwZXIgKSB7CisKKwkJR2VvbWV0cnkuY2FsbCggdGhpcyApOwor
CisJCXRoaXMudHlwZSA9ICdUdWJlR2VvbWV0cnknOworCisJCXRoaXMucGFyYW1ldGVycyA9IHsK
KwkJCXBhdGg6IHBhdGgsCisJCQl0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cywKKwkJ
CXJhZGl1czogcmFkaXVzLAorCQkJcmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLAorCQkJ
Y2xvc2VkOiBjbG9zZWQKKwkJfTsKKworCQlpZiAoIHRhcGVyICE9PSB1bmRlZmluZWQgKSBjb25z
b2xlLndhcm4oICdUSFJFRS5UdWJlR2VvbWV0cnk6IHRhcGVyIGhhcyBiZWVuIHJlbW92ZWQuJyAp
OworCisJCXZhciBidWZmZXJHZW9tZXRyeSA9IG5ldyBUdWJlQnVmZmVyR2VvbWV0cnkoIHBhdGgs
IHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkICk7CisKKwkJ
Ly8gZXhwb3NlIGludGVybmFscworCisJCXRoaXMudGFuZ2VudHMgPSBidWZmZXJHZW9tZXRyeS50
YW5nZW50czsKKwkJdGhpcy5ub3JtYWxzID0gYnVmZmVyR2VvbWV0cnkubm9ybWFsczsKKwkJdGhp
cy5iaW5vcm1hbHMgPSBidWZmZXJHZW9tZXRyeS5iaW5vcm1hbHM7CisKKwkJLy8gY3JlYXRlIGdl
b21ldHJ5CisKKwkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIGJ1ZmZlckdlb21ldHJ5ICk7CisJ
CXRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisJfQorCisJVHViZUdlb21ldHJ5LnByb3RvdHlwZSA9
IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOworCVR1YmVHZW9tZXRyeS5wcm90
b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlR2VvbWV0cnk7CisKKwkvLyBUdWJlQnVmZmVyR2VvbWV0
cnkKKworCWZ1bmN0aW9uIFR1YmVCdWZmZXJHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRz
LCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKSB7CisKKwkJQnVmZmVyR2VvbWV0cnku
Y2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdUdWJlQnVmZmVyR2VvbWV0cnknOworCisJ
CXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXBhdGg6IHBhdGgsCisJCQl0dWJ1bGFyU2VnbWVudHM6
IHR1YnVsYXJTZWdtZW50cywKKwkJCXJhZGl1czogcmFkaXVzLAorCQkJcmFkaWFsU2VnbWVudHM6
IHJhZGlhbFNlZ21lbnRzLAorCQkJY2xvc2VkOiBjbG9zZWQKKwkJfTsKKworCQl0dWJ1bGFyU2Vn
bWVudHMgPSB0dWJ1bGFyU2VnbWVudHMgfHwgNjQ7CisJCXJhZGl1cyA9IHJhZGl1cyB8fCAxOwor
CQlyYWRpYWxTZWdtZW50cyA9IHJhZGlhbFNlZ21lbnRzIHx8IDg7CisJCWNsb3NlZCA9IGNsb3Nl
ZCB8fCBmYWxzZTsKKworCQl2YXIgZnJhbWVzID0gcGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCB0
dWJ1bGFyU2VnbWVudHMsIGNsb3NlZCApOworCisJCS8vIGV4cG9zZSBpbnRlcm5hbHMKKworCQl0
aGlzLnRhbmdlbnRzID0gZnJhbWVzLnRhbmdlbnRzOworCQl0aGlzLm5vcm1hbHMgPSBmcmFtZXMu
bm9ybWFsczsKKwkJdGhpcy5iaW5vcm1hbHMgPSBmcmFtZXMuYmlub3JtYWxzOworCisJCS8vIGhl
bHBlciB2YXJpYWJsZXMKKworCQl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIG5v
cm1hbCA9IG5ldyBWZWN0b3IzKCk7CisJCXZhciB1diA9IG5ldyBWZWN0b3IyKCk7CisKKwkJdmFy
IGksIGo7CisKKwkJLy8gYnVmZmVyCisKKwkJdmFyIHZlcnRpY2VzID0gW107CisJCXZhciBub3Jt
YWxzID0gW107CisJCXZhciB1dnMgPSBbXTsKKwkJdmFyIGluZGljZXMgPSBbXTsKKworCQkvLyBj
cmVhdGUgYnVmZmVyIGRhdGEKKworCQlnZW5lcmF0ZUJ1ZmZlckRhdGEoKTsKKworCQkvLyBidWls
ZCBnZW9tZXRyeQorCisJCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKKwkJdGhpcy5hZGRBdHRy
aWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywg
MyApICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJB
dHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3
IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CisKKwkJLy8gZnVuY3Rpb25zCisK
KwkJZnVuY3Rpb24gZ2VuZXJhdGVCdWZmZXJEYXRhKCkgeworCisJCQlmb3IgKCBpID0gMDsgaSA8
IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHsKKworCQkJCWdlbmVyYXRlU2VnbWVudCggaSApOwor
CisJCQl9CisKKwkJCS8vIGlmIHRoZSBnZW9tZXRyeSBpcyBub3QgY2xvc2VkLCBnZW5lcmF0ZSB0
aGUgbGFzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHMKKwkJCS8vIGF0IHRoZSByZWd1bGFy
IHBvc2l0aW9uIG9uIHRoZSBnaXZlbiBwYXRoCisJCQkvLworCQkJLy8gaWYgdGhlIGdlb21ldHJ5
IGlzIGNsb3NlZCwgZHVwbGljYXRlIHRoZSBmaXJzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1h
bHMgKHV2cyB3aWxsIGRpZmZlcikKKworCQkJZ2VuZXJhdGVTZWdtZW50KCAoIGNsb3NlZCA9PT0g
ZmFsc2UgKSA/IHR1YnVsYXJTZWdtZW50cyA6IDAgKTsKKworCQkJLy8gdXZzIGFyZSBnZW5lcmF0
ZWQgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbi4KKwkJCS8vIHRoaXMgbWFrZXMgaXQgZWFzeSBjb21w
dXRlIGNvcnJlY3QgdmFsdWVzIGZvciBjbG9zZWQgZ2VvbWV0cmllcworCisJCQlnZW5lcmF0ZVVW
cygpOworCisJCQkvLyBmaW5hbGx5IGNyZWF0ZSBmYWNlcworCisJCQlnZW5lcmF0ZUluZGljZXMo
KTsKKworCQl9CisKKwkJZnVuY3Rpb24gZ2VuZXJhdGVTZWdtZW50KCBpICkgeworCisJCQkvLyB3
ZSB1c2UgZ2V0UG9pbnRBdCB0byBzYW1wbGUgZXZlbmx5IGRpc3RyaWJ1dGVkIHBvaW50cyBmcm9t
IHRoZSBnaXZlbiBwYXRoCisKKwkJCXZhciBQID0gcGF0aC5nZXRQb2ludEF0KCBpIC8gdHVidWxh
clNlZ21lbnRzICk7CisKKwkJCS8vIHJldHJpZXZlIGNvcnJlc3BvbmRpbmcgbm9ybWFsIGFuZCBi
aW5vcm1hbAorCisJCQl2YXIgTiA9IGZyYW1lcy5ub3JtYWxzWyBpIF07CisJCQl2YXIgQiA9IGZy
YW1lcy5iaW5vcm1hbHNbIGkgXTsKKworCQkJLy8gZ2VuZXJhdGUgbm9ybWFscyBhbmQgdmVydGlj
ZXMgZm9yIHRoZSBjdXJyZW50IHNlZ21lbnQKKworCQkJZm9yICggaiA9IDA7IGogPD0gcmFkaWFs
U2VnbWVudHM7IGogKysgKSB7CisKKwkJCQl2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1h
dGguUEkgKiAyOworCisJCQkJdmFyIHNpbiA9ICAgTWF0aC5zaW4oIHYgKTsKKwkJCQl2YXIgY29z
ID0gLSBNYXRoLmNvcyggdiApOworCisJCQkJLy8gbm9ybWFsCisKKwkJCQlub3JtYWwueCA9ICgg
Y29zICogTi54ICsgc2luICogQi54ICk7CisJCQkJbm9ybWFsLnkgPSAoIGNvcyAqIE4ueSArIHNp
biAqIEIueSApOworCQkJCW5vcm1hbC56ID0gKCBjb3MgKiBOLnogKyBzaW4gKiBCLnogKTsKKwkJ
CQlub3JtYWwubm9ybWFsaXplKCk7CisKKwkJCQlub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3Jt
YWwueSwgbm9ybWFsLnogKTsKKworCQkJCS8vIHZlcnRleAorCisJCQkJdmVydGV4LnggPSBQLngg
KyByYWRpdXMgKiBub3JtYWwueDsKKwkJCQl2ZXJ0ZXgueSA9IFAueSArIHJhZGl1cyAqIG5vcm1h
bC55OworCQkJCXZlcnRleC56ID0gUC56ICsgcmFkaXVzICogbm9ybWFsLno7CisKKwkJCQl2ZXJ0
aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CisKKwkJCX0KKworCQl9
CisKKwkJZnVuY3Rpb24gZ2VuZXJhdGVJbmRpY2VzKCkgeworCisJCQlmb3IgKCBqID0gMTsgaiA8
PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7CisKKwkJCQlmb3IgKCBpID0gMTsgaSA8PSByYWRp
YWxTZWdtZW50czsgaSArKyApIHsKKworCQkJCQl2YXIgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAx
ICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7CisJCQkJCXZhciBiID0gKCByYWRpYWxTZWdtZW50
cyArIDEgKSAqIGogKyAoIGkgLSAxICk7CisJCQkJCXZhciBjID0gKCByYWRpYWxTZWdtZW50cyAr
IDEgKSAqIGogKyBpOworCQkJCQl2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGog
LSAxICkgKyBpOworCisJCQkJCS8vIGZhY2VzCisKKwkJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBk
ICk7CisJCQkJCWluZGljZXMucHVzaCggYiwgYywgZCApOworCisJCQkJfQorCisJCQl9CisKKwkJ
fQorCisJCWZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkgeworCisJCQlmb3IgKCBpID0gMDsgaSA8PSB0
dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7CisKKwkJCQlmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxT
ZWdtZW50czsgaiArKyApIHsKKworCQkJCQl1di54ID0gaSAvIHR1YnVsYXJTZWdtZW50czsKKwkJ
CQkJdXYueSA9IGogLyByYWRpYWxTZWdtZW50czsKKworCQkJCQl1dnMucHVzaCggdXYueCwgdXYu
eSApOworCisJCQkJfQorCisJCQl9CisKKwkJfQorCisJfQorCisJVHViZUJ1ZmZlckdlb21ldHJ5
LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwor
CVR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlQnVmZmVyR2Vv
bWV0cnk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG9vc21veGllY29kZQorCSAqIEBhdXRob3IgTXVn
ZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisJICoKKwkgKiBiYXNlZCBvbiBodHRw
Oi8vd3d3LmJsYWNrcGF3bi5jb20vdGV4dHMvcHF0b3J1cy8KKwkgKi8KKworCS8vIFRvcnVzS25v
dEdlb21ldHJ5CisKKwlmdW5jdGlvbiBUb3J1c0tub3RHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0
dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxLCBoZWlnaHRTY2FsZSApIHsKKwor
CQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1RvcnVzS25vdEdlb21l
dHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXM6IHJhZGl1cywKKwkJCXR1
YmU6IHR1YmUsCisJCQl0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cywKKwkJCXJhZGlh
bFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKKwkJCXA6IHAsCisJCQlxOiBxCisJCX07CisKKwkJ
aWYgKCBoZWlnaHRTY2FsZSAhPT0gdW5kZWZpbmVkICkgY29uc29sZS53YXJuKCAnVEhSRUUuVG9y
dXNLbm90R2VvbWV0cnk6IGhlaWdodFNjYWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2Nh
bGUoIHgsIHksIHogKSBpbnN0ZWFkLicgKTsKKworCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSgg
bmV3IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1YnVsYXJTZWdtZW50
cywgcmFkaWFsU2VnbWVudHMsIHAsIHEgKSApOworCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKKwor
CX0KKworCVRvcnVzS25vdEdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21l
dHJ5LnByb3RvdHlwZSApOworCVRvcnVzS25vdEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3Rv
ciA9IFRvcnVzS25vdEdlb21ldHJ5OworCisJLy8gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkKKwor
CWZ1bmN0aW9uIFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1YnVsYXJT
ZWdtZW50cywgcmFkaWFsU2VnbWVudHMsIHAsIHEgKSB7CisKKwkJQnVmZmVyR2VvbWV0cnkuY2Fs
bCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSc7CisK
KwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJcmFkaXVzOiByYWRpdXMsCisJCQl0dWJlOiB0dWJl
LAorCQkJdHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsCisJCQlyYWRpYWxTZWdtZW50
czogcmFkaWFsU2VnbWVudHMsCisJCQlwOiBwLAorCQkJcTogcQorCQl9OworCisJCXJhZGl1cyA9
IHJhZGl1cyB8fCAxMDA7CisJCXR1YmUgPSB0dWJlIHx8IDQwOworCQl0dWJ1bGFyU2VnbWVudHMg
PSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKSB8fCA2NDsKKwkJcmFkaWFsU2VnbWVudHMg
PSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7CisJCXAgPSBwIHx8IDI7CisJCXEg
PSBxIHx8IDM7CisKKwkJLy8gYnVmZmVycworCisJCXZhciBpbmRpY2VzID0gW107CisJCXZhciB2
ZXJ0aWNlcyA9IFtdOworCQl2YXIgbm9ybWFscyA9IFtdOworCQl2YXIgdXZzID0gW107CisKKwkJ
Ly8gaGVscGVyIHZhcmlhYmxlcworCisJCXZhciBpLCBqOworCisJCXZhciB2ZXJ0ZXggPSBuZXcg
VmVjdG9yMygpOworCQl2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTsKKworCQl2YXIgUDEgPSBu
ZXcgVmVjdG9yMygpOworCQl2YXIgUDIgPSBuZXcgVmVjdG9yMygpOworCisJCXZhciBCID0gbmV3
IFZlY3RvcjMoKTsKKwkJdmFyIFQgPSBuZXcgVmVjdG9yMygpOworCQl2YXIgTiA9IG5ldyBWZWN0
b3IzKCk7CisKKwkJLy8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2cworCisJCWZv
ciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgKysgaSApIHsKKworCQkJLy8gdGhlIHJh
ZGlhbiAidSIgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBj
dXJ2ZSBvZiB0aGUgY3VycmVudCB0dWJ1bGFyIHNlZ2VtZW50CisKKwkJCXZhciB1ID0gaSAvIHR1
YnVsYXJTZWdtZW50cyAqIHAgKiBNYXRoLlBJICogMjsKKworCQkJLy8gbm93IHdlIGNhbGN1bGF0
ZSB0d28gcG9pbnRzLiBQMSBpcyBvdXIgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmUsIFAy
IGlzIGEgbGl0dGxlIGZhcnRoZXIgYWhlYWQuCisJCQkvLyB0aGVzZSBwb2ludHMgYXJlIHVzZWQg
dG8gY3JlYXRlIGEgc3BlY2lhbCAiY29vcmRpbmF0ZSBzcGFjZSIsIHdoaWNoIGlzIG5lY2Vzc2Fy
eSB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmVydGV4IHBvc2l0aW9ucworCisJCQljYWxjdWxh
dGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgUDEgKTsKKwkJCWNhbGN1bGF0ZVBv
c2l0aW9uT25DdXJ2ZSggdSArIDAuMDEsIHAsIHEsIHJhZGl1cywgUDIgKTsKKworCQkJLy8gY2Fs
Y3VsYXRlIG9ydGhvbm9ybWFsIGJhc2lzCisKKwkJCVQuc3ViVmVjdG9ycyggUDIsIFAxICk7CisJ
CQlOLmFkZFZlY3RvcnMoIFAyLCBQMSApOworCQkJQi5jcm9zc1ZlY3RvcnMoIFQsIE4gKTsKKwkJ
CU4uY3Jvc3NWZWN0b3JzKCBCLCBUICk7CisKKwkJCS8vIG5vcm1hbGl6ZSBCLCBOLiBUIGNhbiBi
ZSBpZ25vcmVkLCB3ZSBkb24ndCB1c2UgaXQKKworCQkJQi5ub3JtYWxpemUoKTsKKwkJCU4ubm9y
bWFsaXplKCk7CisKKwkJCWZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyArKyBqICkg
eworCisJCQkJLy8gbm93IGNhbGN1bGF0ZSB0aGUgdmVydGljZXMuIHRoZXkgYXJlIG5vdGhpbmcg
bW9yZSB0aGFuIGFuIGV4dHJ1c2lvbiBvZiB0aGUgdG9ydXMgY3VydmUuCisJCQkJLy8gYmVjYXVz
ZSB3ZSBleHRydWRlIGEgc2hhcGUgaW4gdGhlIHh5LXBsYW5lLCB0aGVyZSBpcyBubyBuZWVkIHRv
IGNhbGN1bGF0ZSBhIHotdmFsdWUuCisKKwkJCQl2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAq
IE1hdGguUEkgKiAyOworCQkJCXZhciBjeCA9IC0gdHViZSAqIE1hdGguY29zKCB2ICk7CisJCQkJ
dmFyIGN5ID0gdHViZSAqIE1hdGguc2luKCB2ICk7CisKKwkJCQkvLyBub3cgY2FsY3VsYXRlIHRo
ZSBmaW5hbCB2ZXJ0ZXggcG9zaXRpb24uCisJCQkJLy8gZmlyc3Qgd2Ugb3JpZW50IHRoZSBleHRy
dXNpb24gd2l0aCBvdXIgYmFzaXMgdmVjdG9zLCB0aGVuIHdlIGFkZCBpdCB0byB0aGUgY3VycmVu
dCBwb3NpdGlvbiBvbiB0aGUgY3VydmUKKworCQkJCXZlcnRleC54ID0gUDEueCArICggY3ggKiBO
LnggKyBjeSAqIEIueCApOworCQkJCXZlcnRleC55ID0gUDEueSArICggY3ggKiBOLnkgKyBjeSAq
IEIueSApOworCQkJCXZlcnRleC56ID0gUDEueiArICggY3ggKiBOLnogKyBjeSAqIEIueiApOwor
CisJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJ
CQkJLy8gbm9ybWFsIChQMSBpcyBhbHdheXMgdGhlIGNlbnRlci9vcmlnaW4gb2YgdGhlIGV4dHJ1
c2lvbiwgdGh1cyB3ZSBjYW4gdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsKQorCisJCQkJ
bm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgUDEgKS5ub3JtYWxpemUoKTsKKworCQkJCW5vcm1h
bHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApOworCisJCQkJLy8gdXYKKwor
CQkJCXV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7CisJCQkJdXZzLnB1c2goIGogLyBy
YWRpYWxTZWdtZW50cyApOworCisJCQl9CisKKwkJfQorCisJCS8vIGdlbmVyYXRlIGluZGljZXMK
KworCQlmb3IgKCBqID0gMTsgaiA8PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7CisKKwkJCWZv
ciAoIGkgPSAxOyBpIDw9IHJhZGlhbFNlZ21lbnRzOyBpICsrICkgeworCisJCQkJLy8gaW5kaWNl
cworCisJCQkJdmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBp
IC0gMSApOworCQkJCXZhciBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAx
ICk7CisJCQkJdmFyIGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7CisJCQkJdmFy
IGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTsKKworCQkJCS8vIGZh
Y2VzCisKKwkJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKKwkJCQlpbmRpY2VzLnB1c2goIGIs
IGMsIGQgKTsKKworCQkJfQorCisJCX0KKworCQkvLyBidWlsZCBnZW9tZXRyeQorCisJCXRoaXMu
c2V0SW5kZXgoIGluZGljZXMgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5l
dyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CisJCXRoaXMuYWRkQXR0
cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMg
KSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1
dGUoIHV2cywgMiApICk7CisKKwkJLy8gdGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjdXJy
ZW50IHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZQorCisJCWZ1bmN0aW9uIGNhbGN1bGF0ZVBv
c2l0aW9uT25DdXJ2ZSggdSwgcCwgcSwgcmFkaXVzLCBwb3NpdGlvbiApIHsKKworCQkJdmFyIGN1
ID0gTWF0aC5jb3MoIHUgKTsKKwkJCXZhciBzdSA9IE1hdGguc2luKCB1ICk7CisJCQl2YXIgcXVP
dmVyUCA9IHEgLyBwICogdTsKKwkJCXZhciBjcyA9IE1hdGguY29zKCBxdU92ZXJQICk7CisKKwkJ
CXBvc2l0aW9uLnggPSByYWRpdXMgKiAoIDIgKyBjcyApICogMC41ICogY3U7CisJCQlwb3NpdGlv
bi55ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIHN1ICogMC41OworCQkJcG9zaXRpb24ueiA9IHJh
ZGl1cyAqIE1hdGguc2luKCBxdU92ZXJQICkgKiAwLjU7CisKKwkJfQorCisJfQorCisJVG9ydXNL
bm90QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0
cnkucHJvdG90eXBlICk7CisJVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0
cnVjdG9yID0gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG9v
c21veGllY29kZQorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICog
QGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKwkgKi8KKworCS8v
IFRvcnVzR2VvbWV0cnkKKworCWZ1bmN0aW9uIFRvcnVzR2VvbWV0cnkoIHJhZGl1cywgdHViZSwg
cmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkgeworCisJCUdlb21ldHJ5LmNh
bGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnVG9ydXNHZW9tZXRyeSc7CisKKwkJdGhpcy5w
YXJhbWV0ZXJzID0geworCQkJcmFkaXVzOiByYWRpdXMsCisJCQl0dWJlOiB0dWJlLAorCQkJcmFk
aWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLAorCQkJdHVidWxhclNlZ21lbnRzOiB0dWJ1bGFy
U2VnbWVudHMsCisJCQlhcmM6IGFyYworCQl9OworCisJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5
KCBuZXcgVG9ydXNCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywg
dHVidWxhclNlZ21lbnRzLCBhcmMgKSApOworCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKKworCX0K
KworCVRvcnVzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJv
dG90eXBlICk7CisJVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0dl
b21ldHJ5OworCisJLy8gVG9ydXNCdWZmZXJHZW9tZXRyeQorCisJZnVuY3Rpb24gVG9ydXNCdWZm
ZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRz
LCBhcmMgKSB7CisKKwkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlw
ZSA9ICdUb3J1c0J1ZmZlckdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQly
YWRpdXM6IHJhZGl1cywKKwkJCXR1YmU6IHR1YmUsCisJCQlyYWRpYWxTZWdtZW50czogcmFkaWFs
U2VnbWVudHMsCisJCQl0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cywKKwkJCWFyYzog
YXJjCisJCX07CisKKwkJcmFkaXVzID0gcmFkaXVzIHx8IDEwMDsKKwkJdHViZSA9IHR1YmUgfHwg
NDA7CisJCXJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4
OworCQl0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKSB8fCA2
OworCQlhcmMgPSBhcmMgfHwgTWF0aC5QSSAqIDI7CisKKwkJLy8gYnVmZmVycworCisJCXZhciBp
bmRpY2VzID0gW107CisJCXZhciB2ZXJ0aWNlcyA9IFtdOworCQl2YXIgbm9ybWFscyA9IFtdOwor
CQl2YXIgdXZzID0gW107CisKKwkJLy8gaGVscGVyIHZhcmlhYmxlcworCisJCXZhciBjZW50ZXIg
PSBuZXcgVmVjdG9yMygpOworCQl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIG5v
cm1hbCA9IG5ldyBWZWN0b3IzKCk7CisKKwkJdmFyIGosIGk7CisKKwkJLy8gZ2VuZXJhdGUgdmVy
dGljZXMsIG5vcm1hbHMgYW5kIHV2cworCisJCWZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21l
bnRzOyBqICsrICkgeworCisJCQlmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkg
KysgKSB7CisKKwkJCQl2YXIgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBhcmM7CisJCQkJdmFy
IHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjsKKworCQkJCS8vIHZlcnRleAor
CisJCQkJdmVydGV4LnggPSAoIHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRo
LmNvcyggdSApOworCQkJCXZlcnRleC55ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYg
KSApICogTWF0aC5zaW4oIHUgKTsKKwkJCQl2ZXJ0ZXgueiA9IHR1YmUgKiBNYXRoLnNpbiggdiAp
OworCisJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwor
CisJCQkJLy8gbm9ybWFsCisKKwkJCQljZW50ZXIueCA9IHJhZGl1cyAqIE1hdGguY29zKCB1ICk7
CisJCQkJY2VudGVyLnkgPSByYWRpdXMgKiBNYXRoLnNpbiggdSApOworCQkJCW5vcm1hbC5zdWJW
ZWN0b3JzKCB2ZXJ0ZXgsIGNlbnRlciApLm5vcm1hbGl6ZSgpOworCisJCQkJbm9ybWFscy5wdXNo
KCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7CisKKwkJCQkvLyB1dgorCisJCQkJdXZz
LnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTsKKwkJCQl1dnMucHVzaCggaiAvIHJhZGlhbFNl
Z21lbnRzICk7CisKKwkJCX0KKworCQl9CisKKwkJLy8gZ2VuZXJhdGUgaW5kaWNlcworCisJCWZv
ciAoIGogPSAxOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkgeworCisJCQlmb3IgKCBpID0g
MTsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7CisKKwkJCQkvLyBpbmRpY2VzCisKKwkJ
CQl2YXIgYSA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGkgLSAxOworCQkJCXZhciBi
ID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpIC0gMTsKKwkJCQl2YXIg
YyA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTsKKwkJCQl2YXIgZCA9
ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGk7CisKKwkJCQkvLyBmYWNlcworCisJCQkJ
aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CisJCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CisK
KwkJCX0KKworCQl9CisKKwkJLy8gYnVpbGQgZ2VvbWV0cnkKKworCQl0aGlzLnNldEluZGV4KCBp
bmRpY2VzICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1
ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ25v
cm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKKwkJdGhp
cy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIg
KSApOworCisJfQorCisJVG9ydXNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3Jl
YXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlUb3J1c0J1ZmZlckdlb21ldHJ5LnBy
b3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzQnVmZmVyR2VvbWV0cnk7CisKKwkvKioKKwkgKiBA
YXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCisJICovCisK
Kwl2YXIgU2hhcGVVdGlscyA9IHsKKworCQkvLyBjYWxjdWxhdGUgYXJlYSBvZiB0aGUgY29udG91
ciBwb2x5Z29uCisKKwkJYXJlYTogZnVuY3Rpb24gKCBjb250b3VyICkgeworCisJCQl2YXIgbiA9
IGNvbnRvdXIubGVuZ3RoOworCQkJdmFyIGEgPSAwLjA7CisKKwkJCWZvciAoIHZhciBwID0gbiAt
IDEsIHEgPSAwOyBxIDwgbjsgcCA9IHEgKysgKSB7CisKKwkJCQlhICs9IGNvbnRvdXJbIHAgXS54
ICogY29udG91clsgcSBdLnkgLSBjb250b3VyWyBxIF0ueCAqIGNvbnRvdXJbIHAgXS55OworCisJ
CQl9CisKKwkJCXJldHVybiBhICogMC41OworCisJCX0sCisKKwkJdHJpYW5ndWxhdGU6ICggZnVu
Y3Rpb24gKCkgeworCisJCQkvKioKKwkJCSAqIFRoaXMgY29kZSBpcyBhIHF1aWNrIHBvcnQgb2Yg
Y29kZSB3cml0dGVuIGluIEMrKyB3aGljaCB3YXMgc3VibWl0dGVkIHRvCisJCQkgKiBmbGlwY29k
ZS5jb20gYnkgSm9obiBXLiBSYXRjbGlmZiAgLy8gSnVseSAyMiwgMjAwMAorCQkJICogU2VlIG9y
aWdpbmFsIGNvZGUgYW5kIG1vcmUgaW5mb3JtYXRpb24gaGVyZToKKwkJCSAqIGh0dHA6Ly93d3cu
ZmxpcGNvZGUuY29tL2FyY2hpdmVzL0VmZmljaWVudF9Qb2x5Z29uX1RyaWFuZ3VsYXRpb24uc2h0
bWwKKwkJCSAqCisJCQkgKiBwb3J0ZWQgdG8gYWN0aW9uc2NyaXB0IGJ5IFpldmFuIFJvc3Nlcgor
CQkJICogd3d3LmFjdGlvbnNuaXBwZXQuY29tCisJCQkgKgorCQkJICogcG9ydGVkIHRvIGphdmFz
Y3JpcHQgYnkgSm9zaHVhIEtvbworCQkJICogaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUv
YmxvZworCQkJICoKKwkJCSAqLworCisJCQlmdW5jdGlvbiBzbmlwKCBjb250b3VyLCB1LCB2LCB3
LCBuLCB2ZXJ0cyApIHsKKworCQkJCXZhciBwOworCQkJCXZhciBheCwgYXksIGJ4LCBieTsKKwkJ
CQl2YXIgY3gsIGN5LCBweCwgcHk7CisKKwkJCQlheCA9IGNvbnRvdXJbIHZlcnRzWyB1IF0gXS54
OworCQkJCWF5ID0gY29udG91clsgdmVydHNbIHUgXSBdLnk7CisKKwkJCQlieCA9IGNvbnRvdXJb
IHZlcnRzWyB2IF0gXS54OworCQkJCWJ5ID0gY29udG91clsgdmVydHNbIHYgXSBdLnk7CisKKwkJ
CQljeCA9IGNvbnRvdXJbIHZlcnRzWyB3IF0gXS54OworCQkJCWN5ID0gY29udG91clsgdmVydHNb
IHcgXSBdLnk7CisKKwkJCQlpZiAoICggYnggLSBheCApICogKCBjeSAtIGF5ICkgLSAoIGJ5IC0g
YXkgKSAqICggY3ggLSBheCApIDw9IDAgKSByZXR1cm4gZmFsc2U7CisKKwkJCQl2YXIgYVgsIGFZ
LCBiWCwgYlksIGNYLCBjWTsKKwkJCQl2YXIgYXB4LCBhcHksIGJweCwgYnB5LCBjcHgsIGNweTsK
KwkJCQl2YXIgY0NST1NTYXAsIGJDUk9TU2NwLCBhQ1JPU1NicDsKKworCQkJCWFYID0gY3ggLSBi
eDsgIGFZID0gY3kgLSBieTsKKwkJCQliWCA9IGF4IC0gY3g7ICBiWSA9IGF5IC0gY3k7CisJCQkJ
Y1ggPSBieCAtIGF4OyAgY1kgPSBieSAtIGF5OworCisJCQkJZm9yICggcCA9IDA7IHAgPCBuOyBw
ICsrICkgeworCisJCQkJCXB4ID0gY29udG91clsgdmVydHNbIHAgXSBdLng7CisJCQkJCXB5ID0g
Y29udG91clsgdmVydHNbIHAgXSBdLnk7CisKKwkJCQkJaWYgKCAoICggcHggPT09IGF4ICkgJiYg
KCBweSA9PT0gYXkgKSApIHx8CisJCQkJCQkgKCAoIHB4ID09PSBieCApICYmICggcHkgPT09IGJ5
ICkgKSB8fAorCQkJCQkJICggKCBweCA9PT0gY3ggKSAmJiAoIHB5ID09PSBjeSApICkgKQljb250
aW51ZTsKKworCQkJCQlhcHggPSBweCAtIGF4OyAgYXB5ID0gcHkgLSBheTsKKwkJCQkJYnB4ID0g
cHggLSBieDsgIGJweSA9IHB5IC0gYnk7CisJCQkJCWNweCA9IHB4IC0gY3g7ICBjcHkgPSBweSAt
IGN5OworCisJCQkJCS8vIHNlZSBpZiBwIGlzIGluc2lkZSB0cmlhbmdsZSBhYmMKKworCQkJCQlh
Q1JPU1NicCA9IGFYICogYnB5IC0gYVkgKiBicHg7CisJCQkJCWNDUk9TU2FwID0gY1ggKiBhcHkg
LSBjWSAqIGFweDsKKwkJCQkJYkNST1NTY3AgPSBiWCAqIGNweSAtIGJZICogY3B4OworCisJCQkJ
CWlmICggKCBhQ1JPU1NicCA+PSAtIE51bWJlci5FUFNJTE9OICkgJiYgKCBiQ1JPU1NjcCA+PSAt
IE51bWJlci5FUFNJTE9OICkgJiYgKCBjQ1JPU1NhcCA+PSAtIE51bWJlci5FUFNJTE9OICkgKSBy
ZXR1cm4gZmFsc2U7CisKKwkJCQl9CisKKwkJCQlyZXR1cm4gdHJ1ZTsKKworCQkJfQorCisJCQkv
LyB0YWtlcyBpbiBhbiBjb250b3VyIGFycmF5IGFuZCByZXR1cm5zCisKKwkJCXJldHVybiBmdW5j
dGlvbiB0cmlhbmd1bGF0ZSggY29udG91ciwgaW5kaWNlcyApIHsKKworCQkJCXZhciBuID0gY29u
dG91ci5sZW5ndGg7CisKKwkJCQlpZiAoIG4gPCAzICkgcmV0dXJuIG51bGw7CisKKwkJCQl2YXIg
cmVzdWx0ID0gW10sCisJCQkJCXZlcnRzID0gW10sCisJCQkJCXZlcnRJbmRpY2VzID0gW107CisK
KwkJCQkvKiB3ZSB3YW50IGEgY291bnRlci1jbG9ja3dpc2UgcG9seWdvbiBpbiB2ZXJ0cyAqLwor
CisJCQkJdmFyIHUsIHYsIHc7CisKKwkJCQlpZiAoIFNoYXBlVXRpbHMuYXJlYSggY29udG91ciAp
ID4gMC4wICkgeworCisJCQkJCWZvciAoIHYgPSAwOyB2IDwgbjsgdiArKyApIHZlcnRzWyB2IF0g
PSB2OworCisJCQkJfSBlbHNlIHsKKworCQkJCQlmb3IgKCB2ID0gMDsgdiA8IG47IHYgKysgKSB2
ZXJ0c1sgdiBdID0gKCBuIC0gMSApIC0gdjsKKworCQkJCX0KKworCQkJCXZhciBudiA9IG47CisK
KwkJCQkvKiAgcmVtb3ZlIG52IC0gMiB2ZXJ0aWNlcywgY3JlYXRpbmcgMSB0cmlhbmdsZSBldmVy
eSB0aW1lICovCisKKwkJCQl2YXIgY291bnQgPSAyICogbnY7ICAgLyogZXJyb3IgZGV0ZWN0aW9u
ICovCisKKwkJCQlmb3IgKCB2ID0gbnYgLSAxOyBudiA+IDI7ICkgeworCisJCQkJCS8qIGlmIHdl
IGxvb3AsIGl0IGlzIHByb2JhYmx5IGEgbm9uLXNpbXBsZSBwb2x5Z29uICovCisKKwkJCQkJaWYg
KCAoIGNvdW50IC0tICkgPD0gMCApIHsKKworCQkJCQkJLy8qKiBUcmlhbmd1bGF0ZTogRVJST1Ig
LSBwcm9iYWJsZSBiYWQgcG9seWdvbiEKKworCQkJCQkJLy90aHJvdyAoICJXYXJuaW5nLCB1bmFi
bGUgdG8gdHJpYW5ndWxhdGUgcG9seWdvbiEiICk7CisJCQkJCQkvL3JldHVybiBudWxsOworCQkJ
CQkJLy8gU29tZXRpbWVzIHdhcm5pbmcgaXMgZmluZSwgZXNwZWNpYWxseSBwb2x5Z29ucyBhcmUg
dHJpYW5ndWxhdGVkIGluIHJldmVyc2UuCisJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5TaGFw
ZVV0aWxzOiBVbmFibGUgdG8gdHJpYW5ndWxhdGUgcG9seWdvbiEgaW4gdHJpYW5ndWxhdGUoKScg
KTsKKworCQkJCQkJaWYgKCBpbmRpY2VzICkgcmV0dXJuIHZlcnRJbmRpY2VzOworCQkJCQkJcmV0
dXJuIHJlc3VsdDsKKworCQkJCQl9CisKKwkJCQkJLyogdGhyZWUgY29uc2VjdXRpdmUgdmVydGlj
ZXMgaW4gY3VycmVudCBwb2x5Z29uLCA8dSx2LHc+ICovCisKKwkJCQkJdSA9IHY7IAkgCWlmICgg
bnYgPD0gdSApIHUgPSAwOyAgICAgLyogcHJldmlvdXMgKi8KKwkJCQkJdiA9IHUgKyAxOyAgaWYg
KCBudiA8PSB2ICkgdiA9IDA7ICAgICAvKiBuZXcgdiAgICAqLworCQkJCQl3ID0gdiArIDE7ICBp
ZiAoIG52IDw9IHcgKSB3ID0gMDsgICAgIC8qIG5leHQgICAgICovCisKKwkJCQkJaWYgKCBzbmlw
KCBjb250b3VyLCB1LCB2LCB3LCBudiwgdmVydHMgKSApIHsKKworCQkJCQkJdmFyIGEsIGIsIGMs
IHMsIHQ7CisKKwkJCQkJCS8qIHRydWUgbmFtZXMgb2YgdGhlIHZlcnRpY2VzICovCisKKwkJCQkJ
CWEgPSB2ZXJ0c1sgdSBdOworCQkJCQkJYiA9IHZlcnRzWyB2IF07CisJCQkJCQljID0gdmVydHNb
IHcgXTsKKworCQkJCQkJLyogb3V0cHV0IFRyaWFuZ2xlICovCisKKwkJCQkJCXJlc3VsdC5wdXNo
KCBbIGNvbnRvdXJbIGEgXSwKKwkJCQkJCQljb250b3VyWyBiIF0sCisJCQkJCQkJY29udG91clsg
YyBdIF0gKTsKKworCisJCQkJCQl2ZXJ0SW5kaWNlcy5wdXNoKCBbIHZlcnRzWyB1IF0sIHZlcnRz
WyB2IF0sIHZlcnRzWyB3IF0gXSApOworCisJCQkJCQkvKiByZW1vdmUgdiBmcm9tIHRoZSByZW1h
aW5pbmcgcG9seWdvbiAqLworCisJCQkJCQlmb3IgKCBzID0gdiwgdCA9IHYgKyAxOyB0IDwgbnY7
IHMgKyssIHQgKysgKSB7CisKKwkJCQkJCQl2ZXJ0c1sgcyBdID0gdmVydHNbIHQgXTsKKworCQkJ
CQkJfQorCisJCQkJCQludiAtLTsKKworCQkJCQkJLyogcmVzZXQgZXJyb3IgZGV0ZWN0aW9uIGNv
dW50ZXIgKi8KKworCQkJCQkJY291bnQgPSAyICogbnY7CisKKwkJCQkJfQorCisJCQkJfQorCisJ
CQkJaWYgKCBpbmRpY2VzICkgcmV0dXJuIHZlcnRJbmRpY2VzOworCQkJCXJldHVybiByZXN1bHQ7
CisKKwkJCX0KKworCQl9ICkoKSwKKworCQl0cmlhbmd1bGF0ZVNoYXBlOiBmdW5jdGlvbiAoIGNv
bnRvdXIsIGhvbGVzICkgeworCisJCQlmdW5jdGlvbiByZW1vdmVEdXBFbmRQdHMocG9pbnRzKSB7
CisKKwkJCQl2YXIgbCA9IHBvaW50cy5sZW5ndGg7CisKKwkJCQlpZiAoIGwgPiAyICYmIHBvaW50
c1sgbCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7CisKKwkJCQkJcG9pbnRzLnBvcCgp
OworCisJCQkJfQorCisJCQl9CisKKwkJCXJlbW92ZUR1cEVuZFB0cyggY29udG91ciApOworCQkJ
aG9sZXMuZm9yRWFjaCggcmVtb3ZlRHVwRW5kUHRzICk7CisKKwkJCWZ1bmN0aW9uIHBvaW50X2lu
X3NlZ21lbnRfMkRfY29saW4oIGluU2VnUHQxLCBpblNlZ1B0MiwgaW5PdGhlclB0ICkgeworCisJ
CQkJLy8gaW5PdGhlclB0IG5lZWRzIHRvIGJlIGNvbGxpbmVhciB0byB0aGUgaW5TZWdtZW50CisJ
CQkJaWYgKCBpblNlZ1B0MS54ICE9PSBpblNlZ1B0Mi54ICkgeworCisJCQkJCWlmICggaW5TZWdQ
dDEueCA8IGluU2VnUHQyLnggKSB7CisKKwkJCQkJCXJldHVybgkoICggaW5TZWdQdDEueCA8PSBp
bk90aGVyUHQueCApICYmICggaW5PdGhlclB0LnggPD0gaW5TZWdQdDIueCApICk7CisKKwkJCQkJ
fSBlbHNlIHsKKworCQkJCQkJcmV0dXJuCSggKCBpblNlZ1B0Mi54IDw9IGluT3RoZXJQdC54ICkg
JiYgKCBpbk90aGVyUHQueCA8PSBpblNlZ1B0MS54ICkgKTsKKworCQkJCQl9CisKKwkJCQl9IGVs
c2UgeworCisJCQkJCWlmICggaW5TZWdQdDEueSA8IGluU2VnUHQyLnkgKSB7CisKKwkJCQkJCXJl
dHVybgkoICggaW5TZWdQdDEueSA8PSBpbk90aGVyUHQueSApICYmICggaW5PdGhlclB0LnkgPD0g
aW5TZWdQdDIueSApICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJcmV0dXJuCSggKCBpblNl
Z1B0Mi55IDw9IGluT3RoZXJQdC55ICkgJiYgKCBpbk90aGVyUHQueSA8PSBpblNlZ1B0MS55ICkg
KTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQkJZnVuY3Rpb24gaW50ZXJzZWN0X3Nl
Z21lbnRzXzJEKCBpblNlZzFQdDEsIGluU2VnMVB0MiwgaW5TZWcyUHQxLCBpblNlZzJQdDIsIGlu
RXhjbHVkZUFkamFjZW50U2VncyApIHsKKworCQkJCXZhciBzZWcxZHggPSBpblNlZzFQdDIueCAt
IGluU2VnMVB0MS54LCAgIHNlZzFkeSA9IGluU2VnMVB0Mi55IC0gaW5TZWcxUHQxLnk7CisJCQkJ
dmFyIHNlZzJkeCA9IGluU2VnMlB0Mi54IC0gaW5TZWcyUHQxLngsICAgc2VnMmR5ID0gaW5TZWcy
UHQyLnkgLSBpblNlZzJQdDEueTsKKworCQkJCXZhciBzZWcxc2VnMmR4ID0gaW5TZWcxUHQxLngg
LSBpblNlZzJQdDEueDsKKwkJCQl2YXIgc2VnMXNlZzJkeSA9IGluU2VnMVB0MS55IC0gaW5TZWcy
UHQxLnk7CisKKwkJCQl2YXIgbGltaXQJCT0gc2VnMWR5ICogc2VnMmR4IC0gc2VnMWR4ICogc2Vn
MmR5OworCQkJCXZhciBwZXJwU2VnMQk9IHNlZzFkeSAqIHNlZzFzZWcyZHggLSBzZWcxZHggKiBz
ZWcxc2VnMmR5OworCisJCQkJaWYgKCBNYXRoLmFicyggbGltaXQgKSA+IE51bWJlci5FUFNJTE9O
ICkgeworCisJCQkJCS8vIG5vdCBwYXJhbGxlbAorCisJCQkJCXZhciBwZXJwU2VnMjsKKwkJCQkJ
aWYgKCBsaW1pdCA+IDAgKSB7CisKKwkJCQkJCWlmICggKCBwZXJwU2VnMSA8IDAgKSB8fCAoIHBl
cnBTZWcxID4gbGltaXQgKSApIAkJcmV0dXJuIFtdOworCQkJCQkJcGVycFNlZzIgPSBzZWcyZHkg
KiBzZWcxc2VnMmR4IC0gc2VnMmR4ICogc2VnMXNlZzJkeTsKKwkJCQkJCWlmICggKCBwZXJwU2Vn
MiA8IDAgKSB8fCAoIHBlcnBTZWcyID4gbGltaXQgKSApIAkJcmV0dXJuIFtdOworCisJCQkJCX0g
ZWxzZSB7CisKKwkJCQkJCWlmICggKCBwZXJwU2VnMSA+IDAgKSB8fCAoIHBlcnBTZWcxIDwgbGlt
aXQgKSApIAkJcmV0dXJuIFtdOworCQkJCQkJcGVycFNlZzIgPSBzZWcyZHkgKiBzZWcxc2VnMmR4
IC0gc2VnMmR4ICogc2VnMXNlZzJkeTsKKwkJCQkJCWlmICggKCBwZXJwU2VnMiA+IDAgKSB8fCAo
IHBlcnBTZWcyIDwgbGltaXQgKSApIAkJcmV0dXJuIFtdOworCisJCQkJCX0KKworCQkJCQkvLyBp
LmUuIHRvIHJlZHVjZSByb3VuZGluZyBlcnJvcnMKKwkJCQkJLy8gaW50ZXJzZWN0aW9uIGF0IGVu
ZHBvaW50IG9mIHNlZ21lbnQjMT8KKwkJCQkJaWYgKCBwZXJwU2VnMiA9PT0gMCApIHsKKworCQkJ
CQkJaWYgKCAoIGluRXhjbHVkZUFkamFjZW50U2VncyApICYmCisJCQkJCQkJICggKCBwZXJwU2Vn
MSA9PT0gMCApIHx8ICggcGVycFNlZzEgPT09IGxpbWl0ICkgKSApCQlyZXR1cm4gW107CisJCQkJ
CQlyZXR1cm4gWyBpblNlZzFQdDEgXTsKKworCQkJCQl9CisJCQkJCWlmICggcGVycFNlZzIgPT09
IGxpbWl0ICkgeworCisJCQkJCQlpZiAoICggaW5FeGNsdWRlQWRqYWNlbnRTZWdzICkgJiYKKwkJ
CQkJCQkgKCAoIHBlcnBTZWcxID09PSAwICkgfHwgKCBwZXJwU2VnMSA9PT0gbGltaXQgKSApICkJ
CXJldHVybiBbXTsKKwkJCQkJCXJldHVybiBbIGluU2VnMVB0MiBdOworCisJCQkJCX0KKwkJCQkJ
Ly8gaW50ZXJzZWN0aW9uIGF0IGVuZHBvaW50IG9mIHNlZ21lbnQjMj8KKwkJCQkJaWYgKCBwZXJw
U2VnMSA9PT0gMCApCQlyZXR1cm4gWyBpblNlZzJQdDEgXTsKKwkJCQkJaWYgKCBwZXJwU2VnMSA9
PT0gbGltaXQgKQlyZXR1cm4gWyBpblNlZzJQdDIgXTsKKworCQkJCQkvLyByZXR1cm4gcmVhbCBp
bnRlcnNlY3Rpb24gcG9pbnQKKwkJCQkJdmFyIGZhY3RvclNlZzEgPSBwZXJwU2VnMiAvIGxpbWl0
OworCQkJCQlyZXR1cm4JWyB7IHg6IGluU2VnMVB0MS54ICsgZmFjdG9yU2VnMSAqIHNlZzFkeCwK
KwkJCQkJCQkJeTogaW5TZWcxUHQxLnkgKyBmYWN0b3JTZWcxICogc2VnMWR5IH0gXTsKKworCQkJ
CX0gZWxzZSB7CisKKwkJCQkJLy8gcGFyYWxsZWwgb3IgY29sbGluZWFyCisJCQkJCWlmICggKCBw
ZXJwU2VnMSAhPT0gMCApIHx8CisJCQkJCQkgKCBzZWcyZHkgKiBzZWcxc2VnMmR4ICE9PSBzZWcy
ZHggKiBzZWcxc2VnMmR5ICkgKSAJCQlyZXR1cm4gW107CisKKwkJCQkJLy8gdGhleSBhcmUgY29s
bGluZWFyIG9yIGRlZ2VuZXJhdGUKKwkJCQkJdmFyIHNlZzFQdCA9ICggKCBzZWcxZHggPT09IDAg
KSAmJiAoIHNlZzFkeSA9PT0gMCApICk7CS8vIHNlZ21lbnQxIGlzIGp1c3QgYSBwb2ludD8KKwkJ
CQkJdmFyIHNlZzJQdCA9ICggKCBzZWcyZHggPT09IDAgKSAmJiAoIHNlZzJkeSA9PT0gMCApICk7
CS8vIHNlZ21lbnQyIGlzIGp1c3QgYSBwb2ludD8KKwkJCQkJLy8gYm90aCBzZWdtZW50cyBhcmUg
cG9pbnRzCisJCQkJCWlmICggc2VnMVB0ICYmIHNlZzJQdCApIHsKKworCQkJCQkJaWYgKCAoIGlu
U2VnMVB0MS54ICE9PSBpblNlZzJQdDEueCApIHx8CisJCQkJCQkJICggaW5TZWcxUHQxLnkgIT09
IGluU2VnMlB0MS55ICkgKQkJcmV0dXJuIFtdOwkvLyB0aGV5IGFyZSBkaXN0aW5jdCAgcG9pbnRz
CisJCQkJCQlyZXR1cm4gWyBpblNlZzFQdDEgXTsgICAgICAgICAgICAgICAgIAkJCQkJCS8vIHRo
ZXkgYXJlIHRoZSBzYW1lIHBvaW50CisKKwkJCQkJfQorCQkJCQkvLyBzZWdtZW50IzEgIGlzIGEg
c2luZ2xlIHBvaW50CisJCQkJCWlmICggc2VnMVB0ICkgeworCisJCQkJCQlpZiAoICEgcG9pbnRf
aW5fc2VnbWVudF8yRF9jb2xpbiggaW5TZWcyUHQxLCBpblNlZzJQdDIsIGluU2VnMVB0MSApICkJ
CXJldHVybiBbXTsJCS8vIGJ1dCBub3QgaW4gc2VnbWVudCMyCisJCQkJCQlyZXR1cm4gWyBpblNl
ZzFQdDEgXTsKKworCQkJCQl9CisJCQkJCS8vIHNlZ21lbnQjMiAgaXMgYSBzaW5nbGUgcG9pbnQK
KwkJCQkJaWYgKCBzZWcyUHQgKSB7CisKKwkJCQkJCWlmICggISBwb2ludF9pbl9zZWdtZW50XzJE
X2NvbGluKCBpblNlZzFQdDEsIGluU2VnMVB0MiwgaW5TZWcyUHQxICkgKQkJcmV0dXJuIFtdOwkJ
Ly8gYnV0IG5vdCBpbiBzZWdtZW50IzEKKwkJCQkJCXJldHVybiBbIGluU2VnMlB0MSBdOworCisJ
CQkJCX0KKworCQkJCQkvLyB0aGV5IGFyZSBjb2xsaW5lYXIgc2VnbWVudHMsIHdoaWNoIG1pZ2h0
IG92ZXJsYXAKKwkJCQkJdmFyIHNlZzFtaW4sIHNlZzFtYXgsIHNlZzFtaW5WYWwsIHNlZzFtYXhW
YWw7CisJCQkJCXZhciBzZWcybWluLCBzZWcybWF4LCBzZWcybWluVmFsLCBzZWcybWF4VmFsOwor
CQkJCQlpZiAoIHNlZzFkeCAhPT0gMCApIHsKKworCQkJCQkJLy8gdGhlIHNlZ21lbnRzIGFyZSBO
T1Qgb24gYSB2ZXJ0aWNhbCBsaW5lCisJCQkJCQlpZiAoIGluU2VnMVB0MS54IDwgaW5TZWcxUHQy
LnggKSB7CisKKwkJCQkJCQlzZWcxbWluID0gaW5TZWcxUHQxOyBzZWcxbWluVmFsID0gaW5TZWcx
UHQxLng7CisJCQkJCQkJc2VnMW1heCA9IGluU2VnMVB0Mjsgc2VnMW1heFZhbCA9IGluU2VnMVB0
Mi54OworCisJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJc2VnMW1pbiA9IGluU2VnMVB0Mjsgc2Vn
MW1pblZhbCA9IGluU2VnMVB0Mi54OworCQkJCQkJCXNlZzFtYXggPSBpblNlZzFQdDE7IHNlZzFt
YXhWYWwgPSBpblNlZzFQdDEueDsKKworCQkJCQkJfQorCQkJCQkJaWYgKCBpblNlZzJQdDEueCA8
IGluU2VnMlB0Mi54ICkgeworCisJCQkJCQkJc2VnMm1pbiA9IGluU2VnMlB0MTsgc2VnMm1pblZh
bCA9IGluU2VnMlB0MS54OworCQkJCQkJCXNlZzJtYXggPSBpblNlZzJQdDI7IHNlZzJtYXhWYWwg
PSBpblNlZzJQdDIueDsKKworCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCXNlZzJtaW4gPSBpblNl
ZzJQdDI7IHNlZzJtaW5WYWwgPSBpblNlZzJQdDIueDsKKwkJCQkJCQlzZWcybWF4ID0gaW5TZWcy
UHQxOyBzZWcybWF4VmFsID0gaW5TZWcyUHQxLng7CisKKwkJCQkJCX0KKworCQkJCQl9IGVsc2Ug
eworCisJCQkJCQkvLyB0aGUgc2VnbWVudHMgYXJlIG9uIGEgdmVydGljYWwgbGluZQorCQkJCQkJ
aWYgKCBpblNlZzFQdDEueSA8IGluU2VnMVB0Mi55ICkgeworCisJCQkJCQkJc2VnMW1pbiA9IGlu
U2VnMVB0MTsgc2VnMW1pblZhbCA9IGluU2VnMVB0MS55OworCQkJCQkJCXNlZzFtYXggPSBpblNl
ZzFQdDI7IHNlZzFtYXhWYWwgPSBpblNlZzFQdDIueTsKKworCQkJCQkJfSBlbHNlIHsKKworCQkJ
CQkJCXNlZzFtaW4gPSBpblNlZzFQdDI7IHNlZzFtaW5WYWwgPSBpblNlZzFQdDIueTsKKwkJCQkJ
CQlzZWcxbWF4ID0gaW5TZWcxUHQxOyBzZWcxbWF4VmFsID0gaW5TZWcxUHQxLnk7CisKKwkJCQkJ
CX0KKwkJCQkJCWlmICggaW5TZWcyUHQxLnkgPCBpblNlZzJQdDIueSApIHsKKworCQkJCQkJCXNl
ZzJtaW4gPSBpblNlZzJQdDE7IHNlZzJtaW5WYWwgPSBpblNlZzJQdDEueTsKKwkJCQkJCQlzZWcy
bWF4ID0gaW5TZWcyUHQyOyBzZWcybWF4VmFsID0gaW5TZWcyUHQyLnk7CisKKwkJCQkJCX0gZWxz
ZSB7CisKKwkJCQkJCQlzZWcybWluID0gaW5TZWcyUHQyOyBzZWcybWluVmFsID0gaW5TZWcyUHQy
Lnk7CisJCQkJCQkJc2VnMm1heCA9IGluU2VnMlB0MTsgc2VnMm1heFZhbCA9IGluU2VnMlB0MS55
OworCisJCQkJCQl9CisKKwkJCQkJfQorCQkJCQlpZiAoIHNlZzFtaW5WYWwgPD0gc2VnMm1pblZh
bCApIHsKKworCQkJCQkJaWYgKCBzZWcxbWF4VmFsIDwgIHNlZzJtaW5WYWwgKQlyZXR1cm4gW107
CisJCQkJCQlpZiAoIHNlZzFtYXhWYWwgPT09IHNlZzJtaW5WYWwgKQl7CisKKwkJCQkJCQlpZiAo
IGluRXhjbHVkZUFkamFjZW50U2VncyApCQlyZXR1cm4gW107CisJCQkJCQkJcmV0dXJuIFsgc2Vn
Mm1pbiBdOworCisJCQkJCQl9CisJCQkJCQlpZiAoIHNlZzFtYXhWYWwgPD0gc2VnMm1heFZhbCAp
CXJldHVybiBbIHNlZzJtaW4sIHNlZzFtYXggXTsKKwkJCQkJCXJldHVybglbIHNlZzJtaW4sIHNl
ZzJtYXggXTsKKworCQkJCQl9IGVsc2UgeworCisJCQkJCQlpZiAoIHNlZzFtaW5WYWwgPiAgc2Vn
Mm1heFZhbCApCXJldHVybiBbXTsKKwkJCQkJCWlmICggc2VnMW1pblZhbCA9PT0gc2VnMm1heFZh
bCApCXsKKworCQkJCQkJCWlmICggaW5FeGNsdWRlQWRqYWNlbnRTZWdzICkJCXJldHVybiBbXTsK
KwkJCQkJCQlyZXR1cm4gWyBzZWcxbWluIF07CisKKwkJCQkJCX0KKwkJCQkJCWlmICggc2VnMW1h
eFZhbCA8PSBzZWcybWF4VmFsICkJcmV0dXJuIFsgc2VnMW1pbiwgc2VnMW1heCBdOworCQkJCQkJ
cmV0dXJuCVsgc2VnMW1pbiwgc2VnMm1heCBdOworCisJCQkJCX0KKworCQkJCX0KKworCQkJfQor
CisJCQlmdW5jdGlvbiBpc1BvaW50SW5zaWRlQW5nbGUoIGluVmVydGV4LCBpbkxlZ0Zyb21QdCwg
aW5MZWdUb1B0LCBpbk90aGVyUHQgKSB7CisKKwkJCQkvLyBUaGUgb3JkZXIgb2YgbGVncyBpcyBp
bXBvcnRhbnQKKworCQkJCS8vIHRyYW5zbGF0aW9uIG9mIGFsbCBwb2ludHMsIHNvIHRoYXQgVmVy
dGV4IGlzIGF0ICgwLDApCisJCQkJdmFyIGxlZ0Zyb21QdFgJPSBpbkxlZ0Zyb21QdC54IC0gaW5W
ZXJ0ZXgueCwgIGxlZ0Zyb21QdFkJPSBpbkxlZ0Zyb21QdC55IC0gaW5WZXJ0ZXgueTsKKwkJCQl2
YXIgbGVnVG9QdFgJPSBpbkxlZ1RvUHQueAktIGluVmVydGV4LngsICBsZWdUb1B0WQkJPSBpbkxl
Z1RvUHQueQktIGluVmVydGV4Lnk7CisJCQkJdmFyIG90aGVyUHRYCT0gaW5PdGhlclB0LngJLSBp
blZlcnRleC54LCAgb3RoZXJQdFkJCT0gaW5PdGhlclB0LnkJLSBpblZlcnRleC55OworCisJCQkJ
Ly8gbWFpbiBhbmdsZSA+MDogPCAxODAgZGVnLjsgMDogMTgwIGRlZy47IDwwOiA+IDE4MCBkZWcu
CisJCQkJdmFyIGZyb20ydG9BbmdsZQk9IGxlZ0Zyb21QdFggKiBsZWdUb1B0WSAtIGxlZ0Zyb21Q
dFkgKiBsZWdUb1B0WDsKKwkJCQl2YXIgZnJvbTJvdGhlckFuZ2xlCT0gbGVnRnJvbVB0WCAqIG90
aGVyUHRZIC0gbGVnRnJvbVB0WSAqIG90aGVyUHRYOworCisJCQkJaWYgKCBNYXRoLmFicyggZnJv
bTJ0b0FuZ2xlICkgPiBOdW1iZXIuRVBTSUxPTiApIHsKKworCQkJCQkvLyBhbmdsZSAhPSAxODAg
ZGVnLgorCisJCQkJCXZhciBvdGhlcjJ0b0FuZ2xlCQk9IG90aGVyUHRYICogbGVnVG9QdFkgLSBv
dGhlclB0WSAqIGxlZ1RvUHRYOworCQkJCQkvLyBjb25zb2xlLmxvZyggImZyb20ydG86ICIgKyBm
cm9tMnRvQW5nbGUgKyAiLCBmcm9tMm90aGVyOiAiICsgZnJvbTJvdGhlckFuZ2xlICsgIiwgb3Ro
ZXIydG86ICIgKyBvdGhlcjJ0b0FuZ2xlICk7CisKKwkJCQkJaWYgKCBmcm9tMnRvQW5nbGUgPiAw
ICkgeworCisJCQkJCQkvLyBtYWluIGFuZ2xlIDwgMTgwIGRlZy4KKwkJCQkJCXJldHVybgkoICgg
ZnJvbTJvdGhlckFuZ2xlID49IDAgKSAmJiAoIG90aGVyMnRvQW5nbGUgPj0gMCApICk7CisKKwkJ
CQkJfSBlbHNlIHsKKworCQkJCQkJLy8gbWFpbiBhbmdsZSA+IDE4MCBkZWcuCisJCQkJCQlyZXR1
cm4JKCAoIGZyb20yb3RoZXJBbmdsZSA+PSAwICkgfHwgKCBvdGhlcjJ0b0FuZ2xlID49IDAgKSAp
OworCisJCQkJCX0KKworCQkJCX0gZWxzZSB7CisKKwkJCQkJLy8gYW5nbGUgPT0gMTgwIGRlZy4K
KwkJCQkJLy8gY29uc29sZS5sb2coICJmcm9tMnRvOiAxODAgZGVnLiwgZnJvbTJvdGhlcjogIiAr
IGZyb20yb3RoZXJBbmdsZSAgKTsKKwkJCQkJcmV0dXJuCSggZnJvbTJvdGhlckFuZ2xlID4gMCAp
OworCisJCQkJfQorCisJCQl9CisKKworCQkJZnVuY3Rpb24gcmVtb3ZlSG9sZXMoIGNvbnRvdXIs
IGhvbGVzICkgeworCisJCQkJdmFyIHNoYXBlID0gY29udG91ci5jb25jYXQoKTsgLy8gd29yayBv
biB0aGlzIHNoYXBlCisJCQkJdmFyIGhvbGU7CisKKwkJCQlmdW5jdGlvbiBpc0N1dExpbmVJbnNp
ZGVBbmdsZXMoIGluU2hhcGVJZHgsIGluSG9sZUlkeCApIHsKKworCQkJCQkvLyBDaGVjayBpZiBo
b2xlIHBvaW50IGxpZXMgd2l0aGluIGFuZ2xlIGFyb3VuZCBzaGFwZSBwb2ludAorCQkJCQl2YXIg
bGFzdFNoYXBlSWR4ID0gc2hhcGUubGVuZ3RoIC0gMTsKKworCQkJCQl2YXIgcHJldlNoYXBlSWR4
ID0gaW5TaGFwZUlkeCAtIDE7CisJCQkJCWlmICggcHJldlNoYXBlSWR4IDwgMCApCQkJcHJldlNo
YXBlSWR4ID0gbGFzdFNoYXBlSWR4OworCisJCQkJCXZhciBuZXh0U2hhcGVJZHggPSBpblNoYXBl
SWR4ICsgMTsKKwkJCQkJaWYgKCBuZXh0U2hhcGVJZHggPiBsYXN0U2hhcGVJZHggKQluZXh0U2hh
cGVJZHggPSAwOworCisJCQkJCXZhciBpbnNpZGVBbmdsZSA9IGlzUG9pbnRJbnNpZGVBbmdsZSgg
c2hhcGVbIGluU2hhcGVJZHggXSwgc2hhcGVbIHByZXZTaGFwZUlkeCBdLCBzaGFwZVsgbmV4dFNo
YXBlSWR4IF0sIGhvbGVbIGluSG9sZUlkeCBdICk7CisJCQkJCWlmICggISBpbnNpZGVBbmdsZSAp
IHsKKworCQkJCQkJLy8gY29uc29sZS5sb2coICJWZXJ0ZXggKFNoYXBlKTogIiArIGluU2hhcGVJ
ZHggKyAiLCBQb2ludDogIiArIGhvbGVbaW5Ib2xlSWR4XS54ICsgIi8iICsgaG9sZVtpbkhvbGVJ
ZHhdLnkgKTsKKwkJCQkJCXJldHVybglmYWxzZTsKKworCQkJCQl9CisKKwkJCQkJLy8gQ2hlY2sg
aWYgc2hhcGUgcG9pbnQgbGllcyB3aXRoaW4gYW5nbGUgYXJvdW5kIGhvbGUgcG9pbnQKKwkJCQkJ
dmFyIGxhc3RIb2xlSWR4ID0gaG9sZS5sZW5ndGggLSAxOworCisJCQkJCXZhciBwcmV2SG9sZUlk
eCA9IGluSG9sZUlkeCAtIDE7CisJCQkJCWlmICggcHJldkhvbGVJZHggPCAwICkJCQlwcmV2SG9s
ZUlkeCA9IGxhc3RIb2xlSWR4OworCisJCQkJCXZhciBuZXh0SG9sZUlkeCA9IGluSG9sZUlkeCAr
IDE7CisJCQkJCWlmICggbmV4dEhvbGVJZHggPiBsYXN0SG9sZUlkeCApCW5leHRIb2xlSWR4ID0g
MDsKKworCQkJCQlpbnNpZGVBbmdsZSA9IGlzUG9pbnRJbnNpZGVBbmdsZSggaG9sZVsgaW5Ib2xl
SWR4IF0sIGhvbGVbIHByZXZIb2xlSWR4IF0sIGhvbGVbIG5leHRIb2xlSWR4IF0sIHNoYXBlWyBp
blNoYXBlSWR4IF0gKTsKKwkJCQkJaWYgKCAhIGluc2lkZUFuZ2xlICkgeworCisJCQkJCQkvLyBj
b25zb2xlLmxvZyggIlZlcnRleCAoSG9sZSk6ICIgKyBpbkhvbGVJZHggKyAiLCBQb2ludDogIiAr
IHNoYXBlW2luU2hhcGVJZHhdLnggKyAiLyIgKyBzaGFwZVtpblNoYXBlSWR4XS55ICk7CisJCQkJ
CQlyZXR1cm4JZmFsc2U7CisKKwkJCQkJfQorCisJCQkJCXJldHVybgl0cnVlOworCisJCQkJfQor
CisJCQkJZnVuY3Rpb24gaW50ZXJzZWN0c1NoYXBlRWRnZSggaW5TaGFwZVB0LCBpbkhvbGVQdCAp
IHsKKworCQkJCQkvLyBjaGVja3MgZm9yIGludGVyc2VjdGlvbnMgd2l0aCBzaGFwZSBlZGdlcwor
CQkJCQl2YXIgc0lkeCwgbmV4dElkeCwgaW50ZXJzZWN0aW9uOworCQkJCQlmb3IgKCBzSWR4ID0g
MDsgc0lkeCA8IHNoYXBlLmxlbmd0aDsgc0lkeCArKyApIHsKKworCQkJCQkJbmV4dElkeCA9IHNJ
ZHggKyAxOyBuZXh0SWR4ICU9IHNoYXBlLmxlbmd0aDsKKwkJCQkJCWludGVyc2VjdGlvbiA9IGlu
dGVyc2VjdF9zZWdtZW50c18yRCggaW5TaGFwZVB0LCBpbkhvbGVQdCwgc2hhcGVbIHNJZHggXSwg
c2hhcGVbIG5leHRJZHggXSwgdHJ1ZSApOworCQkJCQkJaWYgKCBpbnRlcnNlY3Rpb24ubGVuZ3Ro
ID4gMCApCQlyZXR1cm4JdHJ1ZTsKKworCQkJCQl9CisKKwkJCQkJcmV0dXJuCWZhbHNlOworCisJ
CQkJfQorCisJCQkJdmFyIGluZGVwSG9sZXMgPSBbXTsKKworCQkJCWZ1bmN0aW9uIGludGVyc2Vj
dHNIb2xlRWRnZSggaW5TaGFwZVB0LCBpbkhvbGVQdCApIHsKKworCQkJCQkvLyBjaGVja3MgZm9y
IGludGVyc2VjdGlvbnMgd2l0aCBob2xlIGVkZ2VzCisJCQkJCXZhciBpaElkeCwgY2hrSG9sZSwK
KwkJCQkJCWhJZHgsIG5leHRJZHgsIGludGVyc2VjdGlvbjsKKwkJCQkJZm9yICggaWhJZHggPSAw
OyBpaElkeCA8IGluZGVwSG9sZXMubGVuZ3RoOyBpaElkeCArKyApIHsKKworCQkJCQkJY2hrSG9s
ZSA9IGhvbGVzWyBpbmRlcEhvbGVzWyBpaElkeCBdXTsKKwkJCQkJCWZvciAoIGhJZHggPSAwOyBo
SWR4IDwgY2hrSG9sZS5sZW5ndGg7IGhJZHggKysgKSB7CisKKwkJCQkJCQluZXh0SWR4ID0gaElk
eCArIDE7IG5leHRJZHggJT0gY2hrSG9sZS5sZW5ndGg7CisJCQkJCQkJaW50ZXJzZWN0aW9uID0g
aW50ZXJzZWN0X3NlZ21lbnRzXzJEKCBpblNoYXBlUHQsIGluSG9sZVB0LCBjaGtIb2xlWyBoSWR4
IF0sIGNoa0hvbGVbIG5leHRJZHggXSwgdHJ1ZSApOworCQkJCQkJCWlmICggaW50ZXJzZWN0aW9u
Lmxlbmd0aCA+IDAgKQkJcmV0dXJuCXRydWU7CisKKwkJCQkJCX0KKworCQkJCQl9CisJCQkJCXJl
dHVybglmYWxzZTsKKworCQkJCX0KKworCQkJCXZhciBob2xlSW5kZXgsIHNoYXBlSW5kZXgsCisJ
CQkJCXNoYXBlUHQsIGhvbGVQdCwKKwkJCQkJaG9sZUlkeCwgY3V0S2V5LCBmYWlsZWRDdXRzID0g
W10sCisJCQkJCXRtcFNoYXBlMSwgdG1wU2hhcGUyLAorCQkJCQl0bXBIb2xlMSwgdG1wSG9sZTI7
CisKKwkJCQlmb3IgKCB2YXIgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysg
KSB7CisKKwkJCQkJaW5kZXBIb2xlcy5wdXNoKCBoICk7CisKKwkJCQl9CisKKwkJCQl2YXIgbWlu
U2hhcGVJbmRleCA9IDA7CisJCQkJdmFyIGNvdW50ZXIgPSBpbmRlcEhvbGVzLmxlbmd0aCAqIDI7
CisJCQkJd2hpbGUgKCBpbmRlcEhvbGVzLmxlbmd0aCA+IDAgKSB7CisKKwkJCQkJY291bnRlciAt
LTsKKwkJCQkJaWYgKCBjb3VudGVyIDwgMCApIHsKKworCQkJCQkJY29uc29sZS5sb2coICJJbmZp
bml0ZSBMb29wISBIb2xlcyBsZWZ0OiIgKyBpbmRlcEhvbGVzLmxlbmd0aCArICIsIFByb2JhYmx5
IEhvbGUgb3V0c2lkZSBTaGFwZSEiICk7CisJCQkJCQlicmVhazsKKworCQkJCQl9CisKKwkJCQkJ
Ly8gc2VhcmNoIGZvciBzaGFwZS12ZXJ0ZXggYW5kIGhvbGUtdmVydGV4LAorCQkJCQkvLyB3aGlj
aCBjYW4gYmUgY29ubmVjdGVkIHdpdGhvdXQgaW50ZXJzZWN0aW9ucworCQkJCQlmb3IgKCBzaGFw
ZUluZGV4ID0gbWluU2hhcGVJbmRleDsgc2hhcGVJbmRleCA8IHNoYXBlLmxlbmd0aDsgc2hhcGVJ
bmRleCArKyApIHsKKworCQkJCQkJc2hhcGVQdCA9IHNoYXBlWyBzaGFwZUluZGV4IF07CisJCQkJ
CQlob2xlSW5kZXgJPSAtIDE7CisKKwkJCQkJCS8vIHNlYXJjaCBmb3IgaG9sZSB3aGljaCBjYW4g
YmUgcmVhY2hlZCB3aXRob3V0IGludGVyc2VjdGlvbnMKKwkJCQkJCWZvciAoIHZhciBoID0gMDsg
aCA8IGluZGVwSG9sZXMubGVuZ3RoOyBoICsrICkgeworCisJCQkJCQkJaG9sZUlkeCA9IGluZGVw
SG9sZXNbIGggXTsKKworCQkJCQkJCS8vIHByZXZlbnQgbXVsdGlwbGUgY2hlY2tzCisJCQkJCQkJ
Y3V0S2V5ID0gc2hhcGVQdC54ICsgIjoiICsgc2hhcGVQdC55ICsgIjoiICsgaG9sZUlkeDsKKwkJ
CQkJCQlpZiAoIGZhaWxlZEN1dHNbIGN1dEtleSBdICE9PSB1bmRlZmluZWQgKQkJCWNvbnRpbnVl
OworCisJCQkJCQkJaG9sZSA9IGhvbGVzWyBob2xlSWR4IF07CisJCQkJCQkJZm9yICggdmFyIGgy
ID0gMDsgaDIgPCBob2xlLmxlbmd0aDsgaDIgKysgKSB7CisKKwkJCQkJCQkJaG9sZVB0ID0gaG9s
ZVsgaDIgXTsKKwkJCQkJCQkJaWYgKCAhIGlzQ3V0TGluZUluc2lkZUFuZ2xlcyggc2hhcGVJbmRl
eCwgaDIgKSApCQljb250aW51ZTsKKwkJCQkJCQkJaWYgKCBpbnRlcnNlY3RzU2hhcGVFZGdlKCBz
aGFwZVB0LCBob2xlUHQgKSApCQljb250aW51ZTsKKwkJCQkJCQkJaWYgKCBpbnRlcnNlY3RzSG9s
ZUVkZ2UoIHNoYXBlUHQsIGhvbGVQdCApICkJCWNvbnRpbnVlOworCisJCQkJCQkJCWhvbGVJbmRl
eCA9IGgyOworCQkJCQkJCQlpbmRlcEhvbGVzLnNwbGljZSggaCwgMSApOworCisJCQkJCQkJCXRt
cFNoYXBlMSA9IHNoYXBlLnNsaWNlKCAwLCBzaGFwZUluZGV4ICsgMSApOworCQkJCQkJCQl0bXBT
aGFwZTIgPSBzaGFwZS5zbGljZSggc2hhcGVJbmRleCApOworCQkJCQkJCQl0bXBIb2xlMSA9IGhv
bGUuc2xpY2UoIGhvbGVJbmRleCApOworCQkJCQkJCQl0bXBIb2xlMiA9IGhvbGUuc2xpY2UoIDAs
IGhvbGVJbmRleCArIDEgKTsKKworCQkJCQkJCQlzaGFwZSA9IHRtcFNoYXBlMS5jb25jYXQoIHRt
cEhvbGUxICkuY29uY2F0KCB0bXBIb2xlMiApLmNvbmNhdCggdG1wU2hhcGUyICk7CisKKwkJCQkJ
CQkJbWluU2hhcGVJbmRleCA9IHNoYXBlSW5kZXg7CisKKwkJCQkJCQkJLy8gRGVidWcgb25seSwg
dG8gc2hvdyB0aGUgc2VsZWN0ZWQgY3V0cworCQkJCQkJCQkvLyBnbG9iX0N1dExpbmVzLnB1c2go
IFsgc2hhcGVQdCwgaG9sZVB0IF0gKTsKKworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCX0KKwkJ
CQkJCQlpZiAoIGhvbGVJbmRleCA+PSAwICkJYnJlYWs7CQkvLyBob2xlLXZlcnRleCBmb3VuZAor
CisJCQkJCQkJZmFpbGVkQ3V0c1sgY3V0S2V5IF0gPSB0cnVlOwkJCS8vIHJlbWVtYmVyIGZhaWx1
cmUKKworCQkJCQkJfQorCQkJCQkJaWYgKCBob2xlSW5kZXggPj0gMCApCWJyZWFrOwkJLy8gaG9s
ZS12ZXJ0ZXggZm91bmQKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlyZXR1cm4gc2hhcGU7IAkJ
CS8qIHNoYXBlIHdpdGggbm8gaG9sZXMgKi8KKworCQkJfQorCisKKwkJCXZhciBpLCBpbCwgZiwg
ZmFjZSwKKwkJCQlrZXksIGluZGV4LAorCQkJCWFsbFBvaW50c01hcCA9IHt9OworCisJCQkvLyBU
byBtYWludGFpbiByZWZlcmVuY2UgdG8gb2xkIHNoYXBlLCBvbmUgbXVzdCBtYXRjaCBjb29yZGlu
YXRlcywgb3Igb2Zmc2V0IHRoZSBpbmRpY2VzIGZyb20gb3JpZ2luYWwgYXJyYXlzLiBJdCdzIHBy
b2JhYmx5IGVhc2llciB0byBkbyB0aGUgZmlyc3QuCisKKwkJCXZhciBhbGxwb2ludHMgPSBjb250
b3VyLmNvbmNhdCgpOworCisJCQlmb3IgKCB2YXIgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBo
IDwgaGw7IGggKysgKSB7CisKKwkJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggYWxscG9p
bnRzLCBob2xlc1sgaCBdICk7CisKKwkJCX0KKworCQkJLy9jb25zb2xlLmxvZyggImFsbHBvaW50
cyIsYWxscG9pbnRzLCBhbGxwb2ludHMubGVuZ3RoICk7CisKKwkJCS8vIHByZXBhcmUgYWxsIHBv
aW50cyBtYXAKKworCQkJZm9yICggaSA9IDAsIGlsID0gYWxscG9pbnRzLmxlbmd0aDsgaSA8IGls
OyBpICsrICkgeworCisJCQkJa2V5ID0gYWxscG9pbnRzWyBpIF0ueCArICI6IiArIGFsbHBvaW50
c1sgaSBdLnk7CisKKwkJCQlpZiAoIGFsbFBvaW50c01hcFsga2V5IF0gIT09IHVuZGVmaW5lZCAp
IHsKKworCQkJCQljb25zb2xlLndhcm4oICJUSFJFRS5TaGFwZVV0aWxzOiBEdXBsaWNhdGUgcG9p
bnQiLCBrZXksIGkgKTsKKworCQkJCX0KKworCQkJCWFsbFBvaW50c01hcFsga2V5IF0gPSBpOwor
CisJCQl9CisKKwkJCS8vIHJlbW92ZSBob2xlcyBieSBjdXR0aW5nIHBhdGhzIHRvIGhvbGVzIGFu
ZCBhZGRpbmcgdGhlbSB0byB0aGUgc2hhcGUKKwkJCXZhciBzaGFwZVdpdGhvdXRIb2xlcyA9IHJl
bW92ZUhvbGVzKCBjb250b3VyLCBob2xlcyApOworCisJCQl2YXIgdHJpYW5nbGVzID0gU2hhcGVV
dGlscy50cmlhbmd1bGF0ZSggc2hhcGVXaXRob3V0SG9sZXMsIGZhbHNlICk7IC8vIFRydWUgcmV0
dXJucyBpbmRpY2VzIGZvciBwb2ludHMgb2Ygc3Bvb2xlZCBzaGFwZQorCQkJLy9jb25zb2xlLmxv
ZyggInRyaWFuZ2xlcyIsdHJpYW5nbGVzLCB0cmlhbmdsZXMubGVuZ3RoICk7CisKKwkJCS8vIGNo
ZWNrIGFsbCBmYWNlIHZlcnRpY2VzIGFnYWluc3QgYWxsIHBvaW50cyBtYXAKKworCQkJZm9yICgg
aSA9IDAsIGlsID0gdHJpYW5nbGVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJZmFj
ZSA9IHRyaWFuZ2xlc1sgaSBdOworCisJCQkJZm9yICggZiA9IDA7IGYgPCAzOyBmICsrICkgewor
CisJCQkJCWtleSA9IGZhY2VbIGYgXS54ICsgIjoiICsgZmFjZVsgZiBdLnk7CisKKwkJCQkJaW5k
ZXggPSBhbGxQb2ludHNNYXBbIGtleSBdOworCisJCQkJCWlmICggaW5kZXggIT09IHVuZGVmaW5l
ZCApIHsKKworCQkJCQkJZmFjZVsgZiBdID0gaW5kZXg7CisKKwkJCQkJfQorCisJCQkJfQorCisJ
CQl9CisKKwkJCXJldHVybiB0cmlhbmdsZXMuY29uY2F0KCk7CisKKwkJfSwKKworCQlpc0Nsb2Nr
V2lzZTogZnVuY3Rpb24gKCBwdHMgKSB7CisKKwkJCXJldHVybiBTaGFwZVV0aWxzLmFyZWEoIHB0
cyApIDwgMDsKKworCQl9CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciB6ejg1IC8gaHR0cDov
L3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZworCSAqCisJICogQ3JlYXRlcyBleHRydWRlZCBn
ZW9tZXRyeSBmcm9tIGEgcGF0aCBzaGFwZS4KKwkgKgorCSAqIHBhcmFtZXRlcnMgPSB7CisJICoK
KwkgKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1
cnZlcworCSAqICBzdGVwczogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgZm9yIHotc2lkZSBl
eHRydXNpb25zIC8gdXNlZCBmb3Igc3ViZGl2aWRpbmcgc2VnbWVudHMgb2YgZXh0cnVkZSBzcGxp
bmUgdG9vCisJICogIGFtb3VudDogPGludD4sIC8vIERlcHRoIHRvIGV4dHJ1ZGUgdGhlIHNoYXBl
CisJICoKKwkgKiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWwKKwkgKiAg
YmV2ZWxUaGlja25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGhlIG9yaWdpbmFsIHNo
YXBlIGJldmVsIGdvZXMKKwkgKiAgYmV2ZWxTaXplOiA8ZmxvYXQ+LCAvLyBob3cgZmFyIGZyb20g
c2hhcGUgb3V0bGluZSBpcyBiZXZlbAorCSAqICBiZXZlbFNlZ21lbnRzOiA8aW50PiwgLy8gbnVt
YmVyIG9mIGJldmVsIGxheWVycworCSAqCisJICogIGV4dHJ1ZGVQYXRoOiA8VEhSRUUuQ3VydmU+
IC8vIGN1cnZlIHRvIGV4dHJ1ZGUgc2hhcGUgYWxvbmcKKwkgKiAgZnJhbWVzOiA8T2JqZWN0PiAv
LyBjb250YWluaW5nIGFycmF5cyBvZiB0YW5nZW50cywgbm9ybWFscywgYmlub3JtYWxzCisJICoK
KwkgKiAgVVZHZW5lcmF0b3I6IDxPYmplY3Q+IC8vIG9iamVjdCB0aGF0IHByb3ZpZGVzIFVWIGdl
bmVyYXRvciBmdW5jdGlvbnMKKwkgKgorCSAqIH0KKwkgKi8KKworCS8vIEV4dHJ1ZGVHZW9tZXRy
eQorCisJZnVuY3Rpb24gRXh0cnVkZUdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7CisKKwkJ
R2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdFeHRydWRlR2VvbWV0cnkn
OworCisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXNoYXBlczogc2hhcGVzLAorCQkJb3B0aW9u
czogb3B0aW9ucworCQl9OworCisJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgRXh0cnVk
ZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSApOworCQl0aGlzLm1lcmdlVmVydGlj
ZXMoKTsKKworCX0KKworCUV4dHJ1ZGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRl
KCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlFeHRydWRlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0
cnVjdG9yID0gRXh0cnVkZUdlb21ldHJ5OworCisJLy8gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5CisK
KwlmdW5jdGlvbiBFeHRydWRlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgb3B0aW9ucyApIHsKKwor
CQlpZiAoIHR5cGVvZiAoIHNoYXBlcyApID09PSAidW5kZWZpbmVkIiApIHsKKworCQkJcmV0dXJu
OworCisJCX0KKworCQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBl
ID0gJ0V4dHJ1ZGVCdWZmZXJHZW9tZXRyeSc7CisKKwkJc2hhcGVzID0gQXJyYXkuaXNBcnJheSgg
c2hhcGVzICkgPyBzaGFwZXMgOiBbIHNoYXBlcyBdOworCisJCXRoaXMuYWRkU2hhcGVMaXN0KCBz
aGFwZXMsIG9wdGlvbnMgKTsKKworCQl0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7CisKKwkJ
Ly8gY2FuJ3QgcmVhbGx5IHVzZSBhdXRvbWF0aWMgdmVydGV4IG5vcm1hbHMKKwkJLy8gYXMgdGhl
biBmcm9udCBhbmQgYmFjayBzaWRlcyBnZXQgc21vb3RoZWQgdG9vCisJCS8vIHNob3VsZCBkbyBz
ZXBhcmF0ZSBzbW9vdGhpbmcganVzdCBmb3Igc2lkZXMKKworCQkvL3RoaXMuY29tcHV0ZVZlcnRl
eE5vcm1hbHMoKTsKKworCQkvL2NvbnNvbGUubG9nKCAidG9vayIsICggRGF0ZS5ub3coKSAtIHN0
YXJ0VGltZSApICk7CisKKwl9CisKKwlFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0g
T2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisJRXh0cnVkZUJ1ZmZl
ckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTsK
KworCUV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuZ2V0QXJyYXlzID0gZnVuY3Rpb24g
KCkgeworCisJCXZhciBwb3NpdGlvbkF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCAicG9z
aXRpb24iICk7CisJCXZhciB2ZXJ0aWNlc0FycmF5ID0gcG9zaXRpb25BdHRyaWJ1dGUgPyBBcnJh
eS5wcm90b3R5cGUuc2xpY2UuY2FsbCggcG9zaXRpb25BdHRyaWJ1dGUuYXJyYXkgKSA6IFtdOwor
CisJCXZhciB1dkF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCAidXYiICk7CisJCXZhciB1
dkFycmF5ID0gdXZBdHRyaWJ1dGUgPyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdXZBdHRy
aWJ1dGUuYXJyYXkgKSA6IFtdOworCisJCXZhciBJbmRleEF0dHJpYnV0ZSA9IHRoaXMuaW5kZXg7
CisJCXZhciBpbmRpY2VzQXJyYXkgPSBJbmRleEF0dHJpYnV0ZSA/IEFycmF5LnByb3RvdHlwZS5z
bGljZS5jYWxsKCBJbmRleEF0dHJpYnV0ZS5hcnJheSApIDogW107CisKKwkJcmV0dXJuIHsKKwkJ
CXBvc2l0aW9uOiB2ZXJ0aWNlc0FycmF5LAorCQkJdXY6IHV2QXJyYXksCisJCQlpbmRleDogaW5k
aWNlc0FycmF5CisJCX07CisKKwl9OworCisJRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlw
ZS5hZGRTaGFwZUxpc3QgPSBmdW5jdGlvbiAoIHNoYXBlcywgb3B0aW9ucyApIHsKKworCQl2YXIg
c2wgPSBzaGFwZXMubGVuZ3RoOworCQlvcHRpb25zLmFycmF5cyA9IHRoaXMuZ2V0QXJyYXlzKCk7
CisKKwkJZm9yICggdmFyIHMgPSAwOyBzIDwgc2w7IHMgKysgKSB7CisKKwkJCXZhciBzaGFwZSA9
IHNoYXBlc1sgcyBdOworCQkJdGhpcy5hZGRTaGFwZSggc2hhcGUsIG9wdGlvbnMgKTsKKworCQl9
CisKKwkJdGhpcy5zZXRJbmRleCggb3B0aW9ucy5hcnJheXMuaW5kZXggKTsKKwkJdGhpcy5hZGRB
dHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBvcHRpb25z
LmFycmF5cy5wb3NpdGlvbiwgMyApICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcg
RmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggb3B0aW9ucy5hcnJheXMudXYsIDIgKSApOworCisJfTsK
KworCUV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuYWRkU2hhcGUgPSBmdW5jdGlvbiAo
IHNoYXBlLCBvcHRpb25zICkgeworCisJCXZhciBhcnJheXMgPSBvcHRpb25zLmFycmF5cyA/IG9w
dGlvbnMuYXJyYXlzIDogdGhpcy5nZXRBcnJheXMoKTsKKwkJdmFyIHZlcnRpY2VzQXJyYXkgPSBh
cnJheXMucG9zaXRpb247CisJCXZhciBpbmRpY2VzQXJyYXkgPSBhcnJheXMuaW5kZXg7CisJCXZh
ciB1dkFycmF5ID0gYXJyYXlzLnV2OworCisJCXZhciBwbGFjZWhvbGRlciA9IFtdOworCisKKwkJ
dmFyIGFtb3VudCA9IG9wdGlvbnMuYW1vdW50ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmFtb3Vu
dCA6IDEwMDsKKworCQl2YXIgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNz
ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogNjsgLy8gMTAKKwkJdmFy
IGJldmVsU2l6ZSA9IG9wdGlvbnMuYmV2ZWxTaXplICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJl
dmVsU2l6ZSA6IGJldmVsVGhpY2tuZXNzIC0gMjsgLy8gOAorCQl2YXIgYmV2ZWxTZWdtZW50cyA9
IG9wdGlvbnMuYmV2ZWxTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNlZ21l
bnRzIDogMzsKKworCQl2YXIgYmV2ZWxFbmFibGVkID0gb3B0aW9ucy5iZXZlbEVuYWJsZWQgIT09
IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxFbmFibGVkIDogdHJ1ZTsgLy8gZmFsc2UKKworCQl2
YXIgY3VydmVTZWdtZW50cyA9IG9wdGlvbnMuY3VydmVTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8g
b3B0aW9ucy5jdXJ2ZVNlZ21lbnRzIDogMTI7CisKKwkJdmFyIHN0ZXBzID0gb3B0aW9ucy5zdGVw
cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdGVwcyA6IDE7CisKKwkJdmFyIGV4dHJ1ZGVQYXRo
ID0gb3B0aW9ucy5leHRydWRlUGF0aDsKKwkJdmFyIGV4dHJ1ZGVQdHMsIGV4dHJ1ZGVCeVBhdGgg
PSBmYWxzZTsKKworCQkvLyBVc2UgZGVmYXVsdCBXb3JsZFVWR2VuZXJhdG9yIGlmIG5vIFVWIGdl
bmVyYXRvcnMgYXJlIHNwZWNpZmllZC4KKwkJdmFyIHV2Z2VuID0gb3B0aW9ucy5VVkdlbmVyYXRv
ciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5VVkdlbmVyYXRvciA6IEV4dHJ1ZGVHZW9tZXRyeS5X
b3JsZFVWR2VuZXJhdG9yOworCisJCXZhciBzcGxpbmVUdWJlLCBiaW5vcm1hbCwgbm9ybWFsLCBw
b3NpdGlvbjI7CisJCWlmICggZXh0cnVkZVBhdGggKSB7CisKKwkJCWV4dHJ1ZGVQdHMgPSBleHRy
dWRlUGF0aC5nZXRTcGFjZWRQb2ludHMoIHN0ZXBzICk7CisKKwkJCWV4dHJ1ZGVCeVBhdGggPSB0
cnVlOworCQkJYmV2ZWxFbmFibGVkID0gZmFsc2U7IC8vIGJldmVscyBub3Qgc3VwcG9ydGVkIGZv
ciBwYXRoIGV4dHJ1c2lvbgorCisJCQkvLyBTRVRVUCBUTkIgdmFyaWFibGVzCisKKwkJCS8vIFRP
RE8xIC0gaGF2ZSBhIC5pc0Nsb3NlZCBpbiBzcGxpbmU/CisKKwkJCXNwbGluZVR1YmUgPSBvcHRp
b25zLmZyYW1lcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5mcmFtZXMgOiBleHRydWRlUGF0aC5j
b21wdXRlRnJlbmV0RnJhbWVzKCBzdGVwcywgZmFsc2UgKTsKKworCQkJLy8gY29uc29sZS5sb2co
c3BsaW5lVHViZSwgJ3NwbGluZVR1YmUnLCBzcGxpbmVUdWJlLm5vcm1hbHMubGVuZ3RoLCAnc3Rl
cHMnLCBzdGVwcywgJ2V4dHJ1ZGVQdHMnLCBleHRydWRlUHRzLmxlbmd0aCk7CisKKwkJCWJpbm9y
bWFsID0gbmV3IFZlY3RvcjMoKTsKKwkJCW5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CisJCQlwb3Np
dGlvbjIgPSBuZXcgVmVjdG9yMygpOworCisJCX0KKworCQkvLyBTYWZlZ3VhcmRzIGlmIGJldmVs
cyBhcmUgbm90IGVuYWJsZWQKKworCQlpZiAoICEgYmV2ZWxFbmFibGVkICkgeworCisJCQliZXZl
bFNlZ21lbnRzID0gMDsKKwkJCWJldmVsVGhpY2tuZXNzID0gMDsKKwkJCWJldmVsU2l6ZSA9IDA7
CisKKwkJfQorCisJCS8vIFZhcmlhYmxlcyBpbml0aWFsaXphdGlvbgorCisJCXZhciBhaG9sZSwg
aCwgaGw7IC8vIGxvb3Bpbmcgb2YgaG9sZXMKKwkJdmFyIHNjb3BlID0gdGhpczsKKworCQl2YXIg
c2hhcGVQb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRzKCBjdXJ2ZVNlZ21lbnRzICk7CisKKwkJ
dmFyIHZlcnRpY2VzID0gc2hhcGVQb2ludHMuc2hhcGU7CisJCXZhciBob2xlcyA9IHNoYXBlUG9p
bnRzLmhvbGVzOworCisJCXZhciByZXZlcnNlID0gISBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCB2
ZXJ0aWNlcyApOworCisJCWlmICggcmV2ZXJzZSApIHsKKworCQkJdmVydGljZXMgPSB2ZXJ0aWNl
cy5yZXZlcnNlKCk7CisKKwkJCS8vIE1heWJlIHdlIHNob3VsZCBhbHNvIGNoZWNrIGlmIGhvbGVz
IGFyZSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLCBqdXN0IHRvIGJlIHNhZmUgLi4uCisKKwkJ
CWZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkgeworCisJCQkJ
YWhvbGUgPSBob2xlc1sgaCBdOworCisJCQkJaWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBh
aG9sZSApICkgeworCisJCQkJCWhvbGVzWyBoIF0gPSBhaG9sZS5yZXZlcnNlKCk7CisKKwkJCQl9
CisKKwkJCX0KKworCQl9CisKKworCQl2YXIgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRl
U2hhcGUoIHZlcnRpY2VzLCBob2xlcyApOworCisJCS8qIFZlcnRpY2VzICovCisKKwkJdmFyIGNv
bnRvdXIgPSB2ZXJ0aWNlczsgLy8gdmVydGljZXMgaGFzIGFsbCBwb2ludHMgYnV0IGNvbnRvdXIg
aGFzIG9ubHkgcG9pbnRzIG9mIGNpcmN1bWZlcmVuY2UKKworCQlmb3IgKCBoID0gMCwgaGwgPSBo
b2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHsKKworCQkJYWhvbGUgPSBob2xlc1sgaCBdOwor
CisJCQl2ZXJ0aWNlcyA9IHZlcnRpY2VzLmNvbmNhdCggYWhvbGUgKTsKKworCQl9CisKKworCQlm
dW5jdGlvbiBzY2FsZVB0MiggcHQsIHZlYywgc2l6ZSApIHsKKworCQkJaWYgKCAhIHZlYyApIGNv
bnNvbGUuZXJyb3IoICJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdCIg
KTsKKworCQkJcmV0dXJuIHZlYy5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKCBzaXplICkuYWRkKCBw
dCApOworCisJCX0KKworCQl2YXIgYiwgYnMsIHQsIHosCisJCQl2ZXJ0LCB2bGVuID0gdmVydGlj
ZXMubGVuZ3RoLAorCQkJZmFjZSwgZmxlbiA9IGZhY2VzLmxlbmd0aDsKKworCisJCS8vIEZpbmQg
ZGlyZWN0aW9ucyBmb3IgcG9pbnQgbW92ZW1lbnQKKworCisJCWZ1bmN0aW9uIGdldEJldmVsVmVj
KCBpblB0LCBpblByZXYsIGluTmV4dCApIHsKKworCQkJLy8gY29tcHV0ZXMgZm9yIGluUHQgdGhl
IGNvcnJlc3BvbmRpbmcgcG9pbnQgaW5QdCcgb24gYSBuZXcgY29udG91cgorCQkJLy8gICBzaGlm
dGVkIGJ5IDEgdW5pdCAobGVuZ3RoIG9mIG5vcm1hbGl6ZWQgdmVjdG9yKSB0byB0aGUgbGVmdAor
CQkJLy8gaWYgd2Ugd2FsayBhbG9uZyBjb250b3VyIGNsb2Nrd2lzZSwgdGhpcyBuZXcgY29udG91
ciBpcyBvdXRzaWRlIHRoZSBvbGQgb25lCisJCQkvLworCQkJLy8gaW5QdCcgaXMgdGhlIGludGVy
c2VjdGlvbiBvZiB0aGUgdHdvIGxpbmVzIHBhcmFsbGVsIHRvIHRoZSB0d28KKwkJCS8vICBhZGph
Y2VudCBlZGdlcyBvZiBpblB0IGF0IGEgZGlzdGFuY2Ugb2YgMSB1bml0IG9uIHRoZSBsZWZ0IHNp
ZGUuCisKKwkJCXZhciB2X3RyYW5zX3gsIHZfdHJhbnNfeSwgc2hyaW5rX2J5OyAvLyByZXN1bHRp
bmcgdHJhbnNsYXRpb24gdmVjdG9yIGZvciBpblB0CisKKwkJCS8vIGdvb2QgcmVhZGluZyBmb3Ig
Z2VvbWV0cnkgYWxnb3JpdGhtcyAoaGVyZTogbGluZS1saW5lIGludGVyc2VjdGlvbikKKwkJCS8v
IGh0dHA6Ly9nZW9tYWxnb3JpdGhtcy5jb20vYTA1LV9pbnRlcnNlY3QtMS5odG1sCisKKwkJCXZh
ciB2X3ByZXZfeCA9IGluUHQueCAtIGluUHJldi54LAorCQkJCXZfcHJldl95ID0gaW5QdC55IC0g
aW5QcmV2Lnk7CisJCQl2YXIgdl9uZXh0X3ggPSBpbk5leHQueCAtIGluUHQueCwKKwkJCQl2X25l
eHRfeSA9IGluTmV4dC55IC0gaW5QdC55OworCisJCQl2YXIgdl9wcmV2X2xlbnNxID0gKCB2X3By
ZXZfeCAqIHZfcHJldl94ICsgdl9wcmV2X3kgKiB2X3ByZXZfeSApOworCisJCQkvLyBjaGVjayBm
b3IgY29sbGluZWFyIGVkZ2VzCisJCQl2YXIgY29sbGluZWFyMCA9ICggdl9wcmV2X3ggKiB2X25l
eHRfeSAtIHZfcHJldl95ICogdl9uZXh0X3ggKTsKKworCQkJaWYgKCBNYXRoLmFicyggY29sbGlu
ZWFyMCApID4gTnVtYmVyLkVQU0lMT04gKSB7CisKKwkJCQkvLyBub3QgY29sbGluZWFyCisKKwkJ
CQkvLyBsZW5ndGggb2YgdmVjdG9ycyBmb3Igbm9ybWFsaXppbmcKKworCQkJCXZhciB2X3ByZXZf
bGVuID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTsKKwkJCQl2YXIgdl9uZXh0X2xlbiA9IE1h
dGguc3FydCggdl9uZXh0X3ggKiB2X25leHRfeCArIHZfbmV4dF95ICogdl9uZXh0X3kgKTsKKwor
CQkJCS8vIHNoaWZ0IGFkamFjZW50IHBvaW50cyBieSB1bml0IHZlY3RvcnMgdG8gdGhlIGxlZnQK
KworCQkJCXZhciBwdFByZXZTaGlmdF94ID0gKCBpblByZXYueCAtIHZfcHJldl95IC8gdl9wcmV2
X2xlbiApOworCQkJCXZhciBwdFByZXZTaGlmdF95ID0gKCBpblByZXYueSArIHZfcHJldl94IC8g
dl9wcmV2X2xlbiApOworCisJCQkJdmFyIHB0TmV4dFNoaWZ0X3ggPSAoIGluTmV4dC54IC0gdl9u
ZXh0X3kgLyB2X25leHRfbGVuICk7CisJCQkJdmFyIHB0TmV4dFNoaWZ0X3kgPSAoIGluTmV4dC55
ICsgdl9uZXh0X3ggLyB2X25leHRfbGVuICk7CisKKwkJCQkvLyBzY2FsaW5nIGZhY3RvciBmb3Ig
dl9wcmV2IHRvIGludGVyc2VjdGlvbiBwb2ludAorCisJCQkJdmFyIHNmID0gKCAoIHB0TmV4dFNo
aWZ0X3ggLSBwdFByZXZTaGlmdF94ICkgKiB2X25leHRfeSAtCisJCQkJCQkoIHB0TmV4dFNoaWZ0
X3kgLSBwdFByZXZTaGlmdF95ICkgKiB2X25leHRfeCApIC8KKwkJCQkJKCB2X3ByZXZfeCAqIHZf
bmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApOworCisJCQkJLy8gdmVjdG9yIGZyb20gaW5Q
dCB0byBpbnRlcnNlY3Rpb24gcG9pbnQKKworCQkJCXZfdHJhbnNfeCA9ICggcHRQcmV2U2hpZnRf
eCArIHZfcHJldl94ICogc2YgLSBpblB0LnggKTsKKwkJCQl2X3RyYW5zX3kgPSAoIHB0UHJldlNo
aWZ0X3kgKyB2X3ByZXZfeSAqIHNmIC0gaW5QdC55ICk7CisKKwkJCQkvLyBEb24ndCBub3JtYWxp
emUhLCBvdGhlcndpc2Ugc2hhcnAgY29ybmVycyBiZWNvbWUgdWdseQorCQkJCS8vICBidXQgcHJl
dmVudCBjcmF6eSBzcGlrZXMKKwkJCQl2YXIgdl90cmFuc19sZW5zcSA9ICggdl90cmFuc194ICog
dl90cmFuc194ICsgdl90cmFuc195ICogdl90cmFuc195ICk7CisJCQkJaWYgKCB2X3RyYW5zX2xl
bnNxIDw9IDIgKSB7CisKKwkJCQkJcmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3gsIHZfdHJh
bnNfeSApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQlzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZf
dHJhbnNfbGVuc3EgLyAyICk7CisKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisKKwkJCQkvLyBoYW5k
bGUgc3BlY2lhbCBjYXNlIG9mIGNvbGxpbmVhciBlZGdlcworCisJCQkJdmFyIGRpcmVjdGlvbl9l
cSA9IGZhbHNlOyAvLyBhc3N1bWVzOiBvcHBvc2l0ZQorCQkJCWlmICggdl9wcmV2X3ggPiBOdW1i
ZXIuRVBTSUxPTiApIHsKKworCQkJCQlpZiAoIHZfbmV4dF94ID4gTnVtYmVyLkVQU0lMT04gKSB7
CisKKwkJCQkJCWRpcmVjdGlvbl9lcSA9IHRydWU7CisKKwkJCQkJfQorCisJCQkJfSBlbHNlIHsK
KworCQkJCQlpZiAoIHZfcHJldl94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHsKKworCQkJCQkJaWYg
KCB2X25leHRfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7CisKKwkJCQkJCQlkaXJlY3Rpb25fZXEg
PSB0cnVlOworCisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJaWYgKCBNYXRoLnNp
Z24oIHZfcHJldl95ICkgPT09IE1hdGguc2lnbiggdl9uZXh0X3kgKSApIHsKKworCQkJCQkJCWRp
cmVjdGlvbl9lcSA9IHRydWU7CisKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlp
ZiAoIGRpcmVjdGlvbl9lcSApIHsKKworCQkJCQkvLyBjb25zb2xlLmxvZygiV2FybmluZzogbGlu
ZXMgYXJlIGEgc3RyYWlnaHQgc2VxdWVuY2UiKTsKKwkJCQkJdl90cmFuc194ID0gLSB2X3ByZXZf
eTsKKwkJCQkJdl90cmFuc195ID0gdl9wcmV2X3g7CisJCQkJCXNocmlua19ieSA9IE1hdGguc3Fy
dCggdl9wcmV2X2xlbnNxICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCS8vIGNvbnNvbGUubG9n
KCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzcGlrZSIpOworCQkJCQl2X3RyYW5zX3gg
PSB2X3ByZXZfeDsKKwkJCQkJdl90cmFuc195ID0gdl9wcmV2X3k7CisJCQkJCXNocmlua19ieSA9
IE1hdGguc3FydCggdl9wcmV2X2xlbnNxIC8gMiApOworCisJCQkJfQorCisJCQl9CisKKwkJCXJl
dHVybiBuZXcgVmVjdG9yMiggdl90cmFuc194IC8gc2hyaW5rX2J5LCB2X3RyYW5zX3kgLyBzaHJp
bmtfYnkgKTsKKworCQl9CisKKworCQl2YXIgY29udG91ck1vdmVtZW50cyA9IFtdOworCisJCWZv
ciAoIHZhciBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAx
OyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7CisKKwkJCWlmICggaiA9PT0gaWwgKSBqID0g
MDsKKwkJCWlmICggayA9PT0gaWwgKSBrID0gMDsKKworCQkJLy8gIChqKS0tLShpKS0tLShrKQor
CQkJLy8gY29uc29sZS5sb2coJ2ksaixrJywgaSwgaiAsIGspCisKKwkJCWNvbnRvdXJNb3ZlbWVu
dHNbIGkgXSA9IGdldEJldmVsVmVjKCBjb250b3VyWyBpIF0sIGNvbnRvdXJbIGogXSwgY29udG91
clsgayBdICk7CisKKwkJfQorCisJCXZhciBob2xlc01vdmVtZW50cyA9IFtdLAorCQkJb25lSG9s
ZU1vdmVtZW50cywgdmVydGljZXNNb3ZlbWVudHMgPSBjb250b3VyTW92ZW1lbnRzLmNvbmNhdCgp
OworCisJCWZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkgewor
CisJCQlhaG9sZSA9IGhvbGVzWyBoIF07CisKKwkJCW9uZUhvbGVNb3ZlbWVudHMgPSBbXTsKKwor
CQkJZm9yICggaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7
IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHsKKworCQkJCWlmICggaiA9PT0gaWwgKSBqID0g
MDsKKwkJCQlpZiAoIGsgPT09IGlsICkgayA9IDA7CisKKwkJCQkvLyAgKGopLS0tKGkpLS0tKGsp
CisJCQkJb25lSG9sZU1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGFob2xlWyBpIF0sIGFo
b2xlWyBqIF0sIGFob2xlWyBrIF0gKTsKKworCQkJfQorCisJCQlob2xlc01vdmVtZW50cy5wdXNo
KCBvbmVIb2xlTW92ZW1lbnRzICk7CisJCQl2ZXJ0aWNlc01vdmVtZW50cyA9IHZlcnRpY2VzTW92
ZW1lbnRzLmNvbmNhdCggb25lSG9sZU1vdmVtZW50cyApOworCisJCX0KKworCisJCS8vIExvb3Ag
YmV2ZWxTZWdtZW50cywgMSBmb3IgdGhlIGZyb250LCAxIGZvciB0aGUgYmFjaworCisJCWZvciAo
IGIgPSAwOyBiIDwgYmV2ZWxTZWdtZW50czsgYiArKyApIHsKKworCQkJLy9mb3IgKCBiID0gYmV2
ZWxTZWdtZW50czsgYiA+IDA7IGIgLS0gKSB7CisKKwkJCXQgPSBiIC8gYmV2ZWxTZWdtZW50czsK
KwkJCXogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTsKKwkJ
CWJzID0gYmV2ZWxTaXplICogTWF0aC5zaW4oIHQgKiBNYXRoLlBJIC8gMiApOworCisJCQkvLyBj
b250cmFjdCBzaGFwZQorCisJCQlmb3IgKCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8
IGlsOyBpICsrICkgeworCisJCQkJdmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRv
dXJNb3ZlbWVudHNbIGkgXSwgYnMgKTsKKworCQkJCXYoIHZlcnQueCwgdmVydC55LCAtIHogKTsK
KworCQkJfQorCisJCQkvLyBleHBhbmQgaG9sZXMKKworCQkJZm9yICggaCA9IDAsIGhsID0gaG9s
ZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7CisKKwkJCQlhaG9sZSA9IGhvbGVzWyBoIF07CisJ
CQkJb25lSG9sZU1vdmVtZW50cyA9IGhvbGVzTW92ZW1lbnRzWyBoIF07CisKKwkJCQlmb3IgKCBp
ID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJCQl2ZXJ0ID0g
c2NhbGVQdDIoIGFob2xlWyBpIF0sIG9uZUhvbGVNb3ZlbWVudHNbIGkgXSwgYnMgKTsKKworCQkJ
CQl2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7CisKKwkJCQl9CisKKwkJCX0KKworCQl9CisKKwkJ
YnMgPSBiZXZlbFNpemU7CisKKwkJLy8gQmFjayBmYWNpbmcgdmVydGljZXMKKworCQlmb3IgKCBp
ID0gMDsgaSA8IHZsZW47IGkgKysgKSB7CisKKwkJCXZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2Fs
ZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRp
Y2VzWyBpIF07CisKKwkJCWlmICggISBleHRydWRlQnlQYXRoICkgeworCisJCQkJdiggdmVydC54
LCB2ZXJ0LnksIDAgKTsKKworCQkJfSBlbHNlIHsKKworCQkJCS8vIHYoIHZlcnQueCwgdmVydC55
ICsgZXh0cnVkZVB0c1sgMCBdLnksIGV4dHJ1ZGVQdHNbIDAgXS54ICk7CisKKwkJCQlub3JtYWwu
Y29weSggc3BsaW5lVHViZS5ub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7
CisJCQkJYmlub3JtYWwuY29weSggc3BsaW5lVHViZS5iaW5vcm1hbHNbIDAgXSApLm11bHRpcGx5
U2NhbGFyKCB2ZXJ0LnkgKTsKKworCQkJCXBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyAwIF0g
KS5hZGQoIG5vcm1hbCApLmFkZCggYmlub3JtYWwgKTsKKworCQkJCXYoIHBvc2l0aW9uMi54LCBw
b3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTsKKworCQkJfQorCisJCX0KKworCQkvLyBBZGQgc3Rl
cHBlZCB2ZXJ0aWNlcy4uLgorCQkvLyBJbmNsdWRpbmcgZnJvbnQgZmFjaW5nIHZlcnRpY2VzCisK
KwkJdmFyIHM7CisKKwkJZm9yICggcyA9IDE7IHMgPD0gc3RlcHM7IHMgKysgKSB7CisKKwkJCWZv
ciAoIGkgPSAwOyBpIDwgdmxlbjsgaSArKyApIHsKKworCQkJCXZlcnQgPSBiZXZlbEVuYWJsZWQg
PyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6
IHZlcnRpY2VzWyBpIF07CisKKwkJCQlpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHsKKworCQkJCQl2
KCB2ZXJ0LngsIHZlcnQueSwgYW1vdW50IC8gc3RlcHMgKiBzICk7CisKKwkJCQl9IGVsc2Ugewor
CisJCQkJCS8vIHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgcyAtIDEgXS55LCBleHRy
dWRlUHRzWyBzIC0gMSBdLnggKTsKKworCQkJCQlub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3Jt
YWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7CisJCQkJCWJpbm9ybWFsLmNvcHko
IHNwbGluZVR1YmUuYmlub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7CisK
KwkJCQkJcG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIHMgXSApLmFkZCggbm9ybWFsICkuYWRk
KCBiaW5vcm1hbCApOworCisJCQkJCXYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRp
b24yLnogKTsKKworCQkJCX0KKworCQkJfQorCisJCX0KKworCisJCS8vIEFkZCBiZXZlbCBzZWdt
ZW50cyBwbGFuZXMKKworCQkvL2ZvciAoIGIgPSAxOyBiIDw9IGJldmVsU2VnbWVudHM7IGIgKysg
KSB7CisJCWZvciAoIGIgPSBiZXZlbFNlZ21lbnRzIC0gMTsgYiA+PSAwOyBiIC0tICkgeworCisJ
CQl0ID0gYiAvIGJldmVsU2VnbWVudHM7CisJCQl6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNv
cyggdCAqIE1hdGguUEkgLyAyICk7CisJCQlicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICog
TWF0aC5QSSAvIDIgKTsKKworCQkJLy8gY29udHJhY3Qgc2hhcGUKKworCQkJZm9yICggaSA9IDAs
IGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJCXZlcnQgPSBzY2Fs
ZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7CisJCQkJdigg
dmVydC54LCB2ZXJ0LnksIGFtb3VudCArIHogKTsKKworCQkJfQorCisJCQkvLyBleHBhbmQgaG9s
ZXMKKworCQkJZm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7
CisKKwkJCQlhaG9sZSA9IGhvbGVzWyBoIF07CisJCQkJb25lSG9sZU1vdmVtZW50cyA9IGhvbGVz
TW92ZW1lbnRzWyBoIF07CisKKwkJCQlmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkg
PCBpbDsgaSArKyApIHsKKworCQkJCQl2ZXJ0ID0gc2NhbGVQdDIoIGFob2xlWyBpIF0sIG9uZUhv
bGVNb3ZlbWVudHNbIGkgXSwgYnMgKTsKKworCQkJCQlpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHsK
KworCQkJCQkJdiggdmVydC54LCB2ZXJ0LnksIGFtb3VudCArIHogKTsKKworCQkJCQl9IGVsc2Ug
eworCisJCQkJCQl2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnks
IGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnggKyB6ICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJ
CQl9CisKKwkJfQorCisJCS8qIEZhY2VzICovCisKKwkJLy8gVG9wIGFuZCBib3R0b20gZmFjZXMK
KworCQlidWlsZExpZEZhY2VzKCk7CisKKwkJLy8gU2lkZXMgZmFjZXMKKworCQlidWlsZFNpZGVG
YWNlcygpOworCisKKwkJLy8vLy8gIEludGVybmFsIGZ1bmN0aW9ucworCisJCWZ1bmN0aW9uIGJ1
aWxkTGlkRmFjZXMoKSB7CisKKwkJCXZhciBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoLzM7
CisKKwkJCWlmICggYmV2ZWxFbmFibGVkICkgeworCisJCQkJdmFyIGxheWVyID0gMDsgLy8gc3Rl
cHMgKyAxCisJCQkJdmFyIG9mZnNldCA9IHZsZW4gKiBsYXllcjsKKworCQkJCS8vIEJvdHRvbSBm
YWNlcworCisJCQkJZm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkgeworCisJCQkJCWZhY2Ug
PSBmYWNlc1sgaSBdOworCQkJCQlmMyggZmFjZVsgMiBdICsgb2Zmc2V0LCBmYWNlWyAxIF0gKyBv
ZmZzZXQsIGZhY2VbIDAgXSArIG9mZnNldCApOworCisJCQkJfQorCisJCQkJbGF5ZXIgPSBzdGVw
cyArIGJldmVsU2VnbWVudHMgKiAyOworCQkJCW9mZnNldCA9IHZsZW4gKiBsYXllcjsKKworCQkJ
CS8vIFRvcCBmYWNlcworCisJCQkJZm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkgeworCisJ
CQkJCWZhY2UgPSBmYWNlc1sgaSBdOworCQkJCQlmMyggZmFjZVsgMCBdICsgb2Zmc2V0LCBmYWNl
WyAxIF0gKyBvZmZzZXQsIGZhY2VbIDIgXSArIG9mZnNldCApOworCisJCQkJfQorCisJCQl9IGVs
c2UgeworCisJCQkJLy8gQm90dG9tIGZhY2VzCisKKwkJCQlmb3IgKCBpID0gMDsgaSA8IGZsZW47
IGkgKysgKSB7CisKKwkJCQkJZmFjZSA9IGZhY2VzWyBpIF07CisJCQkJCWYzKCBmYWNlWyAyIF0s
IGZhY2VbIDEgXSwgZmFjZVsgMCBdICk7CisKKwkJCQl9CisKKwkJCQkvLyBUb3AgZmFjZXMKKwor
CQkJCWZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHsKKworCQkJCQlmYWNlID0gZmFjZXNb
IGkgXTsKKwkJCQkJZjMoIGZhY2VbIDAgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMSBdICsgdmxl
biAqIHN0ZXBzLCBmYWNlWyAyIF0gKyB2bGVuICogc3RlcHMgKTsKKworCQkJCX0KKworCQkJfQor
CisJCQlzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoLzMgLXN0YXJ0
LCBvcHRpb25zLm1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1hdGVyaWFsIDogMCk7
CisKKwkJfQorCisJCS8vIENyZWF0ZSBmYWNlcyBmb3IgdGhlIHotc2lkZXMgb2YgdGhlIHNoYXBl
CisKKwkJZnVuY3Rpb24gYnVpbGRTaWRlRmFjZXMoKSB7CisKKwkJCXZhciBzdGFydCA9IHZlcnRp
Y2VzQXJyYXkubGVuZ3RoLzM7CisJCQl2YXIgbGF5ZXJvZmZzZXQgPSAwOworCQkJc2lkZXdhbGxz
KCBjb250b3VyLCBsYXllcm9mZnNldCApOworCQkJbGF5ZXJvZmZzZXQgKz0gY29udG91ci5sZW5n
dGg7CisKKwkJCWZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkg
eworCisJCQkJYWhvbGUgPSBob2xlc1sgaCBdOworCQkJCXNpZGV3YWxscyggYWhvbGUsIGxheWVy
b2Zmc2V0ICk7CisKKwkJCQkvLywgdHJ1ZQorCQkJCWxheWVyb2Zmc2V0ICs9IGFob2xlLmxlbmd0
aDsKKworCQkJfQorCisKKwkJCXNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5s
ZW5ndGgvMyAtc3RhcnQsIG9wdGlvbnMuZXh0cnVkZU1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBv
cHRpb25zLmV4dHJ1ZGVNYXRlcmlhbCA6IDEpOworCisKKwkJfQorCisJCWZ1bmN0aW9uIHNpZGV3
YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKSB7CisKKwkJCXZhciBqLCBrOworCQkJaSA9IGNv
bnRvdXIubGVuZ3RoOworCisJCQl3aGlsZSAoIC0tIGkgPj0gMCApIHsKKworCQkJCWogPSBpOwor
CQkJCWsgPSBpIC0gMTsKKwkJCQlpZiAoIGsgPCAwICkgayA9IGNvbnRvdXIubGVuZ3RoIC0gMTsK
KworCQkJCS8vY29uc29sZS5sb2coJ2InLCBpLGosIGktMSwgayx2ZXJ0aWNlcy5sZW5ndGgpOwor
CisJCQkJdmFyIHMgPSAwLAorCQkJCQlzbCA9IHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDI7CisK
KwkJCQlmb3IgKCBzID0gMDsgcyA8IHNsOyBzICsrICkgeworCisJCQkJCXZhciBzbGVuMSA9IHZs
ZW4gKiBzOworCQkJCQl2YXIgc2xlbjIgPSB2bGVuICogKCBzICsgMSApOworCisJCQkJCXZhciBh
ID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjEsCisJCQkJCQliID0gbGF5ZXJvZmZzZXQgKyBrICsg
c2xlbjEsCisJCQkJCQljID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjIsCisJCQkJCQlkID0gbGF5
ZXJvZmZzZXQgKyBqICsgc2xlbjI7CisKKwkJCQkJZjQoIGEsIGIsIGMsIGQsIGNvbnRvdXIsIHMs
IHNsLCBqLCBrICk7CisKKwkJCQl9CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gdiggeCwg
eSwgeiApIHsKKworCQkJcGxhY2Vob2xkZXIucHVzaCggeCApOworCQkJcGxhY2Vob2xkZXIucHVz
aCggeSApOworCQkJcGxhY2Vob2xkZXIucHVzaCggeiApOworCisJCX0KKworCisJCWZ1bmN0aW9u
IGYzKCBhLCBiLCBjICkgeworCisJCQlhZGRWZXJ0ZXgoIGEgKTsKKwkJCWFkZFZlcnRleCggYiAp
OworCQkJYWRkVmVydGV4KCBjICk7CisKKwkJCXZhciBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5
Lmxlbmd0aCAvIDM7CisJCQl2YXIgdXZzID0gdXZnZW4uZ2VuZXJhdGVUb3BVViggc2NvcGUsIHZl
cnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEg
KTsKKworCQkJYWRkVVYoIHV2c1sgMCBdICk7CisJCQlhZGRVViggdXZzWyAxIF0gKTsKKwkJCWFk
ZFVWKCB1dnNbIDIgXSApOworCisJCX0KKworCQlmdW5jdGlvbiBmNCggYSwgYiwgYywgZCwgd2Fs
bENvbnRvdXIsIHN0ZXBJbmRleCwgc3RlcHNMZW5ndGgsIGNvbnRvdXJJbmRleDEsIGNvbnRvdXJJ
bmRleDIgKSB7CisKKwkJCWFkZFZlcnRleCggYSApOworCQkJYWRkVmVydGV4KCBiICk7CisJCQlh
ZGRWZXJ0ZXgoIGQgKTsKKworCQkJYWRkVmVydGV4KCBiICk7CisJCQlhZGRWZXJ0ZXgoIGMgKTsK
KwkJCWFkZFZlcnRleCggZCApOworCisKKwkJCXZhciBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5
Lmxlbmd0aCAvIDM7CisJCQl2YXIgdXZzID0gdXZnZW4uZ2VuZXJhdGVTaWRlV2FsbFVWKCBzY29w
ZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gNiwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4
IC0gMiwgbmV4dEluZGV4IC0gMSApOworCisJCQlhZGRVViggdXZzWyAwIF0gKTsKKwkJCWFkZFVW
KCB1dnNbIDEgXSApOworCQkJYWRkVVYoIHV2c1sgMyBdICk7CisKKwkJCWFkZFVWKCB1dnNbIDEg
XSApOworCQkJYWRkVVYoIHV2c1sgMiBdICk7CisJCQlhZGRVViggdXZzWyAzIF0gKTsKKworCQl9
CisKKwkJZnVuY3Rpb24gYWRkVmVydGV4KCBpbmRleCApIHsKKworCQkJaW5kaWNlc0FycmF5LnB1
c2goIHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMyApOworCQkJdmVydGljZXNBcnJheS5wdXNoKCBw
bGFjZWhvbGRlclsgaW5kZXggKiAzICsgMCBdICk7CisJCQl2ZXJ0aWNlc0FycmF5LnB1c2goIHBs
YWNlaG9sZGVyWyBpbmRleCAqIDMgKyAxIF0gKTsKKwkJCXZlcnRpY2VzQXJyYXkucHVzaCggcGxh
Y2Vob2xkZXJbIGluZGV4ICogMyArIDIgXSApOworCisJCX0KKworCisJCWZ1bmN0aW9uIGFkZFVW
KCB2ZWN0b3IyICkgeworCisJCQl1dkFycmF5LnB1c2goIHZlY3RvcjIueCApOworCQkJdXZBcnJh
eS5wdXNoKCB2ZWN0b3IyLnkgKTsKKworCQl9CisKKwkJaWYgKCAhIG9wdGlvbnMuYXJyYXlzICkg
eworCisJCQl0aGlzLnNldEluZGV4KCBpbmRpY2VzQXJyYXkgKTsKKwkJCXRoaXMuYWRkQXR0cmli
dXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXNBcnJh
eSwgMyApICk7CisJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJB
dHRyaWJ1dGUoIG9wdGlvbnMuYXJyYXlzLnV2LCAyICkgKTsKKworCQl9CisKKwl9OworCisJRXh0
cnVkZUdlb21ldHJ5LldvcmxkVVZHZW5lcmF0b3IgPSB7CisKKwkJZ2VuZXJhdGVUb3BVVjogZnVu
Y3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMgKSB7CisK
KwkJCXZhciBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdOworCQkJdmFyIGFfeSA9IHZlcnRp
Y2VzWyBpbmRleEEgKiAzICsgMSBdOworCQkJdmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAz
IF07CisJCQl2YXIgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07CisJCQl2YXIgY194
ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTsKKwkJCXZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhD
ICogMyArIDEgXTsKKworCQkJcmV0dXJuIFsKKwkJCQluZXcgVmVjdG9yMiggYV94LCBhX3kgKSwK
KwkJCQluZXcgVmVjdG9yMiggYl94LCBiX3kgKSwKKwkJCQluZXcgVmVjdG9yMiggY194LCBjX3kg
KQorCQkJXTsKKworCQl9LAorCisJCWdlbmVyYXRlU2lkZVdhbGxVVjogZnVuY3Rpb24gKCBnZW9t
ZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMsIGluZGV4RCApIHsKKworCQkJ
dmFyIGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07CisJCQl2YXIgYV95ID0gdmVydGljZXNb
IGluZGV4QSAqIDMgKyAxIF07CisJCQl2YXIgYV96ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAy
IF07CisJCQl2YXIgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTsKKwkJCXZhciBiX3kgPSB2
ZXJ0aWNlc1sgaW5kZXhCICogMyArIDEgXTsKKwkJCXZhciBiX3ogPSB2ZXJ0aWNlc1sgaW5kZXhC
ICogMyArIDIgXTsKKwkJCXZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdOworCQkJdmFy
IGNfeSA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMSBdOworCQkJdmFyIGNfeiA9IHZlcnRpY2Vz
WyBpbmRleEMgKiAzICsgMiBdOworCQkJdmFyIGRfeCA9IHZlcnRpY2VzWyBpbmRleEQgKiAzIF07
CisJCQl2YXIgZF95ID0gdmVydGljZXNbIGluZGV4RCAqIDMgKyAxIF07CisJCQl2YXIgZF96ID0g
dmVydGljZXNbIGluZGV4RCAqIDMgKyAyIF07CisKKwkJCWlmICggTWF0aC5hYnMoIGFfeSAtIGJf
eSApIDwgMC4wMSApIHsKKworCQkJCXJldHVybiBbCisJCQkJCW5ldyBWZWN0b3IyKCBhX3gsIDEg
LSBhX3ogKSwKKwkJCQkJbmV3IFZlY3RvcjIoIGJfeCwgMSAtIGJfeiApLAorCQkJCQluZXcgVmVj
dG9yMiggY194LCAxIC0gY196ICksCisJCQkJCW5ldyBWZWN0b3IyKCBkX3gsIDEgLSBkX3ogKQor
CQkJCV07CisKKwkJCX0gZWxzZSB7CisKKwkJCQlyZXR1cm4gWworCQkJCQluZXcgVmVjdG9yMigg
YV95LCAxIC0gYV96ICksCisJCQkJCW5ldyBWZWN0b3IyKCBiX3ksIDEgLSBiX3ogKSwKKwkJCQkJ
bmV3IFZlY3RvcjIoIGNfeSwgMSAtIGNfeiApLAorCQkJCQluZXcgVmVjdG9yMiggZF95LCAxIC0g
ZF96ICkKKwkJCQldOworCisJCQl9CisKKwkJfQorCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIHp6
ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCisJICogQGF1dGhvciBhbHRl
cmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKgorCSAqIFRleHQgPSAzRCBUZXh0
CisJICoKKwkgKiBwYXJhbWV0ZXJzID0geworCSAqICBmb250OiA8VEhSRUUuRm9udD4sIC8vIGZv
bnQKKwkgKgorCSAqICBzaXplOiA8ZmxvYXQ+LCAvLyBzaXplIG9mIHRoZSB0ZXh0CisJICogIGhl
aWdodDogPGZsb2F0PiwgLy8gdGhpY2tuZXNzIHRvIGV4dHJ1ZGUgdGV4dAorCSAqICBjdXJ2ZVNl
Z21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBvbiB0aGUgY3VydmVzCisJICoKKwkg
KiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWwKKwkgKiAgYmV2ZWxUaGlj
a25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGV4dCBiZXZlbCBnb2VzCisJICogIGJl
dmVsU2l6ZTogPGZsb2F0PiAvLyBob3cgZmFyIGZyb20gdGV4dCBvdXRsaW5lIGlzIGJldmVsCisJ
ICogfQorCSAqLworCisJLy8gVGV4dEdlb21ldHJ5CisKKwlmdW5jdGlvbiBUZXh0R2VvbWV0cnko
ICB0ZXh0LCBwYXJhbWV0ZXJzICkgeworCisJCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0
aGlzLnR5cGUgPSAnVGV4dEdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQl0
ZXh0OiB0ZXh0LAorCQkJcGFyYW1ldGVyczogcGFyYW1ldGVycworCQl9OworCisJCXRoaXMuZnJv
bUJ1ZmZlckdlb21ldHJ5KCBuZXcgVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJz
ICkgKTsKKwkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CisKKwl9CisKKwlUZXh0R2VvbWV0cnkucHJv
dG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisJVGV4dEdlb21l
dHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRleHRHZW9tZXRyeTsKKworCS8vIFRleHRCdWZm
ZXJHZW9tZXRyeQorCisJZnVuY3Rpb24gVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0
ZXJzICkgeworCisJCXBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9OworCisJCXZhciBmb250
ID0gcGFyYW1ldGVycy5mb250OworCisJCWlmICggISAoIGZvbnQgJiYgZm9udC5pc0ZvbnQgKSAp
IHsKKworCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlRleHRHZW9tZXRyeTogZm9udCBwYXJhbWV0
ZXIgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkZvbnQuJyApOworCQkJcmV0dXJuIG5ldyBH
ZW9tZXRyeSgpOworCisJCX0KKworCQl2YXIgc2hhcGVzID0gZm9udC5nZW5lcmF0ZVNoYXBlcygg
dGV4dCwgcGFyYW1ldGVycy5zaXplLCBwYXJhbWV0ZXJzLmN1cnZlU2VnbWVudHMgKTsKKworCQkv
LyB0cmFuc2xhdGUgcGFyYW1ldGVycyB0byBFeHRydWRlR2VvbWV0cnkgQVBJCisKKwkJcGFyYW1l
dGVycy5hbW91bnQgPSBwYXJhbWV0ZXJzLmhlaWdodCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVy
cy5oZWlnaHQgOiA1MDsKKworCQkvLyBkZWZhdWx0cworCisJCWlmICggcGFyYW1ldGVycy5iZXZl
bFRoaWNrbmVzcyA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9IDEw
OworCQlpZiAoIHBhcmFtZXRlcnMuYmV2ZWxTaXplID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJz
LmJldmVsU2l6ZSA9IDg7CisJCWlmICggcGFyYW1ldGVycy5iZXZlbEVuYWJsZWQgPT09IHVuZGVm
aW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxFbmFibGVkID0gZmFsc2U7CisKKwkJRXh0cnVkZUJ1ZmZl
ckdlb21ldHJ5LmNhbGwoIHRoaXMsIHNoYXBlcywgcGFyYW1ldGVycyApOworCisJCXRoaXMudHlw
ZSA9ICdUZXh0QnVmZmVyR2VvbWV0cnknOworCisJfQorCisJVGV4dEJ1ZmZlckdlb21ldHJ5LnBy
b3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUg
KTsKKwlUZXh0QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEJ1ZmZl
ckdlb21ldHJ5OworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNv
bS8KKwkgKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRh
bXMKKwkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NworCSAq
LworCisJLy8gU3BoZXJlR2VvbWV0cnkKKworCWZ1bmN0aW9uIFNwaGVyZUdlb21ldHJ5KCByYWRp
dXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0
aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKKworCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisK
KwkJdGhpcy50eXBlID0gJ1NwaGVyZUdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7
CisJCQlyYWRpdXM6IHJhZGl1cywKKwkJCXdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsCisJ
CQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCisJCQlwaGlTdGFydDogcGhpU3RhcnQs
CisJCQlwaGlMZW5ndGg6IHBoaUxlbmd0aCwKKwkJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCisJ
CQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKKwkJfTsKKworCQl0aGlzLmZyb21CdWZmZXJHZW9t
ZXRyeSggbmV3IFNwaGVyZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhl
aWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0
aCApICk7CisJCXRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisJfQorCisJU3BoZXJlR2VvbWV0cnku
cHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisJU3BoZXJl
R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BoZXJlR2VvbWV0cnk7CisKKwkvLyBT
cGhlcmVCdWZmZXJHZW9tZXRyeQorCisJZnVuY3Rpb24gU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJh
ZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgs
IHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgeworCisJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRo
aXMgKTsKKworCQl0aGlzLnR5cGUgPSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknOworCisJCXRoaXMu
cGFyYW1ldGVycyA9IHsKKwkJCXJhZGl1czogcmFkaXVzLAorCQkJd2lkdGhTZWdtZW50czogd2lk
dGhTZWdtZW50cywKKwkJCWhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cywKKwkJCXBoaVN0
YXJ0OiBwaGlTdGFydCwKKwkJCXBoaUxlbmd0aDogcGhpTGVuZ3RoLAorCQkJdGhldGFTdGFydDog
dGhldGFTdGFydCwKKwkJCXRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAorCQl9OworCisJCXJhZGl1
cyA9IHJhZGl1cyB8fCA1MDsKKworCQl3aWR0aFNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIE1hdGgu
Zmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCA4ICk7CisJCWhlaWdodFNlZ21lbnRzID0gTWF0aC5t
YXgoIDIsIE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgNiApOworCisJCXBoaVN0YXJ0
ID0gcGhpU3RhcnQgIT09IHVuZGVmaW5lZCA/IHBoaVN0YXJ0IDogMDsKKwkJcGhpTGVuZ3RoID0g
cGhpTGVuZ3RoICE9PSB1bmRlZmluZWQgPyBwaGlMZW5ndGggOiBNYXRoLlBJICogMjsKKworCQl0
aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7CisJ
CXRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDog
TWF0aC5QSTsKKworCQl2YXIgdGhldGFFbmQgPSB0aGV0YVN0YXJ0ICsgdGhldGFMZW5ndGg7CisK
KwkJdmFyIGl4LCBpeTsKKworCQl2YXIgaW5kZXggPSAwOworCQl2YXIgZ3JpZCA9IFtdOworCisJ
CXZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOworCQl2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMo
KTsKKworCQkvLyBidWZmZXJzCisKKwkJdmFyIGluZGljZXMgPSBbXTsKKwkJdmFyIHZlcnRpY2Vz
ID0gW107CisJCXZhciBub3JtYWxzID0gW107CisJCXZhciB1dnMgPSBbXTsKKworCQkvLyBnZW5l
cmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzCisKKwkJZm9yICggaXkgPSAwOyBpeSA8PSBo
ZWlnaHRTZWdtZW50czsgaXkgKysgKSB7CisKKwkJCXZhciB2ZXJ0aWNlc1JvdyA9IFtdOworCisJ
CQl2YXIgdiA9IGl5IC8gaGVpZ2h0U2VnbWVudHM7CisKKwkJCWZvciAoIGl4ID0gMDsgaXggPD0g
d2lkdGhTZWdtZW50czsgaXggKysgKSB7CisKKwkJCQl2YXIgdSA9IGl4IC8gd2lkdGhTZWdtZW50
czsKKworCQkJCS8vIHZlcnRleAorCisJCQkJdmVydGV4LnggPSAtIHJhZGl1cyAqIE1hdGguY29z
KCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAq
IHRoZXRhTGVuZ3RoICk7CisJCQkJdmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLmNvcyggdGhldGFT
dGFydCArIHYgKiB0aGV0YUxlbmd0aCApOworCQkJCXZlcnRleC56ID0gcmFkaXVzICogTWF0aC5z
aW4oIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2
ICogdGhldGFMZW5ndGggKTsKKworCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgu
eSwgdmVydGV4LnogKTsKKworCQkJCS8vIG5vcm1hbAorCisJCQkJbm9ybWFsLnNldCggdmVydGV4
LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApLm5vcm1hbGl6ZSgpOworCQkJCW5vcm1hbHMucHVzaCgg
bm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApOworCisJCQkJLy8gdXYKKworCQkJCXV2cy5w
dXNoKCB1LCAxIC0gdiApOworCisJCQkJdmVydGljZXNSb3cucHVzaCggaW5kZXggKysgKTsKKwor
CQkJfQorCisJCQlncmlkLnB1c2goIHZlcnRpY2VzUm93ICk7CisKKwkJfQorCisJCS8vIGluZGlj
ZXMKKworCQlmb3IgKCBpeSA9IDA7IGl5IDwgaGVpZ2h0U2VnbWVudHM7IGl5ICsrICkgeworCisJ
CQlmb3IgKCBpeCA9IDA7IGl4IDwgd2lkdGhTZWdtZW50czsgaXggKysgKSB7CisKKwkJCQl2YXIg
YSA9IGdyaWRbIGl5IF1bIGl4ICsgMSBdOworCQkJCXZhciBiID0gZ3JpZFsgaXkgXVsgaXggXTsK
KwkJCQl2YXIgYyA9IGdyaWRbIGl5ICsgMSBdWyBpeCBdOworCQkJCXZhciBkID0gZ3JpZFsgaXkg
KyAxIF1bIGl4ICsgMSBdOworCisJCQkJaWYgKCBpeSAhPT0gMCB8fCB0aGV0YVN0YXJ0ID4gMCAp
IGluZGljZXMucHVzaCggYSwgYiwgZCApOworCQkJCWlmICggaXkgIT09IGhlaWdodFNlZ21lbnRz
IC0gMSB8fCB0aGV0YUVuZCA8IE1hdGguUEkgKSBpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTsKKwor
CQkJfQorCisJCX0KKworCQkvLyBidWlsZCBnZW9tZXRyeQorCisJCXRoaXMuc2V0SW5kZXgoIGlu
ZGljZXMgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVm
ZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9y
bWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOworCQl0aGlz
LmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiAp
ICk7CisKKwl9CisKKwlTcGhlcmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3Jl
YXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlTcGhlcmVCdWZmZXJHZW9tZXRyeS5w
cm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVCdWZmZXJHZW9tZXRyeTsKKworCS8qKgorCSAq
IEBhdXRob3IgS2FsZWIgTXVycGh5CisJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRo
dWIuY29tL011Z2VuODcKKwkgKi8KKworCS8vIFJpbmdHZW9tZXRyeQorCisJZnVuY3Rpb24gUmlu
Z0dlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNl
Z21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKKworCQlHZW9tZXRyeS5jYWxsKCB0
aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1JpbmdHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0
ZXJzID0geworCQkJaW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLAorCQkJb3V0ZXJSYWRpdXM6IG91
dGVyUmFkaXVzLAorCQkJdGhldGFTZWdtZW50czogdGhldGFTZWdtZW50cywKKwkJCXBoaVNlZ21l
bnRzOiBwaGlTZWdtZW50cywKKwkJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCisJCQl0aGV0YUxl
bmd0aDogdGhldGFMZW5ndGgKKwkJfTsKKworCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3
IFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21l
bnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApOworCQl0aGlzLm1l
cmdlVmVydGljZXMoKTsKKworCX0KKworCVJpbmdHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3Qu
Y3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlSaW5nR2VvbWV0cnkucHJvdG90eXBlLmNv
bnN0cnVjdG9yID0gUmluZ0dlb21ldHJ5OworCisJLy8gUmluZ0J1ZmZlckdlb21ldHJ5CisKKwlm
dW5jdGlvbiBSaW5nQnVmZmVyR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhl
dGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgeworCisJ
CUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnUmluZ0J1ZmZl
ckdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlpbm5lclJhZGl1czogaW5u
ZXJSYWRpdXMsCisJCQlvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsCisJCQl0aGV0YVNlZ21lbnRz
OiB0aGV0YVNlZ21lbnRzLAorCQkJcGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLAorCQkJdGhldGFT
dGFydDogdGhldGFTdGFydCwKKwkJCXRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAorCQl9OworCisJ
CWlubmVyUmFkaXVzID0gaW5uZXJSYWRpdXMgfHwgMjA7CisJCW91dGVyUmFkaXVzID0gb3V0ZXJS
YWRpdXMgfHwgNTA7CisKKwkJdGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/
IHRoZXRhU3RhcnQgOiAwOworCQl0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmlu
ZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyOworCisJCXRoZXRhU2VnbWVudHMgPSB0aGV0
YVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMywgdGhldGFTZWdtZW50cyApIDog
ODsKKwkJcGhpU2VnbWVudHMgPSBwaGlTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgo
IDEsIHBoaVNlZ21lbnRzICkgOiAxOworCisJCS8vIGJ1ZmZlcnMKKworCQl2YXIgaW5kaWNlcyA9
IFtdOworCQl2YXIgdmVydGljZXMgPSBbXTsKKwkJdmFyIG5vcm1hbHMgPSBbXTsKKwkJdmFyIHV2
cyA9IFtdOworCisJCS8vIHNvbWUgaGVscGVyIHZhcmlhYmxlcworCisJCXZhciBzZWdtZW50Owor
CQl2YXIgcmFkaXVzID0gaW5uZXJSYWRpdXM7CisJCXZhciByYWRpdXNTdGVwID0gKCAoIG91dGVy
UmFkaXVzIC0gaW5uZXJSYWRpdXMgKSAvIHBoaVNlZ21lbnRzICk7CisJCXZhciB2ZXJ0ZXggPSBu
ZXcgVmVjdG9yMygpOworCQl2YXIgdXYgPSBuZXcgVmVjdG9yMigpOworCQl2YXIgaiwgaTsKKwor
CQkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzCisKKwkJZm9yICggaiA9IDA7
IGogPD0gcGhpU2VnbWVudHM7IGogKysgKSB7CisKKwkJCWZvciAoIGkgPSAwOyBpIDw9IHRoZXRh
U2VnbWVudHM7IGkgKysgKSB7CisKKwkJCQkvLyB2YWx1ZXMgYXJlIGdlbmVyYXRlIGZyb20gdGhl
IGluc2lkZSBvZiB0aGUgcmluZyB0byB0aGUgb3V0c2lkZQorCisJCQkJc2VnbWVudCA9IHRoZXRh
U3RhcnQgKyBpIC8gdGhldGFTZWdtZW50cyAqIHRoZXRhTGVuZ3RoOworCisJCQkJLy8gdmVydGV4
CisKKwkJCQl2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7CisJCQkJdmVy
dGV4LnkgPSByYWRpdXMgKiBNYXRoLnNpbiggc2VnbWVudCApOworCisJCQkJdmVydGljZXMucHVz
aCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJCQkJLy8gbm9ybWFsCisKKwkJ
CQlub3JtYWxzLnB1c2goIDAsIDAsIDEgKTsKKworCQkJCS8vIHV2CisKKwkJCQl1di54ID0gKCB2
ZXJ0ZXgueCAvIG91dGVyUmFkaXVzICsgMSApIC8gMjsKKwkJCQl1di55ID0gKCB2ZXJ0ZXgueSAv
IG91dGVyUmFkaXVzICsgMSApIC8gMjsKKworCQkJCXV2cy5wdXNoKCB1di54LCB1di55ICk7CisK
KwkJCX0KKworCQkJLy8gaW5jcmVhc2UgdGhlIHJhZGl1cyBmb3IgbmV4dCByb3cgb2YgdmVydGlj
ZXMKKworCQkJcmFkaXVzICs9IHJhZGl1c1N0ZXA7CisKKwkJfQorCisJCS8vIGluZGljZXMKKwor
CQlmb3IgKCBqID0gMDsgaiA8IHBoaVNlZ21lbnRzOyBqICsrICkgeworCisJCQl2YXIgdGhldGFT
ZWdtZW50TGV2ZWwgPSBqICogKCB0aGV0YVNlZ21lbnRzICsgMSApOworCisJCQlmb3IgKCBpID0g
MDsgaSA8IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7CisKKwkJCQlzZWdtZW50ID0gaSArIHRoZXRh
U2VnbWVudExldmVsOworCisJCQkJdmFyIGEgPSBzZWdtZW50OworCQkJCXZhciBiID0gc2VnbWVu
dCArIHRoZXRhU2VnbWVudHMgKyAxOworCQkJCXZhciBjID0gc2VnbWVudCArIHRoZXRhU2VnbWVu
dHMgKyAyOworCQkJCXZhciBkID0gc2VnbWVudCArIDE7CisKKwkJCQkvLyBmYWNlcworCisJCQkJ
aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CisJCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CisK
KwkJCX0KKworCQl9CisKKwkJLy8gYnVpbGQgZ2VvbWV0cnkKKworCQl0aGlzLnNldEluZGV4KCBp
bmRpY2VzICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1
ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ25v
cm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKKwkJdGhp
cy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIg
KSApOworCisJfQorCisJUmluZ0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVh
dGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOworCVJpbmdCdWZmZXJHZW9tZXRyeS5wcm90
b3R5cGUuY29uc3RydWN0b3IgPSBSaW5nQnVmZmVyR2VvbWV0cnk7CisKKwkvKioKKwkgKiBAYXV0
aG9yIGFzdHJvZHVkIC8gaHR0cDovL2FzdHJvZHVkLmlzZ3JlYXQub3JnLworCSAqIEBhdXRob3Ig
eno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1CisJICogQGF1dGhvciBiaG91c3RvbiAvIGh0
dHA6Ly9jbGFyYS5pbworCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9N
dWdlbjg3CisJICovCisKKwkvLyBMYXRoZUdlb21ldHJ5CisKKwlmdW5jdGlvbiBMYXRoZUdlb21l
dHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkgeworCisJCUdlb21l
dHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnTGF0aGVHZW9tZXRyeSc7CisKKwkJ
dGhpcy5wYXJhbWV0ZXJzID0geworCQkJcG9pbnRzOiBwb2ludHMsCisJCQlzZWdtZW50czogc2Vn
bWVudHMsCisJCQlwaGlTdGFydDogcGhpU3RhcnQsCisJCQlwaGlMZW5ndGg6IHBoaUxlbmd0aAor
CQl9OworCisJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgTGF0aGVCdWZmZXJHZW9tZXRy
eSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApICk7CisJCXRoaXMubWVy
Z2VWZXJ0aWNlcygpOworCisJfQorCisJTGF0aGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3Qu
Y3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlMYXRoZUdlb21ldHJ5LnByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IExhdGhlR2VvbWV0cnk7CisKKwkvLyBMYXRoZUJ1ZmZlckdlb21ldHJ5CisK
KwlmdW5jdGlvbiBMYXRoZUJ1ZmZlckdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFy
dCwgcGhpTGVuZ3RoICkgeworCisJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0
aGlzLnR5cGUgPSAnTGF0aGVCdWZmZXJHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0g
eworCQkJcG9pbnRzOiBwb2ludHMsCisJCQlzZWdtZW50czogc2VnbWVudHMsCisJCQlwaGlTdGFy
dDogcGhpU3RhcnQsCisJCQlwaGlMZW5ndGg6IHBoaUxlbmd0aAorCQl9OworCisJCXNlZ21lbnRz
ID0gTWF0aC5mbG9vciggc2VnbWVudHMgKSB8fCAxMjsKKwkJcGhpU3RhcnQgPSBwaGlTdGFydCB8
fCAwOworCQlwaGlMZW5ndGggPSBwaGlMZW5ndGggfHwgTWF0aC5QSSAqIDI7CisKKwkJLy8gY2xh
bXAgcGhpTGVuZ3RoIHNvIGl0J3MgaW4gcmFuZ2Ugb2YgWyAwLCAyUEkgXQorCisJCXBoaUxlbmd0
aCA9IF9NYXRoLmNsYW1wKCBwaGlMZW5ndGgsIDAsIE1hdGguUEkgKiAyICk7CisKKworCQkvLyBi
dWZmZXJzCisKKwkJdmFyIGluZGljZXMgPSBbXTsKKwkJdmFyIHZlcnRpY2VzID0gW107CisJCXZh
ciB1dnMgPSBbXTsKKworCQkvLyBoZWxwZXIgdmFyaWFibGVzCisKKwkJdmFyIGJhc2U7CisJCXZh
ciBpbnZlcnNlU2VnbWVudHMgPSAxLjAgLyBzZWdtZW50czsKKwkJdmFyIHZlcnRleCA9IG5ldyBW
ZWN0b3IzKCk7CisJCXZhciB1diA9IG5ldyBWZWN0b3IyKCk7CisJCXZhciBpLCBqOworCisJCS8v
IGdlbmVyYXRlIHZlcnRpY2VzIGFuZCB1dnMKKworCQlmb3IgKCBpID0gMDsgaSA8PSBzZWdtZW50
czsgaSArKyApIHsKKworCQkJdmFyIHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50
cyAqIHBoaUxlbmd0aDsKKworCQkJdmFyIHNpbiA9IE1hdGguc2luKCBwaGkgKTsKKwkJCXZhciBj
b3MgPSBNYXRoLmNvcyggcGhpICk7CisKKwkJCWZvciAoIGogPSAwOyBqIDw9ICggcG9pbnRzLmxl
bmd0aCAtIDEgKTsgaiArKyApIHsKKworCQkJCS8vIHZlcnRleAorCisJCQkJdmVydGV4LnggPSBw
b2ludHNbIGogXS54ICogc2luOworCQkJCXZlcnRleC55ID0gcG9pbnRzWyBqIF0ueTsKKwkJCQl2
ZXJ0ZXgueiA9IHBvaW50c1sgaiBdLnggKiBjb3M7CisKKwkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0
ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CisKKwkJCQkvLyB1dgorCisJCQkJdXYueCA9IGkg
LyBzZWdtZW50czsKKwkJCQl1di55ID0gaiAvICggcG9pbnRzLmxlbmd0aCAtIDEgKTsKKworCQkJ
CXV2cy5wdXNoKCB1di54LCB1di55ICk7CisKKworCQkJfQorCisJCX0KKworCQkvLyBpbmRpY2Vz
CisKKwkJZm9yICggaSA9IDA7IGkgPCBzZWdtZW50czsgaSArKyApIHsKKworCQkJZm9yICggaiA9
IDA7IGogPCAoIHBvaW50cy5sZW5ndGggLSAxICk7IGogKysgKSB7CisKKwkJCQliYXNlID0gaiAr
IGkgKiBwb2ludHMubGVuZ3RoOworCisJCQkJdmFyIGEgPSBiYXNlOworCQkJCXZhciBiID0gYmFz
ZSArIHBvaW50cy5sZW5ndGg7CisJCQkJdmFyIGMgPSBiYXNlICsgcG9pbnRzLmxlbmd0aCArIDE7
CisJCQkJdmFyIGQgPSBiYXNlICsgMTsKKworCQkJCS8vIGZhY2VzCisKKwkJCQlpbmRpY2VzLnB1
c2goIGEsIGIsIGQgKTsKKwkJCQlpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTsKKworCQkJfQorCisJ
CX0KKworCQkvLyBidWlsZCBnZW9tZXRyeQorCisJCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsK
KwkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmli
dXRlKCB2ZXJ0aWNlcywgMyApICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxv
YXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKKworCQkvLyBnZW5lcmF0ZSBub3JtYWxz
CisKKwkJdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOworCisJCS8vIGlmIHRoZSBnZW9tZXRy
eSBpcyBjbG9zZWQsIHdlIG5lZWQgdG8gYXZlcmFnZSB0aGUgbm9ybWFscyBhbG9uZyB0aGUgc2Vh
bS4KKwkJLy8gYmVjYXVzZSB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0aWNlcyBhcmUgaWRlbnRpY2Fs
IChidXQgc3RpbGwgaGF2ZSBkaWZmZXJlbnQgVVZzKS4KKworCQlpZiAoIHBoaUxlbmd0aCA9PT0g
TWF0aC5QSSAqIDIgKSB7CisKKwkJCXZhciBub3JtYWxzID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1h
bC5hcnJheTsKKwkJCXZhciBuMSA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgbjIgPSBuZXcgVmVj
dG9yMygpOworCQkJdmFyIG4gPSBuZXcgVmVjdG9yMygpOworCisJCQkvLyB0aGlzIGlzIHRoZSBi
dWZmZXIgb2Zmc2V0IGZvciB0aGUgbGFzdCBsaW5lIG9mIHZlcnRpY2VzCisKKwkJCWJhc2UgPSBz
ZWdtZW50cyAqIHBvaW50cy5sZW5ndGggKiAzOworCisJCQlmb3IgKCBpID0gMCwgaiA9IDA7IGkg
PCBwb2ludHMubGVuZ3RoOyBpICsrLCBqICs9IDMgKSB7CisKKwkJCQkvLyBzZWxlY3QgdGhlIG5v
cm1hbCBvZiB0aGUgdmVydGV4IGluIHRoZSBmaXJzdCBsaW5lCisKKwkJCQluMS54ID0gbm9ybWFs
c1sgaiArIDAgXTsKKwkJCQluMS55ID0gbm9ybWFsc1sgaiArIDEgXTsKKwkJCQluMS56ID0gbm9y
bWFsc1sgaiArIDIgXTsKKworCQkJCS8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXgg
aW4gdGhlIGxhc3QgbGluZQorCisJCQkJbjIueCA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMCBdOwor
CQkJCW4yLnkgPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXTsKKwkJCQluMi56ID0gbm9ybWFsc1sg
YmFzZSArIGogKyAyIF07CisKKwkJCQkvLyBhdmVyYWdlIG5vcm1hbHMKKworCQkJCW4uYWRkVmVj
dG9ycyggbjEsIG4yICkubm9ybWFsaXplKCk7CisKKwkJCQkvLyBhc3NpZ24gdGhlIG5ldyB2YWx1
ZXMgdG8gYm90aCBub3JtYWxzCisKKwkJCQlub3JtYWxzWyBqICsgMCBdID0gbm9ybWFsc1sgYmFz
ZSArIGogKyAwIF0gPSBuLng7CisJCQkJbm9ybWFsc1sgaiArIDEgXSA9IG5vcm1hbHNbIGJhc2Ug
KyBqICsgMSBdID0gbi55OworCQkJCW5vcm1hbHNbIGogKyAyIF0gPSBub3JtYWxzWyBiYXNlICsg
aiArIDIgXSA9IG4uejsKKworCQkJfQorCisJCX0KKworCX0KKworCUxhdGhlQnVmZmVyR2VvbWV0
cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7
CisJTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXRoZUJ1ZmZl
ckdlb21ldHJ5OworCisJLyoqCisJICogQGF1dGhvciBqb25vYnIxIC8gaHR0cDovL2pvbm9icjEu
Y29tCisJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKwkg
Ki8KKworCS8vIFNoYXBlR2VvbWV0cnkKKworCWZ1bmN0aW9uIFNoYXBlR2VvbWV0cnkoIHNoYXBl
cywgY3VydmVTZWdtZW50cyApIHsKKworCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhp
cy50eXBlID0gJ1NoYXBlR2VvbWV0cnknOworCisJCWlmICggdHlwZW9mIGN1cnZlU2VnbWVudHMg
PT09ICdvYmplY3QnICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZUdlb21ldHJ5
OiBPcHRpb25zIHBhcmFtZXRlciBoYXMgYmVlbiByZW1vdmVkLicgKTsKKworCQkJY3VydmVTZWdt
ZW50cyA9IGN1cnZlU2VnbWVudHMuY3VydmVTZWdtZW50czsKKworCQl9CisKKwkJdGhpcy5wYXJh
bWV0ZXJzID0geworCQkJc2hhcGVzOiBzaGFwZXMsCisJCQljdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNl
Z21lbnRzCisJCX07CisKKwkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBTaGFwZUJ1ZmZl
ckdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSApOworCQl0aGlzLm1lcmdlVmVydGlj
ZXMoKTsKKworCX0KKworCVNoYXBlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSgg
R2VvbWV0cnkucHJvdG90eXBlICk7CisJU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0
b3IgPSBTaGFwZUdlb21ldHJ5OworCisJLy8gU2hhcGVCdWZmZXJHZW9tZXRyeQorCisJZnVuY3Rp
b24gU2hhcGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkgeworCisJCUJ1
ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnU2hhcGVCdWZmZXJH
ZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJc2hhcGVzOiBzaGFwZXMsCisJ
CQljdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNlZ21lbnRzCisJCX07CisKKwkJY3VydmVTZWdtZW50cyA9
IGN1cnZlU2VnbWVudHMgfHwgMTI7CisKKwkJLy8gYnVmZmVycworCisJCXZhciBpbmRpY2VzID0g
W107CisJCXZhciB2ZXJ0aWNlcyA9IFtdOworCQl2YXIgbm9ybWFscyA9IFtdOworCQl2YXIgdXZz
ID0gW107CisKKwkJLy8gaGVscGVyIHZhcmlhYmxlcworCisJCXZhciBncm91cFN0YXJ0ID0gMDsK
KwkJdmFyIGdyb3VwQ291bnQgPSAwOworCisJCS8vIGFsbG93IHNpbmdsZSBhbmQgYXJyYXkgdmFs
dWVzIGZvciAic2hhcGVzIiBwYXJhbWV0ZXIKKworCQlpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBl
cyApID09PSBmYWxzZSApIHsKKworCQkJYWRkU2hhcGUoIHNoYXBlcyApOworCisJCX0gZWxzZSB7
CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IHNoYXBlcy5sZW5ndGg7IGkgKysgKSB7CisKKwkJ
CQlhZGRTaGFwZSggc2hhcGVzWyBpIF0gKTsKKworCQkJCXRoaXMuYWRkR3JvdXAoIGdyb3VwU3Rh
cnQsIGdyb3VwQ291bnQsIGkgKTsgLy8gZW5hYmxlcyBNdWx0aU1hdGVyaWFsIHN1cHBvcnQKKwor
CQkJCWdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDsKKwkJCQlncm91cENvdW50ID0gMDsKKworCQkJ
fQorCisJCX0KKworCQkvLyBidWlsZCBnZW9tZXRyeQorCisJCXRoaXMuc2V0SW5kZXgoIGluZGlj
ZXMgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVy
QXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFs
JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOworCQl0aGlzLmFk
ZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7
CisKKworCQkvLyBoZWxwZXIgZnVuY3Rpb25zCisKKwkJZnVuY3Rpb24gYWRkU2hhcGUoIHNoYXBl
ICkgeworCisJCQl2YXIgaSwgbCwgc2hhcGVIb2xlOworCisJCQl2YXIgaW5kZXhPZmZzZXQgPSB2
ZXJ0aWNlcy5sZW5ndGggLyAzOworCQkJdmFyIHBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMo
IGN1cnZlU2VnbWVudHMgKTsKKworCQkJdmFyIHNoYXBlVmVydGljZXMgPSBwb2ludHMuc2hhcGU7
CisJCQl2YXIgc2hhcGVIb2xlcyA9IHBvaW50cy5ob2xlczsKKworCQkJLy8gY2hlY2sgZGlyZWN0
aW9uIG9mIHZlcnRpY2VzCisKKwkJCWlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVW
ZXJ0aWNlcyApID09PSBmYWxzZSApIHsKKworCQkJCXNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRp
Y2VzLnJldmVyc2UoKTsKKworCQkJCS8vIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBv
cHBvc2l0ZSBkaXJlY3Rpb24KKworCQkJCWZvciAoIGkgPSAwLCBsID0gc2hhcGVIb2xlcy5sZW5n
dGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJCXNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTsK
KworCQkJCQlpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlSG9sZSApID09PSB0cnVl
ICkgeworCisJCQkJCQlzaGFwZUhvbGVzWyBpIF0gPSBzaGFwZUhvbGUucmV2ZXJzZSgpOworCisJ
CQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQl2YXIgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFu
Z3VsYXRlU2hhcGUoIHNoYXBlVmVydGljZXMsIHNoYXBlSG9sZXMgKTsKKworCQkJLy8gam9pbiB2
ZXJ0aWNlcyBvZiBpbm5lciBhbmQgb3V0ZXIgcGF0aHMgdG8gYSBzaW5nbGUgYXJyYXkKKworCQkJ
Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJ
CQlzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07CisJCQkJc2hhcGVWZXJ0aWNlcyA9IHNoYXBl
VmVydGljZXMuY29uY2F0KCBzaGFwZUhvbGUgKTsKKworCQkJfQorCisJCQkvLyB2ZXJ0aWNlcywg
bm9ybWFscywgdXZzCisKKwkJCWZvciAoIGkgPSAwLCBsID0gc2hhcGVWZXJ0aWNlcy5sZW5ndGg7
IGkgPCBsOyBpICsrICkgeworCisJCQkJdmFyIHZlcnRleCA9IHNoYXBlVmVydGljZXNbIGkgXTsK
KworCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgMCApOworCQkJCW5vcm1h
bHMucHVzaCggMCwgMCwgMSApOworCQkJCXV2cy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnkgKTsg
Ly8gd29ybGQgdXZzCisKKwkJCX0KKworCQkJLy8gaW5jaWRlcworCisJCQlmb3IgKCBpID0gMCwg
bCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQl2YXIgZmFjZSA9IGZhY2Vz
WyBpIF07CisKKwkJCQl2YXIgYSA9IGZhY2VbIDAgXSArIGluZGV4T2Zmc2V0OworCQkJCXZhciBi
ID0gZmFjZVsgMSBdICsgaW5kZXhPZmZzZXQ7CisJCQkJdmFyIGMgPSBmYWNlWyAyIF0gKyBpbmRl
eE9mZnNldDsKKworCQkJCWluZGljZXMucHVzaCggYSwgYiwgYyApOworCQkJCWdyb3VwQ291bnQg
Kz0gMzsKKworCQkJfQorCisJCX0KKworCX0KKworCVNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90
eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisJU2hhcGVC
dWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFwZUJ1ZmZlckdlb21ldHJ5
OworCisJLyoqCisJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dl
c3RMYW5nbGV5CisJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2Vu
ODcKKwkgKi8KKworCWZ1bmN0aW9uIEVkZ2VzR2VvbWV0cnkoIGdlb21ldHJ5LCB0aHJlc2hvbGRB
bmdsZSApIHsKKworCQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBl
ID0gJ0VkZ2VzR2VvbWV0cnknOworCisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXRocmVzaG9s
ZEFuZ2xlOiB0aHJlc2hvbGRBbmdsZQorCQl9OworCisJCXRocmVzaG9sZEFuZ2xlID0gKCB0aHJl
c2hvbGRBbmdsZSAhPT0gdW5kZWZpbmVkICkgPyB0aHJlc2hvbGRBbmdsZSA6IDE7CisKKwkJLy8g
YnVmZmVyCisKKwkJdmFyIHZlcnRpY2VzID0gW107CisKKwkJLy8gaGVscGVyIHZhcmlhYmxlcwor
CisJCXZhciB0aHJlc2hvbGREb3QgPSBNYXRoLmNvcyggX01hdGguREVHMlJBRCAqIHRocmVzaG9s
ZEFuZ2xlICk7CisJCXZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGVkZ2UxLCBlZGdl
MjsKKwkJdmFyIGtleSwga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdOworCisJCS8vIHByZXBhcmUg
c291cmNlIGdlb21ldHJ5CisKKwkJdmFyIGdlb21ldHJ5MjsKKworCQlpZiAoIGdlb21ldHJ5Lmlz
QnVmZmVyR2VvbWV0cnkgKSB7CisKKwkJCWdlb21ldHJ5MiA9IG5ldyBHZW9tZXRyeSgpOworCQkJ
Z2VvbWV0cnkyLmZyb21CdWZmZXJHZW9tZXRyeSggZ2VvbWV0cnkgKTsKKworCQl9IGVsc2Ugewor
CisJCQlnZW9tZXRyeTIgPSBnZW9tZXRyeS5jbG9uZSgpOworCisJCX0KKworCQlnZW9tZXRyeTIu
bWVyZ2VWZXJ0aWNlcygpOworCQlnZW9tZXRyeTIuY29tcHV0ZUZhY2VOb3JtYWxzKCk7CisKKwkJ
dmFyIHNvdXJjZVZlcnRpY2VzID0gZ2VvbWV0cnkyLnZlcnRpY2VzOworCQl2YXIgZmFjZXMgPSBn
ZW9tZXRyeTIuZmFjZXM7CisKKwkJLy8gbm93IGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHdoZXJl
IGVhY2ggZW50cnkgcmVwcmVzZW50cyBhbiBlZGdlIHdpdGggaXRzIGFkam9pbmluZyBmYWNlcwor
CisJCWZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisK
KwkJCXZhciBmYWNlID0gZmFjZXNbIGkgXTsKKworCQkJZm9yICggdmFyIGogPSAwOyBqIDwgMzsg
aiArKyApIHsKKworCQkJCWVkZ2UxID0gZmFjZVsga2V5c1sgaiBdIF07CisJCQkJZWRnZTIgPSBm
YWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTsKKwkJCQllZGdlWyAwIF0gPSBNYXRoLm1pbigg
ZWRnZTEsIGVkZ2UyICk7CisJCQkJZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiAp
OworCisJCQkJa2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsgMSBdOworCisJCQkJaWYgKCBl
ZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQllZGdlc1sga2V5IF0gPSB7IGlu
ZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSwgZmFjZTE6IGksIGZhY2UyOiB1bmRl
ZmluZWQgfTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJZWRnZXNbIGtleSBdLmZhY2UyID0gaTsK
KworCQkJCX0KKworCQkJfQorCisJCX0KKworCQkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcworCisJCWZv
ciAoIGtleSBpbiBlZGdlcyApIHsKKworCQkJdmFyIGUgPSBlZGdlc1sga2V5IF07CisKKwkJCS8v
IGFuIGVkZ2UgaXMgb25seSByZW5kZXJlZCBpZiB0aGUgYW5nbGUgKGluIGRlZ3JlZXMpIGJldHdl
ZW4gdGhlIGZhY2Ugbm9ybWFscyBvZiB0aGUgYWRqb2luaW5nIGZhY2VzIGV4Y2VlZHMgdGhpcyB2
YWx1ZS4gZGVmYXVsdCA9IDEgZGVncmVlLgorCisJCQlpZiAoIGUuZmFjZTIgPT09IHVuZGVmaW5l
ZCB8fCBmYWNlc1sgZS5mYWNlMSBdLm5vcm1hbC5kb3QoIGZhY2VzWyBlLmZhY2UyIF0ubm9ybWFs
ICkgPD0gdGhyZXNob2xkRG90ICkgeworCisJCQkJdmFyIHZlcnRleCA9IHNvdXJjZVZlcnRpY2Vz
WyBlLmluZGV4MSBdOworCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVy
dGV4LnogKTsKKworCQkJCXZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MiBdOworCQkJ
CXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworCQkJfQor
CisJCX0KKworCQkvLyBidWlsZCBnZW9tZXRyeQorCisJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9z
aXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworCisJ
fQorCisJRWRnZXNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9t
ZXRyeS5wcm90b3R5cGUgKTsKKwlFZGdlc0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9
IEVkZ2VzR2VvbWV0cnk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRv
b2IuY29tLworCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3
CisJICovCisKKwkvLyBDeWxpbmRlckdlb21ldHJ5CisKKwlmdW5jdGlvbiBDeWxpbmRlckdlb21l
dHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVp
Z2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CisKKwkJ
R2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdDeWxpbmRlckdlb21ldHJ5
JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXNUb3A6IHJhZGl1c1RvcCwKKwkJ
CXJhZGl1c0JvdHRvbTogcmFkaXVzQm90dG9tLAorCQkJaGVpZ2h0OiBoZWlnaHQsCisJCQlyYWRp
YWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsCisJCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2Vn
bWVudHMsCisJCQlvcGVuRW5kZWQ6IG9wZW5FbmRlZCwKKwkJCXRoZXRhU3RhcnQ6IHRoZXRhU3Rh
cnQsCisJCQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKKwkJfTsKKworCQl0aGlzLmZyb21CdWZm
ZXJHZW9tZXRyeSggbmV3IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIHJhZGl1c1RvcCwgcmFkaXVz
Qm90dG9tLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVk
LCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7CisJCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwor
CisJfQorCisJQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9t
ZXRyeS5wcm90b3R5cGUgKTsKKwlDeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3Rv
ciA9IEN5bGluZGVyR2VvbWV0cnk7CisKKwkvLyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5CisKKwlm
dW5jdGlvbiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwg
aGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFT
dGFydCwgdGhldGFMZW5ndGggKSB7CisKKwkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwor
CisJCXRoaXMudHlwZSA9ICdDeWxpbmRlckJ1ZmZlckdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFt
ZXRlcnMgPSB7CisJCQlyYWRpdXNUb3A6IHJhZGl1c1RvcCwKKwkJCXJhZGl1c0JvdHRvbTogcmFk
aXVzQm90dG9tLAorCQkJaGVpZ2h0OiBoZWlnaHQsCisJCQlyYWRpYWxTZWdtZW50czogcmFkaWFs
U2VnbWVudHMsCisJCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCisJCQlvcGVuRW5k
ZWQ6IG9wZW5FbmRlZCwKKwkJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCisJCQl0aGV0YUxlbmd0
aDogdGhldGFMZW5ndGgKKwkJfTsKKworCQl2YXIgc2NvcGUgPSB0aGlzOworCisJCXJhZGl1c1Rv
cCA9IHJhZGl1c1RvcCAhPT0gdW5kZWZpbmVkID8gcmFkaXVzVG9wIDogMjA7CisJCXJhZGl1c0Jv
dHRvbSA9IHJhZGl1c0JvdHRvbSAhPT0gdW5kZWZpbmVkID8gcmFkaXVzQm90dG9tIDogMjA7CisJ
CWhlaWdodCA9IGhlaWdodCAhPT0gdW5kZWZpbmVkID8gaGVpZ2h0IDogMTAwOworCisJCXJhZGlh
bFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4OworCQloZWlnaHRT
ZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgMTsKKworCQlvcGVuRW5k
ZWQgPSBvcGVuRW5kZWQgIT09IHVuZGVmaW5lZCA/IG9wZW5FbmRlZCA6IGZhbHNlOworCQl0aGV0
YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDAuMDsKKwkJ
dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiAy
LjAgKiBNYXRoLlBJOworCisJCS8vIGJ1ZmZlcnMKKworCQl2YXIgaW5kaWNlcyA9IFtdOworCQl2
YXIgdmVydGljZXMgPSBbXTsKKwkJdmFyIG5vcm1hbHMgPSBbXTsKKwkJdmFyIHV2cyA9IFtdOwor
CisJCS8vIGhlbHBlciB2YXJpYWJsZXMKKworCQl2YXIgaW5kZXggPSAwOworCQl2YXIgaW5kZXhB
cnJheSA9IFtdOworCQl2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7CisJCXZhciBncm91cFN0
YXJ0ID0gMDsKKworCQkvLyBnZW5lcmF0ZSBnZW9tZXRyeQorCisJCWdlbmVyYXRlVG9yc28oKTsK
KworCQlpZiAoIG9wZW5FbmRlZCA9PT0gZmFsc2UgKSB7CisKKwkJCWlmICggcmFkaXVzVG9wID4g
MCApIGdlbmVyYXRlQ2FwKCB0cnVlICk7CisJCQlpZiAoIHJhZGl1c0JvdHRvbSA+IDAgKSBnZW5l
cmF0ZUNhcCggZmFsc2UgKTsKKworCQl9CisKKwkJLy8gYnVpbGQgZ2VvbWV0cnkKKworCQl0aGlz
LnNldEluZGV4KCBpbmRpY2VzICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBu
ZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworCQl0aGlzLmFkZEF0
dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAz
ICkgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmli
dXRlKCB1dnMsIDIgKSApOworCisJCWZ1bmN0aW9uIGdlbmVyYXRlVG9yc28oKSB7CisKKwkJCXZh
ciB4LCB5OworCQkJdmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgdmVydGV4ID0g
bmV3IFZlY3RvcjMoKTsKKworCQkJdmFyIGdyb3VwQ291bnQgPSAwOworCisJCQkvLyB0aGlzIHdp
bGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbAorCQkJdmFyIHNsb3BlID0gKCByYWRp
dXNCb3R0b20gLSByYWRpdXNUb3AgKSAvIGhlaWdodDsKKworCQkJLy8gZ2VuZXJhdGUgdmVydGlj
ZXMsIG5vcm1hbHMgYW5kIHV2cworCisJCQlmb3IgKCB5ID0gMDsgeSA8PSBoZWlnaHRTZWdtZW50
czsgeSArKyApIHsKKworCQkJCXZhciBpbmRleFJvdyA9IFtdOworCisJCQkJdmFyIHYgPSB5IC8g
aGVpZ2h0U2VnbWVudHM7CisKKwkJCQkvLyBjYWxjdWxhdGUgdGhlIHJhZGl1cyBvZiB0aGUgY3Vy
cmVudCByb3cKKworCQkJCXZhciByYWRpdXMgPSB2ICogKCByYWRpdXNCb3R0b20gLSByYWRpdXNU
b3AgKSArIHJhZGl1c1RvcDsKKworCQkJCWZvciAoIHggPSAwOyB4IDw9IHJhZGlhbFNlZ21lbnRz
OyB4ICsrICkgeworCisJCQkJCXZhciB1ID0geCAvIHJhZGlhbFNlZ21lbnRzOworCisJCQkJCXZh
ciB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7CisKKwkJCQkJdmFyIHNpblRo
ZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7CisJCQkJCXZhciBjb3NUaGV0YSA9IE1hdGguY29zKCB0
aGV0YSApOworCisJCQkJCS8vIHZlcnRleAorCisJCQkJCXZlcnRleC54ID0gcmFkaXVzICogc2lu
VGhldGE7CisJCQkJCXZlcnRleC55ID0gLSB2ICogaGVpZ2h0ICsgaGFsZkhlaWdodDsKKwkJCQkJ
dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTsKKwkJCQkJdmVydGljZXMucHVzaCggdmVydGV4
LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJCQkJCS8vIG5vcm1hbAorCisJCQkJCW5vcm1h
bC5zZXQoIHNpblRoZXRhLCBzbG9wZSwgY29zVGhldGEgKS5ub3JtYWxpemUoKTsKKwkJCQkJbm9y
bWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7CisKKwkJCQkJLy8gdXYK
KworCQkJCQl1dnMucHVzaCggdSwgMSAtIHYgKTsKKworCQkJCQkvLyBzYXZlIGluZGV4IG9mIHZl
cnRleCBpbiByZXNwZWN0aXZlIHJvdworCisJCQkJCWluZGV4Um93LnB1c2goIGluZGV4ICsrICk7
CisKKwkJCQl9CisKKwkJCQkvLyBub3cgc2F2ZSB2ZXJ0aWNlcyBvZiB0aGUgcm93IGluIG91ciBp
bmRleCBhcnJheQorCisJCQkJaW5kZXhBcnJheS5wdXNoKCBpbmRleFJvdyApOworCisJCQl9CisK
KwkJCS8vIGdlbmVyYXRlIGluZGljZXMKKworCQkJZm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdt
ZW50czsgeCArKyApIHsKKworCQkJCWZvciAoIHkgPSAwOyB5IDwgaGVpZ2h0U2VnbWVudHM7IHkg
KysgKSB7CisKKwkJCQkJLy8gd2UgdXNlIHRoZSBpbmRleCBhcnJheSB0byBhY2Nlc3MgdGhlIGNv
cnJlY3QgaW5kaWNlcworCisJCQkJCXZhciBhID0gaW5kZXhBcnJheVsgeSBdWyB4IF07CisJCQkJ
CXZhciBiID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCBdOworCQkJCQl2YXIgYyA9IGluZGV4QXJy
YXlbIHkgKyAxIF1bIHggKyAxIF07CisJCQkJCXZhciBkID0gaW5kZXhBcnJheVsgeSBdWyB4ICsg
MSBdOworCisJCQkJCS8vIGZhY2VzCisKKwkJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CisJ
CQkJCWluZGljZXMucHVzaCggYiwgYywgZCApOworCisJCQkJCS8vIHVwZGF0ZSBncm91cCBjb3Vu
dGVyCisKKwkJCQkJZ3JvdXBDb3VudCArPSA2OworCisJCQkJfQorCisJCQl9CisKKwkJCS8vIGFk
ZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlh
bCBzdXBwb3J0CisKKwkJCXNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCAw
ICk7CisKKwkJCS8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3VwcworCisJCQln
cm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7CisKKwkJfQorCisJCWZ1bmN0aW9uIGdlbmVyYXRlQ2Fw
KCB0b3AgKSB7CisKKwkJCXZhciB4LCBjZW50ZXJJbmRleFN0YXJ0LCBjZW50ZXJJbmRleEVuZDsK
KworCQkJdmFyIHV2ID0gbmV3IFZlY3RvcjIoKTsKKwkJCXZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9y
MygpOworCisJCQl2YXIgZ3JvdXBDb3VudCA9IDA7CisKKwkJCXZhciByYWRpdXMgPSAoIHRvcCA9
PT0gdHJ1ZSApID8gcmFkaXVzVG9wIDogcmFkaXVzQm90dG9tOworCQkJdmFyIHNpZ24gPSAoIHRv
cCA9PT0gdHJ1ZSApID8gMSA6IC0gMTsKKworCQkJLy8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGZp
cnN0IGNlbnRlciB2ZXJ0ZXgKKwkJCWNlbnRlckluZGV4U3RhcnQgPSBpbmRleDsKKworCQkJLy8g
Zmlyc3Qgd2UgZ2VuZXJhdGUgdGhlIGNlbnRlciB2ZXJ0ZXggZGF0YSBvZiB0aGUgY2FwLgorCQkJ
Ly8gYmVjYXVzZSB0aGUgZ2VvbWV0cnkgbmVlZHMgb25lIHNldCBvZiB1dnMgcGVyIGZhY2UsCisJ
CQkvLyB3ZSBtdXN0IGdlbmVyYXRlIGEgY2VudGVyIHZlcnRleCBwZXIgZmFjZS9zZWdtZW50CisK
KwkJCWZvciAoIHggPSAxOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkgeworCisJCQkJLy8g
dmVydGV4CisKKwkJCQl2ZXJ0aWNlcy5wdXNoKCAwLCBoYWxmSGVpZ2h0ICogc2lnbiwgMCApOwor
CisJCQkJLy8gbm9ybWFsCisKKwkJCQlub3JtYWxzLnB1c2goIDAsIHNpZ24sIDAgKTsKKworCQkJ
CS8vIHV2CisKKwkJCQl1dnMucHVzaCggMC41LCAwLjUgKTsKKworCQkJCS8vIGluY3JlYXNlIGlu
ZGV4CisKKwkJCQlpbmRleCArKzsKKworCQkJfQorCisJCQkvLyBzYXZlIHRoZSBpbmRleCBvZiB0
aGUgbGFzdCBjZW50ZXIgdmVydGV4CisKKwkJCWNlbnRlckluZGV4RW5kID0gaW5kZXg7CisKKwkJ
CS8vIG5vdyB3ZSBnZW5lcmF0ZSB0aGUgc3Vycm91bmRpbmcgdmVydGljZXMsIG5vcm1hbHMgYW5k
IHV2cworCisJCQlmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHsKKwor
CQkJCXZhciB1ID0geCAvIHJhZGlhbFNlZ21lbnRzOworCQkJCXZhciB0aGV0YSA9IHUgKiB0aGV0
YUxlbmd0aCArIHRoZXRhU3RhcnQ7CisKKwkJCQl2YXIgY29zVGhldGEgPSBNYXRoLmNvcyggdGhl
dGEgKTsKKwkJCQl2YXIgc2luVGhldGEgPSBNYXRoLnNpbiggdGhldGEgKTsKKworCQkJCS8vIHZl
cnRleAorCisJCQkJdmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTsKKwkJCQl2ZXJ0ZXgueSA9
IGhhbGZIZWlnaHQgKiBzaWduOworCQkJCXZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7CisJ
CQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJCQkJ
Ly8gbm9ybWFsCisKKwkJCQlub3JtYWxzLnB1c2goIDAsIHNpZ24sIDAgKTsKKworCQkJCS8vIHV2
CisKKwkJCQl1di54ID0gKCBjb3NUaGV0YSAqIDAuNSApICsgMC41OworCQkJCXV2LnkgPSAoIHNp
blRoZXRhICogMC41ICogc2lnbiApICsgMC41OworCQkJCXV2cy5wdXNoKCB1di54LCB1di55ICk7
CisKKwkJCQkvLyBpbmNyZWFzZSBpbmRleAorCisJCQkJaW5kZXggKys7CisKKwkJCX0KKworCQkJ
Ly8gZ2VuZXJhdGUgaW5kaWNlcworCisJCQlmb3IgKCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRz
OyB4ICsrICkgeworCisJCQkJdmFyIGMgPSBjZW50ZXJJbmRleFN0YXJ0ICsgeDsKKwkJCQl2YXIg
aSA9IGNlbnRlckluZGV4RW5kICsgeDsKKworCQkJCWlmICggdG9wID09PSB0cnVlICkgeworCisJ
CQkJCS8vIGZhY2UgdG9wCisKKwkJCQkJaW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgYyApOworCisJ
CQkJfSBlbHNlIHsKKworCQkJCQkvLyBmYWNlIGJvdHRvbQorCisJCQkJCWluZGljZXMucHVzaCgg
aSArIDEsIGksIGMgKTsKKworCQkJCX0KKworCQkJCWdyb3VwQ291bnQgKz0gMzsKKworCQkJfQor
CisJCQkvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVs
dGkgbWF0ZXJpYWwgc3VwcG9ydAorCisJCQlzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3Jv
dXBDb3VudCwgdG9wID09PSB0cnVlID8gMSA6IDIgKTsKKworCQkJLy8gY2FsY3VsYXRlIG5ldyBz
dGFydCB2YWx1ZSBmb3IgZ3JvdXBzCisKKwkJCWdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDsKKwor
CQl9CisKKwl9CisKKwlDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5j
cmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOworCUN5bGluZGVyQnVmZmVyR2VvbWV0
cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTsKKworCS8q
KgorCSAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb24K
KwkgKi8KKworCS8vIENvbmVHZW9tZXRyeQorCisJZnVuY3Rpb24gQ29uZUdlb21ldHJ5KCByYWRp
dXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRo
ZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgeworCisJCUN5bGluZGVyR2VvbWV0cnkuY2FsbCggdGhp
cywgMCwgcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3Bl
bkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApOworCisJCXRoaXMudHlwZSA9ICdDb25l
R2VvbWV0cnknOworCisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXJhZGl1czogcmFkaXVzLAor
CQkJaGVpZ2h0OiBoZWlnaHQsCisJCQlyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsCisJ
CQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCisJCQlvcGVuRW5kZWQ6IG9wZW5FbmRl
ZCwKKwkJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCisJCQl0aGV0YUxlbmd0aDogdGhldGFMZW5n
dGgKKwkJfTsKKworCX0KKworCUNvbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRl
KCBDeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZSApOworCUNvbmVHZW9tZXRyeS5wcm90b3R5cGUu
Y29uc3RydWN0b3IgPSBDb25lR2VvbWV0cnk7CisKKwkvLyBDb25lQnVmZmVyR2VvbWV0cnkKKwor
CWZ1bmN0aW9uIENvbmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21l
bnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCAp
IHsKKworCQlDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVp
Z2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFy
dCwgdGhldGFMZW5ndGggKTsKKworCQl0aGlzLnR5cGUgPSAnQ29uZUJ1ZmZlckdlb21ldHJ5JzsK
KworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXM6IHJhZGl1cywKKwkJCWhlaWdodDog
aGVpZ2h0LAorCQkJcmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLAorCQkJaGVpZ2h0U2Vn
bWVudHM6IGhlaWdodFNlZ21lbnRzLAorCQkJb3BlbkVuZGVkOiBvcGVuRW5kZWQsCisJCQl0aGV0
YVN0YXJ0OiB0aGV0YVN0YXJ0LAorCQkJdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoCisJCX07CisK
Kwl9CisKKwlDb25lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3ls
aW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlDb25lQnVmZmVyR2VvbWV0cnkucHJv
dG90eXBlLmNvbnN0cnVjdG9yID0gQ29uZUJ1ZmZlckdlb21ldHJ5OworCisJLyoqCisJICogQGF1
dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zCisJICogQGF1
dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKwkgKiBAYXV0aG9yIGh1
Z2hlcworCSAqLworCisJLy8gQ2lyY2xlR2VvbWV0cnkKKworCWZ1bmN0aW9uIENpcmNsZUdlb21l
dHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKKworCQlH
ZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ0NpcmNsZUdlb21ldHJ5JzsK
KworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXM6IHJhZGl1cywKKwkJCXNlZ21lbnRz
OiBzZWdtZW50cywKKwkJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCisJCQl0aGV0YUxlbmd0aDog
dGhldGFMZW5ndGgKKwkJfTsKKworCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IENpcmNs
ZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0
aCApICk7CisJCXRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisJfQorCisJQ2lyY2xlR2VvbWV0cnku
cHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisJQ2lyY2xl
R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2lyY2xlR2VvbWV0cnk7CisKKwkvLyBD
aXJjbGVCdWZmZXJHZW9tZXRyeQorCisJZnVuY3Rpb24gQ2lyY2xlQnVmZmVyR2VvbWV0cnkoIHJh
ZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgeworCisJCUJ1ZmZlckdl
b21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnQ2lyY2xlQnVmZmVyR2VvbWV0
cnknOworCisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXJhZGl1czogcmFkaXVzLAorCQkJc2Vn
bWVudHM6IHNlZ21lbnRzLAorCQkJdGhldGFTdGFydDogdGhldGFTdGFydCwKKwkJCXRoZXRhTGVu
Z3RoOiB0aGV0YUxlbmd0aAorCQl9OworCisJCXJhZGl1cyA9IHJhZGl1cyB8fCA1MDsKKwkJc2Vn
bWVudHMgPSBzZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDMsIHNlZ21lbnRzICkg
OiA4OworCisJCXRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0
YXJ0IDogMDsKKwkJdGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhl
dGFMZW5ndGggOiBNYXRoLlBJICogMjsKKworCQkvLyBidWZmZXJzCisKKwkJdmFyIGluZGljZXMg
PSBbXTsKKwkJdmFyIHZlcnRpY2VzID0gW107CisJCXZhciBub3JtYWxzID0gW107CisJCXZhciB1
dnMgPSBbXTsKKworCQkvLyBoZWxwZXIgdmFyaWFibGVzCisKKwkJdmFyIGksIHM7CisJCXZhciB2
ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOworCQl2YXIgdXYgPSBuZXcgVmVjdG9yMigpOworCisJCS8v
IGNlbnRlciBwb2ludAorCisJCXZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKKwkJbm9ybWFscy5w
dXNoKCAwLCAwLCAxICk7CisJCXV2cy5wdXNoKCAwLjUsIDAuNSApOworCisJCWZvciAoIHMgPSAw
LCBpID0gMzsgcyA8PSBzZWdtZW50czsgcyArKywgaSArPSAzICkgeworCisJCQl2YXIgc2VnbWVu
dCA9IHRoZXRhU3RhcnQgKyBzIC8gc2VnbWVudHMgKiB0aGV0YUxlbmd0aDsKKworCQkJLy8gdmVy
dGV4CisKKwkJCXZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTsKKwkJCXZl
cnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTsKKworCQkJdmVydGljZXMucHVz
aCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJCQkvLyBub3JtYWwKKworCQkJ
bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7CisKKwkJCS8vIHV2cworCisJCQl1di54ID0gKCB2ZXJ0
aWNlc1sgaSBdIC8gcmFkaXVzICsgMSApIC8gMjsKKwkJCXV2LnkgPSAoIHZlcnRpY2VzWyBpICsg
MSBdIC8gcmFkaXVzICsgMSApIC8gMjsKKworCQkJdXZzLnB1c2goIHV2LngsIHV2LnkgKTsKKwor
CQl9CisKKwkJLy8gaW5kaWNlcworCisJCWZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsr
ICkgeworCisJCQlpbmRpY2VzLnB1c2goIGksIGkgKyAxLCAwICk7CisKKwkJfQorCisJCS8vIGJ1
aWxkIGdlb21ldHJ5CisKKwkJdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOworCQl0aGlzLmFkZEF0
dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2Vz
LCAzICkgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZl
ckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBu
ZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKKworCX0KKworCUNpcmNsZUJ1
ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnBy
b3RvdHlwZSApOworCUNpcmNsZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9
IENpcmNsZUJ1ZmZlckdlb21ldHJ5OworCisKKworCXZhciBHZW9tZXRyaWVzID0gT2JqZWN0LmZy
ZWV6ZSh7CisJCVdpcmVmcmFtZUdlb21ldHJ5OiBXaXJlZnJhbWVHZW9tZXRyeSwKKwkJUGFyYW1l
dHJpY0dlb21ldHJ5OiBQYXJhbWV0cmljR2VvbWV0cnksCisJCVBhcmFtZXRyaWNCdWZmZXJHZW9t
ZXRyeTogUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LAorCQlUZXRyYWhlZHJvbkdlb21ldHJ5OiBU
ZXRyYWhlZHJvbkdlb21ldHJ5LAorCQlUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBUZXRyYWhl
ZHJvbkJ1ZmZlckdlb21ldHJ5LAorCQlPY3RhaGVkcm9uR2VvbWV0cnk6IE9jdGFoZWRyb25HZW9t
ZXRyeSwKKwkJT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0
cnksCisJCUljb3NhaGVkcm9uR2VvbWV0cnk6IEljb3NhaGVkcm9uR2VvbWV0cnksCisJCUljb3Nh
aGVkcm9uQnVmZmVyR2VvbWV0cnk6IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnksCisJCURvZGVj
YWhlZHJvbkdlb21ldHJ5OiBEb2RlY2FoZWRyb25HZW9tZXRyeSwKKwkJRG9kZWNhaGVkcm9uQnVm
ZmVyR2VvbWV0cnk6IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LAorCQlQb2x5aGVkcm9uR2Vv
bWV0cnk6IFBvbHloZWRyb25HZW9tZXRyeSwKKwkJUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBQ
b2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksCisJCVR1YmVHZW9tZXRyeTogVHViZUdlb21ldHJ5LAor
CQlUdWJlQnVmZmVyR2VvbWV0cnk6IFR1YmVCdWZmZXJHZW9tZXRyeSwKKwkJVG9ydXNLbm90R2Vv
bWV0cnk6IFRvcnVzS25vdEdlb21ldHJ5LAorCQlUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTogVG9y
dXNLbm90QnVmZmVyR2VvbWV0cnksCisJCVRvcnVzR2VvbWV0cnk6IFRvcnVzR2VvbWV0cnksCisJ
CVRvcnVzQnVmZmVyR2VvbWV0cnk6IFRvcnVzQnVmZmVyR2VvbWV0cnksCisJCVRleHRHZW9tZXRy
eTogVGV4dEdlb21ldHJ5LAorCQlUZXh0QnVmZmVyR2VvbWV0cnk6IFRleHRCdWZmZXJHZW9tZXRy
eSwKKwkJU3BoZXJlR2VvbWV0cnk6IFNwaGVyZUdlb21ldHJ5LAorCQlTcGhlcmVCdWZmZXJHZW9t
ZXRyeTogU3BoZXJlQnVmZmVyR2VvbWV0cnksCisJCVJpbmdHZW9tZXRyeTogUmluZ0dlb21ldHJ5
LAorCQlSaW5nQnVmZmVyR2VvbWV0cnk6IFJpbmdCdWZmZXJHZW9tZXRyeSwKKwkJUGxhbmVHZW9t
ZXRyeTogUGxhbmVHZW9tZXRyeSwKKwkJUGxhbmVCdWZmZXJHZW9tZXRyeTogUGxhbmVCdWZmZXJH
ZW9tZXRyeSwKKwkJTGF0aGVHZW9tZXRyeTogTGF0aGVHZW9tZXRyeSwKKwkJTGF0aGVCdWZmZXJH
ZW9tZXRyeTogTGF0aGVCdWZmZXJHZW9tZXRyeSwKKwkJU2hhcGVHZW9tZXRyeTogU2hhcGVHZW9t
ZXRyeSwKKwkJU2hhcGVCdWZmZXJHZW9tZXRyeTogU2hhcGVCdWZmZXJHZW9tZXRyeSwKKwkJRXh0
cnVkZUdlb21ldHJ5OiBFeHRydWRlR2VvbWV0cnksCisJCUV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTog
RXh0cnVkZUJ1ZmZlckdlb21ldHJ5LAorCQlFZGdlc0dlb21ldHJ5OiBFZGdlc0dlb21ldHJ5LAor
CQlDb25lR2VvbWV0cnk6IENvbmVHZW9tZXRyeSwKKwkJQ29uZUJ1ZmZlckdlb21ldHJ5OiBDb25l
QnVmZmVyR2VvbWV0cnksCisJCUN5bGluZGVyR2VvbWV0cnk6IEN5bGluZGVyR2VvbWV0cnksCisJ
CUN5bGluZGVyQnVmZmVyR2VvbWV0cnk6IEN5bGluZGVyQnVmZmVyR2VvbWV0cnksCisJCUNpcmNs
ZUdlb21ldHJ5OiBDaXJjbGVHZW9tZXRyeSwKKwkJQ2lyY2xlQnVmZmVyR2VvbWV0cnk6IENpcmNs
ZUJ1ZmZlckdlb21ldHJ5LAorCQlCb3hHZW9tZXRyeTogQm94R2VvbWV0cnksCisJCUJveEJ1ZmZl
ckdlb21ldHJ5OiBCb3hCdWZmZXJHZW9tZXRyeQorCX0pOworCisJLyoqCisJICogQGF1dGhvciBt
cmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKgorCSAqIHBhcmFtZXRlcnMgPSB7CisJICog
IG9wYWNpdHk6IDxmbG9hdD4KKwkgKiB9CisJICovCisKKwlmdW5jdGlvbiBTaGFkb3dNYXRlcmlh
bCggcGFyYW1ldGVycyApIHsKKworCQlTaGFkZXJNYXRlcmlhbC5jYWxsKCB0aGlzLCB7CisJCQl1
bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggWworCQkJCVVuaWZvcm1zTGliLmxpZ2h0cywK
KwkJCQl7CisJCQkJCW9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9CisJCQkJfQorCQkJXSApLAorCQkJ
dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVua1sgJ3NoYWRvd192ZXJ0JyBdLAorCQkJZnJhZ21lbnRT
aGFkZXI6IFNoYWRlckNodW5rWyAnc2hhZG93X2ZyYWcnIF0KKwkJfSApOworCisJCXRoaXMubGln
aHRzID0gdHJ1ZTsKKwkJdGhpcy50cmFuc3BhcmVudCA9IHRydWU7CisKKwkJT2JqZWN0LmRlZmlu
ZVByb3BlcnRpZXMoIHRoaXMsIHsKKwkJCW9wYWNpdHk6IHsKKwkJCQllbnVtZXJhYmxlOiB0cnVl
LAorCQkJCWdldDogZnVuY3Rpb24gKCkgeworCQkJCQlyZXR1cm4gdGhpcy51bmlmb3Jtcy5vcGFj
aXR5LnZhbHVlOworCQkJCX0sCisJCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCQkJCQl0
aGlzLnVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSB2YWx1ZTsKKwkJCQl9CisJCQl9CisJCX0gKTsK
KworCQl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOworCisJfQorCisJU2hhZG93TWF0ZXJp
YWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlICk7
CisJU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhZG93TWF0ZXJpYWw7
CisKKwlTaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuaXNTaGFkb3dNYXRlcmlhbCA9IHRydWU7CisK
KwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJ
ZnVuY3Rpb24gUmF3U2hhZGVyTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CisKKwkJU2hhZGVyTWF0
ZXJpYWwuY2FsbCggdGhpcywgcGFyYW1ldGVycyApOworCisJCXRoaXMudHlwZSA9ICdSYXdTaGFk
ZXJNYXRlcmlhbCc7CisKKwl9CisKKwlSYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmpl
Y3QuY3JlYXRlKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgKTsKKwlSYXdTaGFkZXJNYXRlcmlh
bC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSYXdTaGFkZXJNYXRlcmlhbDsKKworCVJhd1NoYWRl
ck1hdGVyaWFsLnByb3RvdHlwZS5pc1Jhd1NoYWRlck1hdGVyaWFsID0gdHJ1ZTsKKworCS8qKgor
CSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQor
CSAqCisJICogcGFyYW1ldGVycyA9IHsKKwkgKiAgY29sb3I6IDxoZXg+LAorCSAqICByb3VnaG5l
c3M6IDxmbG9hdD4sCisJICogIG1ldGFsbmVzczogPGZsb2F0PiwKKwkgKiAgb3BhY2l0eTogPGZs
b2F0PiwKKwkgKgorCSAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICoK
KwkgKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICogIGxpZ2h0
TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CisJICoKKwkgKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJl
KCA8SW1hZ2U+ICksCisJICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CisJICoKKwkgKiAgZW1p
c3NpdmU6IDxoZXg+LAorCSAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PgorCSAqICBlbWlz
c2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKgorCSAqICBidW1wTWFw
OiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqICBidW1wU2NhbGU6IDxmbG9hdD4s
CisJICoKKwkgKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAq
ICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LAorCSAqCisJICogIGRpc3BsYWNlbWVudE1hcDogbmV3
IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9h
dD4sCisJICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sCisJICoKKwkgKiAgcm91Z2huZXNz
TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqCisJICogIG1ldGFsbmVzc01h
cDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKgorCSAqICBhbHBoYU1hcDogbmV3
IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKgorCSAqICBlbnZNYXA6IG5ldyBUSFJFRS5D
dWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksCisJICog
IGVudk1hcEludGVuc2l0eTogPGZsb2F0PgorCSAqCisJICogIHJlZnJhY3Rpb25SYXRpbzogPGZs
b2F0PiwKKwkgKgorCSAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKKwkgKiAgd2lyZWZyYW1lTGlu
ZXdpZHRoOiA8ZmxvYXQ+LAorCSAqCisJICogIHNraW5uaW5nOiA8Ym9vbD4sCisJICogIG1vcnBo
VGFyZ2V0czogPGJvb2w+LAorCSAqICBtb3JwaE5vcm1hbHM6IDxib29sPgorCSAqIH0KKwkgKi8K
KworCWZ1bmN0aW9uIE1lc2hTdGFuZGFyZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisJCU1h
dGVyaWFsLmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcn
IH07CisKKwkJdGhpcy50eXBlID0gJ01lc2hTdGFuZGFyZE1hdGVyaWFsJzsKKworCQl0aGlzLmNv
bG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlCisJCXRoaXMucm91Z2huZXNz
ID0gMC41OworCQl0aGlzLm1ldGFsbmVzcyA9IDAuNTsKKworCQl0aGlzLm1hcCA9IG51bGw7CisK
KwkJdGhpcy5saWdodE1hcCA9IG51bGw7CisJCXRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7
CisKKwkJdGhpcy5hb01hcCA9IG51bGw7CisJCXRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7CisK
KwkJdGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTsKKwkJdGhpcy5lbWlzc2l2
ZUludGVuc2l0eSA9IDEuMDsKKwkJdGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7CisKKwkJdGhpcy5i
dW1wTWFwID0gbnVsbDsKKwkJdGhpcy5idW1wU2NhbGUgPSAxOworCisJCXRoaXMubm9ybWFsTWFw
ID0gbnVsbDsKKwkJdGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7CisKKwkJ
dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsOworCQl0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0g
MTsKKwkJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDsKKworCQl0aGlzLnJvdWdobmVzc01hcCA9
IG51bGw7CisKKwkJdGhpcy5tZXRhbG5lc3NNYXAgPSBudWxsOworCisJCXRoaXMuYWxwaGFNYXAg
PSBudWxsOworCisJCXRoaXMuZW52TWFwID0gbnVsbDsKKwkJdGhpcy5lbnZNYXBJbnRlbnNpdHkg
PSAxLjA7CisKKwkJdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4OworCisJCXRoaXMud2lyZWZy
YW1lID0gZmFsc2U7CisJCXRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTsKKwkJdGhpcy53aXJl
ZnJhbWVMaW5lY2FwID0gJ3JvdW5kJzsKKwkJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3Vu
ZCc7CisKKwkJdGhpcy5za2lubmluZyA9IGZhbHNlOworCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZh
bHNlOworCQl0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlOworCisJCXRoaXMuc2V0VmFsdWVzKCBw
YXJhbWV0ZXJzICk7CisKKwl9CisKKwlNZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUgPSBP
YmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKKwlNZXNoU3RhbmRhcmRNYXRlcmlh
bC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoU3RhbmRhcmRNYXRlcmlhbDsKKworCU1lc2hT
dGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID0gdHJ1ZTsK
KworCU1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3Vy
Y2UgKSB7CisKKwkJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7
CisKKwkJdGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQnOiAnJyB9OworCisJCXRoaXMuY29sb3Iu
Y29weSggc291cmNlLmNvbG9yICk7CisJCXRoaXMucm91Z2huZXNzID0gc291cmNlLnJvdWdobmVz
czsKKwkJdGhpcy5tZXRhbG5lc3MgPSBzb3VyY2UubWV0YWxuZXNzOworCisJCXRoaXMubWFwID0g
c291cmNlLm1hcDsKKworCQl0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwOworCQl0aGlz
LmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5OworCisJCXRoaXMu
YW9NYXAgPSBzb3VyY2UuYW9NYXA7CisJCXRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9N
YXBJbnRlbnNpdHk7CisKKwkJdGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTsK
KwkJdGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDsKKwkJdGhpcy5lbWlzc2l2
ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTsKKworCQl0aGlzLmJ1bXBNYXAg
PSBzb3VyY2UuYnVtcE1hcDsKKwkJdGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlOwor
CisJCXRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDsKKwkJdGhpcy5ub3JtYWxTY2Fs
ZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTsKKworCQl0aGlzLmRpc3BsYWNlbWVudE1hcCA9
IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7CisJCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3Vy
Y2UuZGlzcGxhY2VtZW50U2NhbGU7CisJCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5k
aXNwbGFjZW1lbnRCaWFzOworCisJCXRoaXMucm91Z2huZXNzTWFwID0gc291cmNlLnJvdWdobmVz
c01hcDsKKworCQl0aGlzLm1ldGFsbmVzc01hcCA9IHNvdXJjZS5tZXRhbG5lc3NNYXA7CisKKwkJ
dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKKworCQl0aGlzLmVudk1hcCA9IHNvdXJj
ZS5lbnZNYXA7CisJCXRoaXMuZW52TWFwSW50ZW5zaXR5ID0gc291cmNlLmVudk1hcEludGVuc2l0
eTsKKworCQl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87CisK
KwkJdGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lOworCQl0aGlzLndpcmVmcmFtZUxp
bmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CisJCXRoaXMud2lyZWZyYW1lTGlu
ZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwOworCQl0aGlzLndpcmVmcmFtZUxpbmVqb2lu
ID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luOworCisJCXRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uu
c2tpbm5pbmc7CisJCXRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0czsKKwkJ
dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzOworCisJCXJldHVybiB0aGlz
OworCisJfTsKKworCS8qKgorCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHVi
LmNvbS9XZXN0TGFuZ2xleQorCSAqCisJICogcGFyYW1ldGVycyA9IHsKKwkgKiAgcmVmbGVjdGl2
aXR5OiA8ZmxvYXQ+CisJICogfQorCSAqLworCisJZnVuY3Rpb24gTWVzaFBoeXNpY2FsTWF0ZXJp
YWwoIHBhcmFtZXRlcnMgKSB7CisKKwkJTWVzaFN0YW5kYXJkTWF0ZXJpYWwuY2FsbCggdGhpcyAp
OworCisJCXRoaXMuZGVmaW5lcyA9IHsgJ1BIWVNJQ0FMJzogJycgfTsKKworCQl0aGlzLnR5cGUg
PSAnTWVzaFBoeXNpY2FsTWF0ZXJpYWwnOworCisJCXRoaXMucmVmbGVjdGl2aXR5ID0gMC41OyAv
LyBtYXBzIHRvIEYwID0gMC4wNAorCisJCXRoaXMuY2xlYXJDb2F0ID0gMC4wOworCQl0aGlzLmNs
ZWFyQ29hdFJvdWdobmVzcyA9IDAuMDsKKworCQl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyAp
OworCisJfQorCisJTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0
ZSggTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlICk7CisJTWVzaFBoeXNpY2FsTWF0ZXJp
YWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFBoeXNpY2FsTWF0ZXJpYWw7CisKKwlNZXNo
UGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCA9IHRydWU7
CisKKwlNZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291
cmNlICkgeworCisJCU1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRo
aXMsIHNvdXJjZSApOworCisJCXRoaXMuZGVmaW5lcyA9IHsgJ1BIWVNJQ0FMJzogJycgfTsKKwor
CQl0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7CisKKwkJdGhpcy5jbGVh
ckNvYXQgPSBzb3VyY2UuY2xlYXJDb2F0OworCQl0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyA9IHNv
dXJjZS5jbGVhckNvYXRSb3VnaG5lc3M7CisKKwkJcmV0dXJuIHRoaXM7CisKKwl9OworCisJLyoq
CisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIGFs
dGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworCSAqCisJICogcGFyYW1ldGVycyA9
IHsKKwkgKiAgY29sb3I6IDxoZXg+LAorCSAqICBzcGVjdWxhcjogPGhleD4sCisJICogIHNoaW5p
bmVzczogPGZsb2F0PiwKKwkgKiAgb3BhY2l0eTogPGZsb2F0PiwKKwkgKgorCSAqICBtYXA6IG5l
dyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICoKKwkgKiAgbGlnaHRNYXA6IG5ldyBUSFJF
RS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CisJ
ICoKKwkgKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICogIGFvTWFw
SW50ZW5zaXR5OiA8ZmxvYXQ+CisJICoKKwkgKiAgZW1pc3NpdmU6IDxoZXg+LAorCSAqICBlbWlz
c2l2ZUludGVuc2l0eTogPGZsb2F0PgorCSAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1
cmUoIDxJbWFnZT4gKSwKKwkgKgorCSAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPElt
YWdlPiApLAorCSAqICBidW1wU2NhbGU6IDxmbG9hdD4sCisJICoKKwkgKiAgbm9ybWFsTWFwOiBu
ZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+
LAorCSAqCisJICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4g
KSwKKwkgKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sCisJICogIGRpc3BsYWNlbWVudEJp
YXM6IDxmbG9hdD4sCisJICoKKwkgKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8
SW1hZ2U+ICksCisJICoKKwkgKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+
ICksCisJICoKKwkgKiAgZW52TWFwOiBuZXcgVEhSRUUuVGV4dHVyZUN1YmUoIFtwb3N4LCBuZWd4
LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLAorCSAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBs
eSwKKwkgKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LAorCSAqICByZWZyYWN0aW9uUmF0aW86IDxm
bG9hdD4sCisJICoKKwkgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCisJICogIHdpcmVmcmFtZUxp
bmV3aWR0aDogPGZsb2F0PiwKKwkgKgorCSAqICBza2lubmluZzogPGJvb2w+LAorCSAqICBtb3Jw
aFRhcmdldHM6IDxib29sPiwKKwkgKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD4KKwkgKiB9CisJICov
CisKKwlmdW5jdGlvbiBNZXNoUGhvbmdNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKKworCQlNYXRl
cmlhbC5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJzsK
KworCQl0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlCisJCXRo
aXMuc3BlY3VsYXIgPSBuZXcgQ29sb3IoIDB4MTExMTExICk7CisJCXRoaXMuc2hpbmluZXNzID0g
MzA7CisKKwkJdGhpcy5tYXAgPSBudWxsOworCisJCXRoaXMubGlnaHRNYXAgPSBudWxsOworCQl0
aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wOworCisJCXRoaXMuYW9NYXAgPSBudWxsOworCQl0
aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wOworCisJCXRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3Io
IDB4MDAwMDAwICk7CisJCXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7CisJCXRoaXMuZW1p
c3NpdmVNYXAgPSBudWxsOworCisJCXRoaXMuYnVtcE1hcCA9IG51bGw7CisJCXRoaXMuYnVtcFNj
YWxlID0gMTsKKworCQl0aGlzLm5vcm1hbE1hcCA9IG51bGw7CisJCXRoaXMubm9ybWFsU2NhbGUg
PSBuZXcgVmVjdG9yMiggMSwgMSApOworCisJCXRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDsK
KwkJdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7CisJCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9
IDA7CisKKwkJdGhpcy5zcGVjdWxhck1hcCA9IG51bGw7CisKKwkJdGhpcy5hbHBoYU1hcCA9IG51
bGw7CisKKwkJdGhpcy5lbnZNYXAgPSBudWxsOworCQl0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9w
ZXJhdGlvbjsKKwkJdGhpcy5yZWZsZWN0aXZpdHkgPSAxOworCQl0aGlzLnJlZnJhY3Rpb25SYXRp
byA9IDAuOTg7CisKKwkJdGhpcy53aXJlZnJhbWUgPSBmYWxzZTsKKwkJdGhpcy53aXJlZnJhbWVM
aW5ld2lkdGggPSAxOworCQl0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnOworCQl0aGlz
LndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJzsKKworCQl0aGlzLnNraW5uaW5nID0gZmFsc2U7
CisJCXRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7CisJCXRoaXMubW9ycGhOb3JtYWxzID0gZmFs
c2U7CisKKwkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKKworCX0KKworCU1lc2hQaG9u
Z01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSAp
OworCU1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hQaG9uZ01h
dGVyaWFsOworCisJTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBob25nTWF0ZXJp
YWwgPSB0cnVlOworCisJTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlv
biAoIHNvdXJjZSApIHsKKworCQlNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBz
b3VyY2UgKTsKKworCQl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworCQl0aGlzLnNw
ZWN1bGFyLmNvcHkoIHNvdXJjZS5zcGVjdWxhciApOworCQl0aGlzLnNoaW5pbmVzcyA9IHNvdXJj
ZS5zaGluaW5lc3M7CisKKwkJdGhpcy5tYXAgPSBzb3VyY2UubWFwOworCisJCXRoaXMubGlnaHRN
YXAgPSBzb3VyY2UubGlnaHRNYXA7CisJCXRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2Uu
bGlnaHRNYXBJbnRlbnNpdHk7CisKKwkJdGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDsKKwkJdGhp
cy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTsKKworCQl0aGlzLmVtaXNz
aXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApOworCQl0aGlzLmVtaXNzaXZlTWFwID0gc291cmNl
LmVtaXNzaXZlTWFwOworCQl0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZl
SW50ZW5zaXR5OworCisJCXRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwOworCQl0aGlzLmJ1
bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7CisKKwkJdGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uu
bm9ybWFsTWFwOworCQl0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSAp
OworCisJCXRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDsKKwkJ
dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTsKKwkJdGhp
cy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7CisKKwkJdGhpcy5z
cGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKKworCQl0aGlzLmFscGhhTWFwID0gc291
cmNlLmFscGhhTWFwOworCisJCXRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDsKKwkJdGhpcy5j
b21iaW5lID0gc291cmNlLmNvbWJpbmU7CisJCXRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJl
ZmxlY3Rpdml0eTsKKwkJdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJh
dGlvOworCisJCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKKwkJdGhpcy53aXJl
ZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoOworCQl0aGlzLndpcmVm
cmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDsKKwkJdGhpcy53aXJlZnJhbWVM
aW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKKworCQl0aGlzLnNraW5uaW5nID0g
c291cmNlLnNraW5uaW5nOworCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdl
dHM7CisJCXRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFsczsKKworCQlyZXR1
cm4gdGhpczsKKworCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIHRha2FoaXJveCAvIGh0dHA6Ly9n
aXRodWIuY29tL3Rha2FoaXJveAorCSAqCisJICogcGFyYW1ldGVycyA9IHsKKwkgKiAgZ3JhZGll
bnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICkKKwkgKiB9CisJICovCisKKwlmdW5j
dGlvbiBNZXNoVG9vbk1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisJCU1lc2hQaG9uZ01hdGVy
aWFsLmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLmRlZmluZXMgPSB7ICdUT09OJzogJycgfTsKKwor
CQl0aGlzLnR5cGUgPSAnTWVzaFRvb25NYXRlcmlhbCc7CisKKwkJdGhpcy5ncmFkaWVudE1hcCA9
IG51bGw7CisKKwkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKKworCX0KKworCU1lc2hU
b29uTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFBob25nTWF0ZXJpYWwu
cHJvdG90eXBlICk7CisJTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBN
ZXNoVG9vbk1hdGVyaWFsOworCisJTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoVG9v
bk1hdGVyaWFsID0gdHJ1ZTsKKworCU1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBm
dW5jdGlvbiAoIHNvdXJjZSApIHsKKworCQlNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29w
eS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworCQl0aGlzLmdyYWRpZW50TWFwID0gc291cmNlLmdy
YWRpZW50TWFwOworCisJCXJldHVybiB0aGlzOworCisJfTsKKworCS8qKgorCSAqIEBhdXRob3Ig
bXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0
dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisJICoKKwkgKiBwYXJhbWV0ZXJzID0geworCSAq
ICBvcGFjaXR5OiA8ZmxvYXQ+LAorCSAqCisJICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJl
KCA8SW1hZ2U+ICksCisJICogIGJ1bXBTY2FsZTogPGZsb2F0PiwKKwkgKgorCSAqICBub3JtYWxN
YXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICogIG5vcm1hbFNjYWxlOiA8VmVj
dG9yMj4sCisJICoKKwkgKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPElt
YWdlPiApLAorCSAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PiwKKwkgKiAgZGlzcGxhY2Vt
ZW50QmlhczogPGZsb2F0PiwKKwkgKgorCSAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKKwkgKiAg
d2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+CisJICoKKwkgKiAgc2tpbm5pbmc6IDxib29sPiwK
KwkgKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sCisJICogIG1vcnBoTm9ybWFsczogPGJvb2w+CisJ
ICogfQorCSAqLworCisJZnVuY3Rpb24gTWVzaE5vcm1hbE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkg
eworCisJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnTWVzaE5vcm1h
bE1hdGVyaWFsJzsKKworCQl0aGlzLmJ1bXBNYXAgPSBudWxsOworCQl0aGlzLmJ1bXBTY2FsZSA9
IDE7CisKKwkJdGhpcy5ub3JtYWxNYXAgPSBudWxsOworCQl0aGlzLm5vcm1hbFNjYWxlID0gbmV3
IFZlY3RvcjIoIDEsIDEgKTsKKworCQl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CisJCXRo
aXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOworCQl0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwOwor
CisJCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CisJCXRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0g
MTsKKworCQl0aGlzLmZvZyA9IGZhbHNlOworCQl0aGlzLmxpZ2h0cyA9IGZhbHNlOworCisJCXRo
aXMuc2tpbm5pbmcgPSBmYWxzZTsKKwkJdGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTsKKwkJdGhp
cy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsKKworCQl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyAp
OworCisJfQorCisJTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUo
IE1hdGVyaWFsLnByb3RvdHlwZSApOworCU1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuY29u
c3RydWN0b3IgPSBNZXNoTm9ybWFsTWF0ZXJpYWw7CisKKwlNZXNoTm9ybWFsTWF0ZXJpYWwucHJv
dG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsID0gdHJ1ZTsKKworCU1lc2hOb3JtYWxNYXRlcmlh
bC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgeworCisJCU1hdGVyaWFsLnBy
b3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOworCisJCXRoaXMuYnVtcE1hcCA9IHNv
dXJjZS5idW1wTWFwOworCQl0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7CisKKwkJ
dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwOworCQl0aGlzLm5vcm1hbFNjYWxlLmNv
cHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApOworCisJCXRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291
cmNlLmRpc3BsYWNlbWVudE1hcDsKKwkJdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5k
aXNwbGFjZW1lbnRTY2FsZTsKKwkJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3Bs
YWNlbWVudEJpYXM7CisKKwkJdGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lOworCQl0
aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CisKKwkJ
dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKKwkJdGhpcy5tb3JwaFRhcmdldHMgPSBz
b3VyY2UubW9ycGhUYXJnZXRzOworCQl0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5v
cm1hbHM7CisKKwkJcmV0dXJuIHRoaXM7CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBtcmRv
b2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2Fs
dGVyZWRxdWFsaWEuY29tLworCSAqCisJICogcGFyYW1ldGVycyA9IHsKKwkgKiAgY29sb3I6IDxo
ZXg+LAorCSAqICBvcGFjaXR5OiA8ZmxvYXQ+LAorCSAqCisJICogIG1hcDogbmV3IFRIUkVFLlRl
eHR1cmUoIDxJbWFnZT4gKSwKKwkgKgorCSAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUo
IDxJbWFnZT4gKSwKKwkgKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD4KKwkgKgorCSAqICBh
b01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKiAgYW9NYXBJbnRlbnNpdHk6
IDxmbG9hdD4KKwkgKgorCSAqICBlbWlzc2l2ZTogPGhleD4sCisJICogIGVtaXNzaXZlSW50ZW5z
aXR5OiA8ZmxvYXQ+CisJICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdl
PiApLAorCSAqCisJICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiAp
LAorCSAqCisJICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAq
CisJICogIGVudk1hcDogbmV3IFRIUkVFLlRleHR1cmVDdWJlKCBbcG9zeCwgbmVneCwgcG9zeSwg
bmVneSwgcG9zeiwgbmVnel0gKSwKKwkgKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksCisJICog
IHJlZmxlY3Rpdml0eTogPGZsb2F0PiwKKwkgKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LAor
CSAqCisJICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LAorCSAqICB3aXJlZnJhbWVMaW5ld2lkdGg6
IDxmbG9hdD4sCisJICoKKwkgKiAgc2tpbm5pbmc6IDxib29sPiwKKwkgKiAgbW9ycGhUYXJnZXRz
OiA8Ym9vbD4sCisJICogIG1vcnBoTm9ybWFsczogPGJvb2w+CisJICogfQorCSAqLworCisJZnVu
Y3Rpb24gTWVzaExhbWJlcnRNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKKworCQlNYXRlcmlhbC5j
YWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnOworCisJ
CXRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2UKKworCQl0aGlz
Lm1hcCA9IG51bGw7CisKKwkJdGhpcy5saWdodE1hcCA9IG51bGw7CisJCXRoaXMubGlnaHRNYXBJ
bnRlbnNpdHkgPSAxLjA7CisKKwkJdGhpcy5hb01hcCA9IG51bGw7CisJCXRoaXMuYW9NYXBJbnRl
bnNpdHkgPSAxLjA7CisKKwkJdGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTsK
KwkJdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDsKKwkJdGhpcy5lbWlzc2l2ZU1hcCA9IG51
bGw7CisKKwkJdGhpcy5zcGVjdWxhck1hcCA9IG51bGw7CisKKwkJdGhpcy5hbHBoYU1hcCA9IG51
bGw7CisKKwkJdGhpcy5lbnZNYXAgPSBudWxsOworCQl0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9w
ZXJhdGlvbjsKKwkJdGhpcy5yZWZsZWN0aXZpdHkgPSAxOworCQl0aGlzLnJlZnJhY3Rpb25SYXRp
byA9IDAuOTg7CisKKwkJdGhpcy53aXJlZnJhbWUgPSBmYWxzZTsKKwkJdGhpcy53aXJlZnJhbWVM
aW5ld2lkdGggPSAxOworCQl0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnOworCQl0aGlz
LndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJzsKKworCQl0aGlzLnNraW5uaW5nID0gZmFsc2U7
CisJCXRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7CisJCXRoaXMubW9ycGhOb3JtYWxzID0gZmFs
c2U7CisKKwkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKKworCX0KKworCU1lc2hMYW1i
ZXJ0TWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBl
ICk7CisJTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTGFt
YmVydE1hdGVyaWFsOworCisJTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoTGFt
YmVydE1hdGVyaWFsID0gdHJ1ZTsKKworCU1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlLmNv
cHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworCQlNYXRlcmlhbC5wcm90b3R5cGUuY29weS5j
YWxsKCB0aGlzLCBzb3VyY2UgKTsKKworCQl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciAp
OworCisJCXRoaXMubWFwID0gc291cmNlLm1hcDsKKworCQl0aGlzLmxpZ2h0TWFwID0gc291cmNl
LmxpZ2h0TWFwOworCQl0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50
ZW5zaXR5OworCisJCXRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7CisJCXRoaXMuYW9NYXBJbnRl
bnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7CisKKwkJdGhpcy5lbWlzc2l2ZS5jb3B5KCBz
b3VyY2UuZW1pc3NpdmUgKTsKKwkJdGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1h
cDsKKwkJdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTsK
KworCQl0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwOworCisJCXRoaXMuYWxw
aGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7CisKKwkJdGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFw
OworCQl0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTsKKwkJdGhpcy5yZWZsZWN0aXZpdHkg
PSBzb3VyY2UucmVmbGVjdGl2aXR5OworCQl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5y
ZWZyYWN0aW9uUmF0aW87CisKKwkJdGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lOwor
CQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CisJ
CXRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwOworCQl0aGlz
LndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luOworCisJCXRoaXMu
c2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7CisJCXRoaXMubW9ycGhUYXJnZXRzID0gc291cmNl
Lm1vcnBoVGFyZ2V0czsKKwkJdGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxz
OworCisJCXJldHVybiB0aGlzOworCisJfTsKKworCS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEg
LyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICoKKwkgKiBwYXJhbWV0ZXJzID0geworCSAq
ICBjb2xvcjogPGhleD4sCisJICogIG9wYWNpdHk6IDxmbG9hdD4sCisJICoKKwkgKiAgbGluZXdp
ZHRoOiA8ZmxvYXQ+LAorCSAqCisJICogIHNjYWxlOiA8ZmxvYXQ+LAorCSAqICBkYXNoU2l6ZTog
PGZsb2F0PiwKKwkgKiAgZ2FwU2l6ZTogPGZsb2F0PgorCSAqIH0KKwkgKi8KKworCWZ1bmN0aW9u
IExpbmVEYXNoZWRNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKKworCQlNYXRlcmlhbC5jYWxsKCB0
aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ0xpbmVEYXNoZWRNYXRlcmlhbCc7CisKKwkJdGhpcy5j
b2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsKKworCQl0aGlzLmxpbmV3aWR0aCA9IDE7CisK
KwkJdGhpcy5zY2FsZSA9IDE7CisJCXRoaXMuZGFzaFNpemUgPSAzOworCQl0aGlzLmdhcFNpemUg
PSAxOworCisJCXRoaXMubGlnaHRzID0gZmFsc2U7CisKKwkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFt
ZXRlcnMgKTsKKworCX0KKworCUxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3Qu
Y3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKKwlMaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90
eXBlLmNvbnN0cnVjdG9yID0gTGluZURhc2hlZE1hdGVyaWFsOworCisJTGluZURhc2hlZE1hdGVy
aWFsLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbCA9IHRydWU7CisKKwlMaW5lRGFzaGVk
TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworCQlNYXRl
cmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworCQl0aGlzLmNvbG9y
LmNvcHkoIHNvdXJjZS5jb2xvciApOworCisJCXRoaXMubGluZXdpZHRoID0gc291cmNlLmxpbmV3
aWR0aDsKKworCQl0aGlzLnNjYWxlID0gc291cmNlLnNjYWxlOworCQl0aGlzLmRhc2hTaXplID0g
c291cmNlLmRhc2hTaXplOworCQl0aGlzLmdhcFNpemUgPSBzb3VyY2UuZ2FwU2l6ZTsKKworCQly
ZXR1cm4gdGhpczsKKworCX07CisKKworCisJdmFyIE1hdGVyaWFscyA9IE9iamVjdC5mcmVlemUo
eworCQlTaGFkb3dNYXRlcmlhbDogU2hhZG93TWF0ZXJpYWwsCisJCVNwcml0ZU1hdGVyaWFsOiBT
cHJpdGVNYXRlcmlhbCwKKwkJUmF3U2hhZGVyTWF0ZXJpYWw6IFJhd1NoYWRlck1hdGVyaWFsLAor
CQlTaGFkZXJNYXRlcmlhbDogU2hhZGVyTWF0ZXJpYWwsCisJCVBvaW50c01hdGVyaWFsOiBQb2lu
dHNNYXRlcmlhbCwKKwkJTWVzaFBoeXNpY2FsTWF0ZXJpYWw6IE1lc2hQaHlzaWNhbE1hdGVyaWFs
LAorCQlNZXNoU3RhbmRhcmRNYXRlcmlhbDogTWVzaFN0YW5kYXJkTWF0ZXJpYWwsCisJCU1lc2hQ
aG9uZ01hdGVyaWFsOiBNZXNoUGhvbmdNYXRlcmlhbCwKKwkJTWVzaFRvb25NYXRlcmlhbDogTWVz
aFRvb25NYXRlcmlhbCwKKwkJTWVzaE5vcm1hbE1hdGVyaWFsOiBNZXNoTm9ybWFsTWF0ZXJpYWws
CisJCU1lc2hMYW1iZXJ0TWF0ZXJpYWw6IE1lc2hMYW1iZXJ0TWF0ZXJpYWwsCisJCU1lc2hEZXB0
aE1hdGVyaWFsOiBNZXNoRGVwdGhNYXRlcmlhbCwKKwkJTWVzaEJhc2ljTWF0ZXJpYWw6IE1lc2hC
YXNpY01hdGVyaWFsLAorCQlMaW5lRGFzaGVkTWF0ZXJpYWw6IExpbmVEYXNoZWRNYXRlcmlhbCwK
KwkJTGluZUJhc2ljTWF0ZXJpYWw6IExpbmVCYXNpY01hdGVyaWFsLAorCQlNYXRlcmlhbDogTWF0
ZXJpYWwKKwl9KTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5j
b20vCisJICovCisKKwl2YXIgQ2FjaGUgPSB7CisKKwkJZW5hYmxlZDogZmFsc2UsCisKKwkJZmls
ZXM6IHt9LAorCisJCWFkZDogZnVuY3Rpb24gKCBrZXksIGZpbGUgKSB7CisKKwkJCWlmICggdGhp
cy5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjsKKworCQkJLy8gY29uc29sZS5sb2coICdUSFJF
RS5DYWNoZScsICdBZGRpbmcga2V5OicsIGtleSApOworCisJCQl0aGlzLmZpbGVzWyBrZXkgXSA9
IGZpbGU7CisKKwkJfSwKKworCQlnZXQ6IGZ1bmN0aW9uICgga2V5ICkgeworCisJCQlpZiAoIHRo
aXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCS8vIGNvbnNvbGUubG9nKCAnVEhS
RUUuQ2FjaGUnLCAnQ2hlY2tpbmcga2V5OicsIGtleSApOworCisJCQlyZXR1cm4gdGhpcy5maWxl
c1sga2V5IF07CisKKwkJfSwKKworCQlyZW1vdmU6IGZ1bmN0aW9uICgga2V5ICkgeworCisJCQlk
ZWxldGUgdGhpcy5maWxlc1sga2V5IF07CisKKwkJfSwKKworCQljbGVhcjogZnVuY3Rpb24gKCkg
eworCisJCQl0aGlzLmZpbGVzID0ge307CisKKwkJfQorCisJfTsKKworCS8qKgorCSAqIEBhdXRo
b3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBMb2FkaW5n
TWFuYWdlciggb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgeworCisJCXZhciBzY29wZSA9
IHRoaXM7CisKKwkJdmFyIGlzTG9hZGluZyA9IGZhbHNlLCBpdGVtc0xvYWRlZCA9IDAsIGl0ZW1z
VG90YWwgPSAwOworCisJCXRoaXMub25TdGFydCA9IHVuZGVmaW5lZDsKKwkJdGhpcy5vbkxvYWQg
PSBvbkxvYWQ7CisJCXRoaXMub25Qcm9ncmVzcyA9IG9uUHJvZ3Jlc3M7CisJCXRoaXMub25FcnJv
ciA9IG9uRXJyb3I7CisKKwkJdGhpcy5pdGVtU3RhcnQgPSBmdW5jdGlvbiAoIHVybCApIHsKKwor
CQkJaXRlbXNUb3RhbCArKzsKKworCQkJaWYgKCBpc0xvYWRpbmcgPT09IGZhbHNlICkgeworCisJ
CQkJaWYgKCBzY29wZS5vblN0YXJ0ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJc2NvcGUub25T
dGFydCggdXJsLCBpdGVtc0xvYWRlZCwgaXRlbXNUb3RhbCApOworCisJCQkJfQorCisJCQl9CisK
KwkJCWlzTG9hZGluZyA9IHRydWU7CisKKwkJfTsKKworCQl0aGlzLml0ZW1FbmQgPSBmdW5jdGlv
biAoIHVybCApIHsKKworCQkJaXRlbXNMb2FkZWQgKys7CisKKwkJCWlmICggc2NvcGUub25Qcm9n
cmVzcyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJc2NvcGUub25Qcm9ncmVzcyggdXJsLCBpdGVt
c0xvYWRlZCwgaXRlbXNUb3RhbCApOworCisJCQl9CisKKwkJCWlmICggaXRlbXNMb2FkZWQgPT09
IGl0ZW1zVG90YWwgKSB7CisKKwkJCQlpc0xvYWRpbmcgPSBmYWxzZTsKKworCQkJCWlmICggc2Nv
cGUub25Mb2FkICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJc2NvcGUub25Mb2FkKCk7CisKKwkJ
CQl9CisKKwkJCX0KKworCQl9OworCisJCXRoaXMuaXRlbUVycm9yID0gZnVuY3Rpb24gKCB1cmwg
KSB7CisKKwkJCWlmICggc2NvcGUub25FcnJvciAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJc2Nv
cGUub25FcnJvciggdXJsICk7CisKKwkJCX0KKworCQl9OworCisJfQorCisJdmFyIERlZmF1bHRM
b2FkaW5nTWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlcigpOworCisJLyoqCisJICogQGF1dGhv
ciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEZpbGVMb2Fk
ZXIoIG1hbmFnZXIgKSB7CisKKwkJdGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmlu
ZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CisKKwl9CisKKwlPYmplY3Qu
YXNzaWduKCBGaWxlTG9hZGVyLnByb3RvdHlwZSwgeworCisJCWxvYWQ6IGZ1bmN0aW9uICggdXJs
LCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CisKKwkJCWlmICggdXJsID09PSB1bmRl
ZmluZWQgKSB1cmwgPSAnJzsKKworCQkJaWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVy
bCA9IHRoaXMucGF0aCArIHVybDsKKworCQkJdmFyIHNjb3BlID0gdGhpczsKKworCQkJdmFyIGNh
Y2hlZCA9IENhY2hlLmdldCggdXJsICk7CisKKwkJCWlmICggY2FjaGVkICE9PSB1bmRlZmluZWQg
KSB7CisKKwkJCQlzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7CisKKwkJCQlzZXRUaW1l
b3V0KCBmdW5jdGlvbiAoKSB7CisKKwkJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCAp
OworCisJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CisKKwkJCQl9LCAwICk7CisK
KwkJCQlyZXR1cm4gY2FjaGVkOworCisJCQl9CisKKwkJCS8vIENoZWNrIGZvciBkYXRhOiBVUkkK
KwkJCXZhciBkYXRhVXJpUmVnZXggPSAvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLzsKKwkJ
CXZhciBkYXRhVXJpUmVnZXhSZXN1bHQgPSB1cmwubWF0Y2goIGRhdGFVcmlSZWdleCApOworCisJ
CQkvLyBTYWZhcmkgY2FuIG5vdCBoYW5kbGUgRGF0YSBVUklzIHRocm91Z2ggWE1MSHR0cFJlcXVl
c3Qgc28gcHJvY2VzcyBtYW51YWxseQorCQkJaWYgKCBkYXRhVXJpUmVnZXhSZXN1bHQgKSB7CisK
KwkJCQl2YXIgbWltZVR5cGUgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDEgXTsKKwkJCQl2YXIgaXNC
YXNlNjQgPSAhISBkYXRhVXJpUmVnZXhSZXN1bHRbIDIgXTsKKwkJCQl2YXIgZGF0YSA9IGRhdGFV
cmlSZWdleFJlc3VsdFsgMyBdOworCisJCQkJZGF0YSA9IHdpbmRvdy5kZWNvZGVVUklDb21wb25l
bnQoIGRhdGEgKTsKKworCQkJCWlmICggaXNCYXNlNjQgKSBkYXRhID0gd2luZG93LmF0b2IoIGRh
dGEgKTsKKworCQkJCXRyeSB7CisKKwkJCQkJdmFyIHJlc3BvbnNlOworCQkJCQl2YXIgcmVzcG9u
c2VUeXBlID0gKCB0aGlzLnJlc3BvbnNlVHlwZSB8fCAnJyApLnRvTG93ZXJDYXNlKCk7CisKKwkJ
CQkJc3dpdGNoICggcmVzcG9uc2VUeXBlICkgeworCisJCQkJCQljYXNlICdhcnJheWJ1ZmZlcic6
CisJCQkJCQljYXNlICdibG9iJzoKKworCQkJCQkJIAlyZXNwb25zZSA9IG5ldyBBcnJheUJ1ZmZl
ciggZGF0YS5sZW5ndGggKTsKKworCQkJCQkJCXZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoIHJl
c3BvbnNlICk7CisKKwkJCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSAr
KyApIHsKKworCQkJCQkJCQl2aWV3WyBpIF0gPSBkYXRhLmNoYXJDb2RlQXQoIGkgKTsKKworCQkJ
CQkJCX0KKworCQkJCQkJCWlmICggcmVzcG9uc2VUeXBlID09PSAnYmxvYicgKSB7CisKKwkJCQkJ
CQkJcmVzcG9uc2UgPSBuZXcgQmxvYiggWyByZXNwb25zZSBdLCB7IHR5cGU6IG1pbWVUeXBlIH0g
KTsKKworCQkJCQkJCX0KKworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlICdkb2N1bWVudCc6
CisKKwkJCQkJCQl2YXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOworCQkJCQkJCXJlc3BvbnNl
ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgbWltZVR5cGUgKTsKKworCQkJCQkJCWJy
ZWFrOworCisJCQkJCQljYXNlICdqc29uJzoKKworCQkJCQkJCXJlc3BvbnNlID0gSlNPTi5wYXJz
ZSggZGF0YSApOworCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWRlZmF1bHQ6IC8vICd0ZXh0JyBv
ciBvdGhlcgorCisJCQkJCQkJcmVzcG9uc2UgPSBkYXRhOworCisJCQkJCQkJYnJlYWs7CisKKwkJ
CQkJfQorCisJCQkJCS8vIFdhaXQgZm9yIG5leHQgYnJvd3NlciB0aWNrCisJCQkJCXdpbmRvdy5z
ZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7CisKKwkJCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCBy
ZXNwb25zZSApOworCisJCQkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOworCisJCQkJ
CX0sIDAgKTsKKworCQkJCX0gY2F0Y2ggKCBlcnJvciApIHsKKworCQkJCQkvLyBXYWl0IGZvciBu
ZXh0IGJyb3dzZXIgdGljaworCQkJCQl3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkgewor
CisJCQkJCQlpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBlcnJvciApOworCisJCQkJCQlzY29wZS5t
YW5hZ2VyLml0ZW1FbmQoIHVybCApOworCQkJCQkJc2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVy
bCApOworCisJCQkJCX0sIDAgKTsKKworCQkJCX0KKworCQkJfSBlbHNlIHsKKworCQkJCXZhciBy
ZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisJCQkJcmVxdWVzdC5vcGVuKCAnR0VUJywg
dXJsLCB0cnVlICk7CisKKwkJCQlyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgZnVu
Y3Rpb24gKCBldmVudCApIHsKKworCQkJCQl2YXIgcmVzcG9uc2UgPSBldmVudC50YXJnZXQucmVz
cG9uc2U7CisKKwkJCQkJQ2FjaGUuYWRkKCB1cmwsIHJlc3BvbnNlICk7CisKKwkJCQkJaWYgKCB0
aGlzLnN0YXR1cyA9PT0gMjAwICkgeworCisJCQkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggcmVz
cG9uc2UgKTsKKworCQkJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKKworCQkJCQl9
IGVsc2UgaWYgKCB0aGlzLnN0YXR1cyA9PT0gMCApIHsKKworCQkJCQkJLy8gU29tZSBicm93c2Vy
cyByZXR1cm4gSFRUUCBTdGF0dXMgMCB3aGVuIHVzaW5nIG5vbi1odHRwIHByb3RvY29sCisJCQkJ
CQkvLyBlLmcuICdmaWxlOi8vJyBvciAnZGF0YTovLycuIEhhbmRsZSBhcyBzdWNjZXNzLgorCisJ
CQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2Vp
dmVkLicgKTsKKworCQkJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIHJlc3BvbnNlICk7CisKKwkJ
CQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJ
CQkJaWYgKCBvbkVycm9yICkgb25FcnJvciggZXZlbnQgKTsKKworCQkJCQkJc2NvcGUubWFuYWdl
ci5pdGVtRW5kKCB1cmwgKTsKKwkJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTsK
KworCQkJCQl9CisKKwkJCQl9LCBmYWxzZSApOworCisJCQkJaWYgKCBvblByb2dyZXNzICE9PSB1
bmRlZmluZWQgKSB7CisKKwkJCQkJcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3Mn
LCBmdW5jdGlvbiAoIGV2ZW50ICkgeworCisJCQkJCQlvblByb2dyZXNzKCBldmVudCApOworCisJ
CQkJCX0sIGZhbHNlICk7CisKKwkJCQl9CisKKwkJCQlyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIo
ICdlcnJvcicsIGZ1bmN0aW9uICggZXZlbnQgKSB7CisKKwkJCQkJaWYgKCBvbkVycm9yICkgb25F
cnJvciggZXZlbnQgKTsKKworCQkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOworCQkJ
CQlzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7CisKKwkJCQl9LCBmYWxzZSApOworCisJ
CQkJaWYgKCB0aGlzLnJlc3BvbnNlVHlwZSAhPT0gdW5kZWZpbmVkICkgcmVxdWVzdC5yZXNwb25z
ZVR5cGUgPSB0aGlzLnJlc3BvbnNlVHlwZTsKKwkJCQlpZiAoIHRoaXMud2l0aENyZWRlbnRpYWxz
ICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRoaXMud2l0aENyZWRl
bnRpYWxzOworCisJCQkJaWYgKCByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUgKSByZXF1ZXN0Lm92
ZXJyaWRlTWltZVR5cGUoIHRoaXMubWltZVR5cGUgIT09IHVuZGVmaW5lZCA/IHRoaXMubWltZVR5
cGUgOiAndGV4dC9wbGFpbicgKTsKKworCQkJCWZvciAoIHZhciBoZWFkZXIgaW4gdGhpcy5yZXF1
ZXN0SGVhZGVyICkgeworCisJCQkJCXJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlciggaGVhZGVyLCB0
aGlzLnJlcXVlc3RIZWFkZXJbIGhlYWRlciBdICk7CisKKwkJCQl9CisKKwkJCQlyZXF1ZXN0LnNl
bmQoIG51bGwgKTsKKworCQkJfQorCisJCQlzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7
CisKKwkJCXJldHVybiByZXF1ZXN0OworCisJCX0sCisKKwkJc2V0UGF0aDogZnVuY3Rpb24gKCB2
YWx1ZSApIHsKKworCQkJdGhpcy5wYXRoID0gdmFsdWU7CisJCQlyZXR1cm4gdGhpczsKKworCQl9
LAorCisJCXNldFJlc3BvbnNlVHlwZTogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJdGhpcy5y
ZXNwb25zZVR5cGUgPSB2YWx1ZTsKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0V2l0
aENyZWRlbnRpYWxzOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQl0aGlzLndpdGhDcmVkZW50
aWFscyA9IHZhbHVlOworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRNaW1lVHlwZTog
ZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJdGhpcy5taW1lVHlwZSA9IHZhbHVlOworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiAoIHZhbHVl
ICkgeworCisJCQl0aGlzLnJlcXVlc3RIZWFkZXIgPSB2YWx1ZTsKKwkJCXJldHVybiB0aGlzOwor
CisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9v
Yi5jb20vCisJICoKKwkgKiBBYnN0cmFjdCBCYXNlIGNsYXNzIHRvIGJsb2NrIGJhc2VkIHRleHR1
cmVzIGxvYWRlciAoZGRzLCBwdnIsIC4uLikKKwkgKi8KKworCWZ1bmN0aW9uIENvbXByZXNzZWRU
ZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkgeworCisJCXRoaXMubWFuYWdlciA9ICggbWFuYWdlciAh
PT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyOworCisJCS8v
IG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzCisJCXRoaXMuX3BhcnNlciA9IG51bGw7CisKKwl9CisK
KwlPYmplY3QuYXNzaWduKCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHsKKwor
CQlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgewor
CisJCQl2YXIgc2NvcGUgPSB0aGlzOworCisJCQl2YXIgaW1hZ2VzID0gW107CisKKwkJCXZhciB0
ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7CisJCQl0ZXh0dXJlLmltYWdlID0gaW1h
Z2VzOworCisJCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApOwor
CQkJbG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApOworCQkJbG9hZGVyLnNldFJlc3BvbnNlVHlw
ZSggJ2FycmF5YnVmZmVyJyApOworCisJCQlmdW5jdGlvbiBsb2FkVGV4dHVyZSggaSApIHsKKwor
CQkJCWxvYWRlci5sb2FkKCB1cmxbIGkgXSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7CisKKwkJCQkJ
dmFyIHRleERhdGFzID0gc2NvcGUuX3BhcnNlciggYnVmZmVyLCB0cnVlICk7CisKKwkJCQkJaW1h
Z2VzWyBpIF0gPSB7CisJCQkJCQl3aWR0aDogdGV4RGF0YXMud2lkdGgsCisJCQkJCQloZWlnaHQ6
IHRleERhdGFzLmhlaWdodCwKKwkJCQkJCWZvcm1hdDogdGV4RGF0YXMuZm9ybWF0LAorCQkJCQkJ
bWlwbWFwczogdGV4RGF0YXMubWlwbWFwcworCQkJCQl9OworCisJCQkJCWxvYWRlZCArPSAxOwor
CisJCQkJCWlmICggbG9hZGVkID09PSA2ICkgeworCisJCQkJCQlpZiAoIHRleERhdGFzLm1pcG1h
cENvdW50ID09PSAxICkKKwkJCQkJCQl0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjsK
KworCQkJCQkJdGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7CisJCQkJCQl0ZXh0dXJl
Lm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQkJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1
cmUgKTsKKworCQkJCQl9CisKKwkJCQl9LCBvblByb2dyZXNzLCBvbkVycm9yICk7CisKKwkJCX0K
KworCQkJaWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHsKKworCQkJCXZhciBsb2FkZWQgPSAw
OworCisJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHVybC5sZW5ndGg7IGkgPCBpbDsgKysgaSAp
IHsKKworCQkJCQlsb2FkVGV4dHVyZSggaSApOworCisJCQkJfQorCisJCQl9IGVsc2UgeworCisJ
CQkJLy8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVkIGluIGEgc2luZ2xlIEREUyBm
aWxlCisKKwkJCQlsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHsKKworCQkJ
CQl2YXIgdGV4RGF0YXMgPSBzY29wZS5fcGFyc2VyKCBidWZmZXIsIHRydWUgKTsKKworCQkJCQlp
ZiAoIHRleERhdGFzLmlzQ3ViZW1hcCApIHsKKworCQkJCQkJdmFyIGZhY2VzID0gdGV4RGF0YXMu
bWlwbWFwcy5sZW5ndGggLyB0ZXhEYXRhcy5taXBtYXBDb3VudDsKKworCQkJCQkJZm9yICggdmFy
IGYgPSAwOyBmIDwgZmFjZXM7IGYgKysgKSB7CisKKwkJCQkJCQlpbWFnZXNbIGYgXSA9IHsgbWlw
bWFwcyA6IFtdIH07CisKKwkJCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0ZXhEYXRhcy5taXBt
YXBDb3VudDsgaSArKyApIHsKKworCQkJCQkJCQlpbWFnZXNbIGYgXS5taXBtYXBzLnB1c2goIHRl
eERhdGFzLm1pcG1hcHNbIGYgKiB0ZXhEYXRhcy5taXBtYXBDb3VudCArIGkgXSApOworCQkJCQkJ
CQlpbWFnZXNbIGYgXS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7CisJCQkJCQkJCWltYWdlc1sg
ZiBdLndpZHRoID0gdGV4RGF0YXMud2lkdGg7CisJCQkJCQkJCWltYWdlc1sgZiBdLmhlaWdodCA9
IHRleERhdGFzLmhlaWdodDsKKworCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJCX0gZWxzZSB7
CisKKwkJCQkJCXRleHR1cmUuaW1hZ2Uud2lkdGggPSB0ZXhEYXRhcy53aWR0aDsKKwkJCQkJCXRl
eHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0OworCQkJCQkJdGV4dHVyZS5taXBt
YXBzID0gdGV4RGF0YXMubWlwbWFwczsKKworCQkJCQl9CisKKwkJCQkJaWYgKCB0ZXhEYXRhcy5t
aXBtYXBDb3VudCA9PT0gMSApIHsKKworCQkJCQkJdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJG
aWx0ZXI7CisKKwkJCQkJfQorCisJCQkJCXRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0
OworCQkJCQl0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQkJCQlpZiAoIG9uTG9hZCAp
IG9uTG9hZCggdGV4dHVyZSApOworCisJCQkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOworCisJ
CQl9CisKKwkJCXJldHVybiB0ZXh0dXJlOworCisJCX0sCisKKwkJc2V0UGF0aDogZnVuY3Rpb24g
KCB2YWx1ZSApIHsKKworCQkJdGhpcy5wYXRoID0gdmFsdWU7CisJCQlyZXR1cm4gdGhpczsKKwor
CQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIE5pa29zIE0uIC8gaHR0cHM6Ly9naXRo
dWIuY29tL2ZvbzEyMy8KKwkgKgorCSAqIEFic3RyYWN0IEJhc2UgY2xhc3MgdG8gbG9hZCBnZW5l
cmljIGJpbmFyeSB0ZXh0dXJlcyBmb3JtYXRzIChyZ2JlLCBoZHIsIC4uLikKKwkgKi8KKworCWZ1
bmN0aW9uIERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkgeworCisJCXRoaXMubWFuYWdlciA9
ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5h
Z2VyOworCisJCS8vIG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzCisJCXRoaXMuX3BhcnNlciA9IG51
bGw7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBEYXRhVGV4dHVyZUxvYWRlci5wcm90b3R5cGUs
IHsKKworCQlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9y
ICkgeworCisJCQl2YXIgc2NvcGUgPSB0aGlzOworCisJCQl2YXIgdGV4dHVyZSA9IG5ldyBEYXRh
VGV4dHVyZSgpOworCisJCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdl
ciApOworCQkJbG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApOworCisJCQls
b2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHsKKworCQkJCXZhciB0ZXhEYXRh
ID0gc2NvcGUuX3BhcnNlciggYnVmZmVyICk7CisKKwkJCQlpZiAoICEgdGV4RGF0YSApIHJldHVy
bjsKKworCQkJCWlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmltYWdlICkgeworCisJCQkJCXRl
eHR1cmUuaW1hZ2UgPSB0ZXhEYXRhLmltYWdlOworCisJCQkJfSBlbHNlIGlmICggdW5kZWZpbmVk
ICE9PSB0ZXhEYXRhLmRhdGEgKSB7CisKKwkJCQkJdGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERh
dGEud2lkdGg7CisJCQkJCXRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YS5oZWlnaHQ7CisJ
CQkJCXRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTsKKworCQkJCX0KKworCQkJCXRl
eHR1cmUud3JhcFMgPSB1bmRlZmluZWQgIT09IHRleERhdGEud3JhcFMgPyB0ZXhEYXRhLndyYXBT
IDogQ2xhbXBUb0VkZ2VXcmFwcGluZzsKKwkJCQl0ZXh0dXJlLndyYXBUID0gdW5kZWZpbmVkICE9
PSB0ZXhEYXRhLndyYXBUID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7CisK
KwkJCQl0ZXh0dXJlLm1hZ0ZpbHRlciA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5tYWdGaWx0ZXIg
PyB0ZXhEYXRhLm1hZ0ZpbHRlciA6IExpbmVhckZpbHRlcjsKKwkJCQl0ZXh0dXJlLm1pbkZpbHRl
ciA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5taW5GaWx0ZXIgPyB0ZXhEYXRhLm1pbkZpbHRlciA6
IExpbmVhck1pcE1hcExpbmVhckZpbHRlcjsKKworCQkJCXRleHR1cmUuYW5pc290cm9weSA9IHVu
ZGVmaW5lZCAhPT0gdGV4RGF0YS5hbmlzb3Ryb3B5ID8gdGV4RGF0YS5hbmlzb3Ryb3B5IDogMTsK
KworCQkJCWlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmZvcm1hdCApIHsKKworCQkJCQl0ZXh0
dXJlLmZvcm1hdCA9IHRleERhdGEuZm9ybWF0OworCisJCQkJfQorCQkJCWlmICggdW5kZWZpbmVk
ICE9PSB0ZXhEYXRhLnR5cGUgKSB7CisKKwkJCQkJdGV4dHVyZS50eXBlID0gdGV4RGF0YS50eXBl
OworCisJCQkJfQorCisJCQkJaWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEubWlwbWFwcyApIHsK
KworCQkJCQl0ZXh0dXJlLm1pcG1hcHMgPSB0ZXhEYXRhLm1pcG1hcHM7CisKKwkJCQl9CisKKwkJ
CQlpZiAoIDEgPT09IHRleERhdGEubWlwbWFwQ291bnQgKSB7CisKKwkJCQkJdGV4dHVyZS5taW5G
aWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CisKKwkJCQl9CisKKwkJCQl0ZXh0dXJlLm5lZWRzVXBkYXRl
ID0gdHJ1ZTsKKworCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlLCB0ZXhEYXRhICk7
CisKKwkJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKKworCisJCQlyZXR1cm4gdGV4dHVyZTsK
KworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRv
b2IuY29tLworCSAqLworCisJZnVuY3Rpb24gSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKSB7CisKKwkJ
dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZh
dWx0TG9hZGluZ01hbmFnZXI7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBJbWFnZUxvYWRlci5w
cm90b3R5cGUsIHsKKworCQlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNz
LCBvbkVycm9yICkgeworCisJCQlpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7CisK
KwkJCWlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7
CisKKwkJCXZhciBzY29wZSA9IHRoaXM7CisKKwkJCXZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVy
bCApOworCisJCQlpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJc2NvcGUubWFu
YWdlci5pdGVtU3RhcnQoIHVybCApOworCisJCQkJc2V0VGltZW91dCggZnVuY3Rpb24gKCkgewor
CisJCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTsKKworCQkJCQlzY29wZS5tYW5h
Z2VyLml0ZW1FbmQoIHVybCApOworCisJCQkJfSwgMCApOworCisJCQkJcmV0dXJuIGNhY2hlZDsK
KworCQkJfQorCisJCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRw
Oi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2ltZycgKTsKKworCQkJaW1hZ2UuYWRkRXZlbnRM
aXN0ZW5lciggJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CisKKwkJCQlDYWNoZS5hZGQoIHVybCwgdGhp
cyApOworCisJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTsKKworCQkJCXNjb3BlLm1h
bmFnZXIuaXRlbUVuZCggdXJsICk7CisKKwkJCX0sIGZhbHNlICk7CisKKwkJCS8qCisJCQlpbWFn
ZS5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoIGV2ZW50ICkgeworCisJ
CQkJaWYgKCBvblByb2dyZXNzICkgb25Qcm9ncmVzcyggZXZlbnQgKTsKKworCQkJfSwgZmFsc2Ug
KTsKKwkJCSovCisKKwkJCWltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIGZ1bmN0aW9u
ICggZXZlbnQgKSB7CisKKwkJCQlpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBldmVudCApOworCisJ
CQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKKwkJCQlzY29wZS5tYW5hZ2VyLml0ZW1F
cnJvciggdXJsICk7CisKKwkJCX0sIGZhbHNlICk7CisKKwkJCWlmICggdXJsLnN1YnN0ciggMCwg
NSApICE9PSAnZGF0YTonICkgeworCisJCQkJaWYgKCB0aGlzLmNyb3NzT3JpZ2luICE9PSB1bmRl
ZmluZWQgKSBpbWFnZS5jcm9zc09yaWdpbiA9IHRoaXMuY3Jvc3NPcmlnaW47CisKKwkJCX0KKwor
CQkJc2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApOworCisJCQlpbWFnZS5zcmMgPSB1cmw7
CisKKwkJCXJldHVybiBpbWFnZTsKKworCQl9LAorCisJCXNldENyb3NzT3JpZ2luOiBmdW5jdGlv
biAoIHZhbHVlICkgeworCisJCQl0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7CisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCXNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCXRo
aXMucGF0aCA9IHZhbHVlOworCQkJcmV0dXJuIHRoaXM7CisKKwkJfQorCisJfSApOworCisJLyoq
CisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0
aW9uIEN1YmVUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkgeworCisJCXRoaXMubWFuYWdlciA9ICgg
bWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2Vy
OworCisJfQorCisJT2JqZWN0LmFzc2lnbiggQ3ViZVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7
CisKKwkJbG9hZDogZnVuY3Rpb24gKCB1cmxzLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3Ig
KSB7CisKKwkJCXZhciB0ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7CisKKwkJCXZhciBsb2Fk
ZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApOworCQkJbG9hZGVyLnNldENyb3Nz
T3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7CisJCQlsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRo
ICk7CisKKwkJCXZhciBsb2FkZWQgPSAwOworCisJCQlmdW5jdGlvbiBsb2FkVGV4dHVyZSggaSAp
IHsKKworCQkJCWxvYWRlci5sb2FkKCB1cmxzWyBpIF0sIGZ1bmN0aW9uICggaW1hZ2UgKSB7CisK
KwkJCQkJdGV4dHVyZS5pbWFnZXNbIGkgXSA9IGltYWdlOworCisJCQkJCWxvYWRlZCArKzsKKwor
CQkJCQlpZiAoIGxvYWRlZCA9PT0gNiApIHsKKworCQkJCQkJdGV4dHVyZS5uZWVkc1VwZGF0ZSA9
IHRydWU7CisKKwkJCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7CisKKwkJCQkJ
fQorCisJCQkJfSwgdW5kZWZpbmVkLCBvbkVycm9yICk7CisKKwkJCX0KKworCQkJZm9yICggdmFy
IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7ICsrIGkgKSB7CisKKwkJCQlsb2FkVGV4dHVyZSggaSAp
OworCisJCQl9CisKKwkJCXJldHVybiB0ZXh0dXJlOworCisJCX0sCisKKwkJc2V0Q3Jvc3NPcmln
aW46IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCXRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTsK
KwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSAp
IHsKKworCQkJdGhpcy5wYXRoID0gdmFsdWU7CisJCQlyZXR1cm4gdGhpczsKKworCQl9CisKKwl9
ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAq
LworCisJZnVuY3Rpb24gVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHsKKworCQl0aGlzLm1hbmFn
ZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5n
TWFuYWdlcjsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIFRleHR1cmVMb2FkZXIucHJvdG90eXBl
LCB7CisKKwkJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJv
ciApIHsKKworCQkJdmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7
CisJCQlsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTsKKwkJCWxvYWRl
ci5zZXRQYXRoKCB0aGlzLnBhdGggKTsKKworCQkJdmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSgp
OworCQkJdGV4dHVyZS5pbWFnZSA9IGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICgpIHsKKwor
CQkJCS8vIEpQRUdzIGNhbid0IGhhdmUgYW4gYWxwaGEgY2hhbm5lbCwgc28gbWVtb3J5IGNhbiBi
ZSBzYXZlZCBieSBzdG9yaW5nIHRoZW0gYXMgUkdCLgorCQkJCXZhciBpc0pQRUcgPSB1cmwuc2Vh
cmNoKCAvXC4oanBnfGpwZWcpJC8gKSA+IDAgfHwgdXJsLnNlYXJjaCggL15kYXRhXDppbWFnZVwv
anBlZy8gKSA9PT0gMDsKKworCQkJCXRleHR1cmUuZm9ybWF0ID0gaXNKUEVHID8gUkdCRm9ybWF0
IDogUkdCQUZvcm1hdDsKKwkJCQl0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQkJCWlm
ICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJb25Mb2FkKCB0ZXh0dXJlICk7CisK
KwkJCQl9CisKKwkJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKKworCQkJcmV0dXJuIHRleHR1
cmU7CisKKwkJfSwKKworCQlzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKwor
CQkJdGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlOworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKwor
CQlzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQl0aGlzLnBhdGggPSB2YWx1ZTsK
KwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJk
b29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9h
bHRlcmVkcXVhbGlhLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIExpZ2h0KCBjb2xvciwgaW50ZW5z
aXR5ICkgeworCisJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnTGln
aHQnOworCisJCXRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7CisJCXRoaXMuaW50ZW5z
aXR5ID0gaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgPyBpbnRlbnNpdHkgOiAxOworCisJCXRoaXMu
cmVjZWl2ZVNoYWRvdyA9IHVuZGVmaW5lZDsKKworCX0KKworCUxpZ2h0LnByb3RvdHlwZSA9IE9i
amVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CisKKwkJ
Y29uc3RydWN0b3I6IExpZ2h0LAorCisJCWlzTGlnaHQ6IHRydWUsCisKKwkJY29weTogZnVuY3Rp
b24gKCBzb3VyY2UgKSB7CisKKwkJCU9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMs
IHNvdXJjZSApOworCisJCQl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworCQkJdGhp
cy5pbnRlbnNpdHkgPSBzb3VyY2UuaW50ZW5zaXR5OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9
LAorCisJCXRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkgeworCisJCQl2YXIgZGF0YSA9IE9iamVj
dDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApOworCisJCQlkYXRhLm9iamVj
dC5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7CisJCQlkYXRhLm9iamVjdC5pbnRlbnNpdHkg
PSB0aGlzLmludGVuc2l0eTsKKworCQkJaWYgKCB0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmlu
ZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3IuZ2V0SGV4KCk7
CisKKwkJCWlmICggdGhpcy5kaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGlz
dGFuY2UgPSB0aGlzLmRpc3RhbmNlOworCQkJaWYgKCB0aGlzLmFuZ2xlICE9PSB1bmRlZmluZWQg
KSBkYXRhLm9iamVjdC5hbmdsZSA9IHRoaXMuYW5nbGU7CisJCQlpZiAoIHRoaXMuZGVjYXkgIT09
IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRlY2F5ID0gdGhpcy5kZWNheTsKKwkJCWlmICggdGhp
cy5wZW51bWJyYSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QucGVudW1icmEgPSB0aGlzLnBl
bnVtYnJhOworCisJCQlpZiAoIHRoaXMuc2hhZG93ICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVj
dC5zaGFkb3cgPSB0aGlzLnNoYWRvdy50b0pTT04oKTsKKworCQkJcmV0dXJuIGRhdGE7CisKKwkJ
fQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVk
cXVhbGlhLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEhlbWlzcGhlcmVMaWdodCggc2t5Q29sb3Is
IGdyb3VuZENvbG9yLCBpbnRlbnNpdHkgKSB7CisKKwkJTGlnaHQuY2FsbCggdGhpcywgc2t5Q29s
b3IsIGludGVuc2l0eSApOworCisJCXRoaXMudHlwZSA9ICdIZW1pc3BoZXJlTGlnaHQnOworCisJ
CXRoaXMuY2FzdFNoYWRvdyA9IHVuZGVmaW5lZDsKKworCQl0aGlzLnBvc2l0aW9uLmNvcHkoIE9i
amVjdDNELkRlZmF1bHRVcCApOworCQl0aGlzLnVwZGF0ZU1hdHJpeCgpOworCisJCXRoaXMuZ3Jv
dW5kQ29sb3IgPSBuZXcgQ29sb3IoIGdyb3VuZENvbG9yICk7CisKKwl9CisKKwlIZW1pc3BoZXJl
TGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJv
dG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogSGVtaXNwaGVyZUxpZ2h0LAorCisJCWlzSGVt
aXNwaGVyZUxpZ2h0OiB0cnVlLAorCisJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisJ
CQlMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworCQkJdGhpcy5n
cm91bmRDb2xvci5jb3B5KCBzb3VyY2UuZ3JvdW5kQ29sb3IgKTsKKworCQkJcmV0dXJuIHRoaXM7
CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJk
b29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIExpZ2h0U2hhZG93KCBjYW1lcmEgKSB7CisKKwkJ
dGhpcy5jYW1lcmEgPSBjYW1lcmE7CisKKwkJdGhpcy5iaWFzID0gMDsKKwkJdGhpcy5yYWRpdXMg
PSAxOworCisJCXRoaXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCA1MTIsIDUxMiApOworCisJCXRo
aXMubWFwID0gbnVsbDsKKwkJdGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpOworCisJfQorCisJ
T2JqZWN0LmFzc2lnbiggTGlnaHRTaGFkb3cucHJvdG90eXBlLCB7CisKKwkJY29weTogZnVuY3Rp
b24gKCBzb3VyY2UgKSB7CisKKwkJCXRoaXMuY2FtZXJhID0gc291cmNlLmNhbWVyYS5jbG9uZSgp
OworCisJCQl0aGlzLmJpYXMgPSBzb3VyY2UuYmlhczsKKwkJCXRoaXMucmFkaXVzID0gc291cmNl
LnJhZGl1czsKKworCQkJdGhpcy5tYXBTaXplLmNvcHkoIHNvdXJjZS5tYXBTaXplICk7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0
dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOworCisJCX0sCisKKwkJdG9K
U09OOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBvYmplY3QgPSB7fTsKKworCQkJaWYgKCB0aGlz
LmJpYXMgIT09IDAgKSBvYmplY3QuYmlhcyA9IHRoaXMuYmlhczsKKwkJCWlmICggdGhpcy5yYWRp
dXMgIT09IDEgKSBvYmplY3QucmFkaXVzID0gdGhpcy5yYWRpdXM7CisJCQlpZiAoIHRoaXMubWFw
U2l6ZS54ICE9PSA1MTIgfHwgdGhpcy5tYXBTaXplLnkgIT09IDUxMiApIG9iamVjdC5tYXBTaXpl
ID0gdGhpcy5tYXBTaXplLnRvQXJyYXkoKTsKKworCQkJb2JqZWN0LmNhbWVyYSA9IHRoaXMuY2Ft
ZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7CisJCQlkZWxldGUgb2JqZWN0LmNhbWVyYS5tYXRy
aXg7CisKKwkJCXJldHVybiBvYmplY3Q7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1
dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFNwb3RM
aWdodFNoYWRvdygpIHsKKworCQlMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgUGVyc3BlY3Rp
dmVDYW1lcmEoIDUwLCAxLCAwLjUsIDUwMCApICk7CisKKwl9CisKKwlTcG90TGlnaHRTaGFkb3cu
cHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHRTaGFkb3cucHJv
dG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogU3BvdExpZ2h0U2hhZG93LAorCisJCWlzU3Bv
dExpZ2h0U2hhZG93OiB0cnVlLAorCisJCXVwZGF0ZTogZnVuY3Rpb24gKCBsaWdodCApIHsKKwor
CQkJdmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhOworCisJCQl2YXIgZm92ID0gX01hdGguUkFEMkRF
RyAqIDIgKiBsaWdodC5hbmdsZTsKKwkJCXZhciBhc3BlY3QgPSB0aGlzLm1hcFNpemUud2lkdGgg
LyB0aGlzLm1hcFNpemUuaGVpZ2h0OworCQkJdmFyIGZhciA9IGxpZ2h0LmRpc3RhbmNlIHx8IGNh
bWVyYS5mYXI7CisKKwkJCWlmICggZm92ICE9PSBjYW1lcmEuZm92IHx8IGFzcGVjdCAhPT0gY2Ft
ZXJhLmFzcGVjdCB8fCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7CisKKwkJCQljYW1lcmEuZm92ID0g
Zm92OworCQkJCWNhbWVyYS5hc3BlY3QgPSBhc3BlY3Q7CisJCQkJY2FtZXJhLmZhciA9IGZhcjsK
KwkJCQljYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOworCisJCQl9CisKKwkJfQorCisJ
fSApOworCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlh
LmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFNwb3RMaWdodCggY29sb3IsIGludGVuc2l0eSwgZGlz
dGFuY2UsIGFuZ2xlLCBwZW51bWJyYSwgZGVjYXkgKSB7CisKKwkJTGlnaHQuY2FsbCggdGhpcywg
Y29sb3IsIGludGVuc2l0eSApOworCisJCXRoaXMudHlwZSA9ICdTcG90TGlnaHQnOworCisJCXRo
aXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7CisJCXRoaXMudXBkYXRlTWF0
cml4KCk7CisKKwkJdGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTsKKworCQlPYmplY3QuZGVm
aW5lUHJvcGVydHkoIHRoaXMsICdwb3dlcicsIHsKKwkJCWdldDogZnVuY3Rpb24gKCkgeworCQkJ
CS8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS4KKwkJCQkvLyByZWY6IGVxdWF0
aW9uICgxNykgZnJvbSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3AtY29udGVudC91cGxvYWRz
LzIwMTQvMTEvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyLnBkZgorCQkJCXJl
dHVybiB0aGlzLmludGVuc2l0eSAqIE1hdGguUEk7CisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbiAo
IHBvd2VyICkgeworCQkJCS8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS4KKwkJ
CQkvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3At
Y29udGVudC91cGxvYWRzLzIwMTQvMTEvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9f
cGJyLnBkZgorCQkJCXRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyBNYXRoLlBJOworCQkJfQorCQl9
ICk7CisKKwkJdGhpcy5kaXN0YW5jZSA9ICggZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApID8gZGlz
dGFuY2UgOiAwOworCQl0aGlzLmFuZ2xlID0gKCBhbmdsZSAhPT0gdW5kZWZpbmVkICkgPyBhbmds
ZSA6IE1hdGguUEkgLyAzOworCQl0aGlzLnBlbnVtYnJhID0gKCBwZW51bWJyYSAhPT0gdW5kZWZp
bmVkICkgPyBwZW51bWJyYSA6IDA7CisJCXRoaXMuZGVjYXkgPSAoIGRlY2F5ICE9PSB1bmRlZmlu
ZWQgKSA/IGRlY2F5IDogMTsJLy8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3Vs
ZCBiZSAyLgorCisJCXRoaXMuc2hhZG93ID0gbmV3IFNwb3RMaWdodFNoYWRvdygpOworCisJfQor
CisJU3BvdExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExp
Z2h0LnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IFNwb3RMaWdodCwKKworCQlpc1Nw
b3RMaWdodDogdHJ1ZSwKKworCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworCQkJTGln
aHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CisKKwkJCXRoaXMuZGlzdGFu
Y2UgPSBzb3VyY2UuZGlzdGFuY2U7CisJCQl0aGlzLmFuZ2xlID0gc291cmNlLmFuZ2xlOworCQkJ
dGhpcy5wZW51bWJyYSA9IHNvdXJjZS5wZW51bWJyYTsKKwkJCXRoaXMuZGVjYXkgPSBzb3VyY2Uu
ZGVjYXk7CisKKwkJCXRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpOworCisJCQl0
aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29i
LmNvbS8KKwkgKi8KKworCisJZnVuY3Rpb24gUG9pbnRMaWdodCggY29sb3IsIGludGVuc2l0eSwg
ZGlzdGFuY2UsIGRlY2F5ICkgeworCisJCUxpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNp
dHkgKTsKKworCQl0aGlzLnR5cGUgPSAnUG9pbnRMaWdodCc7CisKKwkJT2JqZWN0LmRlZmluZVBy
b3BlcnR5KCB0aGlzLCAncG93ZXInLCB7CisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKwkJCQkvLyBp
bnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuCisJCQkJLy8gcmVmOiBlcXVhdGlvbiAo
MTUpIGZyb20gaHR0cDovL3d3dy5mcm9zdGJpdGUuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE0
LzExL2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bici5wZGYKKwkJCQlyZXR1cm4g
dGhpcy5pbnRlbnNpdHkgKiA0ICogTWF0aC5QSTsKKworCQkJfSwKKwkJCXNldDogZnVuY3Rpb24g
KCBwb3dlciApIHsKKwkJCQkvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuCisJ
CQkJLy8gcmVmOiBlcXVhdGlvbiAoMTUpIGZyb20gaHR0cDovL3d3dy5mcm9zdGJpdGUuY29tL3dw
LWNvbnRlbnQvdXBsb2Fkcy8yMDE0LzExL2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3Rv
X3Bici5wZGYKKwkJCQl0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCA0ICogTWF0aC5QSSApOwor
CQkJfQorCQl9ICk7CisKKwkJdGhpcy5kaXN0YW5jZSA9ICggZGlzdGFuY2UgIT09IHVuZGVmaW5l
ZCApID8gZGlzdGFuY2UgOiAwOworCQl0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5kZWZpbmVk
ICkgPyBkZWNheSA6IDE7CS8vIGZvciBwaHlzaWNhbGx5IGNvcnJlY3QgbGlnaHRzLCBzaG91bGQg
YmUgMi4KKworCQl0aGlzLnNoYWRvdyA9IG5ldyBMaWdodFNoYWRvdyggbmV3IFBlcnNwZWN0aXZl
Q2FtZXJhKCA5MCwgMSwgMC41LCA1MDAgKSApOworCisJfQorCisJUG9pbnRMaWdodC5wcm90b3R5
cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwgewor
CisJCWNvbnN0cnVjdG9yOiBQb2ludExpZ2h0LAorCisJCWlzUG9pbnRMaWdodDogdHJ1ZSwKKwor
CQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworCQkJTGlnaHQucHJvdG90eXBlLmNvcHku
Y2FsbCggdGhpcywgc291cmNlICk7CisKKwkJCXRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFu
Y2U7CisJCQl0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5OworCisJCQl0aGlzLnNoYWRvdyA9IHNv
dXJjZS5zaGFkb3cuY2xvbmUoKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfQorCisJfSApOwor
CisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKwor
CWZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHRTaGFkb3coICkgeworCisJCUxpZ2h0U2hhZG93LmNh
bGwoIHRoaXMsIG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gNSwgNSwgNSwgLSA1LCAwLjUsIDUw
MCApICk7CisKKwl9CisKKwlEaXJlY3Rpb25hbExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVj
dC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7CisKKwkJ
Y29uc3RydWN0b3I6IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cKKworCX0gKTsKKworCS8qKgorCSAq
IEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBhbHRlcmVk
cSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIERpcmVjdGlv
bmFsTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7CisKKwkJTGlnaHQuY2FsbCggdGhpcywgY29s
b3IsIGludGVuc2l0eSApOworCisJCXRoaXMudHlwZSA9ICdEaXJlY3Rpb25hbExpZ2h0JzsKKwor
CQl0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApOworCQl0aGlzLnVwZGF0
ZU1hdHJpeCgpOworCisJCXRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7CisKKwkJdGhpcy5z
aGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpOworCisJfQorCisJRGlyZWN0aW9u
YWxMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5w
cm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBEaXJlY3Rpb25hbExpZ2h0LAorCisJCWlz
RGlyZWN0aW9uYWxMaWdodDogdHJ1ZSwKKworCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsK
KworCQkJTGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CisKKwkJCXRo
aXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpOworCisJCQl0aGlzLnNoYWRvdyA9IHNv
dXJjZS5zaGFkb3cuY2xvbmUoKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfQorCisJfSApOwor
CisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKwor
CWZ1bmN0aW9uIEFtYmllbnRMaWdodCggY29sb3IsIGludGVuc2l0eSApIHsKKworCQlMaWdodC5j
YWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7CisKKwkJdGhpcy50eXBlID0gJ0FtYmllbnRM
aWdodCc7CisKKwkJdGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkOworCisJfQorCisJQW1iaWVu
dExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnBy
b3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IEFtYmllbnRMaWdodCwKKworCQlpc0FtYmll
bnRMaWdodDogdHJ1ZQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBhYmVsbmF0aW9uIC8g
aHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvbgorCSAqLworCisJZnVuY3Rpb24gUmVjdEFyZWFM
aWdodCggY29sb3IsIGludGVuc2l0eSwgd2lkdGgsIGhlaWdodCApIHsKKworCQlMaWdodC5jYWxs
KCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7CisKKwkJdGhpcy50eXBlID0gJ1JlY3RBcmVhTGln
aHQnOworCisJCXRoaXMucG9zaXRpb24uc2V0KCAwLCAxLCAwICk7CisJCXRoaXMudXBkYXRlTWF0
cml4KCk7CisKKwkJdGhpcy53aWR0aCA9ICggd2lkdGggIT09IHVuZGVmaW5lZCApID8gd2lkdGgg
OiAxMDsKKwkJdGhpcy5oZWlnaHQgPSAoIGhlaWdodCAhPT0gdW5kZWZpbmVkICkgPyBoZWlnaHQg
OiAxMDsKKworCQkvLyBUT0RPIChhYmVsbmF0aW9uKTogZGlzdGFuY2UvZGVjYXkKKworCQkvLyBU
T0RPIChhYmVsbmF0aW9uKTogdXBkYXRlIG1ldGhvZCBmb3IgUmVjdEFyZWFMaWdodCB0byB1cGRh
dGUgdHJhbnNmb3JtIHRvIGxvb2thdCB0YXJnZXQKKworCQkvLyBUT0RPIChhYmVsbmF0aW9uKTog
c2hhZG93cworCisJfQorCisJLy8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgdXBk
YXRlIHdoZW4gbGlnaHQgc2hhcGUgaXMgY2hhbmdlZAorCVJlY3RBcmVhTGlnaHQucHJvdG90eXBl
ID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHsKKwor
CQljb25zdHJ1Y3RvcjogUmVjdEFyZWFMaWdodCwKKworCQlpc1JlY3RBcmVhTGlnaHQ6IHRydWUs
CisKKwkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJCUxpZ2h0LnByb3RvdHlwZS5j
b3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOworCisJCQl0aGlzLndpZHRoID0gc291cmNlLndpZHRo
OworCQkJdGhpcy5oZWlnaHQgPSBzb3VyY2UuaGVpZ2h0OworCisJCQlyZXR1cm4gdGhpczsKKwor
CQl9LAorCisJCXRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkgeworCisJCQl2YXIgZGF0YSA9IExp
Z2h0LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApOworCisJCQlkYXRhLm9iamVj
dC53aWR0aCA9IHRoaXMud2lkdGg7CisJCQlkYXRhLm9iamVjdC5oZWlnaHQgPSB0aGlzLmhlaWdo
dDsKKworCQkJcmV0dXJuIGRhdGE7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhv
ciB0c2NodworCSAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCisJICog
QGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCisJICovCisKKwl2YXIg
QW5pbWF0aW9uVXRpbHMgPSB7CisKKwkJLy8gc2FtZSBhcyBBcnJheS5wcm90b3R5cGUuc2xpY2Us
IGJ1dCBhbHNvIHdvcmtzIG9uIHR5cGVkIGFycmF5cworCQlhcnJheVNsaWNlOiBmdW5jdGlvbiAo
IGFycmF5LCBmcm9tLCB0byApIHsKKworCQkJaWYgKCBBbmltYXRpb25VdGlscy5pc1R5cGVkQXJy
YXkoIGFycmF5ICkgKSB7CisKKwkJCQkvLyBpbiBpb3M5IGFycmF5LnN1YmFycmF5KGZyb20sIHVu
ZGVmaW5lZCkgd2lsbCByZXR1cm4gZW1wdHkgYXJyYXkKKwkJCQkvLyBidXQgYXJyYXkuc3ViYXJy
YXkoZnJvbSkgb3IgYXJyYXkuc3ViYXJyYXkoZnJvbSwgbGVuKSBpcyBjb3JyZWN0CisJCQkJcmV0
dXJuIG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYXJyYXkuc3ViYXJyYXkoIGZyb20sIHRvICE9PSB1
bmRlZmluZWQgPyB0byA6IGFycmF5Lmxlbmd0aCApICk7CisKKwkJCX0KKworCQkJcmV0dXJuIGFy
cmF5LnNsaWNlKCBmcm9tLCB0byApOworCisJCX0sCisKKwkJLy8gY29udmVydHMgYW4gYXJyYXkg
dG8gYSBzcGVjaWZpYyB0eXBlCisJCWNvbnZlcnRBcnJheTogZnVuY3Rpb24gKCBhcnJheSwgdHlw
ZSwgZm9yY2VDbG9uZSApIHsKKworCQkJaWYgKCAhIGFycmF5IHx8IC8vIGxldCAndW5kZWZpbmVk
JyBhbmQgJ251bGwnIHBhc3MKKwkJCQkJISBmb3JjZUNsb25lICYmIGFycmF5LmNvbnN0cnVjdG9y
ID09PSB0eXBlICkgcmV0dXJuIGFycmF5OworCisJCQlpZiAoIHR5cGVvZiB0eXBlLkJZVEVTX1BF
Ul9FTEVNRU5UID09PSAnbnVtYmVyJyApIHsKKworCQkJCXJldHVybiBuZXcgdHlwZSggYXJyYXkg
KTsgLy8gY3JlYXRlIHR5cGVkIGFycmF5CisKKwkJCX0KKworCQkJcmV0dXJuIEFycmF5LnByb3Rv
dHlwZS5zbGljZS5jYWxsKCBhcnJheSApOyAvLyBjcmVhdGUgQXJyYXkKKworCQl9LAorCisJCWlz
VHlwZWRBcnJheTogZnVuY3Rpb24gKCBvYmplY3QgKSB7CisKKwkJCXJldHVybiBBcnJheUJ1ZmZl
ci5pc1ZpZXcoIG9iamVjdCApICYmCisJCQkJCSEgKCBvYmplY3QgaW5zdGFuY2VvZiBEYXRhVmll
dyApOworCisJCX0sCisKKwkJLy8gcmV0dXJucyBhbiBhcnJheSBieSB3aGljaCB0aW1lcyBhbmQg
dmFsdWVzIGNhbiBiZSBzb3J0ZWQKKwkJZ2V0S2V5ZnJhbWVPcmRlcjogZnVuY3Rpb24gKCB0aW1l
cyApIHsKKworCQkJZnVuY3Rpb24gY29tcGFyZVRpbWUoIGksIGogKSB7CisKKwkJCQlyZXR1cm4g
dGltZXNbIGkgXSAtIHRpbWVzWyBqIF07CisKKwkJCX0KKworCQkJdmFyIG4gPSB0aW1lcy5sZW5n
dGg7CisJCQl2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCBuICk7CisJCQlmb3IgKCB2YXIgaSA9IDA7
IGkgIT09IG47ICsrIGkgKSByZXN1bHRbIGkgXSA9IGk7CisKKwkJCXJlc3VsdC5zb3J0KCBjb21w
YXJlVGltZSApOworCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0sCisKKwkJLy8gdXNlcyB0aGUg
YXJyYXkgcHJldmlvdXNseSByZXR1cm5lZCBieSAnZ2V0S2V5ZnJhbWVPcmRlcicgdG8gc29ydCBk
YXRhCisJCXNvcnRlZEFycmF5OiBmdW5jdGlvbiAoIHZhbHVlcywgc3RyaWRlLCBvcmRlciApIHsK
KworCQkJdmFyIG5WYWx1ZXMgPSB2YWx1ZXMubGVuZ3RoOworCQkJdmFyIHJlc3VsdCA9IG5ldyB2
YWx1ZXMuY29uc3RydWN0b3IoIG5WYWx1ZXMgKTsKKworCQkJZm9yICggdmFyIGkgPSAwLCBkc3RP
ZmZzZXQgPSAwOyBkc3RPZmZzZXQgIT09IG5WYWx1ZXM7ICsrIGkgKSB7CisKKwkJCQl2YXIgc3Jj
T2Zmc2V0ID0gb3JkZXJbIGkgXSAqIHN0cmlkZTsKKworCQkJCWZvciAoIHZhciBqID0gMDsgaiAh
PT0gc3RyaWRlOyArKyBqICkgeworCisJCQkJCXJlc3VsdFsgZHN0T2Zmc2V0ICsrIF0gPSB2YWx1
ZXNbIHNyY09mZnNldCArIGogXTsKKworCQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0
OworCisJCX0sCisKKwkJLy8gZnVuY3Rpb24gZm9yIHBhcnNpbmcgQU9TIGtleWZyYW1lIGZvcm1h
dHMKKwkJZmxhdHRlbkpTT046IGZ1bmN0aW9uICgganNvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHZh
bHVlUHJvcGVydHlOYW1lICkgeworCisJCQl2YXIgaSA9IDEsIGtleSA9IGpzb25LZXlzWyAwIF07
CisKKwkJCXdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5WyB2YWx1ZVByb3BlcnR5TmFt
ZSBdID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQlrZXkgPSBqc29uS2V5c1sgaSArKyBdOworCisJ
CQl9CisKKwkJCWlmICgga2V5ID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG5vIGRhdGEKKwor
CQkJdmFyIHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdOworCQkJaWYgKCB2YWx1ZSA9
PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhCisKKwkJCWlmICggQXJyYXkuaXNBcnJh
eSggdmFsdWUgKSApIHsKKworCQkJCWRvIHsKKworCQkJCQl2YWx1ZSA9IGtleVsgdmFsdWVQcm9w
ZXJ0eU5hbWUgXTsKKworCQkJCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJ
CXRpbWVzLnB1c2goIGtleS50aW1lICk7CisJCQkJCQl2YWx1ZXMucHVzaC5hcHBseSggdmFsdWVz
LCB2YWx1ZSApOyAvLyBwdXNoIGFsbCBlbGVtZW50cworCisJCQkJCX0KKworCQkJCQlrZXkgPSBq
c29uS2V5c1sgaSArKyBdOworCisJCQkJfSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7CisK
KwkJCX0gZWxzZSBpZiAoIHZhbHVlLnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCS8v
IC4uLmFzc3VtZSBUSFJFRS5NYXRoLWlzaAorCisJCQkJZG8geworCisJCQkJCXZhbHVlID0ga2V5
WyB2YWx1ZVByb3BlcnR5TmFtZSBdOworCisJCQkJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCAp
IHsKKworCQkJCQkJdGltZXMucHVzaCgga2V5LnRpbWUgKTsKKwkJCQkJCXZhbHVlLnRvQXJyYXko
IHZhbHVlcywgdmFsdWVzLmxlbmd0aCApOworCisJCQkJCX0KKworCQkJCQlrZXkgPSBqc29uS2V5
c1sgaSArKyBdOworCisJCQkJfSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7CisKKwkJCX0g
ZWxzZSB7CisKKwkJCQkvLyBvdGhlcndpc2UgcHVzaCBhcy1pcworCisJCQkJZG8geworCisJCQkJ
CXZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdOworCisJCQkJCWlmICggdmFsdWUgIT09
IHVuZGVmaW5lZCApIHsKKworCQkJCQkJdGltZXMucHVzaCgga2V5LnRpbWUgKTsKKwkJCQkJCXZh
bHVlcy5wdXNoKCB2YWx1ZSApOworCisJCQkJCX0KKworCQkJCQlrZXkgPSBqc29uS2V5c1sgaSAr
KyBdOworCisJCQkJfSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7CisKKwkJCX0KKworCQl9
CisKKwl9OworCisJLyoqCisJICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBpbnRlcnBvbGFudHMg
b3ZlciBwYXJhbWV0cmljIHNhbXBsZXMuCisJICoKKwkgKiBUaGUgcGFyYW1ldGVyIGRvbWFpbiBp
cyBvbmUgZGltZW5zaW9uYWwsIHR5cGljYWxseSB0aGUgdGltZSBvciBhIHBhdGgKKwkgKiBhbG9u
ZyBhIGN1cnZlIGRlZmluZWQgYnkgdGhlIGRhdGEuCisJICoKKwkgKiBUaGUgc2FtcGxlIHZhbHVl
cyBjYW4gaGF2ZSBhbnkgZGltZW5zaW9uYWxpdHkgYW5kIGRlcml2ZWQgY2xhc3NlcyBtYXkKKwkg
KiBhcHBseSBzcGVjaWFsIGludGVycHJldGF0aW9ucyB0byB0aGUgZGF0YS4KKwkgKgorCSAqIFRo
aXMgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVydmFsIHNlZWsgaW4gYSBUZW1wbGF0ZSBNZXRob2Qs
IGRlZmVycmluZworCSAqIHRoZSBhY3R1YWwgaW50ZXJwb2xhdGlvbiB0byBkZXJpdmVkIGNsYXNz
ZXMuCisJICoKKwkgKiBUaW1lIGNvbXBsZXhpdHkgaXMgTygxKSBmb3IgbGluZWFyIGFjY2VzcyBj
cm9zc2luZyBhdCBtb3N0IHR3byBwb2ludHMKKwkgKiBhbmQgTyhsb2cgTikgZm9yIHJhbmRvbSBh
Y2Nlc3MsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbnMuCisJICoKKwkgKiBSZWZl
cmVuY2VzOgorCSAqCisJICogCQlodHRwOi8vd3d3Lm9vZGVzaWduLmNvbS90ZW1wbGF0ZS1tZXRo
b2QtcGF0dGVybi5odG1sCisJICoKKwkgKiBAYXV0aG9yIHRzY2h3CisJICovCisKKwlmdW5jdGlv
biBJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNp
emUsIHJlc3VsdEJ1ZmZlciApIHsKKworCQl0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyA9IHBhcmFt
ZXRlclBvc2l0aW9uczsKKwkJdGhpcy5fY2FjaGVkSW5kZXggPSAwOworCisJCXRoaXMucmVzdWx0
QnVmZmVyID0gcmVzdWx0QnVmZmVyICE9PSB1bmRlZmluZWQgPworCQkJCXJlc3VsdEJ1ZmZlciA6
IG5ldyBzYW1wbGVWYWx1ZXMuY29uc3RydWN0b3IoIHNhbXBsZVNpemUgKTsKKwkJdGhpcy5zYW1w
bGVWYWx1ZXMgPSBzYW1wbGVWYWx1ZXM7CisJCXRoaXMudmFsdWVTaXplID0gc2FtcGxlU2l6ZTsK
KworCX0KKworCU9iamVjdC5hc3NpZ24oIEludGVycG9sYW50LnByb3RvdHlwZSwgeworCisJCWV2
YWx1YXRlOiBmdW5jdGlvbiggdCApIHsKKworCQkJdmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3Np
dGlvbnMsCisJCQkJaTEgPSB0aGlzLl9jYWNoZWRJbmRleCwKKworCQkJCXQxID0gcHBbICAgaTEg
ICBdLAorCQkJCXQwID0gcHBbIGkxIC0gMSBdOworCisJCQl2YWxpZGF0ZV9pbnRlcnZhbDogewor
CisJCQkJc2VlazogeworCisJCQkJCXZhciByaWdodDsKKworCQkJCQlsaW5lYXJfc2Nhbjogewor
CQkJCQkJLy8tIFNlZSBodHRwOi8vanNwZXJmLmNvbS9jb21wYXJpc29uLXRvLXVuZGVmaW5lZC8z
CisJCQkJCQkvLy0gc2xvd2VyIGNvZGU6CisJCQkJCQkvLy0KKwkJCQkJCS8vLSAJCQkJaWYgKCB0
ID49IHQxIHx8IHQxID09PSB1bmRlZmluZWQgKSB7CisJCQkJCQlmb3J3YXJkX3NjYW46IGlmICgg
ISAoIHQgPCB0MSApICkgeworCisJCQkJCQkJZm9yICggdmFyIGdpdmVVcEF0ID0gaTEgKyAyOyA7
KSB7CisKKwkJCQkJCQkJaWYgKCB0MSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCQkJCQlpZiAo
IHQgPCB0MCApIGJyZWFrIGZvcndhcmRfc2NhbjsKKworCQkJCQkJCQkJLy8gYWZ0ZXIgZW5kCisK
KwkJCQkJCQkJCWkxID0gcHAubGVuZ3RoOworCQkJCQkJCQkJdGhpcy5fY2FjaGVkSW5kZXggPSBp
MTsKKwkJCQkJCQkJCXJldHVybiB0aGlzLmFmdGVyRW5kXyggaTEgLSAxLCB0LCB0MCApOworCisJ
CQkJCQkJCX0KKworCQkJCQkJCQlpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlz
IGxvb3AKKworCQkJCQkJCQl0MCA9IHQxOworCQkJCQkJCQl0MSA9IHBwWyArKyBpMSBdOworCisJ
CQkJCQkJCWlmICggdCA8IHQxICkgeworCisJCQkJCQkJCQkvLyB3ZSBoYXZlIGFycml2ZWQgYXQg
dGhlIHNvdWdodCBpbnRlcnZhbAorCQkJCQkJCQkJYnJlYWsgc2VlazsKKworCQkJCQkJCQl9CisK
KwkJCQkJCQl9CisKKwkJCQkJCQkvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIHJpZ2h0
IHNpZGUgb2YgdGhlIGluZGV4CisJCQkJCQkJcmlnaHQgPSBwcC5sZW5ndGg7CisJCQkJCQkJYnJl
YWsgbGluZWFyX3NjYW47CisKKwkJCQkJCX0KKworCQkJCQkJLy8tIHNsb3dlciBjb2RlOgorCQkJ
CQkJLy8tCQkJCQlpZiAoIHQgPCB0MCB8fCB0MCA9PT0gdW5kZWZpbmVkICkgeworCQkJCQkJaWYg
KCAhICggdCA+PSB0MCApICkgeworCisJCQkJCQkJLy8gbG9vcGluZz8KKworCQkJCQkJCXZhciB0
MWdsb2JhbCA9IHBwWyAxIF07CisKKwkJCQkJCQlpZiAoIHQgPCB0MWdsb2JhbCApIHsKKworCQkJ
CQkJCQlpMSA9IDI7IC8vICsgMSwgdXNpbmcgdGhlIHNjYW4gZm9yIHRoZSBkZXRhaWxzCisJCQkJ
CQkJCXQwID0gdDFnbG9iYWw7CisKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBsaW5lYXIgcmV2ZXJz
ZSBzY2FuCisKKwkJCQkJCQlmb3IgKCB2YXIgZ2l2ZVVwQXQgPSBpMSAtIDI7IDspIHsKKworCQkJ
CQkJCQlpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCQkJCS8vIGJlZm9yZSBzdGFy
dAorCisJCQkJCQkJCQl0aGlzLl9jYWNoZWRJbmRleCA9IDA7CisJCQkJCQkJCQlyZXR1cm4gdGhp
cy5iZWZvcmVTdGFydF8oIDAsIHQsIHQxICk7CisKKwkJCQkJCQkJfQorCisJCQkJCQkJCWlmICgg
aTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcAorCisJCQkJCQkJCXQxID0gdDA7
CisJCQkJCQkJCXQwID0gcHBbIC0tIGkxIC0gMSBdOworCisJCQkJCQkJCWlmICggdCA+PSB0MCAp
IHsKKworCQkJCQkJCQkJLy8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWwK
KwkJCQkJCQkJCWJyZWFrIHNlZWs7CisKKwkJCQkJCQkJfQorCisJCQkJCQkJfQorCisJCQkJCQkJ
Ly8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGluZGV4CisJ
CQkJCQkJcmlnaHQgPSBpMTsKKwkJCQkJCQlpMSA9IDA7CisJCQkJCQkJYnJlYWsgbGluZWFyX3Nj
YW47CisKKwkJCQkJCX0KKworCQkJCQkJLy8gdGhlIGludGVydmFsIGlzIHZhbGlkCisKKwkJCQkJ
CWJyZWFrIHZhbGlkYXRlX2ludGVydmFsOworCisJCQkJCX0gLy8gbGluZWFyIHNjYW4KKworCQkJ
CQkvLyBiaW5hcnkgc2VhcmNoCisKKwkJCQkJd2hpbGUgKCBpMSA8IHJpZ2h0ICkgeworCisJCQkJ
CQl2YXIgbWlkID0gKCBpMSArIHJpZ2h0ICkgPj4+IDE7CisKKwkJCQkJCWlmICggdCA8IHBwWyBt
aWQgXSApIHsKKworCQkJCQkJCXJpZ2h0ID0gbWlkOworCisJCQkJCQl9IGVsc2UgeworCisJCQkJ
CQkJaTEgPSBtaWQgKyAxOworCisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJCXQxID0gcHBbICAg
aTEgICBdOworCQkJCQl0MCA9IHBwWyBpMSAtIDEgXTsKKworCQkJCQkvLyBjaGVjayBib3VuZGFy
eSBjYXNlcywgYWdhaW4KKworCQkJCQlpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJ
CXRoaXMuX2NhY2hlZEluZGV4ID0gMDsKKwkJCQkJCXJldHVybiB0aGlzLmJlZm9yZVN0YXJ0Xygg
MCwgdCwgdDEgKTsKKworCQkJCQl9CisKKwkJCQkJaWYgKCB0MSA9PT0gdW5kZWZpbmVkICkgewor
CisJCQkJCQlpMSA9IHBwLmxlbmd0aDsKKwkJCQkJCXRoaXMuX2NhY2hlZEluZGV4ID0gaTE7CisJ
CQkJCQlyZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdDAsIHQgKTsKKworCQkJCQl9CisK
KwkJCQl9IC8vIHNlZWsKKworCQkJCXRoaXMuX2NhY2hlZEluZGV4ID0gaTE7CisKKwkJCQl0aGlz
LmludGVydmFsQ2hhbmdlZF8oIGkxLCB0MCwgdDEgKTsKKworCQkJfSAvLyB2YWxpZGF0ZV9pbnRl
cnZhbAorCisJCQlyZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKTsKKwor
CQl9LAorCisJCXNldHRpbmdzOiBudWxsLCAvLyBvcHRpb25hbCwgc3ViY2xhc3Mtc3BlY2lmaWMg
c2V0dGluZ3Mgc3RydWN0dXJlCisJCS8vIE5vdGU6IFRoZSBpbmRpcmVjdGlvbiBhbGxvd3MgY2Vu
dHJhbCBjb250cm9sIG9mIG1hbnkgaW50ZXJwb2xhbnRzLgorCisJCS8vIC0tLSBQcm90ZWN0ZWQg
aW50ZXJmYWNlCisKKwkJRGVmYXVsdFNldHRpbmdzXzoge30sCisKKwkJZ2V0U2V0dGluZ3NfOiBm
dW5jdGlvbigpIHsKKworCQkJcmV0dXJuIHRoaXMuc2V0dGluZ3MgfHwgdGhpcy5EZWZhdWx0U2V0
dGluZ3NfOworCisJCX0sCisKKwkJY29weVNhbXBsZVZhbHVlXzogZnVuY3Rpb24oIGluZGV4ICkg
eworCisJCQkvLyBjb3BpZXMgYSBzYW1wbGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBidWZmZXIKKwor
CQkJdmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLAorCQkJCXZhbHVlcyA9IHRoaXMuc2Ft
cGxlVmFsdWVzLAorCQkJCXN0cmlkZSA9IHRoaXMudmFsdWVTaXplLAorCQkJCW9mZnNldCA9IGlu
ZGV4ICogc3RyaWRlOworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSAp
IHsKKworCQkJCXJlc3VsdFsgaSBdID0gdmFsdWVzWyBvZmZzZXQgKyBpIF07CisKKwkJCX0KKwor
CQkJcmV0dXJuIHJlc3VsdDsKKworCQl9LAorCisJCS8vIFRlbXBsYXRlIG1ldGhvZHMgZm9yIGRl
cml2ZWQgY2xhc3NlczoKKworCQlpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uKCBpMSwgdDAsIHQsIHQx
ICkgeworCisJCQl0aHJvdyBuZXcgRXJyb3IoICJjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCIgKTsK
KwkJCS8vIGltcGxlbWVudGF0aW9ucyBzaGFsbCByZXR1cm4gdGhpcy5yZXN1bHRCdWZmZXIKKwor
CQl9LAorCisJCWludGVydmFsQ2hhbmdlZF86IGZ1bmN0aW9uKCBpMSwgdDAsIHQxICkgeworCisJ
CQkvLyBlbXB0eQorCisJCX0KKworCX0gKTsKKworCS8vIVwgREVDTEFSRSBBTElBUyBBRlRFUiBh
c3NpZ24gcHJvdG90eXBlICEKKwlPYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUs
IHsKKworCQkvLyggMCwgdCwgdDAgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlcgorCQliZWZv
cmVTdGFydF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLAorCisJCS8v
KCBOLTEsIHROLTEsIHQgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlcgorCQlhZnRlckVuZF86
IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLAorCisJfSApOworCisJLyoq
CisJICogRmFzdCBhbmQgc2ltcGxlIGN1YmljIHNwbGluZSBpbnRlcnBvbGFudC4KKwkgKgorCSAq
IEl0IHdhcyBkZXJpdmVkIGZyb20gYSBIZXJtaXRpYW4gY29uc3RydWN0aW9uIHNldHRpbmcgdGhl
IGZpcnN0IGRlcml2YXRpdmUKKwkgKiBhdCBlYWNoIHNhbXBsZSBwb3NpdGlvbiB0byB0aGUgbGlu
ZWFyIHNsb3BlIGJldHdlZW4gbmVpZ2hib3JpbmcgcG9zaXRpb25zCisJICogb3ZlciB0aGVpciBw
YXJhbWV0ZXIgaW50ZXJ2YWwuCisJICoKKwkgKiBAYXV0aG9yIHRzY2h3CisJICovCisKKwlmdW5j
dGlvbiBDdWJpY0ludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywg
c2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkgeworCisJCUludGVycG9sYW50LmNhbGwoCisJCQkJ
dGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3Vs
dEJ1ZmZlciApOworCisJCXRoaXMuX3dlaWdodFByZXYgPSAtMDsKKwkJdGhpcy5fb2Zmc2V0UHJl
diA9IC0wOworCQl0aGlzLl93ZWlnaHROZXh0ID0gLTA7CisJCXRoaXMuX29mZnNldE5leHQgPSAt
MDsKKworCX0KKworCUN1YmljSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbigg
T2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3Rv
cjogQ3ViaWNJbnRlcnBvbGFudCwKKworCQlEZWZhdWx0U2V0dGluZ3NfOiB7CisKKwkJCWVuZGlu
Z1N0YXJ0OiAJWmVyb0N1cnZhdHVyZUVuZGluZywKKwkJCWVuZGluZ0VuZDoJCVplcm9DdXJ2YXR1
cmVFbmRpbmcKKworCQl9LAorCisJCWludGVydmFsQ2hhbmdlZF86IGZ1bmN0aW9uKCBpMSwgdDAs
IHQxICkgeworCisJCQl2YXIgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucywKKwkJCQlpUHJl
diA9IGkxIC0gMiwKKwkJCQlpTmV4dCA9IGkxICsgMSwKKworCQkJCXRQcmV2ID0gcHBbIGlQcmV2
IF0sCisJCQkJdE5leHQgPSBwcFsgaU5leHQgXTsKKworCQkJaWYgKCB0UHJldiA9PT0gdW5kZWZp
bmVkICkgeworCisJCQkJc3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdTdGFydCAp
IHsKKworCQkJCQljYXNlIFplcm9TbG9wZUVuZGluZzoKKworCQkJCQkJLy8gZicodDApID0gMAor
CQkJCQkJaVByZXYgPSBpMTsKKwkJCQkJCXRQcmV2ID0gMiAqIHQwIC0gdDE7CisKKwkJCQkJCWJy
ZWFrOworCisJCQkJCWNhc2UgV3JhcEFyb3VuZEVuZGluZzoKKworCQkJCQkJLy8gdXNlIHRoZSBv
dGhlciBlbmQgb2YgdGhlIGN1cnZlCisJCQkJCQlpUHJldiA9IHBwLmxlbmd0aCAtIDI7CisJCQkJ
CQl0UHJldiA9IHQwICsgcHBbIGlQcmV2IF0gLSBwcFsgaVByZXYgKyAxIF07CisKKwkJCQkJCWJy
ZWFrOworCisJCQkJCWRlZmF1bHQ6IC8vIFplcm9DdXJ2YXR1cmVFbmRpbmcKKworCQkJCQkJLy8g
ZicnKHQwKSA9IDAgYS5rLmEuIE5hdHVyYWwgU3BsaW5lCisJCQkJCQlpUHJldiA9IGkxOworCQkJ
CQkJdFByZXYgPSB0MTsKKworCQkJCX0KKworCQkJfQorCisJCQlpZiAoIHROZXh0ID09PSB1bmRl
ZmluZWQgKSB7CisKKwkJCQlzd2l0Y2ggKCB0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ0VuZCAp
IHsKKworCQkJCQljYXNlIFplcm9TbG9wZUVuZGluZzoKKworCQkJCQkJLy8gZicodE4pID0gMAor
CQkJCQkJaU5leHQgPSBpMTsKKwkJCQkJCXROZXh0ID0gMiAqIHQxIC0gdDA7CisKKwkJCQkJCWJy
ZWFrOworCisJCQkJCWNhc2UgV3JhcEFyb3VuZEVuZGluZzoKKworCQkJCQkJLy8gdXNlIHRoZSBv
dGhlciBlbmQgb2YgdGhlIGN1cnZlCisJCQkJCQlpTmV4dCA9IDE7CisJCQkJCQl0TmV4dCA9IHQx
ICsgcHBbIDEgXSAtIHBwWyAwIF07CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6IC8v
IFplcm9DdXJ2YXR1cmVFbmRpbmcKKworCQkJCQkJLy8gZicnKHROKSA9IDAsIGEuay5hLiBOYXR1
cmFsIFNwbGluZQorCQkJCQkJaU5leHQgPSBpMSAtIDE7CisJCQkJCQl0TmV4dCA9IHQwOworCisJ
CQkJfQorCisJCQl9CisKKwkJCXZhciBoYWxmRHQgPSAoIHQxIC0gdDAgKSAqIDAuNSwKKwkJCQlz
dHJpZGUgPSB0aGlzLnZhbHVlU2l6ZTsKKworCQkJdGhpcy5fd2VpZ2h0UHJldiA9IGhhbGZEdCAv
ICggdDAgLSB0UHJldiApOworCQkJdGhpcy5fd2VpZ2h0TmV4dCA9IGhhbGZEdCAvICggdE5leHQg
LSB0MSApOworCQkJdGhpcy5fb2Zmc2V0UHJldiA9IGlQcmV2ICogc3RyaWRlOworCQkJdGhpcy5f
b2Zmc2V0TmV4dCA9IGlOZXh0ICogc3RyaWRlOworCisJCX0sCisKKwkJaW50ZXJwb2xhdGVfOiBm
dW5jdGlvbiggaTEsIHQwLCB0LCB0MSApIHsKKworCQkJdmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0
QnVmZmVyLAorCQkJCXZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLAorCQkJCXN0cmlkZSA9IHRo
aXMudmFsdWVTaXplLAorCisJCQkJbzEgPSBpMSAqIHN0cmlkZSwJCW8wID0gbzEgLSBzdHJpZGUs
CisJCQkJb1AgPSB0aGlzLl9vZmZzZXRQcmV2LCAJb04gPSB0aGlzLl9vZmZzZXROZXh0LAorCQkJ
CXdQID0gdGhpcy5fd2VpZ2h0UHJldiwJd04gPSB0aGlzLl93ZWlnaHROZXh0LAorCisJCQkJcCA9
ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKSwKKwkJCQlwcCA9IHAgKiBwLAorCQkJCXBwcCA9IHBw
ICogcDsKKworCQkJLy8gZXZhbHVhdGUgcG9seW5vbWlhbHMKKworCQkJdmFyIHNQID0gICAgIC0g
d1AgICAqIHBwcCAgICsgICAgICAgICAyICogd1AgICAgKiBwcCAgICAtICAgICAgICAgIHdQICAg
KiBwOworCQkJdmFyIHMwID0gKCAxICsgd1AgKSAqIHBwcCAgICsgKC0xLjUgLSAyICogd1AgKSAg
KiBwcCAgICArICggLTAuNSArIHdQICkgKiBwICAgICArIDE7CisJCQl2YXIgczEgPSAoLTEgLSB3
TiApICogcHBwICAgKyAoIDEuNSArICAgd04gICApICAqIHBwICAgICsgICAgMC41ICAgICAgICAq
IHA7CisJCQl2YXIgc04gPSAgICAgICB3TiAgICogcHBwICAgLSAgICAgICAgICAgd04gICAgICAq
IHBwOworCisJCQkvLyBjb21iaW5lIGRhdGEgbGluZWFybHkKKworCQkJZm9yICggdmFyIGkgPSAw
OyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7CisKKwkJCQlyZXN1bHRbIGkgXSA9CisJCQkJCQlzUCAq
IHZhbHVlc1sgb1AgKyBpIF0gKworCQkJCQkJczAgKiB2YWx1ZXNbIG8wICsgaSBdICsKKwkJCQkJ
CXMxICogdmFsdWVzWyBvMSArIGkgXSArCisJCQkJCQlzTiAqIHZhbHVlc1sgb04gKyBpIF07CisK
KwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBA
YXV0aG9yIHRzY2h3CisJICovCisKKwlmdW5jdGlvbiBMaW5lYXJJbnRlcnBvbGFudCggcGFyYW1l
dGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHsK
KworCQlJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZh
bHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7CisKKwl9CisKKwlMaW5lYXJJbnRlcnBv
bGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFu
dC5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBMaW5lYXJJbnRlcnBvbGFudCwKKwor
CQlpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uKCBpMSwgdDAsIHQsIHQxICkgeworCisJCQl2YXIgcmVz
dWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsCisJCQkJdmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMs
CisJCQkJc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsCisKKwkJCQlvZmZzZXQxID0gaTEgKiBzdHJp
ZGUsCisJCQkJb2Zmc2V0MCA9IG9mZnNldDEgLSBzdHJpZGUsCisKKwkJCQl3ZWlnaHQxID0gKCB0
IC0gdDAgKSAvICggdDEgLSB0MCApLAorCQkJCXdlaWdodDAgPSAxIC0gd2VpZ2h0MTsKKworCQkJ
Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7CisKKwkJCQlyZXN1bHRbIGkg
XSA9CisJCQkJCQl2YWx1ZXNbIG9mZnNldDAgKyBpIF0gKiB3ZWlnaHQwICsKKwkJCQkJCXZhbHVl
c1sgb2Zmc2V0MSArIGkgXSAqIHdlaWdodDE7CisKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsK
KworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKgorCSAqIEludGVycG9sYW50IHRoYXQgZXZhbHVh
dGVzIHRvIHRoZSBzYW1wbGUgdmFsdWUgYXQgdGhlIHBvc2l0aW9uIHByZWNlZWRpbmcKKwkgKiB0
aGUgcGFyYW1ldGVyLgorCSAqCisJICogQGF1dGhvciB0c2NodworCSAqLworCisJZnVuY3Rpb24g
RGlzY3JldGVJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNh
bXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHsKKworCQlJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBw
YXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVy
ICk7CisKKwl9CisKKwlEaXNjcmV0ZUludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3Np
Z24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7CisKKwkJY29uc3Ry
dWN0b3I6IERpc2NyZXRlSW50ZXJwb2xhbnQsCisKKwkJaW50ZXJwb2xhdGVfOiBmdW5jdGlvbigg
aTEsIHQwLCB0LCB0MSApIHsKKworCQkJcmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEg
LSAxICk7CisKKwkJfQorCisJfSApOworCisJdmFyIEtleWZyYW1lVHJhY2tQcm90b3R5cGU7CisK
KwlLZXlmcmFtZVRyYWNrUHJvdG90eXBlID0geworCisJCVRpbWVCdWZmZXJUeXBlOiBGbG9hdDMy
QXJyYXksCisJCVZhbHVlQnVmZmVyVHlwZTogRmxvYXQzMkFycmF5LAorCisJCURlZmF1bHRJbnRl
cnBvbGF0aW9uOiBJbnRlcnBvbGF0ZUxpbmVhciwKKworCQlJbnRlcnBvbGFudEZhY3RvcnlNZXRo
b2REaXNjcmV0ZTogZnVuY3Rpb24gKCByZXN1bHQgKSB7CisKKwkJCXJldHVybiBuZXcgRGlzY3Jl
dGVJbnRlcnBvbGFudCgKKwkJCQkJdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFs
dWVTaXplKCksIHJlc3VsdCApOworCisJCX0sCisKKwkJSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9k
TGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHsKKworCQkJcmV0dXJuIG5ldyBMaW5lYXJJbnRl
cnBvbGFudCgKKwkJCQkJdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXpl
KCksIHJlc3VsdCApOworCisJCX0sCisKKwkJSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3Ro
OiBmdW5jdGlvbiAoIHJlc3VsdCApIHsKKworCQkJcmV0dXJuIG5ldyBDdWJpY0ludGVycG9sYW50
KAorCQkJCQl0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVz
dWx0ICk7CisKKwkJfSwKKworCQlzZXRJbnRlcnBvbGF0aW9uOiBmdW5jdGlvbiAoIGludGVycG9s
YXRpb24gKSB7CisKKwkJCXZhciBmYWN0b3J5TWV0aG9kOworCisJCQlzd2l0Y2ggKCBpbnRlcnBv
bGF0aW9uICkgeworCisJCQkJY2FzZSBJbnRlcnBvbGF0ZURpc2NyZXRlOgorCisJCQkJCWZhY3Rv
cnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOworCisJCQkJ
CWJyZWFrOworCisJCQkJY2FzZSBJbnRlcnBvbGF0ZUxpbmVhcjoKKworCQkJCQlmYWN0b3J5TWV0
aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7CisKKwkJCQkJYnJlYWs7
CisKKwkJCQljYXNlIEludGVycG9sYXRlU21vb3RoOgorCisJCQkJCWZhY3RvcnlNZXRob2QgPSB0
aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDsKKworCQkJCQlicmVhazsKKworCQkJ
fQorCisJCQlpZiAoIGZhY3RvcnlNZXRob2QgPT09IHVuZGVmaW5lZCApIHsKKworCQkJCXZhciBt
ZXNzYWdlID0gInVuc3VwcG9ydGVkIGludGVycG9sYXRpb24gZm9yICIgKworCQkJCQkJdGhpcy5W
YWx1ZVR5cGVOYW1lICsgIiBrZXlmcmFtZSB0cmFjayBuYW1lZCAiICsgdGhpcy5uYW1lOworCisJ
CQkJaWYgKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJ
Ly8gZmFsbCBiYWNrIHRvIGRlZmF1bHQsIHVubGVzcyB0aGUgZGVmYXVsdCBpdHNlbGYgaXMgbWVz
c2VkIHVwCisJCQkJCWlmICggaW50ZXJwb2xhdGlvbiAhPT0gdGhpcy5EZWZhdWx0SW50ZXJwb2xh
dGlvbiApIHsKKworCQkJCQkJdGhpcy5zZXRJbnRlcnBvbGF0aW9uKCB0aGlzLkRlZmF1bHRJbnRl
cnBvbGF0aW9uICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJdGhyb3cgbmV3IEVycm9yKCBt
ZXNzYWdlICk7IC8vIGZhdGFsLCBpbiB0aGlzIGNhc2UKKworCQkJCQl9CisKKwkJCQl9CisKKwkJ
CQljb25zb2xlLndhcm4oICdUSFJFRS5LZXlmcmFtZVRyYWNrUHJvdG90eXBlOicsIG1lc3NhZ2Ug
KTsKKwkJCQlyZXR1cm47CisKKwkJCX0KKworCQkJdGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9IGZh
Y3RvcnlNZXRob2Q7CisKKwkJfSwKKworCQlnZXRJbnRlcnBvbGF0aW9uOiBmdW5jdGlvbiAoKSB7
CisKKwkJCXN3aXRjaCAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgKSB7CisKKwkJCQljYXNlIHRo
aXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6CisKKwkJCQkJcmV0dXJuIEludGVy
cG9sYXRlRGlzY3JldGU7CisKKwkJCQljYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9k
TGluZWFyOgorCisJCQkJCXJldHVybiBJbnRlcnBvbGF0ZUxpbmVhcjsKKworCQkJCWNhc2UgdGhp
cy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6CisKKwkJCQkJcmV0dXJuIEludGVycG9s
YXRlU21vb3RoOworCisJCQl9CisKKwkJfSwKKworCQlnZXRWYWx1ZVNpemU6IGZ1bmN0aW9uICgp
IHsKKworCQkJcmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aCAvIHRoaXMudGltZXMubGVuZ3RoOwor
CisJCX0sCisKKwkJLy8gbW92ZSBhbGwga2V5ZnJhbWVzIGVpdGhlciBmb3J3YXJkcyBvciBiYWNr
d2FyZHMgaW4gdGltZQorCQlzaGlmdDogZnVuY3Rpb24gKCB0aW1lT2Zmc2V0ICkgeworCisJCQlp
ZiAoIHRpbWVPZmZzZXQgIT09IDAuMCApIHsKKworCQkJCXZhciB0aW1lcyA9IHRoaXMudGltZXM7
CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSB0aW1lcy5sZW5ndGg7IGkgIT09IG47ICsrIGkg
KSB7CisKKwkJCQkJdGltZXNbIGkgXSArPSB0aW1lT2Zmc2V0OworCisJCQkJfQorCisJCQl9CisK
KwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJLy8gc2NhbGUgYWxsIGtleWZyYW1lIHRpbWVz
IGJ5IGEgZmFjdG9yICh1c2VmdWwgZm9yIGZyYW1lIDwtPiBzZWNvbmRzIGNvbnZlcnNpb25zKQor
CQlzY2FsZTogZnVuY3Rpb24gKCB0aW1lU2NhbGUgKSB7CisKKwkJCWlmICggdGltZVNjYWxlICE9
PSAxLjAgKSB7CisKKwkJCQl2YXIgdGltZXMgPSB0aGlzLnRpbWVzOworCisJCQkJZm9yICggdmFy
IGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisJCQkJCXRpbWVz
WyBpIF0gKj0gdGltZVNjYWxlOworCisJCQkJfQorCisJCQl9CisKKwkJCXJldHVybiB0aGlzOwor
CisJCX0sCisKKwkJLy8gcmVtb3ZlcyBrZXlmcmFtZXMgYmVmb3JlIGFuZCBhZnRlciBhbmltYXRp
b24gd2l0aG91dCBjaGFuZ2luZyBhbnkgdmFsdWVzIHdpdGhpbiB0aGUgcmFuZ2UgW3N0YXJ0VGlt
ZSwgZW5kVGltZV0uCisJCS8vIElNUE9SVEFOVDogV2UgZG8gbm90IHNoaWZ0IGFyb3VuZCBrZXlz
IHRvIHRoZSBzdGFydCBvZiB0aGUgdHJhY2sgdGltZSwgYmVjYXVzZSBmb3IgaW50ZXJwb2xhdGVk
IGtleXMgdGhpcyB3aWxsIGNoYW5nZSB0aGVpciB2YWx1ZXMKKwkJdHJpbTogZnVuY3Rpb24gKCBz
dGFydFRpbWUsIGVuZFRpbWUgKSB7CisKKwkJCXZhciB0aW1lcyA9IHRoaXMudGltZXMsCisJCQkJ
bktleXMgPSB0aW1lcy5sZW5ndGgsCisJCQkJZnJvbSA9IDAsCisJCQkJdG8gPSBuS2V5cyAtIDE7
CisKKwkJCXdoaWxlICggZnJvbSAhPT0gbktleXMgJiYgdGltZXNbIGZyb20gXSA8IHN0YXJ0VGlt
ZSApICsrIGZyb207CisJCQl3aGlsZSAoIHRvICE9PSAtIDEgJiYgdGltZXNbIHRvIF0gPiBlbmRU
aW1lICkgLS0gdG87CisKKwkJCSsrIHRvOyAvLyBpbmNsdXNpdmUgLT4gZXhjbHVzaXZlIGJvdW5k
CisKKwkJCWlmICggZnJvbSAhPT0gMCB8fCB0byAhPT0gbktleXMgKSB7CisKKwkJCQkvLyBlbXB0
eSB0cmFja3MgYXJlIGZvcmJpZGRlbiwgc28ga2VlcCBhdCBsZWFzdCBvbmUga2V5ZnJhbWUKKwkJ
CQlpZiAoIGZyb20gPj0gdG8gKSB0byA9IE1hdGgubWF4KCB0bywgMSApLCBmcm9tID0gdG8gLSAx
OworCisJCQkJdmFyIHN0cmlkZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7CisJCQkJdGhpcy50aW1l
cyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCBmcm9tLCB0byApOworCQkJCXRo
aXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuCisJCQkJCQlhcnJheVNsaWNlKCB0aGlzLnZhbHVl
cywgZnJvbSAqIHN0cmlkZSwgdG8gKiBzdHJpZGUgKTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhp
czsKKworCQl9LAorCisJCS8vIGVuc3VyZSB3ZSBkbyBub3QgZ2V0IGEgR2FyYmFnZUluR2FyYmFn
ZU91dCBzaXR1YXRpb24sIG1ha2Ugc3VyZSB0cmFja3MgYXJlIGF0IGxlYXN0IG1pbmltYWxseSB2
aWFibGUKKwkJdmFsaWRhdGU6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHZhbGlkID0gdHJ1ZTsK
KworCQkJdmFyIHZhbHVlU2l6ZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7CisJCQlpZiAoIHZhbHVl
U2l6ZSAtIE1hdGguZmxvb3IoIHZhbHVlU2l6ZSApICE9PSAwICkgeworCisJCQkJY29uc29sZS5l
cnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2tQcm90b3R5cGU6IEludmFsaWQgdmFsdWUgc2l6ZSBp
biB0cmFjay4nLCB0aGlzICk7CisJCQkJdmFsaWQgPSBmYWxzZTsKKworCQkJfQorCisJCQl2YXIg
dGltZXMgPSB0aGlzLnRpbWVzLAorCQkJCXZhbHVlcyA9IHRoaXMudmFsdWVzLAorCisJCQkJbktl
eXMgPSB0aW1lcy5sZW5ndGg7CisKKwkJCWlmICggbktleXMgPT09IDAgKSB7CisKKwkJCQljb25z
b2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFja1Byb3RvdHlwZTogVHJhY2sgaXMgZW1wdHku
JywgdGhpcyApOworCQkJCXZhbGlkID0gZmFsc2U7CisKKwkJCX0KKworCQkJdmFyIHByZXZUaW1l
ID0gbnVsbDsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuS2V5czsgaSArKyApIHsKKwor
CQkJCXZhciBjdXJyVGltZSA9IHRpbWVzWyBpIF07CisKKwkJCQlpZiAoIHR5cGVvZiBjdXJyVGlt
ZSA9PT0gJ251bWJlcicgJiYgaXNOYU4oIGN1cnJUaW1lICkgKSB7CisKKwkJCQkJY29uc29sZS5l
cnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2tQcm90b3R5cGU6IFRpbWUgaXMgbm90IGEgdmFsaWQg
bnVtYmVyLicsIHRoaXMsIGksIGN1cnJUaW1lICk7CisJCQkJCXZhbGlkID0gZmFsc2U7CisJCQkJ
CWJyZWFrOworCisJCQkJfQorCisJCQkJaWYgKCBwcmV2VGltZSAhPT0gbnVsbCAmJiBwcmV2VGlt
ZSA+IGN1cnJUaW1lICkgeworCisJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRy
YWNrUHJvdG90eXBlOiBPdXQgb2Ygb3JkZXIga2V5cy4nLCB0aGlzLCBpLCBjdXJyVGltZSwgcHJl
dlRpbWUgKTsKKwkJCQkJdmFsaWQgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisKKwkJCQl9CisKKwkJ
CQlwcmV2VGltZSA9IGN1cnJUaW1lOworCisJCQl9CisKKwkJCWlmICggdmFsdWVzICE9PSB1bmRl
ZmluZWQgKSB7CisKKwkJCQlpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggdmFsdWVz
ICkgKSB7CisKKwkJCQkJZm9yICggdmFyIGkgPSAwLCBuID0gdmFsdWVzLmxlbmd0aDsgaSAhPT0g
bjsgKysgaSApIHsKKworCQkJCQkJdmFyIHZhbHVlID0gdmFsdWVzWyBpIF07CisKKwkJCQkJCWlm
ICggaXNOYU4oIHZhbHVlICkgKSB7CisKKwkJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5
ZnJhbWVUcmFja1Byb3RvdHlwZTogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLicsIHRoaXMs
IGksIHZhbHVlICk7CisJCQkJCQkJdmFsaWQgPSBmYWxzZTsKKwkJCQkJCQlicmVhazsKKworCQkJ
CQkJfQorCisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gdmFsaWQ7CisKKwkJ
fSwKKworCQkvLyByZW1vdmVzIGVxdWl2YWxlbnQgc2VxdWVudGlhbCBrZXlzIGFzIGNvbW1vbiBp
biBtb3JwaCB0YXJnZXQgc2VxdWVuY2VzCisJCS8vICgwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCww
LDApIC0tPiAoMCwwLDEsMSwwLDApCisJCW9wdGltaXplOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZh
ciB0aW1lcyA9IHRoaXMudGltZXMsCisJCQkJdmFsdWVzID0gdGhpcy52YWx1ZXMsCisJCQkJc3Ry
aWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKSwKKworCQkJCXNtb290aEludGVycG9sYXRpb24gPSB0
aGlzLmdldEludGVycG9sYXRpb24oKSA9PT0gSW50ZXJwb2xhdGVTbW9vdGgsCisKKwkJCQl3cml0
ZUluZGV4ID0gMSwKKwkJCQlsYXN0SW5kZXggPSB0aW1lcy5sZW5ndGggLSAxOworCisJCQlmb3Ig
KCB2YXIgaSA9IDE7IGkgPCBsYXN0SW5kZXg7ICsrIGkgKSB7CisKKwkJCQl2YXIga2VlcCA9IGZh
bHNlOworCisJCQkJdmFyIHRpbWUgPSB0aW1lc1sgaSBdOworCQkJCXZhciB0aW1lTmV4dCA9IHRp
bWVzWyBpICsgMSBdOworCisJCQkJLy8gcmVtb3ZlIGFkamFjZW50IGtleWZyYW1lcyBzY2hlZHVs
ZWQgYXQgdGhlIHNhbWUgdGltZQorCisJCQkJaWYgKCB0aW1lICE9PSB0aW1lTmV4dCAmJiAoIGkg
IT09IDEgfHwgdGltZSAhPT0gdGltZVsgMCBdICkgKSB7CisKKwkJCQkJaWYgKCAhIHNtb290aElu
dGVycG9sYXRpb24gKSB7CisKKwkJCQkJCS8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBrZXlmcmFtZXMg
c2FtZSBhcyB0aGVpciBuZWlnaGJvcnMKKworCQkJCQkJdmFyIG9mZnNldCA9IGkgKiBzdHJpZGUs
CisJCQkJCQkJb2Zmc2V0UCA9IG9mZnNldCAtIHN0cmlkZSwKKwkJCQkJCQlvZmZzZXROID0gb2Zm
c2V0ICsgc3RyaWRlOworCisJCQkJCQlmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysg
aiApIHsKKworCQkJCQkJCXZhciB2YWx1ZSA9IHZhbHVlc1sgb2Zmc2V0ICsgaiBdOworCisJCQkJ
CQkJaWYgKCB2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXRQICsgaiBdIHx8CisJCQkJCQkJCQl2YWx1
ZSAhPT0gdmFsdWVzWyBvZmZzZXROICsgaiBdICkgeworCisJCQkJCQkJCWtlZXAgPSB0cnVlOwor
CQkJCQkJCQlicmVhazsKKworCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJCX0gZWxzZSBrZWVw
ID0gdHJ1ZTsKKworCQkJCX0KKworCQkJCS8vIGluLXBsYWNlIGNvbXBhY3Rpb24KKworCQkJCWlm
ICgga2VlcCApIHsKKworCQkJCQlpZiAoIGkgIT09IHdyaXRlSW5kZXggKSB7CisKKwkJCQkJCXRp
bWVzWyB3cml0ZUluZGV4IF0gPSB0aW1lc1sgaSBdOworCisJCQkJCQl2YXIgcmVhZE9mZnNldCA9
IGkgKiBzdHJpZGUsCisJCQkJCQkJd3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlOwor
CisJCQkJCQlmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApCisKKwkJCQkJCQl2
YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdOworCisJ
CQkJCX0KKworCQkJCQkrKyB3cml0ZUluZGV4OworCisJCQkJfQorCisJCQl9CisKKwkJCS8vIGZs
dXNoIGxhc3Qga2V5ZnJhbWUgKGNvbXBhY3Rpb24gbG9va3MgYWhlYWQpCisKKwkJCWlmICggbGFz
dEluZGV4ID4gMCApIHsKKworCQkJCXRpbWVzWyB3cml0ZUluZGV4IF0gPSB0aW1lc1sgbGFzdElu
ZGV4IF07CisKKwkJCQlmb3IgKCB2YXIgcmVhZE9mZnNldCA9IGxhc3RJbmRleCAqIHN0cmlkZSwg
d3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlLCBqID0gMDsgaiAhPT0gc3RyaWRlOyAr
KyBqICkKKworCQkJCQl2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zm
c2V0ICsgaiBdOworCisJCQkJKysgd3JpdGVJbmRleDsKKworCQkJfQorCisJCQlpZiAoIHdyaXRl
SW5kZXggIT09IHRpbWVzLmxlbmd0aCApIHsKKworCQkJCXRoaXMudGltZXMgPSBBbmltYXRpb25V
dGlscy5hcnJheVNsaWNlKCB0aW1lcywgMCwgd3JpdGVJbmRleCApOworCQkJCXRoaXMudmFsdWVz
ID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdmFsdWVzLCAwLCB3cml0ZUluZGV4ICogc3Ry
aWRlICk7CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfQorCisJfTsKKworCWZ1bmN0
aW9uIEtleWZyYW1lVHJhY2tDb25zdHJ1Y3RvciggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJw
b2xhdGlvbiApIHsKKworCQlpZiAoIG5hbWUgPT09IHVuZGVmaW5lZCApIHRocm93IG5ldyBFcnJv
ciggInRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkIiApOworCisJCWlmICggdGltZXMgPT09IHVuZGVm
aW5lZCB8fCB0aW1lcy5sZW5ndGggPT09IDAgKSB7CisKKwkJCXRocm93IG5ldyBFcnJvciggIm5v
IGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCAiICsgbmFtZSApOworCisJCX0KKworCQl0aGlzLm5h
bWUgPSBuYW1lOworCisJCXRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXko
IHRpbWVzLCB0aGlzLlRpbWVCdWZmZXJUeXBlICk7CisJCXRoaXMudmFsdWVzID0gQW5pbWF0aW9u
VXRpbHMuY29udmVydEFycmF5KCB2YWx1ZXMsIHRoaXMuVmFsdWVCdWZmZXJUeXBlICk7CisKKwkJ
dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCBpbnRlcnBvbGF0aW9uIHx8IHRoaXMuRGVmYXVsdEludGVy
cG9sYXRpb24gKTsKKworCQl0aGlzLnZhbGlkYXRlKCk7CisJCXRoaXMub3B0aW1pemUoKTsKKwor
CX0KKworCS8qKgorCSAqCisJICogQSBUcmFjayBvZiB2ZWN0b3JlZCBrZXlmcmFtZSB2YWx1ZXMu
CisJICoKKwkgKgorCSAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCisJ
ICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCisJICogQGF1dGhv
ciB0c2NodworCSAqLworCisJZnVuY3Rpb24gVmVjdG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGlt
ZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHsKKworCQlLZXlmcmFtZVRyYWNrQ29uc3RydWN0
b3IuY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApOworCisJ
fQorCisJVmVjdG9yS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPQorCQkJT2JqZWN0LmFzc2lnbigg
T2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0
b3I6IFZlY3RvcktleWZyYW1lVHJhY2ssCisKKwkJVmFsdWVUeXBlTmFtZTogJ3ZlY3RvcicKKwor
CQkvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkCisKKwkJLy8gRGVmYXVsdEludGVycG9s
YXRpb24gaXMgaW5oZXJpdGVkCisKKwl9ICk7CisKKwkvKioKKwkgKiBTcGhlcmljYWwgbGluZWFy
IHVuaXQgcXVhdGVybmlvbiBpbnRlcnBvbGFudC4KKwkgKgorCSAqIEBhdXRob3IgdHNjaHcKKwkg
Ki8KKworCWZ1bmN0aW9uIFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9z
aXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHsKKworCQlJ
bnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywg
c2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7CisKKwl9CisKKwlRdWF0ZXJuaW9uTGluZWFySW50
ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJw
b2xhbnQucHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogUXVhdGVybmlvbkxpbmVhcklu
dGVycG9sYW50LAorCisJCWludGVycG9sYXRlXzogZnVuY3Rpb24oIGkxLCB0MCwgdCwgdDEgKSB7
CisKKwkJCXZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlciwKKwkJCQl2YWx1ZXMgPSB0aGlz
LnNhbXBsZVZhbHVlcywKKwkJCQlzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKKworCQkJCW9mZnNl
dCA9IGkxICogc3RyaWRlLAorCisJCQkJYWxwaGEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICk7
CisKKwkJCWZvciAoIHZhciBlbmQgPSBvZmZzZXQgKyBzdHJpZGU7IG9mZnNldCAhPT0gZW5kOyBv
ZmZzZXQgKz0gNCApIHsKKworCQkJCVF1YXRlcm5pb24uc2xlcnBGbGF0KCByZXN1bHQsIDAsCisJ
CQkJCQl2YWx1ZXMsIG9mZnNldCAtIHN0cmlkZSwgdmFsdWVzLCBvZmZzZXQsIGFscGhhICk7CisK
KwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKgor
CSAqIEEgVHJhY2sgb2YgcXVhdGVybmlvbiBrZXlmcmFtZSB2YWx1ZXMuCisJICoKKwkgKiBAYXV0
aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLworCSAqIEBhdXRob3IgRGF2aWQgU2Fy
bm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworCSAqIEBhdXRob3IgdHNjaHcKKwkgKi8KKworCWZ1
bmN0aW9uIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRl
cnBvbGF0aW9uICkgeworCisJCUtleWZyYW1lVHJhY2tDb25zdHJ1Y3Rvci5jYWxsKCB0aGlzLCBu
YW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7CisKKwl9CisKKwlRdWF0ZXJuaW9u
S2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPQorCQkJT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0
ZSggS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IFF1YXRlcm5p
b25LZXlmcmFtZVRyYWNrLAorCisJCVZhbHVlVHlwZU5hbWU6ICdxdWF0ZXJuaW9uJywKKworCQkv
LyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkCisKKwkJRGVmYXVsdEludGVycG9sYXRpb246
IEludGVycG9sYXRlTGluZWFyLAorCisJCUludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjog
ZnVuY3Rpb24oIHJlc3VsdCApIHsKKworCQkJcmV0dXJuIG5ldyBRdWF0ZXJuaW9uTGluZWFySW50
ZXJwb2xhbnQoCisJCQkJCXRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6
ZSgpLCByZXN1bHQgKTsKKworCQl9LAorCisJCUludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290
aDogdW5kZWZpbmVkIC8vIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKworCX0gKTsKKworCS8qKgorCSAq
CisJICogQSBUcmFjayBvZiBudW1lcmljIGtleWZyYW1lIHZhbHVlcy4KKwkgKgorCSAqIEBhdXRo
b3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCisJICogQGF1dGhvciBEYXZpZCBTYXJu
byAvIGh0dHA6Ly9saWdodGhhdXMudXMvCisJICogQGF1dGhvciB0c2NodworCSAqLworCisJZnVu
Y3Rpb24gTnVtYmVyS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xh
dGlvbiApIHsKKworCQlLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3IuY2FsbCggdGhpcywgbmFtZSwg
dGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApOworCisJfQorCisJTnVtYmVyS2V5ZnJhbWVU
cmFjay5wcm90b3R5cGUgPQorCQkJT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJh
bWVUcmFja1Byb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IE51bWJlcktleWZyYW1lVHJh
Y2ssCisKKwkJVmFsdWVUeXBlTmFtZTogJ251bWJlcicKKworCQkvLyBWYWx1ZUJ1ZmZlclR5cGUg
aXMgaW5oZXJpdGVkCisKKwkJLy8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkCisK
Kwl9ICk7CisKKwkvKioKKwkgKgorCSAqIEEgVHJhY2sgdGhhdCBpbnRlcnBvbGF0ZXMgU3RyaW5n
cworCSAqCisJICoKKwkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwor
CSAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworCSAqIEBhdXRo
b3IgdHNjaHcKKwkgKi8KKworCWZ1bmN0aW9uIFN0cmluZ0tleWZyYW1lVHJhY2soIG5hbWUsIHRp
bWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7CisKKwkJS2V5ZnJhbWVUcmFja0NvbnN0cnVj
dG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTsKKwor
CX0KKworCVN0cmluZ0tleWZyYW1lVHJhY2sucHJvdG90eXBlID0KKwkJCU9iamVjdC5hc3NpZ24o
IE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2tQcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVj
dG9yOiBTdHJpbmdLZXlmcmFtZVRyYWNrLAorCisJCVZhbHVlVHlwZU5hbWU6ICdzdHJpbmcnLAor
CQlWYWx1ZUJ1ZmZlclR5cGU6IEFycmF5LAorCisJCURlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRl
cnBvbGF0ZURpc2NyZXRlLAorCisJCUludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogdW5k
ZWZpbmVkLAorCisJCUludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogdW5kZWZpbmVkCisK
Kwl9ICk7CisKKwkvKioKKwkgKgorCSAqIEEgVHJhY2sgb2YgQm9vbGVhbiBrZXlmcmFtZSB2YWx1
ZXMuCisJICoKKwkgKgorCSAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8v
CisJICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCisJICogQGF1
dGhvciB0c2NodworCSAqLworCisJZnVuY3Rpb24gQm9vbGVhbktleWZyYW1lVHJhY2soIG5hbWUs
IHRpbWVzLCB2YWx1ZXMgKSB7CisKKwkJS2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yLmNhbGwoIHRo
aXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKTsKKworCX0KKworCUJvb2xlYW5LZXlmcmFtZVRyYWNr
LnByb3RvdHlwZSA9CisJCQlPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRy
YWNrUHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogQm9vbGVhbktleWZyYW1lVHJhY2ss
CisKKwkJVmFsdWVUeXBlTmFtZTogJ2Jvb2wnLAorCQlWYWx1ZUJ1ZmZlclR5cGU6IEFycmF5LAor
CisJCURlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZURpc2NyZXRlLAorCisJCUludGVy
cG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogdW5kZWZpbmVkLAorCQlJbnRlcnBvbGFudEZhY3Rv
cnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZAorCisJCS8vIE5vdGU6IEFjdHVhbGx5IHRoaXMgdHJh
Y2sgY291bGQgaGF2ZSBhIG9wdGltaXplZCAvIGNvbXByZXNzZWQKKwkJLy8gcmVwcmVzZW50YXRp
b24gb2YgYSBzaW5nbGUgdmFsdWUgYW5kIGEgY3VzdG9tIGludGVycG9sYW50IHRoYXQKKwkJLy8g
Y29tcHV0ZXMgImZpcnN0VmFsdWUgXiBpc09kZCggaW5kZXggKSIuCisKKwl9ICk7CisKKwkvKioK
KwkgKgorCSAqIEEgVHJhY2sgb2Yga2V5ZnJhbWUgdmFsdWVzIHRoYXQgcmVwcmVzZW50IGNvbG9y
LgorCSAqCisJICoKKwkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwor
CSAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworCSAqIEBhdXRo
b3IgdHNjaHcKKwkgKi8KKworCWZ1bmN0aW9uIENvbG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGlt
ZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHsKKworCQlLZXlmcmFtZVRyYWNrQ29uc3RydWN0
b3IuY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApOworCisJ
fQorCisJQ29sb3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9CisJCQlPYmplY3QuYXNzaWduKCBP
YmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrUHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3Rv
cjogQ29sb3JLZXlmcmFtZVRyYWNrLAorCisJCVZhbHVlVHlwZU5hbWU6ICdjb2xvcicKKworCQkv
LyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkCisKKwkJLy8gRGVmYXVsdEludGVycG9sYXRp
b24gaXMgaW5oZXJpdGVkCisKKworCQkvLyBOb3RlOiBWZXJ5IGJhc2ljIGltcGxlbWVudGF0aW9u
IGFuZCBub3RoaW5nIHNwZWNpYWwgeWV0LgorCQkvLyBIb3dldmVyLCB0aGlzIGlzIHRoZSBwbGFj
ZSBmb3IgY29sb3Igc3BhY2UgcGFyYW1ldGVyaXphdGlvbi4KKworCX0gKTsKKworCS8qKgorCSAq
CisJICogQSB0aW1lZCBzZXF1ZW5jZSBvZiBrZXlmcmFtZXMgZm9yIGEgc3BlY2lmaWMgcHJvcGVy
dHkuCisJICoKKwkgKgorCSAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8v
CisJICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCisJICogQGF1
dGhvciB0c2NodworCSAqLworCisJZnVuY3Rpb24gS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMs
IHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHsKKworCQlLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3Iu
YXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCisJfQorCisJS2V5ZnJhbWVUcmFjay5wcm90b3R5
cGUgPSBLZXlmcmFtZVRyYWNrUHJvdG90eXBlOworCUtleWZyYW1lVHJhY2tQcm90b3R5cGUuY29u
c3RydWN0b3IgPSBLZXlmcmFtZVRyYWNrOworCisJLy8gU3RhdGljIG1ldGhvZHM6CisKKwlPYmpl
Y3QuYXNzaWduKCBLZXlmcmFtZVRyYWNrLCB7CisKKwkJLy8gU2VyaWFsaXphdGlvbiAoaW4gc3Rh
dGljIGNvbnRleHQsIGJlY2F1c2Ugb2YgY29uc3RydWN0b3IgaW52b2NhdGlvbgorCQkvLyBhbmQg
YXV0b21hdGljIGludm9jYXRpb24gb2YgLnRvSlNPTik6CisKKwkJcGFyc2U6IGZ1bmN0aW9uKCBq
c29uICkgeworCisJCQlpZigganNvbi50eXBlID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQl0aHJv
dyBuZXcgRXJyb3IoICJ0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZSIgKTsKKwor
CQkJfQorCisJCQl2YXIgdHJhY2tUeXBlID0gS2V5ZnJhbWVUcmFjay5fZ2V0VHJhY2tUeXBlRm9y
VmFsdWVUeXBlTmFtZSgganNvbi50eXBlICk7CisKKwkJCWlmICgganNvbi50aW1lcyA9PT0gdW5k
ZWZpbmVkICkgeworCisJCQkJdmFyIHRpbWVzID0gW10sIHZhbHVlcyA9IFtdOworCisJCQkJQW5p
bWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGpzb24ua2V5cywgdGltZXMsIHZhbHVlcywgJ3ZhbHVl
JyApOworCisJCQkJanNvbi50aW1lcyA9IHRpbWVzOworCQkJCWpzb24udmFsdWVzID0gdmFsdWVz
OworCisJCQl9CisKKwkJCS8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHBh
cnNlIG1ldGhvZAorCQkJaWYgKCB0cmFja1R5cGUucGFyc2UgIT09IHVuZGVmaW5lZCApIHsKKwor
CQkJCXJldHVybiB0cmFja1R5cGUucGFyc2UoIGpzb24gKTsKKworCQkJfSBlbHNlIHsKKworCQkJ
CS8vIGJ5IGRlZmF1bHQsIHdlIGFzc3N1bWUgYSBjb25zdHJ1Y3RvciBjb21wYXRpYmxlIHdpdGgg
dGhlIGJhc2UKKwkJCQlyZXR1cm4gbmV3IHRyYWNrVHlwZSgKKwkJCQkJCWpzb24ubmFtZSwganNv
bi50aW1lcywganNvbi52YWx1ZXMsIGpzb24uaW50ZXJwb2xhdGlvbiApOworCisJCQl9CisKKwkJ
fSwKKworCQl0b0pTT046IGZ1bmN0aW9uKCB0cmFjayApIHsKKworCQkJdmFyIHRyYWNrVHlwZSA9
IHRyYWNrLmNvbnN0cnVjdG9yOworCisJCQl2YXIganNvbjsKKworCQkJLy8gZGVyaXZlZCBjbGFz
c2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgdG9KU09OIG1ldGhvZAorCQkJaWYgKCB0cmFja1R5cGUu
dG9KU09OICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQlqc29uID0gdHJhY2tUeXBlLnRvSlNPTigg
dHJhY2sgKTsKKworCQkJfSBlbHNlIHsKKworCQkJCS8vIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0
aGUgZGF0YSBjYW4gYmUgc2VyaWFsaXplZCBhcy1pcworCQkJCWpzb24gPSB7CisKKwkJCQkJJ25h
bWUnOiB0cmFjay5uYW1lLAorCQkJCQkndGltZXMnOiBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJy
YXkoIHRyYWNrLnRpbWVzLCBBcnJheSApLAorCQkJCQkndmFsdWVzJzogQW5pbWF0aW9uVXRpbHMu
Y29udmVydEFycmF5KCB0cmFjay52YWx1ZXMsIEFycmF5ICkKKworCQkJCX07CisKKwkJCQl2YXIg
aW50ZXJwb2xhdGlvbiA9IHRyYWNrLmdldEludGVycG9sYXRpb24oKTsKKworCQkJCWlmICggaW50
ZXJwb2xhdGlvbiAhPT0gdHJhY2suRGVmYXVsdEludGVycG9sYXRpb24gKSB7CisKKwkJCQkJanNv
bi5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjsKKworCQkJCX0KKworCQkJfQorCisJCQlq
c29uLnR5cGUgPSB0cmFjay5WYWx1ZVR5cGVOYW1lOyAvLyBtYW5kYXRvcnkKKworCQkJcmV0dXJu
IGpzb247CisKKwkJfSwKKworCQlfZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZTogZnVuY3Rp
b24oIHR5cGVOYW1lICkgeworCisJCQlzd2l0Y2goIHR5cGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7
CisKKwkJCQljYXNlICJzY2FsYXIiOgorCQkJCWNhc2UgImRvdWJsZSI6CisJCQkJY2FzZSAiZmxv
YXQiOgorCQkJCWNhc2UgIm51bWJlciI6CisJCQkJY2FzZSAiaW50ZWdlciI6CisKKwkJCQkJcmV0
dXJuIE51bWJlcktleWZyYW1lVHJhY2s7CisKKwkJCQljYXNlICJ2ZWN0b3IiOgorCQkJCWNhc2Ug
InZlY3RvcjIiOgorCQkJCWNhc2UgInZlY3RvcjMiOgorCQkJCWNhc2UgInZlY3RvcjQiOgorCisJ
CQkJCXJldHVybiBWZWN0b3JLZXlmcmFtZVRyYWNrOworCisJCQkJY2FzZSAiY29sb3IiOgorCisJ
CQkJCXJldHVybiBDb2xvcktleWZyYW1lVHJhY2s7CisKKwkJCQljYXNlICJxdWF0ZXJuaW9uIjoK
KworCQkJCQlyZXR1cm4gUXVhdGVybmlvbktleWZyYW1lVHJhY2s7CisKKwkJCQljYXNlICJib29s
IjoKKwkJCQljYXNlICJib29sZWFuIjoKKworCQkJCQlyZXR1cm4gQm9vbGVhbktleWZyYW1lVHJh
Y2s7CisKKwkJCQljYXNlICJzdHJpbmciOgorCisJCQkJCXJldHVybiBTdHJpbmdLZXlmcmFtZVRy
YWNrOworCisJCQl9CisKKwkJCXRocm93IG5ldyBFcnJvciggIlVuc3VwcG9ydGVkIHR5cGVOYW1l
OiAiICsgdHlwZU5hbWUgKTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKgorCSAqIFJldXNh
YmxlIHNldCBvZiBUcmFja3MgdGhhdCByZXByZXNlbnQgYW4gYW5pbWF0aW9uLgorCSAqCisJICog
QGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KKwkgKiBAYXV0aG9yIERhdmlk
IFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KKwkgKi8KKworCWZ1bmN0aW9uIEFuaW1hdGlv
bkNsaXAoIG5hbWUsIGR1cmF0aW9uLCB0cmFja3MgKSB7CisKKwkJdGhpcy5uYW1lID0gbmFtZTsK
KwkJdGhpcy50cmFja3MgPSB0cmFja3M7CisJCXRoaXMuZHVyYXRpb24gPSAoIGR1cmF0aW9uICE9
PSB1bmRlZmluZWQgKSA/IGR1cmF0aW9uIDogLSAxOworCisJCXRoaXMudXVpZCA9IF9NYXRoLmdl
bmVyYXRlVVVJRCgpOworCisJCS8vIHRoaXMgbWVhbnMgaXQgc2hvdWxkIGZpZ3VyZSBvdXQgaXRz
IGR1cmF0aW9uIGJ5IHNjYW5uaW5nIHRoZSB0cmFja3MKKwkJaWYgKCB0aGlzLmR1cmF0aW9uIDwg
MCApIHsKKworCQkJdGhpcy5yZXNldER1cmF0aW9uKCk7CisKKwkJfQorCisJCXRoaXMub3B0aW1p
emUoKTsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkNsaXAsIHsKKworCQlwYXJz
ZTogZnVuY3Rpb24gKCBqc29uICkgeworCisJCQl2YXIgdHJhY2tzID0gW10sCisJCQkJanNvblRy
YWNrcyA9IGpzb24udHJhY2tzLAorCQkJCWZyYW1lVGltZSA9IDEuMCAvICgganNvbi5mcHMgfHwg
MS4wICk7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbiA9IGpzb25UcmFja3MubGVuZ3RoOyBpICE9
PSBuOyArKyBpICkgeworCisJCQkJdHJhY2tzLnB1c2goIEtleWZyYW1lVHJhY2sucGFyc2UoIGpz
b25UcmFja3NbIGkgXSApLnNjYWxlKCBmcmFtZVRpbWUgKSApOworCisJCQl9CisKKwkJCXJldHVy
biBuZXcgQW5pbWF0aW9uQ2xpcCgganNvbi5uYW1lLCBqc29uLmR1cmF0aW9uLCB0cmFja3MgKTsK
KworCQl9LAorCisJCXRvSlNPTjogZnVuY3Rpb24gKCBjbGlwICkgeworCisJCQl2YXIgdHJhY2tz
ID0gW10sCisJCQkJY2xpcFRyYWNrcyA9IGNsaXAudHJhY2tzOworCisJCQl2YXIganNvbiA9IHsK
KworCQkJCSduYW1lJzogY2xpcC5uYW1lLAorCQkJCSdkdXJhdGlvbic6IGNsaXAuZHVyYXRpb24s
CisJCQkJJ3RyYWNrcyc6IHRyYWNrcworCisJCQl9OworCisJCQlmb3IgKCB2YXIgaSA9IDAsIG4g
PSBjbGlwVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworCQkJCXRyYWNrcy5wdXNo
KCBLZXlmcmFtZVRyYWNrLnRvSlNPTiggY2xpcFRyYWNrc1sgaSBdICkgKTsKKworCQkJfQorCisJ
CQlyZXR1cm4ganNvbjsKKworCQl9LAorCisJCUNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNl
OiBmdW5jdGlvbiAoIG5hbWUsIG1vcnBoVGFyZ2V0U2VxdWVuY2UsIGZwcywgbm9Mb29wICkgewor
CisJCQl2YXIgbnVtTW9ycGhUYXJnZXRzID0gbW9ycGhUYXJnZXRTZXF1ZW5jZS5sZW5ndGg7CisJ
CQl2YXIgdHJhY2tzID0gW107CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IG51bU1vcnBoVGFy
Z2V0czsgaSArKyApIHsKKworCQkJCXZhciB0aW1lcyA9IFtdOworCQkJCXZhciB2YWx1ZXMgPSBb
XTsKKworCQkJCXRpbWVzLnB1c2goCisJCQkJCQkoIGkgKyBudW1Nb3JwaFRhcmdldHMgLSAxICkg
JSBudW1Nb3JwaFRhcmdldHMsCisJCQkJCQlpLAorCQkJCQkJKCBpICsgMSApICUgbnVtTW9ycGhU
YXJnZXRzICk7CisKKwkJCQl2YWx1ZXMucHVzaCggMCwgMSwgMCApOworCisJCQkJdmFyIG9yZGVy
ID0gQW5pbWF0aW9uVXRpbHMuZ2V0S2V5ZnJhbWVPcmRlciggdGltZXMgKTsKKwkJCQl0aW1lcyA9
IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB0aW1lcywgMSwgb3JkZXIgKTsKKwkJCQl2YWx1
ZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdmFsdWVzLCAxLCBvcmRlciApOworCisJ
CQkJLy8gaWYgdGhlcmUgaXMgYSBrZXkgYXQgdGhlIGZpcnN0IGZyYW1lLCBkdXBsaWNhdGUgaXQg
YXMgdGhlCisJCQkJLy8gbGFzdCBmcmFtZSBhcyB3ZWxsIGZvciBwZXJmZWN0IGxvb3AuCisJCQkJ
aWYgKCAhIG5vTG9vcCAmJiB0aW1lc1sgMCBdID09PSAwICkgeworCisJCQkJCXRpbWVzLnB1c2go
IG51bU1vcnBoVGFyZ2V0cyApOworCQkJCQl2YWx1ZXMucHVzaCggdmFsdWVzWyAwIF0gKTsKKwor
CQkJCX0KKworCQkJCXRyYWNrcy5wdXNoKAorCQkJCQkJbmV3IE51bWJlcktleWZyYW1lVHJhY2so
CisJCQkJCQkJJy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbJyArIG1vcnBoVGFyZ2V0U2VxdWVuY2Vb
IGkgXS5uYW1lICsgJ10nLAorCQkJCQkJCXRpbWVzLCB2YWx1ZXMKKwkJCQkJCSkuc2NhbGUoIDEu
MCAvIGZwcyApICk7CisKKwkJCX0KKworCQkJcmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBuYW1l
LCAtIDEsIHRyYWNrcyApOworCisJCX0sCisKKwkJZmluZEJ5TmFtZTogZnVuY3Rpb24gKCBvYmpl
Y3RPckNsaXBBcnJheSwgbmFtZSApIHsKKworCQkJdmFyIGNsaXBBcnJheSA9IG9iamVjdE9yQ2xp
cEFycmF5OworCisJCQlpZiAoICEgQXJyYXkuaXNBcnJheSggb2JqZWN0T3JDbGlwQXJyYXkgKSAp
IHsKKworCQkJCXZhciBvID0gb2JqZWN0T3JDbGlwQXJyYXk7CisJCQkJY2xpcEFycmF5ID0gby5n
ZW9tZXRyeSAmJiBvLmdlb21ldHJ5LmFuaW1hdGlvbnMgfHwgby5hbmltYXRpb25zOworCisJCQl9
CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IGNsaXBBcnJheS5sZW5ndGg7IGkgKysgKSB7CisK
KwkJCQlpZiAoIGNsaXBBcnJheVsgaSBdLm5hbWUgPT09IG5hbWUgKSB7CisKKwkJCQkJcmV0dXJu
IGNsaXBBcnJheVsgaSBdOworCisJCQkJfQorCisJCQl9CisKKwkJCXJldHVybiBudWxsOworCisJ
CX0sCisKKwkJQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXM6IGZ1bmN0aW9uICgg
bW9ycGhUYXJnZXRzLCBmcHMsIG5vTG9vcCApIHsKKworCQkJdmFyIGFuaW1hdGlvblRvTW9ycGhU
YXJnZXRzID0ge307CisKKwkJCS8vIHRlc3RlZCB3aXRoIGh0dHBzOi8vcmVnZXgxMDEuY29tLyBv
biB0cmljayBzZXF1ZW5jZXMKKwkJCS8vIHN1Y2ggZmxhbWluZ29fZmx5QV8wMDMsIGZsYW1pbmdv
X3J1bjFfMDAzLCBjcmRlYXRoMDA1OQorCQkJdmFyIHBhdHRlcm4gPSAvXihbXHctXSo/KShbXGRd
KykkLzsKKworCQkJLy8gc29ydCBtb3JwaCB0YXJnZXQgbmFtZXMgaW50byBhbmltYXRpb24gZ3Jv
dXBzIGJhc2VkCisJCQkvLyBwYXR0ZXJucyBsaWtlIFdhbGtfMDAxLCBXYWxrXzAwMiwgUnVuXzAw
MSwgUnVuXzAwMgorCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7
IGkgPCBpbDsgaSArKyApIHsKKworCQkJCXZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sg
aSBdOworCQkJCXZhciBwYXJ0cyA9IG1vcnBoVGFyZ2V0Lm5hbWUubWF0Y2goIHBhdHRlcm4gKTsK
KworCQkJCWlmICggcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSApIHsKKworCQkJCQl2YXIgbmFt
ZSA9IHBhcnRzWyAxIF07CisKKwkJCQkJdmFyIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IGFuaW1h
dGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF07CisJCQkJCWlmICggISBhbmltYXRpb25Nb3JwaFRh
cmdldHMgKSB7CisKKwkJCQkJCWFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0gPSBhbmlt
YXRpb25Nb3JwaFRhcmdldHMgPSBbXTsKKworCQkJCQl9CisKKwkJCQkJYW5pbWF0aW9uTW9ycGhU
YXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJdmFyIGNs
aXBzID0gW107CisKKwkJCWZvciAoIHZhciBuYW1lIGluIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRz
ICkgeworCisJCQkJY2xpcHMucHVzaCggQW5pbWF0aW9uQ2xpcC5DcmVhdGVGcm9tTW9ycGhUYXJn
ZXRTZXF1ZW5jZSggbmFtZSwgYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXSwgZnBzLCBu
b0xvb3AgKSApOworCisJCQl9CisKKwkJCXJldHVybiBjbGlwczsKKworCQl9LAorCisJCS8vIHBh
cnNlIHRoZSBhbmltYXRpb24uaGllcmFyY2h5IGZvcm1hdAorCQlwYXJzZUFuaW1hdGlvbjogZnVu
Y3Rpb24gKCBhbmltYXRpb24sIGJvbmVzICkgeworCisJCQlpZiAoICEgYW5pbWF0aW9uICkgewor
CisJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbkNsaXA6IE5vIGFuaW1hdGlvbiBp
biBKU09OTG9hZGVyIGRhdGEuJyApOworCQkJCXJldHVybiBudWxsOworCisJCQl9CisKKwkJCXZh
ciBhZGROb25lbXB0eVRyYWNrID0gZnVuY3Rpb24gKCB0cmFja1R5cGUsIHRyYWNrTmFtZSwgYW5p
bWF0aW9uS2V5cywgcHJvcGVydHlOYW1lLCBkZXN0VHJhY2tzICkgeworCisJCQkJLy8gb25seSBy
ZXR1cm4gdHJhY2sgaWYgdGhlcmUgYXJlIGFjdHVhbGx5IGtleXMuCisJCQkJaWYgKCBhbmltYXRp
b25LZXlzLmxlbmd0aCAhPT0gMCApIHsKKworCQkJCQl2YXIgdGltZXMgPSBbXTsKKwkJCQkJdmFy
IHZhbHVlcyA9IFtdOworCisJCQkJCUFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBhbmltYXRp
b25LZXlzLCB0aW1lcywgdmFsdWVzLCBwcm9wZXJ0eU5hbWUgKTsKKworCQkJCQkvLyBlbXB0eSBr
ZXlzIGFyZSBmaWx0ZXJlZCBvdXQsIHNvIGNoZWNrIGFnYWluCisJCQkJCWlmICggdGltZXMubGVu
Z3RoICE9PSAwICkgeworCisJCQkJCQlkZXN0VHJhY2tzLnB1c2goIG5ldyB0cmFja1R5cGUoIHRy
YWNrTmFtZSwgdGltZXMsIHZhbHVlcyApICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9Owor
CisJCQl2YXIgdHJhY2tzID0gW107CisKKwkJCXZhciBjbGlwTmFtZSA9IGFuaW1hdGlvbi5uYW1l
IHx8ICdkZWZhdWx0JzsKKwkJCS8vIGF1dG9tYXRpYyBsZW5ndGggZGV0ZXJtaW5hdGlvbiBpbiBB
bmltYXRpb25DbGlwLgorCQkJdmFyIGR1cmF0aW9uID0gYW5pbWF0aW9uLmxlbmd0aCB8fCAtIDE7
CisJCQl2YXIgZnBzID0gYW5pbWF0aW9uLmZwcyB8fCAzMDsKKworCQkJdmFyIGhpZXJhcmNoeVRy
YWNrcyA9IGFuaW1hdGlvbi5oaWVyYXJjaHkgfHwgW107CisKKwkJCWZvciAoIHZhciBoID0gMDsg
aCA8IGhpZXJhcmNoeVRyYWNrcy5sZW5ndGg7IGggKysgKSB7CisKKwkJCQl2YXIgYW5pbWF0aW9u
S2V5cyA9IGhpZXJhcmNoeVRyYWNrc1sgaCBdLmtleXM7CisKKwkJCQkvLyBza2lwIGVtcHR5IHRy
YWNrcworCQkJCWlmICggISBhbmltYXRpb25LZXlzIHx8IGFuaW1hdGlvbktleXMubGVuZ3RoID09
PSAwICkgY29udGludWU7CisKKwkJCQkvLyBwcm9jZXNzIG1vcnBoIHRhcmdldHMKKwkJCQlpZiAo
IGFuaW1hdGlvbktleXNbIDAgXS5tb3JwaFRhcmdldHMgKSB7CisKKwkJCQkJLy8gZmlndXJlIG91
dCBhbGwgbW9ycGggdGFyZ2V0cyB1c2VkIGluIHRoaXMgdHJhY2sKKwkJCQkJdmFyIG1vcnBoVGFy
Z2V0TmFtZXMgPSB7fTsKKworCQkJCQlmb3IgKCB2YXIgayA9IDA7IGsgPCBhbmltYXRpb25LZXlz
Lmxlbmd0aDsgayArKyApIHsKKworCQkJCQkJaWYgKCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhU
YXJnZXRzICkgeworCisJCQkJCQkJZm9yICggdmFyIG0gPSAwOyBtIDwgYW5pbWF0aW9uS2V5c1sg
ayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gKysgKSB7CisKKwkJCQkJCQkJbW9ycGhUYXJnZXRO
YW1lc1sgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0c1sgbSBdIF0gPSAtIDE7CisKKwkJ
CQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQkJLy8gY3JlYXRlIGEgdHJhY2sgZm9y
IGVhY2ggbW9ycGggdGFyZ2V0IHdpdGggYWxsIHplcm8KKwkJCQkJLy8gbW9ycGhUYXJnZXRJbmZs
dWVuY2VzIGV4Y2VwdCBmb3IgdGhlIGtleXMgaW4gd2hpY2gKKwkJCQkJLy8gdGhlIG1vcnBoVGFy
Z2V0IGlzIG5hbWVkLgorCQkJCQlmb3IgKCB2YXIgbW9ycGhUYXJnZXROYW1lIGluIG1vcnBoVGFy
Z2V0TmFtZXMgKSB7CisKKwkJCQkJCXZhciB0aW1lcyA9IFtdOworCQkJCQkJdmFyIHZhbHVlcyA9
IFtdOworCisJCQkJCQlmb3IgKCB2YXIgbSA9IDA7IG0gIT09IGFuaW1hdGlvbktleXNbIGsgXS5t
b3JwaFRhcmdldHMubGVuZ3RoOyArKyBtICkgeworCisJCQkJCQkJdmFyIGFuaW1hdGlvbktleSA9
IGFuaW1hdGlvbktleXNbIGsgXTsKKworCQkJCQkJCXRpbWVzLnB1c2goIGFuaW1hdGlvbktleS50
aW1lICk7CisJCQkJCQkJdmFsdWVzLnB1c2goICggYW5pbWF0aW9uS2V5Lm1vcnBoVGFyZ2V0ID09
PSBtb3JwaFRhcmdldE5hbWUgKSA/IDEgOiAwICk7CisKKwkJCQkJCX0KKworCQkJCQkJdHJhY2tz
LnB1c2goIG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKCAnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWycg
KyBtb3JwaFRhcmdldE5hbWUgKyAnXScsIHRpbWVzLCB2YWx1ZXMgKSApOworCisJCQkJCX0KKwor
CQkJCQlkdXJhdGlvbiA9IG1vcnBoVGFyZ2V0TmFtZXMubGVuZ3RoICogKCBmcHMgfHwgMS4wICk7
CisKKwkJCQl9IGVsc2UgeworCisJCQkJCS8vIC4uLmFzc3VtZSBza2VsZXRhbCBhbmltYXRpb24K
KworCQkJCQl2YXIgYm9uZU5hbWUgPSAnLmJvbmVzWycgKyBib25lc1sgaCBdLm5hbWUgKyAnXSc7
CisKKwkJCQkJYWRkTm9uZW1wdHlUcmFjaygKKwkJCQkJCQlWZWN0b3JLZXlmcmFtZVRyYWNrLCBi
b25lTmFtZSArICcucG9zaXRpb24nLAorCQkJCQkJCWFuaW1hdGlvbktleXMsICdwb3MnLCB0cmFj
a3MgKTsKKworCQkJCQlhZGROb25lbXB0eVRyYWNrKAorCQkJCQkJCVF1YXRlcm5pb25LZXlmcmFt
ZVRyYWNrLCBib25lTmFtZSArICcucXVhdGVybmlvbicsCisJCQkJCQkJYW5pbWF0aW9uS2V5cywg
J3JvdCcsIHRyYWNrcyApOworCisJCQkJCWFkZE5vbmVtcHR5VHJhY2soCisJCQkJCQkJVmVjdG9y
S2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnNjYWxlJywKKwkJCQkJCQlhbmltYXRpb25LZXlz
LCAnc2NsJywgdHJhY2tzICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCB0cmFja3MubGVu
Z3RoID09PSAwICkgeworCisJCQkJcmV0dXJuIG51bGw7CisKKwkJCX0KKworCQkJdmFyIGNsaXAg
PSBuZXcgQW5pbWF0aW9uQ2xpcCggY2xpcE5hbWUsIGR1cmF0aW9uLCB0cmFja3MgKTsKKworCQkJ
cmV0dXJuIGNsaXA7CisKKwkJfQorCisJfSApOworCisJT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9u
Q2xpcC5wcm90b3R5cGUsIHsKKworCQlyZXNldER1cmF0aW9uOiBmdW5jdGlvbiAoKSB7CisKKwkJ
CXZhciB0cmFja3MgPSB0aGlzLnRyYWNrcywgZHVyYXRpb24gPSAwOworCisJCQlmb3IgKCB2YXIg
aSA9IDAsIG4gPSB0cmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisJCQkJdmFyIHRy
YWNrID0gdGhpcy50cmFja3NbIGkgXTsKKworCQkJCWR1cmF0aW9uID0gTWF0aC5tYXgoIGR1cmF0
aW9uLCB0cmFjay50aW1lc1sgdHJhY2sudGltZXMubGVuZ3RoIC0gMSBdICk7CisKKwkJCX0KKwor
CQkJdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uOworCisJCX0sCisKKwkJdHJpbTogZnVuY3Rpb24g
KCkgeworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysg
KSB7CisKKwkJCQl0aGlzLnRyYWNrc1sgaSBdLnRyaW0oIDAsIHRoaXMuZHVyYXRpb24gKTsKKwor
CQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCW9wdGltaXplOiBmdW5jdGlvbiAo
KSB7CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyAp
IHsKKworCQkJCXRoaXMudHJhY2tzWyBpIF0ub3B0aW1pemUoKTsKKworCQkJfQorCisJCQlyZXR1
cm4gdGhpczsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0
dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gTWF0ZXJpYWxMb2FkZXIoIG1hbmFn
ZXIgKSB7CisKKwkJdGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1h
bmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CisJCXRoaXMudGV4dHVyZXMgPSB7fTsKKwor
CX0KKworCU9iamVjdC5hc3NpZ24oIE1hdGVyaWFsTG9hZGVyLnByb3RvdHlwZSwgeworCisJCWxv
YWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CisKKwkJ
CXZhciBzY29wZSA9IHRoaXM7CisKKwkJCXZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2Nv
cGUubWFuYWdlciApOworCQkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkgewor
CisJCQkJb25Mb2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTsKKworCQkJ
fSwgb25Qcm9ncmVzcywgb25FcnJvciApOworCisJCX0sCisKKwkJc2V0VGV4dHVyZXM6IGZ1bmN0
aW9uICggdmFsdWUgKSB7CisKKwkJCXRoaXMudGV4dHVyZXMgPSB2YWx1ZTsKKworCQl9LAorCisJ
CXBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7CisKKwkJCXZhciB0ZXh0dXJlcyA9IHRoaXMudGV4
dHVyZXM7CisKKwkJCWZ1bmN0aW9uIGdldFRleHR1cmUoIG5hbWUgKSB7CisKKwkJCQlpZiAoIHRl
eHR1cmVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQljb25zb2xlLndhcm4oICdU
SFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUnLCBuYW1lICk7CisKKwkJCQl9
CisKKwkJCQlyZXR1cm4gdGV4dHVyZXNbIG5hbWUgXTsKKworCQkJfQorCisJCQl2YXIgbWF0ZXJp
YWwgPSBuZXcgTWF0ZXJpYWxzWyBqc29uLnR5cGUgXSgpOworCisJCQlpZiAoIGpzb24udXVpZCAh
PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXVpZCA9IGpzb24udXVpZDsKKwkJCWlmICgganNvbi5u
YW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5uYW1lID0ganNvbi5uYW1lOworCQkJaWYgKCBq
c29uLmNvbG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvci5zZXRIZXgoIGpzb24uY29s
b3IgKTsKKwkJCWlmICgganNvbi5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJv
dWdobmVzcyA9IGpzb24ucm91Z2huZXNzOworCQkJaWYgKCBqc29uLm1ldGFsbmVzcyAhPT0gdW5k
ZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzID0ganNvbi5tZXRhbG5lc3M7CisJCQlpZiAoIGpz
b24uZW1pc3NpdmUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlLnNldEhleCgganNv
bi5lbWlzc2l2ZSApOworCQkJaWYgKCBqc29uLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgKSBtYXRl
cmlhbC5zcGVjdWxhci5zZXRIZXgoIGpzb24uc3BlY3VsYXIgKTsKKwkJCWlmICgganNvbi5zaGlu
aW5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoaW5pbmVzcyA9IGpzb24uc2hpbmluZXNz
OworCQkJaWYgKCBqc29uLmNsZWFyQ29hdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJD
b2F0ID0ganNvbi5jbGVhckNvYXQ7CisJCQlpZiAoIGpzb24uY2xlYXJDb2F0Um91Z2huZXNzICE9
PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgPSBqc29uLmNsZWFyQ29h
dFJvdWdobmVzczsKKwkJCWlmICgganNvbi51bmlmb3JtcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJp
YWwudW5pZm9ybXMgPSBqc29uLnVuaWZvcm1zOworCQkJaWYgKCBqc29uLnZlcnRleFNoYWRlciAh
PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmVydGV4U2hhZGVyID0ganNvbi52ZXJ0ZXhTaGFkZXI7
CisJCQlpZiAoIGpzb24uZnJhZ21lbnRTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZy
YWdtZW50U2hhZGVyID0ganNvbi5mcmFnbWVudFNoYWRlcjsKKwkJCWlmICgganNvbi52ZXJ0ZXhD
b2xvcnMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZlcnRleENvbG9ycyA9IGpzb24udmVydGV4
Q29sb3JzOworCQkJaWYgKCBqc29uLmZvZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZm9nID0g
anNvbi5mb2c7CisJCQlpZiAoIGpzb24uc2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwu
c2hhZGluZyA9IGpzb24uc2hhZGluZzsKKwkJCWlmICgganNvbi5ibGVuZGluZyAhPT0gdW5kZWZp
bmVkICkgbWF0ZXJpYWwuYmxlbmRpbmcgPSBqc29uLmJsZW5kaW5nOworCQkJaWYgKCBqc29uLnNp
ZGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpZGUgPSBqc29uLnNpZGU7CisJCQlpZiAoIGpz
b24ub3BhY2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwub3BhY2l0eSA9IGpzb24ub3BhY2l0
eTsKKwkJCWlmICgganNvbi50cmFuc3BhcmVudCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudHJh
bnNwYXJlbnQgPSBqc29uLnRyYW5zcGFyZW50OworCQkJaWYgKCBqc29uLmFscGhhVGVzdCAhPT0g
dW5kZWZpbmVkICkgbWF0ZXJpYWwuYWxwaGFUZXN0ID0ganNvbi5hbHBoYVRlc3Q7CisJCQlpZiAo
IGpzb24uZGVwdGhUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFRlc3QgPSBqc29u
LmRlcHRoVGVzdDsKKwkJCWlmICgganNvbi5kZXB0aFdyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRl
cmlhbC5kZXB0aFdyaXRlID0ganNvbi5kZXB0aFdyaXRlOworCQkJaWYgKCBqc29uLmNvbG9yV3Jp
dGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yV3JpdGUgPSBqc29uLmNvbG9yV3JpdGU7
CisJCQlpZiAoIGpzb24ud2lyZWZyYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJh
bWUgPSBqc29uLndpcmVmcmFtZTsKKwkJCWlmICgganNvbi53aXJlZnJhbWVMaW5ld2lkdGggIT09
IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aCA9IGpzb24ud2lyZWZyYW1l
TGluZXdpZHRoOworCQkJaWYgKCBqc29uLndpcmVmcmFtZUxpbmVjYXAgIT09IHVuZGVmaW5lZCAp
IG1hdGVyaWFsLndpcmVmcmFtZUxpbmVjYXAgPSBqc29uLndpcmVmcmFtZUxpbmVjYXA7CisJCQlp
ZiAoIGpzb24ud2lyZWZyYW1lTGluZWpvaW4gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVm
cmFtZUxpbmVqb2luID0ganNvbi53aXJlZnJhbWVMaW5lam9pbjsKKwkJCWlmICgganNvbi5za2lu
bmluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2tpbm5pbmcgPSBqc29uLnNraW5uaW5nOwor
CQkJaWYgKCBqc29uLm1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubW9ycGhU
YXJnZXRzID0ganNvbi5tb3JwaFRhcmdldHM7CisKKwkJCS8vIGZvciBQb2ludHNNYXRlcmlhbAor
CisJCQlpZiAoIGpzb24uc2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZSA9IGpzb24u
c2l6ZTsKKwkJCWlmICgganNvbi5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVy
aWFsLnNpemVBdHRlbnVhdGlvbiA9IGpzb24uc2l6ZUF0dGVudWF0aW9uOworCisJCQkvLyBtYXBz
CisKKwkJCWlmICgganNvbi5tYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1hcCA9IGdldFRl
eHR1cmUoIGpzb24ubWFwICk7CisKKwkJCWlmICgganNvbi5hbHBoYU1hcCAhPT0gdW5kZWZpbmVk
ICkgeworCisJCQkJbWF0ZXJpYWwuYWxwaGFNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFscGhhTWFw
ICk7CisJCQkJbWF0ZXJpYWwudHJhbnNwYXJlbnQgPSB0cnVlOworCisJCQl9CisKKwkJCWlmICgg
anNvbi5idW1wTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wTWFwID0gZ2V0VGV4dHVy
ZSgganNvbi5idW1wTWFwICk7CisJCQlpZiAoIGpzb24uYnVtcFNjYWxlICE9PSB1bmRlZmluZWQg
KSBtYXRlcmlhbC5idW1wU2NhbGUgPSBqc29uLmJ1bXBTY2FsZTsKKworCQkJaWYgKCBqc29uLm5v
cm1hbE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubm9ybWFsTWFwID0gZ2V0VGV4dHVyZSgg
anNvbi5ub3JtYWxNYXAgKTsKKwkJCWlmICgganNvbi5ub3JtYWxTY2FsZSAhPT0gdW5kZWZpbmVk
ICkgeworCisJCQkJdmFyIG5vcm1hbFNjYWxlID0ganNvbi5ub3JtYWxTY2FsZTsKKworCQkJCWlm
ICggQXJyYXkuaXNBcnJheSggbm9ybWFsU2NhbGUgKSA9PT0gZmFsc2UgKSB7CisKKwkJCQkJLy8g
QmxlbmRlciBleHBvcnRlciB1c2VkIHRvIGV4cG9ydCBhIHNjYWxhci4gU2VlICM3NDU5CisKKwkJ
CQkJbm9ybWFsU2NhbGUgPSBbIG5vcm1hbFNjYWxlLCBub3JtYWxTY2FsZSBdOworCisJCQkJfQor
CisJCQkJbWF0ZXJpYWwubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggbm9y
bWFsU2NhbGUgKTsKKworCQkJfQorCisJCQlpZiAoIGpzb24uZGlzcGxhY2VtZW50TWFwICE9PSB1
bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmRp
c3BsYWNlbWVudE1hcCApOworCQkJaWYgKCBqc29uLmRpc3BsYWNlbWVudFNjYWxlICE9PSB1bmRl
ZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZSA9IGpzb24uZGlzcGxhY2VtZW50U2Nh
bGU7CisJCQlpZiAoIGpzb24uZGlzcGxhY2VtZW50QmlhcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJp
YWwuZGlzcGxhY2VtZW50QmlhcyA9IGpzb24uZGlzcGxhY2VtZW50QmlhczsKKworCQkJaWYgKCBq
c29uLnJvdWdobmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm91Z2huZXNzTWFwID0g
Z2V0VGV4dHVyZSgganNvbi5yb3VnaG5lc3NNYXAgKTsKKwkJCWlmICgganNvbi5tZXRhbG5lc3NN
YXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzc01hcCA9IGdldFRleHR1cmUoIGpz
b24ubWV0YWxuZXNzTWFwICk7CisKKwkJCWlmICgganNvbi5lbWlzc2l2ZU1hcCAhPT0gdW5kZWZp
bmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVtaXNzaXZlTWFw
ICk7CisJCQlpZiAoIGpzb24uZW1pc3NpdmVJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVy
aWFsLmVtaXNzaXZlSW50ZW5zaXR5ID0ganNvbi5lbWlzc2l2ZUludGVuc2l0eTsKKworCQkJaWYg
KCBqc29uLnNwZWN1bGFyTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhck1hcCA9
IGdldFRleHR1cmUoIGpzb24uc3BlY3VsYXJNYXAgKTsKKworCQkJaWYgKCBqc29uLmVudk1hcCAh
PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW52TWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbnZNYXAg
KTsKKworCQkJaWYgKCBqc29uLnJlZmxlY3Rpdml0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwu
cmVmbGVjdGl2aXR5ID0ganNvbi5yZWZsZWN0aXZpdHk7CisKKwkJCWlmICgganNvbi5saWdodE1h
cCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGlnaHRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmxp
Z2h0TWFwICk7CisJCQlpZiAoIGpzb24ubGlnaHRNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCAp
IG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5ID0ganNvbi5saWdodE1hcEludGVuc2l0eTsKKwor
CQkJaWYgKCBqc29uLmFvTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hb01hcCA9IGdldFRl
eHR1cmUoIGpzb24uYW9NYXAgKTsKKwkJCWlmICgganNvbi5hb01hcEludGVuc2l0eSAhPT0gdW5k
ZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHkgPSBqc29uLmFvTWFwSW50ZW5zaXR5Owor
CisJCQlpZiAoIGpzb24uZ3JhZGllbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdyYWRp
ZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5ncmFkaWVudE1hcCApOworCisJCQlyZXR1cm4gbWF0
ZXJpYWw7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRw
Oi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCBt
YW5hZ2VyICkgeworCisJCXRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkg
PyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyOworCisJfQorCisJT2JqZWN0LmFzc2ln
biggQnVmZmVyR2VvbWV0cnlMb2FkZXIucHJvdG90eXBlLCB7CisKKwkJbG9hZDogZnVuY3Rpb24g
KCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKKworCQkJdmFyIHNjb3BlID0g
dGhpczsKKworCQkJdmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7
CisJCQlsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7CisKKwkJCQlvbkxvYWQo
IHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApOworCisJCQl9LCBvblByb2dyZXNz
LCBvbkVycm9yICk7CisKKwkJfSwKKworCQlwYXJzZTogZnVuY3Rpb24gKCBqc29uICkgeworCisJ
CQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKworCQkJdmFyIGluZGV4ID0g
anNvbi5kYXRhLmluZGV4OworCisJCQlpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJ
CQl2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGluZGV4LnR5cGUgXSggaW5kZXgu
YXJyYXkgKTsKKwkJCQlnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlw
ZWRBcnJheSwgMSApICk7CisKKwkJCX0KKworCQkJdmFyIGF0dHJpYnV0ZXMgPSBqc29uLmRhdGEu
YXR0cmlidXRlczsKKworCQkJZm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkgeworCisJCQkJ
dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdOworCQkJCXZhciB0eXBlZEFycmF5ID0g
bmV3IFRZUEVEX0FSUkFZU1sgYXR0cmlidXRlLnR5cGUgXSggYXR0cmlidXRlLmFycmF5ICk7CisK
KwkJCQlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoIGtleSwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlw
ZWRBcnJheSwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUubm9ybWFsaXplZCApICk7CisK
KwkJCX0KKworCQkJdmFyIGdyb3VwcyA9IGpzb24uZGF0YS5ncm91cHMgfHwganNvbi5kYXRhLmRy
YXdjYWxscyB8fCBqc29uLmRhdGEub2Zmc2V0czsKKworCQkJaWYgKCBncm91cHMgIT09IHVuZGVm
aW5lZCApIHsKKworCQkJCWZvciAoIHZhciBpID0gMCwgbiA9IGdyb3Vwcy5sZW5ndGg7IGkgIT09
IG47ICsrIGkgKSB7CisKKwkJCQkJdmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07CisKKwkJCQkJZ2Vv
bWV0cnkuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJ
bmRleCApOworCisJCQkJfQorCisJCQl9CisKKwkJCXZhciBib3VuZGluZ1NwaGVyZSA9IGpzb24u
ZGF0YS5ib3VuZGluZ1NwaGVyZTsKKworCQkJaWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZp
bmVkICkgeworCisJCQkJdmFyIGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCQlpZiAoIGJv
dW5kaW5nU3BoZXJlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWNlbnRlci5mcm9t
QXJyYXkoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciApOworCisJCQkJfQorCisJCQkJZ2VvbWV0cnku
Ym91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCBjZW50ZXIsIGJvdW5kaW5nU3BoZXJlLnJhZGl1
cyApOworCisJCQl9CisKKwkJCXJldHVybiBnZW9tZXRyeTsKKworCQl9CisKKwl9ICk7CisKKwl2
YXIgVFlQRURfQVJSQVlTID0geworCQlJbnQ4QXJyYXk6IEludDhBcnJheSwKKwkJVWludDhBcnJh
eTogVWludDhBcnJheSwKKwkJLy8gV29ya2Fyb3VuZCBmb3IgSUUxMSBwcmUgS0IyOTI5NDM3LiBT
ZWUgIzExNDQwCisJCVVpbnQ4Q2xhbXBlZEFycmF5OiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkg
IT09ICd1bmRlZmluZWQnID8gVWludDhDbGFtcGVkQXJyYXkgOiBVaW50OEFycmF5LAorCQlJbnQx
NkFycmF5OiBJbnQxNkFycmF5LAorCQlVaW50MTZBcnJheTogVWludDE2QXJyYXksCisJCUludDMy
QXJyYXk6IEludDMyQXJyYXksCisJCVVpbnQzMkFycmF5OiBVaW50MzJBcnJheSwKKwkJRmxvYXQz
MkFycmF5OiBGbG9hdDMyQXJyYXksCisJCUZsb2F0NjRBcnJheTogRmxvYXQ2NEFycmF5CisJfTsK
KworCS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20v
CisJICovCisKKwlmdW5jdGlvbiBMb2FkZXIoKSB7CisKKwkJdGhpcy5vbkxvYWRTdGFydCA9IGZ1
bmN0aW9uICgpIHt9OworCQl0aGlzLm9uTG9hZFByb2dyZXNzID0gZnVuY3Rpb24gKCkge307CisJ
CXRoaXMub25Mb2FkQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7fTsKKworCX0KKworCUxvYWRlci5I
YW5kbGVycyA9IHsKKworCQloYW5kbGVyczogW10sCisKKwkJYWRkOiBmdW5jdGlvbiAoIHJlZ2V4
LCBsb2FkZXIgKSB7CisKKwkJCXRoaXMuaGFuZGxlcnMucHVzaCggcmVnZXgsIGxvYWRlciApOwor
CisJCX0sCisKKwkJZ2V0OiBmdW5jdGlvbiAoIGZpbGUgKSB7CisKKwkJCXZhciBoYW5kbGVycyA9
IHRoaXMuaGFuZGxlcnM7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0
aDsgaSA8IGw7IGkgKz0gMiApIHsKKworCQkJCXZhciByZWdleCA9IGhhbmRsZXJzWyBpIF07CisJ
CQkJdmFyIGxvYWRlciA9IGhhbmRsZXJzWyBpICsgMSBdOworCisJCQkJaWYgKCByZWdleC50ZXN0
KCBmaWxlICkgKSB7CisKKwkJCQkJcmV0dXJuIGxvYWRlcjsKKworCQkJCX0KKworCQkJfQorCisJ
CQlyZXR1cm4gbnVsbDsKKworCQl9CisKKwl9OworCisJT2JqZWN0LmFzc2lnbiggTG9hZGVyLnBy
b3RvdHlwZSwgeworCisJCWNyb3NzT3JpZ2luOiB1bmRlZmluZWQsCisKKwkJZXh0cmFjdFVybEJh
c2U6IGZ1bmN0aW9uICggdXJsICkgeworCisJCQl2YXIgcGFydHMgPSB1cmwuc3BsaXQoICcvJyAp
OworCisJCQlpZiAoIHBhcnRzLmxlbmd0aCA9PT0gMSApIHJldHVybiAnLi8nOworCisJCQlwYXJ0
cy5wb3AoKTsKKworCQkJcmV0dXJuIHBhcnRzLmpvaW4oICcvJyApICsgJy8nOworCisJCX0sCisK
KwkJaW5pdE1hdGVyaWFsczogZnVuY3Rpb24gKCBtYXRlcmlhbHMsIHRleHR1cmVQYXRoLCBjcm9z
c09yaWdpbiApIHsKKworCQkJdmFyIGFycmF5ID0gW107CisKKwkJCWZvciAoIHZhciBpID0gMDsg
aSA8IG1hdGVyaWFscy5sZW5ndGg7ICsrIGkgKSB7CisKKwkJCQlhcnJheVsgaSBdID0gdGhpcy5j
cmVhdGVNYXRlcmlhbCggbWF0ZXJpYWxzWyBpIF0sIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiAp
OworCisJCQl9CisKKwkJCXJldHVybiBhcnJheTsKKworCQl9LAorCisJCWNyZWF0ZU1hdGVyaWFs
OiAoIGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIEJsZW5kaW5nTW9kZSA9IHsKKwkJCQlOb0JsZW5k
aW5nOiBOb0JsZW5kaW5nLAorCQkJCU5vcm1hbEJsZW5kaW5nOiBOb3JtYWxCbGVuZGluZywKKwkJ
CQlBZGRpdGl2ZUJsZW5kaW5nOiBBZGRpdGl2ZUJsZW5kaW5nLAorCQkJCVN1YnRyYWN0aXZlQmxl
bmRpbmc6IFN1YnRyYWN0aXZlQmxlbmRpbmcsCisJCQkJTXVsdGlwbHlCbGVuZGluZzogTXVsdGlw
bHlCbGVuZGluZywKKwkJCQlDdXN0b21CbGVuZGluZzogQ3VzdG9tQmxlbmRpbmcKKwkJCX07CisK
KwkJCXZhciBjb2xvciA9IG5ldyBDb2xvcigpOworCQkJdmFyIHRleHR1cmVMb2FkZXIgPSBuZXcg
VGV4dHVyZUxvYWRlcigpOworCQkJdmFyIG1hdGVyaWFsTG9hZGVyID0gbmV3IE1hdGVyaWFsTG9h
ZGVyKCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiBjcmVhdGVNYXRlcmlhbCggbSwgdGV4dHVyZVBh
dGgsIGNyb3NzT3JpZ2luICkgeworCisJCQkJLy8gY29udmVydCBmcm9tIG9sZCBtYXRlcmlhbCBm
b3JtYXQKKworCQkJCXZhciB0ZXh0dXJlcyA9IHt9OworCisJCQkJZnVuY3Rpb24gbG9hZFRleHR1
cmUoIHBhdGgsIHJlcGVhdCwgb2Zmc2V0LCB3cmFwLCBhbmlzb3Ryb3B5ICkgeworCisJCQkJCXZh
ciBmdWxsUGF0aCA9IHRleHR1cmVQYXRoICsgcGF0aDsKKwkJCQkJdmFyIGxvYWRlciA9IExvYWRl
ci5IYW5kbGVycy5nZXQoIGZ1bGxQYXRoICk7CisKKwkJCQkJdmFyIHRleHR1cmU7CisKKwkJCQkJ
aWYgKCBsb2FkZXIgIT09IG51bGwgKSB7CisKKwkJCQkJCXRleHR1cmUgPSBsb2FkZXIubG9hZCgg
ZnVsbFBhdGggKTsKKworCQkJCQl9IGVsc2UgeworCisJCQkJCQl0ZXh0dXJlTG9hZGVyLnNldENy
b3NzT3JpZ2luKCBjcm9zc09yaWdpbiApOworCQkJCQkJdGV4dHVyZSA9IHRleHR1cmVMb2FkZXIu
bG9hZCggZnVsbFBhdGggKTsKKworCQkJCQl9CisKKwkJCQkJaWYgKCByZXBlYXQgIT09IHVuZGVm
aW5lZCApIHsKKworCQkJCQkJdGV4dHVyZS5yZXBlYXQuZnJvbUFycmF5KCByZXBlYXQgKTsKKwor
CQkJCQkJaWYgKCByZXBlYXRbIDAgXSAhPT0gMSApIHRleHR1cmUud3JhcFMgPSBSZXBlYXRXcmFw
cGluZzsKKwkJCQkJCWlmICggcmVwZWF0WyAxIF0gIT09IDEgKSB0ZXh0dXJlLndyYXBUID0gUmVw
ZWF0V3JhcHBpbmc7CisKKwkJCQkJfQorCisJCQkJCWlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQg
KSB7CisKKwkJCQkJCXRleHR1cmUub2Zmc2V0LmZyb21BcnJheSggb2Zmc2V0ICk7CisKKwkJCQkJ
fQorCisJCQkJCWlmICggd3JhcCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCQlpZiAoIHdyYXBb
IDAgXSA9PT0gJ3JlcGVhdCcgKSB0ZXh0dXJlLndyYXBTID0gUmVwZWF0V3JhcHBpbmc7CisJCQkJ
CQlpZiAoIHdyYXBbIDAgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBTID0gTWlycm9yZWRS
ZXBlYXRXcmFwcGluZzsKKworCQkJCQkJaWYgKCB3cmFwWyAxIF0gPT09ICdyZXBlYXQnICkgdGV4
dHVyZS53cmFwVCA9IFJlcGVhdFdyYXBwaW5nOworCQkJCQkJaWYgKCB3cmFwWyAxIF0gPT09ICdt
aXJyb3InICkgdGV4dHVyZS53cmFwVCA9IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc7CisKKwkJCQkJ
fQorCisJCQkJCWlmICggYW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCQl0ZXh0
dXJlLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5OworCisJCQkJCX0KKworCQkJCQl2YXIgdXVpZCA9
IF9NYXRoLmdlbmVyYXRlVVVJRCgpOworCisJCQkJCXRleHR1cmVzWyB1dWlkIF0gPSB0ZXh0dXJl
OworCisJCQkJCXJldHVybiB1dWlkOworCisJCQkJfQorCisJCQkJLy8KKworCQkJCXZhciBqc29u
ID0geworCQkJCQl1dWlkOiBfTWF0aC5nZW5lcmF0ZVVVSUQoKSwKKwkJCQkJdHlwZTogJ01lc2hM
YW1iZXJ0TWF0ZXJpYWwnCisJCQkJfTsKKworCQkJCWZvciAoIHZhciBuYW1lIGluIG0gKSB7CisK
KwkJCQkJdmFyIHZhbHVlID0gbVsgbmFtZSBdOworCisJCQkJCXN3aXRjaCAoIG5hbWUgKSB7CisK
KwkJCQkJCWNhc2UgJ0RiZ0NvbG9yJzoKKwkJCQkJCWNhc2UgJ0RiZ0luZGV4JzoKKwkJCQkJCWNh
c2UgJ29wdGljYWxEZW5zaXR5JzoKKwkJCQkJCWNhc2UgJ2lsbHVtaW5hdGlvbic6CisJCQkJCQkJ
YnJlYWs7CisJCQkJCQljYXNlICdEYmdOYW1lJzoKKwkJCQkJCQlqc29uLm5hbWUgPSB2YWx1ZTsK
KwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ2JsZW5kaW5nJzoKKwkJCQkJCQlqc29uLmJsZW5k
aW5nID0gQmxlbmRpbmdNb2RlWyB2YWx1ZSBdOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAn
Y29sb3JBbWJpZW50JzoKKwkJCQkJCWNhc2UgJ21hcEFtYmllbnQnOgorCQkJCQkJCWNvbnNvbGUu
d2FybiggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDonLCBuYW1lLCAnaXMgbm8gbG9uZ2Vy
IHN1cHBvcnRlZC4nICk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdjb2xvckRpZmZ1c2Un
OgorCQkJCQkJCWpzb24uY29sb3IgPSBjb2xvci5mcm9tQXJyYXkoIHZhbHVlICkuZ2V0SGV4KCk7
CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdjb2xvclNwZWN1bGFyJzoKKwkJCQkJCQlqc29u
LnNwZWN1bGFyID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhleCgpOworCQkJCQkJCWJy
ZWFrOworCQkJCQkJY2FzZSAnY29sb3JFbWlzc2l2ZSc6CisJCQkJCQkJanNvbi5lbWlzc2l2ZSA9
IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJ
CWNhc2UgJ3NwZWN1bGFyQ29lZic6CisJCQkJCQkJanNvbi5zaGluaW5lc3MgPSB2YWx1ZTsKKwkJ
CQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ3NoYWRpbmcnOgorCQkJCQkJCWlmICggdmFsdWUudG9M
b3dlckNhc2UoKSA9PT0gJ2Jhc2ljJyApIGpzb24udHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7
CisJCQkJCQkJaWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAncGhvbmcnICkganNvbi50eXBl
ID0gJ01lc2hQaG9uZ01hdGVyaWFsJzsKKwkJCQkJCQlpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkg
PT09ICdzdGFuZGFyZCcgKSBqc29uLnR5cGUgPSAnTWVzaFN0YW5kYXJkTWF0ZXJpYWwnOworCQkJ
CQkJCWJyZWFrOworCQkJCQkJY2FzZSAnbWFwRGlmZnVzZSc6CisJCQkJCQkJanNvbi5tYXAgPSBs
b2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwRGlmZnVzZVJlcGVhdCwgbS5tYXBEaWZmdXNlT2Zmc2V0
LCBtLm1hcERpZmZ1c2VXcmFwLCBtLm1hcERpZmZ1c2VBbmlzb3Ryb3B5ICk7CisJCQkJCQkJYnJl
YWs7CisJCQkJCQljYXNlICdtYXBEaWZmdXNlUmVwZWF0JzoKKwkJCQkJCWNhc2UgJ21hcERpZmZ1
c2VPZmZzZXQnOgorCQkJCQkJY2FzZSAnbWFwRGlmZnVzZVdyYXAnOgorCQkJCQkJY2FzZSAnbWFw
RGlmZnVzZUFuaXNvdHJvcHknOgorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnbWFwRW1pc3Np
dmUnOgorCQkJCQkJCWpzb24uZW1pc3NpdmVNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFw
RW1pc3NpdmVSZXBlYXQsIG0ubWFwRW1pc3NpdmVPZmZzZXQsIG0ubWFwRW1pc3NpdmVXcmFwLCBt
Lm1hcEVtaXNzaXZlQW5pc290cm9weSApOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnbWFw
RW1pc3NpdmVSZXBlYXQnOgorCQkJCQkJY2FzZSAnbWFwRW1pc3NpdmVPZmZzZXQnOgorCQkJCQkJ
Y2FzZSAnbWFwRW1pc3NpdmVXcmFwJzoKKwkJCQkJCWNhc2UgJ21hcEVtaXNzaXZlQW5pc290cm9w
eSc6CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdtYXBMaWdodCc6CisJCQkJCQkJanNvbi5s
aWdodE1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBMaWdodFJlcGVhdCwgbS5tYXBMaWdo
dE9mZnNldCwgbS5tYXBMaWdodFdyYXAsIG0ubWFwTGlnaHRBbmlzb3Ryb3B5ICk7CisJCQkJCQkJ
YnJlYWs7CisJCQkJCQljYXNlICdtYXBMaWdodFJlcGVhdCc6CisJCQkJCQljYXNlICdtYXBMaWdo
dE9mZnNldCc6CisJCQkJCQljYXNlICdtYXBMaWdodFdyYXAnOgorCQkJCQkJY2FzZSAnbWFwTGln
aHRBbmlzb3Ryb3B5JzoKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ21hcEFPJzoKKwkJCQkJ
CQlqc29uLmFvTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEFPUmVwZWF0LCBtLm1hcEFP
T2Zmc2V0LCBtLm1hcEFPV3JhcCwgbS5tYXBBT0FuaXNvdHJvcHkgKTsKKwkJCQkJCQlicmVhazsK
KwkJCQkJCWNhc2UgJ21hcEFPUmVwZWF0JzoKKwkJCQkJCWNhc2UgJ21hcEFPT2Zmc2V0JzoKKwkJ
CQkJCWNhc2UgJ21hcEFPV3JhcCc6CisJCQkJCQljYXNlICdtYXBBT0FuaXNvdHJvcHknOgorCQkJ
CQkJCWJyZWFrOworCQkJCQkJY2FzZSAnbWFwQnVtcCc6CisJCQkJCQkJanNvbi5idW1wTWFwID0g
bG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEJ1bXBSZXBlYXQsIG0ubWFwQnVtcE9mZnNldCwgbS5t
YXBCdW1wV3JhcCwgbS5tYXBCdW1wQW5pc290cm9weSApOworCQkJCQkJCWJyZWFrOworCQkJCQkJ
Y2FzZSAnbWFwQnVtcFNjYWxlJzoKKwkJCQkJCQlqc29uLmJ1bXBTY2FsZSA9IHZhbHVlOworCQkJ
CQkJCWJyZWFrOworCQkJCQkJY2FzZSAnbWFwQnVtcFJlcGVhdCc6CisJCQkJCQljYXNlICdtYXBC
dW1wT2Zmc2V0JzoKKwkJCQkJCWNhc2UgJ21hcEJ1bXBXcmFwJzoKKwkJCQkJCWNhc2UgJ21hcEJ1
bXBBbmlzb3Ryb3B5JzoKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ21hcE5vcm1hbCc6CisJ
CQkJCQkJanNvbi5ub3JtYWxNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTm9ybWFsUmVw
ZWF0LCBtLm1hcE5vcm1hbE9mZnNldCwgbS5tYXBOb3JtYWxXcmFwLCBtLm1hcE5vcm1hbEFuaXNv
dHJvcHkgKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ21hcE5vcm1hbEZhY3Rvcic6CisJ
CQkJCQkJanNvbi5ub3JtYWxTY2FsZSA9IFsgdmFsdWUsIHZhbHVlIF07CisJCQkJCQkJYnJlYWs7
CisJCQkJCQljYXNlICdtYXBOb3JtYWxSZXBlYXQnOgorCQkJCQkJY2FzZSAnbWFwTm9ybWFsT2Zm
c2V0JzoKKwkJCQkJCWNhc2UgJ21hcE5vcm1hbFdyYXAnOgorCQkJCQkJY2FzZSAnbWFwTm9ybWFs
QW5pc290cm9weSc6CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdtYXBTcGVjdWxhcic6CisJ
CQkJCQkJanNvbi5zcGVjdWxhck1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBTcGVjdWxh
clJlcGVhdCwgbS5tYXBTcGVjdWxhck9mZnNldCwgbS5tYXBTcGVjdWxhcldyYXAsIG0ubWFwU3Bl
Y3VsYXJBbmlzb3Ryb3B5ICk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdtYXBTcGVjdWxh
clJlcGVhdCc6CisJCQkJCQljYXNlICdtYXBTcGVjdWxhck9mZnNldCc6CisJCQkJCQljYXNlICdt
YXBTcGVjdWxhcldyYXAnOgorCQkJCQkJY2FzZSAnbWFwU3BlY3VsYXJBbmlzb3Ryb3B5JzoKKwkJ
CQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ21hcE1ldGFsbmVzcyc6CisJCQkJCQkJanNvbi5tZXRh
bG5lc3NNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTWV0YWxuZXNzUmVwZWF0LCBtLm1h
cE1ldGFsbmVzc09mZnNldCwgbS5tYXBNZXRhbG5lc3NXcmFwLCBtLm1hcE1ldGFsbmVzc0FuaXNv
dHJvcHkgKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ21hcE1ldGFsbmVzc1JlcGVhdCc6
CisJCQkJCQljYXNlICdtYXBNZXRhbG5lc3NPZmZzZXQnOgorCQkJCQkJY2FzZSAnbWFwTWV0YWxu
ZXNzV3JhcCc6CisJCQkJCQljYXNlICdtYXBNZXRhbG5lc3NBbmlzb3Ryb3B5JzoKKwkJCQkJCQli
cmVhazsKKwkJCQkJCWNhc2UgJ21hcFJvdWdobmVzcyc6CisJCQkJCQkJanNvbi5yb3VnaG5lc3NN
YXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwUm91Z2huZXNzUmVwZWF0LCBtLm1hcFJvdWdo
bmVzc09mZnNldCwgbS5tYXBSb3VnaG5lc3NXcmFwLCBtLm1hcFJvdWdobmVzc0FuaXNvdHJvcHkg
KTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ21hcFJvdWdobmVzc1JlcGVhdCc6CisJCQkJ
CQljYXNlICdtYXBSb3VnaG5lc3NPZmZzZXQnOgorCQkJCQkJY2FzZSAnbWFwUm91Z2huZXNzV3Jh
cCc6CisJCQkJCQljYXNlICdtYXBSb3VnaG5lc3NBbmlzb3Ryb3B5JzoKKwkJCQkJCQlicmVhazsK
KwkJCQkJCWNhc2UgJ21hcEFscGhhJzoKKwkJCQkJCQlqc29uLmFscGhhTWFwID0gbG9hZFRleHR1
cmUoIHZhbHVlLCBtLm1hcEFscGhhUmVwZWF0LCBtLm1hcEFscGhhT2Zmc2V0LCBtLm1hcEFscGhh
V3JhcCwgbS5tYXBBbHBoYUFuaXNvdHJvcHkgKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2Ug
J21hcEFscGhhUmVwZWF0JzoKKwkJCQkJCWNhc2UgJ21hcEFscGhhT2Zmc2V0JzoKKwkJCQkJCWNh
c2UgJ21hcEFscGhhV3JhcCc6CisJCQkJCQljYXNlICdtYXBBbHBoYUFuaXNvdHJvcHknOgorCQkJ
CQkJCWJyZWFrOworCQkJCQkJY2FzZSAnZmxpcFNpZGVkJzoKKwkJCQkJCQlqc29uLnNpZGUgPSBC
YWNrU2lkZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ2RvdWJsZVNpZGVkJzoKKwkJCQkJ
CQlqc29uLnNpZGUgPSBEb3VibGVTaWRlOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAndHJh
bnNwYXJlbmN5JzoKKwkJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0
ZXJpYWw6IHRyYW5zcGFyZW5jeSBoYXMgYmVlbiByZW5hbWVkIHRvIG9wYWNpdHknICk7CisJCQkJ
CQkJanNvbi5vcGFjaXR5ID0gdmFsdWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdkZXB0
aFRlc3QnOgorCQkJCQkJY2FzZSAnZGVwdGhXcml0ZSc6CisJCQkJCQljYXNlICdjb2xvcldyaXRl
JzoKKwkJCQkJCWNhc2UgJ29wYWNpdHknOgorCQkJCQkJY2FzZSAncmVmbGVjdGl2aXR5JzoKKwkJ
CQkJCWNhc2UgJ3RyYW5zcGFyZW50JzoKKwkJCQkJCWNhc2UgJ3Zpc2libGUnOgorCQkJCQkJY2Fz
ZSAnd2lyZWZyYW1lJzoKKwkJCQkJCQlqc29uWyBuYW1lIF0gPSB2YWx1ZTsKKwkJCQkJCQlicmVh
azsKKwkJCQkJCWNhc2UgJ3ZlcnRleENvbG9ycyc6CisJCQkJCQkJaWYgKCB2YWx1ZSA9PT0gdHJ1
ZSApIGpzb24udmVydGV4Q29sb3JzID0gVmVydGV4Q29sb3JzOworCQkJCQkJCWlmICggdmFsdWUg
PT09ICdmYWNlJyApIGpzb24udmVydGV4Q29sb3JzID0gRmFjZUNvbG9yczsKKwkJCQkJCQlicmVh
azsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkxvYWRlci5j
cmVhdGVNYXRlcmlhbDogVW5zdXBwb3J0ZWQnLCBuYW1lLCB2YWx1ZSApOworCQkJCQkJCWJyZWFr
OworCisJCQkJCX0KKworCQkJCX0KKworCQkJCWlmICgganNvbi50eXBlID09PSAnTWVzaEJhc2lj
TWF0ZXJpYWwnICkgZGVsZXRlIGpzb24uZW1pc3NpdmU7CisJCQkJaWYgKCBqc29uLnR5cGUgIT09
ICdNZXNoUGhvbmdNYXRlcmlhbCcgKSBkZWxldGUganNvbi5zcGVjdWxhcjsKKworCQkJCWlmICgg
anNvbi5vcGFjaXR5IDwgMSApIGpzb24udHJhbnNwYXJlbnQgPSB0cnVlOworCisJCQkJbWF0ZXJp
YWxMb2FkZXIuc2V0VGV4dHVyZXMoIHRleHR1cmVzICk7CisKKwkJCQlyZXR1cm4gbWF0ZXJpYWxM
b2FkZXIucGFyc2UoIGpzb24gKTsKKworCQkJfTsKKworCQl9ICkoKQorCisJfSApOworCisJLyoq
CisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIGFs
dGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworCSAqLworCisJZnVuY3Rpb24gSlNP
TkxvYWRlciggbWFuYWdlciApIHsKKworCQlpZiAoIHR5cGVvZiBtYW5hZ2VyID09PSAnYm9vbGVh
bicgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkpTT05Mb2FkZXI6IHNob3dTdGF0dXMg
cGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBjb25zdHJ1Y3Rvci4nICk7CisJCQltYW5h
Z2VyID0gdW5kZWZpbmVkOworCisJCX0KKworCQl0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09
IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKKworCQl0aGlz
LndpdGhDcmVkZW50aWFscyA9IGZhbHNlOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggSlNPTkxv
YWRlci5wcm90b3R5cGUsIHsKKworCQlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblBy
b2dyZXNzLCBvbkVycm9yICkgeworCisJCQl2YXIgc2NvcGUgPSB0aGlzOworCisJCQl2YXIgdGV4
dHVyZVBhdGggPSB0aGlzLnRleHR1cmVQYXRoICYmICggdHlwZW9mIHRoaXMudGV4dHVyZVBhdGgg
PT09ICJzdHJpbmciICkgPyB0aGlzLnRleHR1cmVQYXRoIDogTG9hZGVyLnByb3RvdHlwZS5leHRy
YWN0VXJsQmFzZSggdXJsICk7CisKKwkJCXZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhp
cy5tYW5hZ2VyICk7CisJCQlsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVk
ZW50aWFscyApOworCQkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkgeworCisJ
CQkJdmFyIGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7CisJCQkJdmFyIG1ldGFkYXRhID0ganNv
bi5tZXRhZGF0YTsKKworCQkJCWlmICggbWV0YWRhdGEgIT09IHVuZGVmaW5lZCApIHsKKworCQkJ
CQl2YXIgdHlwZSA9IG1ldGFkYXRhLnR5cGU7CisKKwkJCQkJaWYgKCB0eXBlICE9PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCQkJCWlmICggdHlwZS50b0xvd2VyQ2FzZSgpID09PSAnb2JqZWN0JyApIHsK
KworCQkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5KU09OTG9hZGVyOiAnICsgdXJsICsgJyBz
aG91bGQgYmUgbG9hZGVkIHdpdGggVEhSRUUuT2JqZWN0TG9hZGVyIGluc3RlYWQuJyApOworCQkJ
CQkJCXJldHVybjsKKworCQkJCQkJfQorCisJCQkJCQlpZiAoIHR5cGUudG9Mb3dlckNhc2UoKSA9
PT0gJ3NjZW5lJyApIHsKKworCQkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5KU09OTG9hZGVy
OiAnICsgdXJsICsgJyBzaG91bGQgYmUgbG9hZGVkIHdpdGggVEhSRUUuU2NlbmVMb2FkZXIgaW5z
dGVhZC4nICk7CisJCQkJCQkJcmV0dXJuOworCisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJfQor
CisJCQkJdmFyIG9iamVjdCA9IHNjb3BlLnBhcnNlKCBqc29uLCB0ZXh0dXJlUGF0aCApOworCQkJ
CW9uTG9hZCggb2JqZWN0Lmdlb21ldHJ5LCBvYmplY3QubWF0ZXJpYWxzICk7CisKKwkJCX0sIG9u
UHJvZ3Jlc3MsIG9uRXJyb3IgKTsKKworCQl9LAorCisJCXNldFRleHR1cmVQYXRoOiBmdW5jdGlv
biAoIHZhbHVlICkgeworCisJCQl0aGlzLnRleHR1cmVQYXRoID0gdmFsdWU7CisKKwkJfSwKKwor
CQlwYXJzZTogKCBmdW5jdGlvbiAoKSB7CisKKwkJCWZ1bmN0aW9uIHBhcnNlTW9kZWwoIGpzb24s
IGdlb21ldHJ5ICkgeworCisJCQkJZnVuY3Rpb24gaXNCaXRTZXQoIHZhbHVlLCBwb3NpdGlvbiAp
IHsKKworCQkJCQlyZXR1cm4gdmFsdWUgJiAoIDEgPDwgcG9zaXRpb24gKTsKKworCQkJCX0KKwor
CQkJCXZhciBpLCBqLCBmaSwKKworCQkJCQlvZmZzZXQsIHpMZW5ndGgsCisKKwkJCQkJY29sb3JJ
bmRleCwgbm9ybWFsSW5kZXgsIHV2SW5kZXgsIG1hdGVyaWFsSW5kZXgsCisKKwkJCQkJdHlwZSwK
KwkJCQkJaXNRdWFkLAorCQkJCQloYXNNYXRlcmlhbCwKKwkJCQkJaGFzRmFjZVZlcnRleFV2LAor
CQkJCQloYXNGYWNlTm9ybWFsLCBoYXNGYWNlVmVydGV4Tm9ybWFsLAorCQkJCQloYXNGYWNlQ29s
b3IsIGhhc0ZhY2VWZXJ0ZXhDb2xvciwKKworCQkJCQl2ZXJ0ZXgsIGZhY2UsIGZhY2VBLCBmYWNl
QiwgaGV4LCBub3JtYWwsCisKKwkJCQkJdXZMYXllciwgdXYsIHUsIHYsCisKKwkJCQkJZmFjZXMg
PSBqc29uLmZhY2VzLAorCQkJCQl2ZXJ0aWNlcyA9IGpzb24udmVydGljZXMsCisJCQkJCW5vcm1h
bHMgPSBqc29uLm5vcm1hbHMsCisJCQkJCWNvbG9ycyA9IGpzb24uY29sb3JzLAorCisJCQkJCXNj
YWxlID0ganNvbi5zY2FsZSwKKworCQkJCQluVXZMYXllcnMgPSAwOworCisKKwkJCQlpZiAoIGpz
b24udXZzICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJLy8gZGlzcmVnYXJkIGVtcHR5IGFycmF5
cworCisJCQkJCWZvciAoIGkgPSAwOyBpIDwganNvbi51dnMubGVuZ3RoOyBpICsrICkgeworCisJ
CQkJCQlpZiAoIGpzb24udXZzWyBpIF0ubGVuZ3RoICkgblV2TGF5ZXJzICsrOworCisJCQkJCX0K
KworCQkJCQlmb3IgKCBpID0gMDsgaSA8IG5VdkxheWVyczsgaSArKyApIHsKKworCQkJCQkJZ2Vv
bWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdID0gW107CisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJ
b2Zmc2V0ID0gMDsKKwkJCQl6TGVuZ3RoID0gdmVydGljZXMubGVuZ3RoOworCisJCQkJd2hpbGUg
KCBvZmZzZXQgPCB6TGVuZ3RoICkgeworCisJCQkJCXZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CisK
KwkJCQkJdmVydGV4LnggPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTsKKwkJCQkJdmVy
dGV4LnkgPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTsKKwkJCQkJdmVydGV4LnogPSB2
ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTsKKworCQkJCQlnZW9tZXRyeS52ZXJ0aWNlcy5w
dXNoKCB2ZXJ0ZXggKTsKKworCQkJCX0KKworCQkJCW9mZnNldCA9IDA7CisJCQkJekxlbmd0aCA9
IGZhY2VzLmxlbmd0aDsKKworCQkJCXdoaWxlICggb2Zmc2V0IDwgekxlbmd0aCApIHsKKworCQkJ
CQl0eXBlID0gZmFjZXNbIG9mZnNldCArKyBdOworCisJCQkJCWlzUXVhZCA9IGlzQml0U2V0KCB0
eXBlLCAwICk7CisJCQkJCWhhc01hdGVyaWFsID0gaXNCaXRTZXQoIHR5cGUsIDEgKTsKKwkJCQkJ
aGFzRmFjZVZlcnRleFV2ID0gaXNCaXRTZXQoIHR5cGUsIDMgKTsKKwkJCQkJaGFzRmFjZU5vcm1h
bCA9IGlzQml0U2V0KCB0eXBlLCA0ICk7CisJCQkJCWhhc0ZhY2VWZXJ0ZXhOb3JtYWwgPSBpc0Jp
dFNldCggdHlwZSwgNSApOworCQkJCQloYXNGYWNlQ29sb3IgPSBpc0JpdFNldCggdHlwZSwgNiAp
OworCQkJCQloYXNGYWNlVmVydGV4Q29sb3IgPSBpc0JpdFNldCggdHlwZSwgNyApOworCisJCQkJ
CS8vIGNvbnNvbGUubG9nKCJ0eXBlIiwgdHlwZSwgImJpdHMiLCBpc1F1YWQsIGhhc01hdGVyaWFs
LCBoYXNGYWNlVmVydGV4VXYsIGhhc0ZhY2VOb3JtYWwsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwsIGhh
c0ZhY2VDb2xvciwgaGFzRmFjZVZlcnRleENvbG9yKTsKKworCQkJCQlpZiAoIGlzUXVhZCApIHsK
KworCQkJCQkJZmFjZUEgPSBuZXcgRmFjZTMoKTsKKwkJCQkJCWZhY2VBLmEgPSBmYWNlc1sgb2Zm
c2V0IF07CisJCQkJCQlmYWNlQS5iID0gZmFjZXNbIG9mZnNldCArIDEgXTsKKwkJCQkJCWZhY2VB
LmMgPSBmYWNlc1sgb2Zmc2V0ICsgMyBdOworCisJCQkJCQlmYWNlQiA9IG5ldyBGYWNlMygpOwor
CQkJCQkJZmFjZUIuYSA9IGZhY2VzWyBvZmZzZXQgKyAxIF07CisJCQkJCQlmYWNlQi5iID0gZmFj
ZXNbIG9mZnNldCArIDIgXTsKKwkJCQkJCWZhY2VCLmMgPSBmYWNlc1sgb2Zmc2V0ICsgMyBdOwor
CisJCQkJCQlvZmZzZXQgKz0gNDsKKworCQkJCQkJaWYgKCBoYXNNYXRlcmlhbCApIHsKKworCQkJ
CQkJCW1hdGVyaWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07CisJCQkJCQkJZmFjZUEubWF0
ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7CisJCQkJCQkJZmFjZUIubWF0ZXJpYWxJbmRleCA9
IG1hdGVyaWFsSW5kZXg7CisKKwkJCQkJCX0KKworCQkJCQkJLy8gdG8gZ2V0IGZhY2UgPD0+IHV2
IGluZGV4IGNvcnJlc3BvbmRlbmNlCisKKwkJCQkJCWZpID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3Ro
OworCisJCQkJCQlpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHsKKworCQkJCQkJCWZvciAoIGkgPSAw
OyBpIDwgblV2TGF5ZXJzOyBpICsrICkgeworCisJCQkJCQkJCXV2TGF5ZXIgPSBqc29uLnV2c1sg
aSBdOworCisJCQkJCQkJCWdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXSA9IFtdOwor
CQkJCQkJCQlnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdID0gW107CisKKwkJ
CQkJCQkJZm9yICggaiA9IDA7IGogPCA0OyBqICsrICkgeworCisJCQkJCQkJCQl1dkluZGV4ID0g
ZmFjZXNbIG9mZnNldCArKyBdOworCisJCQkJCQkJCQl1ID0gdXZMYXllclsgdXZJbmRleCAqIDIg
XTsKKwkJCQkJCQkJCXYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTsKKworCQkJCQkJCQkJ
dXYgPSBuZXcgVmVjdG9yMiggdSwgdiApOworCisJCQkJCQkJCQlpZiAoIGogIT09IDIgKSBnZW9t
ZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0ucHVzaCggdXYgKTsKKwkJCQkJCQkJCWlmICgg
aiAhPT0gMCApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgKyAxIF0ucHVzaCggdXYg
KTsKKworCQkJCQkJCQl9CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQkJaWYgKCBoYXNG
YWNlTm9ybWFsICkgeworCisJCQkJCQkJbm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0g
KiAzOworCisJCQkJCQkJZmFjZUEubm9ybWFsLnNldCgKKwkJCQkJCQkJbm9ybWFsc1sgbm9ybWFs
SW5kZXggKysgXSwKKwkJCQkJCQkJbm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSwKKwkJCQkJCQkJ
bm9ybWFsc1sgbm9ybWFsSW5kZXggXQorCQkJCQkJCSk7CisKKwkJCQkJCQlmYWNlQi5ub3JtYWwu
Y29weSggZmFjZUEubm9ybWFsICk7CisKKwkJCQkJCX0KKworCQkJCQkJaWYgKCBoYXNGYWNlVmVy
dGV4Tm9ybWFsICkgeworCisJCQkJCQkJZm9yICggaSA9IDA7IGkgPCA0OyBpICsrICkgeworCisJ
CQkJCQkJCW5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMzsKKworCQkJCQkJCQlu
b3JtYWwgPSBuZXcgVmVjdG9yMygKKwkJCQkJCQkJCW5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0s
CisJCQkJCQkJCQlub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLAorCQkJCQkJCQkJbm9ybWFsc1sg
bm9ybWFsSW5kZXggXQorCQkJCQkJCQkpOworCisKKwkJCQkJCQkJaWYgKCBpICE9PSAyICkgZmFj
ZUEudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTsKKwkJCQkJCQkJaWYgKCBpICE9PSAwICkg
ZmFjZUIudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTsKKworCQkJCQkJCX0KKworCQkJCQkJ
fQorCisKKwkJCQkJCWlmICggaGFzRmFjZUNvbG9yICkgeworCisJCQkJCQkJY29sb3JJbmRleCA9
IGZhY2VzWyBvZmZzZXQgKysgXTsKKwkJCQkJCQloZXggPSBjb2xvcnNbIGNvbG9ySW5kZXggXTsK
KworCQkJCQkJCWZhY2VBLmNvbG9yLnNldEhleCggaGV4ICk7CisJCQkJCQkJZmFjZUIuY29sb3Iu
c2V0SGV4KCBoZXggKTsKKworCQkJCQkJfQorCisKKwkJCQkJCWlmICggaGFzRmFjZVZlcnRleENv
bG9yICkgeworCisJCQkJCQkJZm9yICggaSA9IDA7IGkgPCA0OyBpICsrICkgeworCisJCQkJCQkJ
CWNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07CisJCQkJCQkJCWhleCA9IGNvbG9yc1sg
Y29sb3JJbmRleCBdOworCisJCQkJCQkJCWlmICggaSAhPT0gMiApIGZhY2VBLnZlcnRleENvbG9y
cy5wdXNoKCBuZXcgQ29sb3IoIGhleCApICk7CisJCQkJCQkJCWlmICggaSAhPT0gMCApIGZhY2VC
LnZlcnRleENvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGhleCApICk7CisKKwkJCQkJCQl9CisKKwkJ
CQkJCX0KKworCQkJCQkJZ2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZUEgKTsKKwkJCQkJCWdlb21l
dHJ5LmZhY2VzLnB1c2goIGZhY2VCICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJZmFjZSA9
IG5ldyBGYWNlMygpOworCQkJCQkJZmFjZS5hID0gZmFjZXNbIG9mZnNldCArKyBdOworCQkJCQkJ
ZmFjZS5iID0gZmFjZXNbIG9mZnNldCArKyBdOworCQkJCQkJZmFjZS5jID0gZmFjZXNbIG9mZnNl
dCArKyBdOworCisJCQkJCQlpZiAoIGhhc01hdGVyaWFsICkgeworCisJCQkJCQkJbWF0ZXJpYWxJ
bmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKwkJCQkJCQlmYWNlLm1hdGVyaWFsSW5kZXggPSBt
YXRlcmlhbEluZGV4OworCisJCQkJCQl9CisKKwkJCQkJCS8vIHRvIGdldCBmYWNlIDw9PiB1diBp
bmRleCBjb3JyZXNwb25kZW5jZQorCisJCQkJCQlmaSA9IGdlb21ldHJ5LmZhY2VzLmxlbmd0aDsK
KworCQkJCQkJaWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7CisKKwkJCQkJCQlmb3IgKCBpID0gMDsg
aSA8IG5VdkxheWVyczsgaSArKyApIHsKKworCQkJCQkJCQl1dkxheWVyID0ganNvbi51dnNbIGkg
XTsKKworCQkJCQkJCQlnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0gPSBbXTsKKwor
CQkJCQkJCQlmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7CisKKwkJCQkJCQkJCXV2SW5kZXgg
PSBmYWNlc1sgb2Zmc2V0ICsrIF07CisKKwkJCQkJCQkJCXUgPSB1dkxheWVyWyB1dkluZGV4ICog
MiBdOworCQkJCQkJCQkJdiA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyICsgMSBdOworCisJCQkJCQkJ
CQl1diA9IG5ldyBWZWN0b3IyKCB1LCB2ICk7CisKKwkJCQkJCQkJCWdlb21ldHJ5LmZhY2VWZXJ0
ZXhVdnNbIGkgXVsgZmkgXS5wdXNoKCB1diApOworCisJCQkJCQkJCX0KKworCQkJCQkJCX0KKwor
CQkJCQkJfQorCisJCQkJCQlpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7CisKKwkJCQkJCQlub3JtYWxJ
bmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7CisKKwkJCQkJCQlmYWNlLm5vcm1hbC5zZXQo
CisJCQkJCQkJCW5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sCisJCQkJCQkJCW5vcm1hbHNbIG5v
cm1hbEluZGV4ICsrIF0sCisJCQkJCQkJCW5vcm1hbHNbIG5vcm1hbEluZGV4IF0KKwkJCQkJCQkp
OworCisJCQkJCQl9CisKKwkJCQkJCWlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHsKKworCQkJ
CQkJCWZvciAoIGkgPSAwOyBpIDwgMzsgaSArKyApIHsKKworCQkJCQkJCQlub3JtYWxJbmRleCA9
IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7CisKKwkJCQkJCQkJbm9ybWFsID0gbmV3IFZlY3RvcjMo
CisJCQkJCQkJCQlub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLAorCQkJCQkJCQkJbm9ybWFsc1sg
bm9ybWFsSW5kZXggKysgXSwKKwkJCQkJCQkJCW5vcm1hbHNbIG5vcm1hbEluZGV4IF0KKwkJCQkJ
CQkJKTsKKworCQkJCQkJCQlmYWNlLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7CisKKwkJ
CQkJCQl9CisKKwkJCQkJCX0KKworCisJCQkJCQlpZiAoIGhhc0ZhY2VDb2xvciApIHsKKworCQkJ
CQkJCWNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07CisJCQkJCQkJZmFjZS5jb2xvci5z
ZXRIZXgoIGNvbG9yc1sgY29sb3JJbmRleCBdICk7CisKKwkJCQkJCX0KKworCisJCQkJCQlpZiAo
IGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHsKKworCQkJCQkJCWZvciAoIGkgPSAwOyBpIDwgMzsgaSAr
KyApIHsKKworCQkJCQkJCQljb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdOworCQkJCQkJ
CQlmYWNlLnZlcnRleENvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGNvbG9yc1sgY29sb3JJbmRleCBd
ICkgKTsKKworCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJCQlnZW9tZXRyeS5mYWNlcy5wdXNo
KCBmYWNlICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJCWZ1bmN0aW9uIHBhcnNl
U2tpbigganNvbiwgZ2VvbWV0cnkgKSB7CisKKwkJCQl2YXIgaW5mbHVlbmNlc1BlclZlcnRleCA9
ICgganNvbi5pbmZsdWVuY2VzUGVyVmVydGV4ICE9PSB1bmRlZmluZWQgKSA/IGpzb24uaW5mbHVl
bmNlc1BlclZlcnRleCA6IDI7CisKKwkJCQlpZiAoIGpzb24uc2tpbldlaWdodHMgKSB7CisKKwkJ
CQkJZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5za2luV2VpZ2h0cy5sZW5ndGg7IGkgPCBsOyBp
ICs9IGluZmx1ZW5jZXNQZXJWZXJ0ZXggKSB7CisKKwkJCQkJCXZhciB4ID0ganNvbi5za2luV2Vp
Z2h0c1sgaSBdOworCQkJCQkJdmFyIHkgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAxICkgPyBq
c29uLnNraW5XZWlnaHRzWyBpICsgMSBdIDogMDsKKwkJCQkJCXZhciB6ID0gKCBpbmZsdWVuY2Vz
UGVyVmVydGV4ID4gMiApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDIgXSA6IDA7CisJCQkJCQl2
YXIgdyA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDMgKSA/IGpzb24uc2tpbldlaWdodHNbIGkg
KyAzIF0gOiAwOworCisJCQkJCQlnZW9tZXRyeS5za2luV2VpZ2h0cy5wdXNoKCBuZXcgVmVjdG9y
NCggeCwgeSwgeiwgdyApICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJaWYgKCBqc29uLnNr
aW5JbmRpY2VzICkgeworCisJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uc2tpbkluZGlj
ZXMubGVuZ3RoOyBpIDwgbDsgaSArPSBpbmZsdWVuY2VzUGVyVmVydGV4ICkgeworCisJCQkJCQl2
YXIgYSA9IGpzb24uc2tpbkluZGljZXNbIGkgXTsKKwkJCQkJCXZhciBiID0gKCBpbmZsdWVuY2Vz
UGVyVmVydGV4ID4gMSApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDEgXSA6IDA7CisJCQkJCQl2
YXIgYyA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDIgKSA/IGpzb24uc2tpbkluZGljZXNbIGkg
KyAyIF0gOiAwOworCQkJCQkJdmFyIGQgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBq
c29uLnNraW5JbmRpY2VzWyBpICsgMyBdIDogMDsKKworCQkJCQkJZ2VvbWV0cnkuc2tpbkluZGlj
ZXMucHVzaCggbmV3IFZlY3RvcjQoIGEsIGIsIGMsIGQgKSApOworCisJCQkJCX0KKworCQkJCX0K
KworCQkJCWdlb21ldHJ5LmJvbmVzID0ganNvbi5ib25lczsKKworCQkJCWlmICggZ2VvbWV0cnku
Ym9uZXMgJiYgZ2VvbWV0cnkuYm9uZXMubGVuZ3RoID4gMCAmJiAoIGdlb21ldHJ5LnNraW5XZWln
aHRzLmxlbmd0aCAhPT0gZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoIHx8IGdlb21ldHJ5LnNr
aW5JbmRpY2VzLmxlbmd0aCAhPT0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkgKSB7CisKKwkJ
CQkJY29uc29sZS53YXJuKCAnV2hlbiBza2lubmluZywgbnVtYmVyIG9mIHZlcnRpY2VzICgnICsg
Z2VvbWV0cnkudmVydGljZXMubGVuZ3RoICsgJyksIHNraW5JbmRpY2VzICgnICsKKwkJCQkJCWdl
b21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCArICcpLCBhbmQgc2tpbldlaWdodHMgKCcgKyBnZW9t
ZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKyAnKSBzaG91bGQgbWF0Y2guJyApOworCisJCQkJfQor
CisJCQl9CisKKwkJCWZ1bmN0aW9uIHBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICkgewor
CisJCQkJdmFyIHNjYWxlID0ganNvbi5zY2FsZTsKKworCQkJCWlmICgganNvbi5tb3JwaFRhcmdl
dHMgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLm1v
cnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJCQlnZW9tZXRyeS5tb3Jw
aFRhcmdldHNbIGkgXSA9IHt9OworCQkJCQkJZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0ubmFt
ZSA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0ubmFtZTsKKwkJCQkJCWdlb21ldHJ5Lm1vcnBoVGFy
Z2V0c1sgaSBdLnZlcnRpY2VzID0gW107CisKKwkJCQkJCXZhciBkc3RWZXJ0aWNlcyA9IGdlb21l
dHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzOworCQkJCQkJdmFyIHNyY1ZlcnRpY2VzID0g
anNvbi5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlczsKKworCQkJCQkJZm9yICggdmFyIHYgPSAw
LCB2bCA9IHNyY1ZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICs9IDMgKSB7CisKKwkJCQkJCQl2
YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKKwkJCQkJCQl2ZXJ0ZXgueCA9IHNyY1ZlcnRpY2Vz
WyB2IF0gKiBzY2FsZTsKKwkJCQkJCQl2ZXJ0ZXgueSA9IHNyY1ZlcnRpY2VzWyB2ICsgMSBdICog
c2NhbGU7CisJCQkJCQkJdmVydGV4LnogPSBzcmNWZXJ0aWNlc1sgdiArIDIgXSAqIHNjYWxlOwor
CisJCQkJCQkJZHN0VmVydGljZXMucHVzaCggdmVydGV4ICk7CisKKwkJCQkJCX0KKworCQkJCQl9
CisKKwkJCQl9CisKKwkJCQlpZiAoIGpzb24ubW9ycGhDb2xvcnMgIT09IHVuZGVmaW5lZCAmJiBq
c29uLm1vcnBoQ29sb3JzLmxlbmd0aCA+IDAgKSB7CisKKwkJCQkJY29uc29sZS53YXJuKCAnVEhS
RUUuSlNPTkxvYWRlcjogIm1vcnBoQ29sb3JzIiBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2luZyB0
aGVtIGFzIGZhY2UgY29sb3JzLicgKTsKKworCQkJCQl2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNl
czsKKwkJCQkJdmFyIG1vcnBoQ29sb3JzID0ganNvbi5tb3JwaENvbG9yc1sgMCBdLmNvbG9yczsK
KworCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkg
eworCisJCQkJCQlmYWNlc1sgaSBdLmNvbG9yLmZyb21BcnJheSggbW9ycGhDb2xvcnMsIGkgKiAz
ICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJCWZ1bmN0aW9uIHBhcnNlQW5pbWF0
aW9ucygganNvbiwgZ2VvbWV0cnkgKSB7CisKKwkJCQl2YXIgb3V0cHV0QW5pbWF0aW9ucyA9IFtd
OworCisJCQkJLy8gcGFyc2Ugb2xkIHN0eWxlIEJvbmUvSGllcmFyY2h5IGFuaW1hdGlvbnMKKwkJ
CQl2YXIgYW5pbWF0aW9ucyA9IFtdOworCisJCQkJaWYgKCBqc29uLmFuaW1hdGlvbiAhPT0gdW5k
ZWZpbmVkICkgeworCisJCQkJCWFuaW1hdGlvbnMucHVzaCgganNvbi5hbmltYXRpb24gKTsKKwor
CQkJCX0KKworCQkJCWlmICgganNvbi5hbmltYXRpb25zICE9PSB1bmRlZmluZWQgKSB7CisKKwkJ
CQkJaWYgKCBqc29uLmFuaW1hdGlvbnMubGVuZ3RoICkgeworCisJCQkJCQlhbmltYXRpb25zID0g
YW5pbWF0aW9ucy5jb25jYXQoIGpzb24uYW5pbWF0aW9ucyApOworCisJCQkJCX0gZWxzZSB7CisK
KwkJCQkJCWFuaW1hdGlvbnMucHVzaCgganNvbi5hbmltYXRpb25zICk7CisKKwkJCQkJfQorCisJ
CQkJfQorCisJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgYW5pbWF0aW9ucy5sZW5ndGg7IGkgKysg
KSB7CisKKwkJCQkJdmFyIGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlQW5pbWF0aW9uKCBhbmlt
YXRpb25zWyBpIF0sIGdlb21ldHJ5LmJvbmVzICk7CisJCQkJCWlmICggY2xpcCApIG91dHB1dEFu
aW1hdGlvbnMucHVzaCggY2xpcCApOworCisJCQkJfQorCisJCQkJLy8gcGFyc2UgaW1wbGljaXQg
bW9ycGggYW5pbWF0aW9ucworCQkJCWlmICggZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkgeworCisJ
CQkJCS8vIFRPRE86IEZpZ3VyZSBvdXQgd2hhdCBhbiBhcHByb3ByYWl0ZSBGUFMgaXMgZm9yIG1v
cnBoIHRhcmdldCBhbmltYXRpb25zIC0tIGRlZmF1bHRpbmcgdG8gMTAsIGJ1dCByZWFsbHkgaXQg
aXMgY29tcGxldGVseSBhcmJpdHJhcnkuCisJCQkJCXZhciBtb3JwaEFuaW1hdGlvbkNsaXBzID0g
QW5pbWF0aW9uQ2xpcC5DcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlcyggZ2VvbWV0
cnkubW9ycGhUYXJnZXRzLCAxMCApOworCQkJCQlvdXRwdXRBbmltYXRpb25zID0gb3V0cHV0QW5p
bWF0aW9ucy5jb25jYXQoIG1vcnBoQW5pbWF0aW9uQ2xpcHMgKTsKKworCQkJCX0KKworCQkJCWlm
ICggb3V0cHV0QW5pbWF0aW9ucy5sZW5ndGggPiAwICkgZ2VvbWV0cnkuYW5pbWF0aW9ucyA9IG91
dHB1dEFuaW1hdGlvbnM7CisKKwkJCX0KKworCQkJcmV0dXJuIGZ1bmN0aW9uICgganNvbiwgdGV4
dHVyZVBhdGggKSB7CisKKwkJCQlpZiAoIGpzb24uZGF0YSAhPT0gdW5kZWZpbmVkICkgeworCisJ
CQkJCS8vIEdlb21ldHJ5IDQuMCBzcGVjCisJCQkJCWpzb24gPSBqc29uLmRhdGE7CisKKwkJCQl9
CisKKwkJCQlpZiAoIGpzb24uc2NhbGUgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQlqc29uLnNj
YWxlID0gMS4wIC8ganNvbi5zY2FsZTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJanNvbi5zY2Fs
ZSA9IDEuMDsKKworCQkJCX0KKworCQkJCXZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpOwor
CisJCQkJcGFyc2VNb2RlbCgganNvbiwgZ2VvbWV0cnkgKTsKKwkJCQlwYXJzZVNraW4oIGpzb24s
IGdlb21ldHJ5ICk7CisJCQkJcGFyc2VNb3JwaGluZygganNvbiwgZ2VvbWV0cnkgKTsKKwkJCQlw
YXJzZUFuaW1hdGlvbnMoIGpzb24sIGdlb21ldHJ5ICk7CisKKwkJCQlnZW9tZXRyeS5jb21wdXRl
RmFjZU5vcm1hbHMoKTsKKwkJCQlnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKKwor
CQkJCWlmICgganNvbi5tYXRlcmlhbHMgPT09IHVuZGVmaW5lZCB8fCBqc29uLm1hdGVyaWFscy5s
ZW5ndGggPT09IDAgKSB7CisKKwkJCQkJcmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5IH07CisK
KwkJCQl9IGVsc2UgeworCisJCQkJCXZhciBtYXRlcmlhbHMgPSBMb2FkZXIucHJvdG90eXBlLmlu
aXRNYXRlcmlhbHMoIGpzb24ubWF0ZXJpYWxzLCB0ZXh0dXJlUGF0aCwgdGhpcy5jcm9zc09yaWdp
biApOworCisJCQkJCXJldHVybiB7IGdlb21ldHJ5OiBnZW9tZXRyeSwgbWF0ZXJpYWxzOiBtYXRl
cmlhbHMgfTsKKworCQkJCX0KKworCQkJfTsKKworCQl9ICkoKQorCisJfSApOworCisJLyoqCisJ
ICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9u
IE9iamVjdExvYWRlciggbWFuYWdlciApIHsKKworCQl0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIg
IT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKKwkJdGhp
cy50ZXh0dXJlUGF0aCA9ICcnOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggT2JqZWN0TG9hZGVy
LnByb3RvdHlwZSwgeworCisJCWxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jl
c3MsIG9uRXJyb3IgKSB7CisKKwkJCWlmICggdGhpcy50ZXh0dXJlUGF0aCA9PT0gJycgKSB7CisK
KwkJCQl0aGlzLnRleHR1cmVQYXRoID0gdXJsLnN1YnN0cmluZyggMCwgdXJsLmxhc3RJbmRleE9m
KCAnLycgKSArIDEgKTsKKworCQkJfQorCisJCQl2YXIgc2NvcGUgPSB0aGlzOworCisJCQl2YXIg
bG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTsKKwkJCWxvYWRlci5sb2Fk
KCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHsKKworCQkJCXZhciBqc29uID0gbnVsbDsKKworCQkJ
CXRyeSB7CisKKwkJCQkJanNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTsKKworCQkJCX0gY2F0Y2gg
KCBlcnJvciApIHsKKworCQkJCQlpZiAoIG9uRXJyb3IgIT09IHVuZGVmaW5lZCApIG9uRXJyb3Io
IGVycm9yICk7CisKKwkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFOk9iamVjdExvYWRlcjogQ2Fu
XCd0IHBhcnNlICcgKyB1cmwgKyAnLicsIGVycm9yLm1lc3NhZ2UgKTsKKworCQkJCQlyZXR1cm47
CisKKwkJCQl9CisKKwkJCQl2YXIgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhOworCisJCQkJaWYg
KCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8
fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdnZW9tZXRyeScgKSB7CisKKwkJCQkJ
Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogQ2FuXCd0IGxvYWQgJyArIHVybCAr
ICcuIFVzZSBUSFJFRS5KU09OTG9hZGVyIGluc3RlYWQuJyApOworCQkJCQlyZXR1cm47CisKKwkJ
CQl9CisKKwkJCQlzY29wZS5wYXJzZSgganNvbiwgb25Mb2FkICk7CisKKwkJCX0sIG9uUHJvZ3Jl
c3MsIG9uRXJyb3IgKTsKKworCQl9LAorCisJCXNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZh
bHVlICkgeworCisJCQl0aGlzLnRleHR1cmVQYXRoID0gdmFsdWU7CisKKwkJfSwKKworCQlzZXRD
cm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJdGhpcy5jcm9zc09yaWdpbiA9
IHZhbHVlOworCisJCX0sCisKKwkJcGFyc2U6IGZ1bmN0aW9uICgganNvbiwgb25Mb2FkICkgewor
CisJCQl2YXIgZ2VvbWV0cmllcyA9IHRoaXMucGFyc2VHZW9tZXRyaWVzKCBqc29uLmdlb21ldHJp
ZXMgKTsKKworCQkJdmFyIGltYWdlcyA9IHRoaXMucGFyc2VJbWFnZXMoIGpzb24uaW1hZ2VzLCBm
dW5jdGlvbiAoKSB7CisKKwkJCQlpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBv
YmplY3QgKTsKKworCQkJfSApOworCisJCQl2YXIgdGV4dHVyZXMgPSB0aGlzLnBhcnNlVGV4dHVy
ZXMoIGpzb24udGV4dHVyZXMsIGltYWdlcyApOworCQkJdmFyIG1hdGVyaWFscyA9IHRoaXMucGFy
c2VNYXRlcmlhbHMoIGpzb24ubWF0ZXJpYWxzLCB0ZXh0dXJlcyApOworCisJCQl2YXIgb2JqZWN0
ID0gdGhpcy5wYXJzZU9iamVjdCgganNvbi5vYmplY3QsIGdlb21ldHJpZXMsIG1hdGVyaWFscyAp
OworCisJCQlpZiAoIGpzb24uYW5pbWF0aW9ucyApIHsKKworCQkJCW9iamVjdC5hbmltYXRpb25z
ID0gdGhpcy5wYXJzZUFuaW1hdGlvbnMoIGpzb24uYW5pbWF0aW9ucyApOworCisJCQl9CisKKwkJ
CWlmICgganNvbi5pbWFnZXMgPT09IHVuZGVmaW5lZCB8fCBqc29uLmltYWdlcy5sZW5ndGggPT09
IDAgKSB7CisKKwkJCQlpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3Qg
KTsKKworCQkJfQorCisJCQlyZXR1cm4gb2JqZWN0OworCisJCX0sCisKKwkJcGFyc2VHZW9tZXRy
aWVzOiBmdW5jdGlvbiAoIGpzb24gKSB7CisKKwkJCXZhciBnZW9tZXRyaWVzID0ge307CisKKwkJ
CWlmICgganNvbiAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJdmFyIGdlb21ldHJ5TG9hZGVyID0g
bmV3IEpTT05Mb2FkZXIoKTsKKwkJCQl2YXIgYnVmZmVyR2VvbWV0cnlMb2FkZXIgPSBuZXcgQnVm
ZmVyR2VvbWV0cnlMb2FkZXIoKTsKKworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVu
Z3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCQl2YXIgZ2VvbWV0cnk7CisJCQkJCXZhciBkYXRh
ID0ganNvblsgaSBdOworCisJCQkJCXN3aXRjaCAoIGRhdGEudHlwZSApIHsKKworCQkJCQkJY2Fz
ZSAnUGxhbmVHZW9tZXRyeSc6CisJCQkJCQljYXNlICdQbGFuZUJ1ZmZlckdlb21ldHJ5JzoKKwor
CQkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAorCQkJCQkJCQlk
YXRhLndpZHRoLAorCQkJCQkJCQlkYXRhLmhlaWdodCwKKwkJCQkJCQkJZGF0YS53aWR0aFNlZ21l
bnRzLAorCQkJCQkJCQlkYXRhLmhlaWdodFNlZ21lbnRzCisJCQkJCQkJKTsKKworCQkJCQkJCWJy
ZWFrOworCisJCQkJCQljYXNlICdCb3hHZW9tZXRyeSc6CisJCQkJCQljYXNlICdCb3hCdWZmZXJH
ZW9tZXRyeSc6CisJCQkJCQljYXNlICdDdWJlR2VvbWV0cnknOiAvLyBiYWNrd2FyZHMgY29tcGF0
aWJsZQorCisJCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCisJ
CQkJCQkJCWRhdGEud2lkdGgsCisJCQkJCQkJCWRhdGEuaGVpZ2h0LAorCQkJCQkJCQlkYXRhLmRl
cHRoLAorCQkJCQkJCQlkYXRhLndpZHRoU2VnbWVudHMsCisJCQkJCQkJCWRhdGEuaGVpZ2h0U2Vn
bWVudHMsCisJCQkJCQkJCWRhdGEuZGVwdGhTZWdtZW50cworCQkJCQkJCSk7CisKKwkJCQkJCQli
cmVhazsKKworCQkJCQkJY2FzZSAnQ2lyY2xlR2VvbWV0cnknOgorCQkJCQkJY2FzZSAnQ2lyY2xl
QnVmZmVyR2VvbWV0cnknOgorCisJCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0
YS50eXBlIF0oCisJCQkJCQkJCWRhdGEucmFkaXVzLAorCQkJCQkJCQlkYXRhLnNlZ21lbnRzLAor
CQkJCQkJCQlkYXRhLnRoZXRhU3RhcnQsCisJCQkJCQkJCWRhdGEudGhldGFMZW5ndGgKKwkJCQkJ
CQkpOworCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgJ0N5bGluZGVyR2VvbWV0cnknOgor
CQkJCQkJY2FzZSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc6CisKKwkJCQkJCQlnZW9tZXRyeSA9
IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKKwkJCQkJCQkJZGF0YS5yYWRpdXNUb3AsCisJ
CQkJCQkJCWRhdGEucmFkaXVzQm90dG9tLAorCQkJCQkJCQlkYXRhLmhlaWdodCwKKwkJCQkJCQkJ
ZGF0YS5yYWRpYWxTZWdtZW50cywKKwkJCQkJCQkJZGF0YS5oZWlnaHRTZWdtZW50cywKKwkJCQkJ
CQkJZGF0YS5vcGVuRW5kZWQsCisJCQkJCQkJCWRhdGEudGhldGFTdGFydCwKKwkJCQkJCQkJZGF0
YS50aGV0YUxlbmd0aAorCQkJCQkJCSk7CisKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAn
Q29uZUdlb21ldHJ5JzoKKwkJCQkJCWNhc2UgJ0NvbmVCdWZmZXJHZW9tZXRyeSc6CisKKwkJCQkJ
CQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKKwkJCQkJCQkJZGF0YS5y
YWRpdXMsCisJCQkJCQkJCWRhdGEuaGVpZ2h0LAorCQkJCQkJCQlkYXRhLnJhZGlhbFNlZ21lbnRz
LAorCQkJCQkJCQlkYXRhLmhlaWdodFNlZ21lbnRzLAorCQkJCQkJCQlkYXRhLm9wZW5FbmRlZCwK
KwkJCQkJCQkJZGF0YS50aGV0YVN0YXJ0LAorCQkJCQkJCQlkYXRhLnRoZXRhTGVuZ3RoCisJCQkJ
CQkJKTsKKworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlICdTcGhlcmVHZW9tZXRyeSc6CisJ
CQkJCQljYXNlICdTcGhlcmVCdWZmZXJHZW9tZXRyeSc6CisKKwkJCQkJCQlnZW9tZXRyeSA9IG5l
dyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKKwkJCQkJCQkJZGF0YS5yYWRpdXMsCisJCQkJCQkJ
CWRhdGEud2lkdGhTZWdtZW50cywKKwkJCQkJCQkJZGF0YS5oZWlnaHRTZWdtZW50cywKKwkJCQkJ
CQkJZGF0YS5waGlTdGFydCwKKwkJCQkJCQkJZGF0YS5waGlMZW5ndGgsCisJCQkJCQkJCWRhdGEu
dGhldGFTdGFydCwKKwkJCQkJCQkJZGF0YS50aGV0YUxlbmd0aAorCQkJCQkJCSk7CisKKwkJCQkJ
CQlicmVhazsKKworCQkJCQkJY2FzZSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknOgorCQkJCQkJY2Fz
ZSAnSWNvc2FoZWRyb25HZW9tZXRyeSc6CisJCQkJCQljYXNlICdPY3RhaGVkcm9uR2VvbWV0cnkn
OgorCQkJCQkJY2FzZSAnVGV0cmFoZWRyb25HZW9tZXRyeSc6CisKKwkJCQkJCQlnZW9tZXRyeSA9
IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKKwkJCQkJCQkJZGF0YS5yYWRpdXMsCisJCQkJ
CQkJCWRhdGEuZGV0YWlsCisJCQkJCQkJKTsKKworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNl
ICdSaW5nR2VvbWV0cnknOgorCQkJCQkJY2FzZSAnUmluZ0J1ZmZlckdlb21ldHJ5JzoKKworCQkJ
CQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAorCQkJCQkJCQlkYXRh
LmlubmVyUmFkaXVzLAorCQkJCQkJCQlkYXRhLm91dGVyUmFkaXVzLAorCQkJCQkJCQlkYXRhLnRo
ZXRhU2VnbWVudHMsCisJCQkJCQkJCWRhdGEucGhpU2VnbWVudHMsCisJCQkJCQkJCWRhdGEudGhl
dGFTdGFydCwKKwkJCQkJCQkJZGF0YS50aGV0YUxlbmd0aAorCQkJCQkJCSk7CisKKwkJCQkJCQli
cmVhazsKKworCQkJCQkJY2FzZSAnVG9ydXNHZW9tZXRyeSc6CisJCQkJCQljYXNlICdUb3J1c0J1
ZmZlckdlb21ldHJ5JzoKKworCQkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEu
dHlwZSBdKAorCQkJCQkJCQlkYXRhLnJhZGl1cywKKwkJCQkJCQkJZGF0YS50dWJlLAorCQkJCQkJ
CQlkYXRhLnJhZGlhbFNlZ21lbnRzLAorCQkJCQkJCQlkYXRhLnR1YnVsYXJTZWdtZW50cywKKwkJ
CQkJCQkJZGF0YS5hcmMKKwkJCQkJCQkpOworCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2Ug
J1RvcnVzS25vdEdlb21ldHJ5JzoKKwkJCQkJCWNhc2UgJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5
JzoKKworCQkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAorCQkJ
CQkJCQlkYXRhLnJhZGl1cywKKwkJCQkJCQkJZGF0YS50dWJlLAorCQkJCQkJCQlkYXRhLnR1YnVs
YXJTZWdtZW50cywKKwkJCQkJCQkJZGF0YS5yYWRpYWxTZWdtZW50cywKKwkJCQkJCQkJZGF0YS5w
LAorCQkJCQkJCQlkYXRhLnEKKwkJCQkJCQkpOworCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNh
c2UgJ0xhdGhlR2VvbWV0cnknOgorCQkJCQkJY2FzZSAnTGF0aGVCdWZmZXJHZW9tZXRyeSc6CisK
KwkJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKKwkJCQkJCQkJ
ZGF0YS5wb2ludHMsCisJCQkJCQkJCWRhdGEuc2VnbWVudHMsCisJCQkJCQkJCWRhdGEucGhpU3Rh
cnQsCisJCQkJCQkJCWRhdGEucGhpTGVuZ3RoCisJCQkJCQkJKTsKKworCQkJCQkJCWJyZWFrOwor
CisJCQkJCQljYXNlICdCdWZmZXJHZW9tZXRyeSc6CisKKwkJCQkJCQlnZW9tZXRyeSA9IGJ1ZmZl
ckdlb21ldHJ5TG9hZGVyLnBhcnNlKCBkYXRhICk7CisKKwkJCQkJCQlicmVhazsKKworCQkJCQkJ
Y2FzZSAnR2VvbWV0cnknOgorCisJCQkJCQkJZ2VvbWV0cnkgPSBnZW9tZXRyeUxvYWRlci5wYXJz
ZSggZGF0YSwgdGhpcy50ZXh0dXJlUGF0aCApLmdlb21ldHJ5OworCisJCQkJCQkJYnJlYWs7CisK
KwkJCQkJCWRlZmF1bHQ6CisKKwkJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2Fk
ZXI6IFVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgIicgKyBkYXRhLnR5cGUgKyAnIicgKTsKKwor
CQkJCQkJCWNvbnRpbnVlOworCisJCQkJCX0KKworCQkJCQlnZW9tZXRyeS51dWlkID0gZGF0YS51
dWlkOworCisJCQkJCWlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSBnZW9tZXRyeS5uYW1l
ID0gZGF0YS5uYW1lOworCisJCQkJCWdlb21ldHJpZXNbIGRhdGEudXVpZCBdID0gZ2VvbWV0cnk7
CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuIGdlb21ldHJpZXM7CisKKwkJfSwKKworCQlw
YXJzZU1hdGVyaWFsczogZnVuY3Rpb24gKCBqc29uLCB0ZXh0dXJlcyApIHsKKworCQkJdmFyIG1h
dGVyaWFscyA9IHt9OworCisJCQlpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHsKKworCQkJCXZh
ciBsb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTsKKwkJCQlsb2FkZXIuc2V0VGV4dHVyZXMo
IHRleHR1cmVzICk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8
IGw7IGkgKysgKSB7CisKKwkJCQkJdmFyIGRhdGEgPSBqc29uWyBpIF07CisKKwkJCQkJaWYgKCBk
YXRhLnR5cGUgPT09ICdNdWx0aU1hdGVyaWFsJyApIHsKKworCQkJCQkJLy8gRGVwcmVjYXRlZAor
CisJCQkJCQl2YXIgYXJyYXkgPSBbXTsKKworCQkJCQkJZm9yICggdmFyIGogPSAwOyBqIDwgZGF0
YS5tYXRlcmlhbHMubGVuZ3RoOyBqICsrICkgeworCisJCQkJCQkJYXJyYXkucHVzaCggbG9hZGVy
LnBhcnNlKCBkYXRhLm1hdGVyaWFsc1sgaiBdICkgKTsKKworCQkJCQkJfQorCisJCQkJCQltYXRl
cmlhbHNbIGRhdGEudXVpZCBdID0gYXJyYXk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJbWF0
ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGxvYWRlci5wYXJzZSggZGF0YSApOworCisJCQkJCX0KKwor
CQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gbWF0ZXJpYWxzOworCisJCX0sCisKKwkJcGFyc2VB
bmltYXRpb25zOiBmdW5jdGlvbiAoIGpzb24gKSB7CisKKwkJCXZhciBhbmltYXRpb25zID0gW107
CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpICsrICkgeworCisJCQkJ
dmFyIGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlKCBqc29uWyBpIF0gKTsKKworCQkJCWFuaW1h
dGlvbnMucHVzaCggY2xpcCApOworCisJCQl9CisKKwkJCXJldHVybiBhbmltYXRpb25zOworCisJ
CX0sCisKKwkJcGFyc2VJbWFnZXM6IGZ1bmN0aW9uICgganNvbiwgb25Mb2FkICkgeworCisJCQl2
YXIgc2NvcGUgPSB0aGlzOworCQkJdmFyIGltYWdlcyA9IHt9OworCisJCQlmdW5jdGlvbiBsb2Fk
SW1hZ2UoIHVybCApIHsKKworCQkJCXNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTsKKwor
CQkJCXJldHVybiBsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoKSB7CisKKwkJCQkJc2NvcGUu
bWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKKworCQkJCX0sIHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkg
eworCisJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CisJCQkJCXNjb3BlLm1hbmFn
ZXIuaXRlbUVycm9yKCB1cmwgKTsKKworCQkJCX0gKTsKKworCQkJfQorCisJCQlpZiAoIGpzb24g
IT09IHVuZGVmaW5lZCAmJiBqc29uLmxlbmd0aCA+IDAgKSB7CisKKwkJCQl2YXIgbWFuYWdlciA9
IG5ldyBMb2FkaW5nTWFuYWdlciggb25Mb2FkICk7CisKKwkJCQl2YXIgbG9hZGVyID0gbmV3IElt
YWdlTG9hZGVyKCBtYW5hZ2VyICk7CisJCQkJbG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNy
b3NzT3JpZ2luICk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8
IGw7IGkgKysgKSB7CisKKwkJCQkJdmFyIGltYWdlID0ganNvblsgaSBdOworCQkJCQl2YXIgcGF0
aCA9IC9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KCBpbWFnZS51cmwgKSA/IGltYWdl
LnVybCA6IHNjb3BlLnRleHR1cmVQYXRoICsgaW1hZ2UudXJsOworCisJCQkJCWltYWdlc1sgaW1h
Z2UudXVpZCBdID0gbG9hZEltYWdlKCBwYXRoICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0
dXJuIGltYWdlczsKKworCQl9LAorCisJCXBhcnNlVGV4dHVyZXM6IGZ1bmN0aW9uICgganNvbiwg
aW1hZ2VzICkgeworCisJCQlmdW5jdGlvbiBwYXJzZUNvbnN0YW50KCB2YWx1ZSwgdHlwZSApIHsK
KworCQkJCWlmICggdHlwZW9mKCB2YWx1ZSApID09PSAnbnVtYmVyJyApIHJldHVybiB2YWx1ZTsK
KworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENv
bnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uJywgdmFsdWUgKTsKKworCQkJCXJldHVy
biB0eXBlWyB2YWx1ZSBdOworCisJCQl9CisKKwkJCXZhciB0ZXh0dXJlcyA9IHt9OworCisJCQlp
ZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHsKKworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGpz
b24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCQl2YXIgZGF0YSA9IGpzb25bIGkgXTsK
KworCQkJCQlpZiAoIGRhdGEuaW1hZ2UgPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJY29uc29s
ZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBObyAiaW1hZ2UiIHNwZWNpZmllZCBmb3InLCBk
YXRhLnV1aWQgKTsKKworCQkJCQl9CisKKwkJCQkJaWYgKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSA9
PT0gdW5kZWZpbmVkICkgeworCisJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2Fk
ZXI6IFVuZGVmaW5lZCBpbWFnZScsIGRhdGEuaW1hZ2UgKTsKKworCQkJCQl9CisKKwkJCQkJdmFy
IHRleHR1cmUgPSBuZXcgVGV4dHVyZSggaW1hZ2VzWyBkYXRhLmltYWdlIF0gKTsKKwkJCQkJdGV4
dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCQkJdGV4dHVyZS51dWlkID0gZGF0YS51dWlk
OworCisJCQkJCWlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBk
YXRhLm5hbWU7CisKKwkJCQkJaWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1
cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5H
ICk7CisKKwkJCQkJaWYgKCBkYXRhLm9mZnNldCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5vZmZz
ZXQuZnJvbUFycmF5KCBkYXRhLm9mZnNldCApOworCQkJCQlpZiAoIGRhdGEucmVwZWF0ICE9PSB1
bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7CisJCQkJ
CWlmICggZGF0YS53cmFwICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCXRleHR1cmUud3JhcFMg
PSBwYXJzZUNvbnN0YW50KCBkYXRhLndyYXBbIDAgXSwgVEVYVFVSRV9XUkFQUElORyApOworCQkJ
CQkJdGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJF
X1dSQVBQSU5HICk7CisKKwkJCQkJfQorCisJCQkJCWlmICggZGF0YS5taW5GaWx0ZXIgIT09IHVu
ZGVmaW5lZCApIHRleHR1cmUubWluRmlsdGVyID0gcGFyc2VDb25zdGFudCggZGF0YS5taW5GaWx0
ZXIsIFRFWFRVUkVfRklMVEVSICk7CisJCQkJCWlmICggZGF0YS5tYWdGaWx0ZXIgIT09IHVuZGVm
aW5lZCApIHRleHR1cmUubWFnRmlsdGVyID0gcGFyc2VDb25zdGFudCggZGF0YS5tYWdGaWx0ZXIs
IFRFWFRVUkVfRklMVEVSICk7CisJCQkJCWlmICggZGF0YS5hbmlzb3Ryb3B5ICE9PSB1bmRlZmlu
ZWQgKSB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBkYXRhLmFuaXNvdHJvcHk7CisKKwkJCQkJaWYgKCBk
YXRhLmZsaXBZICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmZsaXBZID0gZGF0YS5mbGlwWTsKKwor
CQkJCQl0ZXh0dXJlc1sgZGF0YS51dWlkIF0gPSB0ZXh0dXJlOworCisJCQkJfQorCisJCQl9CisK
KwkJCXJldHVybiB0ZXh0dXJlczsKKworCQl9LAorCisJCXBhcnNlT2JqZWN0OiBmdW5jdGlvbiAo
KSB7CisKKwkJCXZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpOworCisJCQlyZXR1cm4gZnVuY3Rp
b24gcGFyc2VPYmplY3QoIGRhdGEsIGdlb21ldHJpZXMsIG1hdGVyaWFscyApIHsKKworCQkJCXZh
ciBvYmplY3Q7CisKKwkJCQlmdW5jdGlvbiBnZXRHZW9tZXRyeSggbmFtZSApIHsKKworCQkJCQlp
ZiAoIGdlb21ldHJpZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCQljb25zb2xl
Lndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBnZW9tZXRyeScsIG5hbWUgKTsK
KworCQkJCQl9CisKKwkJCQkJcmV0dXJuIGdlb21ldHJpZXNbIG5hbWUgXTsKKworCQkJCX0KKwor
CQkJCWZ1bmN0aW9uIGdldE1hdGVyaWFsKCBuYW1lICkgeworCisJCQkJCWlmICggbmFtZSA9PT0g
dW5kZWZpbmVkICkgcmV0dXJuIHVuZGVmaW5lZDsKKworCQkJCQlpZiAoIEFycmF5LmlzQXJyYXko
IG5hbWUgKSApIHsKKworCQkJCQkJdmFyIGFycmF5ID0gW107CisKKwkJCQkJCWZvciAoIHZhciBp
ID0gMCwgbCA9IG5hbWUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCQkJCXZhciB1dWlk
ID0gbmFtZVsgaSBdOworCisJCQkJCQkJaWYgKCBtYXRlcmlhbHNbIHV1aWQgXSA9PT0gdW5kZWZp
bmVkICkgeworCisJCQkJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5k
ZWZpbmVkIG1hdGVyaWFsJywgdXVpZCApOworCisJCQkJCQkJfQorCisJCQkJCQkJYXJyYXkucHVz
aCggbWF0ZXJpYWxzWyB1dWlkIF0gKTsKKworCQkJCQkJfQorCisJCQkJCQlyZXR1cm4gYXJyYXk7
CisKKwkJCQkJfQorCisJCQkJCWlmICggbWF0ZXJpYWxzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCAp
IHsKKworCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQg
bWF0ZXJpYWwnLCBuYW1lICk7CisKKwkJCQkJfQorCisJCQkJCXJldHVybiBtYXRlcmlhbHNbIG5h
bWUgXTsKKworCQkJCX0KKworCQkJCXN3aXRjaCAoIGRhdGEudHlwZSApIHsKKworCQkJCQljYXNl
ICdTY2VuZSc6CisKKwkJCQkJCW9iamVjdCA9IG5ldyBTY2VuZSgpOworCisJCQkJCQlpZiAoIGRh
dGEuYmFja2dyb3VuZCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCQkJaWYgKCBOdW1iZXIuaXNJ
bnRlZ2VyKCBkYXRhLmJhY2tncm91bmQgKSApIHsKKworCQkJCQkJCQlvYmplY3QuYmFja2dyb3Vu
ZCA9IG5ldyBDb2xvciggZGF0YS5iYWNrZ3JvdW5kICk7CisKKwkJCQkJCQl9CisKKwkJCQkJCX0K
KworCQkJCQkJaWYgKCBkYXRhLmZvZyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCQkJaWYgKCBk
YXRhLmZvZy50eXBlID09PSAnRm9nJyApIHsKKworCQkJCQkJCQlvYmplY3QuZm9nID0gbmV3IEZv
ZyggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLm5lYXIsIGRhdGEuZm9nLmZhciApOworCisJCQkJ
CQkJfSBlbHNlIGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZ0V4cDInICkgeworCisJCQkJCQkJ
CW9iamVjdC5mb2cgPSBuZXcgRm9nRXhwMiggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLmRlbnNp
dHkgKTsKKworCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJCQlicmVhazsKKworCQkJCQljYXNl
ICdQZXJzcGVjdGl2ZUNhbWVyYSc6CisKKwkJCQkJCW9iamVjdCA9IG5ldyBQZXJzcGVjdGl2ZUNh
bWVyYSggZGF0YS5mb3YsIGRhdGEuYXNwZWN0LCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7CisKKwkJ
CQkJCWlmICggZGF0YS5mb2N1cyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZvY3VzID0gZGF0YS5m
b2N1czsKKwkJCQkJCWlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9
IGRhdGEuem9vbTsKKwkJCQkJCWlmICggZGF0YS5maWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIG9i
amVjdC5maWxtR2F1Z2UgPSBkYXRhLmZpbG1HYXVnZTsKKwkJCQkJCWlmICggZGF0YS5maWxtT2Zm
c2V0ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZmlsbU9mZnNldCA9IGRhdGEuZmlsbU9mZnNldDsK
KwkJCQkJCWlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVj
dC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTsKKworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAn
T3J0aG9ncmFwaGljQ2FtZXJhJzoKKworCQkJCQkJb2JqZWN0ID0gbmV3IE9ydGhvZ3JhcGhpY0Nh
bWVyYSggZGF0YS5sZWZ0LCBkYXRhLnJpZ2h0LCBkYXRhLnRvcCwgZGF0YS5ib3R0b20sIGRhdGEu
bmVhciwgZGF0YS5mYXIgKTsKKworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAnQW1iaWVudExp
Z2h0JzoKKworCQkJCQkJb2JqZWN0ID0gbmV3IEFtYmllbnRMaWdodCggZGF0YS5jb2xvciwgZGF0
YS5pbnRlbnNpdHkgKTsKKworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAnRGlyZWN0aW9uYWxM
aWdodCc6CisKKwkJCQkJCW9iamVjdCA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0KCBkYXRhLmNvbG9y
LCBkYXRhLmludGVuc2l0eSApOworCisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICdQb2ludExp
Z2h0JzoKKworCQkJCQkJb2JqZWN0ID0gbmV3IFBvaW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEu
aW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmRlY2F5ICk7CisKKwkJCQkJCWJyZWFrOwor
CisJCQkJCWNhc2UgJ1JlY3RBcmVhTGlnaHQnOgorCisJCQkJCQlvYmplY3QgPSBuZXcgUmVjdEFy
ZWFMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEud2lkdGgsIGRhdGEuaGVp
Z2h0ICk7CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgJ1Nwb3RMaWdodCc6CisKKwkJCQkJ
CW9iamVjdCA9IG5ldyBTcG90TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRh
LmRpc3RhbmNlLCBkYXRhLmFuZ2xlLCBkYXRhLnBlbnVtYnJhLCBkYXRhLmRlY2F5ICk7CisKKwkJ
CQkJCWJyZWFrOworCisJCQkJCWNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6CisKKwkJCQkJCW9iamVj
dCA9IG5ldyBIZW1pc3BoZXJlTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuZ3JvdW5kQ29sb3IsIGRh
dGEuaW50ZW5zaXR5ICk7CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgJ1NraW5uZWRNZXNo
JzoKKworCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlT2JqZWN0
KCkgZG9lcyBub3Qgc3VwcG9ydCBTa2lubmVkTWVzaCB5ZXQuJyApOworCisJCQkJCWNhc2UgJ01l
c2gnOgorCisJCQkJCQl2YXIgZ2VvbWV0cnkgPSBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSAp
OworCQkJCQkJdmFyIG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTsKKwor
CQkJCQkJaWYgKCBnZW9tZXRyeS5ib25lcyAmJiBnZW9tZXRyeS5ib25lcy5sZW5ndGggPiAwICkg
eworCisJCQkJCQkJb2JqZWN0ID0gbmV3IFNraW5uZWRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwg
KTsKKworCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCW9iamVjdCA9IG5ldyBNZXNoKCBnZW9tZXRy
eSwgbWF0ZXJpYWwgKTsKKworCQkJCQkJfQorCisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICdM
T0QnOgorCisJCQkJCQlvYmplY3QgPSBuZXcgTE9EKCk7CisKKwkJCQkJCWJyZWFrOworCisJCQkJ
CWNhc2UgJ0xpbmUnOgorCisJCQkJCQlvYmplY3QgPSBuZXcgTGluZSggZ2V0R2VvbWV0cnkoIGRh
dGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSwgZGF0YS5tb2RlICk7
CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgJ0xpbmVMb29wJzoKKworCQkJCQkJb2JqZWN0
ID0gbmV3IExpbmVMb29wKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlh
bCggZGF0YS5tYXRlcmlhbCApICk7CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgJ0xpbmVT
ZWdtZW50cyc6CisKKwkJCQkJCW9iamVjdCA9IG5ldyBMaW5lU2VnbWVudHMoIGdldEdlb21ldHJ5
KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTsKKworCQkJ
CQkJYnJlYWs7CisKKwkJCQkJY2FzZSAnUG9pbnRDbG91ZCc6CisJCQkJCWNhc2UgJ1BvaW50cyc6
CisKKwkJCQkJCW9iamVjdCA9IG5ldyBQb2ludHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5
ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTsKKworCQkJCQkJYnJlYWs7CisKKwkJ
CQkJY2FzZSAnU3ByaXRlJzoKKworCQkJCQkJb2JqZWN0ID0gbmV3IFNwcml0ZSggZ2V0TWF0ZXJp
YWwoIGRhdGEubWF0ZXJpYWwgKSApOworCisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICdHcm91
cCc6CisKKwkJCQkJCW9iamVjdCA9IG5ldyBHcm91cCgpOworCisJCQkJCQlicmVhazsKKworCQkJ
CQlkZWZhdWx0OgorCisJCQkJCQlvYmplY3QgPSBuZXcgT2JqZWN0M0QoKTsKKworCQkJCX0KKwor
CQkJCW9iamVjdC51dWlkID0gZGF0YS51dWlkOworCisJCQkJaWYgKCBkYXRhLm5hbWUgIT09IHVu
ZGVmaW5lZCApIG9iamVjdC5uYW1lID0gZGF0YS5uYW1lOworCQkJCWlmICggZGF0YS5tYXRyaXgg
IT09IHVuZGVmaW5lZCApIHsKKworCQkJCQltYXRyaXguZnJvbUFycmF5KCBkYXRhLm1hdHJpeCAp
OworCQkJCQltYXRyaXguZGVjb21wb3NlKCBvYmplY3QucG9zaXRpb24sIG9iamVjdC5xdWF0ZXJu
aW9uLCBvYmplY3Quc2NhbGUgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJaWYgKCBkYXRhLnBv
c2l0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucG9zaXRpb24uZnJvbUFycmF5KCBkYXRhLnBv
c2l0aW9uICk7CisJCQkJCWlmICggZGF0YS5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0
LnJvdGF0aW9uLmZyb21BcnJheSggZGF0YS5yb3RhdGlvbiApOworCQkJCQlpZiAoIGRhdGEucXVh
dGVybmlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnF1YXRlcm5pb24uZnJvbUFycmF5KCBkYXRh
LnF1YXRlcm5pb24gKTsKKwkJCQkJaWYgKCBkYXRhLnNjYWxlICE9PSB1bmRlZmluZWQgKSBvYmpl
Y3Quc2NhbGUuZnJvbUFycmF5KCBkYXRhLnNjYWxlICk7CisKKwkJCQl9CisKKwkJCQlpZiAoIGRh
dGEuY2FzdFNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmNhc3RTaGFkb3cgPSBkYXRhLmNh
c3RTaGFkb3c7CisJCQkJaWYgKCBkYXRhLnJlY2VpdmVTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9i
amVjdC5yZWNlaXZlU2hhZG93ID0gZGF0YS5yZWNlaXZlU2hhZG93OworCisJCQkJaWYgKCBkYXRh
LnNoYWRvdyApIHsKKworCQkJCQlpZiAoIGRhdGEuc2hhZG93LmJpYXMgIT09IHVuZGVmaW5lZCAp
IG9iamVjdC5zaGFkb3cuYmlhcyA9IGRhdGEuc2hhZG93LmJpYXM7CisJCQkJCWlmICggZGF0YS5z
aGFkb3cucmFkaXVzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LnJhZGl1cyA9IGRhdGEu
c2hhZG93LnJhZGl1czsKKwkJCQkJaWYgKCBkYXRhLnNoYWRvdy5tYXBTaXplICE9PSB1bmRlZmlu
ZWQgKSBvYmplY3Quc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KCBkYXRhLnNoYWRvdy5tYXBTaXpl
ICk7CisJCQkJCWlmICggZGF0YS5zaGFkb3cuY2FtZXJhICE9PSB1bmRlZmluZWQgKSBvYmplY3Qu
c2hhZG93LmNhbWVyYSA9IHRoaXMucGFyc2VPYmplY3QoIGRhdGEuc2hhZG93LmNhbWVyYSApOwor
CisJCQkJfQorCisJCQkJaWYgKCBkYXRhLnZpc2libGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC52
aXNpYmxlID0gZGF0YS52aXNpYmxlOworCQkJCWlmICggZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZp
bmVkICkgb2JqZWN0LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTsKKworCQkJCWlmICggZGF0YS5j
aGlsZHJlbiAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWZvciAoIHZhciBjaGlsZCBpbiBkYXRh
LmNoaWxkcmVuICkgeworCisJCQkJCQlvYmplY3QuYWRkKCB0aGlzLnBhcnNlT2JqZWN0KCBkYXRh
LmNoaWxkcmVuWyBjaGlsZCBdLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKSApOworCisJCQkJCX0K
KworCQkJCX0KKworCQkJCWlmICggZGF0YS50eXBlID09PSAnTE9EJyApIHsKKworCQkJCQl2YXIg
bGV2ZWxzID0gZGF0YS5sZXZlbHM7CisKKwkJCQkJZm9yICggdmFyIGwgPSAwOyBsIDwgbGV2ZWxz
Lmxlbmd0aDsgbCArKyApIHsKKworCQkJCQkJdmFyIGxldmVsID0gbGV2ZWxzWyBsIF07CisJCQkJ
CQl2YXIgY2hpbGQgPSBvYmplY3QuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ3V1aWQnLCBsZXZlbC5v
YmplY3QgKTsKKworCQkJCQkJaWYgKCBjaGlsZCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCQkJ
b2JqZWN0LmFkZExldmVsKCBjaGlsZCwgbGV2ZWwuZGlzdGFuY2UgKTsKKworCQkJCQkJfQorCisJ
CQkJCX0KKworCQkJCX0KKworCQkJCXJldHVybiBvYmplY3Q7CisKKwkJCX07CisKKwkJfSgpCisK
Kwl9ICk7CisKKwl2YXIgVEVYVFVSRV9NQVBQSU5HID0geworCQlVVk1hcHBpbmc6IFVWTWFwcGlu
ZywKKwkJQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsCisJCUN1
YmVSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLAorCQlFcXVpcmVjdGFu
Z3VsYXJSZWZsZWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcs
CisJCUVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZy
YWN0aW9uTWFwcGluZywKKwkJU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6IFNwaGVyaWNhbFJl
ZmxlY3Rpb25NYXBwaW5nLAorCQlDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmbGVj
dGlvbk1hcHBpbmcsCisJCUN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZyYWN0aW9u
TWFwcGluZworCX07CisKKwl2YXIgVEVYVFVSRV9XUkFQUElORyA9IHsKKwkJUmVwZWF0V3JhcHBp
bmc6IFJlcGVhdFdyYXBwaW5nLAorCQlDbGFtcFRvRWRnZVdyYXBwaW5nOiBDbGFtcFRvRWRnZVdy
YXBwaW5nLAorCQlNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOiBNaXJyb3JlZFJlcGVhdFdyYXBwaW5n
CisJfTsKKworCXZhciBURVhUVVJFX0ZJTFRFUiA9IHsKKwkJTmVhcmVzdEZpbHRlcjogTmVhcmVz
dEZpbHRlciwKKwkJTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RNaXBNYXBOZWFy
ZXN0RmlsdGVyLAorCQlOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyOiBOZWFyZXN0TWlwTWFwTGlu
ZWFyRmlsdGVyLAorCQlMaW5lYXJGaWx0ZXI6IExpbmVhckZpbHRlciwKKwkJTGluZWFyTWlwTWFw
TmVhcmVzdEZpbHRlcjogTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciwKKwkJTGluZWFyTWlwTWFw
TGluZWFyRmlsdGVyOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIKKwl9OworCisJLyoqCisJICog
QGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZworCSAqCisJ
ICogQmV6aWVyIEN1cnZlcyBmb3JtdWxhcyBvYnRhaW5lZCBmcm9tCisJICogaHR0cDovL2VuLndp
a2lwZWRpYS5vcmcvd2lraS9Cw6l6aWVyX2N1cnZlCisJICovCisKKwlmdW5jdGlvbiBDYXRtdWxs
Um9tKCB0LCBwMCwgcDEsIHAyLCBwMyApIHsKKworCQl2YXIgdjAgPSAoIHAyIC0gcDAgKSAqIDAu
NTsKKwkJdmFyIHYxID0gKCBwMyAtIHAxICkgKiAwLjU7CisJCXZhciB0MiA9IHQgKiB0OworCQl2
YXIgdDMgPSB0ICogdDI7CisJCXJldHVybiAoIDIgKiBwMSAtIDIgKiBwMiArIHYwICsgdjEgKSAq
IHQzICsgKCAtIDMgKiBwMSArIDMgKiBwMiAtIDIgKiB2MCAtIHYxICkgKiB0MiArIHYwICogdCAr
IHAxOworCisJfQorCisJLy8KKworCWZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAwKCB0LCBwICkg
eworCisJCXZhciBrID0gMSAtIHQ7CisJCXJldHVybiBrICogayAqIHA7CisKKwl9CisKKwlmdW5j
dGlvbiBRdWFkcmF0aWNCZXppZXJQMSggdCwgcCApIHsKKworCQlyZXR1cm4gMiAqICggMSAtIHQg
KSAqIHQgKiBwOworCisJfQorCisJZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDIoIHQsIHAgKSB7
CisKKwkJcmV0dXJuIHQgKiB0ICogcDsKKworCX0KKworCWZ1bmN0aW9uIFF1YWRyYXRpY0Jlemll
ciggdCwgcDAsIHAxLCBwMiApIHsKKworCQlyZXR1cm4gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAw
ICkgKyBRdWFkcmF0aWNCZXppZXJQMSggdCwgcDEgKSArCisJCQlRdWFkcmF0aWNCZXppZXJQMigg
dCwgcDIgKTsKKworCX0KKworCS8vCisKKwlmdW5jdGlvbiBDdWJpY0JlemllclAwKCB0LCBwICkg
eworCisJCXZhciBrID0gMSAtIHQ7CisJCXJldHVybiBrICogayAqIGsgKiBwOworCisJfQorCisJ
ZnVuY3Rpb24gQ3ViaWNCZXppZXJQMSggdCwgcCApIHsKKworCQl2YXIgayA9IDEgLSB0OworCQly
ZXR1cm4gMyAqIGsgKiBrICogdCAqIHA7CisKKwl9CisKKwlmdW5jdGlvbiBDdWJpY0JlemllclAy
KCB0LCBwICkgeworCisJCXJldHVybiAzICogKCAxIC0gdCApICogdCAqIHQgKiBwOworCisJfQor
CisJZnVuY3Rpb24gQ3ViaWNCZXppZXJQMyggdCwgcCApIHsKKworCQlyZXR1cm4gdCAqIHQgKiB0
ICogcDsKKworCX0KKworCWZ1bmN0aW9uIEN1YmljQmV6aWVyKCB0LCBwMCwgcDEsIHAyLCBwMyAp
IHsKKworCQlyZXR1cm4gQ3ViaWNCZXppZXJQMCggdCwgcDAgKSArIEN1YmljQmV6aWVyUDEoIHQs
IHAxICkgKyBDdWJpY0JlemllclAyKCB0LCBwMiApICsKKwkJCUN1YmljQmV6aWVyUDMoIHQsIHAz
ICk7CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1l
cy5uZXQveno4NS9ibG9nCisJICogRXh0ZW5zaWJsZSBjdXJ2ZSBvYmplY3QKKwkgKgorCSAqIFNv
bWUgY29tbW9uIG9mIGN1cnZlIG1ldGhvZHM6CisJICogLmdldFBvaW50KHQpLCBnZXRUYW5nZW50
KHQpCisJICogLmdldFBvaW50QXQodSksIGdldFRhbmdlbnRBdCh1KQorCSAqIC5nZXRQb2ludHMo
KSwgLmdldFNwYWNlZFBvaW50cygpCisJICogLmdldExlbmd0aCgpCisJICogLnVwZGF0ZUFyY0xl
bmd0aHMoKQorCSAqCisJICogVGhpcyBmb2xsb3dpbmcgY3VydmVzIGluaGVyaXQgZnJvbSBUSFJF
RS5DdXJ2ZToKKwkgKgorCSAqIC0tIDJEIGN1cnZlcyAtLQorCSAqIFRIUkVFLkFyY0N1cnZlCisJ
ICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZQorCSAqIFRIUkVFLkVsbGlwc2VDdXJ2ZQorCSAqIFRI
UkVFLkxpbmVDdXJ2ZQorCSAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlCisJICogVEhSRUUu
U3BsaW5lQ3VydmUKKwkgKgorCSAqIC0tIDNEIGN1cnZlcyAtLQorCSAqIFRIUkVFLkNhdG11bGxS
b21DdXJ2ZTMKKwkgKiBUSFJFRS5DdWJpY0JlemllckN1cnZlMworCSAqIFRIUkVFLkxpbmVDdXJ2
ZTMKKwkgKiBUSFJFRS5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMKKwkgKgorCSAqIEEgc2VyaWVzIG9m
IGN1cnZlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBUSFJFRS5DdXJ2ZVBhdGguCisJICoKKwkg
KiovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioKKwkgKglBYnN0cmFjdCBDdXJ2ZSBiYXNlIGNsYXNzCisJICoqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwor
CisJZnVuY3Rpb24gQ3VydmUoKSB7CisKKwkJdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSAyMDA7
CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBDdXJ2ZS5wcm90b3R5cGUsIHsKKworCQkvLyBWaXJ0
dWFsIGJhc2UgY2xhc3MgbWV0aG9kIHRvIG92ZXJ3cml0ZSBhbmQgaW1wbGVtZW50IGluIHN1YmNs
YXNzZXMKKwkJLy8JLSB0IFswIC4uIDFdCisKKwkJZ2V0UG9pbnQ6IGZ1bmN0aW9uICgpIHsKKwor
CQkJY29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRl
ZC4nICk7CisJCQlyZXR1cm4gbnVsbDsKKworCQl9LAorCisJCS8vIEdldCBwb2ludCBhdCByZWxh
dGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gYXJjIGxlbmd0aAorCQkvLyAtIHUg
WzAgLi4gMV0KKworCQlnZXRQb2ludEF0OiBmdW5jdGlvbiAoIHUgKSB7CisKKwkJCXZhciB0ID0g
dGhpcy5nZXRVdG9UbWFwcGluZyggdSApOworCQkJcmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHQgKTsK
KworCQl9LAorCisJCS8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnQoIHQg
KQorCisJCWdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CisKKwkJCWlmICggZGl2
aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1OworCisJCQl2YXIgcG9pbnRzID0g
W107CisKKwkJCWZvciAoIHZhciBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7CisKKwkJ
CQlwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludCggZCAvIGRpdmlzaW9ucyApICk7CisKKwkJCX0K
KworCQkJcmV0dXJuIHBvaW50czsKKworCQl9LAorCisJCS8vIEdldCBzZXF1ZW5jZSBvZiBwb2lu
dHMgdXNpbmcgZ2V0UG9pbnRBdCggdSApCisKKwkJZ2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAo
IGRpdmlzaW9ucyApIHsKKworCQkJaWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlz
aW9ucyA9IDU7CisKKwkJCXZhciBwb2ludHMgPSBbXTsKKworCQkJZm9yICggdmFyIGQgPSAwOyBk
IDw9IGRpdmlzaW9uczsgZCArKyApIHsKKworCQkJCXBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50
QXQoIGQgLyBkaXZpc2lvbnMgKSApOworCisJCQl9CisKKwkJCXJldHVybiBwb2ludHM7CisKKwkJ
fSwKKworCQkvLyBHZXQgdG90YWwgY3VydmUgYXJjIGxlbmd0aAorCisJCWdldExlbmd0aDogZnVu
Y3Rpb24gKCkgeworCisJCQl2YXIgbGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpOworCQkJcmV0
dXJuIGxlbmd0aHNbIGxlbmd0aHMubGVuZ3RoIC0gMSBdOworCisJCX0sCisKKwkJLy8gR2V0IGxp
c3Qgb2YgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHMKKworCQlnZXRMZW5ndGhzOiBmdW5jdGlv
biAoIGRpdmlzaW9ucyApIHsKKworCQkJaWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRp
dmlzaW9ucyA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zOworCisJCQlpZiAoIHRoaXMuY2FjaGVB
cmNMZW5ndGhzICYmCisJCQkJKCB0aGlzLmNhY2hlQXJjTGVuZ3Rocy5sZW5ndGggPT09IGRpdmlz
aW9ucyArIDEgKSAmJgorCQkJCSEgdGhpcy5uZWVkc1VwZGF0ZSApIHsKKworCQkJCXJldHVybiB0
aGlzLmNhY2hlQXJjTGVuZ3RoczsKKworCQkJfQorCisJCQl0aGlzLm5lZWRzVXBkYXRlID0gZmFs
c2U7CisKKwkJCXZhciBjYWNoZSA9IFtdOworCQkJdmFyIGN1cnJlbnQsIGxhc3QgPSB0aGlzLmdl
dFBvaW50KCAwICk7CisJCQl2YXIgcCwgc3VtID0gMDsKKworCQkJY2FjaGUucHVzaCggMCApOwor
CisJCQlmb3IgKCBwID0gMTsgcCA8PSBkaXZpc2lvbnM7IHAgKysgKSB7CisKKwkJCQljdXJyZW50
ID0gdGhpcy5nZXRQb2ludCggcCAvIGRpdmlzaW9ucyApOworCQkJCXN1bSArPSBjdXJyZW50LmRp
c3RhbmNlVG8oIGxhc3QgKTsKKwkJCQljYWNoZS5wdXNoKCBzdW0gKTsKKwkJCQlsYXN0ID0gY3Vy
cmVudDsKKworCQkJfQorCisJCQl0aGlzLmNhY2hlQXJjTGVuZ3RocyA9IGNhY2hlOworCisJCQly
ZXR1cm4gY2FjaGU7IC8vIHsgc3VtczogY2FjaGUsIHN1bTogc3VtIH07IFN1bSBpcyBpbiB0aGUg
bGFzdCBlbGVtZW50LgorCisJCX0sCisKKwkJdXBkYXRlQXJjTGVuZ3RoczogZnVuY3Rpb24gKCkg
eworCisJCQl0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKwkJCXRoaXMuZ2V0TGVuZ3RocygpOwor
CisJCX0sCisKKwkJLy8gR2l2ZW4gdSAoIDAgLi4gMSApLCBnZXQgYSB0IHRvIGZpbmQgcC4gVGhp
cyBnaXZlcyB5b3UgcG9pbnRzIHdoaWNoIGFyZSBlcXVpZGlzdGFudAorCisJCWdldFV0b1RtYXBw
aW5nOiBmdW5jdGlvbiAoIHUsIGRpc3RhbmNlICkgeworCisJCQl2YXIgYXJjTGVuZ3RocyA9IHRo
aXMuZ2V0TGVuZ3RocygpOworCisJCQl2YXIgaSA9IDAsIGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7
CisKKwkJCXZhciB0YXJnZXRBcmNMZW5ndGg7IC8vIFRoZSB0YXJnZXRlZCB1IGRpc3RhbmNlIHZh
bHVlIHRvIGdldAorCisJCQlpZiAoIGRpc3RhbmNlICkgeworCisJCQkJdGFyZ2V0QXJjTGVuZ3Ro
ID0gZGlzdGFuY2U7CisKKwkJCX0gZWxzZSB7CisKKwkJCQl0YXJnZXRBcmNMZW5ndGggPSB1ICog
YXJjTGVuZ3Roc1sgaWwgLSAxIF07CisKKwkJCX0KKworCQkJLy8gYmluYXJ5IHNlYXJjaCBmb3Ig
dGhlIGluZGV4IHdpdGggbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gdGFyZ2V0IHUgZGlzdGFu
Y2UKKworCQkJdmFyIGxvdyA9IDAsIGhpZ2ggPSBpbCAtIDEsIGNvbXBhcmlzb247CisKKwkJCXdo
aWxlICggbG93IDw9IGhpZ2ggKSB7CisKKwkJCQlpID0gTWF0aC5mbG9vciggbG93ICsgKCBoaWdo
IC0gbG93ICkgLyAyICk7IC8vIGxlc3MgbGlrZWx5IHRvIG92ZXJmbG93LCB0aG91Z2ggcHJvYmFi
bHkgbm90IGlzc3VlIGhlcmUsIEpTIGRvZXNuJ3QgcmVhbGx5IGhhdmUgaW50ZWdlcnMsIGFsbCBu
dW1iZXJzIGFyZSBmbG9hdHMKKworCQkJCWNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0
YXJnZXRBcmNMZW5ndGg7CisKKwkJCQlpZiAoIGNvbXBhcmlzb24gPCAwICkgeworCisJCQkJCWxv
dyA9IGkgKyAxOworCisJCQkJfSBlbHNlIGlmICggY29tcGFyaXNvbiA+IDAgKSB7CisKKwkJCQkJ
aGlnaCA9IGkgLSAxOworCisJCQkJfSBlbHNlIHsKKworCQkJCQloaWdoID0gaTsKKwkJCQkJYnJl
YWs7CisKKwkJCQkJLy8gRE9ORQorCisJCQkJfQorCisJCQl9CisKKwkJCWkgPSBoaWdoOworCisJ
CQlpZiAoIGFyY0xlbmd0aHNbIGkgXSA9PT0gdGFyZ2V0QXJjTGVuZ3RoICkgeworCisJCQkJcmV0
dXJuIGkgLyAoIGlsIC0gMSApOworCisJCQl9CisKKwkJCS8vIHdlIGNvdWxkIGdldCBmaW5lciBn
cmFpbiBhdCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28g
cG9pbnRzCisKKwkJCXZhciBsZW5ndGhCZWZvcmUgPSBhcmNMZW5ndGhzWyBpIF07CisJCQl2YXIg
bGVuZ3RoQWZ0ZXIgPSBhcmNMZW5ndGhzWyBpICsgMSBdOworCisJCQl2YXIgc2VnbWVudExlbmd0
aCA9IGxlbmd0aEFmdGVyIC0gbGVuZ3RoQmVmb3JlOworCisJCQkvLyBkZXRlcm1pbmUgd2hlcmUg
d2UgYXJlIGJldHdlZW4gdGhlICdiZWZvcmUnIGFuZCAnYWZ0ZXInIHBvaW50cworCisJCQl2YXIg
c2VnbWVudEZyYWN0aW9uID0gKCB0YXJnZXRBcmNMZW5ndGggLSBsZW5ndGhCZWZvcmUgKSAvIHNl
Z21lbnRMZW5ndGg7CisKKwkJCS8vIGFkZCB0aGF0IGZyYWN0aW9uYWwgYW1vdW50IHRvIHQKKwor
CQkJdmFyIHQgPSAoIGkgKyBzZWdtZW50RnJhY3Rpb24gKSAvICggaWwgLSAxICk7CisKKwkJCXJl
dHVybiB0OworCisJCX0sCisKKwkJLy8gUmV0dXJucyBhIHVuaXQgdmVjdG9yIHRhbmdlbnQgYXQg
dAorCQkvLyBJbiBjYXNlIGFueSBzdWIgY3VydmUgZG9lcyBub3QgaW1wbGVtZW50IGl0cyB0YW5n
ZW50IGRlcml2YXRpb24sCisJCS8vIDIgcG9pbnRzIGEgc21hbGwgZGVsdGEgYXBhcnQgd2lsbCBi
ZSB1c2VkIHRvIGZpbmQgaXRzIGdyYWRpZW50CisJCS8vIHdoaWNoIHNlZW1zIHRvIGdpdmUgYSBy
ZWFzb25hYmxlIGFwcHJveGltYXRpb24KKworCQlnZXRUYW5nZW50OiBmdW5jdGlvbiAoIHQgKSB7
CisKKwkJCXZhciBkZWx0YSA9IDAuMDAwMTsKKwkJCXZhciB0MSA9IHQgLSBkZWx0YTsKKwkJCXZh
ciB0MiA9IHQgKyBkZWx0YTsKKworCQkJLy8gQ2FwcGluZyBpbiBjYXNlIG9mIGRhbmdlcgorCisJ
CQlpZiAoIHQxIDwgMCApIHQxID0gMDsKKwkJCWlmICggdDIgPiAxICkgdDIgPSAxOworCisJCQl2
YXIgcHQxID0gdGhpcy5nZXRQb2ludCggdDEgKTsKKwkJCXZhciBwdDIgPSB0aGlzLmdldFBvaW50
KCB0MiApOworCisJCQl2YXIgdmVjID0gcHQyLmNsb25lKCkuc3ViKCBwdDEgKTsKKwkJCXJldHVy
biB2ZWMubm9ybWFsaXplKCk7CisKKwkJfSwKKworCQlnZXRUYW5nZW50QXQ6IGZ1bmN0aW9uICgg
dSApIHsKKworCQkJdmFyIHQgPSB0aGlzLmdldFV0b1RtYXBwaW5nKCB1ICk7CisJCQlyZXR1cm4g
dGhpcy5nZXRUYW5nZW50KCB0ICk7CisKKwkJfSwKKworCQljb21wdXRlRnJlbmV0RnJhbWVzOiBm
dW5jdGlvbiAoIHNlZ21lbnRzLCBjbG9zZWQgKSB7CisKKwkJCS8vIHNlZSBodHRwOi8vd3d3LmNz
LmluZGlhbmEuZWR1L3B1Yi90ZWNocmVwb3J0cy9UUjQyNS5wZGYKKworCQkJdmFyIG5vcm1hbCA9
IG5ldyBWZWN0b3IzKCk7CisKKwkJCXZhciB0YW5nZW50cyA9IFtdOworCQkJdmFyIG5vcm1hbHMg
PSBbXTsKKwkJCXZhciBiaW5vcm1hbHMgPSBbXTsKKworCQkJdmFyIHZlYyA9IG5ldyBWZWN0b3Iz
KCk7CisJCQl2YXIgbWF0ID0gbmV3IE1hdHJpeDQoKTsKKworCQkJdmFyIGksIHUsIHRoZXRhOwor
CisJCQkvLyBjb21wdXRlIHRoZSB0YW5nZW50IHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0
aGUgY3VydmUKKworCQkJZm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7CisKKwkJ
CQl1ID0gaSAvIHNlZ21lbnRzOworCisJCQkJdGFuZ2VudHNbIGkgXSA9IHRoaXMuZ2V0VGFuZ2Vu
dEF0KCB1ICk7CisJCQkJdGFuZ2VudHNbIGkgXS5ub3JtYWxpemUoKTsKKworCQkJfQorCisJCQkv
LyBzZWxlY3QgYW4gaW5pdGlhbCBub3JtYWwgdmVjdG9yIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGZp
cnN0IHRhbmdlbnQgdmVjdG9yLAorCQkJLy8gYW5kIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1p
bmltdW0gdGFuZ2VudCB4eXogY29tcG9uZW50CisKKwkJCW5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0
b3IzKCk7CisJCQliaW5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgbWluID0g
TnVtYmVyLk1BWF9WQUxVRTsKKwkJCXZhciB0eCA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLngg
KTsKKwkJCXZhciB0eSA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnkgKTsKKwkJCXZhciB0eiA9
IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnogKTsKKworCQkJaWYgKCB0eCA8PSBtaW4gKSB7CisK
KwkJCQltaW4gPSB0eDsKKwkJCQlub3JtYWwuc2V0KCAxLCAwLCAwICk7CisKKwkJCX0KKworCQkJ
aWYgKCB0eSA8PSBtaW4gKSB7CisKKwkJCQltaW4gPSB0eTsKKwkJCQlub3JtYWwuc2V0KCAwLCAx
LCAwICk7CisKKwkJCX0KKworCQkJaWYgKCB0eiA8PSBtaW4gKSB7CisKKwkJCQlub3JtYWwuc2V0
KCAwLCAwLCAxICk7CisKKwkJCX0KKworCQkJdmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAg
XSwgbm9ybWFsICkubm9ybWFsaXplKCk7CisKKwkJCW5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMo
IHRhbmdlbnRzWyAwIF0sIHZlYyApOworCQkJYmlub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0
YW5nZW50c1sgMCBdLCBub3JtYWxzWyAwIF0gKTsKKworCisJCQkvLyBjb21wdXRlIHRoZSBzbG93
bHktdmFyeWluZyBub3JtYWwgYW5kIGJpbm9ybWFsIHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBv
biB0aGUgY3VydmUKKworCQkJZm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7CisK
KwkJCQlub3JtYWxzWyBpIF0gPSBub3JtYWxzWyBpIC0gMSBdLmNsb25lKCk7CisKKwkJCQliaW5v
cm1hbHNbIGkgXSA9IGJpbm9ybWFsc1sgaSAtIDEgXS5jbG9uZSgpOworCisJCQkJdmVjLmNyb3Nz
VmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTsKKworCQkJCWlmICgg
dmVjLmxlbmd0aCgpID4gTnVtYmVyLkVQU0lMT04gKSB7CisKKwkJCQkJdmVjLm5vcm1hbGl6ZSgp
OworCisJCQkJCXRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGFuZ2VudHNbIGkgLSAx
IF0uZG90KCB0YW5nZW50c1sgaSBdICksIC0gMSwgMSApICk7IC8vIGNsYW1wIGZvciBmbG9hdGlu
ZyBwdCBlcnJvcnMKKworCQkJCQlub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJv
dGF0aW9uQXhpcyggdmVjLCB0aGV0YSApICk7CisKKwkJCQl9CisKKwkJCQliaW5vcm1hbHNbIGkg
XS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApOworCisJCQl9CisK
KwkJCS8vIGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQsIHBvc3Rwcm9jZXNzIHRoZSB2ZWN0b3JzIHNv
IHRoZSBmaXJzdCBhbmQgbGFzdCBub3JtYWwgdmVjdG9ycyBhcmUgdGhlIHNhbWUKKworCQkJaWYg
KCBjbG9zZWQgPT09IHRydWUgKSB7CisKKwkJCQl0aGV0YSA9IE1hdGguYWNvcyggX01hdGguY2xh
bXAoIG5vcm1hbHNbIDAgXS5kb3QoIG5vcm1hbHNbIHNlZ21lbnRzIF0gKSwgLSAxLCAxICkgKTsK
KwkJCQl0aGV0YSAvPSBzZWdtZW50czsKKworCQkJCWlmICggdGFuZ2VudHNbIDAgXS5kb3QoIHZl
Yy5jcm9zc1ZlY3RvcnMoIG5vcm1hbHNbIDAgXSwgbm9ybWFsc1sgc2VnbWVudHMgXSApICkgPiAw
ICkgeworCisJCQkJCXRoZXRhID0gLSB0aGV0YTsKKworCQkJCX0KKworCQkJCWZvciAoIGkgPSAx
OyBpIDw9IHNlZ21lbnRzOyBpICsrICkgeworCisJCQkJCS8vIHR3aXN0IGEgbGl0dGxlLi4uCisJ
CQkJCW5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB0YW5n
ZW50c1sgaSBdLCB0aGV0YSAqIGkgKSApOworCQkJCQliaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3Rv
cnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApOworCisJCQkJfQorCisJCQl9CisKKwkJ
CXJldHVybiB7CisJCQkJdGFuZ2VudHM6IHRhbmdlbnRzLAorCQkJCW5vcm1hbHM6IG5vcm1hbHMs
CisJCQkJYmlub3JtYWxzOiBiaW5vcm1hbHMKKwkJCX07CisKKwkJfQorCisJfSApOworCisJZnVu
Y3Rpb24gTGluZUN1cnZlKCB2MSwgdjIgKSB7CisKKwkJQ3VydmUuY2FsbCggdGhpcyApOworCisJ
CXRoaXMudjEgPSB2MTsKKwkJdGhpcy52MiA9IHYyOworCisJfQorCisJTGluZUN1cnZlLnByb3Rv
dHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApOworCUxpbmVDdXJ2ZS5wcm90
b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQ3VydmU7CisKKwlMaW5lQ3VydmUucHJvdG90eXBlLmlz
TGluZUN1cnZlID0gdHJ1ZTsKKworCUxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5j
dGlvbiAoIHQgKSB7CisKKwkJaWYgKCB0ID09PSAxICkgeworCisJCQlyZXR1cm4gdGhpcy52Mi5j
bG9uZSgpOworCisJCX0KKworCQl2YXIgcG9pbnQgPSB0aGlzLnYyLmNsb25lKCkuc3ViKCB0aGlz
LnYxICk7CisJCXBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7CisKKwkJ
cmV0dXJuIHBvaW50OworCisJfTsKKworCS8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3ZSBj
YW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdAorCisJTGluZUN1cnZlLnByb3RvdHlwZS5n
ZXRQb2ludEF0ID0gZnVuY3Rpb24gKCB1ICkgeworCisJCXJldHVybiB0aGlzLmdldFBvaW50KCB1
ICk7CisKKwl9OworCisJTGluZUN1cnZlLnByb3RvdHlwZS5nZXRUYW5nZW50ID0gZnVuY3Rpb24g
KCB0ICkgeworCisJCXZhciB0YW5nZW50ID0gdGhpcy52Mi5jbG9uZSgpLnN1YiggdGhpcy52MSAp
OworCisJCXJldHVybiB0YW5nZW50Lm5vcm1hbGl6ZSgpOworCisJfTsKKworCS8qKgorCSAqIEBh
dXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKKwkgKgorCSAq
Ki8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKgorCSAqCUN1cnZlZCBQYXRoIC0gYSBjdXJ2ZSBwYXRoIGlzIHNpbXBseSBh
IGFycmF5IG9mIGNvbm5lY3RlZAorCSAqICBjdXJ2ZXMsIGJ1dCByZXRhaW5zIHRoZSBhcGkgb2Yg
YSBjdXJ2ZQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKi8KKworCWZ1bmN0aW9uIEN1cnZlUGF0aCgpIHsKKworCQlDdXJ2ZS5j
YWxsKCB0aGlzICk7CisKKwkJdGhpcy5jdXJ2ZXMgPSBbXTsKKworCQl0aGlzLmF1dG9DbG9zZSA9
IGZhbHNlOyAvLyBBdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgcGF0aAorCisJfQorCisJQ3VydmVQ
YXRoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3Rv
dHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IEN1cnZlUGF0aCwKKworCQlhZGQ6IGZ1bmN0aW9u
ICggY3VydmUgKSB7CisKKwkJCXRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7CisKKwkJfSwKKwor
CQljbG9zZVBhdGg6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gQWRkIGEgbGluZSBjdXJ2ZSBpZiBz
dGFydCBhbmQgZW5kIG9mIGxpbmVzIGFyZSBub3QgY29ubmVjdGVkCisJCQl2YXIgc3RhcnRQb2lu
dCA9IHRoaXMuY3VydmVzWyAwIF0uZ2V0UG9pbnQoIDAgKTsKKwkJCXZhciBlbmRQb2ludCA9IHRo
aXMuY3VydmVzWyB0aGlzLmN1cnZlcy5sZW5ndGggLSAxIF0uZ2V0UG9pbnQoIDEgKTsKKworCQkJ
aWYgKCAhIHN0YXJ0UG9pbnQuZXF1YWxzKCBlbmRQb2ludCApICkgeworCisJCQkJdGhpcy5jdXJ2
ZXMucHVzaCggbmV3IExpbmVDdXJ2ZSggZW5kUG9pbnQsIHN0YXJ0UG9pbnQgKSApOworCisJCQl9
CisKKwkJfSwKKworCQkvLyBUbyBnZXQgYWNjdXJhdGUgcG9pbnQgd2l0aCByZWZlcmVuY2UgdG8K
KwkJLy8gZW50aXJlIHBhdGggZGlzdGFuY2UgYXQgdGltZSB0LAorCQkvLyBmb2xsb3dpbmcgaGFz
IHRvIGJlIGRvbmU6CisKKwkJLy8gMS4gTGVuZ3RoIG9mIGVhY2ggc3ViIHBhdGggaGF2ZSB0byBi
ZSBrbm93bgorCQkvLyAyLiBMb2NhdGUgYW5kIGlkZW50aWZ5IHR5cGUgb2YgY3VydmUKKwkJLy8g
My4gR2V0IHQgZm9yIHRoZSBjdXJ2ZQorCQkvLyA0LiBSZXR1cm4gY3VydmUuZ2V0UG9pbnRBdCh0
JykKKworCQlnZXRQb2ludDogZnVuY3Rpb24gKCB0ICkgeworCisJCQl2YXIgZCA9IHQgKiB0aGlz
LmdldExlbmd0aCgpOworCQkJdmFyIGN1cnZlTGVuZ3RocyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhz
KCk7CisJCQl2YXIgaSA9IDA7CisKKwkJCS8vIFRvIHRoaW5rIGFib3V0IGJvdW5kYXJpZXMgcG9p
bnRzLgorCisJCQl3aGlsZSAoIGkgPCBjdXJ2ZUxlbmd0aHMubGVuZ3RoICkgeworCisJCQkJaWYg
KCBjdXJ2ZUxlbmd0aHNbIGkgXSA+PSBkICkgeworCisJCQkJCXZhciBkaWZmID0gY3VydmVMZW5n
dGhzWyBpIF0gLSBkOworCQkJCQl2YXIgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdOworCisJCQkJ
CXZhciBzZWdtZW50TGVuZ3RoID0gY3VydmUuZ2V0TGVuZ3RoKCk7CisJCQkJCXZhciB1ID0gc2Vn
bWVudExlbmd0aCA9PT0gMCA/IDAgOiAxIC0gZGlmZiAvIHNlZ21lbnRMZW5ndGg7CisKKwkJCQkJ
cmV0dXJuIGN1cnZlLmdldFBvaW50QXQoIHUgKTsKKworCQkJCX0KKworCQkJCWkgKys7CisKKwkJ
CX0KKworCQkJcmV0dXJuIG51bGw7CisKKwkJCS8vIGxvb3Agd2hlcmUgc3VtICE9IDAsIHN1bSA+
IGQgLCBzdW0rMSA8ZAorCisJCX0sCisKKwkJLy8gV2UgY2Fubm90IHVzZSB0aGUgZGVmYXVsdCBU
SFJFRS5DdXJ2ZSBnZXRQb2ludCgpIHdpdGggZ2V0TGVuZ3RoKCkgYmVjYXVzZSBpbgorCQkvLyBU
SFJFRS5DdXJ2ZSwgZ2V0TGVuZ3RoKCkgZGVwZW5kcyBvbiBnZXRQb2ludCgpIGJ1dCBpbiBUSFJF
RS5DdXJ2ZVBhdGgKKwkJLy8gZ2V0UG9pbnQoKSBkZXBlbmRzIG9uIGdldExlbmd0aAorCisJCWdl
dExlbmd0aDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgbGVucyA9IHRoaXMuZ2V0Q3VydmVMZW5n
dGhzKCk7CisJCQlyZXR1cm4gbGVuc1sgbGVucy5sZW5ndGggLSAxIF07CisKKwkJfSwKKworCQkv
LyBjYWNoZUxlbmd0aHMgbXVzdCBiZSByZWNhbGN1bGF0ZWQuCisJCXVwZGF0ZUFyY0xlbmd0aHM6
IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7CisJCQl0aGlzLmNh
Y2hlTGVuZ3RocyA9IG51bGw7CisJCQl0aGlzLmdldEN1cnZlTGVuZ3RocygpOworCisJCX0sCisK
KwkJLy8gQ29tcHV0ZSBsZW5ndGhzIGFuZCBjYWNoZSB0aGVtCisJCS8vIFdlIGNhbm5vdCBvdmVy
d3JpdGUgZ2V0TGVuZ3RocygpIGJlY2F1c2UgVXRvVCBtYXBwaW5nIHVzZXMgaXQuCisKKwkJZ2V0
Q3VydmVMZW5ndGhzOiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIFdlIHVzZSBjYWNoZSB2YWx1ZXMg
aWYgY3VydmVzIGFuZCBjYWNoZSBhcnJheSBhcmUgc2FtZSBsZW5ndGgKKworCQkJaWYgKCB0aGlz
LmNhY2hlTGVuZ3RocyAmJiB0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGggPT09IHRoaXMuY3VydmVz
Lmxlbmd0aCApIHsKKworCQkJCXJldHVybiB0aGlzLmNhY2hlTGVuZ3RoczsKKworCQkJfQorCisJ
CQkvLyBHZXQgbGVuZ3RoIG9mIHN1Yi1jdXJ2ZQorCQkJLy8gUHVzaCBzdW1zIGludG8gY2FjaGVk
IGFycmF5CisKKwkJCXZhciBsZW5ndGhzID0gW10sIHN1bXMgPSAwOworCisJCQlmb3IgKCB2YXIg
aSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJc3Vt
cyArPSB0aGlzLmN1cnZlc1sgaSBdLmdldExlbmd0aCgpOworCQkJCWxlbmd0aHMucHVzaCggc3Vt
cyApOworCisJCQl9CisKKwkJCXRoaXMuY2FjaGVMZW5ndGhzID0gbGVuZ3RoczsKKworCQkJcmV0
dXJuIGxlbmd0aHM7CisKKwkJfSwKKworCQlnZXRTcGFjZWRQb2ludHM6IGZ1bmN0aW9uICggZGl2
aXNpb25zICkgeworCisJCQlpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25z
ID0gNDA7CisKKwkJCXZhciBwb2ludHMgPSBbXTsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDw9
IGRpdmlzaW9uczsgaSArKyApIHsKKworCQkJCXBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBp
IC8gZGl2aXNpb25zICkgKTsKKworCQkJfQorCisJCQlpZiAoIHRoaXMuYXV0b0Nsb3NlICkgewor
CisJCQkJcG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7CisKKwkJCX0KKworCQkJcmV0dXJuIHBv
aW50czsKKworCQl9LAorCisJCWdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CisK
KwkJCWRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCAxMjsKKworCQkJdmFyIHBvaW50cyA9IFtdLCBs
YXN0OworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGN1cnZlcyA9IHRoaXMuY3VydmVzOyBpIDwgY3Vy
dmVzLmxlbmd0aDsgaSArKyApIHsKKworCQkJCXZhciBjdXJ2ZSA9IGN1cnZlc1sgaSBdOworCQkJ
CXZhciByZXNvbHV0aW9uID0gKGN1cnZlICYmIGN1cnZlLmlzRWxsaXBzZUN1cnZlKSA/IGRpdmlz
aW9ucyAqIDIKKwkJCQkJOiAoY3VydmUgJiYgY3VydmUuaXNMaW5lQ3VydmUpID8gMQorCQkJCQk6
IChjdXJ2ZSAmJiBjdXJ2ZS5pc1NwbGluZUN1cnZlKSA/IGRpdmlzaW9ucyAqIGN1cnZlLnBvaW50
cy5sZW5ndGgKKwkJCQkJOiBkaXZpc2lvbnM7CisKKwkJCQl2YXIgcHRzID0gY3VydmUuZ2V0UG9p
bnRzKCByZXNvbHV0aW9uICk7CisKKwkJCQlmb3IgKCB2YXIgaiA9IDA7IGogPCBwdHMubGVuZ3Ro
OyBqKysgKSB7CisKKwkJCQkJdmFyIHBvaW50ID0gcHRzWyBqIF07CisKKwkJCQkJaWYgKCBsYXN0
ICYmIGxhc3QuZXF1YWxzKCBwb2ludCApICkgY29udGludWU7IC8vIGVuc3VyZXMgbm8gY29uc2Vj
dXRpdmUgcG9pbnRzIGFyZSBkdXBsaWNhdGVzCisKKwkJCQkJcG9pbnRzLnB1c2goIHBvaW50ICk7
CisJCQkJCWxhc3QgPSBwb2ludDsKKworCQkJCX0KKworCQkJfQorCisJCQlpZiAoIHRoaXMuYXV0
b0Nsb3NlICYmIHBvaW50cy5sZW5ndGggPiAxICYmICFwb2ludHNbIHBvaW50cy5sZW5ndGggLSAx
IF0uZXF1YWxzKCBwb2ludHNbIDAgXSApICkgeworCisJCQkJcG9pbnRzLnB1c2goIHBvaW50c1sg
MCBdICk7CisKKwkJCX0KKworCQkJcmV0dXJuIHBvaW50czsKKworCQl9LAorCisJCS8qKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor
CQkgKglDcmVhdGUgR2VvbWV0cmllcyBIZWxwZXJzCisJCSAqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCQkvLy8gR2VuZXJh
dGUgZ2VvbWV0cnkgZnJvbSBwYXRoIHBvaW50cyAoZm9yIExpbmUgb3IgUG9pbnRzIG9iamVjdHMp
CisKKwkJY3JlYXRlUG9pbnRzR2VvbWV0cnk6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgeworCisJ
CQl2YXIgcHRzID0gdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApOworCQkJcmV0dXJuIHRoaXMu
Y3JlYXRlR2VvbWV0cnkoIHB0cyApOworCisJCX0sCisKKwkJLy8gR2VuZXJhdGUgZ2VvbWV0cnkg
ZnJvbSBlcXVpZGlzdGFudCBzYW1wbGluZyBhbG9uZyB0aGUgcGF0aAorCisJCWNyZWF0ZVNwYWNl
ZFBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKKworCQkJdmFyIHB0cyA9
IHRoaXMuZ2V0U3BhY2VkUG9pbnRzKCBkaXZpc2lvbnMgKTsKKwkJCXJldHVybiB0aGlzLmNyZWF0
ZUdlb21ldHJ5KCBwdHMgKTsKKworCQl9LAorCisJCWNyZWF0ZUdlb21ldHJ5OiBmdW5jdGlvbiAo
IHBvaW50cyApIHsKKworCQkJdmFyIGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KCk7CisKKwkJCWZv
ciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJ
dmFyIHBvaW50ID0gcG9pbnRzWyBpIF07CisJCQkJZ2VvbWV0cnkudmVydGljZXMucHVzaCggbmV3
IFZlY3RvcjMoIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApICk7CisKKwkJCX0KKwor
CQkJcmV0dXJuIGdlb21ldHJ5OworCisJCX0KKworCX0gKTsKKworCWZ1bmN0aW9uIEVsbGlwc2VD
dXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBh
Q2xvY2t3aXNlLCBhUm90YXRpb24gKSB7CisKKwkJQ3VydmUuY2FsbCggdGhpcyApOworCisJCXRo
aXMuYVggPSBhWDsKKwkJdGhpcy5hWSA9IGFZOworCisJCXRoaXMueFJhZGl1cyA9IHhSYWRpdXM7
CisJCXRoaXMueVJhZGl1cyA9IHlSYWRpdXM7CisKKwkJdGhpcy5hU3RhcnRBbmdsZSA9IGFTdGFy
dEFuZ2xlOworCQl0aGlzLmFFbmRBbmdsZSA9IGFFbmRBbmdsZTsKKworCQl0aGlzLmFDbG9ja3dp
c2UgPSBhQ2xvY2t3aXNlOworCisJCXRoaXMuYVJvdGF0aW9uID0gYVJvdGF0aW9uIHx8IDA7CisK
Kwl9CisKKwlFbGxpcHNlQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJv
dG90eXBlICk7CisJRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVsbGlwc2VD
dXJ2ZTsKKworCUVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmUgPSB0cnVlOwor
CisJRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHsKKwor
CQl2YXIgdHdvUGkgPSBNYXRoLlBJICogMjsKKwkJdmFyIGRlbHRhQW5nbGUgPSB0aGlzLmFFbmRB
bmdsZSAtIHRoaXMuYVN0YXJ0QW5nbGU7CisJCXZhciBzYW1lUG9pbnRzID0gTWF0aC5hYnMoIGRl
bHRhQW5nbGUgKSA8IE51bWJlci5FUFNJTE9OOworCisJCS8vIGVuc3VyZXMgdGhhdCBkZWx0YUFu
Z2xlIGlzIDAgLi4gMiBQSQorCQl3aGlsZSAoIGRlbHRhQW5nbGUgPCAwICkgZGVsdGFBbmdsZSAr
PSB0d29QaTsKKwkJd2hpbGUgKCBkZWx0YUFuZ2xlID4gdHdvUGkgKSBkZWx0YUFuZ2xlIC09IHR3
b1BpOworCisJCWlmICggZGVsdGFBbmdsZSA8IE51bWJlci5FUFNJTE9OICkgeworCisJCQlpZiAo
IHNhbWVQb2ludHMgKSB7CisKKwkJCQlkZWx0YUFuZ2xlID0gMDsKKworCQkJfSBlbHNlIHsKKwor
CQkJCWRlbHRhQW5nbGUgPSB0d29QaTsKKworCQkJfQorCisJCX0KKworCQlpZiAoIHRoaXMuYUNs
b2Nrd2lzZSA9PT0gdHJ1ZSAmJiAhIHNhbWVQb2ludHMgKSB7CisKKwkJCWlmICggZGVsdGFBbmds
ZSA9PT0gdHdvUGkgKSB7CisKKwkJCQlkZWx0YUFuZ2xlID0gLSB0d29QaTsKKworCQkJfSBlbHNl
IHsKKworCQkJCWRlbHRhQW5nbGUgPSBkZWx0YUFuZ2xlIC0gdHdvUGk7CisKKwkJCX0KKworCQl9
CisKKwkJdmFyIGFuZ2xlID0gdGhpcy5hU3RhcnRBbmdsZSArIHQgKiBkZWx0YUFuZ2xlOworCQl2
YXIgeCA9IHRoaXMuYVggKyB0aGlzLnhSYWRpdXMgKiBNYXRoLmNvcyggYW5nbGUgKTsKKwkJdmFy
IHkgPSB0aGlzLmFZICsgdGhpcy55UmFkaXVzICogTWF0aC5zaW4oIGFuZ2xlICk7CisKKwkJaWYg
KCB0aGlzLmFSb3RhdGlvbiAhPT0gMCApIHsKKworCQkJdmFyIGNvcyA9IE1hdGguY29zKCB0aGlz
LmFSb3RhdGlvbiApOworCQkJdmFyIHNpbiA9IE1hdGguc2luKCB0aGlzLmFSb3RhdGlvbiApOwor
CisJCQl2YXIgdHggPSB4IC0gdGhpcy5hWDsKKwkJCXZhciB0eSA9IHkgLSB0aGlzLmFZOworCisJ
CQkvLyBSb3RhdGUgdGhlIHBvaW50IGFib3V0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuCisJ
CQl4ID0gdHggKiBjb3MgLSB0eSAqIHNpbiArIHRoaXMuYVg7CisJCQl5ID0gdHggKiBzaW4gKyB0
eSAqIGNvcyArIHRoaXMuYVk7CisKKwkJfQorCisJCXJldHVybiBuZXcgVmVjdG9yMiggeCwgeSAp
OworCisJfTsKKworCWZ1bmN0aW9uIFNwbGluZUN1cnZlKCBwb2ludHMgLyogYXJyYXkgb2YgVmVj
dG9yMiAqLyApIHsKKworCQlDdXJ2ZS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy5wb2ludHMgPSAo
IHBvaW50cyA9PT0gdW5kZWZpbmVkICkgPyBbXSA6IHBvaW50czsKKworCX0KKworCVNwbGluZUN1
cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApOworCVNwbGlu
ZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwbGluZUN1cnZlOworCisJU3BsaW5lQ3Vy
dmUucHJvdG90eXBlLmlzU3BsaW5lQ3VydmUgPSB0cnVlOworCisJU3BsaW5lQ3VydmUucHJvdG90
eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkgeworCisJCXZhciBwb2ludHMgPSB0aGlzLnBv
aW50czsKKwkJdmFyIHBvaW50ID0gKCBwb2ludHMubGVuZ3RoIC0gMSApICogdDsKKworCQl2YXIg
aW50UG9pbnQgPSBNYXRoLmZsb29yKCBwb2ludCApOworCQl2YXIgd2VpZ2h0ID0gcG9pbnQgLSBp
bnRQb2ludDsKKworCQl2YXIgcG9pbnQwID0gcG9pbnRzWyBpbnRQb2ludCA9PT0gMCA/IGludFBv
aW50IDogaW50UG9pbnQgLSAxIF07CisJCXZhciBwb2ludDEgPSBwb2ludHNbIGludFBvaW50IF07
CisJCXZhciBwb2ludDIgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDIgPyBw
b2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMSBdOworCQl2YXIgcG9pbnQzID0gcG9pbnRz
WyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAzID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQ
b2ludCArIDIgXTsKKworCQlyZXR1cm4gbmV3IFZlY3RvcjIoCisJCQlDYXRtdWxsUm9tKCB3ZWln
aHQsIHBvaW50MC54LCBwb2ludDEueCwgcG9pbnQyLngsIHBvaW50My54ICksCisJCQlDYXRtdWxs
Um9tKCB3ZWlnaHQsIHBvaW50MC55LCBwb2ludDEueSwgcG9pbnQyLnksIHBvaW50My55ICkKKwkJ
KTsKKworCX07CisKKwlmdW5jdGlvbiBDdWJpY0JlemllckN1cnZlKCB2MCwgdjEsIHYyLCB2MyAp
IHsKKworCQlDdXJ2ZS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy52MCA9IHYwOworCQl0aGlzLnYx
ID0gdjE7CisJCXRoaXMudjIgPSB2MjsKKwkJdGhpcy52MyA9IHYzOworCisJfQorCisJQ3ViaWNC
ZXppZXJDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsK
KwlDdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmljQmV6aWVyQ3Vy
dmU7CisKKwlDdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICgg
dCApIHsKKworCQl2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52Miwg
djMgPSB0aGlzLnYzOworCisJCXJldHVybiBuZXcgVmVjdG9yMigKKwkJCUN1YmljQmV6aWVyKCB0
LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksCisJCQlDdWJpY0JlemllciggdCwgdjAueSwgdjEu
eSwgdjIueSwgdjMueSApCisJCSk7CisKKwl9OworCisJZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVy
Q3VydmUoIHYwLCB2MSwgdjIgKSB7CisKKwkJQ3VydmUuY2FsbCggdGhpcyApOworCisJCXRoaXMu
djAgPSB2MDsKKwkJdGhpcy52MSA9IHYxOworCQl0aGlzLnYyID0gdjI7CisKKwl9CisKKwlRdWFk
cmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5
cGUgKTsKKwlRdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFk
cmF0aWNCZXppZXJDdXJ2ZTsKKworCVF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5nZXRQ
b2ludCA9IGZ1bmN0aW9uICggdCApIHsKKworCQl2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMu
djEsIHYyID0gdGhpcy52MjsKKworCQlyZXR1cm4gbmV3IFZlY3RvcjIoCisJCQlRdWFkcmF0aWNC
ZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSwKKwkJCVF1YWRyYXRpY0JlemllciggdCwgdjAu
eSwgdjEueSwgdjIueSApCisJCSk7CisKKwl9OworCisJdmFyIFBhdGhQcm90b3R5cGUgPSBPYmpl
Y3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDdXJ2ZVBhdGgucHJvdG90eXBlICksIHsKKworCQlm
cm9tUG9pbnRzOiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7CisKKwkJCXRoaXMubW92ZVRvKCB2ZWN0
b3JzWyAwIF0ueCwgdmVjdG9yc1sgMCBdLnkgKTsKKworCQkJZm9yICggdmFyIGkgPSAxLCBsID0g
dmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJdGhpcy5saW5lVG8oIHZlY3Rv
cnNbIGkgXS54LCB2ZWN0b3JzWyBpIF0ueSApOworCisJCQl9CisKKwkJfSwKKworCQltb3ZlVG86
IGZ1bmN0aW9uICggeCwgeSApIHsKKworCQkJdGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7
IC8vIFRPRE8gY29uc2lkZXIgcmVmZXJlbmNpbmcgdmVjdG9ycyBpbnN0ZWFkIG9mIGNvcHlpbmc/
CisKKwkJfSwKKworCQlsaW5lVG86IGZ1bmN0aW9uICggeCwgeSApIHsKKworCQkJdmFyIGN1cnZl
ID0gbmV3IExpbmVDdXJ2ZSggdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSwgbmV3IFZlY3RvcjIo
IHgsIHkgKSApOworCQkJdGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTsKKworCQkJdGhpcy5jdXJy
ZW50UG9pbnQuc2V0KCB4LCB5ICk7CisKKwkJfSwKKworCQlxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5j
dGlvbiAoIGFDUHgsIGFDUHksIGFYLCBhWSApIHsKKworCQkJdmFyIGN1cnZlID0gbmV3IFF1YWRy
YXRpY0JlemllckN1cnZlKAorCQkJCXRoaXMuY3VycmVudFBvaW50LmNsb25lKCksCisJCQkJbmV3
IFZlY3RvcjIoIGFDUHgsIGFDUHkgKSwKKwkJCQluZXcgVmVjdG9yMiggYVgsIGFZICkKKwkJCSk7
CisKKwkJCXRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7CisKKwkJCXRoaXMuY3VycmVudFBvaW50
LnNldCggYVgsIGFZICk7CisKKwkJfSwKKworCQliZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFD
UDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7CisKKwkJCXZhciBjdXJ2ZSA9IG5l
dyBDdWJpY0JlemllckN1cnZlKAorCQkJCXRoaXMuY3VycmVudFBvaW50LmNsb25lKCksCisJCQkJ
bmV3IFZlY3RvcjIoIGFDUDF4LCBhQ1AxeSApLAorCQkJCW5ldyBWZWN0b3IyKCBhQ1AyeCwgYUNQ
MnkgKSwKKwkJCQluZXcgVmVjdG9yMiggYVgsIGFZICkKKwkJCSk7CisKKwkJCXRoaXMuY3VydmVz
LnB1c2goIGN1cnZlICk7CisKKwkJCXRoaXMuY3VycmVudFBvaW50LnNldCggYVgsIGFZICk7CisK
KwkJfSwKKworCQlzcGxpbmVUaHJ1OiBmdW5jdGlvbiAoIHB0cyAvKkFycmF5IG9mIFZlY3Rvciov
ICkgeworCisJCQl2YXIgbnB0cyA9IFsgdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSBdLmNvbmNh
dCggcHRzICk7CisKKwkJCXZhciBjdXJ2ZSA9IG5ldyBTcGxpbmVDdXJ2ZSggbnB0cyApOworCQkJ
dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTsKKworCQkJdGhpcy5jdXJyZW50UG9pbnQuY29weSgg
cHRzWyBwdHMubGVuZ3RoIC0gMSBdICk7CisKKwkJfSwKKworCQlhcmM6IGZ1bmN0aW9uICggYVgs
IGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkgeworCisJ
CQl2YXIgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54OworCQkJdmFyIHkwID0gdGhpcy5jdXJyZW50
UG9pbnQueTsKKworCQkJdGhpcy5hYnNhcmMoIGFYICsgeDAsIGFZICsgeTAsIGFSYWRpdXMsCisJ
CQkJYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApOworCisJCX0sCisKKwkJYWJz
YXJjOiBmdW5jdGlvbiAoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwg
YUNsb2Nrd2lzZSApIHsKKworCQkJdGhpcy5hYnNlbGxpcHNlKCBhWCwgYVksIGFSYWRpdXMsIGFS
YWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTsKKworCQl9LAorCisJ
CWVsbGlwc2U6IGZ1bmN0aW9uICggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmds
ZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7CisKKwkJCXZhciB4MCA9IHRo
aXMuY3VycmVudFBvaW50Lng7CisJCQl2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55OworCisJ
CQl0aGlzLmFic2VsbGlwc2UoIGFYICsgeDAsIGFZICsgeTAsIHhSYWRpdXMsIHlSYWRpdXMsIGFT
dGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApOworCisJCX0sCisK
KwkJYWJzZWxsaXBzZTogZnVuY3Rpb24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFy
dEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHsKKworCQkJdmFyIGN1
cnZlID0gbmV3IEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRB
bmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTsKKworCQkJaWYgKCB0aGlz
LmN1cnZlcy5sZW5ndGggPiAwICkgeworCisJCQkJLy8gaWYgYSBwcmV2aW91cyBjdXJ2ZSBpcyBw
cmVzZW50LCBhdHRlbXB0IHRvIGpvaW4KKwkJCQl2YXIgZmlyc3RQb2ludCA9IGN1cnZlLmdldFBv
aW50KCAwICk7CisKKwkJCQlpZiAoICEgZmlyc3RQb2ludC5lcXVhbHMoIHRoaXMuY3VycmVudFBv
aW50ICkgKSB7CisKKwkJCQkJdGhpcy5saW5lVG8oIGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55
ICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJdGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTsKKwor
CQkJdmFyIGxhc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAxICk7CisJCQl0aGlzLmN1cnJlbnRQ
b2ludC5jb3B5KCBsYXN0UG9pbnQgKTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0
aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCisJICogQ3JlYXRl
cyBmcmVlIGZvcm0gMmQgcGF0aCB1c2luZyBzZXJpZXMgb2YgcG9pbnRzLCBsaW5lcyBvciBjdXJ2
ZXMuCisJICoqLworCisJZnVuY3Rpb24gUGF0aCggcG9pbnRzICkgeworCisJCUN1cnZlUGF0aC5j
YWxsKCB0aGlzICk7CisJCXRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTsKKworCQlp
ZiAoIHBvaW50cyApIHsKKworCQkJdGhpcy5mcm9tUG9pbnRzKCBwb2ludHMgKTsKKworCQl9CisK
Kwl9CisKKwlQYXRoLnByb3RvdHlwZSA9IFBhdGhQcm90b3R5cGU7CisJUGF0aFByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IFBhdGg7CisKKwkvKioKKwkgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3
LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCisJICogRGVmaW5lcyBhIDJkIHNoYXBlIHBsYW5lIHVz
aW5nIHBhdGhzLgorCSAqKi8KKworCS8vIFNURVAgMSBDcmVhdGUgYSBwYXRoLgorCS8vIFNURVAg
MiBUdXJuIHBhdGggaW50byBzaGFwZS4KKwkvLyBTVEVQIDMgRXh0cnVkZUdlb21ldHJ5IHRha2Vz
IGluIFNoYXBlL1NoYXBlcworCS8vIFNURVAgM2EgLSBFeHRyYWN0IHBvaW50cyBmcm9tIGVhY2gg
c2hhcGUsIHR1cm4gdG8gdmVydGljZXMKKwkvLyBTVEVQIDNiIC0gVHJpYW5ndWxhdGUgZWFjaCBz
aGFwZSwgYWRkIGZhY2VzLgorCisJZnVuY3Rpb24gU2hhcGUoKSB7CisKKwkJUGF0aC5hcHBseSgg
dGhpcywgYXJndW1lbnRzICk7CisKKwkJdGhpcy5ob2xlcyA9IFtdOworCisJfQorCisJU2hhcGUu
cHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggUGF0aFByb3RvdHlwZSAp
LCB7CisKKwkJY29uc3RydWN0b3I6IFNoYXBlLAorCisJCWdldFBvaW50c0hvbGVzOiBmdW5jdGlv
biAoIGRpdmlzaW9ucyApIHsKKworCQkJdmFyIGhvbGVzUHRzID0gW107CisKKwkJCWZvciAoIHZh
ciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCWhv
bGVzUHRzWyBpIF0gPSB0aGlzLmhvbGVzWyBpIF0uZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKTsKKwor
CQkJfQorCisJCQlyZXR1cm4gaG9sZXNQdHM7CisKKwkJfSwKKworCQkvLyBHZXQgcG9pbnRzIG9m
IHNoYXBlIGFuZCBob2xlcyAoa2V5cG9pbnRzIGJhc2VkIG9uIHNlZ21lbnRzIHBhcmFtZXRlcikK
KworCQlleHRyYWN0QWxsUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKKworCQkJcmV0
dXJuIHsKKworCQkJCXNoYXBlOiB0aGlzLmdldFBvaW50cyggZGl2aXNpb25zICksCisJCQkJaG9s
ZXM6IHRoaXMuZ2V0UG9pbnRzSG9sZXMoIGRpdmlzaW9ucyApCisKKwkJCX07CisKKwkJfSwKKwor
CQlleHRyYWN0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKKworCQkJcmV0dXJuIHRo
aXMuZXh0cmFjdEFsbFBvaW50cyggZGl2aXNpb25zICk7CisKKwkJfQorCisJfSApOworCisJLyoq
CisJICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZwor
CSAqIG1pbmltYWwgY2xhc3MgZm9yIHByb3hpbmcgZnVuY3Rpb25zIHRvIFBhdGguIFJlcGxhY2Vz
IG9sZCAiZXh0cmFjdFN1YnBhdGhzKCkiCisJICoqLworCisJZnVuY3Rpb24gU2hhcGVQYXRoKCkg
eworCisJCXRoaXMuc3ViUGF0aHMgPSBbXTsKKwkJdGhpcy5jdXJyZW50UGF0aCA9IG51bGw7CisK
Kwl9CisKKwlPYmplY3QuYXNzaWduKCBTaGFwZVBhdGgucHJvdG90eXBlLCB7CisKKwkJbW92ZVRv
OiBmdW5jdGlvbiAoIHgsIHkgKSB7CisKKwkJCXRoaXMuY3VycmVudFBhdGggPSBuZXcgUGF0aCgp
OworCQkJdGhpcy5zdWJQYXRocy5wdXNoKCB0aGlzLmN1cnJlbnRQYXRoICk7CisJCQl0aGlzLmN1
cnJlbnRQYXRoLm1vdmVUbyggeCwgeSApOworCisJCX0sCisKKwkJbGluZVRvOiBmdW5jdGlvbiAo
IHgsIHkgKSB7CisKKwkJCXRoaXMuY3VycmVudFBhdGgubGluZVRvKCB4LCB5ICk7CisKKwkJfSwK
KworCQlxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUHgsIGFDUHksIGFYLCBhWSApIHsK
KworCQkJdGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKCBhQ1B4LCBhQ1B5LCBhWCwg
YVkgKTsKKworCQl9LAorCisJCWJlemllckN1cnZlVG86IGZ1bmN0aW9uICggYUNQMXgsIGFDUDF5
LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHsKKworCQkJdGhpcy5jdXJyZW50UGF0aC5iZXppZXJD
dXJ2ZVRvKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICk7CisKKwkJfSwKKwor
CQlzcGxpbmVUaHJ1OiBmdW5jdGlvbiAoIHB0cyApIHsKKworCQkJdGhpcy5jdXJyZW50UGF0aC5z
cGxpbmVUaHJ1KCBwdHMgKTsKKworCQl9LAorCisJCXRvU2hhcGVzOiBmdW5jdGlvbiAoIGlzQ0NX
LCBub0hvbGVzICkgeworCisJCQlmdW5jdGlvbiB0b1NoYXBlc05vSG9sZXMoIGluU3VicGF0aHMg
KSB7CisKKwkJCQl2YXIgc2hhcGVzID0gW107CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBp
blN1YnBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJdmFyIHRtcFBhdGggPSBp
blN1YnBhdGhzWyBpIF07CisKKwkJCQkJdmFyIHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7CisJCQkJ
CXRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzOworCisJCQkJCXNoYXBlcy5wdXNoKCB0
bXBTaGFwZSApOworCisJCQkJfQorCisJCQkJcmV0dXJuIHNoYXBlczsKKworCQkJfQorCisJCQlm
dW5jdGlvbiBpc1BvaW50SW5zaWRlUG9seWdvbiggaW5QdCwgaW5Qb2x5Z29uICkgeworCisJCQkJ
dmFyIHBvbHlMZW4gPSBpblBvbHlnb24ubGVuZ3RoOworCisJCQkJLy8gaW5QdCBvbiBwb2x5Z29u
IGNvbnRvdXIgPT4gaW1tZWRpYXRlIHN1Y2Nlc3MgICAgb3IKKwkJCQkvLyB0b2dnbGluZyBvZiBp
bnNpZGUvb3V0c2lkZSBhdCBldmVyeSBzaW5nbGUhIGludGVyc2VjdGlvbiBwb2ludCBvZiBhbiBl
ZGdlCisJCQkJLy8gIHdpdGggdGhlIGhvcml6b250YWwgbGluZSB0aHJvdWdoIGluUHQsIGxlZnQg
b2YgaW5QdAorCQkJCS8vICBub3QgY291bnRpbmcgbG93ZXJZIGVuZHBvaW50cyBvZiBlZGdlcyBh
bmQgd2hvbGUgZWRnZXMgb24gdGhhdCBsaW5lCisJCQkJdmFyIGluc2lkZSA9IGZhbHNlOworCQkJ
CWZvciAoIHZhciBwID0gcG9seUxlbiAtIDEsIHEgPSAwOyBxIDwgcG9seUxlbjsgcCA9IHEgKysg
KSB7CisKKwkJCQkJdmFyIGVkZ2VMb3dQdCAgPSBpblBvbHlnb25bIHAgXTsKKwkJCQkJdmFyIGVk
Z2VIaWdoUHQgPSBpblBvbHlnb25bIHEgXTsKKworCQkJCQl2YXIgZWRnZUR4ID0gZWRnZUhpZ2hQ
dC54IC0gZWRnZUxvd1B0Lng7CisJCQkJCXZhciBlZGdlRHkgPSBlZGdlSGlnaFB0LnkgLSBlZGdl
TG93UHQueTsKKworCQkJCQlpZiAoIE1hdGguYWJzKCBlZGdlRHkgKSA+IE51bWJlci5FUFNJTE9O
ICkgeworCisJCQkJCQkvLyBub3QgcGFyYWxsZWwKKwkJCQkJCWlmICggZWRnZUR5IDwgMCApIHsK
KworCQkJCQkJCWVkZ2VMb3dQdCAgPSBpblBvbHlnb25bIHEgXTsgZWRnZUR4ID0gLSBlZGdlRHg7
CisJCQkJCQkJZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcCBdOyBlZGdlRHkgPSAtIGVkZ2VEeTsK
KworCQkJCQkJfQorCQkJCQkJaWYgKCAoIGluUHQueSA8IGVkZ2VMb3dQdC55ICkgfHwgKCBpblB0
LnkgPiBlZGdlSGlnaFB0LnkgKSApIAkJY29udGludWU7CisKKwkJCQkJCWlmICggaW5QdC55ID09
PSBlZGdlTG93UHQueSApIHsKKworCQkJCQkJCWlmICggaW5QdC54ID09PSBlZGdlTG93UHQueCAp
CQlyZXR1cm4JdHJ1ZTsJCS8vIGluUHQgaXMgb24gY29udG91ciA/CisJCQkJCQkJLy8gY29udGlu
dWU7CQkJCS8vIG5vIGludGVyc2VjdGlvbiBvciBlZGdlTG93UHQgPT4gZG9lc24ndCBjb3VudCAh
ISEKKworCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCXZhciBwZXJwRWRnZSA9IGVkZ2VEeSAqICgg
aW5QdC54IC0gZWRnZUxvd1B0LnggKSAtIGVkZ2VEeCAqICggaW5QdC55IC0gZWRnZUxvd1B0Lnkg
KTsKKwkJCQkJCQlpZiAoIHBlcnBFZGdlID09PSAwICkJCQkJcmV0dXJuCXRydWU7CQkvLyBpblB0
IGlzIG9uIGNvbnRvdXIgPworCQkJCQkJCWlmICggcGVycEVkZ2UgPCAwICkgCQkJCWNvbnRpbnVl
OworCQkJCQkJCWluc2lkZSA9ICEgaW5zaWRlOwkJLy8gdHJ1ZSBpbnRlcnNlY3Rpb24gbGVmdCBv
ZiBpblB0CisKKwkJCQkJCX0KKworCQkJCQl9IGVsc2UgeworCisJCQkJCQkvLyBwYXJhbGxlbCBv
ciBjb2xsaW5lYXIKKwkJCQkJCWlmICggaW5QdC55ICE9PSBlZGdlTG93UHQueSApIAkJY29udGlu
dWU7CQkJLy8gcGFyYWxsZWwKKwkJCQkJCS8vIGVkZ2UgbGllcyBvbiB0aGUgc2FtZSBob3Jpem9u
dGFsIGxpbmUgYXMgaW5QdAorCQkJCQkJaWYgKCAoICggZWRnZUhpZ2hQdC54IDw9IGluUHQueCAp
ICYmICggaW5QdC54IDw9IGVkZ2VMb3dQdC54ICkgKSB8fAorCQkJCQkJCSAoICggZWRnZUxvd1B0
LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUhpZ2hQdC54ICkgKSApCQlyZXR1cm4J
dHJ1ZTsJLy8gaW5QdDogUG9pbnQgb24gY29udG91ciAhCisJCQkJCQkvLyBjb250aW51ZTsKKwor
CQkJCQl9CisKKwkJCQl9CisKKwkJCQlyZXR1cm4JaW5zaWRlOworCisJCQl9CisKKwkJCXZhciBp
c0Nsb2NrV2lzZSA9IFNoYXBlVXRpbHMuaXNDbG9ja1dpc2U7CisKKwkJCXZhciBzdWJQYXRocyA9
IHRoaXMuc3ViUGF0aHM7CisJCQlpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBb
XTsKKworCQkJaWYgKCBub0hvbGVzID09PSB0cnVlICkJcmV0dXJuCXRvU2hhcGVzTm9Ib2xlcygg
c3ViUGF0aHMgKTsKKworCisJCQl2YXIgc29saWQsIHRtcFBhdGgsIHRtcFNoYXBlLCBzaGFwZXMg
PSBbXTsKKworCQkJaWYgKCBzdWJQYXRocy5sZW5ndGggPT09IDEgKSB7CisKKwkJCQl0bXBQYXRo
ID0gc3ViUGF0aHNbIDAgXTsKKwkJCQl0bXBTaGFwZSA9IG5ldyBTaGFwZSgpOworCQkJCXRtcFNo
YXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzOworCQkJCXNoYXBlcy5wdXNoKCB0bXBTaGFwZSAp
OworCQkJCXJldHVybiBzaGFwZXM7CisKKwkJCX0KKworCQkJdmFyIGhvbGVzRmlyc3QgPSAhIGlz
Q2xvY2tXaXNlKCBzdWJQYXRoc1sgMCBdLmdldFBvaW50cygpICk7CisJCQlob2xlc0ZpcnN0ID0g
aXNDQ1cgPyAhIGhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0OworCisJCQkvLyBjb25zb2xlLmxvZygi
SG9sZXMgZmlyc3QiLCBob2xlc0ZpcnN0KTsKKworCQkJdmFyIGJldHRlclNoYXBlSG9sZXMgPSBb
XTsKKwkJCXZhciBuZXdTaGFwZXMgPSBbXTsKKwkJCXZhciBuZXdTaGFwZUhvbGVzID0gW107CisJ
CQl2YXIgbWFpbklkeCA9IDA7CisJCQl2YXIgdG1wUG9pbnRzOworCisJCQluZXdTaGFwZXNbIG1h
aW5JZHggXSA9IHVuZGVmaW5lZDsKKwkJCW5ld1NoYXBlSG9sZXNbIG1haW5JZHggXSA9IFtdOwor
CisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBzdWJQYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkg
eworCisJCQkJdG1wUGF0aCA9IHN1YlBhdGhzWyBpIF07CisJCQkJdG1wUG9pbnRzID0gdG1wUGF0
aC5nZXRQb2ludHMoKTsKKwkJCQlzb2xpZCA9IGlzQ2xvY2tXaXNlKCB0bXBQb2ludHMgKTsKKwkJ
CQlzb2xpZCA9IGlzQ0NXID8gISBzb2xpZCA6IHNvbGlkOworCisJCQkJaWYgKCBzb2xpZCApIHsK
KworCQkJCQlpZiAoICggISBob2xlc0ZpcnN0ICkgJiYgKCBuZXdTaGFwZXNbIG1haW5JZHggXSAp
ICkJbWFpbklkeCArKzsKKworCQkJCQluZXdTaGFwZXNbIG1haW5JZHggXSA9IHsgczogbmV3IFNo
YXBlKCksIHA6IHRtcFBvaW50cyB9OworCQkJCQluZXdTaGFwZXNbIG1haW5JZHggXS5zLmN1cnZl
cyA9IHRtcFBhdGguY3VydmVzOworCisJCQkJCWlmICggaG9sZXNGaXJzdCApCW1haW5JZHggKys7
CisJCQkJCW5ld1NoYXBlSG9sZXNbIG1haW5JZHggXSA9IFtdOworCisJCQkJCS8vY29uc29sZS5s
b2coJ2N3JywgaSk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCW5ld1NoYXBlSG9sZXNbIG1haW5J
ZHggXS5wdXNoKCB7IGg6IHRtcFBhdGgsIHA6IHRtcFBvaW50c1sgMCBdIH0gKTsKKworCQkJCQkv
L2NvbnNvbGUubG9nKCdjY3cnLCBpKTsKKworCQkJCX0KKworCQkJfQorCisJCQkvLyBvbmx5IEhv
bGVzPyAtPiBwcm9iYWJseSBhbGwgU2hhcGVzIHdpdGggd3Jvbmcgb3JpZW50YXRpb24KKwkJCWlm
ICggISBuZXdTaGFwZXNbIDAgXSApCXJldHVybgl0b1NoYXBlc05vSG9sZXMoIHN1YlBhdGhzICk7
CisKKworCQkJaWYgKCBuZXdTaGFwZXMubGVuZ3RoID4gMSApIHsKKworCQkJCXZhciBhbWJpZ3Vv
dXMgPSBmYWxzZTsKKwkJCQl2YXIgdG9DaGFuZ2UgPSBbXTsKKworCQkJCWZvciAoIHZhciBzSWR4
ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkgewor
CisJCQkJCWJldHRlclNoYXBlSG9sZXNbIHNJZHggXSA9IFtdOworCisJCQkJfQorCisJCQkJZm9y
ICggdmFyIHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJ
ZHggKysgKSB7CisKKwkJCQkJdmFyIHNobyA9IG5ld1NoYXBlSG9sZXNbIHNJZHggXTsKKworCQkJ
CQlmb3IgKCB2YXIgaElkeCA9IDA7IGhJZHggPCBzaG8ubGVuZ3RoOyBoSWR4ICsrICkgeworCisJ
CQkJCQl2YXIgaG8gPSBzaG9bIGhJZHggXTsKKwkJCQkJCXZhciBob2xlX3VuYXNzaWduZWQgPSB0
cnVlOworCisJCQkJCQlmb3IgKCB2YXIgczJJZHggPSAwOyBzMklkeCA8IG5ld1NoYXBlcy5sZW5n
dGg7IHMySWR4ICsrICkgeworCisJCQkJCQkJaWYgKCBpc1BvaW50SW5zaWRlUG9seWdvbiggaG8u
cCwgbmV3U2hhcGVzWyBzMklkeCBdLnAgKSApIHsKKworCQkJCQkJCQlpZiAoIHNJZHggIT09IHMy
SWR4ICkJdG9DaGFuZ2UucHVzaCggeyBmcm9tczogc0lkeCwgdG9zOiBzMklkeCwgaG9sZTogaElk
eCB9ICk7CisJCQkJCQkJCWlmICggaG9sZV91bmFzc2lnbmVkICkgeworCisJCQkJCQkJCQlob2xl
X3VuYXNzaWduZWQgPSBmYWxzZTsKKwkJCQkJCQkJCWJldHRlclNoYXBlSG9sZXNbIHMySWR4IF0u
cHVzaCggaG8gKTsKKworCQkJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJCQlhbWJpZ3VvdXMgPSB0
cnVlOworCisJCQkJCQkJCX0KKworCQkJCQkJCX0KKworCQkJCQkJfQorCQkJCQkJaWYgKCBob2xl
X3VuYXNzaWduZWQgKSB7CisKKwkJCQkJCQliZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0ucHVzaCgg
aG8gKTsKKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCX0KKwkJCQkvLyBjb25zb2xlLmxvZygi
YW1iaWd1b3VzOiAiLCBhbWJpZ3VvdXMpOworCQkJCWlmICggdG9DaGFuZ2UubGVuZ3RoID4gMCAp
IHsKKworCQkJCQkvLyBjb25zb2xlLmxvZygidG8gY2hhbmdlOiAiLCB0b0NoYW5nZSk7CisJCQkJ
CWlmICggISBhbWJpZ3VvdXMgKQluZXdTaGFwZUhvbGVzID0gYmV0dGVyU2hhcGVIb2xlczsKKwor
CQkJCX0KKworCQkJfQorCisJCQl2YXIgdG1wSG9sZXM7CisKKwkJCWZvciAoIHZhciBpID0gMCwg
aWwgPSBuZXdTaGFwZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQl0bXBTaGFwZSA9
IG5ld1NoYXBlc1sgaSBdLnM7CisJCQkJc2hhcGVzLnB1c2goIHRtcFNoYXBlICk7CisJCQkJdG1w
SG9sZXMgPSBuZXdTaGFwZUhvbGVzWyBpIF07CisKKwkJCQlmb3IgKCB2YXIgaiA9IDAsIGpsID0g
dG1wSG9sZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CisKKwkJCQkJdG1wU2hhcGUuaG9sZXMu
cHVzaCggdG1wSG9sZXNbIGogXS5oICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy9jb25zb2xl
LmxvZygic2hhcGUiLCBzaGFwZXMpOworCisJCQlyZXR1cm4gc2hhcGVzOworCisJCX0KKworCX0g
KTsKKworCS8qKgorCSAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96
ejg1L2Jsb2cKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLwor
CisJZnVuY3Rpb24gRm9udCggZGF0YSApIHsKKworCQl0aGlzLmRhdGEgPSBkYXRhOworCisJfQor
CisJT2JqZWN0LmFzc2lnbiggRm9udC5wcm90b3R5cGUsIHsKKworCQlpc0ZvbnQ6IHRydWUsCisK
KwkJZ2VuZXJhdGVTaGFwZXM6IGZ1bmN0aW9uICggdGV4dCwgc2l6ZSwgZGl2aXNpb25zICkgewor
CisJCQlmdW5jdGlvbiBjcmVhdGVQYXRocyggdGV4dCApIHsKKworCQkJCXZhciBjaGFycyA9IFN0
cmluZyggdGV4dCApLnNwbGl0KCAnJyApOworCQkJCXZhciBzY2FsZSA9IHNpemUgLyBkYXRhLnJl
c29sdXRpb247CisJCQkJdmFyIGxpbmVfaGVpZ2h0ID0gKCBkYXRhLmJvdW5kaW5nQm94LnlNYXgg
LSBkYXRhLmJvdW5kaW5nQm94LnlNaW4gKyBkYXRhLnVuZGVybGluZVRoaWNrbmVzcyApICogc2Nh
bGU7CisKKwkJCQl2YXIgb2Zmc2V0WCA9IDAsIG9mZnNldFkgPSAwOworCisJCQkJdmFyIHBhdGhz
ID0gW107CisKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkgKysgKSB7
CisKKwkJCQkJdmFyIGNoYXIgPSBjaGFyc1sgaSBdOworCisJCQkJCWlmICggY2hhciA9PT0gJ1xu
JyApIHsKKworCQkJCQkJb2Zmc2V0WCA9IDA7CisJCQkJCQlvZmZzZXRZIC09IGxpbmVfaGVpZ2h0
OworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCXZhciByZXQgPSBjcmVhdGVQYXRoKCBjaGFyLCBz
Y2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSApOworCQkJCQkJb2Zmc2V0WCArPSByZXQub2Zmc2V0WDsK
KwkJCQkJCXBhdGhzLnB1c2goIHJldC5wYXRoICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJ
cmV0dXJuIHBhdGhzOworCisJCQl9CisKKwkJCWZ1bmN0aW9uIGNyZWF0ZVBhdGgoIGMsIHNjYWxl
LCBvZmZzZXRYLCBvZmZzZXRZICkgeworCisJCQkJdmFyIGdseXBoID0gZGF0YS5nbHlwaHNbIGMg
XSB8fCBkYXRhLmdseXBoc1sgJz8nIF07CisKKwkJCQlpZiAoICEgZ2x5cGggKSByZXR1cm47CisK
KwkJCQl2YXIgcGF0aCA9IG5ldyBTaGFwZVBhdGgoKTsKKworCQkJCXZhciBwdHMgPSBbXTsKKwkJ
CQl2YXIgeCwgeSwgY3B4LCBjcHksIGNweDAsIGNweTAsIGNweDEsIGNweTEsIGNweDIsIGNweTIs
IGxhc3RlOworCisJCQkJaWYgKCBnbHlwaC5vICkgeworCisJCQkJCXZhciBvdXRsaW5lID0gZ2x5
cGguX2NhY2hlZE91dGxpbmUgfHwgKCBnbHlwaC5fY2FjaGVkT3V0bGluZSA9IGdseXBoLm8uc3Bs
aXQoICcgJyApICk7CisKKwkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gb3V0bGluZS5sZW5ndGg7
IGkgPCBsOyApIHsKKworCQkJCQkJdmFyIGFjdGlvbiA9IG91dGxpbmVbIGkgKysgXTsKKworCQkJ
CQkJc3dpdGNoICggYWN0aW9uICkgeworCisJCQkJCQkJY2FzZSAnbSc6IC8vIG1vdmVUbworCisJ
CQkJCQkJCXggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CisJCQkJCQkJCXkg
PSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CisKKwkJCQkJCQkJcGF0aC5tb3Zl
VG8oIHgsIHkgKTsKKworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgJ2wnOiAvLyBsaW5l
VG8KKworCQkJCQkJCQl4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYOworCQkJ
CQkJCQl5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZOworCisJCQkJCQkJCXBh
dGgubGluZVRvKCB4LCB5ICk7CisKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlICdxJzog
Ly8gcXVhZHJhdGljQ3VydmVUbworCisJCQkJCQkJCWNweCAgPSBvdXRsaW5lWyBpICsrIF0gKiBz
Y2FsZSArIG9mZnNldFg7CisJCQkJCQkJCWNweSAgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSAr
IG9mZnNldFk7CisJCQkJCQkJCWNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNl
dFg7CisJCQkJCQkJCWNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CisK
KwkJCQkJCQkJcGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKCBjcHgxLCBjcHkxLCBjcHgsIGNweSApOwor
CisJCQkJCQkJCWxhc3RlID0gcHRzWyBwdHMubGVuZ3RoIC0gMSBdOworCisJCQkJCQkJCWlmICgg
bGFzdGUgKSB7CisKKwkJCQkJCQkJCWNweDAgPSBsYXN0ZS54OworCQkJCQkJCQkJY3B5MCA9IGxh
c3RlLnk7CisKKwkJCQkJCQkJCWZvciAoIHZhciBpMiA9IDE7IGkyIDw9IGRpdmlzaW9uczsgaTIg
KysgKSB7CisKKwkJCQkJCQkJCQl2YXIgdCA9IGkyIC8gZGl2aXNpb25zOworCQkJCQkJCQkJCVF1
YWRyYXRpY0JlemllciggdCwgY3B4MCwgY3B4MSwgY3B4ICk7CisJCQkJCQkJCQkJUXVhZHJhdGlj
QmV6aWVyKCB0LCBjcHkwLCBjcHkxLCBjcHkgKTsKKworCQkJCQkJCQkJfQorCisJCQkJCQkJCX0K
KworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgJ2InOiAvLyBiZXppZXJDdXJ2ZVRvCisK
KwkJCQkJCQkJY3B4ICA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDsKKwkJCQkJ
CQkJY3B5ICA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTsKKwkJCQkJCQkJY3B4
MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDsKKwkJCQkJCQkJY3B5MSA9IG91
dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTsKKwkJCQkJCQkJY3B4MiA9IG91dGxpbmVb
IGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDsKKwkJCQkJCQkJY3B5MiA9IG91dGxpbmVbIGkgKysg
XSAqIHNjYWxlICsgb2Zmc2V0WTsKKworCQkJCQkJCQlwYXRoLmJlemllckN1cnZlVG8oIGNweDEs
IGNweTEsIGNweDIsIGNweTIsIGNweCwgY3B5ICk7CisKKwkJCQkJCQkJbGFzdGUgPSBwdHNbIHB0
cy5sZW5ndGggLSAxIF07CisKKwkJCQkJCQkJaWYgKCBsYXN0ZSApIHsKKworCQkJCQkJCQkJY3B4
MCA9IGxhc3RlLng7CisJCQkJCQkJCQljcHkwID0gbGFzdGUueTsKKworCQkJCQkJCQkJZm9yICgg
dmFyIGkyID0gMTsgaTIgPD0gZGl2aXNpb25zOyBpMiArKyApIHsKKworCQkJCQkJCQkJCXZhciB0
ID0gaTIgLyBkaXZpc2lvbnM7CisJCQkJCQkJCQkJQ3ViaWNCZXppZXIoIHQsIGNweDAsIGNweDEs
IGNweDIsIGNweCApOworCQkJCQkJCQkJCUN1YmljQmV6aWVyKCB0LCBjcHkwLCBjcHkxLCBjcHky
LCBjcHkgKTsKKworCQkJCQkJCQkJfQorCisJCQkJCQkJCX0KKworCQkJCQkJCQlicmVhazsKKwor
CQkJCQkJfQorCisJCQkJCX0KKworCQkJCX0KKworCQkJCXJldHVybiB7IG9mZnNldFg6IGdseXBo
LmhhICogc2NhbGUsIHBhdGg6IHBhdGggfTsKKworCQkJfQorCisJCQkvLworCisJCQlpZiAoIHNp
emUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxMDA7CisJCQlpZiAoIGRpdmlzaW9ucyA9PT0gdW5k
ZWZpbmVkICkgZGl2aXNpb25zID0gNDsKKworCQkJdmFyIGRhdGEgPSB0aGlzLmRhdGE7CisKKwkJ
CXZhciBwYXRocyA9IGNyZWF0ZVBhdGhzKCB0ZXh0ICk7CisJCQl2YXIgc2hhcGVzID0gW107CisK
KwkJCWZvciAoIHZhciBwID0gMCwgcGwgPSBwYXRocy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHsK
KworCQkJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCBzaGFwZXMsIHBhdGhzWyBwIF0udG9T
aGFwZXMoKSApOworCisJCQl9CisKKwkJCXJldHVybiBzaGFwZXM7CisKKwkJfQorCisJfSApOwor
CisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKwor
CWZ1bmN0aW9uIEZvbnRMb2FkZXIoIG1hbmFnZXIgKSB7CisKKwkJdGhpcy5tYW5hZ2VyID0gKCBt
YW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7
CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBGb250TG9hZGVyLnByb3RvdHlwZSwgeworCisJCWxv
YWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CisKKwkJ
CXZhciBzY29wZSA9IHRoaXM7CisKKwkJCXZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhp
cy5tYW5hZ2VyICk7CisJCQlsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7CisK
KwkJCQl2YXIganNvbjsKKworCQkJCXRyeSB7CisKKwkJCQkJanNvbiA9IEpTT04ucGFyc2UoIHRl
eHQgKTsKKworCQkJCX0gY2F0Y2ggKCBlICkgeworCisJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVF
LkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNl
IHR5cGVmYWNlLmpzb24gaW5zdGVhZC4nICk7CisJCQkJCWpzb24gPSBKU09OLnBhcnNlKCB0ZXh0
LnN1YnN0cmluZyggNjUsIHRleHQubGVuZ3RoIC0gMiApICk7CisKKwkJCQl9CisKKwkJCQl2YXIg
Zm9udCA9IHNjb3BlLnBhcnNlKCBqc29uICk7CisKKwkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCgg
Zm9udCApOworCisJCQl9LCBvblByb2dyZXNzLCBvbkVycm9yICk7CisKKwkJfSwKKworCQlwYXJz
ZTogZnVuY3Rpb24gKCBqc29uICkgeworCisJCQlyZXR1cm4gbmV3IEZvbnQoIGpzb24gKTsKKwor
CQl9CisKKwl9ICk7CisKKwl2YXIgY29udGV4dDsKKworCXZhciBBdWRpb0NvbnRleHQgPSB7CisK
KwkJZ2V0Q29udGV4dDogZnVuY3Rpb24gKCkgeworCisJCQlpZiAoIGNvbnRleHQgPT09IHVuZGVm
aW5lZCApIHsKKworCQkJCWNvbnRleHQgPSBuZXcgKCB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdp
bmRvdy53ZWJraXRBdWRpb0NvbnRleHQgKSgpOworCisJCQl9CisKKwkJCXJldHVybiBjb250ZXh0
OworCisJCX0sCisKKwkJc2V0Q29udGV4dDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJY29u
dGV4dCA9IHZhbHVlOworCisJCX0KKworCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIFJlZWNlIEFh
cm9uIExlY3JpdmFpbiAvIGh0dHA6Ly9yZWVjZW5vdGVzLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9u
IEF1ZGlvTG9hZGVyKCBtYW5hZ2VyICkgeworCisJCXRoaXMubWFuYWdlciA9ICggbWFuYWdlciAh
PT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyOworCisJfQor
CisJT2JqZWN0LmFzc2lnbiggQXVkaW9Mb2FkZXIucHJvdG90eXBlLCB7CisKKwkJbG9hZDogZnVu
Y3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKKworCQkJdmFyIGxv
YWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTsKKwkJCWxvYWRlci5zZXRSZXNw
b25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTsKKwkJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9u
ICggYnVmZmVyICkgeworCisJCQkJdmFyIGNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4
dCgpOworCisJCQkJY29udGV4dC5kZWNvZGVBdWRpb0RhdGEoIGJ1ZmZlciwgZnVuY3Rpb24gKCBh
dWRpb0J1ZmZlciApIHsKKworCQkJCQlvbkxvYWQoIGF1ZGlvQnVmZmVyICk7CisKKwkJCQl9ICk7
CisKKwkJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKKworCQl9CisKKwl9ICk7CisKKwkvKioK
KwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rp
b24gU3RlcmVvQ2FtZXJhKCkgeworCisJCXRoaXMudHlwZSA9ICdTdGVyZW9DYW1lcmEnOworCisJ
CXRoaXMuYXNwZWN0ID0gMTsKKworCQl0aGlzLmV5ZVNlcCA9IDAuMDY0OworCisJCXRoaXMuY2Ft
ZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpOworCQl0aGlzLmNhbWVyYUwubGF5ZXJzLmVu
YWJsZSggMSApOworCQl0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworCisJ
CXRoaXMuY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpOworCQl0aGlzLmNhbWVyYVIu
bGF5ZXJzLmVuYWJsZSggMiApOworCQl0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZSA9IGZh
bHNlOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggU3RlcmVvQ2FtZXJhLnByb3RvdHlwZSwgewor
CisJCXVwZGF0ZTogKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBpbnN0YW5jZSwgZm9jdXMsIGZv
diwgYXNwZWN0LCBuZWFyLCBmYXIsIHpvb20sIGV5ZVNlcDsKKworCQkJdmFyIGV5ZVJpZ2h0ID0g
bmV3IE1hdHJpeDQoKTsKKwkJCXZhciBleWVMZWZ0ID0gbmV3IE1hdHJpeDQoKTsKKworCQkJcmV0
dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkgeworCisJCQkJdmFyIG5lZWRzVXBkYXRlID0g
aW5zdGFuY2UgIT09IHRoaXMgfHwgZm9jdXMgIT09IGNhbWVyYS5mb2N1cyB8fCBmb3YgIT09IGNh
bWVyYS5mb3YgfHwKKwkJCQkJCQkJCQkJCQlhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgKiB0aGlz
LmFzcGVjdCB8fCBuZWFyICE9PSBjYW1lcmEubmVhciB8fAorCQkJCQkJCQkJCQkJCWZhciAhPT0g
Y2FtZXJhLmZhciB8fCB6b29tICE9PSBjYW1lcmEuem9vbSB8fCBleWVTZXAgIT09IHRoaXMuZXll
U2VwOworCisJCQkJaWYgKCBuZWVkc1VwZGF0ZSApIHsKKworCQkJCQlpbnN0YW5jZSA9IHRoaXM7
CisJCQkJCWZvY3VzID0gY2FtZXJhLmZvY3VzOworCQkJCQlmb3YgPSBjYW1lcmEuZm92OworCQkJ
CQlhc3BlY3QgPSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3Q7CisJCQkJCW5lYXIgPSBjYW1l
cmEubmVhcjsKKwkJCQkJZmFyID0gY2FtZXJhLmZhcjsKKwkJCQkJem9vbSA9IGNhbWVyYS56b29t
OworCisJCQkJCS8vIE9mZi1heGlzIHN0ZXJlb3Njb3BpYyBlZmZlY3QgYmFzZWQgb24KKwkJCQkJ
Ly8gaHR0cDovL3BhdWxib3Vya2UubmV0L3N0ZXJlb2dyYXBoaWNzL3N0ZXJlb3JlbmRlci8KKwor
CQkJCQl2YXIgcHJvamVjdGlvbk1hdHJpeCA9IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNsb25l
KCk7CisJCQkJCWV5ZVNlcCA9IHRoaXMuZXllU2VwIC8gMjsKKwkJCQkJdmFyIGV5ZVNlcE9uUHJv
amVjdGlvbiA9IGV5ZVNlcCAqIG5lYXIgLyBmb2N1czsKKwkJCQkJdmFyIHltYXggPSAoIG5lYXIg
KiBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIGZvdiAqIDAuNSApICkgLyB6b29tOworCQkJCQl2
YXIgeG1pbiwgeG1heDsKKworCQkJCQkvLyB0cmFuc2xhdGUgeE9mZnNldAorCisJCQkJCWV5ZUxl
ZnQuZWxlbWVudHNbIDEyIF0gPSAtIGV5ZVNlcDsKKwkJCQkJZXllUmlnaHQuZWxlbWVudHNbIDEy
IF0gPSBleWVTZXA7CisKKwkJCQkJLy8gZm9yIGxlZnQgZXllCisKKwkJCQkJeG1pbiA9IC0geW1h
eCAqIGFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjsKKwkJCQkJeG1heCA9IHltYXggKiBhc3Bl
Y3QgKyBleWVTZXBPblByb2plY3Rpb247CisKKwkJCQkJcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50
c1sgMCBdID0gMiAqIG5lYXIgLyAoIHhtYXggLSB4bWluICk7CisJCQkJCXByb2plY3Rpb25NYXRy
aXguZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTsKKwor
CQkJCQl0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBwcm9qZWN0aW9uTWF0cml4
ICk7CisKKwkJCQkJLy8gZm9yIHJpZ2h0IGV5ZQorCisJCQkJCXhtaW4gPSAtIHltYXggKiBhc3Bl
Y3QgLSBleWVTZXBPblByb2plY3Rpb247CisJCQkJCXhtYXggPSB5bWF4ICogYXNwZWN0IC0gZXll
U2VwT25Qcm9qZWN0aW9uOworCisJCQkJCXByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9
IDIgKiBuZWFyIC8gKCB4bWF4IC0geG1pbiApOworCQkJCQlwcm9qZWN0aW9uTWF0cml4LmVsZW1l
bnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7CisKKwkJCQkJdGhp
cy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApOworCisJ
CQkJfQorCisJCQkJdGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhX
b3JsZCApLm11bHRpcGx5KCBleWVMZWZ0ICk7CisJCQkJdGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxk
LmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBleWVSaWdodCApOworCisJCQl9
OworCisJCX0gKSgpCisKKwl9ICk7CisKKwkvKioKKwkgKiBDYW1lcmEgZm9yIHJlbmRlcmluZyBj
dWJlIG1hcHMKKwkgKgktIHJlbmRlcnMgc2NlbmUgaW50byBheGlzLWFsaWduZWQgY3ViZQorCSAq
CisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKi8K
KworCWZ1bmN0aW9uIEN1YmVDYW1lcmEoIG5lYXIsIGZhciwgY3ViZVJlc29sdXRpb24gKSB7CisK
KwkJT2JqZWN0M0QuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdDdWJlQ2FtZXJhJzsK
KworCQl2YXIgZm92ID0gOTAsIGFzcGVjdCA9IDE7CisKKwkJdmFyIGNhbWVyYVBYID0gbmV3IFBl
cnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CisJCWNhbWVyYVBYLnVw
LnNldCggMCwgLSAxLCAwICk7CisJCWNhbWVyYVBYLmxvb2tBdCggbmV3IFZlY3RvcjMoIDEsIDAs
IDAgKSApOworCQl0aGlzLmFkZCggY2FtZXJhUFggKTsKKworCQl2YXIgY2FtZXJhTlggPSBuZXcg
UGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTsKKwkJY2FtZXJhTlgu
dXAuc2V0KCAwLCAtIDEsIDAgKTsKKwkJY2FtZXJhTlgubG9va0F0KCBuZXcgVmVjdG9yMyggLSAx
LCAwLCAwICkgKTsKKwkJdGhpcy5hZGQoIGNhbWVyYU5YICk7CisKKwkJdmFyIGNhbWVyYVBZID0g
bmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CisJCWNhbWVy
YVBZLnVwLnNldCggMCwgMCwgMSApOworCQljYW1lcmFQWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAw
LCAxLCAwICkgKTsKKwkJdGhpcy5hZGQoIGNhbWVyYVBZICk7CisKKwkJdmFyIGNhbWVyYU5ZID0g
bmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CisJCWNhbWVy
YU5ZLnVwLnNldCggMCwgMCwgLSAxICk7CisJCWNhbWVyYU5ZLmxvb2tBdCggbmV3IFZlY3RvcjMo
IDAsIC0gMSwgMCApICk7CisJCXRoaXMuYWRkKCBjYW1lcmFOWSApOworCisJCXZhciBjYW1lcmFQ
WiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApOworCQlj
YW1lcmFQWi51cC5zZXQoIDAsIC0gMSwgMCApOworCQljYW1lcmFQWi5sb29rQXQoIG5ldyBWZWN0
b3IzKCAwLCAwLCAxICkgKTsKKwkJdGhpcy5hZGQoIGNhbWVyYVBaICk7CisKKwkJdmFyIGNhbWVy
YU5aID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CisJ
CWNhbWVyYU5aLnVwLnNldCggMCwgLSAxLCAwICk7CisJCWNhbWVyYU5aLmxvb2tBdCggbmV3IFZl
Y3RvcjMoIDAsIDAsIC0gMSApICk7CisJCXRoaXMuYWRkKCBjYW1lcmFOWiApOworCisJCXZhciBv
cHRpb25zID0geyBmb3JtYXQ6IFJHQkZvcm1hdCwgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsIG1p
bkZpbHRlcjogTGluZWFyRmlsdGVyIH07CisKKwkJdGhpcy5yZW5kZXJUYXJnZXQgPSBuZXcgV2Vi
R0xSZW5kZXJUYXJnZXRDdWJlKCBjdWJlUmVzb2x1dGlvbiwgY3ViZVJlc29sdXRpb24sIG9wdGlv
bnMgKTsKKwkJdGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gIkN1YmVDYW1lcmEiOwor
CisJCXRoaXMudXBkYXRlQ3ViZU1hcCA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIHNjZW5lICkgewor
CisJCQlpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgp
OworCisJCQl2YXIgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXQ7CisJCQl2YXIgZ2Vu
ZXJhdGVNaXBtYXBzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzOworCisJ
CQlyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTsKKworCQkJcmVu
ZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMDsKKwkJCXJlbmRlcmVyLnJlbmRlciggc2NlbmUs
IGNhbWVyYVBYLCByZW5kZXJUYXJnZXQgKTsKKworCQkJcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVG
YWNlID0gMTsKKwkJCXJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5YLCByZW5kZXJUYXJn
ZXQgKTsKKworCQkJcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMjsKKwkJCXJlbmRlcmVy
LnJlbmRlciggc2NlbmUsIGNhbWVyYVBZLCByZW5kZXJUYXJnZXQgKTsKKworCQkJcmVuZGVyVGFy
Z2V0LmFjdGl2ZUN1YmVGYWNlID0gMzsKKwkJCXJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVy
YU5ZLCByZW5kZXJUYXJnZXQgKTsKKworCQkJcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0g
NDsKKwkJCXJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBaLCByZW5kZXJUYXJnZXQgKTsK
KworCQkJcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZ2VuZXJhdGVNaXBt
YXBzOworCisJCQlyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSA1OworCQkJcmVuZGVyZXIu
cmVuZGVyKCBzY2VuZSwgY2FtZXJhTlosIHJlbmRlclRhcmdldCApOworCisJCQlyZW5kZXJlci5z
ZXRSZW5kZXJUYXJnZXQoIG51bGwgKTsKKworCQl9OworCisJfQorCisJQ3ViZUNhbWVyYS5wcm90
b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsKKwlDdWJlQ2FtZXJh
LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVDYW1lcmE7CisKKwkvKioKKwkgKiBAYXV0aG9y
IG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gQXVkaW9MaXN0
ZW5lcigpIHsKKworCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ0F1
ZGlvTGlzdGVuZXInOworCisJCXRoaXMuY29udGV4dCA9IEF1ZGlvQ29udGV4dC5nZXRDb250ZXh0
KCk7CisKKwkJdGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTsKKwkJdGhpcy5n
YWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApOworCisJCXRoaXMuZmlsdGVy
ID0gbnVsbDsKKworCX0KKworCUF1ZGlvTGlzdGVuZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2ln
biggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3Rv
cjogQXVkaW9MaXN0ZW5lciwKKworCQlnZXRJbnB1dDogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1
cm4gdGhpcy5nYWluOworCisJCX0sCisKKwkJcmVtb3ZlRmlsdGVyOiBmdW5jdGlvbiAoICkgewor
CisJCQlpZiAoIHRoaXMuZmlsdGVyICE9PSBudWxsICkgeworCisJCQkJdGhpcy5nYWluLmRpc2Nv
bm5lY3QoIHRoaXMuZmlsdGVyICk7CisJCQkJdGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5j
b250ZXh0LmRlc3RpbmF0aW9uICk7CisJCQkJdGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4
dC5kZXN0aW5hdGlvbiApOworCQkJCXRoaXMuZmlsdGVyID0gbnVsbDsKKworCQkJfQorCisJCX0s
CisKKwkJZ2V0RmlsdGVyOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB0aGlzLmZpbHRlcjsK
KworCQl9LAorCisJCXNldEZpbHRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJaWYgKCB0
aGlzLmZpbHRlciAhPT0gbnVsbCApIHsKKworCQkJCXRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlz
LmZpbHRlciApOworCQkJCXRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0
aW5hdGlvbiApOworCisJCQl9IGVsc2UgeworCisJCQkJdGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRo
aXMuY29udGV4dC5kZXN0aW5hdGlvbiApOworCisJCQl9CisKKwkJCXRoaXMuZmlsdGVyID0gdmFs
dWU7CisJCQl0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5maWx0ZXIgKTsKKwkJCXRoaXMuZmlsdGVy
LmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApOworCisJCX0sCisKKwkJZ2V0TWFz
dGVyVm9sdW1lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1
ZTsKKworCQl9LAorCisJCXNldE1hc3RlclZvbHVtZTogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKwor
CQkJdGhpcy5nYWluLmdhaW4udmFsdWUgPSB2YWx1ZTsKKworCQl9LAorCisJCXVwZGF0ZU1hdHJp
eFdvcmxkOiAoIGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMo
KTsKKwkJCXZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTsKKwkJCXZhciBzY2FsZSA9
IG5ldyBWZWN0b3IzKCk7CisKKwkJCXZhciBvcmllbnRhdGlvbiA9IG5ldyBWZWN0b3IzKCk7CisK
KwkJCXJldHVybiBmdW5jdGlvbiB1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7CisKKwkJCQlP
YmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTsK
KworCQkJCXZhciBsaXN0ZW5lciA9IHRoaXMuY29udGV4dC5saXN0ZW5lcjsKKwkJCQl2YXIgdXAg
PSB0aGlzLnVwOworCisJCQkJdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHBvc2l0aW9uLCBx
dWF0ZXJuaW9uLCBzY2FsZSApOworCisJCQkJb3JpZW50YXRpb24uc2V0KCAwLCAwLCAtIDEgKS5h
cHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTsKKworCQkJCWlmICggbGlzdGVuZXIucG9zaXRp
b25YICkgeworCisJCQkJCWxpc3RlbmVyLnBvc2l0aW9uWC5zZXRWYWx1ZUF0VGltZSggcG9zaXRp
b24ueCwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7CisJCQkJCWxpc3RlbmVyLnBvc2l0aW9u
WS5zZXRWYWx1ZUF0VGltZSggcG9zaXRpb24ueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7
CisJCQkJCWxpc3RlbmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZSggcG9zaXRpb24ueiwgdGhp
cy5jb250ZXh0LmN1cnJlbnRUaW1lICk7CisJCQkJCWxpc3RlbmVyLmZvcndhcmRYLnNldFZhbHVl
QXRUaW1lKCBvcmllbnRhdGlvbi54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTsKKwkJCQkJ
bGlzdGVuZXIuZm9yd2FyZFkuc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLnksIHRoaXMuY29u
dGV4dC5jdXJyZW50VGltZSApOworCQkJCQlsaXN0ZW5lci5mb3J3YXJkWi5zZXRWYWx1ZUF0VGlt
ZSggb3JpZW50YXRpb24ueiwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7CisJCQkJCWxpc3Rl
bmVyLnVwWC5zZXRWYWx1ZUF0VGltZSggdXAueCwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7
CisJCQkJCWxpc3RlbmVyLnVwWS5zZXRWYWx1ZUF0VGltZSggdXAueSwgdGhpcy5jb250ZXh0LmN1
cnJlbnRUaW1lICk7CisJCQkJCWxpc3RlbmVyLnVwWi5zZXRWYWx1ZUF0VGltZSggdXAueiwgdGhp
cy5jb250ZXh0LmN1cnJlbnRUaW1lICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCWxpc3RlbmVy
LnNldFBvc2l0aW9uKCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICk7CisJCQkJ
CWxpc3RlbmVyLnNldE9yaWVudGF0aW9uKCBvcmllbnRhdGlvbi54LCBvcmllbnRhdGlvbi55LCBv
cmllbnRhdGlvbi56LCB1cC54LCB1cC55LCB1cC56ICk7CisKKwkJCQl9CisKKwkJCX07CisKKwkJ
fSApKCkKKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9v
Yi5jb20vCisJICogQGF1dGhvciBSZWVjZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vu
b3Rlcy5jb20vCisJICovCisKKwlmdW5jdGlvbiBBdWRpbyggbGlzdGVuZXIgKSB7CisKKwkJT2Jq
ZWN0M0QuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdBdWRpbyc7CisKKwkJdGhpcy5j
b250ZXh0ID0gbGlzdGVuZXIuY29udGV4dDsKKworCQl0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQu
Y3JlYXRlR2FpbigpOworCQl0aGlzLmdhaW4uY29ubmVjdCggbGlzdGVuZXIuZ2V0SW5wdXQoKSAp
OworCisJCXRoaXMuYXV0b3BsYXkgPSBmYWxzZTsKKworCQl0aGlzLmJ1ZmZlciA9IG51bGw7CisJ
CXRoaXMubG9vcCA9IGZhbHNlOworCQl0aGlzLnN0YXJ0VGltZSA9IDA7CisJCXRoaXMucGxheWJh
Y2tSYXRlID0gMTsKKwkJdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKKwkJdGhpcy5oYXNQbGF5YmFj
a0NvbnRyb2wgPSB0cnVlOworCQl0aGlzLnNvdXJjZVR5cGUgPSAnZW1wdHknOworCisJCXRoaXMu
ZmlsdGVycyA9IFtdOworCisJfQorCisJQXVkaW8ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbigg
T2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3Rvcjog
QXVkaW8sCisKKwkJZ2V0T3V0cHV0OiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB0aGlzLmdh
aW47CisKKwkJfSwKKworCQlzZXROb2RlU291cmNlOiBmdW5jdGlvbiAoIGF1ZGlvTm9kZSApIHsK
KworCQkJdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTsKKwkJCXRoaXMuc291cmNlVHlw
ZSA9ICdhdWRpb05vZGUnOworCQkJdGhpcy5zb3VyY2UgPSBhdWRpb05vZGU7CisJCQl0aGlzLmNv
bm5lY3QoKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRCdWZmZXI6IGZ1bmN0
aW9uICggYXVkaW9CdWZmZXIgKSB7CisKKwkJCXRoaXMuYnVmZmVyID0gYXVkaW9CdWZmZXI7CisJ
CQl0aGlzLnNvdXJjZVR5cGUgPSAnYnVmZmVyJzsKKworCQkJaWYgKCB0aGlzLmF1dG9wbGF5ICkg
dGhpcy5wbGF5KCk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJcGxheTogZnVuY3Rp
b24gKCkgeworCisJCQlpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkgeworCisJCQkJY29u
c29sZS53YXJuKCAnVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4nICk7CisJ
CQkJcmV0dXJuOworCisJCQl9CisKKwkJCWlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09
IGZhbHNlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8g
aGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApOworCQkJCXJldHVybjsKKworCQkJfQorCisJCQl2
YXIgc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpOworCisJCQlzb3Vy
Y2UuYnVmZmVyID0gdGhpcy5idWZmZXI7CisJCQlzb3VyY2UubG9vcCA9IHRoaXMubG9vcDsKKwkJ
CXNvdXJjZS5vbmVuZGVkID0gdGhpcy5vbkVuZGVkLmJpbmQoIHRoaXMgKTsKKwkJCXNvdXJjZS5w
bGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLnN0YXJ0
VGltZSApOworCQkJc291cmNlLnN0YXJ0KCAwLCB0aGlzLnN0YXJ0VGltZSApOworCisJCQl0aGlz
LmlzUGxheWluZyA9IHRydWU7CisKKwkJCXRoaXMuc291cmNlID0gc291cmNlOworCisJCQlyZXR1
cm4gdGhpcy5jb25uZWN0KCk7CisKKwkJfSwKKworCQlwYXVzZTogZnVuY3Rpb24gKCkgeworCisJ
CQlpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHsKKworCQkJCWNvbnNv
bGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9s
LicgKTsKKwkJCQlyZXR1cm47CisKKwkJCX0KKworCQkJdGhpcy5zb3VyY2Uuc3RvcCgpOworCQkJ
dGhpcy5zdGFydFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWU7CisJCQl0aGlzLmlzUGxh
eWluZyA9IGZhbHNlOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXN0b3A6IGZ1bmN0
aW9uICgpIHsKKworCQkJaWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7
CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxh
eWJhY2sgY29udHJvbC4nICk7CisJCQkJcmV0dXJuOworCisJCQl9CisKKwkJCXRoaXMuc291cmNl
LnN0b3AoKTsKKwkJCXRoaXMuc3RhcnRUaW1lID0gMDsKKwkJCXRoaXMuaXNQbGF5aW5nID0gZmFs
c2U7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY29ubmVjdDogZnVuY3Rpb24gKCkg
eworCisJCQlpZiAoIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwICkgeworCisJCQkJdGhpcy5zb3Vy
Y2UuY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTsKKworCQkJCWZvciAoIHZhciBpID0gMSwg
bCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJCXRoaXMuZmls
dGVyc1sgaSAtIDEgXS5jb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApOworCisJCQkJfQorCisJ
CQkJdGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmNvbm5lY3QoIHRoaXMu
Z2V0T3V0cHV0KCkgKTsKKworCQkJfSBlbHNlIHsKKworCQkJCXRoaXMuc291cmNlLmNvbm5lY3Qo
IHRoaXMuZ2V0T3V0cHV0KCkgKTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAor
CisJCWRpc2Nvbm5lY3Q6IGZ1bmN0aW9uICgpIHsKKworCQkJaWYgKCB0aGlzLmZpbHRlcnMubGVu
Z3RoID4gMCApIHsKKworCQkJCXRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sg
MCBdICk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBp
IDwgbDsgaSArKyApIHsKKworCQkJCQl0aGlzLmZpbHRlcnNbIGkgLSAxIF0uZGlzY29ubmVjdCgg
dGhpcy5maWx0ZXJzWyBpIF0gKTsKKworCQkJCX0KKworCQkJCXRoaXMuZmlsdGVyc1sgdGhpcy5m
aWx0ZXJzLmxlbmd0aCAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7CisKKwkJ
CX0gZWxzZSB7CisKKwkJCQl0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgp
ICk7CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlnZXRGaWx0ZXJzOiBm
dW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB0aGlzLmZpbHRlcnM7CisKKwkJfSwKKworCQlzZXRG
aWx0ZXJzOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQlpZiAoICEgdmFsdWUgKSB2YWx1ZSA9
IFtdOworCisJCQlpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkgeworCisJCQkJdGhpcy5k
aXNjb25uZWN0KCk7CisJCQkJdGhpcy5maWx0ZXJzID0gdmFsdWU7CisJCQkJdGhpcy5jb25uZWN0
KCk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQl0aGlzLmZpbHRlcnMgPSB2YWx1ZTsKKworCQkJfQor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWdldEZpbHRlcjogZnVuY3Rpb24gKCkgewor
CisJCQlyZXR1cm4gdGhpcy5nZXRGaWx0ZXJzKClbIDAgXTsKKworCQl9LAorCisJCXNldEZpbHRl
cjogZnVuY3Rpb24gKCBmaWx0ZXIgKSB7CisKKwkJCXJldHVybiB0aGlzLnNldEZpbHRlcnMoIGZp
bHRlciA/IFsgZmlsdGVyIF0gOiBbXSApOworCisJCX0sCisKKwkJc2V0UGxheWJhY2tSYXRlOiBm
dW5jdGlvbiAoIHZhbHVlICkgeworCisJCQlpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09
PSBmYWxzZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlv
IGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTsKKwkJCQlyZXR1cm47CisKKwkJCX0KKworCQkJ
dGhpcy5wbGF5YmFja1JhdGUgPSB2YWx1ZTsKKworCQkJaWYgKCB0aGlzLmlzUGxheWluZyA9PT0g
dHJ1ZSApIHsKKworCQkJCXRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZSgg
dGhpcy5wbGF5YmFja1JhdGUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOworCisJCQl9CisK
KwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZ2V0UGxheWJhY2tSYXRlOiBmdW5jdGlvbiAo
KSB7CisKKwkJCXJldHVybiB0aGlzLnBsYXliYWNrUmF0ZTsKKworCQl9LAorCisJCW9uRW5kZWQ6
IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKKworCQl9LAorCisJ
CWdldExvb3A6IGZ1bmN0aW9uICgpIHsKKworCQkJaWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJv
bCA9PT0gZmFsc2UgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBB
dWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7CisJCQkJcmV0dXJuIGZhbHNlOworCisJ
CQl9CisKKwkJCXJldHVybiB0aGlzLmxvb3A7CisKKwkJfSwKKworCQlzZXRMb29wOiBmdW5jdGlv
biAoIHZhbHVlICkgeworCisJCQlpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxz
ZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBu
byBwbGF5YmFjayBjb250cm9sLicgKTsKKwkJCQlyZXR1cm47CisKKwkJCX0KKworCQkJdGhpcy5s
b29wID0gdmFsdWU7CisKKwkJCWlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7CisKKwkJ
CQl0aGlzLnNvdXJjZS5sb29wID0gdGhpcy5sb29wOworCisJCQl9CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJZ2V0Vm9sdW1lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB0aGlz
LmdhaW4uZ2Fpbi52YWx1ZTsKKworCQl9LAorCQkKKwkJc2V0Vm9sdW1lOiBmdW5jdGlvbiAoIHZh
bHVlICkgeworCisJCQl0aGlzLmdhaW4uZ2Fpbi52YWx1ZSA9IHZhbHVlOworCisJCQlyZXR1cm4g
dGhpczsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6
Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gUG9zaXRpb25hbEF1ZGlvKCBsaXN0ZW5l
ciApIHsKKworCQlBdWRpby5jYWxsKCB0aGlzLCBsaXN0ZW5lciApOworCisJCXRoaXMucGFubmVy
ID0gdGhpcy5jb250ZXh0LmNyZWF0ZVBhbm5lcigpOworCQl0aGlzLnBhbm5lci5jb25uZWN0KCB0
aGlzLmdhaW4gKTsKKworCX0KKworCVBvc2l0aW9uYWxBdWRpby5wcm90b3R5cGUgPSBPYmplY3Qu
YXNzaWduKCBPYmplY3QuY3JlYXRlKCBBdWRpby5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVj
dG9yOiBQb3NpdGlvbmFsQXVkaW8sCisKKwkJZ2V0T3V0cHV0OiBmdW5jdGlvbiAoKSB7CisKKwkJ
CXJldHVybiB0aGlzLnBhbm5lcjsKKworCQl9LAorCisJCWdldFJlZkRpc3RhbmNlOiBmdW5jdGlv
biAoKSB7CisKKwkJCXJldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZTsKKworCQl9LAorCisJ
CXNldFJlZkRpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQl0aGlzLnBhbm5lci5y
ZWZEaXN0YW5jZSA9IHZhbHVlOworCisJCX0sCisKKwkJZ2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rp
b24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvcjsKKworCQl9LAor
CisJCXNldFJvbGxvZmZGYWN0b3I6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCXRoaXMucGFu
bmVyLnJvbGxvZmZGYWN0b3IgPSB2YWx1ZTsKKworCQl9LAorCisJCWdldERpc3RhbmNlTW9kZWw6
IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw7CisK
KwkJfSwKKworCQlzZXREaXN0YW5jZU1vZGVsOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQl0
aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsID0gdmFsdWU7CisKKwkJfSwKKworCQlnZXRNYXhEaXN0
YW5jZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U7
CisKKwkJfSwKKworCQlzZXRNYXhEaXN0YW5jZTogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJ
dGhpcy5wYW5uZXIubWF4RGlzdGFuY2UgPSB2YWx1ZTsKKworCQl9LAorCisJCXVwZGF0ZU1hdHJp
eFdvcmxkOiAoIGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMo
KTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHsKKwor
CQkJCU9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3Jj
ZSApOworCisJCQkJcG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdv
cmxkICk7CisKKwkJCQl0aGlzLnBhbm5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRp
b24ueSwgcG9zaXRpb24ueiApOworCisJCQl9OworCisJCX0gKSgpCisKKworCX0gKTsKKworCS8q
KgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5j
dGlvbiBBdWRpb0FuYWx5c2VyKCBhdWRpbywgZmZ0U2l6ZSApIHsKKworCQl0aGlzLmFuYWx5c2Vy
ID0gYXVkaW8uY29udGV4dC5jcmVhdGVBbmFseXNlcigpOworCQl0aGlzLmFuYWx5c2VyLmZmdFNp
emUgPSBmZnRTaXplICE9PSB1bmRlZmluZWQgPyBmZnRTaXplIDogMjA0ODsKKworCQl0aGlzLmRh
dGEgPSBuZXcgVWludDhBcnJheSggdGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCApOwor
CisJCWF1ZGlvLmdldE91dHB1dCgpLmNvbm5lY3QoIHRoaXMuYW5hbHlzZXIgKTsKKworCX0KKwor
CU9iamVjdC5hc3NpZ24oIEF1ZGlvQW5hbHlzZXIucHJvdG90eXBlLCB7CisKKwkJZ2V0RnJlcXVl
bmN5RGF0YTogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVu
Y3lEYXRhKCB0aGlzLmRhdGEgKTsKKworCQkJcmV0dXJuIHRoaXMuZGF0YTsKKworCQl9LAorCisJ
CWdldEF2ZXJhZ2VGcmVxdWVuY3k6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHZhbHVlID0gMCwg
ZGF0YSA9IHRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpOworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkg
PCBkYXRhLmxlbmd0aDsgaSArKyApIHsKKworCQkJCXZhbHVlICs9IGRhdGFbIGkgXTsKKworCQkJ
fQorCisJCQlyZXR1cm4gdmFsdWUgLyBkYXRhLmxlbmd0aDsKKworCQl9CisKKwl9ICk7CisKKwkv
KioKKwkgKgorCSAqIEJ1ZmZlcmVkIHNjZW5lIGdyYXBoIHByb3BlcnR5IHRoYXQgYWxsb3dzIHdl
aWdodGVkIGFjY3VtdWxhdGlvbi4KKwkgKgorCSAqCisJICogQGF1dGhvciBCZW4gSG91c3RvbiAv
IGh0dHA6Ly9jbGFyYS5pby8KKwkgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0
aGF1cy51cy8KKwkgKiBAYXV0aG9yIHRzY2h3CisJICovCisKKwlmdW5jdGlvbiBQcm9wZXJ0eU1p
eGVyKCBiaW5kaW5nLCB0eXBlTmFtZSwgdmFsdWVTaXplICkgeworCisJCXRoaXMuYmluZGluZyA9
IGJpbmRpbmc7CisJCXRoaXMudmFsdWVTaXplID0gdmFsdWVTaXplOworCisJCXZhciBidWZmZXJU
eXBlID0gRmxvYXQ2NEFycmF5LAorCQkJbWl4RnVuY3Rpb247CisKKwkJc3dpdGNoICggdHlwZU5h
bWUgKSB7CisKKwkJCWNhc2UgJ3F1YXRlcm5pb24nOgorCQkJCW1peEZ1bmN0aW9uID0gdGhpcy5f
c2xlcnA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ3N0cmluZyc6CisJCQljYXNlICdib29sJzoK
KwkJCQlidWZmZXJUeXBlID0gQXJyYXk7CisJCQkJbWl4RnVuY3Rpb24gPSB0aGlzLl9zZWxlY3Q7
CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJbWl4RnVuY3Rpb24gPSB0aGlzLl9sZXJw
OworCisJCX0KKworCQl0aGlzLmJ1ZmZlciA9IG5ldyBidWZmZXJUeXBlKCB2YWx1ZVNpemUgKiA0
ICk7CisJCS8vIGxheW91dDogWyBpbmNvbWluZyB8IGFjY3UwIHwgYWNjdTEgfCBvcmlnIF0KKwkJ
Ly8KKwkJLy8gaW50ZXJwb2xhdG9ycyBjYW4gdXNlIC5idWZmZXIgYXMgdGhlaXIgLnJlc3VsdAor
CQkvLyB0aGUgZGF0YSB0aGVuIGdvZXMgdG8gJ2luY29taW5nJworCQkvLworCQkvLyAnYWNjdTAn
IGFuZCAnYWNjdTEnIGFyZSB1c2VkIGZyYW1lLWludGVybGVhdmVkIGZvcgorCQkvLyB0aGUgY3Vt
dWxhdGl2ZSByZXN1bHQgYW5kIGFyZSBjb21wYXJlZCB0byBkZXRlY3QKKwkJLy8gY2hhbmdlcwor
CQkvLworCQkvLyAnb3JpZycgc3RvcmVzIHRoZSBvcmlnaW5hbCBzdGF0ZSBvZiB0aGUgcHJvcGVy
dHkKKworCQl0aGlzLl9taXhCdWZmZXJSZWdpb24gPSBtaXhGdW5jdGlvbjsKKworCQl0aGlzLmN1
bXVsYXRpdmVXZWlnaHQgPSAwOworCisJCXRoaXMudXNlQ291bnQgPSAwOworCQl0aGlzLnJlZmVy
ZW5jZUNvdW50ID0gMDsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIFByb3BlcnR5TWl4ZXIucHJv
dG90eXBlLCB7CisKKwkJLy8gYWNjdW11bGF0ZSBkYXRhIGluIHRoZSAnaW5jb21pbmcnIHJlZ2lv
biBpbnRvICdhY2N1PGk+JworCQlhY2N1bXVsYXRlOiBmdW5jdGlvbiAoIGFjY3VJbmRleCwgd2Vp
Z2h0ICkgeworCisJCQkvLyBub3RlOiBoYXBwaWx5IGFjY3VtdWxhdGluZyBub3RoaW5nIHdoZW4g
d2VpZ2h0ID0gMCwgdGhlIGNhbGxlciBrbm93cworCQkJLy8gdGhlIHdlaWdodCBhbmQgc2hvdWxk
bid0IGhhdmUgbWFkZSB0aGUgY2FsbCBpbiB0aGUgZmlyc3QgcGxhY2UKKworCQkJdmFyIGJ1ZmZl
ciA9IHRoaXMuYnVmZmVyLAorCQkJCXN0cmlkZSA9IHRoaXMudmFsdWVTaXplLAorCQkJCW9mZnNl
dCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSwKKworCQkJCWN1cnJlbnRXZWlnaHQgPSB0
aGlzLmN1bXVsYXRpdmVXZWlnaHQ7CisKKwkJCWlmICggY3VycmVudFdlaWdodCA9PT0gMCApIHsK
KworCQkJCS8vIGFjY3VOIDo9IGluY29taW5nICogd2VpZ2h0CisKKwkJCQlmb3IgKCB2YXIgaSA9
IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHsKKworCQkJCQlidWZmZXJbIG9mZnNldCArIGkgXSA9
IGJ1ZmZlclsgaSBdOworCisJCQkJfQorCisJCQkJY3VycmVudFdlaWdodCA9IHdlaWdodDsKKwor
CQkJfSBlbHNlIHsKKworCQkJCS8vIGFjY3VOIDo9IGFjY3VOICsgaW5jb21pbmcgKiB3ZWlnaHQK
KworCQkJCWN1cnJlbnRXZWlnaHQgKz0gd2VpZ2h0OworCQkJCXZhciBtaXggPSB3ZWlnaHQgLyBj
dXJyZW50V2VpZ2h0OworCQkJCXRoaXMuX21peEJ1ZmZlclJlZ2lvbiggYnVmZmVyLCBvZmZzZXQs
IDAsIG1peCwgc3RyaWRlICk7CisKKwkJCX0KKworCQkJdGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0g
Y3VycmVudFdlaWdodDsKKworCQl9LAorCisJCS8vIGFwcGx5IHRoZSBzdGF0ZSBvZiAnYWNjdTxp
PicgdG8gdGhlIGJpbmRpbmcgd2hlbiBhY2N1cyBkaWZmZXIKKwkJYXBwbHk6IGZ1bmN0aW9uICgg
YWNjdUluZGV4ICkgeworCisJCQl2YXIgc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsCisJCQkJYnVm
ZmVyID0gdGhpcy5idWZmZXIsCisJCQkJb2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3Ry
aWRlLAorCisJCQkJd2VpZ2h0ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0LAorCisJCQkJYmluZGlu
ZyA9IHRoaXMuYmluZGluZzsKKworCQkJdGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDsKKworCQkJ
aWYgKCB3ZWlnaHQgPCAxICkgeworCisJCQkJLy8gYWNjdU4gOj0gYWNjdU4gKyBvcmlnaW5hbCAq
ICggMSAtIGN1bXVsYXRpdmVXZWlnaHQgKQorCisJCQkJdmFyIG9yaWdpbmFsVmFsdWVPZmZzZXQg
PSBzdHJpZGUgKiAzOworCisJCQkJdGhpcy5fbWl4QnVmZmVyUmVnaW9uKAorCQkJCQlidWZmZXIs
IG9mZnNldCwgb3JpZ2luYWxWYWx1ZU9mZnNldCwgMSAtIHdlaWdodCwgc3RyaWRlICk7CisKKwkJ
CX0KKworCQkJZm9yICggdmFyIGkgPSBzdHJpZGUsIGUgPSBzdHJpZGUgKyBzdHJpZGU7IGkgIT09
IGU7ICsrIGkgKSB7CisKKwkJCQlpZiAoIGJ1ZmZlclsgaSBdICE9PSBidWZmZXJbIGkgKyBzdHJp
ZGUgXSApIHsKKworCQkJCQkvLyB2YWx1ZSBoYXMgY2hhbmdlZCAtPiB1cGRhdGUgc2NlbmUgZ3Jh
cGgKKworCQkJCQliaW5kaW5nLnNldFZhbHVlKCBidWZmZXIsIG9mZnNldCApOworCQkJCQlicmVh
azsKKworCQkJCX0KKworCQkJfQorCisJCX0sCisKKwkJLy8gcmVtZW1iZXIgdGhlIHN0YXRlIG9m
IHRoZSBib3VuZCBwcm9wZXJ0eSBhbmQgY29weSBpdCB0byBib3RoIGFjY3VzCisJCXNhdmVPcmln
aW5hbFN0YXRlOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBiaW5kaW5nID0gdGhpcy5iaW5kaW5n
OworCisJCQl2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsCisJCQkJc3RyaWRlID0gdGhpcy52YWx1
ZVNpemUsCisKKwkJCQlvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogMzsKKworCQkJYmlu
ZGluZy5nZXRWYWx1ZSggYnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7CisKKwkJCS8vIGFj
Y3VbMC4uMV0gOj0gb3JpZyAtLSBpbml0aWFsbHkgZGV0ZWN0IGNoYW5nZXMgYWdhaW5zdCB0aGUg
b3JpZ2luYWwKKwkJCWZvciAoIHZhciBpID0gc3RyaWRlLCBlID0gb3JpZ2luYWxWYWx1ZU9mZnNl
dDsgaSAhPT0gZTsgKysgaSApIHsKKworCQkJCWJ1ZmZlclsgaSBdID0gYnVmZmVyWyBvcmlnaW5h
bFZhbHVlT2Zmc2V0ICsgKCBpICUgc3RyaWRlICkgXTsKKworCQkJfQorCisJCQl0aGlzLmN1bXVs
YXRpdmVXZWlnaHQgPSAwOworCisJCX0sCisKKwkJLy8gYXBwbHkgdGhlIHN0YXRlIHByZXZpb3Vz
bHkgdGFrZW4gdmlhICdzYXZlT3JpZ2luYWxTdGF0ZScgdG8gdGhlIGJpbmRpbmcKKwkJcmVzdG9y
ZU9yaWdpbmFsU3RhdGU6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIG9yaWdpbmFsVmFsdWVPZmZz
ZXQgPSB0aGlzLnZhbHVlU2l6ZSAqIDM7CisJCQl0aGlzLmJpbmRpbmcuc2V0VmFsdWUoIHRoaXMu
YnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7CisKKwkJfSwKKworCisJCS8vIG1peCBmdW5j
dGlvbnMKKworCQlfc2VsZWN0OiBmdW5jdGlvbiAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZz
ZXQsIHQsIHN0cmlkZSApIHsKKworCQkJaWYgKCB0ID49IDAuNSApIHsKKworCQkJCWZvciAoIHZh
ciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkgeworCisJCQkJCWJ1ZmZlclsgZHN0T2Zmc2V0
ICsgaSBdID0gYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF07CisKKwkJCQl9CisKKwkJCX0KKworCQl9
LAorCisJCV9zbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0
ICkgeworCisJCQlRdWF0ZXJuaW9uLnNsZXJwRmxhdCggYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZl
ciwgZHN0T2Zmc2V0LCBidWZmZXIsIHNyY09mZnNldCwgdCApOworCisJCX0sCisKKwkJX2xlcnA6
IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkgewor
CisJCQl2YXIgcyA9IDEgLSB0OworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsg
KysgaSApIHsKKworCQkJCXZhciBqID0gZHN0T2Zmc2V0ICsgaTsKKworCQkJCWJ1ZmZlclsgaiBd
ID0gYnVmZmVyWyBqIF0gKiBzICsgYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF0gKiB0OworCisJCQl9
CisKKwkJfQorCisJfSApOworCisJLyoqCisJICoKKwkgKiBBIHJlZmVyZW5jZSB0byBhIHJlYWwg
cHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoLgorCSAqCisJICoKKwkgKiBAYXV0aG9yIEJlbiBI
b3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLworCSAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRw
Oi8vbGlnaHRoYXVzLnVzLworCSAqIEBhdXRob3IgdHNjaHcKKwkgKi8KKworCWZ1bmN0aW9uIENv
bXBvc2l0ZSggdGFyZ2V0R3JvdXAsIHBhdGgsIG9wdGlvbmFsUGFyc2VkUGF0aCApIHsKKworCQl2
YXIgcGFyc2VkUGF0aCA9IG9wdGlvbmFsUGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFy
c2VUcmFja05hbWUoIHBhdGggKTsKKworCQl0aGlzLl90YXJnZXRHcm91cCA9IHRhcmdldEdyb3Vw
OworCQl0aGlzLl9iaW5kaW5ncyA9IHRhcmdldEdyb3VwLnN1YnNjcmliZV8oIHBhdGgsIHBhcnNl
ZFBhdGggKTsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIENvbXBvc2l0ZS5wcm90b3R5cGUsIHsK
KworCQlnZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgeworCisJCQl0aGlzLmJp
bmQoKTsgLy8gYmluZCBhbGwgYmluZGluZworCisJCQl2YXIgZmlyc3RWYWxpZEluZGV4ID0gdGhp
cy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLAorCQkJCWJpbmRpbmcgPSB0aGlzLl9iaW5k
aW5nc1sgZmlyc3RWYWxpZEluZGV4IF07CisKKwkJCS8vIGFuZCBvbmx5IGNhbGwgLmdldFZhbHVl
IG9uIHRoZSBmaXJzdAorCQkJaWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSBiaW5kaW5nLmdl
dFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7CisKKwkJfSwKKworCQlzZXRWYWx1ZTogZnVuY3Rpb24g
KCBhcnJheSwgb2Zmc2V0ICkgeworCisJCQl2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5nczsK
KworCQkJZm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sCisJ
CQkJCSAgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworCQkJCWJpbmRp
bmdzWyBpIF0uc2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTsKKworCQkJfQorCisJCX0sCisKKwkJ
YmluZDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5nczsK
KworCQkJZm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sCisJ
CQkJCSAgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworCQkJCWJpbmRp
bmdzWyBpIF0uYmluZCgpOworCisJCQl9CisKKwkJfSwKKworCQl1bmJpbmQ6IGZ1bmN0aW9uICgp
IHsKKworCQkJdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7CisKKwkJCWZvciAoIHZhciBp
ID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLAorCQkJCQkgIG4gPSBiaW5kaW5n
cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKwkJCQliaW5kaW5nc1sgaSBdLnVuYmluZCgp
OworCisJCQl9CisKKwkJfQorCisJfSApOworCisKKwlmdW5jdGlvbiBQcm9wZXJ0eUJpbmRpbmco
IHJvb3ROb2RlLCBwYXRoLCBwYXJzZWRQYXRoICkgeworCisJCXRoaXMucGF0aCA9IHBhdGg7CisJ
CXRoaXMucGFyc2VkUGF0aCA9IHBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJh
Y2tOYW1lKCBwYXRoICk7CisKKwkJdGhpcy5ub2RlID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2Rl
KCByb290Tm9kZSwgdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lICkgfHwgcm9vdE5vZGU7CisKKwkJ
dGhpcy5yb290Tm9kZSA9IHJvb3ROb2RlOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggUHJvcGVy
dHlCaW5kaW5nLCB7CisKKwkJQ29tcG9zaXRlOiBDb21wb3NpdGUsCisKKwkJY3JlYXRlOiBmdW5j
dGlvbiAoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKSB7CisKKwkJCWlmICggISAoIHJvb3QgJiYg
cm9vdC5pc0FuaW1hdGlvbk9iamVjdEdyb3VwICkgKSB7CisKKwkJCQlyZXR1cm4gbmV3IFByb3Bl
cnR5QmluZGluZyggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApOworCisJCQl9IGVsc2UgeworCisJ
CQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlKCByb290LCBwYXRoLCBwYXJz
ZWRQYXRoICk7CisKKwkJCX0KKworCQl9LAorCisJCS8qKgorCQkgKiBSZXBsYWNlcyBzcGFjZXMg
d2l0aCB1bmRlcnNjb3JlcyBhbmQgcmVtb3ZlcyB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzIGZyb20K
KwkJICogbm9kZSBuYW1lcywgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBwYXJzZVRyYWNr
TmFtZSgpLgorCQkgKgorCQkgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgTm9kZSBuYW1lIHRvIGJl
IHNhbml0aXplZC4KKwkJICogQHJldHVybiB7c3RyaW5nfQorCQkgKi8KKwkJc2FuaXRpemVOb2Rl
TmFtZTogZnVuY3Rpb24gKCBuYW1lICkgeworCisJCQlyZXR1cm4gbmFtZS5yZXBsYWNlKCAvXHMv
ZywgJ18nICkucmVwbGFjZSggL1teXHctXS9nLCAnJyApOworCisJCX0sCisKKwkJcGFyc2VUcmFj
a05hbWU6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gUGFyZW50IGRpcmVjdG9yaWVzLCBkZWxpbWl0
ZWQgYnkgJy8nIG9yICc6Jy4gQ3VycmVudGx5IHVudXNlZCwgYnV0IG11c3QKKwkJCS8vIGJlIG1h
dGNoZWQgdG8gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIHRyYWNrIG5hbWUuCisJCQl2YXIgZGlyZWN0
b3J5UmUgPSAvKCg/Oltcdy1dK1tcLzpdKSopLzsKKworCQkJLy8gVGFyZ2V0IG5vZGUuIE1heSBj
b250YWluIHdvcmQgY2hhcmFjdGVycyAoYS16QS1aMC05XykgYW5kICcuJyBvciAnLScuCisJCQl2
YXIgbm9kZVJlID0gLyhbXHctXC5dKyk/LzsKKworCQkJLy8gT2JqZWN0IG9uIHRhcmdldCBub2Rl
LCBhbmQgYWNjZXNzb3IuIE5hbWUgbWF5IGNvbnRhaW4gb25seSB3b3JkCisJCQkvLyBjaGFyYWN0
ZXJzLiBBY2Nlc3NvciBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBjbG9zaW5nIGJy
YWNrZXQuCisJCQl2YXIgb2JqZWN0UmUgPSAvKD86XC4oW1x3LV0rKSg/OlxbKC4rKVxdKT8pPy87
CisKKwkJCS8vIFByb3BlcnR5IGFuZCBhY2Nlc3Nvci4gTWF5IGNvbnRhaW4gb25seSB3b3JkIGNo
YXJhY3RlcnMuIEFjY2Vzc29yIG1heQorCQkJLy8gY29udGFpbiBhbnkgbm9uLWJyYWNrZXQgY2hh
cmFjdGVycy4KKwkJCXZhciBwcm9wZXJ0eVJlID0gL1wuKFtcdy1dKykoPzpcWyguKylcXSk/LzsK
KworCQkJdmFyIHRyYWNrUmUgPSBuZXcgUmVnRXhwKCcnCisJCQkJKyAnXicKKwkJCQkrIGRpcmVj
dG9yeVJlLnNvdXJjZQorCQkJCSsgbm9kZVJlLnNvdXJjZQorCQkJCSsgb2JqZWN0UmUuc291cmNl
CisJCQkJKyBwcm9wZXJ0eVJlLnNvdXJjZQorCQkJCSsgJyQnCisJCQkpOworCisJCQl2YXIgc3Vw
cG9ydGVkT2JqZWN0TmFtZXMgPSBbICdtYXRlcmlhbCcsICdtYXRlcmlhbHMnLCAnYm9uZXMnIF07
CisKKwkJCXJldHVybiBmdW5jdGlvbiAoIHRyYWNrTmFtZSApIHsKKworCQkJCQl2YXIgbWF0Y2hl
cyA9IHRyYWNrUmUuZXhlYyggdHJhY2tOYW1lICk7CisKKwkJCQkJaWYgKCAhIG1hdGNoZXMgKSB7
CisKKwkJCQkJCXRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNl
IHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApOworCisJCQkJCX0KKworCQkJCQl2YXIgcmVzdWx0
cyA9IHsKKwkJCQkJCS8vIGRpcmVjdG9yeU5hbWU6IG1hdGNoZXNbIDEgXSwgLy8gKHRzY2h3KSBj
dXJyZW50bHkgdW51c2VkCisJCQkJCQlub2RlTmFtZTogbWF0Y2hlc1sgMiBdLAorCQkJCQkJb2Jq
ZWN0TmFtZTogbWF0Y2hlc1sgMyBdLAorCQkJCQkJb2JqZWN0SW5kZXg6IG1hdGNoZXNbIDQgXSwK
KwkJCQkJCXByb3BlcnR5TmFtZTogbWF0Y2hlc1sgNSBdLCAgICAgLy8gcmVxdWlyZWQKKwkJCQkJ
CXByb3BlcnR5SW5kZXg6IG1hdGNoZXNbIDYgXQorCQkJCQl9OworCisJCQkJCXZhciBsYXN0RG90
ID0gcmVzdWx0cy5ub2RlTmFtZSAmJiByZXN1bHRzLm5vZGVOYW1lLmxhc3RJbmRleE9mKCAnLicg
KTsKKworCQkJCQlpZiAoIGxhc3REb3QgIT09IHVuZGVmaW5lZCAmJiBsYXN0RG90ICE9PSAtMSAp
IHsKKworCQkJCQkJdmFyIG9iamVjdE5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZygg
bGFzdERvdCArIDEgKTsKKworCQkJCQkJLy8gT2JqZWN0IG5hbWVzIG11c3QgYmUgY2hlY2tlZCBh
Z2FpbnN0IGEgd2hpdGVsaXN0LiBPdGhlcndpc2UsIHRoZXJlCisJCQkJCQkvLyBpcyBubyB3YXkg
dG8gcGFyc2UgJ2Zvby5iYXIuYmF6JzogJ2JheicgbXVzdCBiZSBhIHByb3BlcnR5LCBidXQKKwkJ
CQkJCS8vICdiYXInIGNvdWxkIGJlIHRoZSBvYmplY3ROYW1lLCBvciBwYXJ0IG9mIGEgbm9kZU5h
bWUgKHdoaWNoIGNhbgorCQkJCQkJLy8gaW5jbHVkZSAnLicgY2hhcmFjdGVycykuCisJCQkJCQlp
ZiAoIHN1cHBvcnRlZE9iamVjdE5hbWVzLmluZGV4T2YoIG9iamVjdE5hbWUgKSAhPT0gLTEgKSB7
CisKKwkJCQkJCQlyZXN1bHRzLm5vZGVOYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmco
IDAsIGxhc3REb3QgKTsKKwkJCQkJCQlyZXN1bHRzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lOwor
CisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJCWlmICggcmVzdWx0cy5wcm9wZXJ0eU5hbWUgPT09
IG51bGwgfHwgcmVzdWx0cy5wcm9wZXJ0eU5hbWUubGVuZ3RoID09PSAwICkgeworCisJCQkJCQl0
aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IGNhbiBub3QgcGFyc2UgcHJvcGVydHlO
YW1lIGZyb20gdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7CisKKwkJCQkJfQorCisJCQkJCXJl
dHVybiByZXN1bHRzOworCisJCQkJfTsKKworCQl9KCksCisKKwkJZmluZE5vZGU6IGZ1bmN0aW9u
ICggcm9vdCwgbm9kZU5hbWUgKSB7CisKKwkJCWlmICggISBub2RlTmFtZSB8fCBub2RlTmFtZSA9
PT0gIiIgfHwgbm9kZU5hbWUgPT09ICJyb290IiB8fCBub2RlTmFtZSA9PT0gIi4iIHx8IG5vZGVO
YW1lID09PSAtIDEgfHwgbm9kZU5hbWUgPT09IHJvb3QubmFtZSB8fCBub2RlTmFtZSA9PT0gcm9v
dC51dWlkICkgeworCisJCQkJcmV0dXJuIHJvb3Q7CisKKwkJCX0KKworCQkJLy8gc2VhcmNoIGlu
dG8gc2tlbGV0b24gYm9uZXMuCisJCQlpZiAoIHJvb3Quc2tlbGV0b24gKSB7CisKKwkJCQl2YXIg
c2VhcmNoU2tlbGV0b24gPSBmdW5jdGlvbiAoIHNrZWxldG9uICkgeworCisJCQkJCWZvciAoIHZh
ciBpID0gMDsgaSA8IHNrZWxldG9uLmJvbmVzLmxlbmd0aDsgaSArKyApIHsKKworCQkJCQkJdmFy
IGJvbmUgPSBza2VsZXRvbi5ib25lc1sgaSBdOworCisJCQkJCQlpZiAoIGJvbmUubmFtZSA9PT0g
bm9kZU5hbWUgKSB7CisKKwkJCQkJCQlyZXR1cm4gYm9uZTsKKworCQkJCQkJfQorCisJCQkJCX0K
KworCQkJCQlyZXR1cm4gbnVsbDsKKworCQkJCX07CisKKwkJCQl2YXIgYm9uZSA9IHNlYXJjaFNr
ZWxldG9uKCByb290LnNrZWxldG9uICk7CisKKwkJCQlpZiAoIGJvbmUgKSB7CisKKwkJCQkJcmV0
dXJuIGJvbmU7CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gc2VhcmNoIGludG8gbm9kZSBzdWJ0
cmVlLgorCQkJaWYgKCByb290LmNoaWxkcmVuICkgeworCisJCQkJdmFyIHNlYXJjaE5vZGVTdWJ0
cmVlID0gZnVuY3Rpb24gKCBjaGlsZHJlbiApIHsKKworCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkg
PCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7CisKKwkJCQkJCXZhciBjaGlsZE5vZGUgPSBjaGls
ZHJlblsgaSBdOworCisJCQkJCQlpZiAoIGNoaWxkTm9kZS5uYW1lID09PSBub2RlTmFtZSB8fCBj
aGlsZE5vZGUudXVpZCA9PT0gbm9kZU5hbWUgKSB7CisKKwkJCQkJCQlyZXR1cm4gY2hpbGROb2Rl
OworCisJCQkJCQl9CisKKwkJCQkJCXZhciByZXN1bHQgPSBzZWFyY2hOb2RlU3VidHJlZSggY2hp
bGROb2RlLmNoaWxkcmVuICk7CisKKwkJCQkJCWlmICggcmVzdWx0ICkgcmV0dXJuIHJlc3VsdDsK
KworCQkJCQl9CisKKwkJCQkJcmV0dXJuIG51bGw7CisKKwkJCQl9OworCisJCQkJdmFyIHN1YlRy
ZWVOb2RlID0gc2VhcmNoTm9kZVN1YnRyZWUoIHJvb3QuY2hpbGRyZW4gKTsKKworCQkJCWlmICgg
c3ViVHJlZU5vZGUgKSB7CisKKwkJCQkJcmV0dXJuIHN1YlRyZWVOb2RlOworCisJCQkJfQorCisJ
CQl9CisKKwkJCXJldHVybiBudWxsOworCisJCX0KKworCX0gKTsKKworCU9iamVjdC5hc3NpZ24o
IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHsgLy8gcHJvdG90eXBlLCBjb250aW51ZWQKKwor
CQkvLyB0aGVzZSBhcmUgdXNlZCB0byAiYmluZCIgYSBub25leGlzdGVudCBwcm9wZXJ0eQorCQlf
Z2V0VmFsdWVfdW5hdmFpbGFibGU6IGZ1bmN0aW9uICgpIHt9LAorCQlfc2V0VmFsdWVfdW5hdmFp
bGFibGU6IGZ1bmN0aW9uICgpIHt9LAorCisJCUJpbmRpbmdUeXBlOiB7CisJCQlEaXJlY3Q6IDAs
CisJCQlFbnRpcmVBcnJheTogMSwKKwkJCUFycmF5RWxlbWVudDogMiwKKwkJCUhhc0Zyb21Ub0Fy
cmF5OiAzCisJCX0sCisKKwkJVmVyc2lvbmluZzogeworCQkJTm9uZTogMCwKKwkJCU5lZWRzVXBk
YXRlOiAxLAorCQkJTWF0cml4V29ybGROZWVkc1VwZGF0ZTogMgorCQl9LAorCisJCUdldHRlckJ5
QmluZGluZ1R5cGU6IFsKKworCQkJZnVuY3Rpb24gZ2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9m
ZnNldCApIHsKKworCQkJCWJ1ZmZlclsgb2Zmc2V0IF0gPSB0aGlzLm5vZGVbIHRoaXMucHJvcGVy
dHlOYW1lIF07CisKKwkJCX0sCisKKwkJCWZ1bmN0aW9uIGdldFZhbHVlX2FycmF5KCBidWZmZXIs
IG9mZnNldCApIHsKKworCQkJCXZhciBzb3VyY2UgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7CisK
KwkJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBzb3VyY2UubGVuZ3RoOyBpICE9PSBuOyArKyBpICkg
eworCisJCQkJCWJ1ZmZlclsgb2Zmc2V0ICsrIF0gPSBzb3VyY2VbIGkgXTsKKworCQkJCX0KKwor
CQkJfSwKKworCQkJZnVuY3Rpb24gZ2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNl
dCApIHsKKworCQkJCWJ1ZmZlclsgb2Zmc2V0IF0gPSB0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRo
aXMucHJvcGVydHlJbmRleCBdOworCisJCQl9LAorCisJCQlmdW5jdGlvbiBnZXRWYWx1ZV90b0Fy
cmF5KCBidWZmZXIsIG9mZnNldCApIHsKKworCQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0Fy
cmF5KCBidWZmZXIsIG9mZnNldCApOworCisJCQl9CisKKwkJXSwKKworCQlTZXR0ZXJCeUJpbmRp
bmdUeXBlQW5kVmVyc2lvbmluZzogWworCisJCQlbCisJCQkJLy8gRGlyZWN0CisKKwkJCQlmdW5j
dGlvbiBzZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkgeworCisJCQkJCXRoaXMubm9k
ZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07CisKKwkJCQl9LAorCisJ
CQkJZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNl
dCApIHsKKworCQkJCQl0aGlzLm5vZGVbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9m
ZnNldCBdOworCQkJCQl0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJ
CQl9LAorCisJCQkJZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNV
cGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkgeworCisJCQkJCXRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0
eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07CisJCQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJp
eFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOworCisJCQkJfQorCisJCQldLCBbCisKKwkJCQkvLyBF
bnRpcmVBcnJheQorCisJCQkJZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0
ICkgeworCisJCQkJCXZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5OworCisJCQkJCWZv
ciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisJCQkJ
CQlkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdOworCisJCQkJCX0KKworCQkJCX0sCisK
KwkJCQlmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZz
ZXQgKSB7CisKKwkJCQkJdmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7CisKKwkJCQkJ
Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKwkJ
CQkJCWRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07CisKKwkJCQkJfQorCisJCQkJCXRo
aXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQkJCX0sCisKKwkJCQlmdW5j
dGlvbiBzZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9m
ZnNldCApIHsKKworCQkJCQl2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTsKKworCQkJ
CQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKwor
CQkJCQkJZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTsKKworCQkJCQl9CisKKwkJCQkJ
dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCQl9
CisKKwkJCV0sIFsKKworCQkJCS8vIEFycmF5RWxlbWVudAorCisJCQkJZnVuY3Rpb24gc2V0VmFs
dWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHsKKworCQkJCQl0aGlzLnJlc29sdmVk
UHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTsKKworCQkJ
CX0sCisKKwkJCQlmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUo
IGJ1ZmZlciwgb2Zmc2V0ICkgeworCisJCQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5w
cm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdOworCQkJCQl0aGlzLnRhcmdldE9iamVj
dC5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCQl9LAorCisJCQkJZnVuY3Rpb24gc2V0VmFsdWVf
YXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkg
eworCisJCQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBi
dWZmZXJbIG9mZnNldCBdOworCQkJCQl0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRz
VXBkYXRlID0gdHJ1ZTsKKworCQkJCX0KKworCQkJXSwgWworCisJCQkJLy8gSGFzVG9Gcm9tQXJy
YXkKKworCQkJCWZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7
CisKKwkJCQkJdGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQg
KTsKKworCQkJCX0sCisKKwkJCQlmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNV
cGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkgeworCisJCQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5m
cm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7CisJCQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRz
VXBkYXRlID0gdHJ1ZTsKKworCQkJCX0sCisKKwkJCQlmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJy
YXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7CisKKwkJCQkJ
dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTsKKwkJCQkJ
dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCQl9
CisKKwkJCV0KKworCQldLAorCisJCWdldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZV91bmJvdW5k
KCB0YXJnZXRBcnJheSwgb2Zmc2V0ICkgeworCisJCQl0aGlzLmJpbmQoKTsKKwkJCXRoaXMuZ2V0
VmFsdWUoIHRhcmdldEFycmF5LCBvZmZzZXQgKTsKKworCQkJLy8gTm90ZTogVGhpcyBjbGFzcyB1
c2VzIGEgU3RhdGUgcGF0dGVybiBvbiBhIHBlci1tZXRob2QgYmFzaXM6CisJCQkvLyAnYmluZCcg
c2V0cyAndGhpcy5nZXRWYWx1ZScgLyAnc2V0VmFsdWUnIGFuZCBzaGFkb3dzIHRoZQorCQkJLy8g
cHJvdG90eXBlIHZlcnNpb24gb2YgdGhlc2UgbWV0aG9kcyB3aXRoIG9uZSB0aGF0IHJlcHJlc2Vu
dHMKKwkJCS8vIHRoZSBib3VuZCBzdGF0ZS4gV2hlbiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5k
LCB0aGUgbWV0aG9kcworCQkJLy8gYmVjb21lIG5vLW9wcy4KKworCQl9LAorCisJCXNldFZhbHVl
OiBmdW5jdGlvbiBnZXRWYWx1ZV91bmJvdW5kKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICkgeworCisJ
CQl0aGlzLmJpbmQoKTsKKwkJCXRoaXMuc2V0VmFsdWUoIHNvdXJjZUFycmF5LCBvZmZzZXQgKTsK
KworCQl9LAorCisJCS8vIGNyZWF0ZSBnZXR0ZXIgLyBzZXR0ZXIgcGFpciBmb3IgYSBwcm9wZXJ0
eSBpbiB0aGUgc2NlbmUgZ3JhcGgKKwkJYmluZDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdGFy
Z2V0T2JqZWN0ID0gdGhpcy5ub2RlLAorCQkJCXBhcnNlZFBhdGggPSB0aGlzLnBhcnNlZFBhdGgs
CisKKwkJCQlvYmplY3ROYW1lID0gcGFyc2VkUGF0aC5vYmplY3ROYW1lLAorCQkJCXByb3BlcnR5
TmFtZSA9IHBhcnNlZFBhdGgucHJvcGVydHlOYW1lLAorCQkJCXByb3BlcnR5SW5kZXggPSBwYXJz
ZWRQYXRoLnByb3BlcnR5SW5kZXg7CisKKwkJCWlmICggISB0YXJnZXRPYmplY3QgKSB7CisKKwkJ
CQl0YXJnZXRPYmplY3QgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoCisJCQkJCQl0aGlzLnJv
b3ROb2RlLCBwYXJzZWRQYXRoLm5vZGVOYW1lICkgfHwgdGhpcy5yb290Tm9kZTsKKworCQkJCXRo
aXMubm9kZSA9IHRhcmdldE9iamVjdDsKKworCQkJfQorCisJCQkvLyBzZXQgZmFpbCBzdGF0ZSBz
byB3ZSBjYW4ganVzdCAncmV0dXJuJyBvbiBlcnJvcgorCQkJdGhpcy5nZXRWYWx1ZSA9IHRoaXMu
X2dldFZhbHVlX3VuYXZhaWxhYmxlOworCQkJdGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVl
X3VuYXZhaWxhYmxlOworCisJCQkvLyBlbnN1cmUgdGhlcmUgaXMgYSB2YWx1ZSBub2RlCisJCQlp
ZiAoICEgdGFyZ2V0T2JqZWN0ICkgeworCisJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlByb3Bl
cnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogJyArIHRoaXMucGF0
aCArICcgYnV0IGl0IHdhc25cJ3QgZm91bmQuJyApOworCQkJCXJldHVybjsKKworCQkJfQorCisJ
CQlpZiAoIG9iamVjdE5hbWUgKSB7CisKKwkJCQl2YXIgb2JqZWN0SW5kZXggPSBwYXJzZWRQYXRo
Lm9iamVjdEluZGV4OworCisJCQkJLy8gc3BlY2lhbCBjYXNlcyB3ZXJlIHdlIG5lZWQgdG8gcmVh
Y2ggZGVlcGVyIGludG8gdGhlIGhpZXJhcmNoeSB0byBnZXQgdGhlIGZhY2UgbWF0ZXJpYWxzLi4u
LgorCQkJCXN3aXRjaCAoIG9iamVjdE5hbWUgKSB7CisKKwkJCQkJY2FzZSAnbWF0ZXJpYWxzJzoK
KworCQkJCQkJaWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbCApIHsKKworCQkJCQkJCWNvbnNv
bGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlh
bCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4nLCB0aGlzICk7CisJCQkJCQkJcmV0
dXJuOworCisJCQkJCQl9CisKKwkJCQkJCWlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0
ZXJpYWxzICkgeworCisJCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGlu
ZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRv
ZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuJywgdGhpcyApOworCQkJCQkJCXJldHVybjsK
KworCQkJCQkJfQorCisJCQkJCQl0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3QubWF0ZXJpYWwu
bWF0ZXJpYWxzOworCisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICdib25lcyc6CisKKwkJCQkJ
CWlmICggISB0YXJnZXRPYmplY3Quc2tlbGV0b24gKSB7CisKKwkJCQkJCQljb25zb2xlLmVycm9y
KCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBk
b2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uJywgdGhpcyApOworCQkJCQkJCXJldHVybjsKKworCQkJ
CQkJfQorCisJCQkJCQkvLyBwb3RlbnRpYWwgZnV0dXJlIG9wdGltaXphdGlvbjogc2tpcCB0aGlz
IGlmIHByb3BlcnR5SW5kZXggaXMgYWxyZWFkeSBhbiBpbnRlZ2VyCisJCQkJCQkvLyBhbmQgY29u
dmVydCB0aGUgaW50ZWdlciBzdHJpbmcgdG8gYSB0cnVlIGludGVnZXIuCisKKwkJCQkJCXRhcmdl
dE9iamVjdCA9IHRhcmdldE9iamVjdC5za2VsZXRvbi5ib25lczsKKworCQkJCQkJLy8gc3VwcG9y
dCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50byBpbmRpY2VzLgorCQkJCQkJZm9yICgg
dmFyIGkgPSAwOyBpIDwgdGFyZ2V0T2JqZWN0Lmxlbmd0aDsgaSArKyApIHsKKworCQkJCQkJCWlm
ICggdGFyZ2V0T2JqZWN0WyBpIF0ubmFtZSA9PT0gb2JqZWN0SW5kZXggKSB7CisKKwkJCQkJCQkJ
b2JqZWN0SW5kZXggPSBpOworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCX0KKworCQkJCQkJfQor
CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCisJCQkJCQlpZiAoIHRhcmdldE9iamVj
dFsgb2JqZWN0TmFtZSBdID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCQljb25zb2xlLmVycm9y
KCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gb2JqZWN0TmFtZSBvZiBu
b2RlIHVuZGVmaW5lZC4nLCB0aGlzICk7CisJCQkJCQkJcmV0dXJuOworCisJCQkJCQl9CisKKwkJ
CQkJCXRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdOworCisJCQkJfQor
CisKKwkJCQlpZiAoIG9iamVjdEluZGV4ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJaWYgKCB0
YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF0gPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJY29u
c29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2Jq
ZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4nLCB0aGlzLCB0YXJnZXRP
YmplY3QgKTsKKwkJCQkJCXJldHVybjsKKworCQkJCQl9CisKKwkJCQkJdGFyZ2V0T2JqZWN0ID0g
dGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdOworCisJCQkJfQorCisJCQl9CisKKwkJCS8vIHJl
c29sdmUgcHJvcGVydHkKKwkJCXZhciBub2RlUHJvcGVydHkgPSB0YXJnZXRPYmplY3RbIHByb3Bl
cnR5TmFtZSBdOworCisJCQlpZiAoIG5vZGVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICkgeworCisJ
CQkJdmFyIG5vZGVOYW1lID0gcGFyc2VkUGF0aC5ub2RlTmFtZTsKKworCQkJCWNvbnNvbGUuZXJy
b3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgcHJvcGVydHkgZm9y
IHRyYWNrOiAnICsgbm9kZU5hbWUgKworCQkJCQknLicgKyBwcm9wZXJ0eU5hbWUgKyAnIGJ1dCBp
dCB3YXNuXCd0IGZvdW5kLicsIHRhcmdldE9iamVjdCApOworCQkJCXJldHVybjsKKworCQkJfQor
CisJCQkvLyBkZXRlcm1pbmUgdmVyc2lvbmluZyBzY2hlbWUKKwkJCXZhciB2ZXJzaW9uaW5nID0g
dGhpcy5WZXJzaW9uaW5nLk5vbmU7CisKKwkJCWlmICggdGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRl
ICE9PSB1bmRlZmluZWQgKSB7IC8vIG1hdGVyaWFsCisKKwkJCQl2ZXJzaW9uaW5nID0gdGhpcy5W
ZXJzaW9uaW5nLk5lZWRzVXBkYXRlOworCQkJCXRoaXMudGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2Jq
ZWN0OworCisJCQl9IGVsc2UgaWYgKCB0YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0
ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBub2RlIHRyYW5zZm9ybQorCisJCQkJdmVyc2lvbmluZyA9
IHRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlOworCQkJCXRoaXMudGFyZ2V0
T2JqZWN0ID0gdGFyZ2V0T2JqZWN0OworCisJCQl9CisKKwkJCS8vIGRldGVybWluZSBob3cgdGhl
IHByb3BlcnR5IGdldHMgYm91bmQKKwkJCXZhciBiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5
cGUuRGlyZWN0OworCisJCQlpZiAoIHByb3BlcnR5SW5kZXggIT09IHVuZGVmaW5lZCApIHsKKwor
CQkJCS8vIGFjY2VzcyBhIHN1YiBlbGVtZW50IG9mIHRoZSBwcm9wZXJ0eSBhcnJheSAob25seSBw
cmltaXRpdmVzIGFyZSBzdXBwb3J0ZWQgcmlnaHQgbm93KQorCisJCQkJaWYgKCBwcm9wZXJ0eU5h
bWUgPT09ICJtb3JwaFRhcmdldEluZmx1ZW5jZXMiICkgeworCisJCQkJCS8vIHBvdGVudGlhbCBv
cHRpbWl6YXRpb24sIHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50
ZWdlciwgYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLgor
CisJCQkJCS8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNl
cy4KKwkJCQkJaWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeSApIHsKKworCQkJCQkJY29uc29s
ZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFy
Z2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5LicsIHRo
aXMgKTsKKwkJCQkJCXJldHVybjsKKworCQkJCQl9CisKKwkJCQkJaWYgKCB0YXJnZXRPYmplY3Qu
Z2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKKworCQkJCQkJaWYgKCAhIHRhcmdldE9iamVj
dC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgKSB7CisKKwkJCQkJCQljb25zb2xlLmVycm9yKCAn
VEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVu
Y2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVz
LicsIHRoaXMgKTsKKwkJCQkJCQlyZXR1cm47CisKKwkJCQkJCX0KKworCQkJCQkJZm9yICggdmFy
IGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5s
ZW5ndGg7IGkgKysgKSB7CisKKwkJCQkJCQlpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3Jw
aEF0dHJpYnV0ZXMucG9zaXRpb25bIGkgXS5uYW1lID09PSBwcm9wZXJ0eUluZGV4ICkgeworCisJ
CQkJCQkJCXByb3BlcnR5SW5kZXggPSBpOworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCX0KKwor
CQkJCQkJfQorCisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJaWYgKCAhIHRhcmdldE9iamVjdC5n
ZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7CisKKwkJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUu
UHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJl
Y2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhUYXJnZXRzLicsIHRoaXMg
KTsKKwkJCQkJCQlyZXR1cm47CisKKwkJCQkJCX0KKworCQkJCQkJZm9yICggdmFyIGkgPSAwOyBp
IDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgKysgKSB7CisKKwkJ
CQkJCQlpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS5uYW1lID09
PSBwcm9wZXJ0eUluZGV4ICkgeworCisJCQkJCQkJCXByb3BlcnR5SW5kZXggPSBpOworCQkJCQkJ
CQlicmVhazsKKworCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCX0KKworCQkJ
CWJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7CisKKwkJCQl0aGlz
LnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7CisJCQkJdGhpcy5wcm9wZXJ0eUluZGV4
ID0gcHJvcGVydHlJbmRleDsKKworCQkJfSBlbHNlIGlmICggbm9kZVByb3BlcnR5LmZyb21BcnJh
eSAhPT0gdW5kZWZpbmVkICYmIG5vZGVQcm9wZXJ0eS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7
CisKKwkJCQkvLyBtdXN0IHVzZSBjb3B5IGZvciBPYmplY3QzRC5FdWxlci9RdWF0ZXJuaW9uCisK
KwkJCQliaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXk7CisKKwkJ
CQl0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7CisKKwkJCX0gZWxzZSBpZiAo
IEFycmF5LmlzQXJyYXkoIG5vZGVQcm9wZXJ0eSApICkgeworCisJCQkJYmluZGluZ1R5cGUgPSB0
aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5OworCisJCQkJdGhpcy5yZXNvbHZlZFByb3BlcnR5
ID0gbm9kZVByb3BlcnR5OworCisJCQl9IGVsc2UgeworCisJCQkJdGhpcy5wcm9wZXJ0eU5hbWUg
PSBwcm9wZXJ0eU5hbWU7CisKKwkJCX0KKworCQkJLy8gc2VsZWN0IGdldHRlciAvIHNldHRlcgor
CQkJdGhpcy5nZXRWYWx1ZSA9IHRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVsgYmluZGluZ1R5cGUg
XTsKKwkJCXRoaXMuc2V0VmFsdWUgPSB0aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9u
aW5nWyBiaW5kaW5nVHlwZSBdWyB2ZXJzaW9uaW5nIF07CisKKwkJfSwKKworCQl1bmJpbmQ6IGZ1
bmN0aW9uICgpIHsKKworCQkJdGhpcy5ub2RlID0gbnVsbDsKKworCQkJLy8gYmFjayB0byB0aGUg
cHJvdG90eXBlIHZlcnNpb24gb2YgZ2V0VmFsdWUgLyBzZXRWYWx1ZQorCQkJLy8gbm90ZTogYXZv
aWRpbmcgdG8gbXV0YXRlIHRoZSBzaGFwZSBvZiAndGhpcycgdmlhICdkZWxldGUnCisJCQl0aGlz
LmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5ib3VuZDsKKwkJCXRoaXMuc2V0VmFsdWUgPSB0
aGlzLl9zZXRWYWx1ZV91bmJvdW5kOworCisJCX0KKworCX0gKTsKKworCS8vIVwgREVDTEFSRSBB
TElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlICEKKwlPYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJp
bmRpbmcucHJvdG90eXBlLCB7CisKKwkJLy8gaW5pdGlhbCBzdGF0ZSBvZiB0aGVzZSBtZXRob2Rz
IHRoYXQgY2FsbHMgJ2JpbmQnCisJCV9nZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcu
cHJvdG90eXBlLmdldFZhbHVlLAorCQlfc2V0VmFsdWVfdW5ib3VuZDogUHJvcGVydHlCaW5kaW5n
LnByb3RvdHlwZS5zZXRWYWx1ZSwKKworCX0gKTsKKworCS8qKgorCSAqCisJICogQSBncm91cCBv
ZiBvYmplY3RzIHRoYXQgcmVjZWl2ZXMgYSBzaGFyZWQgYW5pbWF0aW9uIHN0YXRlLgorCSAqCisJ
ICogVXNhZ2U6CisJICoKKwkgKiAJLQlBZGQgb2JqZWN0cyB5b3Ugd291bGQgb3RoZXJ3aXNlIHBh
c3MgYXMgJ3Jvb3QnIHRvIHRoZQorCSAqIAkJY29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9u
IG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci4KKwkgKgorCSAqIAktCUluc3RlYWQgcGFzcyB0aGlz
IG9iamVjdCBhcyAncm9vdCcuCisJICoKKwkgKiAJLQlZb3UgY2FuIGFsc28gYWRkIGFuZCByZW1v
dmUgb2JqZWN0cyBsYXRlciB3aGVuIHRoZSBtaXhlcgorCSAqIAkJaXMgcnVubmluZy4KKwkgKgor
CSAqIE5vdGU6CisJICoKKwkgKiAgCU9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcHBlYXIgYXMgb25l
IG9iamVjdCB0byB0aGUgbWl4ZXIsCisJICogIAlzbyBjYWNoZSBjb250cm9sIG9mIHRoZSBpbmRp
dmlkdWFsIG9iamVjdHMgbXVzdCBiZSBkb25lCisJICogIAlvbiB0aGUgZ3JvdXAuCisJICoKKwkg
KiBMaW1pdGF0aW9uOgorCSAqCisJICogCS0gCVRoZSBhbmltYXRlZCBwcm9wZXJ0aWVzIG11c3Qg
YmUgY29tcGF0aWJsZSBhbW9uZyB0aGUKKwkgKiAJCWFsbCBvYmplY3RzIGluIHRoZSBncm91cC4K
KwkgKgorCSAqICAtCUEgc2luZ2xlIHByb3BlcnR5IGNhbiBlaXRoZXIgYmUgY29udHJvbGxlZCB0
aHJvdWdoIGEKKwkgKiAgCXRhcmdldCBncm91cCBvciBkaXJlY3RseSwgYnV0IG5vdCBib3RoLgor
CSAqCisJICogQGF1dGhvciB0c2NodworCSAqLworCisJZnVuY3Rpb24gQW5pbWF0aW9uT2JqZWN0
R3JvdXAoIHZhcl9hcmdzICkgeworCisJCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgp
OworCisJCS8vIGNhY2hlZCBvYmplY3RzIGZvbGxvd2VkIGJ5IHRoZSBhY3RpdmUgb25lcworCQl0
aGlzLl9vYmplY3RzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApOwor
CisJCXRoaXMubkNhY2hlZE9iamVjdHNfID0gMDsJCQkvLyB0aHJlc2hvbGQKKwkJLy8gbm90ZTog
cmVhZCBieSBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlCisKKwkJdmFyIGluZGljZXMgPSB7fTsK
KwkJdGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7CQkvLyBmb3IgYm9va2tlZXBpbmcKKwor
CQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkg
eworCisJCQlpbmRpY2VzWyBhcmd1bWVudHNbIGkgXS51dWlkIF0gPSBpOworCisJCX0KKworCQl0
aGlzLl9wYXRocyA9IFtdOwkJCQkJLy8gaW5zaWRlOiBzdHJpbmcKKwkJdGhpcy5fcGFyc2VkUGF0
aHMgPSBbXTsJCQkJLy8gaW5zaWRlOiB7IHdlIGRvbid0IGNhcmUsIGhlcmUgfQorCQl0aGlzLl9i
aW5kaW5ncyA9IFtdOyAJCQkJLy8gaW5zaWRlOiBBcnJheTwgUHJvcGVydHlCaW5kaW5nID4KKwkJ
dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoID0ge307IAkvLyBpbnNpZGU6IGluZGljZXMgaW4g
dGhlc2UgYXJyYXlzCisKKwkJdmFyIHNjb3BlID0gdGhpczsKKworCQl0aGlzLnN0YXRzID0gewor
CisJCQlvYmplY3RzOiB7CisJCQkJZ2V0IHRvdGFsKCkgeyByZXR1cm4gc2NvcGUuX29iamVjdHMu
bGVuZ3RoOyB9LAorCQkJCWdldCBpblVzZSgpIHsgcmV0dXJuIHRoaXMudG90YWwgLSBzY29wZS5u
Q2FjaGVkT2JqZWN0c187IH0KKwkJCX0sCisKKwkJCWdldCBiaW5kaW5nc1Blck9iamVjdCgpIHsg
cmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7IH0KKworCQl9OworCisJfQorCisJT2JqZWN0
LmFzc2lnbiggQW5pbWF0aW9uT2JqZWN0R3JvdXAucHJvdG90eXBlLCB7CisKKwkJaXNBbmltYXRp
b25PYmplY3RHcm91cDogdHJ1ZSwKKworCQlhZGQ6IGZ1bmN0aW9uKCB2YXJfYXJncyApIHsKKwor
CQkJdmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLAorCQkJCW5PYmplY3RzID0gb2JqZWN0cy5s
ZW5ndGgsCisJCQkJbkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXywKKwkJCQlp
bmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCwKKwkJCQlwYXRocyA9IHRoaXMuX3Bh
dGhzLAorCQkJCXBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsCisJCQkJYmluZGluZ3Mg
PSB0aGlzLl9iaW5kaW5ncywKKwkJCQluQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7CisKKwkJ
CWZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7
CisKKwkJCQl2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sCisJCQkJCXV1aWQgPSBvYmplY3Qu
dXVpZCwKKwkJCQkJaW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF0sCisJCQkJCWtub3duT2Jq
ZWN0ID0gdW5kZWZpbmVkOworCisJCQkJaWYgKCBpbmRleCA9PT0gdW5kZWZpbmVkICkgeworCisJ
CQkJCS8vIHVua25vd24gb2JqZWN0IC0+IGFkZCBpdCB0byB0aGUgQUNUSVZFIHJlZ2lvbgorCisJ
CQkJCWluZGV4ID0gbk9iamVjdHMgKys7CisJCQkJCWluZGljZXNCeVVVSURbIHV1aWQgXSA9IGlu
ZGV4OworCQkJCQlvYmplY3RzLnB1c2goIG9iamVjdCApOworCisJCQkJCS8vIGFjY291bnRpbmcg
aXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3MKKworCQkJCQlmb3IgKCB2
YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7CisKKwkJCQkJCWJpbmRp
bmdzWyBqIF0ucHVzaCgKKwkJCQkJCQkJbmV3IFByb3BlcnR5QmluZGluZygKKwkJCQkJCQkJCW9i
amVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApICk7CisKKwkJCQkJfQorCisJCQkJ
fSBlbHNlIGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHsKKworCQkJCQlrbm93bk9iamVj
dCA9IG9iamVjdHNbIGluZGV4IF07CisKKwkJCQkJLy8gbW92ZSBleGlzdGluZyBvYmplY3QgdG8g
dGhlIEFDVElWRSByZWdpb24KKworCQkJCQl2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNo
ZWRPYmplY3RzLAorCQkJCQkJbGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZl
SW5kZXggXTsKKworCQkJCQlpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9
IGluZGV4OworCQkJCQlvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDsKKworCQkJ
CQlpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4OworCQkJCQlvYmplY3Rz
WyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBvYmplY3Q7CisKKwkJCQkJLy8gYWNjb3VudGluZyBpcyBk
b25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5ncworCisJCQkJCWZvciAoIHZhciBq
ID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHsKKworCQkJCQkJdmFyIGJpbmRp
bmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sCisJCQkJCQkJbGFzdENhY2hlZCA9IGJpbmRpbmdz
Rm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdLAorCQkJCQkJCWJpbmRpbmcgPSBiaW5kaW5nc0Zv
clBhdGhbIGluZGV4IF07CisKKwkJCQkJCWJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RD
YWNoZWQ7CisKKwkJCQkJCWlmICggYmluZGluZyA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCQkJ
Ly8gc2luY2Ugd2UgZG8gbm90IGJvdGhlciB0byBjcmVhdGUgbmV3IGJpbmRpbmdzCisJCQkJCQkJ
Ly8gZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkLCB0aGUgYmluZGluZyBtYXkKKwkJCQkJCQkv
LyBvciBtYXkgbm90IGV4aXN0CisKKwkJCQkJCQliaW5kaW5nID0gbmV3IFByb3BlcnR5QmluZGlu
ZygKKwkJCQkJCQkJCW9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApOworCisJ
CQkJCQl9CisKKwkJCQkJCWJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdID0gYmlu
ZGluZzsKKworCQkJCQl9CisKKwkJCQl9IGVsc2UgaWYgKCBvYmplY3RzWyBpbmRleCBdICE9PSBr
bm93bk9iamVjdCApIHsKKworCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuQW5pbWF0aW9uT2Jq
ZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCAnICsKKwkJCQkJ
CQknZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVj
dHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuJyApOworCisJCQkJfSAvLyBlbHNlIHRoZSBvYmpl
Y3QgaXMgYWxyZWFkeSB3aGVyZSB3ZSB3YW50IGl0IHRvIGJlCisKKwkJCX0gLy8gZm9yIGFyZ3Vt
ZW50cworCisJCQl0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzOworCisJCX0s
CisKKwkJcmVtb3ZlOiBmdW5jdGlvbiggdmFyX2FyZ3MgKSB7CisKKwkJCXZhciBvYmplY3RzID0g
dGhpcy5fb2JqZWN0cywKKwkJCQluQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNf
LAorCQkJCWluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELAorCQkJCWJpbmRpbmdz
ID0gdGhpcy5fYmluZGluZ3MsCisJCQkJbkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoOworCisJ
CQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkg
eworCisJCQkJdmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLAorCQkJCQl1dWlkID0gb2JqZWN0
LnV1aWQsCisJCQkJCWluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdOworCisJCQkJaWYgKCBp
bmRleCAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID49IG5DYWNoZWRPYmplY3RzICkgeworCisJCQkJ
CS8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IGludG8gdGhlIENBQ0hFRCByZWdpb24KKworCQkJCQl2
YXIgbGFzdENhY2hlZEluZGV4ID0gbkNhY2hlZE9iamVjdHMgKyssCisJCQkJCQlmaXJzdEFjdGl2
ZU9iamVjdCA9IG9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdOworCisJCQkJCWluZGljZXNCeVVV
SURbIGZpcnN0QWN0aXZlT2JqZWN0LnV1aWQgXSA9IGluZGV4OworCQkJCQlvYmplY3RzWyBpbmRl
eCBdID0gZmlyc3RBY3RpdmVPYmplY3Q7CisKKwkJCQkJaW5kaWNlc0J5VVVJRFsgdXVpZCBdID0g
bGFzdENhY2hlZEluZGV4OworCQkJCQlvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXSA9IG9iamVj
dDsKKworCQkJCQkvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxs
IGJpbmRpbmdzCisKKwkJCQkJZm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBt
OyArKyBqICkgeworCisJCQkJCQl2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSwK
KwkJCQkJCQlmaXJzdEFjdGl2ZSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0s
CisJCQkJCQkJYmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTsKKworCQkJCQkJYmlu
ZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gZmlyc3RBY3RpdmU7CisJCQkJCQliaW5kaW5nc0ZvclBh
dGhbIGxhc3RDYWNoZWRJbmRleCBdID0gYmluZGluZzsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJ
CX0gLy8gZm9yIGFyZ3VtZW50cworCisJCQl0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRP
YmplY3RzOworCisJCX0sCisKKwkJLy8gcmVtb3ZlICYgZm9yZ2V0CisJCXVuY2FjaGU6IGZ1bmN0
aW9uKCB2YXJfYXJncyApIHsKKworCQkJdmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLAorCQkJ
CW5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsCisJCQkJbkNhY2hlZE9iamVjdHMgPSB0aGlzLm5D
YWNoZWRPYmplY3RzXywKKwkJCQlpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCwK
KwkJCQliaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLAorCQkJCW5CaW5kaW5ncyA9IGJpbmRpbmdz
Lmxlbmd0aDsKKworCQkJZm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAh
PT0gbjsgKysgaSApIHsKKworCQkJCXZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSwKKwkJCQkJ
dXVpZCA9IG9iamVjdC51dWlkLAorCQkJCQlpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTsK
KworCQkJCWlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQlkZWxldGUgaW5kaWNl
c0J5VVVJRFsgdXVpZCBdOworCisJCQkJCWlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHsK
KworCQkJCQkJLy8gb2JqZWN0IGlzIGNhY2hlZCwgc2hyaW5rIHRoZSBDQUNIRUQgcmVnaW9uCisK
KwkJCQkJCXZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsCisJCQkJCQkJ
bGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSwKKwkJCQkJCQls
YXN0SW5kZXggPSAtLSBuT2JqZWN0cywKKwkJCQkJCQlsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFz
dEluZGV4IF07CisKKwkJCQkJCS8vIGxhc3QgY2FjaGVkIG9iamVjdCB0YWtlcyB0aGlzIG9iamVj
dCdzIHBsYWNlCisJCQkJCQlpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9
IGluZGV4OworCQkJCQkJb2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7CisKKwkJ
CQkJCS8vIGxhc3Qgb2JqZWN0IGdvZXMgdG8gdGhlIGFjdGl2YXRlZCBzbG90IGFuZCBwb3AKKwkJ
CQkJCWluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDsK
KwkJCQkJCW9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3RPYmplY3Q7CisJCQkJCQlv
YmplY3RzLnBvcCgpOworCisJCQkJCQkvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUg
c2FtZSBmb3IgYWxsIGJpbmRpbmdzCisKKwkJCQkJCWZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5k
aW5nczsgaiAhPT0gbTsgKysgaiApIHsKKworCQkJCQkJCXZhciBiaW5kaW5nc0ZvclBhdGggPSBi
aW5kaW5nc1sgaiBdLAorCQkJCQkJCQlsYXN0Q2FjaGVkID0gYmluZGluZ3NGb3JQYXRoWyBmaXJz
dEFjdGl2ZUluZGV4IF0sCisJCQkJCQkJCWxhc3QgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RJbmRl
eCBdOworCisJCQkJCQkJYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gbGFzdENhY2hlZDsKKwkJ
CQkJCQliaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3Q7CisJCQkJCQkJ
YmluZGluZ3NGb3JQYXRoLnBvcCgpOworCisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIHsKKworCQkJ
CQkJLy8gb2JqZWN0IGlzIGFjdGl2ZSwganVzdCBzd2FwIHdpdGggdGhlIGxhc3QgYW5kIHBvcAor
CisJCQkJCQl2YXIgbGFzdEluZGV4ID0gLS0gbk9iamVjdHMsCisJCQkJCQkJbGFzdE9iamVjdCA9
IG9iamVjdHNbIGxhc3RJbmRleCBdOworCisJCQkJCQlpbmRpY2VzQnlVVUlEWyBsYXN0T2JqZWN0
LnV1aWQgXSA9IGluZGV4OworCQkJCQkJb2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7CisJ
CQkJCQlvYmplY3RzLnBvcCgpOworCisJCQkJCQkvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBk
byB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzCisKKwkJCQkJCWZvciAoIHZhciBqID0gMCwgbSA9
IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHsKKworCQkJCQkJCXZhciBiaW5kaW5nc0ZvclBh
dGggPSBiaW5kaW5nc1sgaiBdOworCisJCQkJCQkJYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0g
YmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTsKKwkJCQkJCQliaW5kaW5nc0ZvclBhdGgucG9w
KCk7CisKKwkJCQkJCX0KKworCQkJCQl9IC8vIGNhY2hlZCBvciBhY3RpdmUKKworCQkJCX0gLy8g
aWYgb2JqZWN0IGlzIGtub3duCisKKwkJCX0gLy8gZm9yIGFyZ3VtZW50cworCisJCQl0aGlzLm5D
YWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzOworCisJCX0sCisKKwkJLy8gSW50ZXJuYWwg
aW50ZXJmYWNlIHVzZWQgYnkgYmVmcmllbmRlZCBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlOgor
CisJCXN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCwgcGFyc2VkUGF0aCApIHsKKworCQkJLy8g
cmV0dXJucyBhbiBhcnJheSBvZiBiaW5kaW5ncyBmb3IgdGhlIGdpdmVuIHBhdGggdGhhdCBpcyBj
aGFuZ2VkCisJCQkvLyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRhaW5lZCBvYmplY3RzIGluIHRoZSBn
cm91cAorCisJCQl2YXIgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0
aCwKKwkJCQlpbmRleCA9IGluZGljZXNCeVBhdGhbIHBhdGggXSwKKwkJCQliaW5kaW5ncyA9IHRo
aXMuX2JpbmRpbmdzOworCisJCQlpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gYmlu
ZGluZ3NbIGluZGV4IF07CisKKwkJCXZhciBwYXRocyA9IHRoaXMuX3BhdGhzLAorCQkJCXBhcnNl
ZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsCisJCQkJb2JqZWN0cyA9IHRoaXMuX29iamVjdHMs
CisJCQkJbk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCwKKwkJCQluQ2FjaGVkT2JqZWN0cyA9IHRo
aXMubkNhY2hlZE9iamVjdHNfLAorCQkJCWJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9i
amVjdHMgKTsKKworCQkJaW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7CisKKwkJCWluZGljZXNCeVBh
dGhbIHBhdGggXSA9IGluZGV4OworCisJCQlwYXRocy5wdXNoKCBwYXRoICk7CisJCQlwYXJzZWRQ
YXRocy5wdXNoKCBwYXJzZWRQYXRoICk7CisJCQliaW5kaW5ncy5wdXNoKCBiaW5kaW5nc0ZvclBh
dGggKTsKKworCQkJZm9yICggdmFyIGkgPSBuQ2FjaGVkT2JqZWN0cywgbiA9IG9iamVjdHMubGVu
Z3RoOyBpICE9PSBuOyArKyBpICkgeworCisJCQkJdmFyIG9iamVjdCA9IG9iamVjdHNbIGkgXTsK
KwkJCQliaW5kaW5nc0ZvclBhdGhbIGkgXSA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwg
cGF0aCwgcGFyc2VkUGF0aCApOworCisJCQl9CisKKwkJCXJldHVybiBiaW5kaW5nc0ZvclBhdGg7
CisKKwkJfSwKKworCQl1bnN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCApIHsKKworCQkJLy8g
dGVsbHMgdGhlIGdyb3VwIHRvIGZvcmdldCBhYm91dCBhIHByb3BlcnR5IHBhdGggYW5kIG5vIGxv
bmdlcgorCQkJLy8gdXBkYXRlIHRoZSBhcnJheSBwcmV2aW91c2x5IG9idGFpbmVkIHdpdGggJ3N1
YnNjcmliZV8nCisKKwkJCXZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2Vz
QnlQYXRoLAorCQkJCWluZGV4ID0gaW5kaWNlc0J5UGF0aFsgcGF0aCBdOworCisJCQlpZiAoIGlu
ZGV4ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQl2YXIgcGF0aHMgPSB0aGlzLl9wYXRocywKKwkJ
CQkJcGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocywKKwkJCQkJYmluZGluZ3MgPSB0aGlz
Ll9iaW5kaW5ncywKKwkJCQkJbGFzdEJpbmRpbmdzSW5kZXggPSBiaW5kaW5ncy5sZW5ndGggLSAx
LAorCQkJCQlsYXN0QmluZGluZ3MgPSBiaW5kaW5nc1sgbGFzdEJpbmRpbmdzSW5kZXggXSwKKwkJ
CQkJbGFzdEJpbmRpbmdzUGF0aCA9IHBhdGhbIGxhc3RCaW5kaW5nc0luZGV4IF07CisKKwkJCQlp
bmRpY2VzQnlQYXRoWyBsYXN0QmluZGluZ3NQYXRoIF0gPSBpbmRleDsKKworCQkJCWJpbmRpbmdz
WyBpbmRleCBdID0gbGFzdEJpbmRpbmdzOworCQkJCWJpbmRpbmdzLnBvcCgpOworCisJCQkJcGFy
c2VkUGF0aHNbIGluZGV4IF0gPSBwYXJzZWRQYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTsKKwkJ
CQlwYXJzZWRQYXRocy5wb3AoKTsKKworCQkJCXBhdGhzWyBpbmRleCBdID0gcGF0aHNbIGxhc3RC
aW5kaW5nc0luZGV4IF07CisJCQkJcGF0aHMucG9wKCk7CisKKwkJCX0KKworCQl9CisKKwl9ICk7
CisKKwkvKioKKwkgKgorCSAqIEFjdGlvbiBwcm92aWRlZCBieSBBbmltYXRpb25NaXhlciBmb3Ig
c2NoZWR1bGluZyBjbGlwIHBsYXliYWNrIG9uIHNwZWNpZmljCisJICogb2JqZWN0cy4KKwkgKgor
CSAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCisJICogQGF1dGhvciBE
YXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCisJICogQGF1dGhvciB0c2NodworCSAq
CisJICovCisKKwlmdW5jdGlvbiBBbmltYXRpb25BY3Rpb24oIG1peGVyLCBjbGlwLCBsb2NhbFJv
b3QgKSB7CisKKwkJdGhpcy5fbWl4ZXIgPSBtaXhlcjsKKwkJdGhpcy5fY2xpcCA9IGNsaXA7CisJ
CXRoaXMuX2xvY2FsUm9vdCA9IGxvY2FsUm9vdCB8fCBudWxsOworCisJCXZhciB0cmFja3MgPSBj
bGlwLnRyYWNrcywKKwkJCW5UcmFja3MgPSB0cmFja3MubGVuZ3RoLAorCQkJaW50ZXJwb2xhbnRz
ID0gbmV3IEFycmF5KCBuVHJhY2tzICk7CisKKwkJdmFyIGludGVycG9sYW50U2V0dGluZ3MgPSB7
CisJCQkJZW5kaW5nU3RhcnQ6IAlaZXJvQ3VydmF0dXJlRW5kaW5nLAorCQkJCWVuZGluZ0VuZDoJ
CVplcm9DdXJ2YXR1cmVFbmRpbmcKKwkJfTsKKworCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5U
cmFja3M7ICsrIGkgKSB7CisKKwkJCXZhciBpbnRlcnBvbGFudCA9IHRyYWNrc1sgaSBdLmNyZWF0
ZUludGVycG9sYW50KCBudWxsICk7CisJCQlpbnRlcnBvbGFudHNbIGkgXSA9IGludGVycG9sYW50
OworCQkJaW50ZXJwb2xhbnQuc2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzOworCisJCX0K
KworCQl0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5nczsKKwor
CQl0aGlzLl9pbnRlcnBvbGFudHMgPSBpbnRlcnBvbGFudHM7CS8vIGJvdW5kIGJ5IHRoZSBtaXhl
cgorCisJCS8vIGluc2lkZTogUHJvcGVydHlNaXhlciAobWFuYWdlZCBieSB0aGUgbWl4ZXIpCisJ
CXRoaXMuX3Byb3BlcnR5QmluZGluZ3MgPSBuZXcgQXJyYXkoIG5UcmFja3MgKTsKKworCQl0aGlz
Ll9jYWNoZUluZGV4ID0gbnVsbDsJCQkvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyCisJCXRoaXMu
X2J5Q2xpcENhY2hlSW5kZXggPSBudWxsOwkJLy8gZm9yIHRoZSBtZW1vcnkgbWFuYWdlcgorCisJ
CXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVsbDsKKwkJdGhpcy5fd2VpZ2h0SW50ZXJw
b2xhbnQgPSBudWxsOworCisJCXRoaXMubG9vcCA9IExvb3BSZXBlYXQ7CisJCXRoaXMuX2xvb3BD
b3VudCA9IC0xOworCisJCS8vIGdsb2JhbCBtaXhlciB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyB0
byBiZSBzdGFydGVkCisJCS8vIGl0J3Mgc2V0IGJhY2sgdG8gJ251bGwnIHVwb24gc3RhcnQgb2Yg
dGhlIGFjdGlvbgorCQl0aGlzLl9zdGFydFRpbWUgPSBudWxsOworCisJCS8vIHNjYWxlZCBsb2Nh
bCB0aW1lIG9mIHRoZSBhY3Rpb24KKwkJLy8gZ2V0cyBjbGFtcGVkIG9yIHdyYXBwZWQgdG8gMC4u
Y2xpcC5kdXJhdGlvbiBhY2NvcmRpbmcgdG8gbG9vcAorCQl0aGlzLnRpbWUgPSAwOworCisJCXRo
aXMudGltZVNjYWxlID0gMTsKKwkJdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gMTsKKworCQl0
aGlzLndlaWdodCA9IDE7CisJCXRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IDE7CisKKwkJdGhpcy5y
ZXBldGl0aW9ucyA9IEluZmluaXR5OyAJCS8vIG5vLiBvZiByZXBldGl0aW9ucyB3aGVuIGxvb3Bp
bmcKKworCQl0aGlzLnBhdXNlZCA9IGZhbHNlOwkJCQkvLyB0cnVlIC0+IHplcm8gZWZmZWN0aXZl
IHRpbWUgc2NhbGUKKwkJdGhpcy5lbmFibGVkID0gdHJ1ZTsJCQkJLy8gZmFsc2UgLT4gemVybyBl
ZmZlY3RpdmUgd2VpZ2h0CisKKwkJdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCAJPSBmYWxzZTsJLy8g
a2VlcCBmZWVkaW5nIHRoZSBsYXN0IGZyYW1lPworCisJCXRoaXMuemVyb1Nsb3BlQXRTdGFydCAJ
PSB0cnVlOwkJLy8gZm9yIHNtb290aCBpbnRlcnBvbGF0aW9uIHcvbyBzZXBhcmF0ZQorCQl0aGlz
Lnplcm9TbG9wZUF0RW5kCQk9IHRydWU7CQkvLyBjbGlwcyBmb3Igc3RhcnQsIGxvb3AgYW5kIGVu
ZAorCisJfQorCisJT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQWN0aW9uLnByb3RvdHlwZSwgewor
CisJCS8vIFN0YXRlICYgU2NoZWR1bGluZworCisJCXBsYXk6IGZ1bmN0aW9uKCkgeworCisJCQl0
aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24oIHRoaXMgKTsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQlzdG9wOiBmdW5jdGlvbigpIHsKKworCQkJdGhpcy5fbWl4ZXIuX2RlYWN0aXZh
dGVBY3Rpb24oIHRoaXMgKTsKKworCQkJcmV0dXJuIHRoaXMucmVzZXQoKTsKKworCQl9LAorCisJ
CXJlc2V0OiBmdW5jdGlvbigpIHsKKworCQkJdGhpcy5wYXVzZWQgPSBmYWxzZTsKKwkJCXRoaXMu
ZW5hYmxlZCA9IHRydWU7CisKKwkJCXRoaXMudGltZSA9IDA7CQkJLy8gcmVzdGFydCBjbGlwCisJ
CQl0aGlzLl9sb29wQ291bnQgPSAtMTsJLy8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzCisJCQl0aGlz
Ll9zdGFydFRpbWUgPSBudWxsOwkvLyBmb3JnZXQgc2NoZWR1bGluZworCisJCQlyZXR1cm4gdGhp
cy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTsKKworCQl9LAorCisJCWlzUnVubmluZzogZnVu
Y3Rpb24oKSB7CisKKwkJCXJldHVybiB0aGlzLmVuYWJsZWQgJiYgISB0aGlzLnBhdXNlZCAmJiB0
aGlzLnRpbWVTY2FsZSAhPT0gMCAmJgorCQkJCQl0aGlzLl9zdGFydFRpbWUgPT09IG51bGwgJiYg
dGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7CisKKwkJfSwKKworCQkvLyByZXR1
cm4gdHJ1ZSB3aGVuIHBsYXkgaGFzIGJlZW4gY2FsbGVkCisJCWlzU2NoZWR1bGVkOiBmdW5jdGlv
bigpIHsKKworCQkJcmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApOwor
CisJCX0sCisKKwkJc3RhcnRBdDogZnVuY3Rpb24oIHRpbWUgKSB7CisKKwkJCXRoaXMuX3N0YXJ0
VGltZSA9IHRpbWU7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0TG9vcDogZnVu
Y3Rpb24oIG1vZGUsIHJlcGV0aXRpb25zICkgeworCisJCQl0aGlzLmxvb3AgPSBtb2RlOworCQkJ
dGhpcy5yZXBldGl0aW9ucyA9IHJlcGV0aXRpb25zOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9
LAorCisJCS8vIFdlaWdodAorCisJCS8vIHNldCB0aGUgd2VpZ2h0IHN0b3BwaW5nIGFueSBzY2hl
ZHVsZWQgZmFkaW5nCisJCS8vIGFsdGhvdWdoIC5lbmFibGVkID0gZmFsc2UgeWllbGRzIGFuIGVm
ZmVjdGl2ZSB3ZWlnaHQgb2YgemVybywgdGhpcworCQkvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFu
Z2UgLmVuYWJsZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nCisJCXNldEVmZmVjdGl2
ZVdlaWdodDogZnVuY3Rpb24oIHdlaWdodCApIHsKKworCQkJdGhpcy53ZWlnaHQgPSB3ZWlnaHQ7
CisKKwkJCS8vIG5vdGU6IHNhbWUgbG9naWMgYXMgd2hlbiB1cGRhdGVkIGF0IHJ1bnRpbWUKKwkJ
CXRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHRoaXMuZW5hYmxlZCA/IHdlaWdodCA6IDA7CisKKwkJ
CXJldHVybiB0aGlzLnN0b3BGYWRpbmcoKTsKKworCQl9LAorCisJCS8vIHJldHVybiB0aGUgd2Vp
Z2h0IGNvbnNpZGVyaW5nIGZhZGluZyBhbmQgLmVuYWJsZWQKKwkJZ2V0RWZmZWN0aXZlV2VpZ2h0
OiBmdW5jdGlvbigpIHsKKworCQkJcmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodDsKKworCQl9
LAorCisJCWZhZGVJbjogZnVuY3Rpb24oIGR1cmF0aW9uICkgeworCisJCQlyZXR1cm4gdGhpcy5f
c2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAwLCAxICk7CisKKwkJfSwKKworCQlmYWRlT3V0OiBm
dW5jdGlvbiggZHVyYXRpb24gKSB7CisKKwkJCXJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZygg
ZHVyYXRpb24sIDEsIDAgKTsKKworCQl9LAorCisJCWNyb3NzRmFkZUZyb206IGZ1bmN0aW9uKCBm
YWRlT3V0QWN0aW9uLCBkdXJhdGlvbiwgd2FycCApIHsKKworCQkJZmFkZU91dEFjdGlvbi5mYWRl
T3V0KCBkdXJhdGlvbiApOworCQkJdGhpcy5mYWRlSW4oIGR1cmF0aW9uICk7CisKKwkJCWlmKCB3
YXJwICkgeworCisJCQkJdmFyIGZhZGVJbkR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbiwK
KwkJCQkJZmFkZU91dER1cmF0aW9uID0gZmFkZU91dEFjdGlvbi5fY2xpcC5kdXJhdGlvbiwKKwor
CQkJCQlzdGFydEVuZFJhdGlvID0gZmFkZU91dER1cmF0aW9uIC8gZmFkZUluRHVyYXRpb24sCisJ
CQkJCWVuZFN0YXJ0UmF0aW8gPSBmYWRlSW5EdXJhdGlvbiAvIGZhZGVPdXREdXJhdGlvbjsKKwor
CQkJCWZhZGVPdXRBY3Rpb24ud2FycCggMS4wLCBzdGFydEVuZFJhdGlvLCBkdXJhdGlvbiApOwor
CQkJCXRoaXMud2FycCggZW5kU3RhcnRSYXRpbywgMS4wLCBkdXJhdGlvbiApOworCisJCQl9CisK
KwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY3Jvc3NGYWRlVG86IGZ1bmN0aW9uKCBmYWRl
SW5BY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkgeworCisJCQlyZXR1cm4gZmFkZUluQWN0aW9uLmNy
b3NzRmFkZUZyb20oIHRoaXMsIGR1cmF0aW9uLCB3YXJwICk7CisKKwkJfSwKKworCQlzdG9wRmFk
aW5nOiBmdW5jdGlvbigpIHsKKworCQkJdmFyIHdlaWdodEludGVycG9sYW50ID0gdGhpcy5fd2Vp
Z2h0SW50ZXJwb2xhbnQ7CisKKwkJCWlmICggd2VpZ2h0SW50ZXJwb2xhbnQgIT09IG51bGwgKSB7
CisKKwkJCQl0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7CisJCQkJdGhpcy5fbWl4ZXIu
X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB3ZWlnaHRJbnRlcnBvbGFudCApOworCisJCQl9
CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJLy8gVGltZSBTY2FsZSBDb250cm9sCisK
KwkJLy8gc2V0IHRoZSB0aW1lIHNjYWxlIHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgd2FycGluZwor
CQkvLyBhbHRob3VnaCAucGF1c2VkID0gdHJ1ZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHRpbWUgc2Nh
bGUgb2YgemVybywgdGhpcworCQkvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLnBhdXNlZCwg
YmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmcKKwkJc2V0RWZmZWN0aXZlVGltZVNjYWxlOiBm
dW5jdGlvbiggdGltZVNjYWxlICkgeworCisJCQl0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTsK
KwkJCXRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRoaXMucGF1c2VkID8gMCA6dGltZVNjYWxl
OworCisJCQlyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpOworCisJCX0sCisKKwkJLy8gcmV0dXJu
IHRoZSB0aW1lIHNjYWxlIGNvbnNpZGVyaW5nIHdhcnBpbmcgYW5kIC5wYXVzZWQKKwkJZ2V0RWZm
ZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbigpIHsKKworCQkJcmV0dXJuIHRoaXMuX2VmZmVjdGl2
ZVRpbWVTY2FsZTsKKworCQl9LAorCisJCXNldER1cmF0aW9uOiBmdW5jdGlvbiggZHVyYXRpb24g
KSB7CisKKwkJCXRoaXMudGltZVNjYWxlID0gdGhpcy5fY2xpcC5kdXJhdGlvbiAvIGR1cmF0aW9u
OworCisJCQlyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpOworCisJCX0sCisKKwkJc3luY1dpdGg6
IGZ1bmN0aW9uKCBhY3Rpb24gKSB7CisKKwkJCXRoaXMudGltZSA9IGFjdGlvbi50aW1lOworCQkJ
dGhpcy50aW1lU2NhbGUgPSBhY3Rpb24udGltZVNjYWxlOworCisJCQlyZXR1cm4gdGhpcy5zdG9w
V2FycGluZygpOworCisJCX0sCisKKwkJaGFsdDogZnVuY3Rpb24oIGR1cmF0aW9uICkgeworCisJ
CQlyZXR1cm4gdGhpcy53YXJwKCB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsIDAsIGR1cmF0aW9u
ICk7CisKKwkJfSwKKworCQl3YXJwOiBmdW5jdGlvbiggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVT
Y2FsZSwgZHVyYXRpb24gKSB7CisKKwkJCXZhciBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBt
aXhlci50aW1lLAorCQkJCWludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQs
CisKKwkJCQl0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTsKKworCQkJaWYgKCBpbnRlcnBvbGFu
dCA9PT0gbnVsbCApIHsKKworCQkJCWludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50
ZXJwb2xhbnQoKTsKKwkJCQl0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IGludGVycG9sYW50
OworCisJCQl9CisKKwkJCXZhciB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9u
cywKKwkJCQl2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7CisKKwkJCXRpbWVzWyAw
IF0gPSBub3c7CisJCQl0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247CisKKwkJCXZhbHVlc1sg
MCBdID0gc3RhcnRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7CisJCQl2YWx1ZXNbIDEgXSA9IGVuZFRp
bWVTY2FsZSAvIHRpbWVTY2FsZTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzdG9w
V2FycGluZzogZnVuY3Rpb24oKSB7CisKKwkJCXZhciB0aW1lU2NhbGVJbnRlcnBvbGFudCA9IHRo
aXMuX3RpbWVTY2FsZUludGVycG9sYW50OworCisJCQlpZiAoIHRpbWVTY2FsZUludGVycG9sYW50
ICE9PSBudWxsICkgeworCisJCQkJdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsOwor
CQkJCXRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggdGltZVNjYWxlSW50
ZXJwb2xhbnQgKTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCS8vIE9i
amVjdCBBY2Nlc3NvcnMKKworCQlnZXRNaXhlcjogZnVuY3Rpb24oKSB7CisKKwkJCXJldHVybiB0
aGlzLl9taXhlcjsKKworCQl9LAorCisJCWdldENsaXA6IGZ1bmN0aW9uKCkgeworCisJCQlyZXR1
cm4gdGhpcy5fY2xpcDsKKworCQl9LAorCisJCWdldFJvb3Q6IGZ1bmN0aW9uKCkgeworCisJCQly
ZXR1cm4gdGhpcy5fbG9jYWxSb290IHx8IHRoaXMuX21peGVyLl9yb290OworCisJCX0sCisKKwkJ
Ly8gSW50ZXJuYQorCisJCV91cGRhdGU6IGZ1bmN0aW9uKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVE
aXJlY3Rpb24sIGFjY3VJbmRleCApIHsKKworCQkJLy8gY2FsbGVkIGJ5IHRoZSBtaXhlcgorCisJ
CQlpZiAoICEgdGhpcy5lbmFibGVkICkgeworCisJCQkJLy8gY2FsbCAuX3VwZGF0ZVdlaWdodCgp
IHRvIHVwZGF0ZSAuX2VmZmVjdGl2ZVdlaWdodAorCisJCQkJdGhpcy5fdXBkYXRlV2VpZ2h0KCB0
aW1lICk7CisJCQkJcmV0dXJuOworCisJCQl9CisKKwkJCXZhciBzdGFydFRpbWUgPSB0aGlzLl9z
dGFydFRpbWU7CisKKwkJCWlmICggc3RhcnRUaW1lICE9PSBudWxsICkgeworCisJCQkJLy8gY2hl
Y2sgZm9yIHNjaGVkdWxlZCBzdGFydCBvZiBhY3Rpb24KKworCQkJCXZhciB0aW1lUnVubmluZyA9
ICggdGltZSAtIHN0YXJ0VGltZSApICogdGltZURpcmVjdGlvbjsKKwkJCQlpZiAoIHRpbWVSdW5u
aW5nIDwgMCB8fCB0aW1lRGlyZWN0aW9uID09PSAwICkgeworCisJCQkJCXJldHVybjsgLy8geWV0
IHRvIGNvbWUgLyBkb24ndCBkZWNpZGUgd2hlbiBkZWx0YSA9IDAKKworCQkJCX0KKworCQkJCS8v
IHN0YXJ0CisKKwkJCQl0aGlzLl9zdGFydFRpbWUgPSBudWxsOyAvLyB1bnNjaGVkdWxlCisJCQkJ
ZGVsdGFUaW1lID0gdGltZURpcmVjdGlvbiAqIHRpbWVSdW5uaW5nOworCisJCQl9CisKKwkJCS8v
IGFwcGx5IHRpbWUgc2NhbGUgYW5kIGFkdmFuY2UgdGltZQorCisJCQlkZWx0YVRpbWUgKj0gdGhp
cy5fdXBkYXRlVGltZVNjYWxlKCB0aW1lICk7CisJCQl2YXIgY2xpcFRpbWUgPSB0aGlzLl91cGRh
dGVUaW1lKCBkZWx0YVRpbWUgKTsKKworCQkJLy8gbm90ZTogX3VwZGF0ZVRpbWUgbWF5IGRpc2Fi
bGUgdGhlIGFjdGlvbiByZXN1bHRpbmcgaW4KKwkJCS8vIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2Yg
MAorCisJCQl2YXIgd2VpZ2h0ID0gdGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7CisKKwkJCWlm
ICggd2VpZ2h0ID4gMCApIHsKKworCQkJCXZhciBpbnRlcnBvbGFudHMgPSB0aGlzLl9pbnRlcnBv
bGFudHM7CisJCQkJdmFyIHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5nczsK
KworCQkJCWZvciAoIHZhciBqID0gMCwgbSA9IGludGVycG9sYW50cy5sZW5ndGg7IGogIT09IG07
ICsrIGogKSB7CisKKwkJCQkJaW50ZXJwb2xhbnRzWyBqIF0uZXZhbHVhdGUoIGNsaXBUaW1lICk7
CisJCQkJCXByb3BlcnR5TWl4ZXJzWyBqIF0uYWNjdW11bGF0ZSggYWNjdUluZGV4LCB3ZWlnaHQg
KTsKKworCQkJCX0KKworCQkJfQorCisJCX0sCisKKwkJX3VwZGF0ZVdlaWdodDogZnVuY3Rpb24o
IHRpbWUgKSB7CisKKwkJCXZhciB3ZWlnaHQgPSAwOworCisJCQlpZiAoIHRoaXMuZW5hYmxlZCAp
IHsKKworCQkJCXdlaWdodCA9IHRoaXMud2VpZ2h0OworCQkJCXZhciBpbnRlcnBvbGFudCA9IHRo
aXMuX3dlaWdodEludGVycG9sYW50OworCisJCQkJaWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCAp
IHsKKworCQkJCQl2YXIgaW50ZXJwb2xhbnRWYWx1ZSA9IGludGVycG9sYW50LmV2YWx1YXRlKCB0
aW1lIClbIDAgXTsKKworCQkJCQl3ZWlnaHQgKj0gaW50ZXJwb2xhbnRWYWx1ZTsKKworCQkJCQlp
ZiAoIHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbIDEgXSApIHsKKworCQkJ
CQkJdGhpcy5zdG9wRmFkaW5nKCk7CisKKwkJCQkJCWlmICggaW50ZXJwb2xhbnRWYWx1ZSA9PT0g
MCApIHsKKworCQkJCQkJCS8vIGZhZGVkIG91dCwgZGlzYWJsZQorCQkJCQkJCXRoaXMuZW5hYmxl
ZCA9IGZhbHNlOworCisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJCXRo
aXMuX2VmZmVjdGl2ZVdlaWdodCA9IHdlaWdodDsKKwkJCXJldHVybiB3ZWlnaHQ7CisKKwkJfSwK
KworCQlfdXBkYXRlVGltZVNjYWxlOiBmdW5jdGlvbiggdGltZSApIHsKKworCQkJdmFyIHRpbWVT
Y2FsZSA9IDA7CisKKwkJCWlmICggISB0aGlzLnBhdXNlZCApIHsKKworCQkJCXRpbWVTY2FsZSA9
IHRoaXMudGltZVNjYWxlOworCisJCQkJdmFyIGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxl
SW50ZXJwb2xhbnQ7CisKKwkJCQlpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkgeworCisJCQkJ
CXZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBd
OworCisJCQkJCXRpbWVTY2FsZSAqPSBpbnRlcnBvbGFudFZhbHVlOworCisJCQkJCWlmICggdGlt
ZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkgeworCisJCQkJCQl0aGlz
LnN0b3BXYXJwaW5nKCk7CisKKwkJCQkJCWlmICggdGltZVNjYWxlID09PSAwICkgeworCisJCQkJ
CQkJLy8gbW90aW9uIGhhcyBoYWx0ZWQsIHBhdXNlCisJCQkJCQkJdGhpcy5wYXVzZWQgPSB0cnVl
OworCisJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJLy8gd2FycCBkb25lIC0gYXBwbHkgZmluYWwg
dGltZSBzY2FsZQorCQkJCQkJCXRoaXMudGltZVNjYWxlID0gdGltZVNjYWxlOworCisJCQkJCQl9
CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJCXRoaXMuX2VmZmVjdGl2ZVRpbWVTY2Fs
ZSA9IHRpbWVTY2FsZTsKKwkJCXJldHVybiB0aW1lU2NhbGU7CisKKwkJfSwKKworCQlfdXBkYXRl
VGltZTogZnVuY3Rpb24oIGRlbHRhVGltZSApIHsKKworCQkJdmFyIHRpbWUgPSB0aGlzLnRpbWUg
KyBkZWx0YVRpbWU7CisKKwkJCWlmICggZGVsdGFUaW1lID09PSAwICkgcmV0dXJuIHRpbWU7CisK
KwkJCXZhciBkdXJhdGlvbiA9IHRoaXMuX2NsaXAuZHVyYXRpb24sCisKKwkJCQlsb29wID0gdGhp
cy5sb29wLAorCQkJCWxvb3BDb3VudCA9IHRoaXMuX2xvb3BDb3VudDsKKworCQkJaWYgKCBsb29w
ID09PSBMb29wT25jZSApIHsKKworCQkJCWlmICggbG9vcENvdW50ID09PSAtMSApIHsKKwkJCQkJ
Ly8ganVzdCBzdGFydGVkCisKKwkJCQkJdGhpcy5fbG9vcENvdW50ID0gMDsKKwkJCQkJdGhpcy5f
c2V0RW5kaW5ncyggdHJ1ZSwgdHJ1ZSwgZmFsc2UgKTsKKworCQkJCX0KKworCQkJCWhhbmRsZV9z
dG9wOiB7CisKKwkJCQkJaWYgKCB0aW1lID49IGR1cmF0aW9uICkgeworCisJCQkJCQl0aW1lID0g
ZHVyYXRpb247CisKKwkJCQkJfSBlbHNlIGlmICggdGltZSA8IDAgKSB7CisKKwkJCQkJCXRpbWUg
PSAwOworCisJCQkJCX0gZWxzZSBicmVhayBoYW5kbGVfc3RvcDsKKworCQkJCQlpZiAoIHRoaXMu
Y2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7CisJCQkJCWVsc2UgdGhpcy5l
bmFibGVkID0gZmFsc2U7CisKKwkJCQkJdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCggeworCQkJ
CQkJdHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLAorCQkJCQkJZGlyZWN0aW9uOiBkZWx0
YVRpbWUgPCAwID8gLTEgOiAxCisJCQkJCX0gKTsKKworCQkJCX0KKworCQkJfSBlbHNlIHsgLy8g
cmVwZXRpdGl2ZSBSZXBlYXQgb3IgUGluZ1BvbmcKKworCQkJCXZhciBwaW5nUG9uZyA9ICggbG9v
cCA9PT0gTG9vcFBpbmdQb25nICk7CisKKwkJCQlpZiAoIGxvb3BDb3VudCA9PT0gLTEgKSB7CisJ
CQkJCS8vIGp1c3Qgc3RhcnRlZAorCisJCQkJCWlmICggZGVsdGFUaW1lID49IDAgKSB7CisKKwkJ
CQkJCWxvb3BDb3VudCA9IDA7CisKKwkJCQkJCXRoaXMuX3NldEVuZGluZ3MoCisJCQkJCQkJCXRy
dWUsIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHBpbmdQb25nICk7CisKKwkJCQkJfSBlbHNlIHsK
KworCQkJCQkJLy8gd2hlbiBsb29waW5nIGluIHJldmVyc2UgZGlyZWN0aW9uLCB0aGUgaW5pdGlh
bAorCQkJCQkJLy8gdHJhbnNpdGlvbiB0aHJvdWdoIHplcm8gY291bnRzIGFzIGEgcmVwZXRpdGlv
biwKKwkJCQkJCS8vIHNvIGxlYXZlIGxvb3BDb3VudCBhdCAtMQorCisJCQkJCQl0aGlzLl9zZXRF
bmRpbmdzKAorCQkJCQkJCQl0aGlzLnJlcGV0aXRpb25zID09PSAwLCB0cnVlLCBwaW5nUG9uZyAp
OworCisJCQkJCX0KKworCQkJCX0KKworCQkJCWlmICggdGltZSA+PSBkdXJhdGlvbiB8fCB0aW1l
IDwgMCApIHsKKwkJCQkJLy8gd3JhcCBhcm91bmQKKworCQkJCQl2YXIgbG9vcERlbHRhID0gTWF0
aC5mbG9vciggdGltZSAvIGR1cmF0aW9uICk7IC8vIHNpZ25lZAorCQkJCQl0aW1lIC09IGR1cmF0
aW9uICogbG9vcERlbHRhOworCisJCQkJCWxvb3BDb3VudCArPSBNYXRoLmFicyggbG9vcERlbHRh
ICk7CisKKwkJCQkJdmFyIHBlbmRpbmcgPSB0aGlzLnJlcGV0aXRpb25zIC0gbG9vcENvdW50Owor
CisJCQkJCWlmICggcGVuZGluZyA8IDAgKSB7CisJCQkJCQkvLyBoYXZlIHRvIHN0b3AgKHN3aXRj
aCBzdGF0ZSwgY2xhbXAgdGltZSwgZmlyZSBldmVudCkKKworCQkJCQkJaWYgKCB0aGlzLmNsYW1w
V2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlOworCQkJCQkJZWxzZSB0aGlzLmVuYWJs
ZWQgPSBmYWxzZTsKKworCQkJCQkJdGltZSA9IGRlbHRhVGltZSA+IDAgPyBkdXJhdGlvbiA6IDA7
CisKKwkJCQkJCXRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHsKKwkJCQkJCQl0eXBlOiAnZmlu
aXNoZWQnLCBhY3Rpb246IHRoaXMsCisJCQkJCQkJZGlyZWN0aW9uOiBkZWx0YVRpbWUgPiAwID8g
MSA6IC0xCisJCQkJCQl9ICk7CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGtlZXAgcnVubmlu
ZworCisJCQkJCQlpZiAoIHBlbmRpbmcgPT09IDAgKSB7CisJCQkJCQkJLy8gZW50ZXJpbmcgdGhl
IGxhc3Qgcm91bmQKKworCQkJCQkJCXZhciBhdFN0YXJ0ID0gZGVsdGFUaW1lIDwgMDsKKwkJCQkJ
CQl0aGlzLl9zZXRFbmRpbmdzKCBhdFN0YXJ0LCAhIGF0U3RhcnQsIHBpbmdQb25nICk7CisKKwkJ
CQkJCX0gZWxzZSB7CisKKwkJCQkJCQl0aGlzLl9zZXRFbmRpbmdzKCBmYWxzZSwgZmFsc2UsIHBp
bmdQb25nICk7CisKKwkJCQkJCX0KKworCQkJCQkJdGhpcy5fbG9vcENvdW50ID0gbG9vcENvdW50
OworCisJCQkJCQl0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7CisJCQkJCQkJdHlwZTogJ2xv
b3AnLCBhY3Rpb246IHRoaXMsIGxvb3BEZWx0YTogbG9vcERlbHRhCisJCQkJCQl9ICk7CisKKwkJ
CQkJfQorCisJCQkJfQorCisJCQkJaWYgKCBwaW5nUG9uZyAmJiAoIGxvb3BDb3VudCAmIDEgKSA9
PT0gMSApIHsKKwkJCQkJLy8gaW52ZXJ0IHRpbWUgZm9yIHRoZSAicG9uZyByb3VuZCIKKworCQkJ
CQl0aGlzLnRpbWUgPSB0aW1lOworCQkJCQlyZXR1cm4gZHVyYXRpb24gLSB0aW1lOworCisJCQkJ
fQorCisJCQl9CisKKwkJCXRoaXMudGltZSA9IHRpbWU7CisJCQlyZXR1cm4gdGltZTsKKworCQl9
LAorCisJCV9zZXRFbmRpbmdzOiBmdW5jdGlvbiggYXRTdGFydCwgYXRFbmQsIHBpbmdQb25nICkg
eworCisJCQl2YXIgc2V0dGluZ3MgPSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzOworCisJCQlp
ZiAoIHBpbmdQb25nICkgeworCisJCQkJc2V0dGluZ3MuZW5kaW5nU3RhcnQgCT0gWmVyb1Nsb3Bl
RW5kaW5nOworCQkJCXNldHRpbmdzLmVuZGluZ0VuZAkJPSBaZXJvU2xvcGVFbmRpbmc7CisKKwkJ
CX0gZWxzZSB7CisKKwkJCQkvLyBhc3N1bWluZyBmb3IgTG9vcE9uY2UgYXRTdGFydCA9PSBhdEVu
ZCA9PSB0cnVlCisKKwkJCQlpZiAoIGF0U3RhcnQgKSB7CisKKwkJCQkJc2V0dGluZ3MuZW5kaW5n
U3RhcnQgPSB0aGlzLnplcm9TbG9wZUF0U3RhcnQgPworCQkJCQkJCVplcm9TbG9wZUVuZGluZyA6
IFplcm9DdXJ2YXR1cmVFbmRpbmc7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXNldHRpbmdzLmVu
ZGluZ1N0YXJ0ID0gV3JhcEFyb3VuZEVuZGluZzsKKworCQkJCX0KKworCQkJCWlmICggYXRFbmQg
KSB7CisKKwkJCQkJc2V0dGluZ3MuZW5kaW5nRW5kID0gdGhpcy56ZXJvU2xvcGVBdEVuZCA/CisJ
CQkJCQkJWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZzsKKworCQkJCX0gZWxz
ZSB7CisKKwkJCQkJc2V0dGluZ3MuZW5kaW5nRW5kIAkgPSBXcmFwQXJvdW5kRW5kaW5nOworCisJ
CQkJfQorCisJCQl9CisKKwkJfSwKKworCQlfc2NoZWR1bGVGYWRpbmc6IGZ1bmN0aW9uKCBkdXJh
dGlvbiwgd2VpZ2h0Tm93LCB3ZWlnaHRUaGVuICkgeworCisJCQl2YXIgbWl4ZXIgPSB0aGlzLl9t
aXhlciwgbm93ID0gbWl4ZXIudGltZSwKKwkJCQlpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodElu
dGVycG9sYW50OworCisJCQlpZiAoIGludGVycG9sYW50ID09PSBudWxsICkgeworCisJCQkJaW50
ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpOworCQkJCXRoaXMuX3dl
aWdodEludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7CisKKwkJCX0KKworCQkJdmFyIHRpbWVzID0g
aW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLAorCQkJCXZhbHVlcyA9IGludGVycG9sYW50
LnNhbXBsZVZhbHVlczsKKworCQkJdGltZXNbIDAgXSA9IG5vdzsgCQkJCXZhbHVlc1sgMCBdID0g
d2VpZ2h0Tm93OworCQkJdGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uOwl2YWx1ZXNbIDEgXSA9
IHdlaWdodFRoZW47CisKKwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0gKTsKKworCS8qKgor
CSAqCisJICogUGxheWVyIGZvciBBbmltYXRpb25DbGlwcy4KKwkgKgorCSAqCisJICogQGF1dGhv
ciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KKwkgKiBAYXV0aG9yIERhdmlkIFNhcm5v
IC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KKwkgKiBAYXV0aG9yIHRzY2h3CisJICovCisKKwlmdW5j
dGlvbiBBbmltYXRpb25NaXhlciggcm9vdCApIHsKKworCQl0aGlzLl9yb290ID0gcm9vdDsKKwkJ
dGhpcy5faW5pdE1lbW9yeU1hbmFnZXIoKTsKKwkJdGhpcy5fYWNjdUluZGV4ID0gMDsKKworCQl0
aGlzLnRpbWUgPSAwOworCisJCXRoaXMudGltZVNjYWxlID0gMS4wOworCisJfQorCisJT2JqZWN0
LmFzc2lnbiggQW5pbWF0aW9uTWl4ZXIucHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIucHJvdG90
eXBlLCB7CisKKwkJX2JpbmRBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBwcm90b3R5cGVBY3Rp
b24gKSB7CisKKwkJCXZhciByb290ID0gYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCwK
KwkJCQl0cmFja3MgPSBhY3Rpb24uX2NsaXAudHJhY2tzLAorCQkJCW5UcmFja3MgPSB0cmFja3Mu
bGVuZ3RoLAorCQkJCWJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzLAorCQkJCWlu
dGVycG9sYW50cyA9IGFjdGlvbi5faW50ZXJwb2xhbnRzLAorCQkJCXJvb3RVdWlkID0gcm9vdC51
dWlkLAorCQkJCWJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLAor
CQkJCWJpbmRpbmdzQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07CisKKwkJCWlm
ICggYmluZGluZ3NCeU5hbWUgPT09IHVuZGVmaW5lZCApIHsKKworCQkJCWJpbmRpbmdzQnlOYW1l
ID0ge307CisJCQkJYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0gPSBiaW5kaW5nc0J5TmFtZTsK
KworCQkJfQorCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5UcmFja3M7ICsrIGkgKSB7CisK
KwkJCQl2YXIgdHJhY2sgPSB0cmFja3NbIGkgXSwKKwkJCQkJdHJhY2tOYW1lID0gdHJhY2submFt
ZSwKKwkJCQkJYmluZGluZyA9IGJpbmRpbmdzQnlOYW1lWyB0cmFja05hbWUgXTsKKworCQkJCWlm
ICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWJpbmRpbmdzWyBpIF0gPSBiaW5k
aW5nOworCisJCQkJfSBlbHNlIHsKKworCQkJCQliaW5kaW5nID0gYmluZGluZ3NbIGkgXTsKKwor
CQkJCQlpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJLy8gZXhpc3Rpbmcg
YmluZGluZywgbWFrZSBzdXJlIHRoZSBjYWNoZSBrbm93cworCisJCQkJCQlpZiAoIGJpbmRpbmcu
X2NhY2hlSW5kZXggPT09IG51bGwgKSB7CisKKwkJCQkJCQkrKyBiaW5kaW5nLnJlZmVyZW5jZUNv
dW50OworCQkJCQkJCXRoaXMuX2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQs
IHRyYWNrTmFtZSApOworCisJCQkJCQl9CisKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCX0KKwor
CQkJCQl2YXIgcGF0aCA9IHByb3RvdHlwZUFjdGlvbiAmJiBwcm90b3R5cGVBY3Rpb24uCisJCQkJ
CQkJX3Byb3BlcnR5QmluZGluZ3NbIGkgXS5iaW5kaW5nLnBhcnNlZFBhdGg7CisKKwkJCQkJYmlu
ZGluZyA9IG5ldyBQcm9wZXJ0eU1peGVyKAorCQkJCQkJUHJvcGVydHlCaW5kaW5nLmNyZWF0ZSgg
cm9vdCwgdHJhY2tOYW1lLCBwYXRoICksCisJCQkJCQl0cmFjay5WYWx1ZVR5cGVOYW1lLCB0cmFj
ay5nZXRWYWx1ZVNpemUoKSApOworCisJCQkJCSsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7CisJ
CQkJCXRoaXMuX2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFt
ZSApOworCisJCQkJCWJpbmRpbmdzWyBpIF0gPSBiaW5kaW5nOworCisJCQkJfQorCisJCQkJaW50
ZXJwb2xhbnRzWyBpIF0ucmVzdWx0QnVmZmVyID0gYmluZGluZy5idWZmZXI7CisKKwkJCX0KKwor
CQl9LAorCisJCV9hY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7CisKKwkJCWlm
ICggISB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7CisKKwkJCQlpZiAoIGFjdGlv
bi5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHsKKworCQkJCQkvLyB0aGlzIGFjdGlvbiBoYXMgYmVl
biBmb3Jnb3R0ZW4gYnkgdGhlIGNhY2hlLCBidXQgdGhlIHVzZXIKKwkJCQkJLy8gYXBwZWFycyB0
byBiZSBzdGlsbCB1c2luZyBpdCAtPiByZWJpbmQKKworCQkJCQl2YXIgcm9vdFV1aWQgPSAoIGFj
dGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkLAorCQkJCQkJY2xpcFV1aWQgPSBh
Y3Rpb24uX2NsaXAudXVpZCwKKwkJCQkJCWFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5
Q2xpcFsgY2xpcFV1aWQgXTsKKworCQkJCQl0aGlzLl9iaW5kQWN0aW9uKCBhY3Rpb24sCisJCQkJ
CQlhY3Rpb25zRm9yQ2xpcCAmJiBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXSApOwor
CisJCQkJCXRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVp
ZCApOworCisJCQkJfQorCisJCQkJdmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRp
bmdzOworCisJCQkJLy8gaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0
ZQorCQkJCWZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysg
aSApIHsKKworCQkJCQl2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07CisKKwkJCQkJaWYgKCBi
aW5kaW5nLnVzZUNvdW50ICsrID09PSAwICkgeworCisJCQkJCQl0aGlzLl9sZW5kQmluZGluZygg
YmluZGluZyApOworCQkJCQkJYmluZGluZy5zYXZlT3JpZ2luYWxTdGF0ZSgpOworCisJCQkJCX0K
KworCQkJCX0KKworCQkJCXRoaXMuX2xlbmRBY3Rpb24oIGFjdGlvbiApOworCisJCQl9CisKKwkJ
fSwKKworCQlfZGVhY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7CisKKwkJCWlm
ICggdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkgeworCisJCQkJdmFyIGJpbmRpbmdz
ID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzOworCisJCQkJLy8gZGVjcmVtZW50IHJlZmVyZW5j
ZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZQorCQkJCWZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRp
bmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworCQkJCQl2YXIgYmluZGluZyA9IGJpbmRp
bmdzWyBpIF07CisKKwkJCQkJaWYgKCAtLSBiaW5kaW5nLnVzZUNvdW50ID09PSAwICkgeworCisJ
CQkJCQliaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7CisJCQkJCQl0aGlzLl90YWtlQmFj
a0JpbmRpbmcoIGJpbmRpbmcgKTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQl0aGlzLl90YWtl
QmFja0FjdGlvbiggYWN0aW9uICk7CisKKwkJCX0KKworCQl9LAorCisJCS8vIE1lbW9yeSBtYW5h
Z2VyCisKKwkJX2luaXRNZW1vcnlNYW5hZ2VyOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMuX2Fj
dGlvbnMgPSBbXTsgLy8gJ25BY3RpdmVBY3Rpb25zJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVz
CisJCQl0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7CisKKwkJCXRoaXMuX2FjdGlvbnNCeUNsaXAg
PSB7fTsKKwkJCS8vIGluc2lkZToKKwkJCS8vIHsKKwkJCS8vIAkJa25vd25BY3Rpb25zOiBBcnJh
eTwgQW5pbWF0aW9uQWN0aW9uID4JLSB1c2VkIGFzIHByb3RvdHlwZXMKKwkJCS8vIAkJYWN0aW9u
QnlSb290OiBBbmltYXRpb25BY3Rpb24JCQktIGxvb2t1cAorCQkJLy8gfQorCisKKwkJCXRoaXMu
X2JpbmRpbmdzID0gW107IC8vICduQWN0aXZlQmluZGluZ3MnIGZvbGxvd2VkIGJ5IGluYWN0aXZl
IG9uZXMKKwkJCXRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7CisKKwkJCXRoaXMuX2JpbmRpbmdz
QnlSb290QW5kTmFtZSA9IHt9OyAvLyBpbnNpZGU6IE1hcDwgbmFtZSwgUHJvcGVydHlNaXhlciA+
CisKKworCQkJdGhpcy5fY29udHJvbEludGVycG9sYW50cyA9IFtdOyAvLyBzYW1lIGdhbWUgYXMg
YWJvdmUKKwkJCXRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDsKKworCQkJdmFy
IHNjb3BlID0gdGhpczsKKworCQkJdGhpcy5zdGF0cyA9IHsKKworCQkJCWFjdGlvbnM6IHsKKwkJ
CQkJZ2V0IHRvdGFsKCkgeyByZXR1cm4gc2NvcGUuX2FjdGlvbnMubGVuZ3RoOyB9LAorCQkJCQln
ZXQgaW5Vc2UoKSB7IHJldHVybiBzY29wZS5fbkFjdGl2ZUFjdGlvbnM7IH0KKwkJCQl9LAorCQkJ
CWJpbmRpbmdzOiB7CisJCQkJCWdldCB0b3RhbCgpIHsgcmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5s
ZW5ndGg7IH0sCisJCQkJCWdldCBpblVzZSgpIHsgcmV0dXJuIHNjb3BlLl9uQWN0aXZlQmluZGlu
Z3M7IH0KKwkJCQl9LAorCQkJCWNvbnRyb2xJbnRlcnBvbGFudHM6IHsKKwkJCQkJZ2V0IHRvdGFs
KCkgeyByZXR1cm4gc2NvcGUuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RoOyB9LAorCQkJCQln
ZXQgaW5Vc2UoKSB7IHJldHVybiBzY29wZS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM7IH0K
KwkJCQl9CisKKwkJCX07CisKKwkJfSwKKworCQkvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgQW5p
bWF0aW9uQWN0aW9uIG9iamVjdHMKKworCQlfaXNBY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0
aW9uICkgeworCisJCQl2YXIgaW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7CisJCQlyZXR1cm4g
aW5kZXggIT09IG51bGwgJiYgaW5kZXggPCB0aGlzLl9uQWN0aXZlQWN0aW9uczsKKworCQl9LAor
CisJCV9hZGRJbmFjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24sIGNsaXBVdWlkLCByb290
VXVpZCApIHsKKworCQkJdmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLAorCQkJCWFjdGlvbnNC
eUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLAorCQkJCWFjdGlvbnNGb3JDbGlwID0gYWN0aW9u
c0J5Q2xpcFsgY2xpcFV1aWQgXTsKKworCQkJaWYgKCBhY3Rpb25zRm9yQ2xpcCA9PT0gdW5kZWZp
bmVkICkgeworCisJCQkJYWN0aW9uc0ZvckNsaXAgPSB7CisKKwkJCQkJa25vd25BY3Rpb25zOiBb
IGFjdGlvbiBdLAorCQkJCQlhY3Rpb25CeVJvb3Q6IHt9CisKKwkJCQl9OworCisJCQkJYWN0aW9u
Ll9ieUNsaXBDYWNoZUluZGV4ID0gMDsKKworCQkJCWFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0g
PSBhY3Rpb25zRm9yQ2xpcDsKKworCQkJfSBlbHNlIHsKKworCQkJCXZhciBrbm93bkFjdGlvbnMg
PSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7CisKKwkJCQlhY3Rpb24uX2J5Q2xpcENhY2hl
SW5kZXggPSBrbm93bkFjdGlvbnMubGVuZ3RoOworCQkJCWtub3duQWN0aW9ucy5wdXNoKCBhY3Rp
b24gKTsKKworCQkJfQorCisJCQlhY3Rpb24uX2NhY2hlSW5kZXggPSBhY3Rpb25zLmxlbmd0aDsK
KwkJCWFjdGlvbnMucHVzaCggYWN0aW9uICk7CisKKwkJCWFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5
Um9vdFsgcm9vdFV1aWQgXSA9IGFjdGlvbjsKKworCQl9LAorCisJCV9yZW1vdmVJbmFjdGl2ZUFj
dGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7CisKKwkJCXZhciBhY3Rpb25zID0gdGhpcy5fYWN0
aW9ucywKKwkJCQlsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAt
IDEgXSwKKwkJCQljYWNoZUluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4OworCisJCQlsYXN0SW5h
Y3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4OworCQkJYWN0aW9uc1sgY2FjaGVJ
bmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uOworCQkJYWN0aW9ucy5wb3AoKTsKKworCQkJYWN0
aW9uLl9jYWNoZUluZGV4ID0gbnVsbDsKKworCisJCQl2YXIgY2xpcFV1aWQgPSBhY3Rpb24uX2Ns
aXAudXVpZCwKKwkJCQlhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCwKKwkJCQlh
Y3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sCisJCQkJa25vd25BY3Rp
b25zRm9yQ2xpcCA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucywKKworCQkJCWxhc3RLbm93
bkFjdGlvbiA9CisJCQkJCWtub3duQWN0aW9uc0ZvckNsaXBbIGtub3duQWN0aW9uc0ZvckNsaXAu
bGVuZ3RoIC0gMSBdLAorCisJCQkJYnlDbGlwQ2FjaGVJbmRleCA9IGFjdGlvbi5fYnlDbGlwQ2Fj
aGVJbmRleDsKKworCQkJbGFzdEtub3duQWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gYnlDbGlw
Q2FjaGVJbmRleDsKKwkJCWtub3duQWN0aW9uc0ZvckNsaXBbIGJ5Q2xpcENhY2hlSW5kZXggXSA9
IGxhc3RLbm93bkFjdGlvbjsKKwkJCWtub3duQWN0aW9uc0ZvckNsaXAucG9wKCk7CisKKwkJCWFj
dGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7CisKKworCQkJdmFyIGFjdGlvbkJ5Um9vdCA9
IGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdCwKKwkJCQlyb290VXVpZCA9ICggYWN0aW9uLl9s
b2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQ7CisKKwkJCWRlbGV0ZSBhY3Rpb25CeVJvb3Rb
IHJvb3RVdWlkIF07CisKKwkJCWlmICgga25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggPT09IDAg
KSB7CisKKwkJCQlkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTsKKworCQkJfQorCisJ
CQl0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTsKKworCQl9
LAorCisJCV9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlv
biApIHsKKworCQkJdmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzOworCQkJ
Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewor
CisJCQkJdmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdOworCisJCQkJaWYgKCAtLSBiaW5kaW5n
LnJlZmVyZW5jZUNvdW50ID09PSAwICkgeworCisJCQkJCXRoaXMuX3JlbW92ZUluYWN0aXZlQmlu
ZGluZyggYmluZGluZyApOworCisJCQkJfQorCisJCQl9CisKKwkJfSwKKworCQlfbGVuZEFjdGlv
bjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7CisKKwkJCS8vIFsgYWN0aXZlIGFjdGlvbnMgfCAgaW5h
Y3RpdmUgYWN0aW9ucyAgXQorCQkJLy8gWyAgYWN0aXZlIGFjdGlvbnMgPnwgaW5hY3RpdmUgYWN0
aW9ucyBdCisJCQkvLyAgICAgICAgICAgICAgICAgcyAgICAgICAgYQorCQkJLy8gICAgICAgICAg
ICAgICAgICA8LXN3YXAtPgorCQkJLy8gICAgICAgICAgICAgICAgIGEgICAgICAgIHMKKworCQkJ
dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLAorCQkJCXByZXZJbmRleCA9IGFjdGlvbi5fY2Fj
aGVJbmRleCwKKworCQkJCWxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVBY3Rpb25zICsr
LAorCisJCQkJZmlyc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBd
OworCisJCQlhY3Rpb24uX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7CisJCQlhY3Rpb25z
WyBsYXN0QWN0aXZlSW5kZXggXSA9IGFjdGlvbjsKKworCQkJZmlyc3RJbmFjdGl2ZUFjdGlvbi5f
Y2FjaGVJbmRleCA9IHByZXZJbmRleDsKKwkJCWFjdGlvbnNbIHByZXZJbmRleCBdID0gZmlyc3RJ
bmFjdGl2ZUFjdGlvbjsKKworCQl9LAorCisJCV90YWtlQmFja0FjdGlvbjogZnVuY3Rpb24gKCBh
Y3Rpb24gKSB7CisKKwkJCS8vIFsgIGFjdGl2ZSBhY3Rpb25zICB8IGluYWN0aXZlIGFjdGlvbnMg
XQorCQkJLy8gWyBhY3RpdmUgYWN0aW9ucyB8PCBpbmFjdGl2ZSBhY3Rpb25zICBdCisJCQkvLyAg
ICAgICAgYSAgICAgICAgcworCQkJLy8gICAgICAgICA8LXN3YXAtPgorCQkJLy8gICAgICAgIHMg
ICAgICAgIGEKKworCQkJdmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLAorCQkJCXByZXZJbmRl
eCA9IGFjdGlvbi5fY2FjaGVJbmRleCwKKworCQkJCWZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRo
aXMuX25BY3RpdmVBY3Rpb25zLAorCisJCQkJbGFzdEFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGZp
cnN0SW5hY3RpdmVJbmRleCBdOworCisJCQlhY3Rpb24uX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0
aXZlSW5kZXg7CisJCQlhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGFjdGlvbjsKKwor
CQkJbGFzdEFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDsKKwkJCWFjdGlvbnNb
IHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUFjdGlvbjsKKworCQl9LAorCisJCS8vIE1lbW9yeSBt
YW5hZ2VtZW50IGZvciBQcm9wZXJ0eU1peGVyIG9iamVjdHMKKworCQlfYWRkSW5hY3RpdmVCaW5k
aW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKSB7CisKKwkJCXZh
ciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSwKKwkJCQliaW5k
aW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sCisKKwkJCQliaW5kaW5ncyA9
IHRoaXMuX2JpbmRpbmdzOworCisJCQlpZiAoIGJpbmRpbmdCeU5hbWUgPT09IHVuZGVmaW5lZCAp
IHsKKworCQkJCWJpbmRpbmdCeU5hbWUgPSB7fTsKKwkJCQliaW5kaW5nc0J5Um9vdFsgcm9vdFV1
aWQgXSA9IGJpbmRpbmdCeU5hbWU7CisKKwkJCX0KKworCQkJYmluZGluZ0J5TmFtZVsgdHJhY2tO
YW1lIF0gPSBiaW5kaW5nOworCisJCQliaW5kaW5nLl9jYWNoZUluZGV4ID0gYmluZGluZ3MubGVu
Z3RoOworCQkJYmluZGluZ3MucHVzaCggYmluZGluZyApOworCisJCX0sCisKKwkJX3JlbW92ZUlu
YWN0aXZlQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkgeworCisJCQl2YXIgYmluZGluZ3Mg
PSB0aGlzLl9iaW5kaW5ncywKKwkJCQlwcm9wQmluZGluZyA9IGJpbmRpbmcuYmluZGluZywKKwkJ
CQlyb290VXVpZCA9IHByb3BCaW5kaW5nLnJvb3ROb2RlLnV1aWQsCisJCQkJdHJhY2tOYW1lID0g
cHJvcEJpbmRpbmcucGF0aCwKKwkJCQliaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlS
b290QW5kTmFtZSwKKwkJCQliaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlk
IF0sCisKKwkJCQlsYXN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGJpbmRpbmdzLmxlbmd0
aCAtIDEgXSwKKwkJCQljYWNoZUluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleDsKKworCQkJbGFz
dEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7CisJCQliaW5kaW5nc1sg
Y2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQmluZGluZzsKKwkJCWJpbmRpbmdzLnBvcCgpOwor
CisJCQlkZWxldGUgYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07CisKKwkJCXJlbW92ZV9lbXB0
eV9tYXA6IHsKKworCQkJCWZvciAoIHZhciBfIGluIGJpbmRpbmdCeU5hbWUgKSBicmVhayByZW1v
dmVfZW1wdHlfbWFwOworCisJCQkJZGVsZXRlIGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdOwor
CisJCQl9CisKKwkJfSwKKworCQlfbGVuZEJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHsK
KworCQkJdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCisJCQkJcHJldkluZGV4ID0gYmlu
ZGluZy5fY2FjaGVJbmRleCwKKworCQkJCWxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVC
aW5kaW5ncyArKywKKworCQkJCWZpcnN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGxhc3RB
Y3RpdmVJbmRleCBdOworCisJCQliaW5kaW5nLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4
OworCQkJYmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdID0gYmluZGluZzsKKworCQkJZmlyc3RJ
bmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7CisJCQliaW5kaW5nc1sgcHJl
dkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQmluZGluZzsKKworCQl9LAorCisJCV90YWtlQmFja0Jp
bmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHsKKworCQkJdmFyIGJpbmRpbmdzID0gdGhpcy5f
YmluZGluZ3MsCisJCQkJcHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCwKKworCQkJCWZp
cnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVCaW5kaW5ncywKKworCQkJCWxhc3RB
Y3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdOworCisJCQliaW5k
aW5nLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4OworCQkJYmluZGluZ3NbIGZpcnN0
SW5hY3RpdmVJbmRleCBdID0gYmluZGluZzsKKworCQkJbGFzdEFjdGl2ZUJpbmRpbmcuX2NhY2hl
SW5kZXggPSBwcmV2SW5kZXg7CisJCQliaW5kaW5nc1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZl
QmluZGluZzsKKworCQl9LAorCisKKwkJLy8gTWVtb3J5IG1hbmFnZW1lbnQgb2YgSW50ZXJwb2xh
bnRzIGZvciB3ZWlnaHQgYW5kIHRpbWUgc2NhbGUKKworCQlfbGVuZENvbnRyb2xJbnRlcnBvbGFu
dDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbElu
dGVycG9sYW50cywKKwkJCQlsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQ29udHJvbElu
dGVycG9sYW50cyArKywKKwkJCQlpbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgbGFzdEFjdGl2
ZUluZGV4IF07CisKKwkJCWlmICggaW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHsKKworCQkJ
CWludGVycG9sYW50ID0gbmV3IExpbmVhckludGVycG9sYW50KAorCQkJCQluZXcgRmxvYXQzMkFy
cmF5KCAyICksIG5ldyBGbG9hdDMyQXJyYXkoIDIgKSwKKwkJCQkJMSwgdGhpcy5fY29udHJvbElu
dGVycG9sYW50c1Jlc3VsdEJ1ZmZlciApOworCisJCQkJaW50ZXJwb2xhbnQuX19jYWNoZUluZGV4
ID0gbGFzdEFjdGl2ZUluZGV4OworCQkJCWludGVycG9sYW50c1sgbGFzdEFjdGl2ZUluZGV4IF0g
PSBpbnRlcnBvbGFudDsKKworCQkJfQorCisJCQlyZXR1cm4gaW50ZXJwb2xhbnQ7CisKKwkJfSwK
KworCQlfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICggaW50ZXJwb2xhbnQg
KSB7CisKKwkJCXZhciBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLAor
CQkJCXByZXZJbmRleCA9IGludGVycG9sYW50Ll9fY2FjaGVJbmRleCwKKworCQkJCWZpcnN0SW5h
Y3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzLAorCisJCQkJ
bGFzdEFjdGl2ZUludGVycG9sYW50ID0gaW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXgg
XTsKKworCQkJaW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4Owor
CQkJaW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50OworCisJ
CQlsYXN0QWN0aXZlSW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gcHJldkluZGV4OworCQkJaW50
ZXJwb2xhbnRzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVJbnRlcnBvbGFudDsKKworCQl9LAor
CisJCV9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyOiBuZXcgRmxvYXQzMkFycmF5KCAx
ICksCisKKwkJLy8gcmV0dXJuIGFuIGFjdGlvbiBmb3IgYSBjbGlwIG9wdGlvbmFsbHkgdXNpbmcg
YSBjdXN0b20gcm9vdCB0YXJnZXQKKwkJLy8gb2JqZWN0ICh0aGlzIG1ldGhvZCBhbGxvY2F0ZXMg
YSBsb3Qgb2YgZHluYW1pYyBtZW1vcnkgaW4gY2FzZSBhCisJCS8vIHByZXZpb3VzbHkgdW5rbm93
biBjbGlwL3Jvb3QgY29tYmluYXRpb24gaXMgc3BlY2lmaWVkKQorCQljbGlwQWN0aW9uOiBmdW5j
dGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHsKKworCQkJdmFyIHJvb3QgPSBvcHRpb25hbFJv
b3QgfHwgdGhpcy5fcm9vdCwKKwkJCQlyb290VXVpZCA9IHJvb3QudXVpZCwKKworCQkJCWNsaXBP
YmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmluZycgPworCQkJCQlBbmltYXRpb25DbGlwLmZp
bmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXAsCisKKwkJCQljbGlwVXVpZCA9IGNsaXBPYmpl
Y3QgIT09IG51bGwgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLAorCisJCQkJYWN0aW9uc0ZvckNs
aXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLAorCQkJCXByb3RvdHlwZUFjdGlv
biA9IG51bGw7CisKKwkJCWlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHsKKwor
CQkJCXZhciBleGlzdGluZ0FjdGlvbiA9CisJCQkJCQlhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJv
b3RbIHJvb3RVdWlkIF07CisKKwkJCQlpZiAoIGV4aXN0aW5nQWN0aW9uICE9PSB1bmRlZmluZWQg
KSB7CisKKwkJCQkJcmV0dXJuIGV4aXN0aW5nQWN0aW9uOworCisJCQkJfQorCisJCQkJLy8gd2Ug
a25vdyB0aGUgY2xpcCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXJzZSBhbGwKKwkJCQkvLyB0aGUg
YmluZGluZ3MgYWdhaW4gYnV0IGNhbiBqdXN0IGNvcHkKKwkJCQlwcm90b3R5cGVBY3Rpb24gPSBh
Y3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXTsKKworCQkJCS8vIGFsc28sIHRha2UgdGhl
IGNsaXAgZnJvbSB0aGUgcHJvdG90eXBlIGFjdGlvbgorCQkJCWlmICggY2xpcE9iamVjdCA9PT0g
bnVsbCApCisJCQkJCWNsaXBPYmplY3QgPSBwcm90b3R5cGVBY3Rpb24uX2NsaXA7CisKKwkJCX0K
KworCQkJLy8gY2xpcCBtdXN0IGJlIGtub3duIHdoZW4gc3BlY2lmaWVkIHZpYSBzdHJpbmcKKwkJ
CWlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApIHJldHVybiBudWxsOworCisJCQkvLyBhbGxvY2F0
ZSBhbGwgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIHJ1biBpdAorCQkJdmFyIG5ld0FjdGlvbiA9IG5l
dyBBbmltYXRpb25BY3Rpb24oIHRoaXMsIGNsaXBPYmplY3QsIG9wdGlvbmFsUm9vdCApOworCisJ
CQl0aGlzLl9iaW5kQWN0aW9uKCBuZXdBY3Rpb24sIHByb3RvdHlwZUFjdGlvbiApOworCisJCQkv
LyBhbmQgbWFrZSB0aGUgYWN0aW9uIGtub3duIHRvIHRoZSBtZW1vcnkgbWFuYWdlcgorCQkJdGhp
cy5fYWRkSW5hY3RpdmVBY3Rpb24oIG5ld0FjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7CisK
KwkJCXJldHVybiBuZXdBY3Rpb247CisKKwkJfSwKKworCQkvLyBnZXQgYW4gZXhpc3RpbmcgYWN0
aW9uCisJCWV4aXN0aW5nQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHsK
KworCQkJdmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCwKKwkJCQlyb290VXVp
ZCA9IHJvb3QudXVpZCwKKworCQkJCWNsaXBPYmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmlu
ZycgPworCQkJCQlBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXAs
CisKKwkJCQljbGlwVXVpZCA9IGNsaXBPYmplY3QgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLAor
CisJCQkJYWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdOwor
CisJCQlpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQlyZXR1cm4g
YWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdIHx8IG51bGw7CisKKwkJCX0K
KworCQkJcmV0dXJuIG51bGw7CisKKwkJfSwKKworCQkvLyBkZWFjdGl2YXRlcyBhbGwgcHJldmlv
dXNseSBzY2hlZHVsZWQgYWN0aW9ucworCQlzdG9wQWxsQWN0aW9uOiBmdW5jdGlvbiAoKSB7CisK
KwkJCXZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywKKwkJCQluQWN0aW9ucyA9IHRoaXMuX25B
Y3RpdmVBY3Rpb25zLAorCQkJCWJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCisJCQkJbkJpbmRp
bmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzOworCisJCQl0aGlzLl9uQWN0aXZlQWN0aW9ucyA9
IDA7CisJCQl0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwOworCisJCQlmb3IgKCB2YXIgaSA9IDA7
IGkgIT09IG5BY3Rpb25zOyArKyBpICkgeworCisJCQkJYWN0aW9uc1sgaSBdLnJlc2V0KCk7CisK
KwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7CisK
KwkJCQliaW5kaW5nc1sgaSBdLnVzZUNvdW50ID0gMDsKKworCQkJfQorCisJCQlyZXR1cm4gdGhp
czsKKworCQl9LAorCisJCS8vIGFkdmFuY2UgdGhlIHRpbWUgYW5kIHVwZGF0ZSBhcHBseSB0aGUg
YW5pbWF0aW9uCisJCXVwZGF0ZTogZnVuY3Rpb24gKCBkZWx0YVRpbWUgKSB7CisKKwkJCWRlbHRh
VGltZSAqPSB0aGlzLnRpbWVTY2FsZTsKKworCQkJdmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25z
LAorCQkJCW5BY3Rpb25zID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsCisKKwkJCQl0aW1lID0gdGhp
cy50aW1lICs9IGRlbHRhVGltZSwKKwkJCQl0aW1lRGlyZWN0aW9uID0gTWF0aC5zaWduKCBkZWx0
YVRpbWUgKSwKKworCQkJCWFjY3VJbmRleCA9IHRoaXMuX2FjY3VJbmRleCBePSAxOworCisJCQkv
LyBydW4gYWN0aXZlIGFjdGlvbnMKKworCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuQWN0aW9u
czsgKysgaSApIHsKKworCQkJCXZhciBhY3Rpb24gPSBhY3Rpb25zWyBpIF07CisKKwkJCQlhY3Rp
b24uX3VwZGF0ZSggdGltZSwgZGVsdGFUaW1lLCB0aW1lRGlyZWN0aW9uLCBhY2N1SW5kZXggKTsK
KworCQkJfQorCisJCQkvLyB1cGRhdGUgc2NlbmUgZ3JhcGgKKworCQkJdmFyIGJpbmRpbmdzID0g
dGhpcy5fYmluZGluZ3MsCisJCQkJbkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzOwor
CisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5CaW5kaW5nczsgKysgaSApIHsKKworCQkJCWJp
bmRpbmdzWyBpIF0uYXBwbHkoIGFjY3VJbmRleCApOworCisJCQl9CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJLy8gcmV0dXJuIHRoaXMgbWl4ZXIncyByb290IHRhcmdldCBvYmplY3QK
KwkJZ2V0Um9vdDogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5fcm9vdDsKKworCQl9
LAorCisJCS8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgY2xp
cAorCQl1bmNhY2hlQ2xpcDogZnVuY3Rpb24gKCBjbGlwICkgeworCisJCQl2YXIgYWN0aW9ucyA9
IHRoaXMuX2FjdGlvbnMsCisJCQkJY2xpcFV1aWQgPSBjbGlwLnV1aWQsCisJCQkJYWN0aW9uc0J5
Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsCisJCQkJYWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25z
QnlDbGlwWyBjbGlwVXVpZCBdOworCisJCQlpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCQkvLyBub3RlOiBqdXN0IGNhbGxpbmcgX3JlbW92ZUluYWN0aXZlQWN0aW9u
IHdvdWxkIG1lc3MgdXAgdGhlCisJCQkJLy8gaXRlcmF0aW9uIHN0YXRlIGFuZCBhbHNvIHJlcXVp
cmUgdXBkYXRpbmcgdGhlIHN0YXRlIHdlIGNhbgorCQkJCS8vIGp1c3QgdGhyb3cgYXdheQorCisJ
CQkJdmFyIGFjdGlvbnNUb1JlbW92ZSA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uczsKKwor
CQkJCWZvciAoIHZhciBpID0gMCwgbiA9IGFjdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGkgIT09IG47
ICsrIGkgKSB7CisKKwkJCQkJdmFyIGFjdGlvbiA9IGFjdGlvbnNUb1JlbW92ZVsgaSBdOworCisJ
CQkJCXRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApOworCisJCQkJCXZhciBjYWNoZUlu
ZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LAorCQkJCQkJbGFzdEluYWN0aXZlQWN0aW9uID0gYWN0
aW9uc1sgYWN0aW9ucy5sZW5ndGggLSAxIF07CisKKwkJCQkJYWN0aW9uLl9jYWNoZUluZGV4ID0g
bnVsbDsKKwkJCQkJYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDsKKworCQkJCQlsYXN0
SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4OworCQkJCQlhY3Rpb25zWyBj
YWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247CisJCQkJCWFjdGlvbnMucG9wKCk7CisK
KwkJCQkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7CisK
KwkJCQl9CisKKwkJCQlkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTsKKworCQkJfQor
CisJCX0sCisKKwkJLy8gZnJlZSBhbGwgcmVzb3VyY2VzIHNwZWNpZmljIHRvIGEgcGFydGljdWxh
ciByb290IHRhcmdldCBvYmplY3QKKwkJdW5jYWNoZVJvb3Q6IGZ1bmN0aW9uICggcm9vdCApIHsK
KworCQkJdmFyIHJvb3RVdWlkID0gcm9vdC51dWlkLAorCQkJCWFjdGlvbnNCeUNsaXAgPSB0aGlz
Ll9hY3Rpb25zQnlDbGlwOworCisJCQlmb3IgKCB2YXIgY2xpcFV1aWQgaW4gYWN0aW9uc0J5Q2xp
cCApIHsKKworCQkJCXZhciBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBd
LmFjdGlvbkJ5Um9vdCwKKwkJCQkJYWN0aW9uID0gYWN0aW9uQnlSb290WyByb290VXVpZCBdOwor
CisJCQkJaWYgKCBhY3Rpb24gIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQl0aGlzLl9kZWFjdGl2
YXRlQWN0aW9uKCBhY3Rpb24gKTsKKwkJCQkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFj
dGlvbiApOworCisJCQkJfQorCisJCQl9CisKKwkJCXZhciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMu
X2JpbmRpbmdzQnlSb290QW5kTmFtZSwKKwkJCQliaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJv
b3RbIHJvb3RVdWlkIF07CisKKwkJCWlmICggYmluZGluZ0J5TmFtZSAhPT0gdW5kZWZpbmVkICkg
eworCisJCQkJZm9yICggdmFyIHRyYWNrTmFtZSBpbiBiaW5kaW5nQnlOYW1lICkgeworCisJCQkJ
CXZhciBiaW5kaW5nID0gYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07CisJCQkJCWJpbmRpbmcu
cmVzdG9yZU9yaWdpbmFsU3RhdGUoKTsKKwkJCQkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5n
KCBiaW5kaW5nICk7CisKKwkJCQl9CisKKwkJCX0KKworCQl9LAorCisJCS8vIHJlbW92ZSBhIHRh
cmdldGVkIGNsaXAgZnJvbSB0aGUgY2FjaGUKKwkJdW5jYWNoZUFjdGlvbjogZnVuY3Rpb24gKCBj
bGlwLCBvcHRpb25hbFJvb3QgKSB7CisKKwkJCXZhciBhY3Rpb24gPSB0aGlzLmV4aXN0aW5nQWN0
aW9uKCBjbGlwLCBvcHRpb25hbFJvb3QgKTsKKworCQkJaWYgKCBhY3Rpb24gIT09IG51bGwgKSB7
CisKKwkJCQl0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTsKKwkJCQl0aGlzLl9yZW1v
dmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7CisKKwkJCX0KKworCQl9CisKKwl9ICk7CisKKwkv
KioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVu
Y3Rpb24gVW5pZm9ybSggdmFsdWUgKSB7CisKKwkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJp
bmcnICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRl
ciBpcyBubyBsb25nZXIgbmVlZGVkLicgKTsKKwkJCXZhbHVlID0gYXJndW1lbnRzWyAxIF07CisK
KwkJfQorCisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKworCX0KKworCVVuaWZvcm0ucHJvdG90eXBl
LmNsb25lID0gZnVuY3Rpb24gKCkgeworCisJCXJldHVybiBuZXcgVW5pZm9ybSggdGhpcy52YWx1
ZS5jbG9uZSA9PT0gdW5kZWZpbmVkID8gdGhpcy52YWx1ZSA6IHRoaXMudmFsdWUuY2xvbmUoKSAp
OworCisJfTsKKworCS8qKgorCSAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVy
LmNvbS9iZW5fYV9hZGFtcworCSAqLworCisJZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyR2VvbWV0
cnkoKSB7CisKKwkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9
ICdJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSc7CisJCXRoaXMubWF4SW5zdGFuY2VkQ291bnQgPSB1
bmRlZmluZWQ7CisKKwl9CisKKwlJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBP
YmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKSwg
eworCisJCWNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSwKKworCQlpc0luc3Rh
bmNlZEJ1ZmZlckdlb21ldHJ5OiB0cnVlLAorCisJCWFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0
LCBjb3VudCwgbWF0ZXJpYWxJbmRleCApIHsKKworCQkJdGhpcy5ncm91cHMucHVzaCggeworCisJ
CQkJc3RhcnQ6IHN0YXJ0LAorCQkJCWNvdW50OiBjb3VudCwKKwkJCQltYXRlcmlhbEluZGV4OiBt
YXRlcmlhbEluZGV4CisKKwkJCX0gKTsKKworCQl9LAorCisJCWNvcHk6IGZ1bmN0aW9uICggc291
cmNlICkgeworCisJCQl2YXIgaW5kZXggPSBzb3VyY2UuaW5kZXg7CisKKwkJCWlmICggaW5kZXgg
IT09IG51bGwgKSB7CisKKwkJCQl0aGlzLnNldEluZGV4KCBpbmRleC5jbG9uZSgpICk7CisKKwkJ
CX0KKworCQkJdmFyIGF0dHJpYnV0ZXMgPSBzb3VyY2UuYXR0cmlidXRlczsKKworCQkJZm9yICgg
dmFyIG5hbWUgaW4gYXR0cmlidXRlcyApIHsKKworCQkJCXZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1
dGVzWyBuYW1lIF07CisJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZS5jbG9u
ZSgpICk7CisKKwkJCX0KKworCQkJdmFyIGdyb3VwcyA9IHNvdXJjZS5ncm91cHM7CisKKwkJCWZv
ciAoIHZhciBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJ
dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07CisJCQkJdGhpcy5hZGRHcm91cCggZ3JvdXAuc3RhcnQs
IGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7CisKKwkJCX0KKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBiZW5hYWRhbXMgLyBo
dHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zCisJICovCisKKwlmdW5jdGlvbiBJbnRlcmxl
YXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIGl0ZW1TaXplLCBvZmZzZXQs
IG5vcm1hbGl6ZWQgKSB7CisKKwkJdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CisK
KwkJdGhpcy5kYXRhID0gaW50ZXJsZWF2ZWRCdWZmZXI7CisJCXRoaXMuaXRlbVNpemUgPSBpdGVt
U2l6ZTsKKwkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisKKwkJdGhpcy5ub3JtYWxpemVkID0gbm9y
bWFsaXplZCA9PT0gdHJ1ZTsKKworCX0KKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBJbnRl
cmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHsKKworCQljb3VudDogeworCisJCQln
ZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCXJldHVybiB0aGlzLmRhdGEuY291bnQ7CisKKwkJCX0K
KworCQl9LAorCisJCWFycmF5OiB7CisKKwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJcmV0
dXJuIHRoaXMuZGF0YS5hcnJheTsKKworCQkJfQorCisJCX0KKworCX0gKTsKKworCU9iamVjdC5h
c3NpZ24oIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwgeworCisJCWlzSW50
ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsCisKKwkJc2V0WDogZnVuY3Rpb24gKCBpbmRl
eCwgeCApIHsKKworCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUg
KyB0aGlzLm9mZnNldCBdID0geDsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRZ
OiBmdW5jdGlvbiAoIGluZGV4LCB5ICkgeworCisJCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICog
dGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdID0geTsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfSwKKworCQlzZXRaOiBmdW5jdGlvbiAoIGluZGV4LCB6ICkgeworCisJCQl0aGlz
LmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBd
ID0gejsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRXOiBmdW5jdGlvbiAoIGlu
ZGV4LCB3ICkgeworCisJCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlk
ZSArIHRoaXMub2Zmc2V0ICsgMyBdID0gdzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKwor
CQlnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisJCQlyZXR1cm4gdGhpcy5kYXRhLmFycmF5
WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCBdOworCisJCX0sCisKKwkJ
Z2V0WTogZnVuY3Rpb24gKCBpbmRleCApIHsKKworCQkJcmV0dXJuIHRoaXMuZGF0YS5hcnJheVsg
aW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAxIF07CisKKwkJfSwKKwor
CQlnZXRaOiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisJCQlyZXR1cm4gdGhpcy5kYXRhLmFycmF5
WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXTsKKworCQl9LAor
CisJCWdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7CisKKwkJCXJldHVybiB0aGlzLmRhdGEuYXJy
YXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMyBdOworCisJCX0s
CisKKwkJc2V0WFk6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHkgKSB7CisKKwkJCWluZGV4ID0gaW5k
ZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7CisKKwkJCXRoaXMuZGF0YS5hcnJh
eVsgaW5kZXggKyAwIF0gPSB4OworCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7
CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0WFlaOiBmdW5jdGlvbiAoIGluZGV4
LCB4LCB5LCB6ICkgeworCisJCQlpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRo
aXMub2Zmc2V0OworCisJCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDsKKwkJCXRo
aXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5OworCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRl
eCArIDIgXSA9IHo7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0WFlaVzogZnVu
Y3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHsKKworCQkJaW5kZXggPSBpbmRleCAqIHRoaXMu
ZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDsKKworCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCAr
IDAgXSA9IHg7CisJCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTsKKwkJCXRoaXMu
ZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6OworCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCAr
IDMgXSA9IHc7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAq
IEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtcworCSAq
LworCisJZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUgKSB7CisKKwkJ
dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CisKKwkJdGhpcy5hcnJheSA9IGFycmF5
OworCQl0aGlzLnN0cmlkZSA9IHN0cmlkZTsKKwkJdGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRl
ZmluZWQgPyBhcnJheS5sZW5ndGggLyBzdHJpZGUgOiAwOworCisJCXRoaXMuZHluYW1pYyA9IGZh
bHNlOworCQl0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTsKKwor
CQl0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKKworCQl0aGlzLnZlcnNp
b24gPSAwOworCisJfQorCisJT2JqZWN0LmRlZmluZVByb3BlcnR5KCBJbnRlcmxlYXZlZEJ1ZmZl
ci5wcm90b3R5cGUsICduZWVkc1VwZGF0ZScsIHsKKworCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUg
KSB7CisKKwkJCWlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7CisKKwkJfQor
CisJfSApOworCisJT2JqZWN0LmFzc2lnbiggSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLCB7
CisKKwkJaXNJbnRlcmxlYXZlZEJ1ZmZlcjogdHJ1ZSwKKworCQlzZXRBcnJheTogZnVuY3Rpb24g
KCBhcnJheSApIHsKKworCQkJaWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkgeworCisJCQkJ
dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxk
IGJlIGEgVHlwZWQgQXJyYXkuJyApOworCisJCQl9CisKKwkJCXRoaXMuY291bnQgPSBhcnJheSAh
PT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gdGhpcy5zdHJpZGUgOiAwOworCQkJdGhpcy5h
cnJheSA9IGFycmF5OworCisJCX0sCisKKwkJc2V0RHluYW1pYzogZnVuY3Rpb24gKCB2YWx1ZSAp
IHsKKworCQkJdGhpcy5keW5hbWljID0gdmFsdWU7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0s
CisKKwkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJCXRoaXMuYXJyYXkgPSBuZXcg
c291cmNlLmFycmF5LmNvbnN0cnVjdG9yKCBzb3VyY2UuYXJyYXkgKTsKKwkJCXRoaXMuY291bnQg
PSBzb3VyY2UuY291bnQ7CisJCQl0aGlzLnN0cmlkZSA9IHNvdXJjZS5zdHJpZGU7CisJCQl0aGlz
LmR5bmFtaWMgPSBzb3VyY2UuZHluYW1pYzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKwor
CQljb3B5QXQ6IGZ1bmN0aW9uICggaW5kZXgxLCBhdHRyaWJ1dGUsIGluZGV4MiApIHsKKworCQkJ
aW5kZXgxICo9IHRoaXMuc3RyaWRlOworCQkJaW5kZXgyICo9IGF0dHJpYnV0ZS5zdHJpZGU7CisK
KwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuc3RyaWRlOyBpIDwgbDsgaSArKyApIHsKKwor
CQkJCXRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsg
aSBdOworCisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0OiBmdW5jdGlv
biAoIHZhbHVlLCBvZmZzZXQgKSB7CisKKwkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBv
ZmZzZXQgPSAwOworCisJCQl0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNldCApOworCisJCQly
ZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVy
biBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKworCQl9LAorCisJCW9uVXBs
b2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkgeworCisJCQl0aGlzLm9uVXBsb2FkQ2FsbGJhY2sg
PSBjYWxsYmFjazsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfQorCisJfSApOworCisJLyoqCisJ
ICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zCisJ
ICovCisKKwlmdW5jdGlvbiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlk
ZSwgbWVzaFBlckF0dHJpYnV0ZSApIHsKKworCQlJbnRlcmxlYXZlZEJ1ZmZlci5jYWxsKCB0aGlz
LCBhcnJheSwgc3RyaWRlICk7CisKKwkJdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0
dHJpYnV0ZSB8fCAxOworCisJfQorCisJSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90
eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJsZWF2ZWRCdWZmZXIucHJv
dG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIs
CisKKwkJaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjogdHJ1ZSwKKworCQljb3B5OiBmdW5j
dGlvbiAoIHNvdXJjZSApIHsKKworCQkJSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLmNvcHku
Y2FsbCggdGhpcywgc291cmNlICk7CisKKwkJCXRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJj
ZS5tZXNoUGVyQXR0cmlidXRlOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9CisKKwl9ICk7CisK
KwkvKioKKwkgKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2Ff
YWRhbXMKKwkgKi8KKworCWZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXks
IGl0ZW1TaXplLCBtZXNoUGVyQXR0cmlidXRlICkgeworCisJCUJ1ZmZlckF0dHJpYnV0ZS5jYWxs
KCB0aGlzLCBhcnJheSwgaXRlbVNpemUgKTsKKworCQl0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBt
ZXNoUGVyQXR0cmlidXRlIHx8IDE7CisKKwl9CisKKwlJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUu
cHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRl
LnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0
ZSwKKworCQlpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTogdHJ1ZSwKKworCQljb3B5OiBmdW5j
dGlvbiAoIHNvdXJjZSApIHsKKworCQkJQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb3B5LmNh
bGwoIHRoaXMsIHNvdXJjZSApOworCisJCQl0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2Uu
bWVzaFBlckF0dHJpYnV0ZTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfQorCisJfSApOworCisJ
LyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9y
IGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLworCSAqIEBhdXRob3Igc3RlcGhvbWkgLyBodHRw
Oi8vc3RlcGhhbmVnaW5pZXIuY29tLworCSAqLworCisJZnVuY3Rpb24gUmF5Y2FzdGVyKCBvcmln
aW4sIGRpcmVjdGlvbiwgbmVhciwgZmFyICkgeworCisJCXRoaXMucmF5ID0gbmV3IFJheSggb3Jp
Z2luLCBkaXJlY3Rpb24gKTsKKwkJLy8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFs
aXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucykKKworCQl0aGlzLm5lYXIg
PSBuZWFyIHx8IDA7CisJCXRoaXMuZmFyID0gZmFyIHx8IEluZmluaXR5OworCisJCXRoaXMucGFy
YW1zID0geworCQkJTWVzaDoge30sCisJCQlMaW5lOiB7fSwKKwkJCUxPRDoge30sCisJCQlQb2lu
dHM6IHsgdGhyZXNob2xkOiAxIH0sCisJCQlTcHJpdGU6IHt9CisJCX07CisKKwkJT2JqZWN0LmRl
ZmluZVByb3BlcnRpZXMoIHRoaXMucGFyYW1zLCB7CisJCQlQb2ludENsb3VkOiB7CisJCQkJZ2V0
OiBmdW5jdGlvbiAoKSB7CisJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3RlcjogcGFy
YW1zLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBwYXJhbXMuUG9pbnRzLicgKTsKKwkJ
CQkJcmV0dXJuIHRoaXMuUG9pbnRzOworCQkJCX0KKwkJCX0KKwkJfSApOworCisJfQorCisJZnVu
Y3Rpb24gYXNjU29ydCggYSwgYiApIHsKKworCQlyZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFu
Y2U7CisKKwl9CisKKwlmdW5jdGlvbiBpbnRlcnNlY3RPYmplY3QoIG9iamVjdCwgcmF5Y2FzdGVy
LCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKSB7CisKKwkJaWYgKCBvYmplY3QudmlzaWJsZSA9PT0g
ZmFsc2UgKSByZXR1cm47CisKKwkJb2JqZWN0LnJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0
cyApOworCisJCWlmICggcmVjdXJzaXZlID09PSB0cnVlICkgeworCisJCQl2YXIgY2hpbGRyZW4g
PSBvYmplY3QuY2hpbGRyZW47CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxl
bmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQlpbnRlcnNlY3RPYmplY3QoIGNoaWxkcmVuWyBp
IF0sIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdHJ1ZSApOworCisJCQl9CisKKwkJfQorCisJfQor
CisJT2JqZWN0LmFzc2lnbiggUmF5Y2FzdGVyLnByb3RvdHlwZSwgeworCisJCWxpbmVQcmVjaXNp
b246IDEsCisKKwkJc2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkgeworCisJCQkv
LyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlz
dGFuY2UgY2FsY3VsYXRpb25zKQorCisJCQl0aGlzLnJheS5zZXQoIG9yaWdpbiwgZGlyZWN0aW9u
ICk7CisKKwkJfSwKKworCQlzZXRGcm9tQ2FtZXJhOiBmdW5jdGlvbiAoIGNvb3JkcywgY2FtZXJh
ICkgeworCisJCQlpZiAoICggY2FtZXJhICYmIGNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhICkg
KSB7CisKKwkJCQl0aGlzLnJheS5vcmlnaW4uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEu
bWF0cml4V29ybGQgKTsKKwkJCQl0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCBjb29yZHMueCwgY29v
cmRzLnksIDAuNSApLnVucHJvamVjdCggY2FtZXJhICkuc3ViKCB0aGlzLnJheS5vcmlnaW4gKS5u
b3JtYWxpemUoKTsKKworCQkJfSBlbHNlIGlmICggKCBjYW1lcmEgJiYgY2FtZXJhLmlzT3J0aG9n
cmFwaGljQ2FtZXJhICkgKSB7CisKKwkJCQl0aGlzLnJheS5vcmlnaW4uc2V0KCBjb29yZHMueCwg
Y29vcmRzLnksICggY2FtZXJhLm5lYXIgKyBjYW1lcmEuZmFyICkgLyAoIGNhbWVyYS5uZWFyIC0g
Y2FtZXJhLmZhciApICkudW5wcm9qZWN0KCBjYW1lcmEgKTsgLy8gc2V0IG9yaWdpbiBpbiBwbGFu
ZSBvZiBjYW1lcmEKKwkJCQl0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCAwLCAwLCAtIDEgKS50cmFu
c2Zvcm1EaXJlY3Rpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApOworCisJCQl9IGVsc2UgeworCisJ
CQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlJheWNhc3RlcjogVW5zdXBwb3J0ZWQgY2FtZXJhIHR5
cGUuJyApOworCisJCQl9CisKKwkJfSwKKworCQlpbnRlcnNlY3RPYmplY3Q6IGZ1bmN0aW9uICgg
b2JqZWN0LCByZWN1cnNpdmUgKSB7CisKKwkJCXZhciBpbnRlcnNlY3RzID0gW107CisKKwkJCWlu
dGVyc2VjdE9iamVjdCggb2JqZWN0LCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTsKKwor
CQkJaW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7CisKKwkJCXJldHVybiBpbnRlcnNlY3RzOwor
CisJCX0sCisKKwkJaW50ZXJzZWN0T2JqZWN0czogZnVuY3Rpb24gKCBvYmplY3RzLCByZWN1cnNp
dmUgKSB7CisKKwkJCXZhciBpbnRlcnNlY3RzID0gW107CisKKwkJCWlmICggQXJyYXkuaXNBcnJh
eSggb2JqZWN0cyApID09PSBmYWxzZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlJh
eWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzOiBvYmplY3RzIGlzIG5vdCBhbiBBcnJheS4nICk7CisJ
CQkJcmV0dXJuIGludGVyc2VjdHM7CisKKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwLCBsID0g
b2JqZWN0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJaW50ZXJzZWN0T2JqZWN0KCBv
YmplY3RzWyBpIF0sIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApOworCisJCQl9CisKKwkJ
CWludGVyc2VjdHMuc29ydCggYXNjU29ydCApOworCisJCQlyZXR1cm4gaW50ZXJzZWN0czsKKwor
CQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVy
ZWRxdWFsaWEuY29tLworCSAqLworCisJZnVuY3Rpb24gQ2xvY2soIGF1dG9TdGFydCApIHsKKwor
CQl0aGlzLmF1dG9TdGFydCA9ICggYXV0b1N0YXJ0ICE9PSB1bmRlZmluZWQgKSA/IGF1dG9TdGFy
dCA6IHRydWU7CisKKwkJdGhpcy5zdGFydFRpbWUgPSAwOworCQl0aGlzLm9sZFRpbWUgPSAwOwor
CQl0aGlzLmVsYXBzZWRUaW1lID0gMDsKKworCQl0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKKworCX0K
KworCU9iamVjdC5hc3NpZ24oIENsb2NrLnByb3RvdHlwZSwgeworCisJCXN0YXJ0OiBmdW5jdGlv
biAoKSB7CisKKwkJCXRoaXMuc3RhcnRUaW1lID0gKCB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1
bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7IC8vIHNlZSAjMTA3MzIKKwor
CQkJdGhpcy5vbGRUaW1lID0gdGhpcy5zdGFydFRpbWU7CisJCQl0aGlzLmVsYXBzZWRUaW1lID0g
MDsKKwkJCXRoaXMucnVubmluZyA9IHRydWU7CisKKwkJfSwKKworCQlzdG9wOiBmdW5jdGlvbiAo
KSB7CisKKwkJCXRoaXMuZ2V0RWxhcHNlZFRpbWUoKTsKKwkJCXRoaXMucnVubmluZyA9IGZhbHNl
OworCQkJdGhpcy5hdXRvU3RhcnQgPSBmYWxzZTsKKworCQl9LAorCisJCWdldEVsYXBzZWRUaW1l
OiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMuZ2V0RGVsdGEoKTsKKwkJCXJldHVybiB0aGlzLmVs
YXBzZWRUaW1lOworCisJCX0sCisKKwkJZ2V0RGVsdGE6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFy
IGRpZmYgPSAwOworCisJCQlpZiAoIHRoaXMuYXV0b1N0YXJ0ICYmICEgdGhpcy5ydW5uaW5nICkg
eworCisJCQkJdGhpcy5zdGFydCgpOworCQkJCXJldHVybiAwOworCisJCQl9CisKKwkJCWlmICgg
dGhpcy5ydW5uaW5nICkgeworCisJCQkJdmFyIG5ld1RpbWUgPSAoIHR5cGVvZiBwZXJmb3JtYW5j
ZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlIDogcGVyZm9ybWFuY2UgKS5ub3coKTsKKworCQkJCWRp
ZmYgPSAoIG5ld1RpbWUgLSB0aGlzLm9sZFRpbWUgKSAvIDEwMDA7CisJCQkJdGhpcy5vbGRUaW1l
ID0gbmV3VGltZTsKKworCQkJCXRoaXMuZWxhcHNlZFRpbWUgKz0gZGlmZjsKKworCQkJfQorCisJ
CQlyZXR1cm4gZGlmZjsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGJob3Vz
dG9uIC8gaHR0cDovL2NsYXJhLmlvCisJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9n
aXRodWIuY29tL1dlc3RMYW5nbGV5CisJICoKKwkgKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlh
Lm9yZy93aWtpL1NwaGVyaWNhbF9jb29yZGluYXRlX3N5c3RlbQorCSAqCisJICogVGhlIHBvbGVz
IChwaGkpIGFyZSBhdCB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHkgYXhpcy4KKwkgKiBUaGUg
ZXF1YXRvciBzdGFydHMgYXQgcG9zaXRpdmUgei4KKwkgKi8KKworCWZ1bmN0aW9uIFNwaGVyaWNh
bCggcmFkaXVzLCBwaGksIHRoZXRhICkgeworCisJCXRoaXMucmFkaXVzID0gKCByYWRpdXMgIT09
IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMS4wOworCQl0aGlzLnBoaSA9ICggcGhpICE9PSB1bmRl
ZmluZWQgKSA/IHBoaSA6IDA7IC8vIHVwIC8gZG93biB0b3dhcmRzIHRvcCBhbmQgYm90dG9tIHBv
bGUKKwkJdGhpcy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAv
LyBhcm91bmQgdGhlIGVxdWF0b3Igb2YgdGhlIHNwaGVyZQorCisJCXJldHVybiB0aGlzOworCisJ
fQorCisJT2JqZWN0LmFzc2lnbiggU3BoZXJpY2FsLnByb3RvdHlwZSwgeworCisJCXNldDogZnVu
Y3Rpb24gKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7CisKKwkJCXRoaXMucmFkaXVzID0gcmFkaXVz
OworCQkJdGhpcy5waGkgPSBwaGk7CisJCQl0aGlzLnRoZXRhID0gdGhldGE7CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5l
dyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOworCisJCX0sCisKKwkJY29weTogZnVu
Y3Rpb24gKCBvdGhlciApIHsKKworCQkJdGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7CisJCQl0
aGlzLnBoaSA9IG90aGVyLnBoaTsKKwkJCXRoaXMudGhldGEgPSBvdGhlci50aGV0YTsKKworCQkJ
cmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQkvLyByZXN0cmljdCBwaGkgdG8gYmUgYmV0d2VlIEVQ
UyBhbmQgUEktRVBTCisJCW1ha2VTYWZlOiBmdW5jdGlvbigpIHsKKworCQkJdmFyIEVQUyA9IDAu
MDAwMDAxOworCQkJdGhpcy5waGkgPSBNYXRoLm1heCggRVBTLCBNYXRoLm1pbiggTWF0aC5QSSAt
IEVQUywgdGhpcy5waGkgKSApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldEZy
b21WZWN0b3IzOiBmdW5jdGlvbiggdmVjMyApIHsKKworCQkJdGhpcy5yYWRpdXMgPSB2ZWMzLmxl
bmd0aCgpOworCisJCQlpZiAoIHRoaXMucmFkaXVzID09PSAwICkgeworCisJCQkJdGhpcy50aGV0
YSA9IDA7CisJCQkJdGhpcy5waGkgPSAwOworCisJCQl9IGVsc2UgeworCisJCQkJdGhpcy50aGV0
YSA9IE1hdGguYXRhbjIoIHZlYzMueCwgdmVjMy56ICk7IC8vIGVxdWF0b3IgYW5nbGUgYXJvdW5k
IHktdXAgYXhpcworCQkJCXRoaXMucGhpID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdmVjMy55
IC8gdGhpcy5yYWRpdXMsIC0gMSwgMSApICk7IC8vIHBvbGFyIGFuZ2xlCisKKwkJCX0KKworCQkJ
cmV0dXJuIHRoaXM7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBNdWdlbjg3
IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKwkgKgorCSAqIFJlZjogaHR0cHM6Ly9lbi53
aWtpcGVkaWEub3JnL3dpa2kvQ3lsaW5kcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW0KKwkgKgorCSAq
LworCisJZnVuY3Rpb24gQ3lsaW5kcmljYWwoIHJhZGl1cywgdGhldGEsIHkgKSB7CisKKwkJdGhp
cy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAxLjA7IC8vIGRp
c3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byBhIHBvaW50IGluIHRoZSB4LXogcGxhbmUKKwkJdGhp
cy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAvLyBjb3VudGVy
Y2xvY2t3aXNlIGFuZ2xlIGluIHRoZSB4LXogcGxhbmUgbWVhc3VyZWQgaW4gcmFkaWFucyBmcm9t
IHRoZSBwb3NpdGl2ZSB6LWF4aXMKKwkJdGhpcy55ID0gKCB5ICE9PSB1bmRlZmluZWQgKSA/IHkg
OiAwOyAvLyBoZWlnaHQgYWJvdmUgdGhlIHgteiBwbGFuZQorCisJCXJldHVybiB0aGlzOworCisJ
fQorCisJT2JqZWN0LmFzc2lnbiggQ3lsaW5kcmljYWwucHJvdG90eXBlLCB7CisKKwkJc2V0OiBm
dW5jdGlvbiAoIHJhZGl1cywgdGhldGEsIHkgKSB7CisKKwkJCXRoaXMucmFkaXVzID0gcmFkaXVz
OworCQkJdGhpcy50aGV0YSA9IHRoZXRhOworCQkJdGhpcy55ID0geTsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRo
aXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlv
biAoIG90aGVyICkgeworCisJCQl0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1czsKKwkJCXRoaXMu
dGhldGEgPSBvdGhlci50aGV0YTsKKwkJCXRoaXMueSA9IG90aGVyLnk7CisKKwkJCXJldHVybiB0
aGlzOworCisJCX0sCisKKwkJc2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uKCB2ZWMzICkgeworCisJ
CQl0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggdmVjMy54ICogdmVjMy54ICsgdmVjMy56ICogdmVj
My56ICk7CisJCQl0aGlzLnRoZXRhID0gTWF0aC5hdGFuMiggdmVjMy54LCB2ZWMzLnogKTsKKwkJ
CXRoaXMueSA9IHZlYzMueTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfQorCisJfSApOworCisJ
LyoqDQorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vDQor
CSAqLw0KKw0KKwlmdW5jdGlvbiBNb3JwaEJsZW5kTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkg
eworDQorCQlNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApOw0KKw0KKwkJdGhp
cy5hbmltYXRpb25zTWFwID0ge307DQorCQl0aGlzLmFuaW1hdGlvbnNMaXN0ID0gW107DQorDQor
CQkvLyBwcmVwYXJlIGRlZmF1bHQgYW5pbWF0aW9uDQorCQkvLyAoYWxsIGZyYW1lcyBwbGF5ZWQg
dG9nZXRoZXIgaW4gMSBzZWNvbmQpDQorDQorCQl2YXIgbnVtRnJhbWVzID0gdGhpcy5nZW9tZXRy
eS5tb3JwaFRhcmdldHMubGVuZ3RoOw0KKw0KKwkJdmFyIG5hbWUgPSAiX19kZWZhdWx0IjsNCisN
CisJCXZhciBzdGFydEZyYW1lID0gMDsNCisJCXZhciBlbmRGcmFtZSA9IG51bUZyYW1lcyAtIDE7
DQorDQorCQl2YXIgZnBzID0gbnVtRnJhbWVzIC8gMTsNCisNCisJCXRoaXMuY3JlYXRlQW5pbWF0
aW9uKCBuYW1lLCBzdGFydEZyYW1lLCBlbmRGcmFtZSwgZnBzICk7DQorCQl0aGlzLnNldEFuaW1h
dGlvbldlaWdodCggbmFtZSwgMSApOw0KKw0KKwl9DQorDQorCU1vcnBoQmxlbmRNZXNoLnByb3Rv
dHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICk7DQorCU1vcnBoQmxlbmRNZXNo
LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1vcnBoQmxlbmRNZXNoOw0KKw0KKwlNb3JwaEJsZW5k
TWVzaC5wcm90b3R5cGUuY3JlYXRlQW5pbWF0aW9uID0gZnVuY3Rpb24gKCBuYW1lLCBzdGFydCwg
ZW5kLCBmcHMgKSB7DQorDQorCQl2YXIgYW5pbWF0aW9uID0gew0KKw0KKwkJCXN0YXJ0OiBzdGFy
dCwNCisJCQllbmQ6IGVuZCwNCisNCisJCQlsZW5ndGg6IGVuZCAtIHN0YXJ0ICsgMSwNCisNCisJ
CQlmcHM6IGZwcywNCisJCQlkdXJhdGlvbjogKCBlbmQgLSBzdGFydCApIC8gZnBzLA0KKw0KKwkJ
CWxhc3RGcmFtZTogMCwNCisJCQljdXJyZW50RnJhbWU6IDAsDQorDQorCQkJYWN0aXZlOiBmYWxz
ZSwNCisNCisJCQl0aW1lOiAwLA0KKwkJCWRpcmVjdGlvbjogMSwNCisJCQl3ZWlnaHQ6IDEsDQor
DQorCQkJZGlyZWN0aW9uQmFja3dhcmRzOiBmYWxzZSwNCisJCQltaXJyb3JlZExvb3A6IGZhbHNl
DQorDQorCQl9Ow0KKw0KKwkJdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF0gPSBhbmltYXRpb247
DQorCQl0aGlzLmFuaW1hdGlvbnNMaXN0LnB1c2goIGFuaW1hdGlvbiApOw0KKw0KKwl9Ow0KKw0K
KwlNb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuYXV0b0NyZWF0ZUFuaW1hdGlvbnMgPSBmdW5jdGlv
biAoIGZwcyApIHsNCisNCisJCXZhciBwYXR0ZXJuID0gLyhbYS16XSspXz8oXGQrKS9pOw0KKw0K
KwkJdmFyIGZpcnN0QW5pbWF0aW9uLCBmcmFtZVJhbmdlcyA9IHt9Ow0KKw0KKwkJdmFyIGdlb21l
dHJ5ID0gdGhpcy5nZW9tZXRyeTsNCisNCisJCWZvciAoIHZhciBpID0gMCwgaWwgPSBnZW9tZXRy
eS5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7DQorDQorCQkJdmFyIG1vcnBo
ID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF07DQorCQkJdmFyIGNodW5rcyA9IG1vcnBoLm5h
bWUubWF0Y2goIHBhdHRlcm4gKTsNCisNCisJCQlpZiAoIGNodW5rcyAmJiBjaHVua3MubGVuZ3Ro
ID4gMSApIHsNCisNCisJCQkJdmFyIG5hbWUgPSBjaHVua3NbIDEgXTsNCisNCisJCQkJaWYgKCAh
IGZyYW1lUmFuZ2VzWyBuYW1lIF0gKSBmcmFtZVJhbmdlc1sgbmFtZSBdID0geyBzdGFydDogSW5m
aW5pdHksIGVuZDogLSBJbmZpbml0eSB9Ow0KKw0KKwkJCQl2YXIgcmFuZ2UgPSBmcmFtZVJhbmdl
c1sgbmFtZSBdOw0KKw0KKwkJCQlpZiAoIGkgPCByYW5nZS5zdGFydCApIHJhbmdlLnN0YXJ0ID0g
aTsNCisJCQkJaWYgKCBpID4gcmFuZ2UuZW5kICkgcmFuZ2UuZW5kID0gaTsNCisNCisJCQkJaWYg
KCAhIGZpcnN0QW5pbWF0aW9uICkgZmlyc3RBbmltYXRpb24gPSBuYW1lOw0KKw0KKwkJCX0NCisN
CisJCX0NCisNCisJCWZvciAoIHZhciBuYW1lIGluIGZyYW1lUmFuZ2VzICkgew0KKw0KKwkJCXZh
ciByYW5nZSA9IGZyYW1lUmFuZ2VzWyBuYW1lIF07DQorCQkJdGhpcy5jcmVhdGVBbmltYXRpb24o
IG5hbWUsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQsIGZwcyApOw0KKw0KKwkJfQ0KKw0KKwkJdGhp
cy5maXJzdEFuaW1hdGlvbiA9IGZpcnN0QW5pbWF0aW9uOw0KKw0KKwl9Ow0KKw0KKwlNb3JwaEJs
ZW5kTWVzaC5wcm90b3R5cGUuc2V0QW5pbWF0aW9uRGlyZWN0aW9uRm9yd2FyZCA9IGZ1bmN0aW9u
ICggbmFtZSApIHsNCisNCisJCXZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5h
bWUgXTsNCisNCisJCWlmICggYW5pbWF0aW9uICkgew0KKw0KKwkJCWFuaW1hdGlvbi5kaXJlY3Rp
b24gPSAxOw0KKwkJCWFuaW1hdGlvbi5kaXJlY3Rpb25CYWNrd2FyZHMgPSBmYWxzZTsNCisNCisJ
CX0NCisNCisJfTsNCisNCisJTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnNldEFuaW1hdGlvbkRp
cmVjdGlvbkJhY2t3YXJkID0gZnVuY3Rpb24gKCBuYW1lICkgew0KKw0KKwkJdmFyIGFuaW1hdGlv
biA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdOw0KKw0KKwkJaWYgKCBhbmltYXRpb24gKSB7
DQorDQorCQkJYW5pbWF0aW9uLmRpcmVjdGlvbiA9IC0gMTsNCisJCQlhbmltYXRpb24uZGlyZWN0
aW9uQmFja3dhcmRzID0gdHJ1ZTsNCisNCisJCX0NCisNCisJfTsNCisNCisJTW9ycGhCbGVuZE1l
c2gucHJvdG90eXBlLnNldEFuaW1hdGlvbkZQUyA9IGZ1bmN0aW9uICggbmFtZSwgZnBzICkgew0K
Kw0KKwkJdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdOw0KKw0KKwkJ
aWYgKCBhbmltYXRpb24gKSB7DQorDQorCQkJYW5pbWF0aW9uLmZwcyA9IGZwczsNCisJCQlhbmlt
YXRpb24uZHVyYXRpb24gPSAoIGFuaW1hdGlvbi5lbmQgLSBhbmltYXRpb24uc3RhcnQgKSAvIGFu
aW1hdGlvbi5mcHM7DQorDQorCQl9DQorDQorCX07DQorDQorCU1vcnBoQmxlbmRNZXNoLnByb3Rv
dHlwZS5zZXRBbmltYXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uICggbmFtZSwgZHVyYXRpb24gKSB7
DQorDQorCQl2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07DQorDQor
CQlpZiAoIGFuaW1hdGlvbiApIHsNCisNCisJCQlhbmltYXRpb24uZHVyYXRpb24gPSBkdXJhdGlv
bjsNCisJCQlhbmltYXRpb24uZnBzID0gKCBhbmltYXRpb24uZW5kIC0gYW5pbWF0aW9uLnN0YXJ0
ICkgLyBhbmltYXRpb24uZHVyYXRpb247DQorDQorCQl9DQorDQorCX07DQorDQorCU1vcnBoQmxl
bmRNZXNoLnByb3RvdHlwZS5zZXRBbmltYXRpb25XZWlnaHQgPSBmdW5jdGlvbiAoIG5hbWUsIHdl
aWdodCApIHsNCisNCisJCXZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUg
XTsNCisNCisJCWlmICggYW5pbWF0aW9uICkgew0KKw0KKwkJCWFuaW1hdGlvbi53ZWlnaHQgPSB3
ZWlnaHQ7DQorDQorCQl9DQorDQorCX07DQorDQorCU1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5z
ZXRBbmltYXRpb25UaW1lID0gZnVuY3Rpb24gKCBuYW1lLCB0aW1lICkgew0KKw0KKwkJdmFyIGFu
aW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdOw0KKw0KKwkJaWYgKCBhbmltYXRp
b24gKSB7DQorDQorCQkJYW5pbWF0aW9uLnRpbWUgPSB0aW1lOw0KKw0KKwkJfQ0KKw0KKwl9Ow0K
Kw0KKwlNb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuZ2V0QW5pbWF0aW9uVGltZSA9IGZ1bmN0aW9u
ICggbmFtZSApIHsNCisNCisJCXZhciB0aW1lID0gMDsNCisNCisJCXZhciBhbmltYXRpb24gPSB0
aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTsNCisNCisJCWlmICggYW5pbWF0aW9uICkgew0KKw0K
KwkJCXRpbWUgPSBhbmltYXRpb24udGltZTsNCisNCisJCX0NCisNCisJCXJldHVybiB0aW1lOw0K
Kw0KKwl9Ow0KKw0KKwlNb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuZ2V0QW5pbWF0aW9uRHVyYXRp
b24gPSBmdW5jdGlvbiAoIG5hbWUgKSB7DQorDQorCQl2YXIgZHVyYXRpb24gPSAtIDE7DQorDQor
CQl2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07DQorDQorCQlpZiAo
IGFuaW1hdGlvbiApIHsNCisNCisJCQlkdXJhdGlvbiA9IGFuaW1hdGlvbi5kdXJhdGlvbjsNCisN
CisJCX0NCisNCisJCXJldHVybiBkdXJhdGlvbjsNCisNCisJfTsNCisNCisJTW9ycGhCbGVuZE1l
c2gucHJvdG90eXBlLnBsYXlBbmltYXRpb24gPSBmdW5jdGlvbiAoIG5hbWUgKSB7DQorDQorCQl2
YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07DQorDQorCQlpZiAoIGFu
aW1hdGlvbiApIHsNCisNCisJCQlhbmltYXRpb24udGltZSA9IDA7DQorCQkJYW5pbWF0aW9uLmFj
dGl2ZSA9IHRydWU7DQorDQorCQl9IGVsc2Ugew0KKw0KKwkJCWNvbnNvbGUud2FybiggIlRIUkVF
Lk1vcnBoQmxlbmRNZXNoOiBhbmltYXRpb25bIiArIG5hbWUgKyAiXSB1bmRlZmluZWQgaW4gLnBs
YXlBbmltYXRpb24oKSIgKTsNCisNCisJCX0NCisNCisJfTsNCisNCisJTW9ycGhCbGVuZE1lc2gu
cHJvdG90eXBlLnN0b3BBbmltYXRpb24gPSBmdW5jdGlvbiAoIG5hbWUgKSB7DQorDQorCQl2YXIg
YW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07DQorDQorCQlpZiAoIGFuaW1h
dGlvbiApIHsNCisNCisJCQlhbmltYXRpb24uYWN0aXZlID0gZmFsc2U7DQorDQorCQl9DQorDQor
CX07DQorDQorCU1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoIGRl
bHRhICkgew0KKw0KKwkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuYW5pbWF0aW9uc0xpc3Qu
bGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7DQorDQorCQkJdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5p
bWF0aW9uc0xpc3RbIGkgXTsNCisNCisJCQlpZiAoICEgYW5pbWF0aW9uLmFjdGl2ZSApIGNvbnRp
bnVlOw0KKw0KKwkJCXZhciBmcmFtZVRpbWUgPSBhbmltYXRpb24uZHVyYXRpb24gLyBhbmltYXRp
b24ubGVuZ3RoOw0KKw0KKwkJCWFuaW1hdGlvbi50aW1lICs9IGFuaW1hdGlvbi5kaXJlY3Rpb24g
KiBkZWx0YTsNCisNCisJCQlpZiAoIGFuaW1hdGlvbi5taXJyb3JlZExvb3AgKSB7DQorDQorCQkJ
CWlmICggYW5pbWF0aW9uLnRpbWUgPiBhbmltYXRpb24uZHVyYXRpb24gfHwgYW5pbWF0aW9uLnRp
bWUgPCAwICkgew0KKw0KKwkJCQkJYW5pbWF0aW9uLmRpcmVjdGlvbiAqPSAtIDE7DQorDQorCQkJ
CQlpZiAoIGFuaW1hdGlvbi50aW1lID4gYW5pbWF0aW9uLmR1cmF0aW9uICkgew0KKw0KKwkJCQkJ
CWFuaW1hdGlvbi50aW1lID0gYW5pbWF0aW9uLmR1cmF0aW9uOw0KKwkJCQkJCWFuaW1hdGlvbi5k
aXJlY3Rpb25CYWNrd2FyZHMgPSB0cnVlOw0KKw0KKwkJCQkJfQ0KKw0KKwkJCQkJaWYgKCBhbmlt
YXRpb24udGltZSA8IDAgKSB7DQorDQorCQkJCQkJYW5pbWF0aW9uLnRpbWUgPSAwOw0KKwkJCQkJ
CWFuaW1hdGlvbi5kaXJlY3Rpb25CYWNrd2FyZHMgPSBmYWxzZTsNCisNCisJCQkJCX0NCisNCisJ
CQkJfQ0KKw0KKwkJCX0gZWxzZSB7DQorDQorCQkJCWFuaW1hdGlvbi50aW1lID0gYW5pbWF0aW9u
LnRpbWUgJSBhbmltYXRpb24uZHVyYXRpb247DQorDQorCQkJCWlmICggYW5pbWF0aW9uLnRpbWUg
PCAwICkgYW5pbWF0aW9uLnRpbWUgKz0gYW5pbWF0aW9uLmR1cmF0aW9uOw0KKw0KKwkJCX0NCisN
CisJCQl2YXIga2V5ZnJhbWUgPSBhbmltYXRpb24uc3RhcnQgKyBfTWF0aC5jbGFtcCggTWF0aC5m
bG9vciggYW5pbWF0aW9uLnRpbWUgLyBmcmFtZVRpbWUgKSwgMCwgYW5pbWF0aW9uLmxlbmd0aCAt
IDEgKTsNCisJCQl2YXIgd2VpZ2h0ID0gYW5pbWF0aW9uLndlaWdodDsNCisNCisJCQlpZiAoIGtl
eWZyYW1lICE9PSBhbmltYXRpb24uY3VycmVudEZyYW1lICkgew0KKw0KKwkJCQl0aGlzLm1vcnBo
VGFyZ2V0SW5mbHVlbmNlc1sgYW5pbWF0aW9uLmxhc3RGcmFtZSBdID0gMDsNCisJCQkJdGhpcy5t
b3JwaFRhcmdldEluZmx1ZW5jZXNbIGFuaW1hdGlvbi5jdXJyZW50RnJhbWUgXSA9IDEgKiB3ZWln
aHQ7DQorDQorCQkJCXRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBrZXlmcmFtZSBdID0gMDsN
CisNCisJCQkJYW5pbWF0aW9uLmxhc3RGcmFtZSA9IGFuaW1hdGlvbi5jdXJyZW50RnJhbWU7DQor
CQkJCWFuaW1hdGlvbi5jdXJyZW50RnJhbWUgPSBrZXlmcmFtZTsNCisNCisJCQl9DQorDQorCQkJ
dmFyIG1peCA9ICggYW5pbWF0aW9uLnRpbWUgJSBmcmFtZVRpbWUgKSAvIGZyYW1lVGltZTsNCisN
CisJCQlpZiAoIGFuaW1hdGlvbi5kaXJlY3Rpb25CYWNrd2FyZHMgKSBtaXggPSAxIC0gbWl4Ow0K
Kw0KKwkJCWlmICggYW5pbWF0aW9uLmN1cnJlbnRGcmFtZSAhPT0gYW5pbWF0aW9uLmxhc3RGcmFt
ZSApIHsNCisNCisJCQkJdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGFuaW1hdGlvbi5jdXJy
ZW50RnJhbWUgXSA9IG1peCAqIHdlaWdodDsNCisJCQkJdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5j
ZXNbIGFuaW1hdGlvbi5sYXN0RnJhbWUgXSA9ICggMSAtIG1peCApICogd2VpZ2h0Ow0KKw0KKwkJ
CX0gZWxzZSB7DQorDQorCQkJCXRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBhbmltYXRpb24u
Y3VycmVudEZyYW1lIF0gPSB3ZWlnaHQ7DQorDQorCQkJfQ0KKw0KKwkJfQ0KKw0KKwl9OworCisJ
LyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkg
Ki8KKworCWZ1bmN0aW9uIEltbWVkaWF0ZVJlbmRlck9iamVjdCggbWF0ZXJpYWwgKSB7CisKKwkJ
T2JqZWN0M0QuY2FsbCggdGhpcyApOworCisJCXRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDsKKwkJ
dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHJlbmRlckNhbGxiYWNrICkge307CisKKwl9CisKKwlJ
bW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0Qu
cHJvdG90eXBlICk7CisJSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rv
ciA9IEltbWVkaWF0ZVJlbmRlck9iamVjdDsKKworCUltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90
b3R5cGUuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgPSB0cnVlOworCisJLyoqCisJICogQGF1dGhv
ciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8g
aHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKwkqLworCisJZnVuY3Rpb24gVmVydGV4Tm9y
bWFsc0hlbHBlciggb2JqZWN0LCBzaXplLCBoZXgsIGxpbmV3aWR0aCApIHsKKworCQl0aGlzLm9i
amVjdCA9IG9iamVjdDsKKworCQl0aGlzLnNpemUgPSAoIHNpemUgIT09IHVuZGVmaW5lZCApID8g
c2l6ZSA6IDE7CisKKwkJdmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDog
MHhmZjAwMDA7CisKKwkJdmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8g
bGluZXdpZHRoIDogMTsKKworCQkvLworCisJCXZhciBuTm9ybWFscyA9IDA7CisKKwkJdmFyIG9i
akdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7CisKKwkJaWYgKCBvYmpHZW9tZXRyeSAm
JiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkgeworCisJCQluTm9ybWFscyA9IG9iakdlb21ldHJ5
LmZhY2VzLmxlbmd0aCAqIDM7CisKKwkJfSBlbHNlIGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2Vv
bWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKKworCQkJbk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5h
dHRyaWJ1dGVzLm5vcm1hbC5jb3VudDsKKworCQl9CisKKwkJLy8KKworCQl2YXIgZ2VvbWV0cnkg
PSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKworCQl2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJC
dWZmZXJBdHRyaWJ1dGUoIG5Ob3JtYWxzICogMiAqIDMsIDMgKTsKKworCQlnZW9tZXRyeS5hZGRB
dHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucyApOworCisJCUxpbmVTZWdtZW50cy5jYWxs
KCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwg
bGluZXdpZHRoOiB3aWR0aCB9ICkgKTsKKworCQkvLworCisJCXRoaXMubWF0cml4QXV0b1VwZGF0
ZSA9IGZhbHNlOworCisJCXRoaXMudXBkYXRlKCk7CisKKwl9CisKKwlWZXJ0ZXhOb3JtYWxzSGVs
cGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTsK
KwlWZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZlcnRleE5vcm1h
bHNIZWxwZXI7CisKKwlWZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSAoIGZ1
bmN0aW9uICgpIHsKKworCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCQl2YXIgdjIgPSBuZXcg
VmVjdG9yMygpOworCQl2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKTsKKworCQlyZXR1
cm4gZnVuY3Rpb24gdXBkYXRlKCkgeworCisJCQl2YXIga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBd
OworCisJCQl0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApOworCisJCQlub3Jt
YWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCApOworCisJ
CQl2YXIgbWF0cml4V29ybGQgPSB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZDsKKworCQkJdmFyIHBv
c2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOworCisJCQkvLworCisJ
CQl2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTsKKworCQkJaWYgKCBvYmpH
ZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkgeworCisJCQkJdmFyIHZlcnRpY2Vz
ID0gb2JqR2VvbWV0cnkudmVydGljZXM7CisKKwkJCQl2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5m
YWNlczsKKworCQkJCXZhciBpZHggPSAwOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gZmFj
ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCQl2YXIgZmFjZSA9IGZhY2VzWyBpIF07
CisKKwkJCQkJZm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7
IGogPCBqbDsgaiArKyApIHsKKworCQkJCQkJdmFyIHZlcnRleCA9IHZlcnRpY2VzWyBmYWNlWyBr
ZXlzWyBqIF0gXSBdOworCisJCQkJCQl2YXIgbm9ybWFsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzWyBq
IF07CisKKwkJCQkJCXYxLmNvcHkoIHZlcnRleCApLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQg
KTsKKworCQkJCQkJdjIuY29weSggbm9ybWFsICkuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXgg
KS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApOworCisJ
CQkJCQlwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApOworCisJCQkJCQlp
ZHggPSBpZHggKyAxOworCisJCQkJCQlwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwg
djIueiApOworCisJCQkJCQlpZHggPSBpZHggKyAxOworCisJCQkJCX0KKworCQkJCX0KKworCQkJ
fSBlbHNlIGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSAp
IHsKKworCQkJCXZhciBvYmpQb3MgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwor
CisJCQkJdmFyIG9iak5vcm0gPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbDsKKworCQkJ
CXZhciBpZHggPSAwOworCisJCQkJLy8gZm9yIHNpbXBsaWNpdHksIGlnbm9yZSBpbmRleCBhbmQg
ZHJhd2NhbGxzLCBhbmQgcmVuZGVyIGV2ZXJ5IG5vcm1hbAorCisJCQkJZm9yICggdmFyIGogPSAw
LCBqbCA9IG9ialBvcy5jb3VudDsgaiA8IGpsOyBqICsrICkgeworCisJCQkJCXYxLnNldCggb2Jq
UG9zLmdldFgoIGogKSwgb2JqUG9zLmdldFkoIGogKSwgb2JqUG9zLmdldFooIGogKSApLmFwcGx5
TWF0cml4NCggbWF0cml4V29ybGQgKTsKKworCQkJCQl2Mi5zZXQoIG9iak5vcm0uZ2V0WCggaiAp
LCBvYmpOb3JtLmdldFkoIGogKSwgb2JqTm9ybS5nZXRaKCBqICkgKTsKKworCQkJCQl2Mi5hcHBs
eU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlz
LnNpemUgKS5hZGQoIHYxICk7CisKKwkJCQkJcG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYx
LnksIHYxLnogKTsKKworCQkJCQlpZHggPSBpZHggKyAxOworCisJCQkJCXBvc2l0aW9uLnNldFhZ
WiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7CisKKwkJCQkJaWR4ID0gaWR4ICsgMTsKKworCQkJ
CX0KKworCQkJfQorCisJCQlwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJfTsKKwor
CX0oKSApOworCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVh
bGlhLmNvbS8KKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBh
dXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorCSovCisK
KwlmdW5jdGlvbiBTcG90TGlnaHRIZWxwZXIoIGxpZ2h0ICkgeworCisJCU9iamVjdDNELmNhbGwo
IHRoaXMgKTsKKworCQl0aGlzLmxpZ2h0ID0gbGlnaHQ7CisJCXRoaXMubGlnaHQudXBkYXRlTWF0
cml4V29ybGQoKTsKKworCQl0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkOworCQl0aGlz
Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKKworCQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVy
R2VvbWV0cnkoKTsKKworCQl2YXIgcG9zaXRpb25zID0gWworCQkJMCwgMCwgMCwgICAwLCAgIDAs
ICAgMSwKKwkJCTAsIDAsIDAsICAgMSwgICAwLCAgIDEsCisJCQkwLCAwLCAwLCAtIDEsICAgMCwg
ICAxLAorCQkJMCwgMCwgMCwgICAwLCAgIDEsICAgMSwKKwkJCTAsIDAsIDAsICAgMCwgLSAxLCAg
IDEKKwkJXTsKKworCQlmb3IgKCB2YXIgaSA9IDAsIGogPSAxLCBsID0gMzI7IGkgPCBsOyBpICsr
LCBqICsrICkgeworCisJCQl2YXIgcDEgPSAoIGkgLyBsICkgKiBNYXRoLlBJICogMjsKKwkJCXZh
ciBwMiA9ICggaiAvIGwgKSAqIE1hdGguUEkgKiAyOworCisJCQlwb3NpdGlvbnMucHVzaCgKKwkJ
CQlNYXRoLmNvcyggcDEgKSwgTWF0aC5zaW4oIHAxICksIDEsCisJCQkJTWF0aC5jb3MoIHAyICks
IE1hdGguc2luKCBwMiApLCAxCisJCQkpOworCisJCX0KKworCQlnZW9tZXRyeS5hZGRBdHRyaWJ1
dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMg
KSApOworCisJCXZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZh
bHNlIH0gKTsKKworCQl0aGlzLmNvbmUgPSBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0
ZXJpYWwgKTsKKwkJdGhpcy5hZGQoIHRoaXMuY29uZSApOworCisJCXRoaXMudXBkYXRlKCk7CisK
Kwl9CisKKwlTcG90TGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0
M0QucHJvdG90eXBlICk7CisJU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9
IFNwb3RMaWdodEhlbHBlcjsKKworCVNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9
IGZ1bmN0aW9uICgpIHsKKworCQl0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpOworCQl0aGlz
LmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpOworCisJfTsKKworCVNwb3RMaWdodEhlbHBlci5wcm90
b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkgeworCisJCXZhciB2ZWN0b3IgPSBuZXcgVmVjdG9y
MygpOworCQl2YXIgdmVjdG9yMiA9IG5ldyBWZWN0b3IzKCk7CisKKwkJcmV0dXJuIGZ1bmN0aW9u
IHVwZGF0ZSgpIHsKKworCQkJdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOworCisJCQl2
YXIgY29uZUxlbmd0aCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxpZ2h0LmRpc3RhbmNl
IDogMTAwMDsKKwkJCXZhciBjb25lV2lkdGggPSBjb25lTGVuZ3RoICogTWF0aC50YW4oIHRoaXMu
bGlnaHQuYW5nbGUgKTsKKworCQkJdGhpcy5jb25lLnNjYWxlLnNldCggY29uZVdpZHRoLCBjb25l
V2lkdGgsIGNvbmVMZW5ndGggKTsKKworCQkJdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbigg
dGhpcy5saWdodC5tYXRyaXhXb3JsZCApOworCQkJdmVjdG9yMi5zZXRGcm9tTWF0cml4UG9zaXRp
b24oIHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7CisKKwkJCXRoaXMuY29uZS5sb29r
QXQoIHZlY3RvcjIuc3ViKCB2ZWN0b3IgKSApOworCisJCQl0aGlzLmNvbmUubWF0ZXJpYWwuY29s
b3IuY29weSggdGhpcy5saWdodC5jb2xvciApOworCisJCX07CisKKwl9KCk7CisKKwkvKioKKwkg
KiBAYXV0aG9yIFNlYW4gR3JpZmZpbiAvIGh0dHA6Ly90d2l0dGVyLmNvbS9zZ3JpZgorCSAqIEBh
dXRob3IgTWljaGFlbCBHdWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tCisJICog
QGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIGlrZXJyIC8g
aHR0cDovL3Zlcm9sZC5jb20KKwkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5j
b20vTXVnZW44NworCSAqLworCisJZnVuY3Rpb24gZ2V0Qm9uZUxpc3QoIG9iamVjdCApIHsKKwor
CQl2YXIgYm9uZUxpc3QgPSBbXTsKKworCQlpZiAoIG9iamVjdCAmJiBvYmplY3QuaXNCb25lICkg
eworCisJCQlib25lTGlzdC5wdXNoKCBvYmplY3QgKTsKKworCQl9CisKKwkJZm9yICggdmFyIGkg
PSAwOyBpIDwgb2JqZWN0LmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHsKKworCQkJYm9uZUxpc3Qu
cHVzaC5hcHBseSggYm9uZUxpc3QsIGdldEJvbmVMaXN0KCBvYmplY3QuY2hpbGRyZW5bIGkgXSAp
ICk7CisKKwkJfQorCisJCXJldHVybiBib25lTGlzdDsKKworCX0KKworCWZ1bmN0aW9uIFNrZWxl
dG9uSGVscGVyKCBvYmplY3QgKSB7CisKKwkJdmFyIGJvbmVzID0gZ2V0Qm9uZUxpc3QoIG9iamVj
dCApOworCisJCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOworCisJCXZhciB2
ZXJ0aWNlcyA9IFtdOworCQl2YXIgY29sb3JzID0gW107CisKKwkJdmFyIGNvbG9yMSA9IG5ldyBD
b2xvciggMCwgMCwgMSApOworCQl2YXIgY29sb3IyID0gbmV3IENvbG9yKCAwLCAxLCAwICk7CisK
KwkJZm9yICggdmFyIGkgPSAwOyBpIDwgYm9uZXMubGVuZ3RoOyBpICsrICkgeworCisJCQl2YXIg
Ym9uZSA9IGJvbmVzWyBpIF07CisKKwkJCWlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQu
aXNCb25lICkgeworCisJCQkJdmVydGljZXMucHVzaCggMCwgMCwgMCApOworCQkJCXZlcnRpY2Vz
LnB1c2goIDAsIDAsIDAgKTsKKwkJCQljb2xvcnMucHVzaCggY29sb3IxLnIsIGNvbG9yMS5nLCBj
b2xvcjEuYiApOworCQkJCWNvbG9ycy5wdXNoKCBjb2xvcjIuciwgY29sb3IyLmcsIGNvbG9yMi5i
ICk7CisKKwkJCX0KKworCQl9CisKKwkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24n
LCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworCQlnZW9tZXRy
eS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xv
cnMsIDMgKSApOworCisJCXZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2
ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycywgZGVwdGhUZXN0OiBmYWxzZSwgZGVwdGhXcml0ZTog
ZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTsKKworCQlMaW5lU2VnbWVudHMuY2FsbCggdGhp
cywgZ2VvbWV0cnksIG1hdGVyaWFsICk7CisKKwkJdGhpcy5yb290ID0gb2JqZWN0OworCQl0aGlz
LmJvbmVzID0gYm9uZXM7CisKKwkJdGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7CisJ
CXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworCisJCXRoaXMub25CZWZvcmVSZW5kZXIo
KTsKKworCX0KKworCVNrZWxldG9uSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExp
bmVTZWdtZW50cy5wcm90b3R5cGUgKTsKKwlTa2VsZXRvbkhlbHBlci5wcm90b3R5cGUuY29uc3Ry
dWN0b3IgPSBTa2VsZXRvbkhlbHBlcjsKKworCVNrZWxldG9uSGVscGVyLnByb3RvdHlwZS5vbkJl
Zm9yZVJlbmRlciA9IGZ1bmN0aW9uICgpIHsKKworCQl2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMo
KTsKKworCQl2YXIgYm9uZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CisJCXZhciBtYXRyaXhXb3Js
ZEludiA9IG5ldyBNYXRyaXg0KCk7CisKKwkJcmV0dXJuIGZ1bmN0aW9uIG9uQmVmb3JlUmVuZGVy
KCkgeworCisJCQl2YXIgYm9uZXMgPSB0aGlzLmJvbmVzOworCisJCQl2YXIgZ2VvbWV0cnkgPSB0
aGlzLmdlb21ldHJ5OworCQkJdmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAn
cG9zaXRpb24nICk7CisKKwkJCW1hdHJpeFdvcmxkSW52LmdldEludmVyc2UoIHRoaXMucm9vdC5t
YXRyaXhXb3JsZCApOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgYm9uZXMubGVu
Z3RoOyBpICsrICkgeworCisJCQkJdmFyIGJvbmUgPSBib25lc1sgaSBdOworCisJCQkJaWYgKCBi
b25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7CisKKwkJCQkJYm9uZU1hdHJpeC5t
dWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZEludiwgYm9uZS5tYXRyaXhXb3JsZCApOworCQkJ
CQl2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBib25lTWF0cml4ICk7CisJCQkJCXBvc2l0
aW9uLnNldFhZWiggaiwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApOworCisJCQkJCWJv
bmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4V29ybGRJbnYsIGJvbmUucGFyZW50Lm1h
dHJpeFdvcmxkICk7CisJCQkJCXZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGJvbmVNYXRy
aXggKTsKKwkJCQkJcG9zaXRpb24uc2V0WFlaKCBqICsgMSwgdmVjdG9yLngsIHZlY3Rvci55LCB2
ZWN0b3IueiApOworCisJCQkJCWogKz0gMjsKKworCQkJCX0KKworCQkJfQorCisJCQlnZW9tZXRy
eS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJfTsK
KworCX0oKTsKKworCS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1
YWxpYS5jb20vCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8K
KworCWZ1bmN0aW9uIFBvaW50TGlnaHRIZWxwZXIoIGxpZ2h0LCBzcGhlcmVTaXplICkgeworCisJ
CXRoaXMubGlnaHQgPSBsaWdodDsKKwkJdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOwor
CisJCXZhciBnZW9tZXRyeSA9IG5ldyBTcGhlcmVCdWZmZXJHZW9tZXRyeSggc3BoZXJlU2l6ZSwg
NCwgMiApOworCQl2YXIgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZy
YW1lOiB0cnVlLCBmb2c6IGZhbHNlIH0gKTsKKwkJbWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5s
aWdodC5jb2xvciApOworCisJCU1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7
CisKKwkJdGhpcy5tYXRyaXggPSB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkOworCQl0aGlzLm1hdHJp
eEF1dG9VcGRhdGUgPSBmYWxzZTsKKworCQkvKgorCQl2YXIgZGlzdGFuY2VHZW9tZXRyeSA9IG5l
dyBUSFJFRS5JY29zYWhlZHJvbkdlb21ldHJ5KCAxLCAyICk7CisJCXZhciBkaXN0YW5jZU1hdGVy
aWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXhDb2xvciwgZm9n
OiBmYWxzZSwgd2lyZWZyYW1lOiB0cnVlLCBvcGFjaXR5OiAwLjEsIHRyYW5zcGFyZW50OiB0cnVl
IH0gKTsKKworCQl0aGlzLmxpZ2h0U3BoZXJlID0gbmV3IFRIUkVFLk1lc2goIGJ1bGJHZW9tZXRy
eSwgYnVsYk1hdGVyaWFsICk7CisJCXRoaXMubGlnaHREaXN0YW5jZSA9IG5ldyBUSFJFRS5NZXNo
KCBkaXN0YW5jZUdlb21ldHJ5LCBkaXN0YW5jZU1hdGVyaWFsICk7CisKKwkJdmFyIGQgPSBsaWdo
dC5kaXN0YW5jZTsKKworCQlpZiAoIGQgPT09IDAuMCApIHsKKworCQkJdGhpcy5saWdodERpc3Rh
bmNlLnZpc2libGUgPSBmYWxzZTsKKworCQl9IGVsc2UgeworCisJCQl0aGlzLmxpZ2h0RGlzdGFu
Y2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7CisKKwkJfQorCisJCXRoaXMuYWRkKCB0aGlzLmxpZ2h0
RGlzdGFuY2UgKTsKKwkJKi8KKworCX0KKworCVBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlID0g
T2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKTsKKwlQb2ludExpZ2h0SGVscGVyLnByb3Rv
dHlwZS5jb25zdHJ1Y3RvciA9IFBvaW50TGlnaHRIZWxwZXI7CisKKwlQb2ludExpZ2h0SGVscGVy
LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgeworCisJCXRoaXMuZ2VvbWV0cnkuZGlz
cG9zZSgpOworCQl0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTsKKworCX07CisKKwlQb2ludExpZ2h0
SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7CisKKwkJdGhpcy5tYXRlcmlh
bC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7CisKKwkJLyoKKwkJdmFyIGQgPSB0aGlz
LmxpZ2h0LmRpc3RhbmNlOworCisJCWlmICggZCA9PT0gMC4wICkgeworCisJCQl0aGlzLmxpZ2h0
RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlOworCisJCX0gZWxzZSB7CisKKwkJCXRoaXMubGlnaHRE
aXN0YW5jZS52aXNpYmxlID0gdHJ1ZTsKKwkJCXRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQo
IGQsIGQsIGQgKTsKKworCQl9CisJCSovCisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBhYmVs
bmF0aW9uIC8gaHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvbgorCSAqIEBhdXRob3IgTXVnZW44
NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODcKKwkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8g
aHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKwkgKi8KKworCWZ1bmN0aW9uIFJlY3RBcmVh
TGlnaHRIZWxwZXIoIGxpZ2h0ICkgeworCisJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworCQl0
aGlzLmxpZ2h0ID0gbGlnaHQ7CisJCXRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTsKKwor
CQl0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkOworCQl0aGlzLm1hdHJpeEF1dG9VcGRh
dGUgPSBmYWxzZTsKKworCQl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsg
Y29sb3I6IGxpZ2h0LmNvbG9yIH0gKTsKKworCQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2Vv
bWV0cnkoKTsKKworCQlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZm
ZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIDUgKiAzICksIDMgKSApOworCisJCXRoaXMu
YWRkKCBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICkgKTsKKworCQl0aGlzLnVwZGF0ZSgp
OworCisJfQorCisJUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRl
KCBPYmplY3QzRC5wcm90b3R5cGUgKTsKKwlSZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IFJlY3RBcmVhTGlnaHRIZWxwZXI7CisKKwlSZWN0QXJlYUxpZ2h0SGVscGVy
LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgeworCisJCXRoaXMuY2hpbGRyZW5bIDAg
XS5nZW9tZXRyeS5kaXNwb3NlKCk7CisJCXRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNw
b3NlKCk7CisKKwl9OworCisJUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0g
ZnVuY3Rpb24gKCkgeworCisJCXZhciBsaW5lID0gdGhpcy5jaGlsZHJlblsgMCBdOworCisJCS8v
IHVwZGF0ZSBtYXRlcmlhbAorCisJCWxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdo
dC5jb2xvciApOworCisJCS8vIGNhbGN1bGF0ZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgaGVscGVy
CisKKwkJdmFyIGh4ID0gdGhpcy5saWdodC53aWR0aCAqIDAuNTsKKwkJdmFyIGh5ID0gdGhpcy5s
aWdodC5oZWlnaHQgKiAwLjU7CisKKwkJdmFyIHBvc2l0aW9uID0gbGluZS5nZW9tZXRyeS5hdHRy
aWJ1dGVzLnBvc2l0aW9uOworCQl2YXIgYXJyYXkgPSBwb3NpdGlvbi5hcnJheTsKKworCQkvLyB1
cGRhdGUgdmVydGljZXMKKworCQlhcnJheVsgIDAgXSA9ICAgaHg7IGFycmF5WyAgMSBdID0gLSBo
eTsgYXJyYXlbICAyIF0gPSAwOworCQlhcnJheVsgIDMgXSA9ICAgaHg7IGFycmF5WyAgNCBdID0g
ICBoeTsgYXJyYXlbICA1IF0gPSAwOworCQlhcnJheVsgIDYgXSA9IC0gaHg7IGFycmF5WyAgNyBd
ID0gICBoeTsgYXJyYXlbICA4IF0gPSAwOworCQlhcnJheVsgIDkgXSA9IC0gaHg7IGFycmF5WyAx
MCBdID0gLSBoeTsgYXJyYXlbIDExIF0gPSAwOworCQlhcnJheVsgMTIgXSA9ICAgaHg7IGFycmF5
WyAxMyBdID0gLSBoeTsgYXJyYXlbIDE0IF0gPSAwOworCisJCXBvc2l0aW9uLm5lZWRzVXBkYXRl
ID0gdHJ1ZTsKKworCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2Fs
dGVyZWRxdWFsaWEuY29tLworCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20v
CisJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKwkgKi8K
KworCWZ1bmN0aW9uIEhlbWlzcGhlcmVMaWdodEhlbHBlciggbGlnaHQsIHNpemUgKSB7CisKKwkJ
T2JqZWN0M0QuY2FsbCggdGhpcyApOworCisJCXRoaXMubGlnaHQgPSBsaWdodDsKKwkJdGhpcy5s
aWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOworCisJCXRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4
V29ybGQ7CisJCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworCisJCXZhciBnZW9tZXRy
eSA9IG5ldyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHNpemUgKTsKKwkJZ2VvbWV0cnkucm90
YXRlWSggTWF0aC5QSSAqIDAuNSApOworCisJCXZhciBtYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNN
YXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycywgd2lyZWZyYW1lOiB0cnVlIH0g
KTsKKworCQl2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicg
KTsKKwkJdmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uLmNvdW50ICogMyAp
OworCisJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0
ZSggY29sb3JzLCAzICkgKTsKKworCQl0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRl
cmlhbCApICk7CisKKwkJdGhpcy51cGRhdGUoKTsKKworCX0KKworCUhlbWlzcGhlcmVMaWdodEhl
bHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsKKwlI
ZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSGVtaXNwaGVyZUxp
Z2h0SGVscGVyOworCisJSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0g
ZnVuY3Rpb24gKCkgeworCisJCXRoaXMuY2hpbGRyZW5bIDAgXS5nZW9tZXRyeS5kaXNwb3NlKCk7
CisJCXRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7CisKKwl9OworCisJSGVt
aXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7CisKKwkJ
dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7CisKKwkJdmFyIGNvbG9yMSA9IG5ldyBDb2xvcigp
OworCQl2YXIgY29sb3IyID0gbmV3IENvbG9yKCk7CisKKwkJcmV0dXJuIGZ1bmN0aW9uIHVwZGF0
ZSgpIHsKKworCQkJdmFyIG1lc2ggPSB0aGlzLmNoaWxkcmVuWyAwIF07CisKKwkJCXZhciBjb2xv
cnMgPSBtZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ2NvbG9yJyApOworCisJCQljb2xvcjEu
Y29weSggdGhpcy5saWdodC5jb2xvciApOworCQkJY29sb3IyLmNvcHkoIHRoaXMubGlnaHQuZ3Jv
dW5kQ29sb3IgKTsKKworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY29sb3JzLmNvdW50OyBpIDwg
bDsgaSArKyApIHsKKworCQkJCXZhciBjb2xvciA9ICggaSA8ICggbCAvIDIgKSApID8gY29sb3Ix
IDogY29sb3IyOworCisJCQkJY29sb3JzLnNldFhZWiggaSwgY29sb3IuciwgY29sb3IuZywgY29s
b3IuYiApOworCisJCQl9CisKKwkJCW1lc2gubG9va0F0KCB2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBv
c2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICkubmVnYXRlKCkgKTsKKworCQkJY29sb3Jz
Lm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQl9OworCisJfSgpOworCisJLyoqCisJICogQGF1dGhv
ciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEdyaWRIZWxw
ZXIoIHNpemUsIGRpdmlzaW9ucywgY29sb3IxLCBjb2xvcjIgKSB7CisKKwkJc2l6ZSA9IHNpemUg
fHwgMTA7CisJCWRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCAxMDsKKwkJY29sb3IxID0gbmV3IENv
bG9yKCBjb2xvcjEgIT09IHVuZGVmaW5lZCA/IGNvbG9yMSA6IDB4NDQ0NDQ0ICk7CisJCWNvbG9y
MiA9IG5ldyBDb2xvciggY29sb3IyICE9PSB1bmRlZmluZWQgPyBjb2xvcjIgOiAweDg4ODg4OCAp
OworCisJCXZhciBjZW50ZXIgPSBkaXZpc2lvbnMgLyAyOworCQl2YXIgc3RlcCA9IHNpemUgLyBk
aXZpc2lvbnM7CisJCXZhciBoYWxmU2l6ZSA9IHNpemUgLyAyOworCisJCXZhciB2ZXJ0aWNlcyA9
IFtdLCBjb2xvcnMgPSBbXTsKKworCQlmb3IgKCB2YXIgaSA9IDAsIGogPSAwLCBrID0gLSBoYWxm
U2l6ZTsgaSA8PSBkaXZpc2lvbnM7IGkgKyssIGsgKz0gc3RlcCApIHsKKworCQkJdmVydGljZXMu
cHVzaCggLSBoYWxmU2l6ZSwgMCwgaywgaGFsZlNpemUsIDAsIGsgKTsKKwkJCXZlcnRpY2VzLnB1
c2goIGssIDAsIC0gaGFsZlNpemUsIGssIDAsIGhhbGZTaXplICk7CisKKwkJCXZhciBjb2xvciA9
IGkgPT09IGNlbnRlciA/IGNvbG9yMSA6IGNvbG9yMjsKKworCQkJY29sb3IudG9BcnJheSggY29s
b3JzLCBqICk7IGogKz0gMzsKKwkJCWNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7
CisJCQljb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzOworCQkJY29sb3IudG9BcnJh
eSggY29sb3JzLCBqICk7IGogKz0gMzsKKworCQl9CisKKwkJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1
ZmZlckdlb21ldHJ5KCk7CisJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3
IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKwkJZ2VvbWV0cnkuYWRk
QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAz
ICkgKTsKKworCQl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4
Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApOworCisJCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBn
ZW9tZXRyeSwgbWF0ZXJpYWwgKTsKKworCX0KKworCUdyaWRIZWxwZXIucHJvdG90eXBlID0gT2Jq
ZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApOworCUdyaWRIZWxwZXIucHJvdG90
eXBlLmNvbnN0cnVjdG9yID0gR3JpZEhlbHBlcjsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29i
IC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1
Yi5jb20vTXVnZW44NworCSAqIEBhdXRob3IgSGVjdGF0ZSAvIGh0dHA6Ly93d3cuZ2l0aHViLmNv
bS9IZWN0YXRlCisJICovCisKKwlmdW5jdGlvbiBQb2xhckdyaWRIZWxwZXIoIHJhZGl1cywgcmFk
aWFscywgY2lyY2xlcywgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHsKKworCQlyYWRpdXMg
PSByYWRpdXMgfHwgMTA7CisJCXJhZGlhbHMgPSByYWRpYWxzIHx8IDE2OworCQljaXJjbGVzID0g
Y2lyY2xlcyB8fCA4OworCQlkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgNjQ7CisJCWNvbG9yMSA9
IG5ldyBDb2xvciggY29sb3IxICE9PSB1bmRlZmluZWQgPyBjb2xvcjEgOiAweDQ0NDQ0NCApOwor
CQljb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4
ODg4ODggKTsKKworCQl2YXIgdmVydGljZXMgPSBbXTsKKwkJdmFyIGNvbG9ycyA9IFtdOworCisJ
CXZhciB4LCB6OworCQl2YXIgdiwgaSwgaiwgciwgY29sb3I7CisKKwkJLy8gY3JlYXRlIHRoZSBy
YWRpYWxzCisKKwkJZm9yICggaSA9IDA7IGkgPD0gcmFkaWFsczsgaSArKyApIHsKKworCQkJdiA9
ICggaSAvIHJhZGlhbHMgKSAqICggTWF0aC5QSSAqIDIgKTsKKworCQkJeCA9IE1hdGguc2luKCB2
ICkgKiByYWRpdXM7CisJCQl6ID0gTWF0aC5jb3MoIHYgKSAqIHJhZGl1czsKKworCQkJdmVydGlj
ZXMucHVzaCggMCwgMCwgMCApOworCQkJdmVydGljZXMucHVzaCggeCwgMCwgeiApOworCisJCQlj
b2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjsKKworCQkJY29sb3JzLnB1c2goIGNv
bG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTsKKwkJCWNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xv
ci5nLCBjb2xvci5iICk7CisKKwkJfQorCisJCS8vIGNyZWF0ZSB0aGUgY2lyY2xlcworCisJCWZv
ciAoIGkgPSAwOyBpIDw9IGNpcmNsZXM7IGkgKysgKSB7CisKKwkJCWNvbG9yID0gKCBpICYgMSAp
ID8gY29sb3IxIDogY29sb3IyOworCisJCQlyID0gcmFkaXVzIC0gKCByYWRpdXMgLyBjaXJjbGVz
ICogaSApOworCisJCQlmb3IgKCBqID0gMDsgaiA8IGRpdmlzaW9uczsgaiArKyApIHsKKworCQkJ
CS8vIGZpcnN0IHZlcnRleAorCisJCQkJdiA9ICggaiAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJ
ICogMiApOworCisJCQkJeCA9IE1hdGguc2luKCB2ICkgKiByOworCQkJCXogPSBNYXRoLmNvcygg
diApICogcjsKKworCQkJCXZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTsKKwkJCQljb2xvcnMucHVz
aCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApOworCisJCQkJLy8gc2Vjb25kIHZlcnRleAor
CisJCQkJdiA9ICggKCBqICsgMSApIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7CisK
KwkJCQl4ID0gTWF0aC5zaW4oIHYgKSAqIHI7CisJCQkJeiA9IE1hdGguY29zKCB2ICkgKiByOwor
CisJCQkJdmVydGljZXMucHVzaCggeCwgMCwgeiApOworCQkJCWNvbG9ycy5wdXNoKCBjb2xvci5y
LCBjb2xvci5nLCBjb2xvci5iICk7CisKKwkJCX0KKworCQl9CisKKwkJdmFyIGdlb21ldHJ5ID0g
bmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9u
JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKwkJZ2VvbWV0
cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29s
b3JzLCAzICkgKTsKKworCQl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsg
dmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApOworCisJCUxpbmVTZWdtZW50cy5jYWxsKCB0
aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKKworCX0KKworCVBvbGFyR3JpZEhlbHBlci5wcm90
b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7CisJUG9sYXJH
cmlkSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbGFyR3JpZEhlbHBlcjsKKworCS8q
KgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBX
ZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisJKi8KKworCWZ1bmN0
aW9uIEZhY2VOb3JtYWxzSGVscGVyKCBvYmplY3QsIHNpemUsIGhleCwgbGluZXdpZHRoICkgewor
CisJCS8vIEZhY2VOb3JtYWxzSGVscGVyIG9ubHkgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkKKwor
CQl0aGlzLm9iamVjdCA9IG9iamVjdDsKKworCQl0aGlzLnNpemUgPSAoIHNpemUgIT09IHVuZGVm
aW5lZCApID8gc2l6ZSA6IDE7CisKKwkJdmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCAp
ID8gaGV4IDogMHhmZmZmMDA7CisKKwkJdmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVm
aW5lZCApID8gbGluZXdpZHRoIDogMTsKKworCQkvLworCisJCXZhciBuTm9ybWFscyA9IDA7CisK
KwkJdmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7CisKKwkJaWYgKCBvYmpH
ZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkgeworCisJCQluTm9ybWFscyA9IG9i
akdlb21ldHJ5LmZhY2VzLmxlbmd0aDsKKworCQl9IGVsc2UgeworCisJCQljb25zb2xlLndhcm4o
ICdUSFJFRS5GYWNlTm9ybWFsc0hlbHBlcjogb25seSBUSFJFRS5HZW9tZXRyeSBpcyBzdXBwb3J0
ZWQuIFVzZSBUSFJFRS5WZXJ0ZXhOb3JtYWxzSGVscGVyLCBpbnN0ZWFkLicgKTsKKworCQl9CisK
KwkJLy8KKworCQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKworCQl2YXIg
cG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5Ob3JtYWxzICogMiAqIDMs
IDMgKTsKKworCQlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucyAp
OworCisJCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01h
dGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgbGluZXdpZHRoOiB3aWR0aCB9ICkgKTsKKworCQkvLwor
CisJCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworCQl0aGlzLnVwZGF0ZSgpOworCisJ
fQorCisJRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNl
Z21lbnRzLnByb3RvdHlwZSApOworCUZhY2VOb3JtYWxzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1
Y3RvciA9IEZhY2VOb3JtYWxzSGVscGVyOworCisJRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBl
LnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkgeworCisJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CisJ
CXZhciB2MiA9IG5ldyBWZWN0b3IzKCk7CisJCXZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4
MygpOworCisJCXJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7CisKKwkJCXRoaXMub2JqZWN0LnVw
ZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7CisKKwkJCW5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRy
aXgoIHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkICk7CisKKwkJCXZhciBtYXRyaXhXb3JsZCA9IHRo
aXMub2JqZWN0Lm1hdHJpeFdvcmxkOworCisJCQl2YXIgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5
LmF0dHJpYnV0ZXMucG9zaXRpb247CisKKwkJCS8vCisKKwkJCXZhciBvYmpHZW9tZXRyeSA9IHRo
aXMub2JqZWN0Lmdlb21ldHJ5OworCisJCQl2YXIgdmVydGljZXMgPSBvYmpHZW9tZXRyeS52ZXJ0
aWNlczsKKworCQkJdmFyIGZhY2VzID0gb2JqR2VvbWV0cnkuZmFjZXM7CisKKwkJCXZhciBpZHgg
PSAwOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsr
ICkgeworCisJCQkJdmFyIGZhY2UgPSBmYWNlc1sgaSBdOworCisJCQkJdmFyIG5vcm1hbCA9IGZh
Y2Uubm9ybWFsOworCisJCQkJdjEuY29weSggdmVydGljZXNbIGZhY2UuYSBdICkKKwkJCQkJLmFk
ZCggdmVydGljZXNbIGZhY2UuYiBdICkKKwkJCQkJLmFkZCggdmVydGljZXNbIGZhY2UuYyBdICkK
KwkJCQkJLmRpdmlkZVNjYWxhciggMyApCisJCQkJCS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxk
ICk7CisKKwkJCQl2Mi5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCAp
Lm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7CisKKwkJ
CQlwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApOworCisJCQkJaWR4ID0g
aWR4ICsgMTsKKworCQkJCXBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7
CisKKwkJCQlpZHggPSBpZHggKyAxOworCisJCQl9CisKKwkJCXBvc2l0aW9uLm5lZWRzVXBkYXRl
ID0gdHJ1ZTsKKworCQl9OworCisJfSgpICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRx
IC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDov
L21yZG9vYi5jb20vCisJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29t
L1dlc3RMYW5nbGV5CisJICovCisKKwlmdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0SGVscGVyKCBs
aWdodCwgc2l6ZSApIHsKKworCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy5saWdo
dCA9IGxpZ2h0OworCQl0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7CisKKwkJdGhpcy5t
YXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDsKKwkJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFs
c2U7CisKKwkJaWYgKCBzaXplID09PSB1bmRlZmluZWQgKSBzaXplID0gMTsKKworCQl2YXIgZ2Vv
bWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKwkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAn
cG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWworCQkJLSBzaXplLCAgIHNp
emUsIDAsCisJCQkgIHNpemUsICAgc2l6ZSwgMCwKKwkJCSAgc2l6ZSwgLSBzaXplLCAwLAorCQkJ
LSBzaXplLCAtIHNpemUsIDAsCisJCQktIHNpemUsICAgc2l6ZSwgMAorCQldLCAzICkgKTsKKwor
CQl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7
CisKKwkJdGhpcy5hZGQoIG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSApOworCisJCWdl
b21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgg
J3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwgMCwgMCwg
MSBdLCAzICkgKTsKKworCQl0aGlzLmFkZCggbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCAp
KTsKKworCQl0aGlzLnVwZGF0ZSgpOworCisJfQorCisJRGlyZWN0aW9uYWxMaWdodEhlbHBlci5w
cm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsKKwlEaXJlY3Rp
b25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERpcmVjdGlvbmFsTGlnaHRI
ZWxwZXI7CisKKwlEaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVu
Y3Rpb24gKCkgeworCisJCXZhciBsaWdodFBsYW5lID0gdGhpcy5jaGlsZHJlblsgMCBdOworCQl2
YXIgdGFyZ2V0TGluZSA9IHRoaXMuY2hpbGRyZW5bIDEgXTsKKworCQlsaWdodFBsYW5lLmdlb21l
dHJ5LmRpc3Bvc2UoKTsKKwkJbGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCk7CisJCXRhcmdl
dExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpOworCQl0YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2Uo
KTsKKworCX07CisKKwlEaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBm
dW5jdGlvbiAoKSB7CisKKwkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIHYyID0gbmV3
IFZlY3RvcjMoKTsKKwkJdmFyIHYzID0gbmV3IFZlY3RvcjMoKTsKKworCQlyZXR1cm4gZnVuY3Rp
b24gdXBkYXRlKCkgeworCisJCQl2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQu
bWF0cml4V29ybGQgKTsKKwkJCXYyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC50
YXJnZXQubWF0cml4V29ybGQgKTsKKwkJCXYzLnN1YlZlY3RvcnMoIHYyLCB2MSApOworCisJCQl2
YXIgbGlnaHRQbGFuZSA9IHRoaXMuY2hpbGRyZW5bIDAgXTsKKwkJCXZhciB0YXJnZXRMaW5lID0g
dGhpcy5jaGlsZHJlblsgMSBdOworCisJCQlsaWdodFBsYW5lLmxvb2tBdCggdjMgKTsKKwkJCWxp
Z2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApOworCisJCQl0
YXJnZXRMaW5lLmxvb2tBdCggdjMgKTsKKwkJCXRhcmdldExpbmUuc2NhbGUueiA9IHYzLmxlbmd0
aCgpOworCisJCX07CisKKwl9KCk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0
cDovL2FsdGVyZWRxdWFsaWEuY29tLworCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0
aHViLmNvbS9NdWdlbjg3CisJICoKKwkgKgktIHNob3dzIGZydXN0dW0sIGxpbmUgb2Ygc2lnaHQg
YW5kIHVwIG9mIHRoZSBjYW1lcmEKKwkgKgktIHN1aXRhYmxlIGZvciBmYXN0IHVwZGF0ZXMKKwkg
KiAJLSBiYXNlZCBvbiBmcnVzdHVtIHZpc3VhbGl6YXRpb24gaW4gbGlnaHRnbC5qcyBzaGFkb3dt
YXAgZXhhbXBsZQorCSAqCQlodHRwOi8vZXZhbncuZ2l0aHViLmNvbS9saWdodGdsLmpzL3Rlc3Rz
L3NoYWRvd21hcC5odG1sCisJICovCisKKwlmdW5jdGlvbiBDYW1lcmFIZWxwZXIoIGNhbWVyYSAp
IHsKKworCQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKwkJdmFyIG1hdGVy
aWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiwgdmVydGV4Q29s
b3JzOiBGYWNlQ29sb3JzIH0gKTsKKworCQl2YXIgdmVydGljZXMgPSBbXTsKKwkJdmFyIGNvbG9y
cyA9IFtdOworCisJCXZhciBwb2ludE1hcCA9IHt9OworCisJCS8vIGNvbG9ycworCisJCXZhciBj
b2xvckZydXN0dW0gPSBuZXcgQ29sb3IoIDB4ZmZhYTAwICk7CisJCXZhciBjb2xvckNvbmUgPSBu
ZXcgQ29sb3IoIDB4ZmYwMDAwICk7CisJCXZhciBjb2xvclVwID0gbmV3IENvbG9yKCAweDAwYWFm
ZiApOworCQl2YXIgY29sb3JUYXJnZXQgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7CisJCXZhciBj
b2xvckNyb3NzID0gbmV3IENvbG9yKCAweDMzMzMzMyApOworCisJCS8vIG5lYXIKKworCQlhZGRM
aW5lKCAibjEiLCAibjIiLCBjb2xvckZydXN0dW0gKTsKKwkJYWRkTGluZSggIm4yIiwgIm40Iiwg
Y29sb3JGcnVzdHVtICk7CisJCWFkZExpbmUoICJuNCIsICJuMyIsIGNvbG9yRnJ1c3R1bSApOwor
CQlhZGRMaW5lKCAibjMiLCAibjEiLCBjb2xvckZydXN0dW0gKTsKKworCQkvLyBmYXIKKworCQlh
ZGRMaW5lKCAiZjEiLCAiZjIiLCBjb2xvckZydXN0dW0gKTsKKwkJYWRkTGluZSggImYyIiwgImY0
IiwgY29sb3JGcnVzdHVtICk7CisJCWFkZExpbmUoICJmNCIsICJmMyIsIGNvbG9yRnJ1c3R1bSAp
OworCQlhZGRMaW5lKCAiZjMiLCAiZjEiLCBjb2xvckZydXN0dW0gKTsKKworCQkvLyBzaWRlcwor
CisJCWFkZExpbmUoICJuMSIsICJmMSIsIGNvbG9yRnJ1c3R1bSApOworCQlhZGRMaW5lKCAibjIi
LCAiZjIiLCBjb2xvckZydXN0dW0gKTsKKwkJYWRkTGluZSggIm4zIiwgImYzIiwgY29sb3JGcnVz
dHVtICk7CisJCWFkZExpbmUoICJuNCIsICJmNCIsIGNvbG9yRnJ1c3R1bSApOworCisJCS8vIGNv
bmUKKworCQlhZGRMaW5lKCAicCIsICJuMSIsIGNvbG9yQ29uZSApOworCQlhZGRMaW5lKCAicCIs
ICJuMiIsIGNvbG9yQ29uZSApOworCQlhZGRMaW5lKCAicCIsICJuMyIsIGNvbG9yQ29uZSApOwor
CQlhZGRMaW5lKCAicCIsICJuNCIsIGNvbG9yQ29uZSApOworCisJCS8vIHVwCisKKwkJYWRkTGlu
ZSggInUxIiwgInUyIiwgY29sb3JVcCApOworCQlhZGRMaW5lKCAidTIiLCAidTMiLCBjb2xvclVw
ICk7CisJCWFkZExpbmUoICJ1MyIsICJ1MSIsIGNvbG9yVXAgKTsKKworCQkvLyB0YXJnZXQKKwor
CQlhZGRMaW5lKCAiYyIsICJ0IiwgY29sb3JUYXJnZXQgKTsKKwkJYWRkTGluZSggInAiLCAiYyIs
IGNvbG9yQ3Jvc3MgKTsKKworCQkvLyBjcm9zcworCisJCWFkZExpbmUoICJjbjEiLCAiY24yIiwg
Y29sb3JDcm9zcyApOworCQlhZGRMaW5lKCAiY24zIiwgImNuNCIsIGNvbG9yQ3Jvc3MgKTsKKwor
CQlhZGRMaW5lKCAiY2YxIiwgImNmMiIsIGNvbG9yQ3Jvc3MgKTsKKwkJYWRkTGluZSggImNmMyIs
ICJjZjQiLCBjb2xvckNyb3NzICk7CisKKwkJZnVuY3Rpb24gYWRkTGluZSggYSwgYiwgY29sb3Ig
KSB7CisKKwkJCWFkZFBvaW50KCBhLCBjb2xvciApOworCQkJYWRkUG9pbnQoIGIsIGNvbG9yICk7
CisKKwkJfQorCisJCWZ1bmN0aW9uIGFkZFBvaW50KCBpZCwgY29sb3IgKSB7CisKKwkJCXZlcnRp
Y2VzLnB1c2goIDAsIDAsIDAgKTsKKwkJCWNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBj
b2xvci5iICk7CisKKwkJCWlmICggcG9pbnRNYXBbIGlkIF0gPT09IHVuZGVmaW5lZCApIHsKKwor
CQkJCXBvaW50TWFwWyBpZCBdID0gW107CisKKwkJCX0KKworCQkJcG9pbnRNYXBbIGlkIF0ucHVz
aCggKCB2ZXJ0aWNlcy5sZW5ndGggLyAzICkgLSAxICk7CisKKwkJfQorCisJCWdlb21ldHJ5LmFk
ZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRp
Y2VzLCAzICkgKTsKKwkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQz
MkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTsKKworCQlMaW5lU2VnbWVudHMuY2FsbCgg
dGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7CisKKwkJdGhpcy5jYW1lcmEgPSBjYW1lcmE7CisJ
CWlmICggdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCApIHRoaXMuY2FtZXJhLnVw
ZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKKworCQl0aGlzLm1hdHJpeCA9IGNhbWVyYS5tYXRyaXhX
b3JsZDsKKwkJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CisKKwkJdGhpcy5wb2ludE1h
cCA9IHBvaW50TWFwOworCisJCXRoaXMudXBkYXRlKCk7CisKKwl9CisKKwlDYW1lcmFIZWxwZXIu
cHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApOworCUNh
bWVyYUhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYW1lcmFIZWxwZXI7CisKKwlDYW1l
cmFIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKKworCQl2YXIgZ2VvbWV0
cnksIHBvaW50TWFwOworCisJCXZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpOworCQl2YXIgY2Ft
ZXJhID0gbmV3IENhbWVyYSgpOworCisJCWZ1bmN0aW9uIHNldFBvaW50KCBwb2ludCwgeCwgeSwg
eiApIHsKKworCQkJdmVjdG9yLnNldCggeCwgeSwgeiApLnVucHJvamVjdCggY2FtZXJhICk7CisK
KwkJCXZhciBwb2ludHMgPSBwb2ludE1hcFsgcG9pbnQgXTsKKworCQkJaWYgKCBwb2ludHMgIT09
IHVuZGVmaW5lZCApIHsKKworCQkJCXZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0
ZSggJ3Bvc2l0aW9uJyApOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0
aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJcG9zaXRpb24uc2V0WFlaKCBwb2ludHNbIGkgXSwg
dmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApOworCisJCQkJfQorCisJCQl9CisKKwkJfQor
CisJCXJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7CisKKwkJCWdlb21ldHJ5ID0gdGhpcy5nZW9t
ZXRyeTsKKwkJCXBvaW50TWFwID0gdGhpcy5wb2ludE1hcDsKKworCQkJdmFyIHcgPSAxLCBoID0g
MTsKKworCQkJLy8gd2UgbmVlZCBqdXN0IGNhbWVyYSBwcm9qZWN0aW9uIG1hdHJpeAorCQkJLy8g
d29ybGQgbWF0cml4IG11c3QgYmUgaWRlbnRpdHkKKworCQkJY2FtZXJhLnByb2plY3Rpb25NYXRy
aXguY29weSggdGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeCApOworCisJCQkvLyBjZW50ZXIg
LyB0YXJnZXQKKworCQkJc2V0UG9pbnQoICJjIiwgMCwgMCwgLSAxICk7CisJCQlzZXRQb2ludCgg
InQiLCAwLCAwLCAgMSApOworCisJCQkvLyBuZWFyCisKKwkJCXNldFBvaW50KCAibjEiLCAtIHcs
IC0gaCwgLSAxICk7CisJCQlzZXRQb2ludCggIm4yIiwgICB3LCAtIGgsIC0gMSApOworCQkJc2V0
UG9pbnQoICJuMyIsIC0gdywgICBoLCAtIDEgKTsKKwkJCXNldFBvaW50KCAibjQiLCAgIHcsICAg
aCwgLSAxICk7CisKKwkJCS8vIGZhcgorCisJCQlzZXRQb2ludCggImYxIiwgLSB3LCAtIGgsIDEg
KTsKKwkJCXNldFBvaW50KCAiZjIiLCAgIHcsIC0gaCwgMSApOworCQkJc2V0UG9pbnQoICJmMyIs
IC0gdywgICBoLCAxICk7CisJCQlzZXRQb2ludCggImY0IiwgICB3LCAgIGgsIDEgKTsKKworCQkJ
Ly8gdXAKKworCQkJc2V0UG9pbnQoICJ1MSIsICAgdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7CisJ
CQlzZXRQb2ludCggInUyIiwgLSB3ICogMC43LCBoICogMS4xLCAtIDEgKTsKKwkJCXNldFBvaW50
KCAidTMiLCAgICAgICAgIDAsIGggKiAyLCAgIC0gMSApOworCisJCQkvLyBjcm9zcworCisJCQlz
ZXRQb2ludCggImNmMSIsIC0gdywgICAwLCAxICk7CisJCQlzZXRQb2ludCggImNmMiIsICAgdywg
ICAwLCAxICk7CisJCQlzZXRQb2ludCggImNmMyIsICAgMCwgLSBoLCAxICk7CisJCQlzZXRQb2lu
dCggImNmNCIsICAgMCwgICBoLCAxICk7CisKKwkJCXNldFBvaW50KCAiY24xIiwgLSB3LCAgIDAs
IC0gMSApOworCQkJc2V0UG9pbnQoICJjbjIiLCAgIHcsICAgMCwgLSAxICk7CisJCQlzZXRQb2lu
dCggImNuMyIsICAgMCwgLSBoLCAtIDEgKTsKKwkJCXNldFBvaW50KCAiY240IiwgICAwLCAgIGgs
IC0gMSApOworCisJCQlnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1Vw
ZGF0ZSA9IHRydWU7CisKKwkJfTsKKworCX0oKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29i
IC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1
Yi5jb20vTXVnZW44NworCSAqLworCisJZnVuY3Rpb24gQm94SGVscGVyKCBvYmplY3QsIGNvbG9y
ICkgeworCisJCXRoaXMub2JqZWN0ID0gb2JqZWN0OworCisJCWlmICggY29sb3IgPT09IHVuZGVm
aW5lZCApIGNvbG9yID0gMHhmZmZmMDA7CisKKwkJdmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJy
YXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwg
NCwgMSwgNSwgMiwgNiwgMywgNyBdICk7CisJCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFy
cmF5KCA4ICogMyApOworCisJCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwor
CQlnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApICk7
CisJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0
ZSggcG9zaXRpb25zLCAzICkgKTsKKworCQlMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0
cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7CisKKwkJdGhp
cy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CisKKwkJdGhpcy51cGRhdGUoKTsKKworCX0KKwor
CUJveEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90
eXBlICk7CisJQm94SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveEhlbHBlcjsKKwor
CUJveEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gKCBmdW5jdGlvbiAoKSB7CisKKwkJdmFyIGJv
eCA9IG5ldyBCb3gzKCk7CisKKwkJcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkgewor
CisJCQlpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJY29uc29sZS53YXJuKCAn
VEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuJyApOwor
CisJCQl9CisKKwkJCWlmICggdGhpcy5vYmplY3QgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCWJv
eC5zZXRGcm9tT2JqZWN0KCB0aGlzLm9iamVjdCApOworCisJCQl9CisKKwkJCWlmICggYm94Lmlz
RW1wdHkoKSApIHJldHVybjsKKworCQkJdmFyIG1pbiA9IGJveC5taW47CisJCQl2YXIgbWF4ID0g
Ym94Lm1heDsKKworCQkJLyoKKwkJCSAgNV9fX180CisJCQkxL19fXzAvfAorCQkJfCA2X198XzcK
KwkJCTIvX19fMy8KKworCQkJMDogbWF4LngsIG1heC55LCBtYXguegorCQkJMTogbWluLngsIG1h
eC55LCBtYXguegorCQkJMjogbWluLngsIG1pbi55LCBtYXguegorCQkJMzogbWF4LngsIG1pbi55
LCBtYXguegorCQkJNDogbWF4LngsIG1heC55LCBtaW4uegorCQkJNTogbWluLngsIG1heC55LCBt
aW4uegorCQkJNjogbWluLngsIG1pbi55LCBtaW4uegorCQkJNzogbWF4LngsIG1pbi55LCBtaW4u
egorCQkJKi8KKworCQkJdmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBv
c2l0aW9uOworCQkJdmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7CisKKwkJCWFycmF5WyAgMCBd
ID0gbWF4Lng7IGFycmF5WyAgMSBdID0gbWF4Lnk7IGFycmF5WyAgMiBdID0gbWF4Lno7CisJCQlh
cnJheVsgIDMgXSA9IG1pbi54OyBhcnJheVsgIDQgXSA9IG1heC55OyBhcnJheVsgIDUgXSA9IG1h
eC56OworCQkJYXJyYXlbICA2IF0gPSBtaW4ueDsgYXJyYXlbICA3IF0gPSBtaW4ueTsgYXJyYXlb
ICA4IF0gPSBtYXguejsKKwkJCWFycmF5WyAgOSBdID0gbWF4Lng7IGFycmF5WyAxMCBdID0gbWlu
Lnk7IGFycmF5WyAxMSBdID0gbWF4Lno7CisJCQlhcnJheVsgMTIgXSA9IG1heC54OyBhcnJheVsg
MTMgXSA9IG1heC55OyBhcnJheVsgMTQgXSA9IG1pbi56OworCQkJYXJyYXlbIDE1IF0gPSBtaW4u
eDsgYXJyYXlbIDE2IF0gPSBtYXgueTsgYXJyYXlbIDE3IF0gPSBtaW4uejsKKwkJCWFycmF5WyAx
OCBdID0gbWluLng7IGFycmF5WyAxOSBdID0gbWluLnk7IGFycmF5WyAyMCBdID0gbWluLno7CisJ
CQlhcnJheVsgMjEgXSA9IG1heC54OyBhcnJheVsgMjIgXSA9IG1pbi55OyBhcnJheVsgMjMgXSA9
IG1pbi56OworCisJCQlwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCXRoaXMuZ2Vv
bWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CisKKwkJfTsKKworCX0gKSgpOworCisJQm94
SGVscGVyLnByb3RvdHlwZS5zZXRGcm9tT2JqZWN0ID0gZnVuY3Rpb24gKCBvYmplY3QgKSB7CisK
KwkJdGhpcy5vYmplY3QgPSBvYmplY3Q7CisJCXRoaXMudXBkYXRlKCk7CisKKwkJcmV0dXJuIHRo
aXM7CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRo
dWIuY29tL1dlc3RMYW5nbGV5CisJICogQGF1dGhvciB6ejg1IC8gaHR0cDovL2dpdGh1Yi5jb20v
eno4NQorCSAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KKwkgKgorCSAqIENy
ZWF0ZXMgYW4gYXJyb3cgZm9yIHZpc3VhbGl6aW5nIGRpcmVjdGlvbnMKKwkgKgorCSAqIFBhcmFt
ZXRlcnM6CisJICogIGRpciAtIFZlY3RvcjMKKwkgKiAgb3JpZ2luIC0gVmVjdG9yMworCSAqICBs
ZW5ndGggLSBOdW1iZXIKKwkgKiAgY29sb3IgLSBjb2xvciBpbiBoZXggdmFsdWUKKwkgKiAgaGVh
ZExlbmd0aCAtIE51bWJlcgorCSAqICBoZWFkV2lkdGggLSBOdW1iZXIKKwkgKi8KKworCXZhciBs
aW5lR2VvbWV0cnk7CisJdmFyIGNvbmVHZW9tZXRyeTsKKworCWZ1bmN0aW9uIEFycm93SGVscGVy
KCBkaXIsIG9yaWdpbiwgbGVuZ3RoLCBjb2xvciwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkgewor
CisJCS8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQKKworCQlPYmplY3QzRC5jYWxs
KCB0aGlzICk7CisKKwkJaWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSAweGZmZmYw
MDsKKwkJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIGxlbmd0aCA9IDE7CisJCWlmICggaGVh
ZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0aCA9IDAuMiAqIGxlbmd0aDsKKwkJaWYg
KCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7
CisKKwkJaWYgKCBsaW5lR2VvbWV0cnkgPT09IHVuZGVmaW5lZCApIHsKKworCQkJbGluZUdlb21l
dHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisJCQlsaW5lR2VvbWV0cnkuYWRkQXR0cmlidXRl
KCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAx
LCAwIF0sIDMgKSApOworCisJCQljb25lR2VvbWV0cnkgPSBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9t
ZXRyeSggMCwgMC41LCAxLCA1LCAxICk7CisJCQljb25lR2VvbWV0cnkudHJhbnNsYXRlKCAwLCAt
IDAuNSwgMCApOworCisJCX0KKworCQl0aGlzLnBvc2l0aW9uLmNvcHkoIG9yaWdpbiApOworCisJ
CXRoaXMubGluZSA9IG5ldyBMaW5lKCBsaW5lR2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlh
bCggeyBjb2xvcjogY29sb3IgfSApICk7CisJCXRoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlID0g
ZmFsc2U7CisJCXRoaXMuYWRkKCB0aGlzLmxpbmUgKTsKKworCQl0aGlzLmNvbmUgPSBuZXcgTWVz
aCggY29uZUdlb21ldHJ5LCBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0g
KSApOworCQl0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworCQl0aGlzLmFkZCgg
dGhpcy5jb25lICk7CisKKwkJdGhpcy5zZXREaXJlY3Rpb24oIGRpciApOworCQl0aGlzLnNldExl
bmd0aCggbGVuZ3RoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKTsKKworCX0KKworCUFycm93SGVs
cGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApOworCUFy
cm93SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFycm93SGVscGVyOworCisJQXJyb3dI
ZWxwZXIucHJvdG90eXBlLnNldERpcmVjdGlvbiA9ICggZnVuY3Rpb24gKCkgeworCisJCXZhciBh
eGlzID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIHJhZGlhbnM7CisKKwkJcmV0dXJuIGZ1bmN0aW9u
IHNldERpcmVjdGlvbiggZGlyICkgeworCisJCQkvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3Jt
YWxpemVkCisKKwkJCWlmICggZGlyLnkgPiAwLjk5OTk5ICkgeworCisJCQkJdGhpcy5xdWF0ZXJu
aW9uLnNldCggMCwgMCwgMCwgMSApOworCisJCQl9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5
OSApIHsKKworCQkJCXRoaXMucXVhdGVybmlvbi5zZXQoIDEsIDAsIDAsIDAgKTsKKworCQkJfSBl
bHNlIHsKKworCQkJCWF4aXMuc2V0KCBkaXIueiwgMCwgLSBkaXIueCApLm5vcm1hbGl6ZSgpOwor
CisJCQkJcmFkaWFucyA9IE1hdGguYWNvcyggZGlyLnkgKTsKKworCQkJCXRoaXMucXVhdGVybmlv
bi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCByYWRpYW5zICk7CisKKwkJCX0KKworCQl9OworCisJ
fSgpICk7CisKKwlBcnJvd0hlbHBlci5wcm90b3R5cGUuc2V0TGVuZ3RoID0gZnVuY3Rpb24gKCBs
ZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHsKKworCQlpZiAoIGhlYWRMZW5ndGggPT09
IHVuZGVmaW5lZCApIGhlYWRMZW5ndGggPSAwLjIgKiBsZW5ndGg7CisJCWlmICggaGVhZFdpZHRo
ID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoOworCisJCXRoaXMu
bGluZS5zY2FsZS5zZXQoIDEsIE1hdGgubWF4KCAwLCBsZW5ndGggLSBoZWFkTGVuZ3RoICksIDEg
KTsKKwkJdGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpOworCisJCXRoaXMuY29uZS5zY2FsZS5zZXQo
IGhlYWRXaWR0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7CisJCXRoaXMuY29uZS5wb3NpdGlv
bi55ID0gbGVuZ3RoOworCQl0aGlzLmNvbmUudXBkYXRlTWF0cml4KCk7CisKKwl9OworCisJQXJy
b3dIZWxwZXIucHJvdG90eXBlLnNldENvbG9yID0gZnVuY3Rpb24gKCBjb2xvciApIHsKKworCQl0
aGlzLmxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggY29sb3IgKTsKKwkJdGhpcy5jb25lLm1hdGVy
aWFsLmNvbG9yLmNvcHkoIGNvbG9yICk7CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBzcm91
Y2hlcmF5IC8gaHR0cDovL3Nyb3VjaGVyYXkub3JnLworCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0
cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBBeGlzSGVscGVyKCBzaXplICkgewor
CisJCXNpemUgPSBzaXplIHx8IDE7CisKKwkJdmFyIHZlcnRpY2VzID0gWworCQkJMCwgMCwgMCwg
IHNpemUsIDAsIDAsCisJCQkwLCAwLCAwLCAgMCwgc2l6ZSwgMCwKKwkJCTAsIDAsIDAsICAwLCAw
LCBzaXplCisJCV07CisKKwkJdmFyIGNvbG9ycyA9IFsKKwkJCTEsIDAsIDAsICAxLCAwLjYsIDAs
CisJCQkwLCAxLCAwLCAgMC42LCAxLCAwLAorCQkJMCwgMCwgMSwgIDAsIDAuNiwgMQorCQldOwor
CisJCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOworCQlnZW9tZXRyeS5hZGRB
dHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNl
cywgMyApICk7CisJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJC
dWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7CisKKwkJdmFyIG1hdGVyaWFsID0gbmV3IExp
bmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTsKKworCQlM
aW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7CisKKwl9CisKKwlB
eGlzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5
cGUgKTsKKwlBeGlzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEF4aXNIZWxwZXI7CisK
KwkvKioKKwkgKiBAYXV0aG9yIHp6ODUgaHR0cHM6Ly9naXRodWIuY29tL3p6ODUKKwkgKgorCSAq
IENlbnRyaXBldGFsIENhdG11bGxSb20gQ3VydmUgLSB3aGljaCBpcyB1c2VmdWwgZm9yIGF2b2lk
aW5nCisJICogY3VzcHMgYW5kIHNlbGYtaW50ZXJzZWN0aW9ucyBpbiBub24tdW5pZm9ybSBjYXRt
dWxsIHJvbSBjdXJ2ZXMuCisJICogaHR0cDovL3d3dy5jZW15dWtzZWwuY29tL3Jlc2VhcmNoL2Nh
dG11bGxyb21fcGFyYW0vY2F0bXVsbHJvbS5wZGYKKwkgKgorCSAqIGN1cnZlLnR5cGUgYWNjZXB0
cyBjZW50cmlwZXRhbChkZWZhdWx0KSwgY2hvcmRhbCBhbmQgY2F0bXVsbHJvbQorCSAqIGN1cnZl
LnRlbnNpb24gaXMgdXNlZCBmb3IgY2F0bXVsbHJvbSB3aGljaCBkZWZhdWx0cyB0byAwLjUKKwkg
Ki8KKworCisJLyoKKwlCYXNlZCBvbiBhbiBvcHRpbWl6ZWQgYysrIHNvbHV0aW9uIGluCisJIC0g
aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85NDg5NzM2L2NhdG11bGwtcm9tLWN1
cnZlLXdpdGgtbm8tY3VzcHMtYW5kLW5vLXNlbGYtaW50ZXJzZWN0aW9ucy8KKwkgLSBodHRwOi8v
aWRlb25lLmNvbS9Ob0ViVk0KKworCVRoaXMgQ3ViaWNQb2x5IGNsYXNzIGNvdWxkIGJlIHVzZWQg
Zm9yIHJldXNpbmcgc29tZSB2YXJpYWJsZXMgYW5kIGNhbGN1bGF0aW9ucywKKwlidXQgZm9yIHRo
cmVlLmpzIGN1cnZlIHVzZSwgaXQgY291bGQgYmUgcG9zc2libGUgaW5saW5lZCBhbmQgZmxhdHRl
biBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwKKwl3aGljaCBjYW4gYmUgcGxhY2VkIGluIEN1
cnZlVXRpbHMuCisJKi8KKworCWZ1bmN0aW9uIEN1YmljUG9seSgpIHsKKworCQl2YXIgYzAgPSAw
LCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwOworCisJCS8qCisJCSAqIENvbXB1dGUgY29lZmZpY2ll
bnRzIGZvciBhIGN1YmljIHBvbHlub21pYWwKKwkJICogICBwKHMpID0gYzAgKyBjMSpzICsgYzIq
c14yICsgYzMqc14zCisJCSAqIHN1Y2ggdGhhdAorCQkgKiAgIHAoMCkgPSB4MCwgcCgxKSA9IHgx
CisJCSAqICBhbmQKKwkJICogICBwJygwKSA9IHQwLCBwJygxKSA9IHQxLgorCQkgKi8KKwkJZnVu
Y3Rpb24gaW5pdCggeDAsIHgxLCB0MCwgdDEgKSB7CisKKwkJCWMwID0geDA7CisJCQljMSA9IHQw
OworCQkJYzIgPSAtIDMgKiB4MCArIDMgKiB4MSAtIDIgKiB0MCAtIHQxOworCQkJYzMgPSAyICog
eDAgLSAyICogeDEgKyB0MCArIHQxOworCisJCX0KKworCQlyZXR1cm4geworCisJCQlpbml0Q2F0
bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgdGVuc2lvbiApIHsKKworCQkJCWlu
aXQoIHgxLCB4MiwgdGVuc2lvbiAqICggeDIgLSB4MCApLCB0ZW5zaW9uICogKCB4MyAtIHgxICkg
KTsKKworCQkJfSwKKworCQkJaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOiBmdW5jdGlvbiAoIHgw
LCB4MSwgeDIsIHgzLCBkdDAsIGR0MSwgZHQyICkgeworCisJCQkJLy8gY29tcHV0ZSB0YW5nZW50
cyB3aGVuIHBhcmFtZXRlcml6ZWQgaW4gW3QxLHQyXQorCQkJCXZhciB0MSA9ICggeDEgLSB4MCAp
IC8gZHQwIC0gKCB4MiAtIHgwICkgLyAoIGR0MCArIGR0MSApICsgKCB4MiAtIHgxICkgLyBkdDE7
CisJCQkJdmFyIHQyID0gKCB4MiAtIHgxICkgLyBkdDEgLSAoIHgzIC0geDEgKSAvICggZHQxICsg
ZHQyICkgKyAoIHgzIC0geDIgKSAvIGR0MjsKKworCQkJCS8vIHJlc2NhbGUgdGFuZ2VudHMgZm9y
IHBhcmFtZXRyaXphdGlvbiBpbiBbMCwxXQorCQkJCXQxICo9IGR0MTsKKwkJCQl0MiAqPSBkdDE7
CisKKwkJCQlpbml0KCB4MSwgeDIsIHQxLCB0MiApOworCisJCQl9LAorCisJCQljYWxjOiBmdW5j
dGlvbiAoIHQgKSB7CisKKwkJCQl2YXIgdDIgPSB0ICogdDsKKwkJCQl2YXIgdDMgPSB0MiAqIHQ7
CisJCQkJcmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0MiArIGMzICogdDM7CisKKwkJCX0KKwor
CQl9OworCisJfQorCisJLy8KKworCXZhciB0bXAgPSBuZXcgVmVjdG9yMygpOworCXZhciBweCA9
IG5ldyBDdWJpY1BvbHkoKTsKKwl2YXIgcHkgPSBuZXcgQ3ViaWNQb2x5KCk7CisJdmFyIHB6ID0g
bmV3IEN1YmljUG9seSgpOworCisJZnVuY3Rpb24gQ2F0bXVsbFJvbUN1cnZlMyggcG9pbnRzICkg
eworCisJCUN1cnZlLmNhbGwoIHRoaXMgKTsKKworCQlpZiAoIHBvaW50cy5sZW5ndGggPCAyICkg
Y29uc29sZS53YXJuKCAnVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMzogUG9pbnRzIGFycmF5IG5lZWRz
IGF0IGxlYXN0IHR3byBlbnRyaWVzLicgKTsKKworCQl0aGlzLnBvaW50cyA9IHBvaW50cyB8fCBb
XTsKKwkJdGhpcy5jbG9zZWQgPSBmYWxzZTsKKworCX0KKworCUNhdG11bGxSb21DdXJ2ZTMucHJv
dG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CisJQ2F0bXVsbFJvbUN1
cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYXRtdWxsUm9tQ3VydmUzOworCisJQ2F0bXVs
bFJvbUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7CisKKwkJdmFy
IHBvaW50cyA9IHRoaXMucG9pbnRzOworCQl2YXIgbCA9IHBvaW50cy5sZW5ndGg7CisKKwkJdmFy
IHBvaW50ID0gKCBsIC0gKCB0aGlzLmNsb3NlZCA/IDAgOiAxICkgKSAqIHQ7CisJCXZhciBpbnRQ
b2ludCA9IE1hdGguZmxvb3IoIHBvaW50ICk7CisJCXZhciB3ZWlnaHQgPSBwb2ludCAtIGludFBv
aW50OworCisJCWlmICggdGhpcy5jbG9zZWQgKSB7CisKKwkJCWludFBvaW50ICs9IGludFBvaW50
ID4gMCA/IDAgOiAoIE1hdGguZmxvb3IoIE1hdGguYWJzKCBpbnRQb2ludCApIC8gcG9pbnRzLmxl
bmd0aCApICsgMSApICogcG9pbnRzLmxlbmd0aDsKKworCQl9IGVsc2UgaWYgKCB3ZWlnaHQgPT09
IDAgJiYgaW50UG9pbnQgPT09IGwgLSAxICkgeworCisJCQlpbnRQb2ludCA9IGwgLSAyOworCQkJ
d2VpZ2h0ID0gMTsKKworCQl9CisKKwkJdmFyIHAwLCBwMSwgcDIsIHAzOyAvLyA0IHBvaW50cwor
CisJCWlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgPiAwICkgeworCisJCQlwMCA9IHBvaW50
c1sgKCBpbnRQb2ludCAtIDEgKSAlIGwgXTsKKworCQl9IGVsc2UgeworCisJCQkvLyBleHRyYXBv
bGF0ZSBmaXJzdCBwb2ludAorCQkJdG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgMCBdLCBwb2ludHNb
IDEgXSApLmFkZCggcG9pbnRzWyAwIF0gKTsKKwkJCXAwID0gdG1wOworCisJCX0KKworCQlwMSA9
IHBvaW50c1sgaW50UG9pbnQgJSBsIF07CisJCXAyID0gcG9pbnRzWyAoIGludFBvaW50ICsgMSAp
ICUgbCBdOworCisJCWlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgKyAyIDwgbCApIHsKKwor
CQkJcDMgPSBwb2ludHNbICggaW50UG9pbnQgKyAyICkgJSBsIF07CisKKwkJfSBlbHNlIHsKKwor
CQkJLy8gZXh0cmFwb2xhdGUgbGFzdCBwb2ludAorCQkJdG1wLnN1YlZlY3RvcnMoIHBvaW50c1sg
bCAtIDEgXSwgcG9pbnRzWyBsIC0gMiBdICkuYWRkKCBwb2ludHNbIGwgLSAxIF0gKTsKKwkJCXAz
ID0gdG1wOworCisJCX0KKworCQlpZiAoIHRoaXMudHlwZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMu
dHlwZSA9PT0gJ2NlbnRyaXBldGFsJyB8fCB0aGlzLnR5cGUgPT09ICdjaG9yZGFsJyApIHsKKwor
CQkJLy8gaW5pdCBDZW50cmlwZXRhbCAvIENob3JkYWwgQ2F0bXVsbC1Sb20KKwkJCXZhciBwb3cg
PSB0aGlzLnR5cGUgPT09ICdjaG9yZGFsJyA/IDAuNSA6IDAuMjU7CisJCQl2YXIgZHQwID0gTWF0
aC5wb3coIHAwLmRpc3RhbmNlVG9TcXVhcmVkKCBwMSApLCBwb3cgKTsKKwkJCXZhciBkdDEgPSBN
YXRoLnBvdyggcDEuZGlzdGFuY2VUb1NxdWFyZWQoIHAyICksIHBvdyApOworCQkJdmFyIGR0MiA9
IE1hdGgucG93KCBwMi5kaXN0YW5jZVRvU3F1YXJlZCggcDMgKSwgcG93ICk7CisKKwkJCS8vIHNh
ZmV0eSBjaGVjayBmb3IgcmVwZWF0ZWQgcG9pbnRzCisJCQlpZiAoIGR0MSA8IDFlLTQgKSBkdDEg
PSAxLjA7CisJCQlpZiAoIGR0MCA8IDFlLTQgKSBkdDAgPSBkdDE7CisJCQlpZiAoIGR0MiA8IDFl
LTQgKSBkdDIgPSBkdDE7CisKKwkJCXB4LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueCwg
cDEueCwgcDIueCwgcDMueCwgZHQwLCBkdDEsIGR0MiApOworCQkJcHkuaW5pdE5vbnVuaWZvcm1D
YXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCBkdDAsIGR0MSwgZHQyICk7CisJCQlw
ei5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnosIHAzLnosIGR0MCwg
ZHQxLCBkdDIgKTsKKworCQl9IGVsc2UgaWYgKCB0aGlzLnR5cGUgPT09ICdjYXRtdWxscm9tJyAp
IHsKKworCQkJdmFyIHRlbnNpb24gPSB0aGlzLnRlbnNpb24gIT09IHVuZGVmaW5lZCA/IHRoaXMu
dGVuc2lvbiA6IDAuNTsKKwkJCXB4LmluaXRDYXRtdWxsUm9tKCBwMC54LCBwMS54LCBwMi54LCBw
My54LCB0ZW5zaW9uICk7CisJCQlweS5pbml0Q2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwg
cDMueSwgdGVuc2lvbiApOworCQkJcHouaW5pdENhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnos
IHAzLnosIHRlbnNpb24gKTsKKworCQl9CisKKwkJcmV0dXJuIG5ldyBWZWN0b3IzKCBweC5jYWxj
KCB3ZWlnaHQgKSwgcHkuY2FsYyggd2VpZ2h0ICksIHB6LmNhbGMoIHdlaWdodCApICk7CisKKwl9
OworCisJZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZTMoIHYwLCB2MSwgdjIsIHYzICkgeworCisJ
CUN1cnZlLmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnYwID0gdjA7CisJCXRoaXMudjEgPSB2MTsK
KwkJdGhpcy52MiA9IHYyOworCQl0aGlzLnYzID0gdjM7CisKKwl9CisKKwlDdWJpY0JlemllckN1
cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKKwlDdWJp
Y0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJpY0JlemllckN1cnZlMzsK
KworCUN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCAp
IHsKKworCQl2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MiwgdjMg
PSB0aGlzLnYzOworCisJCXJldHVybiBuZXcgVmVjdG9yMygKKwkJCUN1YmljQmV6aWVyKCB0LCB2
MC54LCB2MS54LCB2Mi54LCB2My54ICksCisJCQlDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwg
djIueSwgdjMueSApLAorCQkJQ3ViaWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnosIHYzLnog
KQorCQkpOworCisJfTsKKworCWZ1bmN0aW9uIFF1YWRyYXRpY0JlemllckN1cnZlMyggdjAsIHYx
LCB2MiApIHsKKworCQlDdXJ2ZS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy52MCA9IHYwOworCQl0
aGlzLnYxID0gdjE7CisJCXRoaXMudjIgPSB2MjsKKworCX0KKworCVF1YWRyYXRpY0JlemllckN1
cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKKwlRdWFk
cmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUXVhZHJhdGljQmV6aWVy
Q3VydmUzOworCisJUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1
bmN0aW9uICggdCApIHsKKworCQl2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0g
dGhpcy52MjsKKworCQlyZXR1cm4gbmV3IFZlY3RvcjMoCisJCQlRdWFkcmF0aWNCZXppZXIoIHQs
IHYwLngsIHYxLngsIHYyLnggKSwKKwkJCVF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEueSwg
djIueSApLAorCQkJUXVhZHJhdGljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56ICkKKwkJKTsK
KworCX07CisKKwlmdW5jdGlvbiBMaW5lQ3VydmUzKCB2MSwgdjIgKSB7CisKKwkJQ3VydmUuY2Fs
bCggdGhpcyApOworCisJCXRoaXMudjEgPSB2MTsKKwkJdGhpcy52MiA9IHYyOworCisJfQorCisJ
TGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsK
KwlMaW5lQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVDdXJ2ZTM7CisKKwlMaW5l
Q3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHsKKworCQlpZiAoIHQg
PT09IDEgKSB7CisKKwkJCXJldHVybiB0aGlzLnYyLmNsb25lKCk7CisKKwkJfQorCisJCXZhciB2
ZWN0b3IgPSBuZXcgVmVjdG9yMygpOworCisJCXZlY3Rvci5zdWJWZWN0b3JzKCB0aGlzLnYyLCB0
aGlzLnYxICk7IC8vIGRpZmYKKwkJdmVjdG9yLm11bHRpcGx5U2NhbGFyKCB0ICk7CisJCXZlY3Rv
ci5hZGQoIHRoaXMudjEgKTsKKworCQlyZXR1cm4gdmVjdG9yOworCisJfTsKKworCWZ1bmN0aW9u
IEFyY0N1cnZlKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9j
a3dpc2UgKSB7CisKKwkJRWxsaXBzZUN1cnZlLmNhbGwoIHRoaXMsIGFYLCBhWSwgYVJhZGl1cywg
YVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApOworCisJfQorCisJ
QXJjQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRWxsaXBzZUN1cnZlLnByb3RvdHlw
ZSApOworCUFyY0N1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFyY0N1cnZlOworCisJLyoq
CisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKi8K
KworCXZhciBTY2VuZVV0aWxzID0geworCisJCWNyZWF0ZU11bHRpTWF0ZXJpYWxPYmplY3Q6IGZ1
bmN0aW9uICggZ2VvbWV0cnksIG1hdGVyaWFscyApIHsKKworCQkJdmFyIGdyb3VwID0gbmV3IEdy
b3VwKCk7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IG1hdGVyaWFscy5sZW5ndGg7IGkgPCBs
OyBpICsrICkgeworCisJCQkJZ3JvdXAuYWRkKCBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFs
c1sgaSBdICkgKTsKKworCQkJfQorCisJCQlyZXR1cm4gZ3JvdXA7CisKKwkJfSwKKworCQlkZXRh
Y2g6IGZ1bmN0aW9uICggY2hpbGQsIHBhcmVudCwgc2NlbmUgKSB7CisKKwkJCWNoaWxkLmFwcGx5
TWF0cml4KCBwYXJlbnQubWF0cml4V29ybGQgKTsKKwkJCXBhcmVudC5yZW1vdmUoIGNoaWxkICk7
CisJCQlzY2VuZS5hZGQoIGNoaWxkICk7CisKKwkJfSwKKworCQlhdHRhY2g6IGZ1bmN0aW9uICgg
Y2hpbGQsIHNjZW5lLCBwYXJlbnQgKSB7CisKKwkJCWNoaWxkLmFwcGx5TWF0cml4KCBuZXcgTWF0
cml4NCgpLmdldEludmVyc2UoIHBhcmVudC5tYXRyaXhXb3JsZCApICk7CisKKwkJCXNjZW5lLnJl
bW92ZSggY2hpbGQgKTsKKwkJCXBhcmVudC5hZGQoIGNoaWxkICk7CisKKwkJfQorCisJfTsKKwor
CS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlm
dW5jdGlvbiBGYWNlNCggYSwgYiwgYywgZCwgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCAp
IHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5GYWNlNCBoYXMgYmVlbiByZW1vdmVkLiBBIFRI
UkVFLkZhY2UzIHdpbGwgYmUgY3JlYXRlZCBpbnN0ZWFkLicgKTsKKwkJcmV0dXJuIG5ldyBGYWNl
MyggYSwgYiwgYywgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApOworCisJfQorCisJdmFy
IExpbmVTdHJpcCA9IDA7CisKKwl2YXIgTGluZVBpZWNlcyA9IDE7CisKKwlmdW5jdGlvbiBNZXNo
RmFjZU1hdGVyaWFsKCBtYXRlcmlhbHMgKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuTWVz
aEZhY2VNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7
CisJCXJldHVybiBtYXRlcmlhbHM7CisKKwl9CisKKwlmdW5jdGlvbiBNdWx0aU1hdGVyaWFsKCBt
YXRlcmlhbHMgKSB7CisKKwkJaWYgKCBtYXRlcmlhbHMgPT09IHVuZGVmaW5lZCApIG1hdGVyaWFs
cyA9IFtdOworCisJCWNvbnNvbGUud2FybiggJ1RIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJlZW4g
cmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuJyApOworCQltYXRlcmlhbHMuaXNNdWx0aU1h
dGVyaWFsID0gdHJ1ZTsKKwkJbWF0ZXJpYWxzLm1hdGVyaWFscyA9IG1hdGVyaWFsczsKKwkJbWF0
ZXJpYWxzLmNsb25lID0gZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbWF0ZXJpYWxzLnNsaWNl
KCk7CisKKwkJfTsKKwkJcmV0dXJuIG1hdGVyaWFsczsKKworCX0KKworCWZ1bmN0aW9uIFBvaW50
Q2xvdWQoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5Q
b2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLicgKTsKKwkJcmV0dXJu
IG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApOworCisJfQorCisJZnVuY3Rpb24gUGFy
dGljbGUoIG1hdGVyaWFsICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlIGhh
cyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuU3ByaXRlLicgKTsKKwkJcmV0dXJuIG5ldyBTcHJpdGUo
IG1hdGVyaWFsICk7CisKKwl9CisKKwlmdW5jdGlvbiBQYXJ0aWNsZVN5c3RlbSggZ2VvbWV0cnks
IG1hdGVyaWFsICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlU3lzdGVtIGhh
cyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLicgKTsKKwkJcmV0dXJuIG5ldyBQb2ludHMo
IGdlb21ldHJ5LCBtYXRlcmlhbCApOworCisJfQorCisJZnVuY3Rpb24gUG9pbnRDbG91ZE1hdGVy
aWFsKCBwYXJhbWV0ZXJzICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVFLlBvaW50Q2xvdWRN
YXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTsKKwkJ
cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApOworCisJfQorCisJZnVuY3Rp
b24gUGFydGljbGVCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVF
LlBvaW50c01hdGVyaWFsLicgKTsKKwkJcmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1l
dGVycyApOworCisJfQorCisJZnVuY3Rpb24gUGFydGljbGVTeXN0ZW1NYXRlcmlhbCggcGFyYW1l
dGVycyApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZVN5c3RlbU1hdGVyaWFs
IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApOworCQlyZXR1cm4g
bmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7CisKKwl9CisKKwlmdW5jdGlvbiBWZXJ0
ZXgoIHgsIHksIHogKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVydGV4IGhhcyBiZWVu
IHJlbW92ZWQuIFVzZSBUSFJFRS5WZWN0b3IzIGluc3RlYWQuJyApOworCQlyZXR1cm4gbmV3IFZl
Y3RvcjMoIHgsIHksIHogKTsKKworCX0KKworCS8vCisKKwlmdW5jdGlvbiBEeW5hbWljQnVmZmVy
QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUu
RHluYW1pY0J1ZmZlckF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkJ1
ZmZlckF0dHJpYnV0ZSgpLnNldER5bmFtaWMoIHRydWUgKSBpbnN0ZWFkLicgKTsKKwkJcmV0dXJu
IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApLnNldER5bmFtaWMoIHRydWUg
KTsKKworCX0KKworCWZ1bmN0aW9uIEludDhBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsK
KworCQljb25zb2xlLndhcm4oICdUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQu
IFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOworCQlyZXR1
cm4gbmV3IEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOworCisJfQorCisJ
ZnVuY3Rpb24gVWludDhBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworCQljb25zb2xl
Lndhcm4oICdUSFJFRS5VaW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRI
UkVFLlVpbnQ4QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CisJCXJldHVybiBuZXcgVWlu
dDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOworCisJfQorCisJZnVuY3Rpb24g
VWludDhDbGFtcGVkQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKwkJY29uc29sZS53
YXJuKCAnVEhSRUUuVWludDhDbGFtcGVkQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBu
ZXcgVEhSRUUuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CisJCXJl
dHVybiBuZXcgVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsK
KworCX0KKworCWZ1bmN0aW9uIEludDE2QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisK
KwkJY29uc29sZS53YXJuKCAnVEhSRUUuSW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4g
VXNlIG5ldyBUSFJFRS5JbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOworCQlyZXR1
cm4gbmV3IEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKKworCX0KKwor
CWZ1bmN0aW9uIFVpbnQxNkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisJCWNvbnNv
bGUud2FybiggJ1RIUkVFLlVpbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3
IFRIUkVFLlVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOworCQlyZXR1cm4gbmV3
IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CisKKwl9CisKKwlmdW5j
dGlvbiBJbnQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLkludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUu
SW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKKwkJcmV0dXJuIG5ldyBJbnQzMkJ1
ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CisKKwl9CisKKwlmdW5jdGlvbiBVaW50
MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJF
RS5VaW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MzJC
dWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKKwkJcmV0dXJuIG5ldyBVaW50MzJCdWZmZXJB
dHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOworCisJfQorCisJZnVuY3Rpb24gRmxvYXQzMkF0
dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVFLkZs
b2F0MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDMyQnVm
ZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CisJCXJldHVybiBuZXcgRmxvYXQzMkJ1ZmZlckF0
dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CisKKwl9CisKKwlmdW5jdGlvbiBGbG9hdDY0QXR0
cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuRmxv
YXQ2NEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0NjRCdWZm
ZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKKwkJcmV0dXJuIG5ldyBGbG9hdDY0QnVmZmVyQXR0
cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKKworCX0KKworCS8vCisKKwlDdXJ2ZS5jcmVhdGUg
PSBmdW5jdGlvbiAoIGNvbnN0cnVjdCwgZ2V0UG9pbnQgKSB7CisKKwkJY29uc29sZS5sb2coICdU
SFJFRS5DdXJ2ZS5jcmVhdGUoKSBoYXMgYmVlbiBkZXByZWNhdGVkJyApOworCisJCWNvbnN0cnVj
dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKKwkJY29uc3Ry
dWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdDsKKwkJY29uc3RydWN0LnByb3Rv
dHlwZS5nZXRQb2ludCA9IGdldFBvaW50OworCisJCXJldHVybiBjb25zdHJ1Y3Q7CisKKwl9Owor
CisJLy8KKworCWZ1bmN0aW9uIENsb3NlZFNwbGluZUN1cnZlMyggcG9pbnRzICkgeworCisJCWNv
bnNvbGUud2FybiggJ1RIUkVFLkNsb3NlZFNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVk
LiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTsKKworCQlDYXRtdWxsUm9t
Q3VydmUzLmNhbGwoIHRoaXMsIHBvaW50cyApOworCQl0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7
CisJCXRoaXMuY2xvc2VkID0gdHJ1ZTsKKworCX0KKworCUNsb3NlZFNwbGluZUN1cnZlMy5wcm90
b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApOworCisJ
Ly8KKworCWZ1bmN0aW9uIFNwbGluZUN1cnZlMyggcG9pbnRzICkgeworCisJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLlNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0
bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTsKKworCQlDYXRtdWxsUm9tQ3VydmUzLmNhbGwoIHRo
aXMsIHBvaW50cyApOworCQl0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7CisKKwl9CisKKwlTcGxp
bmVDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ2F0bXVsbFJvbUN1cnZlMy5wcm90
b3R5cGUgKTsKKworCS8vCisKKwlmdW5jdGlvbiBTcGxpbmUoIHBvaW50cyApIHsKKworCQljb25z
b2xlLndhcm4oICdUSFJFRS5TcGxpbmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkNhdG11
bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7CisKKwkJQ2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlz
LCBwb2ludHMgKTsKKwkJdGhpcy50eXBlID0gJ2NhdG11bGxyb20nOworCisJfQorCisJU3BsaW5l
LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlICk7
CisKKwlPYmplY3QuYXNzaWduKCBTcGxpbmUucHJvdG90eXBlLCB7CisKKwkJaW5pdEZyb21BcnJh
eTogZnVuY3Rpb24gKCBhICkgeworCisJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAu
aW5pdEZyb21BcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOworCisJCX0sCisJCWdldENvbnRy
b2xQb2ludHNBcnJheTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJY29uc29s
ZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmdldENvbnRyb2xQb2ludHNBcnJheSgpIGhhcyBiZWVu
IHJlbW92ZWQuJyApOworCisJCX0sCisJCXJlcGFyYW1ldHJpemVCeUFyY0xlbmd0aDogZnVuY3Rp
b24gKCBzYW1wbGluZ0NvZWYgKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6
IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKKworCQl9
CisKKwl9ICk7CisKKwkvLworCWZ1bmN0aW9uIEJvdW5kaW5nQm94SGVscGVyKCBvYmplY3QsIGNv
bG9yICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJvdW5kaW5nQm94SGVscGVyIGhhcyBi
ZWVuIGRlcHJlY2F0ZWQuIENyZWF0aW5nIGEgVEhSRUUuQm94SGVscGVyIGluc3RlYWQuJyApOwor
CQlyZXR1cm4gbmV3IEJveEhlbHBlciggb2JqZWN0LCBjb2xvciApOworCisJfQorCisJZnVuY3Rp
b24gRWRnZXNIZWxwZXIoIG9iamVjdCwgaGV4ICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVF
LkVkZ2VzSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5FZGdlc0dlb21ldHJ5IGlu
c3RlYWQuJyApOworCQlyZXR1cm4gbmV3IExpbmVTZWdtZW50cyggbmV3IEVkZ2VzR2VvbWV0cnko
IG9iamVjdC5nZW9tZXRyeSApLCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleCAh
PT0gdW5kZWZpbmVkID8gaGV4IDogMHhmZmZmZmYgfSApICk7CisKKwl9CisKKwlHcmlkSGVscGVy
LnByb3RvdHlwZS5zZXRDb2xvcnMgPSBmdW5jdGlvbiAoKSB7CisKKwkJY29uc29sZS5lcnJvcigg
J1RIUkVFLkdyaWRIZWxwZXI6IHNldENvbG9ycygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHBhc3Mg
dGhlbSBpbiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC4nICk7CisKKwl9OworCisJU2tlbGV0b25I
ZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKKworCQljb25zb2xlLmVycm9y
KCAnVEhSRUUuU2tlbGV0b25IZWxwZXI6IHVwZGF0ZSgpIG5vIGxvbmdlciBuZWVkcyB0byBiZSBj
YWxsZWQuJyApOworCQkKKwl9OworCisJZnVuY3Rpb24gV2lyZWZyYW1lSGVscGVyKCBvYmplY3Qs
IGhleCApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJl
ZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuJyApOworCQly
ZXR1cm4gbmV3IExpbmVTZWdtZW50cyggbmV3IFdpcmVmcmFtZUdlb21ldHJ5KCBvYmplY3QuZ2Vv
bWV0cnkgKSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXggIT09IHVuZGVmaW5l
ZCA/IGhleCA6IDB4ZmZmZmZmIH0gKSApOworCisJfQorCisJLy8KKworCWZ1bmN0aW9uIFhIUkxv
YWRlciggbWFuYWdlciApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5YSFJMb2FkZXIgaGFz
IGJlZW4gcmVuYW1lZCB0byBUSFJFRS5GaWxlTG9hZGVyLicgKTsKKwkJcmV0dXJuIG5ldyBGaWxl
TG9hZGVyKCBtYW5hZ2VyICk7CisKKwl9CisKKwlmdW5jdGlvbiBCaW5hcnlUZXh0dXJlTG9hZGVy
KCBtYW5hZ2VyICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJpbmFyeVRleHR1cmVMb2Fk
ZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4nICk7CisJCXJl
dHVybiBuZXcgRGF0YVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKTsKKworCX0KKworCS8vCisKKwlP
YmplY3QuYXNzaWduKCBCb3gyLnByb3RvdHlwZSwgeworCisJCWNlbnRlcjogZnVuY3Rpb24gKCBv
cHRpb25hbFRhcmdldCApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmNlbnRl
cigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTsKKwkJCXJldHVybiB0aGlz
LmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTsKKworCQl9LAorCQllbXB0eTogZnVuY3Rpb24g
KCkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZW1wdHkoKSBoYXMgYmVlbiBy
ZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApOworCQkJcmV0dXJuIHRoaXMuaXNFbXB0eSgpOworCisJ
CX0sCisJCWlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHsKKworCQkJY29uc29s
ZS53YXJuKCAnVEhSRUUuQm94MjogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1l
ZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTsKKwkJCXJldHVybiB0aGlzLmludGVyc2VjdHNCb3go
IGJveCApOworCisJCX0sCisJCXNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CisK
KwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0
byAuZ2V0U2l6ZSgpLicgKTsKKwkJCXJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0
ICk7CisKKwkJfQorCX0gKTsKKworCU9iamVjdC5hc3NpZ24oIEJveDMucHJvdG90eXBlLCB7CisK
KwkJY2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQljb25zb2xlLndh
cm4oICdUSFJFRS5Cb3gzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVy
KCkuJyApOworCQkJcmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApOworCisJ
CX0sCisJCWVtcHR5OiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJv
eDM6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4nICk7CisJCQlyZXR1
cm4gdGhpcy5pc0VtcHR5KCk7CisKKwkJfSwKKwkJaXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9u
ICggYm94ICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rp
b25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApOworCQkJcmV0
dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7CisKKwkJfSwKKwkJaXNJbnRlcnNlY3Rpb25T
cGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5C
b3gzOiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNl
Y3RzU3BoZXJlKCkuJyApOworCQkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJl
ICk7CisKKwkJfSwKKwkJc2l6ZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJ
Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5n
ZXRTaXplKCkuJyApOworCQkJcmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTsK
KworCQl9CisJfSApOworCisJTGluZTMucHJvdG90eXBlLmNlbnRlciA9IGZ1bmN0aW9uICggb3B0
aW9uYWxUYXJnZXQgKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jZW50ZXIo
KSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7CisJCXJldHVybiB0aGlzLmdl
dENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTsKKworCX07CisKKwlfTWF0aC5yYW5kb20xNiA9IGZ1
bmN0aW9uICgpIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRoLnJhbmRvbTE2KCkgaGFz
IGJlZW4gZGVwcmVjYXRlZC4gVXNlIE1hdGgucmFuZG9tKCkgaW5zdGVhZC4nICk7CisJCXJldHVy
biBNYXRoLnJhbmRvbSgpOworCisJfTsKKworCU9iamVjdC5hc3NpZ24oIE1hdHJpeDMucHJvdG90
eXBlLCB7CisKKwkJZmxhdHRlblRvQXJyYXlPZmZzZXQ6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNl
dCApIHsKKworCQkJY29uc29sZS53YXJuKCAiVEhSRUUuTWF0cml4MzogLmZsYXR0ZW5Ub0FycmF5
T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iICk7
CisJCQlyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7CisKKwkJfSwKKwkJbXVs
dGlwbHlWZWN0b3IzOiBmdW5jdGlvbiAoIHZlY3RvciApIHsKKworCQkJY29uc29sZS53YXJuKCAn
VEhSRUUuTWF0cml4MzogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2
ZWN0b3IuYXBwbHlNYXRyaXgzKCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKKwkJCXJldHVybiB2ZWN0
b3IuYXBwbHlNYXRyaXgzKCB0aGlzICk7CisKKwkJfSwKKwkJbXVsdGlwbHlWZWN0b3IzQXJyYXk6
IGZ1bmN0aW9uICggYSApIHsKKworCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5t
dWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyAgKTsKKworCQl9LAorCQlh
cHBseVRvQnVmZmVyOiBmdW5jdGlvbiggYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCApIHsKKworCQkJ
Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4MzogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiBy
ZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGlu
c3RlYWQuJyApOworCQkJcmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYnVmZmVy
ICk7CisKKwkJfSwKKwkJYXBwbHlUb1ZlY3RvcjNBcnJheTogZnVuY3Rpb24oIGFycmF5LCBvZmZz
ZXQsIGxlbmd0aCApIHsKKworCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5hcHBs
eVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKwkJfQorCisJfSApOwor
CisJT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHsKKworCQlleHRyYWN0UG9zaXRp
b246IGZ1bmN0aW9uICggbSApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDog
LmV4dHJhY3RQb3NpdGlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNvcHlQb3NpdGlvbigpLicg
KTsKKwkJCXJldHVybiB0aGlzLmNvcHlQb3NpdGlvbiggbSApOworCisJCX0sCisJCWZsYXR0ZW5U
b0FycmF5T2Zmc2V0OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CisKKwkJCWNvbnNvbGUu
d2FybiggIlRIUkVFLk1hdHJpeDQ6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRl
cHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIiApOworCQkJcmV0dXJuIHRoaXMudG9B
cnJheSggYXJyYXksIG9mZnNldCApOworCisJCX0sCisJCWdldFBvc2l0aW9uOiBmdW5jdGlvbiAo
KSB7CisKKwkJCXZhciB2MTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGdldFBvc2l0aW9uKCkgewor
CisJCQkJaWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVmVjdG9yMygpOworCQkJCWNv
bnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5nZXRQb3NpdGlvbigpIGhhcyBiZWVuIHJlbW92
ZWQuIFVzZSBWZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbWF0cml4ICkgaW5zdGVhZC4n
ICk7CisJCQkJcmV0dXJuIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDMgKTsKKworCQkJ
fTsKKworCQl9KCksCisJCXNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSAp
IHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1
YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlv
bigpLicgKTsKKwkJCXJldHVybiB0aGlzLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7
CisKKwkJfSwKKwkJbXVsdGlwbHlUb0FycmF5OiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUu
d2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVk
LicgKTsKKworCQl9LAorCQltdWx0aXBseVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjdG9yICkgewor
CisJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFz
IGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQu
JyApOworCQkJcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTsKKworCQl9LAorCQlt
dWx0aXBseVZlY3RvcjQ6IGZ1bmN0aW9uICggdmVjdG9yICkgeworCisJCQljb25zb2xlLndhcm4o
ICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3I0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNl
IHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApOworCQkJcmV0dXJuIHZl
Y3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTsKKworCQl9LAorCQltdWx0aXBseVZlY3RvcjNBcnJh
eTogZnVuY3Rpb24gKCBhICkgeworCisJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDog
Lm11bHRpcGx5VmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICApOworCisJCX0sCisJ
CXJvdGF0ZUF4aXM6IGZ1bmN0aW9uICggdiApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUu
TWF0cml4NDogLnJvdGF0ZUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy50cmFu
c2Zvcm1EaXJlY3Rpb24oIG1hdHJpeCApIGluc3RlYWQuJyApOworCQkJdi50cmFuc2Zvcm1EaXJl
Y3Rpb24oIHRoaXMgKTsKKworCQl9LAorCQljcm9zc1ZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3Ig
KSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhh
cyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFk
LicgKTsKKwkJCXJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7CisKKwkJfSwKKwkJ
dHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRy
aXg0OiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKwkJfSwKKwkJcm90YXRl
WDogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJv
dGF0ZVgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKKworCQl9LAorCQlyb3RhdGVZOiBmdW5jdGlv
biAoKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhh
cyBiZWVuIHJlbW92ZWQuJyApOworCisJCX0sCisJCXJvdGF0ZVo6IGZ1bmN0aW9uICgpIHsKKwor
CQkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVaKCkgaGFzIGJlZW4gcmVt
b3ZlZC4nICk7CisKKwkJfSwKKwkJcm90YXRlQnlBeGlzOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNv
bnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVt
b3ZlZC4nICk7CisKKwkJfSwKKwkJYXBwbHlUb0J1ZmZlcjogZnVuY3Rpb24oIGJ1ZmZlciwgb2Zm
c2V0LCBsZW5ndGggKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBs
eVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0
cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTsKKwkJCXJldHVybiB0aGlzLmFwcGx5VG9C
dWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciApOworCisJCX0sCisJCWFwcGx5VG9WZWN0b3IzQXJyYXk6
IGZ1bmN0aW9uKCBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKSB7CisKKwkJCWNvbnNvbGUuZXJyb3Io
ICdUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQu
JyApOworCisJCX0sCisJCW1ha2VGcnVzdHVtOiBmdW5jdGlvbiggbGVmdCwgcmlnaHQsIGJvdHRv
bSwgdG9wLCBuZWFyLCBmYXIgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6
IC5tYWtlRnJ1c3R1bSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAubWFrZVBlcnNwZWN0aXZlKCBs
ZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIGluc3RlYWQuJyApOworCQkJcmV0
dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIs
IGZhciApOworCisJCX0KKworCX0gKTsKKworCVBsYW5lLnByb3RvdHlwZS5pc0ludGVyc2VjdGlv
bkxpbmUgPSBmdW5jdGlvbiAoIGxpbmUgKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuUGxh
bmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3Rz
TGluZSgpLicgKTsKKwkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c0xpbmUoIGxpbmUgKTsKKworCX07
CisKKwlRdWF0ZXJuaW9uLnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjMgPSBmdW5jdGlvbiAoIHZl
Y3RvciApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlW
ZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJu
aW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4nICk7CisJCXJldHVybiB2ZWN0b3IuYXBwbHlRdWF0
ZXJuaW9uKCB0aGlzICk7CisKKwl9OworCisJT2JqZWN0LmFzc2lnbiggUmF5LnByb3RvdHlwZSwg
eworCisJCWlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHsKKworCQkJY29uc29s
ZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVk
IHRvIC5pbnRlcnNlY3RzQm94KCkuJyApOworCQkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCgg
Ym94ICk7CisKKwkJfSwKKwkJaXNJbnRlcnNlY3Rpb25QbGFuZTogZnVuY3Rpb24gKCBwbGFuZSAp
IHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgp
IGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLicgKTsKKwkJCXJldHVybiB0
aGlzLmludGVyc2VjdHNQbGFuZSggcGxhbmUgKTsKKworCQl9LAorCQlpc0ludGVyc2VjdGlvblNw
aGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlJh
eTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0
c1NwaGVyZSgpLicgKTsKKwkJCXJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSAp
OworCisJCX0KKworCX0gKTsKKworCU9iamVjdC5hc3NpZ24oIFNoYXBlLnByb3RvdHlwZSwgewor
CisJCWV4dHJ1ZGU6IGZ1bmN0aW9uICggb3B0aW9ucyApIHsKKworCQkJY29uc29sZS53YXJuKCAn
VEhSRUUuU2hhcGU6IC5leHRydWRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV4dHJ1ZGVHZW9t
ZXRyeSgpIGluc3RlYWQuJyApOworCQkJcmV0dXJuIG5ldyBFeHRydWRlR2VvbWV0cnkoIHRoaXMs
IG9wdGlvbnMgKTsKKworCQl9LAorCQltYWtlR2VvbWV0cnk6IGZ1bmN0aW9uICggb3B0aW9ucyAp
IHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGU6IC5tYWtlR2VvbWV0cnkoKSBoYXMg
YmVlbiByZW1vdmVkLiBVc2UgU2hhcGVHZW9tZXRyeSgpIGluc3RlYWQuJyApOworCQkJcmV0dXJu
IG5ldyBTaGFwZUdlb21ldHJ5KCB0aGlzLCBvcHRpb25zICk7CisKKwkJfQorCisJfSApOworCisJ
T2JqZWN0LmFzc2lnbiggVmVjdG9yMi5wcm90b3R5cGUsIHsKKworCQlmcm9tQXR0cmlidXRlOiBm
dW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHsKKworCQkJY29uc29sZS5lcnJv
ciggJ1RIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAu
ZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTsKKwkJCXJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRy
aWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApOworCisJCX0KKworCX0gKTsKKworCU9i
amVjdC5hc3NpZ24oIFZlY3RvcjMucHJvdG90eXBlLCB7CisKKwkJc2V0RXVsZXJGcm9tUm90YXRp
b25NYXRyaXg6IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3Rv
cjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBF
dWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLicgKTsKKworCQl9LAorCQlzZXRF
dWxlckZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdU
SFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQu
IFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuJyApOworCisJCX0sCisJCWdl
dFBvc2l0aW9uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkgeworCisJCQljb25zb2xlLndhcm4o
ICdUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1l
ZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuJyApOworCQkJcmV0dXJuIHRoaXMuc2V0RnJv
bU1hdHJpeFBvc2l0aW9uKCBtICk7CisKKwkJfSwKKwkJZ2V0U2NhbGVGcm9tTWF0cml4OiBmdW5j
dGlvbiAoIG0gKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRTY2Fs
ZUZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4U2NhbGUoKS4n
ICk7CisJCQlyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4U2NhbGUoIG0gKTsKKworCQl9LAorCQln
ZXRDb2x1bW5Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIGluZGV4LCBtYXRyaXggKSB7CisKKwkJCWNv
bnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRDb2x1bW5Gcm9tTWF0cml4KCkgaGFzIGJl
ZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeENvbHVtbigpLicgKTsKKwkJCXJldHVybiB0aGlz
LnNldEZyb21NYXRyaXhDb2x1bW4oIG1hdHJpeCwgaW5kZXggKTsKKworCQl9LAorCQlhcHBseVBy
b2plY3Rpb246IGZ1bmN0aW9uICggbSApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVj
dG9yMzogLmFwcGx5UHJvamVjdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuYXBwbHlNYXRy
aXg0KCBtICkgaW5zdGVhZC4nICk7CisJCQlyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG0gKTsK
KworCQl9LAorCQlmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9m
ZnNldCApIHsKKworCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5mcm9tQXR0cmli
dXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTsKKwkJ
CXJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNl
dCApOworCisJCX0KKworCX0gKTsKKworCU9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBl
LCB7CisKKwkJZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZz
ZXQgKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3I0OiAuZnJvbUF0dHJpYnV0
ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7CisJCQly
ZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQg
KTsKKworCQl9CisKKwl9ICk7CisKKwkvLworCisJR2VvbWV0cnkucHJvdG90eXBlLmNvbXB1dGVU
YW5nZW50cyA9IGZ1bmN0aW9uICgpIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5HZW9tZXRy
eTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApOworCisJfTsKKworCU9i
amVjdC5hc3NpZ24oIE9iamVjdDNELnByb3RvdHlwZSwgeworCisJCWdldENoaWxkQnlOYW1lOiBm
dW5jdGlvbiAoIG5hbWUgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAu
Z2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4n
ICk7CisJCQlyZXR1cm4gdGhpcy5nZXRPYmplY3RCeU5hbWUoIG5hbWUgKTsKKworCQl9LAorCQly
ZW5kZXJEZXB0aDogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmpl
Y3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGlu
c3RlYWQuJyApOworCisJCX0sCisJCXRyYW5zbGF0ZTogZnVuY3Rpb24gKCBkaXN0YW5jZSwgYXhp
cyApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBo
YXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBp
bnN0ZWFkLicgKTsKKwkJCXJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFu
Y2UgKTsKKworCQl9CisKKwl9ICk7CisKKwlPYmplY3QuZGVmaW5lUHJvcGVydGllcyggT2JqZWN0
M0QucHJvdG90eXBlLCB7CisKKwkJZXVsZXJPcmRlcjogeworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7
CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93
IC5yb3RhdGlvbi5vcmRlci4nICk7CisJCQkJcmV0dXJuIHRoaXMucm90YXRpb24ub3JkZXI7CisK
KwkJCX0sCisJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQljb25zb2xlLndhcm4o
ICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7
CisJCQkJdGhpcy5yb3RhdGlvbi5vcmRlciA9IHZhbHVlOworCisJCQl9CisJCX0sCisJCXVzZVF1
YXRlcm5pb246IHsKKwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJY29uc29sZS53YXJuKCAn
VEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJy
YXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApOworCisJCQl9LAorCQkJc2V0
OiBmdW5jdGlvbiAoKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnVz
ZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVy
bmlvbnMgYnkgZGVmYXVsdC4nICk7CisKKwkJCX0KKwkJfQorCisJfSApOworCisJT2JqZWN0LmRl
ZmluZVByb3BlcnRpZXMoIExPRC5wcm90b3R5cGUsIHsKKworCQlvYmplY3RzOiB7CisJCQlnZXQ6
IGZ1bmN0aW9uICgpIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxPRDogLm9iamVjdHMg
aGFzIGJlZW4gcmVuYW1lZCB0byAubGV2ZWxzLicgKTsKKwkJCQlyZXR1cm4gdGhpcy5sZXZlbHM7
CisKKwkJCX0KKwkJfQorCisJfSApOworCisJT2JqZWN0LmRlZmluZVByb3BlcnR5KCBTa2VsZXRv
bi5wcm90b3R5cGUsICd1c2VWZXJ0ZXhUZXh0dXJlJywgeworCisJCWdldDogZnVuY3Rpb24gKCkg
eworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBo
YXMgYmVlbiByZW1vdmVkLicgKTsKKworCQl9LAorCQlzZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJ
Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4g
cmVtb3ZlZC4nICk7CisKKwkJfQorCisJfSApOworCisJT2JqZWN0LmRlZmluZVByb3BlcnR5KCBD
dXJ2ZS5wcm90b3R5cGUsICdfX2FyY0xlbmd0aERpdmlzaW9ucycsIHsKKworCQlnZXQ6IGZ1bmN0
aW9uICgpIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERp
dmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7CisJCQlyZXR1cm4gdGhpcy5h
cmNMZW5ndGhEaXZpc2lvbnM7CisKKwkJfSwKKwkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewor
CisJCQljb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlz
IG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLicgKTsKKwkJCXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25z
ID0gdmFsdWU7CisKKwkJfQorCisJfSApOworCisJLy8KKworCVBlcnNwZWN0aXZlQ2FtZXJhLnBy
b3RvdHlwZS5zZXRMZW5zID0gZnVuY3Rpb24gKCBmb2NhbExlbmd0aCwgZmlsbUdhdWdlICkgewor
CisJCWNvbnNvbGUud2FybiggIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVw
cmVjYXRlZC4gIiArCisJCQkJIlVzZSAuc2V0Rm9jYWxMZW5ndGggYW5kIC5maWxtR2F1Z2UgZm9y
IGEgcGhvdG9ncmFwaGljIHNldHVwLiIgKTsKKworCQlpZiAoIGZpbG1HYXVnZSAhPT0gdW5kZWZp
bmVkICkgdGhpcy5maWxtR2F1Z2UgPSBmaWxtR2F1Z2U7CisJCXRoaXMuc2V0Rm9jYWxMZW5ndGgo
IGZvY2FsTGVuZ3RoICk7CisKKwl9OworCisJLy8KKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVz
KCBMaWdodC5wcm90b3R5cGUsIHsKKwkJb25seVNoYWRvdzogeworCQkJc2V0OiBmdW5jdGlvbiAo
KSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLm9ubHlTaGFkb3cgaGFzIGJl
ZW4gcmVtb3ZlZC4nICk7CisKKwkJCX0KKwkJfSwKKwkJc2hhZG93Q2FtZXJhRm92OiB7CisJCQlz
ZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdo
dDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LicgKTsKKwkJCQl0
aGlzLnNoYWRvdy5jYW1lcmEuZm92ID0gdmFsdWU7CisKKwkJCX0KKwkJfSwKKwkJc2hhZG93Q2Ft
ZXJhTGVmdDogeworCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJY29uc29sZS53
YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVy
YS5sZWZ0LicgKTsKKwkJCQl0aGlzLnNoYWRvdy5jYW1lcmEubGVmdCA9IHZhbHVlOworCisJCQl9
CisJCX0sCisJCXNoYWRvd0NhbWVyYVJpZ2h0OiB7CisJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUg
KSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0
IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4nICk7CisJCQkJdGhpcy5zaGFkb3cuY2FtZXJh
LnJpZ2h0ID0gdmFsdWU7CisKKwkJCX0KKwkJfSwKKwkJc2hhZG93Q2FtZXJhVG9wOiB7CisJCQlz
ZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdo
dDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLicgKTsKKwkJCQl0
aGlzLnNoYWRvdy5jYW1lcmEudG9wID0gdmFsdWU7CisKKwkJCX0KKwkJfSwKKwkJc2hhZG93Q2Ft
ZXJhQm90dG9tOiB7CisJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQljb25zb2xl
Lndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5j
YW1lcmEuYm90dG9tLicgKTsKKwkJCQl0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tID0gdmFsdWU7
CisKKwkJCX0KKwkJfSwKKwkJc2hhZG93Q2FtZXJhTmVhcjogeworCQkJc2V0OiBmdW5jdGlvbiAo
IHZhbHVlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1l
cmFOZWFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5uZWFyLicgKTsKKwkJCQl0aGlzLnNoYWRvdy5j
YW1lcmEubmVhciA9IHZhbHVlOworCisJCQl9CisJCX0sCisJCXNoYWRvd0NhbWVyYUZhcjogewor
CQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUu
TGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4nICk7CisJ
CQkJdGhpcy5zaGFkb3cuY2FtZXJhLmZhciA9IHZhbHVlOworCisJCQl9CisJCX0sCisJCXNoYWRv
d0NhbWVyYVZpc2libGU6IHsKKwkJCXNldDogZnVuY3Rpb24gKCkgeworCisJCQkJY29uc29sZS53
YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQu
IFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVh
ZC4nICk7CisKKwkJCX0KKwkJfSwKKwkJc2hhZG93QmlhczogeworCQkJc2V0OiBmdW5jdGlvbiAo
IHZhbHVlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFz
IGlzIG5vdyAuc2hhZG93LmJpYXMuJyApOworCQkJCXRoaXMuc2hhZG93LmJpYXMgPSB2YWx1ZTsK
KworCQkJfQorCQl9LAorCQlzaGFkb3dEYXJrbmVzczogeworCQkJc2V0OiBmdW5jdGlvbiAoKSB7
CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0RhcmtuZXNzIGhhcyBi
ZWVuIHJlbW92ZWQuJyApOworCisJCQl9CisJCX0sCisJCXNoYWRvd01hcFdpZHRoOiB7CisJCQlz
ZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdo
dDogLnNoYWRvd01hcFdpZHRoIGlzIG5vdyAuc2hhZG93Lm1hcFNpemUud2lkdGguJyApOworCQkJ
CXRoaXMuc2hhZG93Lm1hcFNpemUud2lkdGggPSB2YWx1ZTsKKworCQkJfQorCQl9LAorCQlzaGFk
b3dNYXBIZWlnaHQ6IHsKKwkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJCWNvbnNv
bGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1h
cFNpemUuaGVpZ2h0LicgKTsKKwkJCQl0aGlzLnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IHZhbHVl
OworCisJCQl9CisJCX0KKwl9ICk7CisKKwkvLworCisJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMo
IEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHsKKworCQlsZW5ndGg6IHsKKwkJCWdldDogZnVu
Y3Rpb24gKCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAu
bGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuY291bnQgaW5zdGVhZC4nICk7CisJCQkJ
cmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoOworCisJCQl9CisJCX0KKworCX0gKTsKKworCU9iamVj
dC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwgeworCisJCWFkZEluZGV4OiBmdW5j
dGlvbiAoIGluZGV4ICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRy
eTogLmFkZEluZGV4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0SW5kZXgoKS4nICk7CisJCQl0
aGlzLnNldEluZGV4KCBpbmRleCApOworCisJCX0sCisJCWFkZERyYXdDYWxsOiBmdW5jdGlvbiAo
IHN0YXJ0LCBjb3VudCwgaW5kZXhPZmZzZXQgKSB7CisKKwkJCWlmICggaW5kZXhPZmZzZXQgIT09
IHVuZGVmaW5lZCApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5
OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuJyApOworCisJ
CQl9CisJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxs
KCkgaXMgbm93IC5hZGRHcm91cCgpLicgKTsKKwkJCXRoaXMuYWRkR3JvdXAoIHN0YXJ0LCBjb3Vu
dCApOworCisJCX0sCisJCWNsZWFyRHJhd0NhbGxzOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNv
bGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY2xlYXJEcmF3Q2FsbHMoKSBpcyBub3cg
LmNsZWFyR3JvdXBzKCkuJyApOworCQkJdGhpcy5jbGVhckdyb3VwcygpOworCisJCX0sCisJCWNv
bXB1dGVUYW5nZW50czogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5C
dWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwor
CisJCX0sCisJCWNvbXB1dGVPZmZzZXRzOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1v
dmVkLicgKTsKKworCQl9CisKKwl9ICk7CisKKwlPYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVm
ZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7CisKKwkJZHJhd2NhbGxzOiB7CisJCQlnZXQ6IGZ1bmN0
aW9uICgpIHsKKworCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRy
YXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApOworCQkJCXJldHVybiB0aGlz
Lmdyb3VwczsKKworCQkJfQorCQl9LAorCQlvZmZzZXRzOiB7CisJCQlnZXQ6IGZ1bmN0aW9uICgp
IHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBo
YXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApOworCQkJCXJldHVybiB0aGlzLmdyb3VwczsK
KworCQkJfQorCQl9CisKKwl9ICk7CisKKwkvLworCisJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMo
IFVuaWZvcm0ucHJvdG90eXBlLCB7CisKKwkJZHluYW1pYzogeworCQkJc2V0OiBmdW5jdGlvbiAo
KSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiAuZHluYW1pYyBoYXMgYmVl
biByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4nICk7CisKKwkJ
CX0KKwkJfSwKKwkJb25VcGRhdGU6IHsKKwkJCXZhbHVlOiBmdW5jdGlvbiAoKSB7CisKKwkJCQlj
b25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVk
LiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4nICk7CisJCQkJcmV0dXJuIHRo
aXM7CisKKwkJCX0KKwkJfQorCisJfSApOworCisJLy8KKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0
aWVzKCBNYXRlcmlhbC5wcm90b3R5cGUsIHsKKworCQl3cmFwQXJvdW5kOiB7CisJCQlnZXQ6IGZ1
bmN0aW9uICgpIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcEFy
b3VuZCBoYXMgYmVlbiByZW1vdmVkLicgKTsKKworCQkJfSwKKwkJCXNldDogZnVuY3Rpb24gKCkg
eworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBi
ZWVuIHJlbW92ZWQuJyApOworCisJCQl9CisJCX0sCisJCXdyYXBSR0I6IHsKKwkJCWdldDogZnVu
Y3Rpb24gKCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwUkdC
IGhhcyBiZWVuIHJlbW92ZWQuJyApOworCQkJCXJldHVybiBuZXcgQ29sb3IoKTsKKworCQkJfQor
CQl9CisKKwl9ICk7CisKKwlPYmplY3QuZGVmaW5lUHJvcGVydGllcyggTWVzaFBob25nTWF0ZXJp
YWwucHJvdG90eXBlLCB7CisKKwkJbWV0YWw6IHsKKwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJ
CQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVl
biByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZC4nICk7CisJ
CQkJcmV0dXJuIGZhbHNlOworCisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQlj
b25zb2xlLndhcm4oICdUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJl
bW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkJyApOworCisJCQl9
CisJCX0KKworCX0gKTsKKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBTaGFkZXJNYXRlcmlh
bC5wcm90b3R5cGUsIHsKKworCQlkZXJpdmF0aXZlczogeworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7
CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVz
IGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTsKKwkJCQlyZXR1
cm4gdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzOworCisJCQl9LAorCQkJc2V0OiBmdW5jdGlv
biAoIHZhbHVlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuIFNoYWRlck1hdGVyaWFs
OiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMu
JyApOworCQkJCXRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyA9IHZhbHVlOworCisJCQl9CisJ
CX0KKworCX0gKTsKKworCS8vCisKKwlPYmplY3QuYXNzaWduKCBXZWJHTFJlbmRlcmVyLnByb3Rv
dHlwZSwgeworCisJCWdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJ
Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJn
ZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLicgKTsKKwkJCXJldHVybiB0aGlzLmdldFJl
bmRlclRhcmdldCgpOworCisJCX0sCisKKwkJc3VwcG9ydHNGbG9hdFRleHR1cmVzOiBmdW5jdGlv
biAoKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0
c0Zsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcJ09FU190ZXh0dXJlX2Zs
b2F0XCcgKS4nICk7CisJCQlyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJl
X2Zsb2F0JyApOworCisJCX0sCisJCXN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXM6IGZ1bmN0aW9u
ICgpIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRz
SGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcJ09FU190ZXh0dXJl
X2hhbGZfZmxvYXRcJyApLicgKTsKKwkJCXJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VT
X3RleHR1cmVfaGFsZl9mbG9hdCcgKTsKKworCQl9LAorCQlzdXBwb3J0c1N0YW5kYXJkRGVyaXZh
dGl2ZXM6IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5k
ZXJlcjogLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5n
ZXQoIFwnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzXCcgKS4nICk7CisJCQlyZXR1cm4gdGhpcy5l
eHRlbnNpb25zLmdldCggJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcycgKTsKKworCQl9LAorCQlz
dXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQzogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xl
Lndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMz
VEMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9z
M3RjXCcgKS4nICk7CisJCQlyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXBy
ZXNzZWRfdGV4dHVyZV9zM3RjJyApOworCisJCX0sCisJCXN1cHBvcnRzQ29tcHJlc3NlZFRleHR1
cmVQVlJUQzogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJl
bmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDKCkgaXMgbm93IC5leHRlbnNp
b25zLmdldCggXCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGNcJyApLicgKTsKKwkJCXJl
dHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRj
JyApOworCisJCX0sCisJCXN1cHBvcnRzQmxlbmRNaW5NYXg6IGZ1bmN0aW9uICgpIHsKKworCQkJ
Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQmxlbmRNaW5NYXgo
KSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcJ0VYVF9ibGVuZF9taW5tYXhcJyApLicgKTsKKwkJ
CXJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2JsZW5kX21pbm1heCcgKTsKKworCQl9
LAorCQlzdXBwb3J0c1ZlcnRleFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUu
d2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1ZlcnRleFRleHR1cmVzKCkgaXMg
bm93IC5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMuJyApOworCQkJcmV0dXJuIHRoaXMuY2Fw
YWJpbGl0aWVzLnZlcnRleFRleHR1cmVzOworCisJCX0sCisJCXN1cHBvcnRzSW5zdGFuY2VkQXJy
YXlzOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVy
ZXI6IC5zdXBwb3J0c0luc3RhbmNlZEFycmF5cygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFwn
QU5HTEVfaW5zdGFuY2VkX2FycmF5c1wnICkuJyApOworCQkJcmV0dXJuIHRoaXMuZXh0ZW5zaW9u
cy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApOworCisJCX0sCisJCWVuYWJsZVNjaXNz
b3JUZXN0OiBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVF
LldlYkdMUmVuZGVyZXI6IC5lbmFibGVTY2lzc29yVGVzdCgpIGlzIG5vdyAuc2V0U2Npc3NvclRl
c3QoKS4nICk7CisJCQl0aGlzLnNldFNjaXNzb3JUZXN0KCBib29sZWFuICk7CisKKwkJfSwKKwkJ
aW5pdE1hdGVyaWFsOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldl
YkdMUmVuZGVyZXI6IC5pbml0TWF0ZXJpYWwoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKKworCQl9
LAorCQlhZGRQcmVQbHVnaW46IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhS
RUUuV2ViR0xSZW5kZXJlcjogLmFkZFByZVBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwor
CisJCX0sCisJCWFkZFBvc3RQbHVnaW46IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS53YXJu
KCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFBvc3RQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVk
LicgKTsKKworCQl9LAorCQl1cGRhdGVTaGFkb3dNYXA6IGZ1bmN0aW9uICgpIHsKKworCQkJY29u
c29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnVwZGF0ZVNoYWRvd01hcCgpIGhhcyBi
ZWVuIHJlbW92ZWQuJyApOworCisJCX0KKworCX0gKTsKKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0
aWVzKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwgeworCisJCXNoYWRvd01hcEVuYWJsZWQ6IHsK
KwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJcmV0dXJuIHRoaXMuc2hhZG93TWFwLmVuYWJs
ZWQ7CisKKwkJCX0sCisJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQljb25zb2xl
Lndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNo
YWRvd01hcC5lbmFibGVkLicgKTsKKwkJCQl0aGlzLnNoYWRvd01hcC5lbmFibGVkID0gdmFsdWU7
CisKKwkJCX0KKwkJfSwKKwkJc2hhZG93TWFwVHlwZTogeworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7
CisKKwkJCQlyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZTsKKworCQkJfSwKKwkJCXNldDogZnVu
Y3Rpb24gKCB2YWx1ZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVy
ZXI6IC5zaGFkb3dNYXBUeXBlIGlzIG5vdyAuc2hhZG93TWFwLnR5cGUuJyApOworCQkJCXRoaXMu
c2hhZG93TWFwLnR5cGUgPSB2YWx1ZTsKKworCQkJfQorCQl9LAorCQlzaGFkb3dNYXBDdWxsRmFj
ZTogeworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQlyZXR1cm4gdGhpcy5zaGFkb3dNYXAu
Y3VsbEZhY2U7CisKKwkJCX0sCisJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQlj
b25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaXMg
bm93IC5zaGFkb3dNYXAuY3VsbEZhY2UuJyApOworCQkJCXRoaXMuc2hhZG93TWFwLmN1bGxGYWNl
ID0gdmFsdWU7CisKKwkJCX0KKwkJfQorCX0gKTsKKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVz
KCBXZWJHTFNoYWRvd01hcC5wcm90b3R5cGUsIHsKKworCQljdWxsRmFjZTogeworCQkJZ2V0OiBm
dW5jdGlvbiAoKSB7CisKKwkJCQlyZXR1cm4gdGhpcy5yZW5kZXJSZXZlcnNlU2lkZWQgPyBDdWxs
RmFjZUZyb250IDogQ3VsbEZhY2VCYWNrOworCisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbiAoIGN1
bGxGYWNlICkgeworCisJCQkJdmFyIHZhbHVlID0gKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VCYWNr
ICk7CisJCQkJY29uc29sZS53YXJuKCAiV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFj
ZSBpcyBkZXByZWNhdGVkLiBTZXQgLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgdG8gIiAr
IHZhbHVlICsgIi4iICk7CisJCQkJdGhpcy5yZW5kZXJSZXZlcnNlU2lkZWQgPSB2YWx1ZTsKKwor
CQkJfQorCQl9CisKKwl9ICk7CisKKwkvLworCisJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdl
YkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSwgeworCisJCXdyYXBTOiB7CisJCQlnZXQ6IGZ1bmN0
aW9uICgpIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAu
d3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTsKKwkJCQlyZXR1cm4gdGhpcy50ZXh0dXJl
LndyYXBTOworCisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJY29u
c29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1
cmUud3JhcFMuJyApOworCQkJCXRoaXMudGV4dHVyZS53cmFwUyA9IHZhbHVlOworCisJCQl9CisJ
CX0sCisJCXdyYXBUOiB7CisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBU
LicgKTsKKwkJCQlyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUOworCisJCQl9LAorCQkJc2V0OiBm
dW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5k
ZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuJyApOworCQkJCXRoaXMudGV4
dHVyZS53cmFwVCA9IHZhbHVlOworCisJCQl9CisJCX0sCisJCW1hZ0ZpbHRlcjogeworCQkJZ2V0
OiBmdW5jdGlvbiAoKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRh
cmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTsKKwkJCQlyZXR1
cm4gdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcjsKKworCQkJfSwKKwkJCXNldDogZnVuY3Rpb24gKCB2
YWx1ZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAu
bWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuJyApOworCQkJCXRoaXMudGV4dHVy
ZS5tYWdGaWx0ZXIgPSB2YWx1ZTsKKworCQkJfQorCQl9LAorCQltaW5GaWx0ZXI6IHsKKwkJCWdl
dDogZnVuY3Rpb24gKCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJU
YXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7CisJCQkJcmV0
dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXI7CisKKwkJCX0sCisJCQlzZXQ6IGZ1bmN0aW9uICgg
dmFsdWUgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDog
Lm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLicgKTsKKwkJCQl0aGlzLnRleHR1
cmUubWluRmlsdGVyID0gdmFsdWU7CisKKwkJCX0KKwkJfSwKKwkJYW5pc290cm9weTogeworCQkJ
Z2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRl
clRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApOworCQkJ
CXJldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weTsKKworCQkJfSwKKwkJCXNldDogZnVuY3Rp
b24gKCB2YWx1ZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFy
Z2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4nICk7CisJCQkJdGhp
cy50ZXh0dXJlLmFuaXNvdHJvcHkgPSB2YWx1ZTsKKworCQkJfQorCQl9LAorCQlvZmZzZXQ6IHsK
KwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xS
ZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7CisJCQkJcmV0
dXJuIHRoaXMudGV4dHVyZS5vZmZzZXQ7CisKKwkJCX0sCisJCQlzZXQ6IGZ1bmN0aW9uICggdmFs
dWUgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9m
ZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LicgKTsKKwkJCQl0aGlzLnRleHR1cmUub2Zmc2V0
ID0gdmFsdWU7CisKKwkJCX0KKwkJfSwKKwkJcmVwZWF0OiB7CisJCQlnZXQ6IGZ1bmN0aW9uICgp
IHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0
IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApOworCQkJCXJldHVybiB0aGlzLnRleHR1cmUucmVw
ZWF0OworCisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJY29uc29s
ZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5yZXBlYXQgaXMgbm93IC50ZXh0dXJl
LnJlcGVhdC4nICk7CisJCQkJdGhpcy50ZXh0dXJlLnJlcGVhdCA9IHZhbHVlOworCisJCQl9CisJ
CX0sCisJCWZvcm1hdDogeworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQljb25zb2xlLndh
cm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9y
bWF0LicgKTsKKwkJCQlyZXR1cm4gdGhpcy50ZXh0dXJlLmZvcm1hdDsKKworCQkJfSwKKwkJCXNl
dDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdM
UmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuJyApOworCQkJCXRo
aXMudGV4dHVyZS5mb3JtYXQgPSB2YWx1ZTsKKworCQkJfQorCQl9LAorCQl0eXBlOiB7CisJCQln
ZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVy
VGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7CisJCQkJcmV0dXJuIHRoaXMu
dGV4dHVyZS50eXBlOworCisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJ
CQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAu
dGV4dHVyZS50eXBlLicgKTsKKwkJCQl0aGlzLnRleHR1cmUudHlwZSA9IHZhbHVlOworCisJCQl9
CisJCX0sCisJCWdlbmVyYXRlTWlwbWFwczogeworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJ
CQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFw
cyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTsKKwkJCQlyZXR1cm4gdGhpcy50
ZXh0dXJlLmdlbmVyYXRlTWlwbWFwczsKKworCQkJfSwKKwkJCXNldDogZnVuY3Rpb24gKCB2YWx1
ZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2Vu
ZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuJyApOworCQkJCXRo
aXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB2YWx1ZTsKKworCQkJfQorCQl9CisKKwl9ICk7
CisKKwkvLworCisJQXVkaW8ucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoIGZpbGUgKSB7CisK
KwkJY29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IC5sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQu
IFVzZSBUSFJFRS5BdWRpb0xvYWRlciBpbnN0ZWFkLicgKTsKKwkJdmFyIHNjb3BlID0gdGhpczsK
KwkJdmFyIGF1ZGlvTG9hZGVyID0gbmV3IEF1ZGlvTG9hZGVyKCk7CisJCWF1ZGlvTG9hZGVyLmxv
YWQoIGZpbGUsIGZ1bmN0aW9uICggYnVmZmVyICkgeworCisJCQlzY29wZS5zZXRCdWZmZXIoIGJ1
ZmZlciApOworCisJCX0gKTsKKwkJcmV0dXJuIHRoaXM7CisKKwl9OworCisJQXVkaW9BbmFseXNl
ci5wcm90b3R5cGUuZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHsKKworCQljb25zb2xlLndhcm4oICdU
SFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgp
LicgKTsKKwkJcmV0dXJuIHRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpOworCisJfTsKKworCS8vCisK
Kwl2YXIgR2VvbWV0cnlVdGlscyA9IHsKKworCQltZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeTEs
IGdlb21ldHJ5MiwgbWF0ZXJpYWxJbmRleE9mZnNldCApIHsKKworCQkJY29uc29sZS53YXJuKCAn
VEhSRUUuR2VvbWV0cnlVdGlsczogLm1lcmdlKCkgaGFzIGJlZW4gbW92ZWQgdG8gR2VvbWV0cnku
IFVzZSBnZW9tZXRyeS5tZXJnZSggZ2VvbWV0cnkyLCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZz
ZXQgKSBpbnN0ZWFkLicgKTsKKwkJCXZhciBtYXRyaXg7CisKKwkJCWlmICggZ2VvbWV0cnkyLmlz
TWVzaCApIHsKKworCQkJCWdlb21ldHJ5Mi5tYXRyaXhBdXRvVXBkYXRlICYmIGdlb21ldHJ5Mi51
cGRhdGVNYXRyaXgoKTsKKworCQkJCW1hdHJpeCA9IGdlb21ldHJ5Mi5tYXRyaXg7CisJCQkJZ2Vv
bWV0cnkyID0gZ2VvbWV0cnkyLmdlb21ldHJ5OworCisJCQl9CisKKwkJCWdlb21ldHJ5MS5tZXJn
ZSggZ2VvbWV0cnkyLCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKTsKKworCQl9LAorCisJ
CWNlbnRlcjogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhS
RUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBV
c2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4nICk7CisJCQlyZXR1cm4gZ2VvbWV0cnkuY2Vu
dGVyKCk7CisKKwkJfQorCisJfTsKKworCXZhciBJbWFnZVV0aWxzID0geworCisJCWNyb3NzT3Jp
Z2luOiB1bmRlZmluZWQsCisKKwkJbG9hZFRleHR1cmU6IGZ1bmN0aW9uICggdXJsLCBtYXBwaW5n
LCBvbkxvYWQsIG9uRXJyb3IgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRp
bHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2Fk
ZXIoKSBpbnN0ZWFkLicgKTsKKworCQkJdmFyIGxvYWRlciA9IG5ldyBUZXh0dXJlTG9hZGVyKCk7
CisJCQlsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTsKKworCQkJdmFy
IHRleHR1cmUgPSBsb2FkZXIubG9hZCggdXJsLCBvbkxvYWQsIHVuZGVmaW5lZCwgb25FcnJvciAp
OworCisJCQlpZiAoIG1hcHBpbmcgKSB0ZXh0dXJlLm1hcHBpbmcgPSBtYXBwaW5nOworCisJCQly
ZXR1cm4gdGV4dHVyZTsKKworCQl9LAorCisJCWxvYWRUZXh0dXJlQ3ViZTogZnVuY3Rpb24gKCB1
cmxzLCBtYXBwaW5nLCBvbkxvYWQsIG9uRXJyb3IgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RI
UkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmVDdWJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBU
SFJFRS5DdWJlVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuJyApOworCisJCQl2YXIgbG9hZGVyID0g
bmV3IEN1YmVUZXh0dXJlTG9hZGVyKCk7CisJCQlsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMu
Y3Jvc3NPcmlnaW4gKTsKKworCQkJdmFyIHRleHR1cmUgPSBsb2FkZXIubG9hZCggdXJscywgb25M
b2FkLCB1bmRlZmluZWQsIG9uRXJyb3IgKTsKKworCQkJaWYgKCBtYXBwaW5nICkgdGV4dHVyZS5t
YXBwaW5nID0gbWFwcGluZzsKKworCQkJcmV0dXJuIHRleHR1cmU7CisKKwkJfSwKKworCQlsb2Fk
Q29tcHJlc3NlZFRleHR1cmU6IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS5lcnJvciggJ1RI
UkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVz
ZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7CisKKwkJfSwKKworCQlsb2FkQ29tcHJlc3Nl
ZFRleHR1cmVDdWJlOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5J
bWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNl
IFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLicgKTsKKworCQl9CisKKwl9OworCisJLy8KKworCWZ1
bmN0aW9uIFByb2plY3RvcigpIHsKKworCQljb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvamVjdG9y
IGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy9yZW5kZXJlcnMvUHJvamVjdG9yLmpzLicg
KTsKKworCQl0aGlzLnByb2plY3RWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3RvciwgY2FtZXJhICkg
eworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5Qcm9qZWN0b3I6IC5wcm9qZWN0VmVjdG9yKCkg
aXMgbm93IHZlY3Rvci5wcm9qZWN0KCkuJyApOworCQkJdmVjdG9yLnByb2plY3QoIGNhbWVyYSAp
OworCisJCX07CisKKwkJdGhpcy51bnByb2plY3RWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3Rvciwg
Y2FtZXJhICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5Qcm9qZWN0b3I6IC51bnByb2pl
Y3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnVucHJvamVjdCgpLicgKTsKKwkJCXZlY3Rvci51bnBy
b2plY3QoIGNhbWVyYSApOworCisJCX07CisKKwkJdGhpcy5waWNraW5nUmF5ID0gZnVuY3Rpb24g
KCkgeworCisJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvamVjdG9yOiAucGlja2luZ1JheSgp
IGlzIG5vdyByYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSgpLicgKTsKKworCQl9OworCisJfQorCisJ
Ly8KKworCWZ1bmN0aW9uIENhbnZhc1JlbmRlcmVyKCkgeworCisJCWNvbnNvbGUuZXJyb3IoICdU
SFJFRS5DYW52YXNSZW5kZXJlciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVy
ZXJzL0NhbnZhc1JlbmRlcmVyLmpzJyApOworCisJCXRoaXMuZG9tRWxlbWVudCA9IGRvY3VtZW50
LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFz
JyApOworCQl0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCkge307CisJCXRoaXMucmVuZGVyID0gZnVu
Y3Rpb24gKCkge307CisJCXRoaXMuc2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHt9OworCQl0
aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoKSB7fTsKKworCX0KKworCWV4cG9ydHMuV2ViR0xSZW5k
ZXJUYXJnZXRDdWJlID0gV2ViR0xSZW5kZXJUYXJnZXRDdWJlOworCWV4cG9ydHMuV2ViR0xSZW5k
ZXJUYXJnZXQgPSBXZWJHTFJlbmRlclRhcmdldDsKKwlleHBvcnRzLldlYkdMUmVuZGVyZXIgPSBX
ZWJHTFJlbmRlcmVyOworCWV4cG9ydHMuU2hhZGVyTGliID0gU2hhZGVyTGliOworCWV4cG9ydHMu
VW5pZm9ybXNMaWIgPSBVbmlmb3Jtc0xpYjsKKwlleHBvcnRzLlVuaWZvcm1zVXRpbHMgPSBVbmlm
b3Jtc1V0aWxzOworCWV4cG9ydHMuU2hhZGVyQ2h1bmsgPSBTaGFkZXJDaHVuazsKKwlleHBvcnRz
LkZvZ0V4cDIgPSBGb2dFeHAyOworCWV4cG9ydHMuRm9nID0gRm9nOworCWV4cG9ydHMuU2NlbmUg
PSBTY2VuZTsKKwlleHBvcnRzLkxlbnNGbGFyZSA9IExlbnNGbGFyZTsKKwlleHBvcnRzLlNwcml0
ZSA9IFNwcml0ZTsKKwlleHBvcnRzLkxPRCA9IExPRDsKKwlleHBvcnRzLlNraW5uZWRNZXNoID0g
U2tpbm5lZE1lc2g7CisJZXhwb3J0cy5Ta2VsZXRvbiA9IFNrZWxldG9uOworCWV4cG9ydHMuQm9u
ZSA9IEJvbmU7CisJZXhwb3J0cy5NZXNoID0gTWVzaDsKKwlleHBvcnRzLkxpbmVTZWdtZW50cyA9
IExpbmVTZWdtZW50czsKKwlleHBvcnRzLkxpbmVMb29wID0gTGluZUxvb3A7CisJZXhwb3J0cy5M
aW5lID0gTGluZTsKKwlleHBvcnRzLlBvaW50cyA9IFBvaW50czsKKwlleHBvcnRzLkdyb3VwID0g
R3JvdXA7CisJZXhwb3J0cy5WaWRlb1RleHR1cmUgPSBWaWRlb1RleHR1cmU7CisJZXhwb3J0cy5E
YXRhVGV4dHVyZSA9IERhdGFUZXh0dXJlOworCWV4cG9ydHMuQ29tcHJlc3NlZFRleHR1cmUgPSBD
b21wcmVzc2VkVGV4dHVyZTsKKwlleHBvcnRzLkN1YmVUZXh0dXJlID0gQ3ViZVRleHR1cmU7CisJ
ZXhwb3J0cy5DYW52YXNUZXh0dXJlID0gQ2FudmFzVGV4dHVyZTsKKwlleHBvcnRzLkRlcHRoVGV4
dHVyZSA9IERlcHRoVGV4dHVyZTsKKwlleHBvcnRzLlRleHR1cmUgPSBUZXh0dXJlOworCWV4cG9y
dHMuQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIgPSBDb21wcmVzc2VkVGV4dHVyZUxvYWRlcjsKKwll
eHBvcnRzLkRhdGFUZXh0dXJlTG9hZGVyID0gRGF0YVRleHR1cmVMb2FkZXI7CisJZXhwb3J0cy5D
dWJlVGV4dHVyZUxvYWRlciA9IEN1YmVUZXh0dXJlTG9hZGVyOworCWV4cG9ydHMuVGV4dHVyZUxv
YWRlciA9IFRleHR1cmVMb2FkZXI7CisJZXhwb3J0cy5PYmplY3RMb2FkZXIgPSBPYmplY3RMb2Fk
ZXI7CisJZXhwb3J0cy5NYXRlcmlhbExvYWRlciA9IE1hdGVyaWFsTG9hZGVyOworCWV4cG9ydHMu
QnVmZmVyR2VvbWV0cnlMb2FkZXIgPSBCdWZmZXJHZW9tZXRyeUxvYWRlcjsKKwlleHBvcnRzLkRl
ZmF1bHRMb2FkaW5nTWFuYWdlciA9IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKKwlleHBvcnRzLkxv
YWRpbmdNYW5hZ2VyID0gTG9hZGluZ01hbmFnZXI7CisJZXhwb3J0cy5KU09OTG9hZGVyID0gSlNP
TkxvYWRlcjsKKwlleHBvcnRzLkltYWdlTG9hZGVyID0gSW1hZ2VMb2FkZXI7CisJZXhwb3J0cy5G
b250TG9hZGVyID0gRm9udExvYWRlcjsKKwlleHBvcnRzLkZpbGVMb2FkZXIgPSBGaWxlTG9hZGVy
OworCWV4cG9ydHMuTG9hZGVyID0gTG9hZGVyOworCWV4cG9ydHMuQ2FjaGUgPSBDYWNoZTsKKwll
eHBvcnRzLkF1ZGlvTG9hZGVyID0gQXVkaW9Mb2FkZXI7CisJZXhwb3J0cy5TcG90TGlnaHRTaGFk
b3cgPSBTcG90TGlnaHRTaGFkb3c7CisJZXhwb3J0cy5TcG90TGlnaHQgPSBTcG90TGlnaHQ7CisJ
ZXhwb3J0cy5Qb2ludExpZ2h0ID0gUG9pbnRMaWdodDsKKwlleHBvcnRzLlJlY3RBcmVhTGlnaHQg
PSBSZWN0QXJlYUxpZ2h0OworCWV4cG9ydHMuSGVtaXNwaGVyZUxpZ2h0ID0gSGVtaXNwaGVyZUxp
Z2h0OworCWV4cG9ydHMuRGlyZWN0aW9uYWxMaWdodFNoYWRvdyA9IERpcmVjdGlvbmFsTGlnaHRT
aGFkb3c7CisJZXhwb3J0cy5EaXJlY3Rpb25hbExpZ2h0ID0gRGlyZWN0aW9uYWxMaWdodDsKKwll
eHBvcnRzLkFtYmllbnRMaWdodCA9IEFtYmllbnRMaWdodDsKKwlleHBvcnRzLkxpZ2h0U2hhZG93
ID0gTGlnaHRTaGFkb3c7CisJZXhwb3J0cy5MaWdodCA9IExpZ2h0OworCWV4cG9ydHMuU3RlcmVv
Q2FtZXJhID0gU3RlcmVvQ2FtZXJhOworCWV4cG9ydHMuUGVyc3BlY3RpdmVDYW1lcmEgPSBQZXJz
cGVjdGl2ZUNhbWVyYTsKKwlleHBvcnRzLk9ydGhvZ3JhcGhpY0NhbWVyYSA9IE9ydGhvZ3JhcGhp
Y0NhbWVyYTsKKwlleHBvcnRzLkN1YmVDYW1lcmEgPSBDdWJlQ2FtZXJhOworCWV4cG9ydHMuQXJy
YXlDYW1lcmEgPSBBcnJheUNhbWVyYTsKKwlleHBvcnRzLkNhbWVyYSA9IENhbWVyYTsKKwlleHBv
cnRzLkF1ZGlvTGlzdGVuZXIgPSBBdWRpb0xpc3RlbmVyOworCWV4cG9ydHMuUG9zaXRpb25hbEF1
ZGlvID0gUG9zaXRpb25hbEF1ZGlvOworCWV4cG9ydHMuQXVkaW9Db250ZXh0ID0gQXVkaW9Db250
ZXh0OworCWV4cG9ydHMuQXVkaW9BbmFseXNlciA9IEF1ZGlvQW5hbHlzZXI7CisJZXhwb3J0cy5B
dWRpbyA9IEF1ZGlvOworCWV4cG9ydHMuVmVjdG9yS2V5ZnJhbWVUcmFjayA9IFZlY3RvcktleWZy
YW1lVHJhY2s7CisJZXhwb3J0cy5TdHJpbmdLZXlmcmFtZVRyYWNrID0gU3RyaW5nS2V5ZnJhbWVU
cmFjazsKKwlleHBvcnRzLlF1YXRlcm5pb25LZXlmcmFtZVRyYWNrID0gUXVhdGVybmlvbktleWZy
YW1lVHJhY2s7CisJZXhwb3J0cy5OdW1iZXJLZXlmcmFtZVRyYWNrID0gTnVtYmVyS2V5ZnJhbWVU
cmFjazsKKwlleHBvcnRzLkNvbG9yS2V5ZnJhbWVUcmFjayA9IENvbG9yS2V5ZnJhbWVUcmFjazsK
KwlleHBvcnRzLkJvb2xlYW5LZXlmcmFtZVRyYWNrID0gQm9vbGVhbktleWZyYW1lVHJhY2s7CisJ
ZXhwb3J0cy5Qcm9wZXJ0eU1peGVyID0gUHJvcGVydHlNaXhlcjsKKwlleHBvcnRzLlByb3BlcnR5
QmluZGluZyA9IFByb3BlcnR5QmluZGluZzsKKwlleHBvcnRzLktleWZyYW1lVHJhY2sgPSBLZXlm
cmFtZVRyYWNrOworCWV4cG9ydHMuQW5pbWF0aW9uVXRpbHMgPSBBbmltYXRpb25VdGlsczsKKwll
eHBvcnRzLkFuaW1hdGlvbk9iamVjdEdyb3VwID0gQW5pbWF0aW9uT2JqZWN0R3JvdXA7CisJZXhw
b3J0cy5BbmltYXRpb25NaXhlciA9IEFuaW1hdGlvbk1peGVyOworCWV4cG9ydHMuQW5pbWF0aW9u
Q2xpcCA9IEFuaW1hdGlvbkNsaXA7CisJZXhwb3J0cy5Vbmlmb3JtID0gVW5pZm9ybTsKKwlleHBv
cnRzLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID0gSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk7CisJ
ZXhwb3J0cy5CdWZmZXJHZW9tZXRyeSA9IEJ1ZmZlckdlb21ldHJ5OworCWV4cG9ydHMuR2VvbWV0
cnlJZENvdW50ID0gR2VvbWV0cnlJZENvdW50OworCWV4cG9ydHMuR2VvbWV0cnkgPSBHZW9tZXRy
eTsKKwlleHBvcnRzLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlID0gSW50ZXJsZWF2ZWRCdWZm
ZXJBdHRyaWJ1dGU7CisJZXhwb3J0cy5JbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciA9IEluc3Rh
bmNlZEludGVybGVhdmVkQnVmZmVyOworCWV4cG9ydHMuSW50ZXJsZWF2ZWRCdWZmZXIgPSBJbnRl
cmxlYXZlZEJ1ZmZlcjsKKwlleHBvcnRzLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA9IEluc3Rh
bmNlZEJ1ZmZlckF0dHJpYnV0ZTsKKwlleHBvcnRzLkZhY2UzID0gRmFjZTM7CisJZXhwb3J0cy5P
YmplY3QzRCA9IE9iamVjdDNEOworCWV4cG9ydHMuUmF5Y2FzdGVyID0gUmF5Y2FzdGVyOworCWV4
cG9ydHMuTGF5ZXJzID0gTGF5ZXJzOworCWV4cG9ydHMuRXZlbnREaXNwYXRjaGVyID0gRXZlbnRE
aXNwYXRjaGVyOworCWV4cG9ydHMuQ2xvY2sgPSBDbG9jazsKKwlleHBvcnRzLlF1YXRlcm5pb25M
aW5lYXJJbnRlcnBvbGFudCA9IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudDsKKwlleHBvcnRz
LkxpbmVhckludGVycG9sYW50ID0gTGluZWFySW50ZXJwb2xhbnQ7CisJZXhwb3J0cy5EaXNjcmV0
ZUludGVycG9sYW50ID0gRGlzY3JldGVJbnRlcnBvbGFudDsKKwlleHBvcnRzLkN1YmljSW50ZXJw
b2xhbnQgPSBDdWJpY0ludGVycG9sYW50OworCWV4cG9ydHMuSW50ZXJwb2xhbnQgPSBJbnRlcnBv
bGFudDsKKwlleHBvcnRzLlRyaWFuZ2xlID0gVHJpYW5nbGU7CisJZXhwb3J0cy5NYXRoID0gX01h
dGg7CisJZXhwb3J0cy5TcGhlcmljYWwgPSBTcGhlcmljYWw7CisJZXhwb3J0cy5DeWxpbmRyaWNh
bCA9IEN5bGluZHJpY2FsOworCWV4cG9ydHMuUGxhbmUgPSBQbGFuZTsKKwlleHBvcnRzLkZydXN0
dW0gPSBGcnVzdHVtOworCWV4cG9ydHMuU3BoZXJlID0gU3BoZXJlOworCWV4cG9ydHMuUmF5ID0g
UmF5OworCWV4cG9ydHMuTWF0cml4NCA9IE1hdHJpeDQ7CisJZXhwb3J0cy5NYXRyaXgzID0gTWF0
cml4MzsKKwlleHBvcnRzLkJveDMgPSBCb3gzOworCWV4cG9ydHMuQm94MiA9IEJveDI7CisJZXhw
b3J0cy5MaW5lMyA9IExpbmUzOworCWV4cG9ydHMuRXVsZXIgPSBFdWxlcjsKKwlleHBvcnRzLlZl
Y3RvcjQgPSBWZWN0b3I0OworCWV4cG9ydHMuVmVjdG9yMyA9IFZlY3RvcjM7CisJZXhwb3J0cy5W
ZWN0b3IyID0gVmVjdG9yMjsKKwlleHBvcnRzLlF1YXRlcm5pb24gPSBRdWF0ZXJuaW9uOworCWV4
cG9ydHMuQ29sb3IgPSBDb2xvcjsKKwlleHBvcnRzLk1vcnBoQmxlbmRNZXNoID0gTW9ycGhCbGVu
ZE1lc2g7CisJZXhwb3J0cy5JbW1lZGlhdGVSZW5kZXJPYmplY3QgPSBJbW1lZGlhdGVSZW5kZXJP
YmplY3Q7CisJZXhwb3J0cy5WZXJ0ZXhOb3JtYWxzSGVscGVyID0gVmVydGV4Tm9ybWFsc0hlbHBl
cjsKKwlleHBvcnRzLlNwb3RMaWdodEhlbHBlciA9IFNwb3RMaWdodEhlbHBlcjsKKwlleHBvcnRz
LlNrZWxldG9uSGVscGVyID0gU2tlbGV0b25IZWxwZXI7CisJZXhwb3J0cy5Qb2ludExpZ2h0SGVs
cGVyID0gUG9pbnRMaWdodEhlbHBlcjsKKwlleHBvcnRzLlJlY3RBcmVhTGlnaHRIZWxwZXIgPSBS
ZWN0QXJlYUxpZ2h0SGVscGVyOworCWV4cG9ydHMuSGVtaXNwaGVyZUxpZ2h0SGVscGVyID0gSGVt
aXNwaGVyZUxpZ2h0SGVscGVyOworCWV4cG9ydHMuR3JpZEhlbHBlciA9IEdyaWRIZWxwZXI7CisJ
ZXhwb3J0cy5Qb2xhckdyaWRIZWxwZXIgPSBQb2xhckdyaWRIZWxwZXI7CisJZXhwb3J0cy5GYWNl
Tm9ybWFsc0hlbHBlciA9IEZhY2VOb3JtYWxzSGVscGVyOworCWV4cG9ydHMuRGlyZWN0aW9uYWxM
aWdodEhlbHBlciA9IERpcmVjdGlvbmFsTGlnaHRIZWxwZXI7CisJZXhwb3J0cy5DYW1lcmFIZWxw
ZXIgPSBDYW1lcmFIZWxwZXI7CisJZXhwb3J0cy5Cb3hIZWxwZXIgPSBCb3hIZWxwZXI7CisJZXhw
b3J0cy5BcnJvd0hlbHBlciA9IEFycm93SGVscGVyOworCWV4cG9ydHMuQXhpc0hlbHBlciA9IEF4
aXNIZWxwZXI7CisJZXhwb3J0cy5DYXRtdWxsUm9tQ3VydmUzID0gQ2F0bXVsbFJvbUN1cnZlMzsK
KwlleHBvcnRzLkN1YmljQmV6aWVyQ3VydmUzID0gQ3ViaWNCZXppZXJDdXJ2ZTM7CisJZXhwb3J0
cy5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTM7CisJZXhwb3J0
cy5MaW5lQ3VydmUzID0gTGluZUN1cnZlMzsKKwlleHBvcnRzLkFyY0N1cnZlID0gQXJjQ3VydmU7
CisJZXhwb3J0cy5FbGxpcHNlQ3VydmUgPSBFbGxpcHNlQ3VydmU7CisJZXhwb3J0cy5TcGxpbmVD
dXJ2ZSA9IFNwbGluZUN1cnZlOworCWV4cG9ydHMuQ3ViaWNCZXppZXJDdXJ2ZSA9IEN1YmljQmV6
aWVyQ3VydmU7CisJZXhwb3J0cy5RdWFkcmF0aWNCZXppZXJDdXJ2ZSA9IFF1YWRyYXRpY0Jlemll
ckN1cnZlOworCWV4cG9ydHMuTGluZUN1cnZlID0gTGluZUN1cnZlOworCWV4cG9ydHMuU2hhcGUg
PSBTaGFwZTsKKwlleHBvcnRzLlBhdGggPSBQYXRoOworCWV4cG9ydHMuU2hhcGVQYXRoID0gU2hh
cGVQYXRoOworCWV4cG9ydHMuRm9udCA9IEZvbnQ7CisJZXhwb3J0cy5DdXJ2ZVBhdGggPSBDdXJ2
ZVBhdGg7CisJZXhwb3J0cy5DdXJ2ZSA9IEN1cnZlOworCWV4cG9ydHMuU2hhcGVVdGlscyA9IFNo
YXBlVXRpbHM7CisJZXhwb3J0cy5TY2VuZVV0aWxzID0gU2NlbmVVdGlsczsKKwlleHBvcnRzLldp
cmVmcmFtZUdlb21ldHJ5ID0gV2lyZWZyYW1lR2VvbWV0cnk7CisJZXhwb3J0cy5QYXJhbWV0cmlj
R2VvbWV0cnkgPSBQYXJhbWV0cmljR2VvbWV0cnk7CisJZXhwb3J0cy5QYXJhbWV0cmljQnVmZmVy
R2VvbWV0cnkgPSBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk7CisJZXhwb3J0cy5UZXRyYWhlZHJv
bkdlb21ldHJ5ID0gVGV0cmFoZWRyb25HZW9tZXRyeTsKKwlleHBvcnRzLlRldHJhaGVkcm9uQnVm
ZmVyR2VvbWV0cnkgPSBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OworCWV4cG9ydHMuT2N0YWhl
ZHJvbkdlb21ldHJ5ID0gT2N0YWhlZHJvbkdlb21ldHJ5OworCWV4cG9ydHMuT2N0YWhlZHJvbkJ1
ZmZlckdlb21ldHJ5ID0gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OworCWV4cG9ydHMuSWNvc2Fo
ZWRyb25HZW9tZXRyeSA9IEljb3NhaGVkcm9uR2VvbWV0cnk7CisJZXhwb3J0cy5JY29zYWhlZHJv
bkJ1ZmZlckdlb21ldHJ5ID0gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTsKKwlleHBvcnRzLkRv
ZGVjYWhlZHJvbkdlb21ldHJ5ID0gRG9kZWNhaGVkcm9uR2VvbWV0cnk7CisJZXhwb3J0cy5Eb2Rl
Y2FoZWRyb25CdWZmZXJHZW9tZXRyeSA9IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OworCWV4
cG9ydHMuUG9seWhlZHJvbkdlb21ldHJ5ID0gUG9seWhlZHJvbkdlb21ldHJ5OworCWV4cG9ydHMu
UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5ID0gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OworCWV4
cG9ydHMuVHViZUdlb21ldHJ5ID0gVHViZUdlb21ldHJ5OworCWV4cG9ydHMuVHViZUJ1ZmZlckdl
b21ldHJ5ID0gVHViZUJ1ZmZlckdlb21ldHJ5OworCWV4cG9ydHMuVG9ydXNLbm90R2VvbWV0cnkg
PSBUb3J1c0tub3RHZW9tZXRyeTsKKwlleHBvcnRzLlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5ID0g
VG9ydXNLbm90QnVmZmVyR2VvbWV0cnk7CisJZXhwb3J0cy5Ub3J1c0dlb21ldHJ5ID0gVG9ydXNH
ZW9tZXRyeTsKKwlleHBvcnRzLlRvcnVzQnVmZmVyR2VvbWV0cnkgPSBUb3J1c0J1ZmZlckdlb21l
dHJ5OworCWV4cG9ydHMuVGV4dEdlb21ldHJ5ID0gVGV4dEdlb21ldHJ5OworCWV4cG9ydHMuVGV4
dEJ1ZmZlckdlb21ldHJ5ID0gVGV4dEJ1ZmZlckdlb21ldHJ5OworCWV4cG9ydHMuU3BoZXJlR2Vv
bWV0cnkgPSBTcGhlcmVHZW9tZXRyeTsKKwlleHBvcnRzLlNwaGVyZUJ1ZmZlckdlb21ldHJ5ID0g
U3BoZXJlQnVmZmVyR2VvbWV0cnk7CisJZXhwb3J0cy5SaW5nR2VvbWV0cnkgPSBSaW5nR2VvbWV0
cnk7CisJZXhwb3J0cy5SaW5nQnVmZmVyR2VvbWV0cnkgPSBSaW5nQnVmZmVyR2VvbWV0cnk7CisJ
ZXhwb3J0cy5QbGFuZUdlb21ldHJ5ID0gUGxhbmVHZW9tZXRyeTsKKwlleHBvcnRzLlBsYW5lQnVm
ZmVyR2VvbWV0cnkgPSBQbGFuZUJ1ZmZlckdlb21ldHJ5OworCWV4cG9ydHMuTGF0aGVHZW9tZXRy
eSA9IExhdGhlR2VvbWV0cnk7CisJZXhwb3J0cy5MYXRoZUJ1ZmZlckdlb21ldHJ5ID0gTGF0aGVC
dWZmZXJHZW9tZXRyeTsKKwlleHBvcnRzLlNoYXBlR2VvbWV0cnkgPSBTaGFwZUdlb21ldHJ5Owor
CWV4cG9ydHMuU2hhcGVCdWZmZXJHZW9tZXRyeSA9IFNoYXBlQnVmZmVyR2VvbWV0cnk7CisJZXhw
b3J0cy5FeHRydWRlR2VvbWV0cnkgPSBFeHRydWRlR2VvbWV0cnk7CisJZXhwb3J0cy5FeHRydWRl
QnVmZmVyR2VvbWV0cnkgPSBFeHRydWRlQnVmZmVyR2VvbWV0cnk7CisJZXhwb3J0cy5FZGdlc0dl
b21ldHJ5ID0gRWRnZXNHZW9tZXRyeTsKKwlleHBvcnRzLkNvbmVHZW9tZXRyeSA9IENvbmVHZW9t
ZXRyeTsKKwlleHBvcnRzLkNvbmVCdWZmZXJHZW9tZXRyeSA9IENvbmVCdWZmZXJHZW9tZXRyeTsK
KwlleHBvcnRzLkN5bGluZGVyR2VvbWV0cnkgPSBDeWxpbmRlckdlb21ldHJ5OworCWV4cG9ydHMu
Q3lsaW5kZXJCdWZmZXJHZW9tZXRyeSA9IEN5bGluZGVyQnVmZmVyR2VvbWV0cnk7CisJZXhwb3J0
cy5DaXJjbGVHZW9tZXRyeSA9IENpcmNsZUdlb21ldHJ5OworCWV4cG9ydHMuQ2lyY2xlQnVmZmVy
R2VvbWV0cnkgPSBDaXJjbGVCdWZmZXJHZW9tZXRyeTsKKwlleHBvcnRzLkJveEdlb21ldHJ5ID0g
Qm94R2VvbWV0cnk7CisJZXhwb3J0cy5Cb3hCdWZmZXJHZW9tZXRyeSA9IEJveEJ1ZmZlckdlb21l
dHJ5OworCWV4cG9ydHMuU2hhZG93TWF0ZXJpYWwgPSBTaGFkb3dNYXRlcmlhbDsKKwlleHBvcnRz
LlNwcml0ZU1hdGVyaWFsID0gU3ByaXRlTWF0ZXJpYWw7CisJZXhwb3J0cy5SYXdTaGFkZXJNYXRl
cmlhbCA9IFJhd1NoYWRlck1hdGVyaWFsOworCWV4cG9ydHMuU2hhZGVyTWF0ZXJpYWwgPSBTaGFk
ZXJNYXRlcmlhbDsKKwlleHBvcnRzLlBvaW50c01hdGVyaWFsID0gUG9pbnRzTWF0ZXJpYWw7CisJ
ZXhwb3J0cy5NZXNoUGh5c2ljYWxNYXRlcmlhbCA9IE1lc2hQaHlzaWNhbE1hdGVyaWFsOworCWV4
cG9ydHMuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSBNZXNoU3RhbmRhcmRNYXRlcmlhbDsKKwlleHBv
cnRzLk1lc2hQaG9uZ01hdGVyaWFsID0gTWVzaFBob25nTWF0ZXJpYWw7CisJZXhwb3J0cy5NZXNo
VG9vbk1hdGVyaWFsID0gTWVzaFRvb25NYXRlcmlhbDsKKwlleHBvcnRzLk1lc2hOb3JtYWxNYXRl
cmlhbCA9IE1lc2hOb3JtYWxNYXRlcmlhbDsKKwlleHBvcnRzLk1lc2hMYW1iZXJ0TWF0ZXJpYWwg
PSBNZXNoTGFtYmVydE1hdGVyaWFsOworCWV4cG9ydHMuTWVzaERlcHRoTWF0ZXJpYWwgPSBNZXNo
RGVwdGhNYXRlcmlhbDsKKwlleHBvcnRzLk1lc2hCYXNpY01hdGVyaWFsID0gTWVzaEJhc2ljTWF0
ZXJpYWw7CisJZXhwb3J0cy5MaW5lRGFzaGVkTWF0ZXJpYWwgPSBMaW5lRGFzaGVkTWF0ZXJpYWw7
CisJZXhwb3J0cy5MaW5lQmFzaWNNYXRlcmlhbCA9IExpbmVCYXNpY01hdGVyaWFsOworCWV4cG9y
dHMuTWF0ZXJpYWwgPSBNYXRlcmlhbDsKKwlleHBvcnRzLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUg
PSBGbG9hdDY0QnVmZmVyQXR0cmlidXRlOworCWV4cG9ydHMuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0
ZSA9IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU7CisJZXhwb3J0cy5VaW50MzJCdWZmZXJBdHRyaWJ1
dGUgPSBVaW50MzJCdWZmZXJBdHRyaWJ1dGU7CisJZXhwb3J0cy5JbnQzMkJ1ZmZlckF0dHJpYnV0
ZSA9IEludDMyQnVmZmVyQXR0cmlidXRlOworCWV4cG9ydHMuVWludDE2QnVmZmVyQXR0cmlidXRl
ID0gVWludDE2QnVmZmVyQXR0cmlidXRlOworCWV4cG9ydHMuSW50MTZCdWZmZXJBdHRyaWJ1dGUg
PSBJbnQxNkJ1ZmZlckF0dHJpYnV0ZTsKKwlleHBvcnRzLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJp
YnV0ZSA9IFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZTsKKwlleHBvcnRzLlVpbnQ4QnVmZmVy
QXR0cmlidXRlID0gVWludDhCdWZmZXJBdHRyaWJ1dGU7CisJZXhwb3J0cy5JbnQ4QnVmZmVyQXR0
cmlidXRlID0gSW50OEJ1ZmZlckF0dHJpYnV0ZTsKKwlleHBvcnRzLkJ1ZmZlckF0dHJpYnV0ZSA9
IEJ1ZmZlckF0dHJpYnV0ZTsKKwlleHBvcnRzLlJFVklTSU9OID0gUkVWSVNJT047CisJZXhwb3J0
cy5NT1VTRSA9IE1PVVNFOworCWV4cG9ydHMuQ3VsbEZhY2VOb25lID0gQ3VsbEZhY2VOb25lOwor
CWV4cG9ydHMuQ3VsbEZhY2VCYWNrID0gQ3VsbEZhY2VCYWNrOworCWV4cG9ydHMuQ3VsbEZhY2VG
cm9udCA9IEN1bGxGYWNlRnJvbnQ7CisJZXhwb3J0cy5DdWxsRmFjZUZyb250QmFjayA9IEN1bGxG
YWNlRnJvbnRCYWNrOworCWV4cG9ydHMuRnJvbnRGYWNlRGlyZWN0aW9uQ1cgPSBGcm9udEZhY2VE
aXJlY3Rpb25DVzsKKwlleHBvcnRzLkZyb250RmFjZURpcmVjdGlvbkNDVyA9IEZyb250RmFjZURp
cmVjdGlvbkNDVzsKKwlleHBvcnRzLkJhc2ljU2hhZG93TWFwID0gQmFzaWNTaGFkb3dNYXA7CisJ
ZXhwb3J0cy5QQ0ZTaGFkb3dNYXAgPSBQQ0ZTaGFkb3dNYXA7CisJZXhwb3J0cy5QQ0ZTb2Z0U2hh
ZG93TWFwID0gUENGU29mdFNoYWRvd01hcDsKKwlleHBvcnRzLkZyb250U2lkZSA9IEZyb250U2lk
ZTsKKwlleHBvcnRzLkJhY2tTaWRlID0gQmFja1NpZGU7CisJZXhwb3J0cy5Eb3VibGVTaWRlID0g
RG91YmxlU2lkZTsKKwlleHBvcnRzLkZsYXRTaGFkaW5nID0gRmxhdFNoYWRpbmc7CisJZXhwb3J0
cy5TbW9vdGhTaGFkaW5nID0gU21vb3RoU2hhZGluZzsKKwlleHBvcnRzLk5vQ29sb3JzID0gTm9D
b2xvcnM7CisJZXhwb3J0cy5GYWNlQ29sb3JzID0gRmFjZUNvbG9yczsKKwlleHBvcnRzLlZlcnRl
eENvbG9ycyA9IFZlcnRleENvbG9yczsKKwlleHBvcnRzLk5vQmxlbmRpbmcgPSBOb0JsZW5kaW5n
OworCWV4cG9ydHMuTm9ybWFsQmxlbmRpbmcgPSBOb3JtYWxCbGVuZGluZzsKKwlleHBvcnRzLkFk
ZGl0aXZlQmxlbmRpbmcgPSBBZGRpdGl2ZUJsZW5kaW5nOworCWV4cG9ydHMuU3VidHJhY3RpdmVC
bGVuZGluZyA9IFN1YnRyYWN0aXZlQmxlbmRpbmc7CisJZXhwb3J0cy5NdWx0aXBseUJsZW5kaW5n
ID0gTXVsdGlwbHlCbGVuZGluZzsKKwlleHBvcnRzLkN1c3RvbUJsZW5kaW5nID0gQ3VzdG9tQmxl
bmRpbmc7CisJZXhwb3J0cy5BZGRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uOworCWV4cG9ydHMuU3Vi
dHJhY3RFcXVhdGlvbiA9IFN1YnRyYWN0RXF1YXRpb247CisJZXhwb3J0cy5SZXZlcnNlU3VidHJh
Y3RFcXVhdGlvbiA9IFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uOworCWV4cG9ydHMuTWluRXF1YXRp
b24gPSBNaW5FcXVhdGlvbjsKKwlleHBvcnRzLk1heEVxdWF0aW9uID0gTWF4RXF1YXRpb247CisJ
ZXhwb3J0cy5aZXJvRmFjdG9yID0gWmVyb0ZhY3RvcjsKKwlleHBvcnRzLk9uZUZhY3RvciA9IE9u
ZUZhY3RvcjsKKwlleHBvcnRzLlNyY0NvbG9yRmFjdG9yID0gU3JjQ29sb3JGYWN0b3I7CisJZXhw
b3J0cy5PbmVNaW51c1NyY0NvbG9yRmFjdG9yID0gT25lTWludXNTcmNDb2xvckZhY3RvcjsKKwll
eHBvcnRzLlNyY0FscGhhRmFjdG9yID0gU3JjQWxwaGFGYWN0b3I7CisJZXhwb3J0cy5PbmVNaW51
c1NyY0FscGhhRmFjdG9yID0gT25lTWludXNTcmNBbHBoYUZhY3RvcjsKKwlleHBvcnRzLkRzdEFs
cGhhRmFjdG9yID0gRHN0QWxwaGFGYWN0b3I7CisJZXhwb3J0cy5PbmVNaW51c0RzdEFscGhhRmFj
dG9yID0gT25lTWludXNEc3RBbHBoYUZhY3RvcjsKKwlleHBvcnRzLkRzdENvbG9yRmFjdG9yID0g
RHN0Q29sb3JGYWN0b3I7CisJZXhwb3J0cy5PbmVNaW51c0RzdENvbG9yRmFjdG9yID0gT25lTWlu
dXNEc3RDb2xvckZhY3RvcjsKKwlleHBvcnRzLlNyY0FscGhhU2F0dXJhdGVGYWN0b3IgPSBTcmNB
bHBoYVNhdHVyYXRlRmFjdG9yOworCWV4cG9ydHMuTmV2ZXJEZXB0aCA9IE5ldmVyRGVwdGg7CisJ
ZXhwb3J0cy5BbHdheXNEZXB0aCA9IEFsd2F5c0RlcHRoOworCWV4cG9ydHMuTGVzc0RlcHRoID0g
TGVzc0RlcHRoOworCWV4cG9ydHMuTGVzc0VxdWFsRGVwdGggPSBMZXNzRXF1YWxEZXB0aDsKKwll
eHBvcnRzLkVxdWFsRGVwdGggPSBFcXVhbERlcHRoOworCWV4cG9ydHMuR3JlYXRlckVxdWFsRGVw
dGggPSBHcmVhdGVyRXF1YWxEZXB0aDsKKwlleHBvcnRzLkdyZWF0ZXJEZXB0aCA9IEdyZWF0ZXJE
ZXB0aDsKKwlleHBvcnRzLk5vdEVxdWFsRGVwdGggPSBOb3RFcXVhbERlcHRoOworCWV4cG9ydHMu
TXVsdGlwbHlPcGVyYXRpb24gPSBNdWx0aXBseU9wZXJhdGlvbjsKKwlleHBvcnRzLk1peE9wZXJh
dGlvbiA9IE1peE9wZXJhdGlvbjsKKwlleHBvcnRzLkFkZE9wZXJhdGlvbiA9IEFkZE9wZXJhdGlv
bjsKKwlleHBvcnRzLk5vVG9uZU1hcHBpbmcgPSBOb1RvbmVNYXBwaW5nOworCWV4cG9ydHMuTGlu
ZWFyVG9uZU1hcHBpbmcgPSBMaW5lYXJUb25lTWFwcGluZzsKKwlleHBvcnRzLlJlaW5oYXJkVG9u
ZU1hcHBpbmcgPSBSZWluaGFyZFRvbmVNYXBwaW5nOworCWV4cG9ydHMuVW5jaGFydGVkMlRvbmVN
YXBwaW5nID0gVW5jaGFydGVkMlRvbmVNYXBwaW5nOworCWV4cG9ydHMuQ2luZW9uVG9uZU1hcHBp
bmcgPSBDaW5lb25Ub25lTWFwcGluZzsKKwlleHBvcnRzLlVWTWFwcGluZyA9IFVWTWFwcGluZzsK
KwlleHBvcnRzLkN1YmVSZWZsZWN0aW9uTWFwcGluZyA9IEN1YmVSZWZsZWN0aW9uTWFwcGluZzsK
KwlleHBvcnRzLkN1YmVSZWZyYWN0aW9uTWFwcGluZyA9IEN1YmVSZWZyYWN0aW9uTWFwcGluZzsK
KwlleHBvcnRzLkVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nID0gRXF1aXJlY3Rhbmd1
bGFyUmVmbGVjdGlvbk1hcHBpbmc7CisJZXhwb3J0cy5FcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9u
TWFwcGluZyA9IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOworCWV4cG9ydHMuU3Bo
ZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcgPSBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzsKKwll
eHBvcnRzLkN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nID0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc7
CisJZXhwb3J0cy5DdWJlVVZSZWZyYWN0aW9uTWFwcGluZyA9IEN1YmVVVlJlZnJhY3Rpb25NYXBw
aW5nOworCWV4cG9ydHMuUmVwZWF0V3JhcHBpbmcgPSBSZXBlYXRXcmFwcGluZzsKKwlleHBvcnRz
LkNsYW1wVG9FZGdlV3JhcHBpbmcgPSBDbGFtcFRvRWRnZVdyYXBwaW5nOworCWV4cG9ydHMuTWly
cm9yZWRSZXBlYXRXcmFwcGluZyA9IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc7CisJZXhwb3J0cy5O
ZWFyZXN0RmlsdGVyID0gTmVhcmVzdEZpbHRlcjsKKwlleHBvcnRzLk5lYXJlc3RNaXBNYXBOZWFy
ZXN0RmlsdGVyID0gTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI7CisJZXhwb3J0cy5OZWFyZXN0
TWlwTWFwTGluZWFyRmlsdGVyID0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlcjsKKwlleHBvcnRz
LkxpbmVhckZpbHRlciA9IExpbmVhckZpbHRlcjsKKwlleHBvcnRzLkxpbmVhck1pcE1hcE5lYXJl
c3RGaWx0ZXIgPSBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOworCWV4cG9ydHMuTGluZWFyTWlw
TWFwTGluZWFyRmlsdGVyID0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyOworCWV4cG9ydHMuVW5z
aWduZWRCeXRlVHlwZSA9IFVuc2lnbmVkQnl0ZVR5cGU7CisJZXhwb3J0cy5CeXRlVHlwZSA9IEJ5
dGVUeXBlOworCWV4cG9ydHMuU2hvcnRUeXBlID0gU2hvcnRUeXBlOworCWV4cG9ydHMuVW5zaWdu
ZWRTaG9ydFR5cGUgPSBVbnNpZ25lZFNob3J0VHlwZTsKKwlleHBvcnRzLkludFR5cGUgPSBJbnRU
eXBlOworCWV4cG9ydHMuVW5zaWduZWRJbnRUeXBlID0gVW5zaWduZWRJbnRUeXBlOworCWV4cG9y
dHMuRmxvYXRUeXBlID0gRmxvYXRUeXBlOworCWV4cG9ydHMuSGFsZkZsb2F0VHlwZSA9IEhhbGZG
bG9hdFR5cGU7CisJZXhwb3J0cy5VbnNpZ25lZFNob3J0NDQ0NFR5cGUgPSBVbnNpZ25lZFNob3J0
NDQ0NFR5cGU7CisJZXhwb3J0cy5VbnNpZ25lZFNob3J0NTU1MVR5cGUgPSBVbnNpZ25lZFNob3J0
NTU1MVR5cGU7CisJZXhwb3J0cy5VbnNpZ25lZFNob3J0NTY1VHlwZSA9IFVuc2lnbmVkU2hvcnQ1
NjVUeXBlOworCWV4cG9ydHMuVW5zaWduZWRJbnQyNDhUeXBlID0gVW5zaWduZWRJbnQyNDhUeXBl
OworCWV4cG9ydHMuQWxwaGFGb3JtYXQgPSBBbHBoYUZvcm1hdDsKKwlleHBvcnRzLlJHQkZvcm1h
dCA9IFJHQkZvcm1hdDsKKwlleHBvcnRzLlJHQkFGb3JtYXQgPSBSR0JBRm9ybWF0OworCWV4cG9y
dHMuTHVtaW5hbmNlRm9ybWF0ID0gTHVtaW5hbmNlRm9ybWF0OworCWV4cG9ydHMuTHVtaW5hbmNl
QWxwaGFGb3JtYXQgPSBMdW1pbmFuY2VBbHBoYUZvcm1hdDsKKwlleHBvcnRzLlJHQkVGb3JtYXQg
PSBSR0JFRm9ybWF0OworCWV4cG9ydHMuRGVwdGhGb3JtYXQgPSBEZXB0aEZvcm1hdDsKKwlleHBv
cnRzLkRlcHRoU3RlbmNpbEZvcm1hdCA9IERlcHRoU3RlbmNpbEZvcm1hdDsKKwlleHBvcnRzLlJH
Ql9TM1RDX0RYVDFfRm9ybWF0ID0gUkdCX1MzVENfRFhUMV9Gb3JtYXQ7CisJZXhwb3J0cy5SR0JB
X1MzVENfRFhUMV9Gb3JtYXQgPSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQ7CisJZXhwb3J0cy5SR0JB
X1MzVENfRFhUM19Gb3JtYXQgPSBSR0JBX1MzVENfRFhUM19Gb3JtYXQ7CisJZXhwb3J0cy5SR0JB
X1MzVENfRFhUNV9Gb3JtYXQgPSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQ7CisJZXhwb3J0cy5SR0Jf
UFZSVENfNEJQUFYxX0Zvcm1hdCA9IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0OworCWV4cG9ydHMu
UkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdDsKKwlleHBv
cnRzLlJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdDsK
KwlleHBvcnRzLlJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IFJHQkFfUFZSVENfMkJQUFYxX0Zv
cm1hdDsKKwlleHBvcnRzLlJHQl9FVEMxX0Zvcm1hdCA9IFJHQl9FVEMxX0Zvcm1hdDsKKwlleHBv
cnRzLkxvb3BPbmNlID0gTG9vcE9uY2U7CisJZXhwb3J0cy5Mb29wUmVwZWF0ID0gTG9vcFJlcGVh
dDsKKwlleHBvcnRzLkxvb3BQaW5nUG9uZyA9IExvb3BQaW5nUG9uZzsKKwlleHBvcnRzLkludGVy
cG9sYXRlRGlzY3JldGUgPSBJbnRlcnBvbGF0ZURpc2NyZXRlOworCWV4cG9ydHMuSW50ZXJwb2xh
dGVMaW5lYXIgPSBJbnRlcnBvbGF0ZUxpbmVhcjsKKwlleHBvcnRzLkludGVycG9sYXRlU21vb3Ro
ID0gSW50ZXJwb2xhdGVTbW9vdGg7CisJZXhwb3J0cy5aZXJvQ3VydmF0dXJlRW5kaW5nID0gWmVy
b0N1cnZhdHVyZUVuZGluZzsKKwlleHBvcnRzLlplcm9TbG9wZUVuZGluZyA9IFplcm9TbG9wZUVu
ZGluZzsKKwlleHBvcnRzLldyYXBBcm91bmRFbmRpbmcgPSBXcmFwQXJvdW5kRW5kaW5nOworCWV4
cG9ydHMuVHJpYW5nbGVzRHJhd01vZGUgPSBUcmlhbmdsZXNEcmF3TW9kZTsKKwlleHBvcnRzLlRy
aWFuZ2xlU3RyaXBEcmF3TW9kZSA9IFRyaWFuZ2xlU3RyaXBEcmF3TW9kZTsKKwlleHBvcnRzLlRy
aWFuZ2xlRmFuRHJhd01vZGUgPSBUcmlhbmdsZUZhbkRyYXdNb2RlOworCWV4cG9ydHMuTGluZWFy
RW5jb2RpbmcgPSBMaW5lYXJFbmNvZGluZzsKKwlleHBvcnRzLnNSR0JFbmNvZGluZyA9IHNSR0JF
bmNvZGluZzsKKwlleHBvcnRzLkdhbW1hRW5jb2RpbmcgPSBHYW1tYUVuY29kaW5nOworCWV4cG9y
dHMuUkdCRUVuY29kaW5nID0gUkdCRUVuY29kaW5nOworCWV4cG9ydHMuTG9nTHV2RW5jb2Rpbmcg
PSBMb2dMdXZFbmNvZGluZzsKKwlleHBvcnRzLlJHQk03RW5jb2RpbmcgPSBSR0JNN0VuY29kaW5n
OworCWV4cG9ydHMuUkdCTTE2RW5jb2RpbmcgPSBSR0JNMTZFbmNvZGluZzsKKwlleHBvcnRzLlJH
QkRFbmNvZGluZyA9IFJHQkRFbmNvZGluZzsKKwlleHBvcnRzLkJhc2ljRGVwdGhQYWNraW5nID0g
QmFzaWNEZXB0aFBhY2tpbmc7CisJZXhwb3J0cy5SR0JBRGVwdGhQYWNraW5nID0gUkdCQURlcHRo
UGFja2luZzsKKwlleHBvcnRzLkN1YmVHZW9tZXRyeSA9IEJveEdlb21ldHJ5OworCWV4cG9ydHMu
RmFjZTQgPSBGYWNlNDsKKwlleHBvcnRzLkxpbmVTdHJpcCA9IExpbmVTdHJpcDsKKwlleHBvcnRz
LkxpbmVQaWVjZXMgPSBMaW5lUGllY2VzOworCWV4cG9ydHMuTWVzaEZhY2VNYXRlcmlhbCA9IE1l
c2hGYWNlTWF0ZXJpYWw7CisJZXhwb3J0cy5NdWx0aU1hdGVyaWFsID0gTXVsdGlNYXRlcmlhbDsK
KwlleHBvcnRzLlBvaW50Q2xvdWQgPSBQb2ludENsb3VkOworCWV4cG9ydHMuUGFydGljbGUgPSBQ
YXJ0aWNsZTsKKwlleHBvcnRzLlBhcnRpY2xlU3lzdGVtID0gUGFydGljbGVTeXN0ZW07CisJZXhw
b3J0cy5Qb2ludENsb3VkTWF0ZXJpYWwgPSBQb2ludENsb3VkTWF0ZXJpYWw7CisJZXhwb3J0cy5Q
YXJ0aWNsZUJhc2ljTWF0ZXJpYWwgPSBQYXJ0aWNsZUJhc2ljTWF0ZXJpYWw7CisJZXhwb3J0cy5Q
YXJ0aWNsZVN5c3RlbU1hdGVyaWFsID0gUGFydGljbGVTeXN0ZW1NYXRlcmlhbDsKKwlleHBvcnRz
LlZlcnRleCA9IFZlcnRleDsKKwlleHBvcnRzLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgPSBEeW5h
bWljQnVmZmVyQXR0cmlidXRlOworCWV4cG9ydHMuSW50OEF0dHJpYnV0ZSA9IEludDhBdHRyaWJ1
dGU7CisJZXhwb3J0cy5VaW50OEF0dHJpYnV0ZSA9IFVpbnQ4QXR0cmlidXRlOworCWV4cG9ydHMu
VWludDhDbGFtcGVkQXR0cmlidXRlID0gVWludDhDbGFtcGVkQXR0cmlidXRlOworCWV4cG9ydHMu
SW50MTZBdHRyaWJ1dGUgPSBJbnQxNkF0dHJpYnV0ZTsKKwlleHBvcnRzLlVpbnQxNkF0dHJpYnV0
ZSA9IFVpbnQxNkF0dHJpYnV0ZTsKKwlleHBvcnRzLkludDMyQXR0cmlidXRlID0gSW50MzJBdHRy
aWJ1dGU7CisJZXhwb3J0cy5VaW50MzJBdHRyaWJ1dGUgPSBVaW50MzJBdHRyaWJ1dGU7CisJZXhw
b3J0cy5GbG9hdDMyQXR0cmlidXRlID0gRmxvYXQzMkF0dHJpYnV0ZTsKKwlleHBvcnRzLkZsb2F0
NjRBdHRyaWJ1dGUgPSBGbG9hdDY0QXR0cmlidXRlOworCWV4cG9ydHMuQ2xvc2VkU3BsaW5lQ3Vy
dmUzID0gQ2xvc2VkU3BsaW5lQ3VydmUzOworCWV4cG9ydHMuU3BsaW5lQ3VydmUzID0gU3BsaW5l
Q3VydmUzOworCWV4cG9ydHMuU3BsaW5lID0gU3BsaW5lOworCWV4cG9ydHMuQm91bmRpbmdCb3hI
ZWxwZXIgPSBCb3VuZGluZ0JveEhlbHBlcjsKKwlleHBvcnRzLkVkZ2VzSGVscGVyID0gRWRnZXNI
ZWxwZXI7CisJZXhwb3J0cy5XaXJlZnJhbWVIZWxwZXIgPSBXaXJlZnJhbWVIZWxwZXI7CisJZXhw
b3J0cy5YSFJMb2FkZXIgPSBYSFJMb2FkZXI7CisJZXhwb3J0cy5CaW5hcnlUZXh0dXJlTG9hZGVy
ID0gQmluYXJ5VGV4dHVyZUxvYWRlcjsKKwlleHBvcnRzLkdlb21ldHJ5VXRpbHMgPSBHZW9tZXRy
eVV0aWxzOworCWV4cG9ydHMuSW1hZ2VVdGlscyA9IEltYWdlVXRpbHM7CisJZXhwb3J0cy5Qcm9q
ZWN0b3IgPSBQcm9qZWN0b3I7CisJZXhwb3J0cy5DYW52YXNSZW5kZXJlciA9IENhbnZhc1JlbmRl
cmVyOworCisJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2
YWx1ZTogdHJ1ZSB9KTsKKworfSkpKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JV
SS9Vc2VySW50ZXJmYWNlL01haW4uaHRtbCBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50
ZXJmYWNlL01haW4uaHRtbAppbmRleCAyYjJmODRhYmJmNjUxZTNlN2I2MzA1OWI4ODY1MGVlZWM2
NWQ1NzMwLi5lMDU4OTQzMTkwZTM4NDkxYzVlZGIwZDk1YThmZjExNzQ2NTk3MDBiIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9NYWluLmh0bWwKKysrIGIv
U291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvTWFpbi5odG1sCkBAIC0yNDIsNiAr
MjQyLDkgQEAKIAogICAgIDxzY3JpcHQgc3JjPSJFeHRlcm5hbC9Fc3ByaW1hL2VzcHJpbWEuanMi
Pjwvc2NyaXB0PgogCisgICAgPHNjcmlwdCBzcmM9IkV4dGVybmFsL1RocmVlL3RocmVlLmpzIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iRXh0ZXJuYWwvVGhyZWUvT3JiaXRDb250cm9scy5q
cyI+PC9zY3JpcHQ+CisKICAgICA8c2NyaXB0IHNyYz0iQmFzZS9XZWJJbnNwZWN0b3IuanMiPjwv
c2NyaXB0PgogICAgIDxzY3JpcHQgc3JjPSJCYXNlL1BsYXRmb3JtLmpzIj48L3NjcmlwdD4KICAg
ICA8c2NyaXB0IHNyYz0iQmFzZS9MaW5rZWRMaXN0LmpzIj48L3NjcmlwdD4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>317855</attachid>
            <date>2017-08-10 14:53:46 -0700</date>
            <delta_ts>2017-08-10 19:21:28 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-174798-20170810145352.patch</filename>
            <type>text/plain</type>
            <size>1110730</size>
            <attacher name="Ross Kirsling">ross.kirsling</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjIwNTM4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVj
dG9yVUkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkluc3BlY3RvclVJL0NoYW5nZUxvZwppbmRleCAx
MTY0YTkwMmZlZjgzNzI0MTBiZGI2N2UzM2E0MTQzZTE2ZWQ2N2UyLi5kZGZkNzExNWViNjE1OGFk
ZjgxZTEzNTZkMzg4NDA3YzUwMjExNjlkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9y
VUkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwxNCBAQAorMjAxNy0wOC0xMCAgUm9zcyBLaXJzbGluZyAgPHJvc3Mua2lyc2xpbmdAc29u
eS5jb20+CisKKyAgICAgICAgV2ViIEluc3BlY3RvcjogQWRkIHRocmVlLmpzIGluIHByZXBhcmF0
aW9uIGZvciBsYXllciB2aXN1YWxpemF0aW9uLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc0Nzk4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL0V4dGVybmFsL3RocmVlLmpzL0xJ
Q0VOU0U6IEFkZGVkLgorICAgICAgICAqIFVzZXJJbnRlcmZhY2UvRXh0ZXJuYWwvdGhyZWUuanMv
T3JiaXRDb250cm9scy5qczogQWRkZWQuCisgICAgICAgICogVXNlckludGVyZmFjZS9FeHRlcm5h
bC90aHJlZS5qcy90aHJlZS5qczogQWRkZWQuCisKIDIwMTctMDgtMDkgIE5pa2l0YSBWYXNpbHll
diAgPG52YXNpbHlldkBhcHBsZS5jb20+CiAKICAgICAgICAgV2ViIEluc3BlY3RvcjogU3R5bGVz
OiBBZGQgcHJlLXBvcHVsYXRlZCBkYXRhIHRvIHNwcmVhZHNoZWV0LXN0eWxlIHZpZXcKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0V4dGVybmFsL3RocmVl
LmpzL0xJQ0VOU0UgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9FeHRlcm5h
bC90aHJlZS5qcy9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjU2MDQ5MDE0MGViNTJlYmYyZDlhNGQyNjA0
OTUxMjRkMjc2MDhiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkv
VXNlckludGVyZmFjZS9FeHRlcm5hbC90aHJlZS5qcy9MSUNFTlNFCkBAIC0wLDAgKzEsMjEgQEAK
K1RoZSBNSVQgTGljZW5zZQorCitDb3B5cmlnaHQgwqkgMjAxMC0yMDE3IHRocmVlLmpzIGF1dGhv
cnMKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFu
eSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRl
ZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBT
b2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9u
IHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJp
YnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFu
ZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRv
IGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3Zl
IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5j
bHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3
YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5U
WSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElN
SVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xB
SU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0Yg
Q09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4g
Q09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdT
IElOCitUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNl
ckludGVyZmFjZS9FeHRlcm5hbC90aHJlZS5qcy9PcmJpdENvbnRyb2xzLmpzIGIvU291cmNlL1dl
Ykluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvRXh0ZXJuYWwvdGhyZWUuanMvT3JiaXRDb250cm9s
cy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi4xNTFmMGM4MGM2YTcxYzJjNzA1Y2UxYzUyNWNmNjYyM2U4MDgyNjRm
Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2Uv
RXh0ZXJuYWwvdGhyZWUuanMvT3JiaXRDb250cm9scy5qcwpAQCAtMCwwICsxLDEwNDIgQEAKKy8q
KgorICogQGF1dGhvciBxaWFvIC8gaHR0cHM6Ly9naXRodWIuY29tL3FpYW8KKyAqIEBhdXRob3Ig
bXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20KKyAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8v
YWx0ZXJlZHF1YWxpYS5jb20vCisgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1
Yi5jb20vV2VzdExhbmdsZXkKKyAqIEBhdXRob3IgZXJpY2g2NjYgLyBodHRwOi8vZXJpY2hhaW5l
cy5jb20KKyAqLworCisvLyBUaGlzIHNldCBvZiBjb250cm9scyBwZXJmb3JtcyBvcmJpdGluZywg
ZG9sbHlpbmcgKHpvb21pbmcpLCBhbmQgcGFubmluZy4KKy8vIFVubGlrZSBUcmFja2JhbGxDb250
cm9scywgaXQgbWFpbnRhaW5zIHRoZSAidXAiIGRpcmVjdGlvbiBvYmplY3QudXAgKCtZIGJ5IGRl
ZmF1bHQpLgorLy8KKy8vICAgIE9yYml0IC0gbGVmdCBtb3VzZSAvIHRvdWNoOiBvbmUgZmluZ2Vy
IG1vdmUKKy8vICAgIFpvb20gLSBtaWRkbGUgbW91c2UsIG9yIG1vdXNld2hlZWwgLyB0b3VjaDog
dHdvIGZpbmdlciBzcHJlYWQgb3Igc3F1aXNoCisvLyAgICBQYW4gLSByaWdodCBtb3VzZSwgb3Ig
YXJyb3cga2V5cyAvIHRvdWNoOiB0aHJlZSBmaW5nZXIgc3dpcGUKKworVEhSRUUuT3JiaXRDb250
cm9scyA9IGZ1bmN0aW9uICggb2JqZWN0LCBkb21FbGVtZW50ICkgeworCisJdGhpcy5vYmplY3Qg
PSBvYmplY3Q7CisKKwl0aGlzLmRvbUVsZW1lbnQgPSAoIGRvbUVsZW1lbnQgIT09IHVuZGVmaW5l
ZCApID8gZG9tRWxlbWVudCA6IGRvY3VtZW50OworCisJLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2Fi
bGUgdGhpcyBjb250cm9sCisJdGhpcy5lbmFibGVkID0gdHJ1ZTsKKworCS8vICJ0YXJnZXQiIHNl
dHMgdGhlIGxvY2F0aW9uIG9mIGZvY3VzLCB3aGVyZSB0aGUgb2JqZWN0IG9yYml0cyBhcm91bmQK
Kwl0aGlzLnRhcmdldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7CisKKwkvLyBIb3cgZmFyIHlvdSBj
YW4gZG9sbHkgaW4gYW5kIG91dCAoIFBlcnNwZWN0aXZlQ2FtZXJhIG9ubHkgKQorCXRoaXMubWlu
RGlzdGFuY2UgPSAwOworCXRoaXMubWF4RGlzdGFuY2UgPSBJbmZpbml0eTsKKworCS8vIEhvdyBm
YXIgeW91IGNhbiB6b29tIGluIGFuZCBvdXQgKCBPcnRob2dyYXBoaWNDYW1lcmEgb25seSApCisJ
dGhpcy5taW5ab29tID0gMDsKKwl0aGlzLm1heFpvb20gPSBJbmZpbml0eTsKKworCS8vIEhvdyBm
YXIgeW91IGNhbiBvcmJpdCB2ZXJ0aWNhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLgorCS8v
IFJhbmdlIGlzIDAgdG8gTWF0aC5QSSByYWRpYW5zLgorCXRoaXMubWluUG9sYXJBbmdsZSA9IDA7
IC8vIHJhZGlhbnMKKwl0aGlzLm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJOyAvLyByYWRpYW5zCisK
KwkvLyBIb3cgZmFyIHlvdSBjYW4gb3JiaXQgaG9yaXpvbnRhbGx5LCB1cHBlciBhbmQgbG93ZXIg
bGltaXRzLgorCS8vIElmIHNldCwgbXVzdCBiZSBhIHN1Yi1pbnRlcnZhbCBvZiB0aGUgaW50ZXJ2
YWwgWyAtIE1hdGguUEksIE1hdGguUEkgXS4KKwl0aGlzLm1pbkF6aW11dGhBbmdsZSA9IC0gSW5m
aW5pdHk7IC8vIHJhZGlhbnMKKwl0aGlzLm1heEF6aW11dGhBbmdsZSA9IEluZmluaXR5OyAvLyBy
YWRpYW5zCisKKwkvLyBTZXQgdG8gdHJ1ZSB0byBlbmFibGUgZGFtcGluZyAoaW5lcnRpYSkKKwkv
LyBJZiBkYW1waW5nIGlzIGVuYWJsZWQsIHlvdSBtdXN0IGNhbGwgY29udHJvbHMudXBkYXRlKCkg
aW4geW91ciBhbmltYXRpb24gbG9vcAorCXRoaXMuZW5hYmxlRGFtcGluZyA9IGZhbHNlOworCXRo
aXMuZGFtcGluZ0ZhY3RvciA9IDAuMjU7CisKKwkvLyBUaGlzIG9wdGlvbiBhY3R1YWxseSBlbmFi
bGVzIGRvbGx5aW5nIGluIGFuZCBvdXQ7IGxlZnQgYXMgInpvb20iIGZvciBiYWNrd2FyZHMgY29t
cGF0aWJpbGl0eS4KKwkvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB6b29taW5nCisJdGhpcy5l
bmFibGVab29tID0gdHJ1ZTsKKwl0aGlzLnpvb21TcGVlZCA9IDEuMDsKKworCS8vIFNldCB0byBm
YWxzZSB0byBkaXNhYmxlIHJvdGF0aW5nCisJdGhpcy5lbmFibGVSb3RhdGUgPSB0cnVlOworCXRo
aXMucm90YXRlU3BlZWQgPSAxLjA7CisKKwkvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBwYW5u
aW5nCisJdGhpcy5lbmFibGVQYW4gPSB0cnVlOworCXRoaXMua2V5UGFuU3BlZWQgPSA3LjA7CS8v
IHBpeGVscyBtb3ZlZCBwZXIgYXJyb3cga2V5IHB1c2gKKworCS8vIFNldCB0byB0cnVlIHRvIGF1
dG9tYXRpY2FsbHkgcm90YXRlIGFyb3VuZCB0aGUgdGFyZ2V0CisJLy8gSWYgYXV0by1yb3RhdGUg
aXMgZW5hYmxlZCwgeW91IG11c3QgY2FsbCBjb250cm9scy51cGRhdGUoKSBpbiB5b3VyIGFuaW1h
dGlvbiBsb29wCisJdGhpcy5hdXRvUm90YXRlID0gZmFsc2U7CisJdGhpcy5hdXRvUm90YXRlU3Bl
ZWQgPSAyLjA7IC8vIDMwIHNlY29uZHMgcGVyIHJvdW5kIHdoZW4gZnBzIGlzIDYwCisKKwkvLyBT
ZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB1c2Ugb2YgdGhlIGtleXMKKwl0aGlzLmVuYWJsZUtleXMg
PSB0cnVlOworCisJLy8gVGhlIGZvdXIgYXJyb3cga2V5cworCXRoaXMua2V5cyA9IHsgTEVGVDog
MzcsIFVQOiAzOCwgUklHSFQ6IDM5LCBCT1RUT006IDQwIH07CisKKwkvLyBNb3VzZSBidXR0b25z
CisJdGhpcy5tb3VzZUJ1dHRvbnMgPSB7IE9SQklUOiBUSFJFRS5NT1VTRS5MRUZULCBaT09NOiBU
SFJFRS5NT1VTRS5NSURETEUsIFBBTjogVEhSRUUuTU9VU0UuUklHSFQgfTsKKworCS8vIGZvciBy
ZXNldAorCXRoaXMudGFyZ2V0MCA9IHRoaXMudGFyZ2V0LmNsb25lKCk7CisJdGhpcy5wb3NpdGlv
bjAgPSB0aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpOworCXRoaXMuem9vbTAgPSB0aGlzLm9i
amVjdC56b29tOworCisJLy8KKwkvLyBwdWJsaWMgbWV0aG9kcworCS8vCisKKwl0aGlzLmdldFBv
bGFyQW5nbGUgPSBmdW5jdGlvbiAoKSB7CisKKwkJcmV0dXJuIHNwaGVyaWNhbC5waGk7CisKKwl9
OworCisJdGhpcy5nZXRBemltdXRoYWxBbmdsZSA9IGZ1bmN0aW9uICgpIHsKKworCQlyZXR1cm4g
c3BoZXJpY2FsLnRoZXRhOworCisJfTsKKworCXRoaXMuc2F2ZVN0YXRlID0gZnVuY3Rpb24gKCkg
eworCisJCXNjb3BlLnRhcmdldDAuY29weSggc2NvcGUudGFyZ2V0ICk7CisJCXNjb3BlLnBvc2l0
aW9uMC5jb3B5KCBzY29wZS5vYmplY3QucG9zaXRpb24gKTsKKwkJc2NvcGUuem9vbTAgPSBzY29w
ZS5vYmplY3Quem9vbTsKKworCX07CisKKwl0aGlzLnJlc2V0ID0gZnVuY3Rpb24gKCkgeworCisJ
CXNjb3BlLnRhcmdldC5jb3B5KCBzY29wZS50YXJnZXQwICk7CisJCXNjb3BlLm9iamVjdC5wb3Np
dGlvbi5jb3B5KCBzY29wZS5wb3NpdGlvbjAgKTsKKwkJc2NvcGUub2JqZWN0Lnpvb20gPSBzY29w
ZS56b29tMDsKKworCQlzY29wZS5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOworCQlz
Y29wZS5kaXNwYXRjaEV2ZW50KCBjaGFuZ2VFdmVudCApOworCisJCXNjb3BlLnVwZGF0ZSgpOwor
CisJCXN0YXRlID0gU1RBVEUuTk9ORTsKKworCX07CisKKwkvLyB0aGlzIG1ldGhvZCBpcyBleHBv
c2VkLCBidXQgcGVyaGFwcyBpdCB3b3VsZCBiZSBiZXR0ZXIgaWYgd2UgY2FuIG1ha2UgaXQgcHJp
dmF0ZS4uLgorCXRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCkgeworCisJCXZhciBvZmZzZXQgPSBu
ZXcgVEhSRUUuVmVjdG9yMygpOworCisJCS8vIHNvIGNhbWVyYS51cCBpcyB0aGUgb3JiaXQgYXhp
cworCQl2YXIgcXVhdCA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkuc2V0RnJvbVVuaXRWZWN0b3Jz
KCBvYmplY3QudXAsIG5ldyBUSFJFRS5WZWN0b3IzKCAwLCAxLCAwICkgKTsKKwkJdmFyIHF1YXRJ
bnZlcnNlID0gcXVhdC5jbG9uZSgpLmludmVyc2UoKTsKKworCQl2YXIgbGFzdFBvc2l0aW9uID0g
bmV3IFRIUkVFLlZlY3RvcjMoKTsKKwkJdmFyIGxhc3RRdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1
YXRlcm5pb24oKTsKKworCQlyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkgeworCisJCQl2YXIgcG9z
aXRpb24gPSBzY29wZS5vYmplY3QucG9zaXRpb247CisKKwkJCW9mZnNldC5jb3B5KCBwb3NpdGlv
biApLnN1Yiggc2NvcGUudGFyZ2V0ICk7CisKKwkJCS8vIHJvdGF0ZSBvZmZzZXQgdG8gInktYXhp
cy1pcy11cCIgc3BhY2UKKwkJCW9mZnNldC5hcHBseVF1YXRlcm5pb24oIHF1YXQgKTsKKworCQkJ
Ly8gYW5nbGUgZnJvbSB6LWF4aXMgYXJvdW5kIHktYXhpcworCQkJc3BoZXJpY2FsLnNldEZyb21W
ZWN0b3IzKCBvZmZzZXQgKTsKKworCQkJaWYgKCBzY29wZS5hdXRvUm90YXRlICYmIHN0YXRlID09
PSBTVEFURS5OT05FICkgeworCisJCQkJcm90YXRlTGVmdCggZ2V0QXV0b1JvdGF0aW9uQW5nbGUo
KSApOworCisJCQl9CisKKwkJCXNwaGVyaWNhbC50aGV0YSArPSBzcGhlcmljYWxEZWx0YS50aGV0
YTsKKwkJCXNwaGVyaWNhbC5waGkgKz0gc3BoZXJpY2FsRGVsdGEucGhpOworCisJCQkvLyByZXN0
cmljdCB0aGV0YSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzCisJCQlzcGhlcmljYWwudGhl
dGEgPSBNYXRoLm1heCggc2NvcGUubWluQXppbXV0aEFuZ2xlLCBNYXRoLm1pbiggc2NvcGUubWF4
QXppbXV0aEFuZ2xlLCBzcGhlcmljYWwudGhldGEgKSApOworCisJCQkvLyByZXN0cmljdCBwaGkg
dG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0cworCQkJc3BoZXJpY2FsLnBoaSA9IE1hdGgubWF4
KCBzY29wZS5taW5Qb2xhckFuZ2xlLCBNYXRoLm1pbiggc2NvcGUubWF4UG9sYXJBbmdsZSwgc3Bo
ZXJpY2FsLnBoaSApICk7CisKKwkJCXNwaGVyaWNhbC5tYWtlU2FmZSgpOworCisKKwkJCXNwaGVy
aWNhbC5yYWRpdXMgKj0gc2NhbGU7CisKKwkJCS8vIHJlc3RyaWN0IHJhZGl1cyB0byBiZSBiZXR3
ZWVuIGRlc2lyZWQgbGltaXRzCisJCQlzcGhlcmljYWwucmFkaXVzID0gTWF0aC5tYXgoIHNjb3Bl
Lm1pbkRpc3RhbmNlLCBNYXRoLm1pbiggc2NvcGUubWF4RGlzdGFuY2UsIHNwaGVyaWNhbC5yYWRp
dXMgKSApOworCisJCQkvLyBtb3ZlIHRhcmdldCB0byBwYW5uZWQgbG9jYXRpb24KKwkJCXNjb3Bl
LnRhcmdldC5hZGQoIHBhbk9mZnNldCApOworCisJCQlvZmZzZXQuc2V0RnJvbVNwaGVyaWNhbCgg
c3BoZXJpY2FsICk7CisKKwkJCS8vIHJvdGF0ZSBvZmZzZXQgYmFjayB0byAiY2FtZXJhLXVwLXZl
Y3Rvci1pcy11cCIgc3BhY2UKKwkJCW9mZnNldC5hcHBseVF1YXRlcm5pb24oIHF1YXRJbnZlcnNl
ICk7CisKKwkJCXBvc2l0aW9uLmNvcHkoIHNjb3BlLnRhcmdldCApLmFkZCggb2Zmc2V0ICk7CisK
KwkJCXNjb3BlLm9iamVjdC5sb29rQXQoIHNjb3BlLnRhcmdldCApOworCisJCQlpZiAoIHNjb3Bl
LmVuYWJsZURhbXBpbmcgPT09IHRydWUgKSB7CisKKwkJCQlzcGhlcmljYWxEZWx0YS50aGV0YSAq
PSAoIDEgLSBzY29wZS5kYW1waW5nRmFjdG9yICk7CisJCQkJc3BoZXJpY2FsRGVsdGEucGhpICo9
ICggMSAtIHNjb3BlLmRhbXBpbmdGYWN0b3IgKTsKKworCQkJfSBlbHNlIHsKKworCQkJCXNwaGVy
aWNhbERlbHRhLnNldCggMCwgMCwgMCApOworCisJCQl9CisKKwkJCXNjYWxlID0gMTsKKwkJCXBh
bk9mZnNldC5zZXQoIDAsIDAsIDAgKTsKKworCQkJLy8gdXBkYXRlIGNvbmRpdGlvbiBpczoKKwkJ
CS8vIG1pbihjYW1lcmEgZGlzcGxhY2VtZW50LCBjYW1lcmEgcm90YXRpb24gaW4gcmFkaWFucyle
MiA+IEVQUworCQkJLy8gdXNpbmcgc21hbGwtYW5nbGUgYXBwcm94aW1hdGlvbiBjb3MoeC8yKSA9
IDEgLSB4XjIgLyA4CisKKwkJCWlmICggem9vbUNoYW5nZWQgfHwKKwkJCQlsYXN0UG9zaXRpb24u
ZGlzdGFuY2VUb1NxdWFyZWQoIHNjb3BlLm9iamVjdC5wb3NpdGlvbiApID4gRVBTIHx8CisJCQkJ
OCAqICggMSAtIGxhc3RRdWF0ZXJuaW9uLmRvdCggc2NvcGUub2JqZWN0LnF1YXRlcm5pb24gKSAp
ID4gRVBTICkgeworCisJCQkJc2NvcGUuZGlzcGF0Y2hFdmVudCggY2hhbmdlRXZlbnQgKTsKKwor
CQkJCWxhc3RQb3NpdGlvbi5jb3B5KCBzY29wZS5vYmplY3QucG9zaXRpb24gKTsKKwkJCQlsYXN0
UXVhdGVybmlvbi5jb3B5KCBzY29wZS5vYmplY3QucXVhdGVybmlvbiApOworCQkJCXpvb21DaGFu
Z2VkID0gZmFsc2U7CisKKwkJCQlyZXR1cm4gdHJ1ZTsKKworCQkJfQorCisJCQlyZXR1cm4gZmFs
c2U7CisKKwkJfTsKKworCX0oKTsKKworCXRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsKKwor
CQlzY29wZS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdjb250ZXh0bWVudScsIG9u
Q29udGV4dE1lbnUsIGZhbHNlICk7CisJCXNjb3BlLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0
ZW5lciggJ21vdXNlZG93bicsIG9uTW91c2VEb3duLCBmYWxzZSApOworCQlzY29wZS5kb21FbGVt
ZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3aGVlbCcsIG9uTW91c2VXaGVlbCwgZmFsc2UgKTsK
KworCQlzY29wZS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd0b3VjaHN0YXJ0Jywg
b25Ub3VjaFN0YXJ0LCBmYWxzZSApOworCQlzY29wZS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlz
dGVuZXIoICd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIGZhbHNlICk7CisJCXNjb3BlLmRvbUVsZW1l
bnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCBmYWxzZSAp
OworCisJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZW1vdmUnLCBvbk1vdXNl
TW92ZSwgZmFsc2UgKTsKKwkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNldXAn
LCBvbk1vdXNlVXAsIGZhbHNlICk7CisKKwkJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdr
ZXlkb3duJywgb25LZXlEb3duLCBmYWxzZSApOworCisJCS8vc2NvcGUuZGlzcGF0Y2hFdmVudCgg
eyB0eXBlOiAnZGlzcG9zZScgfSApOyAvLyBzaG91bGQgdGhpcyBiZSBhZGRlZCBoZXJlPworCisJ
fTsKKworCS8vCisJLy8gaW50ZXJuYWxzCisJLy8KKworCXZhciBzY29wZSA9IHRoaXM7CisKKwl2
YXIgY2hhbmdlRXZlbnQgPSB7IHR5cGU6ICdjaGFuZ2UnIH07CisJdmFyIHN0YXJ0RXZlbnQgPSB7
IHR5cGU6ICdzdGFydCcgfTsKKwl2YXIgZW5kRXZlbnQgPSB7IHR5cGU6ICdlbmQnIH07CisKKwl2
YXIgU1RBVEUgPSB7IE5PTkU6IC0gMSwgUk9UQVRFOiAwLCBET0xMWTogMSwgUEFOOiAyLCBUT1VD
SF9ST1RBVEU6IDMsIFRPVUNIX0RPTExZOiA0LCBUT1VDSF9QQU46IDUgfTsKKworCXZhciBzdGF0
ZSA9IFNUQVRFLk5PTkU7CisKKwl2YXIgRVBTID0gMC4wMDAwMDE7CisKKwkvLyBjdXJyZW50IHBv
c2l0aW9uIGluIHNwaGVyaWNhbCBjb29yZGluYXRlcworCXZhciBzcGhlcmljYWwgPSBuZXcgVEhS
RUUuU3BoZXJpY2FsKCk7CisJdmFyIHNwaGVyaWNhbERlbHRhID0gbmV3IFRIUkVFLlNwaGVyaWNh
bCgpOworCisJdmFyIHNjYWxlID0gMTsKKwl2YXIgcGFuT2Zmc2V0ID0gbmV3IFRIUkVFLlZlY3Rv
cjMoKTsKKwl2YXIgem9vbUNoYW5nZWQgPSBmYWxzZTsKKworCXZhciByb3RhdGVTdGFydCA9IG5l
dyBUSFJFRS5WZWN0b3IyKCk7CisJdmFyIHJvdGF0ZUVuZCA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7
CisJdmFyIHJvdGF0ZURlbHRhID0gbmV3IFRIUkVFLlZlY3RvcjIoKTsKKworCXZhciBwYW5TdGFy
dCA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7CisJdmFyIHBhbkVuZCA9IG5ldyBUSFJFRS5WZWN0b3Iy
KCk7CisJdmFyIHBhbkRlbHRhID0gbmV3IFRIUkVFLlZlY3RvcjIoKTsKKworCXZhciBkb2xseVN0
YXJ0ID0gbmV3IFRIUkVFLlZlY3RvcjIoKTsKKwl2YXIgZG9sbHlFbmQgPSBuZXcgVEhSRUUuVmVj
dG9yMigpOworCXZhciBkb2xseURlbHRhID0gbmV3IFRIUkVFLlZlY3RvcjIoKTsKKworCWZ1bmN0
aW9uIGdldEF1dG9Sb3RhdGlvbkFuZ2xlKCkgeworCisJCXJldHVybiAyICogTWF0aC5QSSAvIDYw
IC8gNjAgKiBzY29wZS5hdXRvUm90YXRlU3BlZWQ7CisKKwl9CisKKwlmdW5jdGlvbiBnZXRab29t
U2NhbGUoKSB7CisKKwkJcmV0dXJuIE1hdGgucG93KCAwLjk1LCBzY29wZS56b29tU3BlZWQgKTsK
KworCX0KKworCWZ1bmN0aW9uIHJvdGF0ZUxlZnQoIGFuZ2xlICkgeworCisJCXNwaGVyaWNhbERl
bHRhLnRoZXRhIC09IGFuZ2xlOworCisJfQorCisJZnVuY3Rpb24gcm90YXRlVXAoIGFuZ2xlICkg
eworCisJCXNwaGVyaWNhbERlbHRhLnBoaSAtPSBhbmdsZTsKKworCX0KKworCXZhciBwYW5MZWZ0
ID0gZnVuY3Rpb24gKCkgeworCisJCXZhciB2ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTsKKworCQly
ZXR1cm4gZnVuY3Rpb24gcGFuTGVmdCggZGlzdGFuY2UsIG9iamVjdE1hdHJpeCApIHsKKworCQkJ
di5zZXRGcm9tTWF0cml4Q29sdW1uKCBvYmplY3RNYXRyaXgsIDAgKTsgLy8gZ2V0IFggY29sdW1u
IG9mIG9iamVjdE1hdHJpeAorCQkJdi5tdWx0aXBseVNjYWxhciggLSBkaXN0YW5jZSApOworCisJ
CQlwYW5PZmZzZXQuYWRkKCB2ICk7CisKKwkJfTsKKworCX0oKTsKKworCXZhciBwYW5VcCA9IGZ1
bmN0aW9uICgpIHsKKworCQl2YXIgdiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7CisKKwkJcmV0dXJu
IGZ1bmN0aW9uIHBhblVwKCBkaXN0YW5jZSwgb2JqZWN0TWF0cml4ICkgeworCisJCQl2LnNldEZy
b21NYXRyaXhDb2x1bW4oIG9iamVjdE1hdHJpeCwgMSApOyAvLyBnZXQgWSBjb2x1bW4gb2Ygb2Jq
ZWN0TWF0cml4CisJCQl2Lm11bHRpcGx5U2NhbGFyKCBkaXN0YW5jZSApOworCisJCQlwYW5PZmZz
ZXQuYWRkKCB2ICk7CisKKwkJfTsKKworCX0oKTsKKworCS8vIGRlbHRhWCBhbmQgZGVsdGFZIGFy
ZSBpbiBwaXhlbHM7IHJpZ2h0IGFuZCBkb3duIGFyZSBwb3NpdGl2ZQorCXZhciBwYW4gPSBmdW5j
dGlvbiAoKSB7CisKKwkJdmFyIG9mZnNldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7CisKKwkJcmV0
dXJuIGZ1bmN0aW9uIHBhbiggZGVsdGFYLCBkZWx0YVkgKSB7CisKKwkJCXZhciBlbGVtZW50ID0g
c2NvcGUuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyBzY29wZS5kb21FbGVtZW50LmJvZHkgOiBz
Y29wZS5kb21FbGVtZW50OworCisJCQlpZiAoIHNjb3BlLm9iamVjdCBpbnN0YW5jZW9mIFRIUkVF
LlBlcnNwZWN0aXZlQ2FtZXJhICkgeworCisJCQkJLy8gcGVyc3BlY3RpdmUKKwkJCQl2YXIgcG9z
aXRpb24gPSBzY29wZS5vYmplY3QucG9zaXRpb247CisJCQkJb2Zmc2V0LmNvcHkoIHBvc2l0aW9u
ICkuc3ViKCBzY29wZS50YXJnZXQgKTsKKwkJCQl2YXIgdGFyZ2V0RGlzdGFuY2UgPSBvZmZzZXQu
bGVuZ3RoKCk7CisKKwkJCQkvLyBoYWxmIG9mIHRoZSBmb3YgaXMgY2VudGVyIHRvIHRvcCBvZiBz
Y3JlZW4KKwkJCQl0YXJnZXREaXN0YW5jZSAqPSBNYXRoLnRhbiggKCBzY29wZS5vYmplY3QuZm92
IC8gMiApICogTWF0aC5QSSAvIDE4MC4wICk7CisKKwkJCQkvLyB3ZSBhY3R1YWxseSBkb24ndCB1
c2Ugc2NyZWVuV2lkdGgsIHNpbmNlIHBlcnNwZWN0aXZlIGNhbWVyYSBpcyBmaXhlZCB0byBzY3Jl
ZW4gaGVpZ2h0CisJCQkJcGFuTGVmdCggMiAqIGRlbHRhWCAqIHRhcmdldERpc3RhbmNlIC8gZWxl
bWVudC5jbGllbnRIZWlnaHQsIHNjb3BlLm9iamVjdC5tYXRyaXggKTsKKwkJCQlwYW5VcCggMiAq
IGRlbHRhWSAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHNjb3BlLm9i
amVjdC5tYXRyaXggKTsKKworCQkJfSBlbHNlIGlmICggc2NvcGUub2JqZWN0IGluc3RhbmNlb2Yg
VEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhICkgeworCisJCQkJLy8gb3J0aG9ncmFwaGljCisJCQkJ
cGFuTGVmdCggZGVsdGFYICogKCBzY29wZS5vYmplY3QucmlnaHQgLSBzY29wZS5vYmplY3QubGVm
dCApIC8gc2NvcGUub2JqZWN0Lnpvb20gLyBlbGVtZW50LmNsaWVudFdpZHRoLCBzY29wZS5vYmpl
Y3QubWF0cml4ICk7CisJCQkJcGFuVXAoIGRlbHRhWSAqICggc2NvcGUub2JqZWN0LnRvcCAtIHNj
b3BlLm9iamVjdC5ib3R0b20gKSAvIHNjb3BlLm9iamVjdC56b29tIC8gZWxlbWVudC5jbGllbnRI
ZWlnaHQsIHNjb3BlLm9iamVjdC5tYXRyaXggKTsKKworCQkJfSBlbHNlIHsKKworCQkJCS8vIGNh
bWVyYSBuZWl0aGVyIG9ydGhvZ3JhcGhpYyBub3IgcGVyc3BlY3RpdmUKKwkJCQljb25zb2xlLndh
cm4oICdXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2Ft
ZXJhIHR5cGUgLSBwYW4gZGlzYWJsZWQuJyApOworCQkJCXNjb3BlLmVuYWJsZVBhbiA9IGZhbHNl
OworCisJCQl9CisKKwkJfTsKKworCX0oKTsKKworCWZ1bmN0aW9uIGRvbGx5SW4oIGRvbGx5U2Nh
bGUgKSB7CisKKwkJaWYgKCBzY29wZS5vYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5QZXJzcGVjdGl2
ZUNhbWVyYSApIHsKKworCQkJc2NhbGUgLz0gZG9sbHlTY2FsZTsKKworCQl9IGVsc2UgaWYgKCBz
Y29wZS5vYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEgKSB7CisKKwkJ
CXNjb3BlLm9iamVjdC56b29tID0gTWF0aC5tYXgoIHNjb3BlLm1pblpvb20sIE1hdGgubWluKCBz
Y29wZS5tYXhab29tLCBzY29wZS5vYmplY3Quem9vbSAqIGRvbGx5U2NhbGUgKSApOworCQkJc2Nv
cGUub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKKwkJCXpvb21DaGFuZ2VkID0gdHJ1
ZTsKKworCQl9IGVsc2UgeworCisJCQljb25zb2xlLndhcm4oICdXQVJOSU5HOiBPcmJpdENvbnRy
b2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRp
c2FibGVkLicgKTsKKwkJCXNjb3BlLmVuYWJsZVpvb20gPSBmYWxzZTsKKworCQl9CisKKwl9CisK
KwlmdW5jdGlvbiBkb2xseU91dCggZG9sbHlTY2FsZSApIHsKKworCQlpZiAoIHNjb3BlLm9iamVj
dCBpbnN0YW5jZW9mIFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhICkgeworCisJCQlzY2FsZSAqPSBk
b2xseVNjYWxlOworCisJCX0gZWxzZSBpZiAoIHNjb3BlLm9iamVjdCBpbnN0YW5jZW9mIFRIUkVF
Lk9ydGhvZ3JhcGhpY0NhbWVyYSApIHsKKworCQkJc2NvcGUub2JqZWN0Lnpvb20gPSBNYXRoLm1h
eCggc2NvcGUubWluWm9vbSwgTWF0aC5taW4oIHNjb3BlLm1heFpvb20sIHNjb3BlLm9iamVjdC56
b29tIC8gZG9sbHlTY2FsZSApICk7CisJCQlzY29wZS5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1h
dHJpeCgpOworCQkJem9vbUNoYW5nZWQgPSB0cnVlOworCisJCX0gZWxzZSB7CisKKwkJCWNvbnNv
bGUud2FybiggJ1dBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93
biBjYW1lcmEgdHlwZSAtIGRvbGx5L3pvb20gZGlzYWJsZWQuJyApOworCQkJc2NvcGUuZW5hYmxl
Wm9vbSA9IGZhbHNlOworCisJCX0KKworCX0KKworCS8vCisJLy8gZXZlbnQgY2FsbGJhY2tzIC0g
dXBkYXRlIHRoZSBvYmplY3Qgc3RhdGUKKwkvLworCisJZnVuY3Rpb24gaGFuZGxlTW91c2VEb3du
Um90YXRlKCBldmVudCApIHsKKworCQkvL2NvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VEb3duUm90
YXRlJyApOworCisJCXJvdGF0ZVN0YXJ0LnNldCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50
WSApOworCisJfQorCisJZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duRG9sbHkoIGV2ZW50ICkgewor
CisJCS8vY29uc29sZS5sb2coICdoYW5kbGVNb3VzZURvd25Eb2xseScgKTsKKworCQlkb2xseVN0
YXJ0LnNldCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSApOworCisJfQorCisJZnVuY3Rp
b24gaGFuZGxlTW91c2VEb3duUGFuKCBldmVudCApIHsKKworCQkvL2NvbnNvbGUubG9nKCAnaGFu
ZGxlTW91c2VEb3duUGFuJyApOworCisJCXBhblN0YXJ0LnNldCggZXZlbnQuY2xpZW50WCwgZXZl
bnQuY2xpZW50WSApOworCisJfQorCisJZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlUm90YXRlKCBl
dmVudCApIHsKKworCQkvL2NvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VNb3ZlUm90YXRlJyApOwor
CisJCXJvdGF0ZUVuZC5zZXQoIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkgKTsKKwkJcm90
YXRlRGVsdGEuc3ViVmVjdG9ycyggcm90YXRlRW5kLCByb3RhdGVTdGFydCApOworCisJCXZhciBl
bGVtZW50ID0gc2NvcGUuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyBzY29wZS5kb21FbGVtZW50
LmJvZHkgOiBzY29wZS5kb21FbGVtZW50OworCisJCS8vIHJvdGF0aW5nIGFjcm9zcyB3aG9sZSBz
Y3JlZW4gZ29lcyAzNjAgZGVncmVlcyBhcm91bmQKKwkJcm90YXRlTGVmdCggMiAqIE1hdGguUEkg
KiByb3RhdGVEZWx0YS54IC8gZWxlbWVudC5jbGllbnRXaWR0aCAqIHNjb3BlLnJvdGF0ZVNwZWVk
ICk7CisKKwkJLy8gcm90YXRpbmcgdXAgYW5kIGRvd24gYWxvbmcgd2hvbGUgc2NyZWVuIGF0dGVt
cHRzIHRvIGdvIDM2MCwgYnV0IGxpbWl0ZWQgdG8gMTgwCisJCXJvdGF0ZVVwKCAyICogTWF0aC5Q
SSAqIHJvdGF0ZURlbHRhLnkgLyBlbGVtZW50LmNsaWVudEhlaWdodCAqIHNjb3BlLnJvdGF0ZVNw
ZWVkICk7CisKKwkJcm90YXRlU3RhcnQuY29weSggcm90YXRlRW5kICk7CisKKwkJc2NvcGUudXBk
YXRlKCk7CisKKwl9CisKKwlmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmVEb2xseSggZXZlbnQgKSB7
CisKKwkJLy9jb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZURvbGx5JyApOworCisJCWRvbGx5
RW5kLnNldCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSApOworCisJCWRvbGx5RGVsdGEu
c3ViVmVjdG9ycyggZG9sbHlFbmQsIGRvbGx5U3RhcnQgKTsKKworCQlpZiAoIGRvbGx5RGVsdGEu
eSA+IDAgKSB7CisKKwkJCWRvbGx5SW4oIGdldFpvb21TY2FsZSgpICk7CisKKwkJfSBlbHNlIGlm
ICggZG9sbHlEZWx0YS55IDwgMCApIHsKKworCQkJZG9sbHlPdXQoIGdldFpvb21TY2FsZSgpICk7
CisKKwkJfQorCisJCWRvbGx5U3RhcnQuY29weSggZG9sbHlFbmQgKTsKKworCQlzY29wZS51cGRh
dGUoKTsKKworCX0KKworCWZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZVBhbiggZXZlbnQgKSB7CisK
KwkJLy9jb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZVBhbicgKTsKKworCQlwYW5FbmQuc2V0
KCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZICk7CisKKwkJcGFuRGVsdGEuc3ViVmVjdG9y
cyggcGFuRW5kLCBwYW5TdGFydCApOworCisJCXBhbiggcGFuRGVsdGEueCwgcGFuRGVsdGEueSAp
OworCisJCXBhblN0YXJ0LmNvcHkoIHBhbkVuZCApOworCisJCXNjb3BlLnVwZGF0ZSgpOworCisJ
fQorCisJZnVuY3Rpb24gaGFuZGxlTW91c2VVcCggZXZlbnQgKSB7CisKKwkJLy8gY29uc29sZS5s
b2coICdoYW5kbGVNb3VzZVVwJyApOworCisJfQorCisJZnVuY3Rpb24gaGFuZGxlTW91c2VXaGVl
bCggZXZlbnQgKSB7CisKKwkJLy8gY29uc29sZS5sb2coICdoYW5kbGVNb3VzZVdoZWVsJyApOwor
CisJCWlmICggZXZlbnQuZGVsdGFZIDwgMCApIHsKKworCQkJZG9sbHlPdXQoIGdldFpvb21TY2Fs
ZSgpICk7CisKKwkJfSBlbHNlIGlmICggZXZlbnQuZGVsdGFZID4gMCApIHsKKworCQkJZG9sbHlJ
biggZ2V0Wm9vbVNjYWxlKCkgKTsKKworCQl9CisKKwkJc2NvcGUudXBkYXRlKCk7CisKKwl9CisK
KwlmdW5jdGlvbiBoYW5kbGVLZXlEb3duKCBldmVudCApIHsKKworCQkvL2NvbnNvbGUubG9nKCAn
aGFuZGxlS2V5RG93bicgKTsKKworCQlzd2l0Y2ggKCBldmVudC5rZXlDb2RlICkgeworCisJCQlj
YXNlIHNjb3BlLmtleXMuVVA6CisJCQkJcGFuKCAwLCBzY29wZS5rZXlQYW5TcGVlZCApOworCQkJ
CXNjb3BlLnVwZGF0ZSgpOworCQkJCWJyZWFrOworCisJCQljYXNlIHNjb3BlLmtleXMuQk9UVE9N
OgorCQkJCXBhbiggMCwgLSBzY29wZS5rZXlQYW5TcGVlZCApOworCQkJCXNjb3BlLnVwZGF0ZSgp
OworCQkJCWJyZWFrOworCisJCQljYXNlIHNjb3BlLmtleXMuTEVGVDoKKwkJCQlwYW4oIHNjb3Bl
LmtleVBhblNwZWVkLCAwICk7CisJCQkJc2NvcGUudXBkYXRlKCk7CisJCQkJYnJlYWs7CisKKwkJ
CWNhc2Ugc2NvcGUua2V5cy5SSUdIVDoKKwkJCQlwYW4oIC0gc2NvcGUua2V5UGFuU3BlZWQsIDAg
KTsKKwkJCQlzY29wZS51cGRhdGUoKTsKKwkJCQlicmVhazsKKworCQl9CisKKwl9CisKKwlmdW5j
dGlvbiBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlKCBldmVudCApIHsKKworCQkvL2NvbnNvbGUubG9n
KCAnaGFuZGxlVG91Y2hTdGFydFJvdGF0ZScgKTsKKworCQlyb3RhdGVTdGFydC5zZXQoIGV2ZW50
LnRvdWNoZXNbIDAgXS5wYWdlWCwgZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VZICk7CisKKwl9CisK
KwlmdW5jdGlvbiBoYW5kbGVUb3VjaFN0YXJ0RG9sbHkoIGV2ZW50ICkgeworCisJCS8vY29uc29s
ZS5sb2coICdoYW5kbGVUb3VjaFN0YXJ0RG9sbHknICk7CisKKwkJdmFyIGR4ID0gZXZlbnQudG91
Y2hlc1sgMCBdLnBhZ2VYIC0gZXZlbnQudG91Y2hlc1sgMSBdLnBhZ2VYOworCQl2YXIgZHkgPSBl
dmVudC50b3VjaGVzWyAwIF0ucGFnZVkgLSBldmVudC50b3VjaGVzWyAxIF0ucGFnZVk7CisKKwkJ
dmFyIGRpc3RhbmNlID0gTWF0aC5zcXJ0KCBkeCAqIGR4ICsgZHkgKiBkeSApOworCisJCWRvbGx5
U3RhcnQuc2V0KCAwLCBkaXN0YW5jZSApOworCisJfQorCisJZnVuY3Rpb24gaGFuZGxlVG91Y2hT
dGFydFBhbiggZXZlbnQgKSB7CisKKwkJLy9jb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoU3RhcnRQ
YW4nICk7CisKKwkJcGFuU3RhcnQuc2V0KCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVgsIGV2ZW50
LnRvdWNoZXNbIDAgXS5wYWdlWSApOworCisJfQorCisJZnVuY3Rpb24gaGFuZGxlVG91Y2hNb3Zl
Um90YXRlKCBldmVudCApIHsKKworCQkvL2NvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hNb3ZlUm90
YXRlJyApOworCisJCXJvdGF0ZUVuZC5zZXQoIGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWCwgZXZl
bnQudG91Y2hlc1sgMCBdLnBhZ2VZICk7CisJCXJvdGF0ZURlbHRhLnN1YlZlY3RvcnMoIHJvdGF0
ZUVuZCwgcm90YXRlU3RhcnQgKTsKKworCQl2YXIgZWxlbWVudCA9IHNjb3BlLmRvbUVsZW1lbnQg
PT09IGRvY3VtZW50ID8gc2NvcGUuZG9tRWxlbWVudC5ib2R5IDogc2NvcGUuZG9tRWxlbWVudDsK
KworCQkvLyByb3RhdGluZyBhY3Jvc3Mgd2hvbGUgc2NyZWVuIGdvZXMgMzYwIGRlZ3JlZXMgYXJv
dW5kCisJCXJvdGF0ZUxlZnQoIDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueCAvIGVsZW1lbnQu
Y2xpZW50V2lkdGggKiBzY29wZS5yb3RhdGVTcGVlZCApOworCisJCS8vIHJvdGF0aW5nIHVwIGFu
ZCBkb3duIGFsb25nIHdob2xlIHNjcmVlbiBhdHRlbXB0cyB0byBnbyAzNjAsIGJ1dCBsaW1pdGVk
IHRvIDE4MAorCQlyb3RhdGVVcCggMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS55IC8gZWxlbWVu
dC5jbGllbnRIZWlnaHQgKiBzY29wZS5yb3RhdGVTcGVlZCApOworCisJCXJvdGF0ZVN0YXJ0LmNv
cHkoIHJvdGF0ZUVuZCApOworCisJCXNjb3BlLnVwZGF0ZSgpOworCisJfQorCisJZnVuY3Rpb24g
aGFuZGxlVG91Y2hNb3ZlRG9sbHkoIGV2ZW50ICkgeworCisJCS8vY29uc29sZS5sb2coICdoYW5k
bGVUb3VjaE1vdmVEb2xseScgKTsKKworCQl2YXIgZHggPSBldmVudC50b3VjaGVzWyAwIF0ucGFn
ZVggLSBldmVudC50b3VjaGVzWyAxIF0ucGFnZVg7CisJCXZhciBkeSA9IGV2ZW50LnRvdWNoZXNb
IDAgXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbIDEgXS5wYWdlWTsKKworCQl2YXIgZGlzdGFuY2Ug
PSBNYXRoLnNxcnQoIGR4ICogZHggKyBkeSAqIGR5ICk7CisKKwkJZG9sbHlFbmQuc2V0KCAwLCBk
aXN0YW5jZSApOworCisJCWRvbGx5RGVsdGEuc3ViVmVjdG9ycyggZG9sbHlFbmQsIGRvbGx5U3Rh
cnQgKTsKKworCQlpZiAoIGRvbGx5RGVsdGEueSA+IDAgKSB7CisKKwkJCWRvbGx5T3V0KCBnZXRa
b29tU2NhbGUoKSApOworCisJCX0gZWxzZSBpZiAoIGRvbGx5RGVsdGEueSA8IDAgKSB7CisKKwkJ
CWRvbGx5SW4oIGdldFpvb21TY2FsZSgpICk7CisKKwkJfQorCisJCWRvbGx5U3RhcnQuY29weSgg
ZG9sbHlFbmQgKTsKKworCQlzY29wZS51cGRhdGUoKTsKKworCX0KKworCWZ1bmN0aW9uIGhhbmRs
ZVRvdWNoTW92ZVBhbiggZXZlbnQgKSB7CisKKwkJLy9jb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNo
TW92ZVBhbicgKTsKKworCQlwYW5FbmQuc2V0KCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVgsIGV2
ZW50LnRvdWNoZXNbIDAgXS5wYWdlWSApOworCisJCXBhbkRlbHRhLnN1YlZlY3RvcnMoIHBhbkVu
ZCwgcGFuU3RhcnQgKTsKKworCQlwYW4oIHBhbkRlbHRhLngsIHBhbkRlbHRhLnkgKTsKKworCQlw
YW5TdGFydC5jb3B5KCBwYW5FbmQgKTsKKworCQlzY29wZS51cGRhdGUoKTsKKworCX0KKworCWZ1
bmN0aW9uIGhhbmRsZVRvdWNoRW5kKCBldmVudCApIHsKKworCQkvL2NvbnNvbGUubG9nKCAnaGFu
ZGxlVG91Y2hFbmQnICk7CisKKwl9CisKKwkvLworCS8vIGV2ZW50IGhhbmRsZXJzIC0gRlNNOiBs
aXN0ZW4gZm9yIGV2ZW50cyBhbmQgcmVzZXQgc3RhdGUKKwkvLworCisJZnVuY3Rpb24gb25Nb3Vz
ZURvd24oIGV2ZW50ICkgeworCisJCWlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1
cm47CisKKwkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKworCQlzd2l0Y2ggKCBldmVudC5idXR0
b24gKSB7CisKKwkJCWNhc2Ugc2NvcGUubW91c2VCdXR0b25zLk9SQklUOgorCisJCQkJaWYgKCBz
Y29wZS5lbmFibGVSb3RhdGUgPT09IGZhbHNlICkgcmV0dXJuOworCisJCQkJaGFuZGxlTW91c2VE
b3duUm90YXRlKCBldmVudCApOworCisJCQkJc3RhdGUgPSBTVEFURS5ST1RBVEU7CisKKwkJCQli
cmVhazsKKworCQkJY2FzZSBzY29wZS5tb3VzZUJ1dHRvbnMuWk9PTToKKworCQkJCWlmICggc2Nv
cGUuZW5hYmxlWm9vbSA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCQloYW5kbGVNb3VzZURvd25E
b2xseSggZXZlbnQgKTsKKworCQkJCXN0YXRlID0gU1RBVEUuRE9MTFk7CisKKwkJCQlicmVhazsK
KworCQkJY2FzZSBzY29wZS5tb3VzZUJ1dHRvbnMuUEFOOgorCisJCQkJaWYgKCBzY29wZS5lbmFi
bGVQYW4gPT09IGZhbHNlICkgcmV0dXJuOworCisJCQkJaGFuZGxlTW91c2VEb3duUGFuKCBldmVu
dCApOworCisJCQkJc3RhdGUgPSBTVEFURS5QQU47CisKKwkJCQlicmVhazsKKworCQl9CisKKwkJ
aWYgKCBzdGF0ZSAhPT0gU1RBVEUuTk9ORSApIHsKKworCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0
ZW5lciggJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlLCBmYWxzZSApOworCQkJZG9jdW1lbnQuYWRk
RXZlbnRMaXN0ZW5lciggJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlICk7CisKKwkJCXNjb3Bl
LmRpc3BhdGNoRXZlbnQoIHN0YXJ0RXZlbnQgKTsKKworCQl9CisKKwl9CisKKwlmdW5jdGlvbiBv
bk1vdXNlTW92ZSggZXZlbnQgKSB7CisKKwkJaWYgKCBzY29wZS5lbmFibGVkID09PSBmYWxzZSAp
IHJldHVybjsKKworCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCisJCXN3aXRjaCAoIHN0YXRl
ICkgeworCisJCQljYXNlIFNUQVRFLlJPVEFURToKKworCQkJCWlmICggc2NvcGUuZW5hYmxlUm90
YXRlID09PSBmYWxzZSApIHJldHVybjsKKworCQkJCWhhbmRsZU1vdXNlTW92ZVJvdGF0ZSggZXZl
bnQgKTsKKworCQkJCWJyZWFrOworCisJCQljYXNlIFNUQVRFLkRPTExZOgorCisJCQkJaWYgKCBz
Y29wZS5lbmFibGVab29tID09PSBmYWxzZSApIHJldHVybjsKKworCQkJCWhhbmRsZU1vdXNlTW92
ZURvbGx5KCBldmVudCApOworCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1RBVEUuUEFOOgorCisJ
CQkJaWYgKCBzY29wZS5lbmFibGVQYW4gPT09IGZhbHNlICkgcmV0dXJuOworCisJCQkJaGFuZGxl
TW91c2VNb3ZlUGFuKCBldmVudCApOworCisJCQkJYnJlYWs7CisKKwkJfQorCisJfQorCisJZnVu
Y3Rpb24gb25Nb3VzZVVwKCBldmVudCApIHsKKworCQlpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZh
bHNlICkgcmV0dXJuOworCisJCWhhbmRsZU1vdXNlVXAoIGV2ZW50ICk7CisKKwkJZG9jdW1lbnQu
cmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlLCBmYWxzZSApOwor
CQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2V1cCcsIG9uTW91c2VVcCwgZmFs
c2UgKTsKKworCQlzY29wZS5kaXNwYXRjaEV2ZW50KCBlbmRFdmVudCApOworCisJCXN0YXRlID0g
U1RBVEUuTk9ORTsKKworCX0KKworCWZ1bmN0aW9uIG9uTW91c2VXaGVlbCggZXZlbnQgKSB7CisK
KwkJaWYgKCBzY29wZS5lbmFibGVkID09PSBmYWxzZSB8fCBzY29wZS5lbmFibGVab29tID09PSBm
YWxzZSB8fCAoIHN0YXRlICE9PSBTVEFURS5OT05FICYmIHN0YXRlICE9PSBTVEFURS5ST1RBVEUg
KSApIHJldHVybjsKKworCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQlldmVudC5zdG9wUHJv
cGFnYXRpb24oKTsKKworCQloYW5kbGVNb3VzZVdoZWVsKCBldmVudCApOworCisJCXNjb3BlLmRp
c3BhdGNoRXZlbnQoIHN0YXJ0RXZlbnQgKTsgLy8gbm90IHN1cmUgd2h5IHRoZXNlIGFyZSBoZXJl
Li4uCisJCXNjb3BlLmRpc3BhdGNoRXZlbnQoIGVuZEV2ZW50ICk7CisKKwl9CisKKwlmdW5jdGlv
biBvbktleURvd24oIGV2ZW50ICkgeworCisJCWlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2Ug
fHwgc2NvcGUuZW5hYmxlS2V5cyA9PT0gZmFsc2UgfHwgc2NvcGUuZW5hYmxlUGFuID09PSBmYWxz
ZSApIHJldHVybjsKKworCQloYW5kbGVLZXlEb3duKCBldmVudCApOworCisJfQorCisJZnVuY3Rp
b24gb25Ub3VjaFN0YXJ0KCBldmVudCApIHsKKworCQlpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZh
bHNlICkgcmV0dXJuOworCisJCXN3aXRjaCAoIGV2ZW50LnRvdWNoZXMubGVuZ3RoICkgeworCisJ
CQljYXNlIDE6CS8vIG9uZS1maW5nZXJlZCB0b3VjaDogcm90YXRlCisKKwkJCQlpZiAoIHNjb3Bl
LmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCQloYW5kbGVUb3VjaFN0YXJ0
Um90YXRlKCBldmVudCApOworCisJCQkJc3RhdGUgPSBTVEFURS5UT1VDSF9ST1RBVEU7CisKKwkJ
CQlicmVhazsKKworCQkJY2FzZSAyOgkvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5CisKKwkJ
CQlpZiAoIHNjb3BlLmVuYWJsZVpvb20gPT09IGZhbHNlICkgcmV0dXJuOworCisJCQkJaGFuZGxl
VG91Y2hTdGFydERvbGx5KCBldmVudCApOworCisJCQkJc3RhdGUgPSBTVEFURS5UT1VDSF9ET0xM
WTsKKworCQkJCWJyZWFrOworCisJCQljYXNlIDM6IC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBw
YW4KKworCQkJCWlmICggc2NvcGUuZW5hYmxlUGFuID09PSBmYWxzZSApIHJldHVybjsKKworCQkJ
CWhhbmRsZVRvdWNoU3RhcnRQYW4oIGV2ZW50ICk7CisKKwkJCQlzdGF0ZSA9IFNUQVRFLlRPVUNI
X1BBTjsKKworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCisJCQkJc3RhdGUgPSBTVEFURS5O
T05FOworCisJCX0KKworCQlpZiAoIHN0YXRlICE9PSBTVEFURS5OT05FICkgeworCisJCQlzY29w
ZS5kaXNwYXRjaEV2ZW50KCBzdGFydEV2ZW50ICk7CisKKwkJfQorCisJfQorCisJZnVuY3Rpb24g
b25Ub3VjaE1vdmUoIGV2ZW50ICkgeworCisJCWlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2Ug
KSByZXR1cm47CisKKwkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJZXZlbnQuc3RvcFByb3Bh
Z2F0aW9uKCk7CisKKwkJc3dpdGNoICggZXZlbnQudG91Y2hlcy5sZW5ndGggKSB7CisKKwkJCWNh
c2UgMTogLy8gb25lLWZpbmdlcmVkIHRvdWNoOiByb3RhdGUKKworCQkJCWlmICggc2NvcGUuZW5h
YmxlUm90YXRlID09PSBmYWxzZSApIHJldHVybjsKKwkJCQlpZiAoIHN0YXRlICE9PSBTVEFURS5U
T1VDSF9ST1RBVEUgKSByZXR1cm47IC8vIGlzIHRoaXMgbmVlZGVkPy4uLgorCisJCQkJaGFuZGxl
VG91Y2hNb3ZlUm90YXRlKCBldmVudCApOworCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjogLy8g
dHdvLWZpbmdlcmVkIHRvdWNoOiBkb2xseQorCisJCQkJaWYgKCBzY29wZS5lbmFibGVab29tID09
PSBmYWxzZSApIHJldHVybjsKKwkJCQlpZiAoIHN0YXRlICE9PSBTVEFURS5UT1VDSF9ET0xMWSAp
IHJldHVybjsgLy8gaXMgdGhpcyBuZWVkZWQ/Li4uCisKKwkJCQloYW5kbGVUb3VjaE1vdmVEb2xs
eSggZXZlbnQgKTsKKworCQkJCWJyZWFrOworCisJCQljYXNlIDM6IC8vIHRocmVlLWZpbmdlcmVk
IHRvdWNoOiBwYW4KKworCQkJCWlmICggc2NvcGUuZW5hYmxlUGFuID09PSBmYWxzZSApIHJldHVy
bjsKKwkJCQlpZiAoIHN0YXRlICE9PSBTVEFURS5UT1VDSF9QQU4gKSByZXR1cm47IC8vIGlzIHRo
aXMgbmVlZGVkPy4uLgorCisJCQkJaGFuZGxlVG91Y2hNb3ZlUGFuKCBldmVudCApOworCisJCQkJ
YnJlYWs7CisKKwkJCWRlZmF1bHQ6CisKKwkJCQlzdGF0ZSA9IFNUQVRFLk5PTkU7CisKKwkJfQor
CisJfQorCisJZnVuY3Rpb24gb25Ub3VjaEVuZCggZXZlbnQgKSB7CisKKwkJaWYgKCBzY29wZS5l
bmFibGVkID09PSBmYWxzZSApIHJldHVybjsKKworCQloYW5kbGVUb3VjaEVuZCggZXZlbnQgKTsK
KworCQlzY29wZS5kaXNwYXRjaEV2ZW50KCBlbmRFdmVudCApOworCisJCXN0YXRlID0gU1RBVEUu
Tk9ORTsKKworCX0KKworCWZ1bmN0aW9uIG9uQ29udGV4dE1lbnUoIGV2ZW50ICkgeworCisJCWlm
ICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJZXZlbnQucHJldmVudERl
ZmF1bHQoKTsKKworCX0KKworCS8vCisKKwlzY29wZS5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVu
ZXIoICdjb250ZXh0bWVudScsIG9uQ29udGV4dE1lbnUsIGZhbHNlICk7CisKKwlzY29wZS5kb21F
bGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWRvd24nLCBvbk1vdXNlRG93biwgZmFsc2Ug
KTsKKwlzY29wZS5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICd3aGVlbCcsIG9uTW91c2VX
aGVlbCwgZmFsc2UgKTsKKworCXNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3Rv
dWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIGZhbHNlICk7CisJc2NvcGUuZG9tRWxlbWVudC5hZGRF
dmVudExpc3RlbmVyKCAndG91Y2hlbmQnLCBvblRvdWNoRW5kLCBmYWxzZSApOworCXNjb3BlLmRv
bUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCBmYWxz
ZSApOworCisJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdrZXlkb3duJywgb25LZXlEb3duLCBm
YWxzZSApOworCisJLy8gZm9yY2UgYW4gdXBkYXRlIGF0IHN0YXJ0CisKKwl0aGlzLnVwZGF0ZSgp
OworCit9OworCitUSFJFRS5PcmJpdENvbnRyb2xzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUo
IFRIUkVFLkV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKTsKK1RIUkVFLk9yYml0Q29udHJvbHMu
cHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVEhSRUUuT3JiaXRDb250cm9sczsKKworT2JqZWN0LmRl
ZmluZVByb3BlcnRpZXMoIFRIUkVFLk9yYml0Q29udHJvbHMucHJvdG90eXBlLCB7CisKKwljZW50
ZXI6IHsKKworCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUu
T3JiaXRDb250cm9sczogLmNlbnRlciBoYXMgYmVlbiByZW5hbWVkIHRvIC50YXJnZXQnICk7CisJ
CQlyZXR1cm4gdGhpcy50YXJnZXQ7CisKKwkJfQorCisJfSwKKworCS8vIGJhY2t3YXJkIGNvbXBh
dGliaWxpdHkKKworCW5vWm9vbTogeworCisJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQljb25z
b2xlLndhcm4oICdUSFJFRS5PcmJpdENvbnRyb2xzOiAubm9ab29tIGhhcyBiZWVuIGRlcHJlY2F0
ZWQuIFVzZSAuZW5hYmxlWm9vbSBpbnN0ZWFkLicgKTsKKwkJCXJldHVybiAhIHRoaXMuZW5hYmxl
Wm9vbTsKKworCQl9LAorCisJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJY29uc29s
ZS53YXJuKCAnVEhSRUUuT3JiaXRDb250cm9sczogLm5vWm9vbSBoYXMgYmVlbiBkZXByZWNhdGVk
LiBVc2UgLmVuYWJsZVpvb20gaW5zdGVhZC4nICk7CisJCQl0aGlzLmVuYWJsZVpvb20gPSAhIHZh
bHVlOworCisJCX0KKworCX0sCisKKwlub1JvdGF0ZTogeworCisJCWdldDogZnVuY3Rpb24gKCkg
eworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5PcmJpdENvbnRyb2xzOiAubm9Sb3RhdGUgaGFz
IGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4nICk7CisJCQlyZXR1
cm4gISB0aGlzLmVuYWJsZVJvdGF0ZTsKKworCQl9LAorCisJCXNldDogZnVuY3Rpb24gKCB2YWx1
ZSApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT3JiaXRDb250cm9sczogLm5vUm90YXRl
IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlUm90YXRlIGluc3RlYWQuJyApOworCQkJ
dGhpcy5lbmFibGVSb3RhdGUgPSAhIHZhbHVlOworCisJCX0KKworCX0sCisKKwlub1Bhbjogewor
CisJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5PcmJpdENv
bnRyb2xzOiAubm9QYW4gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVQYW4gaW5zdGVh
ZC4nICk7CisJCQlyZXR1cm4gISB0aGlzLmVuYWJsZVBhbjsKKworCQl9LAorCisJCXNldDogZnVu
Y3Rpb24gKCB2YWx1ZSApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT3JiaXRDb250cm9s
czogLm5vUGFuIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlUGFuIGluc3RlYWQuJyAp
OworCQkJdGhpcy5lbmFibGVQYW4gPSAhIHZhbHVlOworCisJCX0KKworCX0sCisKKwlub0tleXM6
IHsKKworCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT3Ji
aXRDb250cm9sczogLm5vS2V5cyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZUtleXMg
aW5zdGVhZC4nICk7CisJCQlyZXR1cm4gISB0aGlzLmVuYWJsZUtleXM7CisKKwkJfSwKKworCQlz
ZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9yYml0
Q29udHJvbHM6IC5ub0tleXMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVLZXlzIGlu
c3RlYWQuJyApOworCQkJdGhpcy5lbmFibGVLZXlzID0gISB2YWx1ZTsKKworCQl9CisKKwl9LAor
CisJc3RhdGljTW92aW5nOiB7CisKKwkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUu
d2FybiggJ1RIUkVFLk9yYml0Q29udHJvbHM6IC5zdGF0aWNNb3ZpbmcgaGFzIGJlZW4gZGVwcmVj
YXRlZC4gVXNlIC5lbmFibGVEYW1waW5nIGluc3RlYWQuJyApOworCQkJcmV0dXJuICEgdGhpcy5l
bmFibGVEYW1waW5nOworCisJCX0sCisKKwkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJ
CQljb25zb2xlLndhcm4oICdUSFJFRS5PcmJpdENvbnRyb2xzOiAuc3RhdGljTW92aW5nIGhhcyBi
ZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlRGFtcGluZyBpbnN0ZWFkLicgKTsKKwkJCXRoaXMu
ZW5hYmxlRGFtcGluZyA9ICEgdmFsdWU7CisKKwkJfQorCisJfSwKKworCWR5bmFtaWNEYW1waW5n
RmFjdG9yOiB7CisKKwkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RI
UkVFLk9yYml0Q29udHJvbHM6IC5keW5hbWljRGFtcGluZ0ZhY3RvciBoYXMgYmVlbiByZW5hbWVk
LiBVc2UgLmRhbXBpbmdGYWN0b3IgaW5zdGVhZC4nICk7CisJCQlyZXR1cm4gdGhpcy5kYW1waW5n
RmFjdG9yOworCisJCX0sCisKKwkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQljb25z
b2xlLndhcm4oICdUSFJFRS5PcmJpdENvbnRyb2xzOiAuZHluYW1pY0RhbXBpbmdGYWN0b3IgaGFz
IGJlZW4gcmVuYW1lZC4gVXNlIC5kYW1waW5nRmFjdG9yIGluc3RlYWQuJyApOworCQkJdGhpcy5k
YW1waW5nRmFjdG9yID0gdmFsdWU7CisKKwkJfQorCisJfQorCit9ICk7CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9FeHRlcm5hbC90aHJlZS5qcy90aHJl
ZS5qcyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0V4dGVybmFsL3RocmVl
LmpzL3RocmVlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFjZTZmZjc3MmEyYmViNjViOTU5YjM4NTEyNGRlYzgz
Yjk5ZTBkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlcklu
dGVyZmFjZS9FeHRlcm5hbC90aHJlZS5qcy90aHJlZS5qcwpAQCAtMCwwICsxLDQ0MTEwIEBACiso
ZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgeworCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0
JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOgor
CXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4
cG9ydHMnXSwgZmFjdG9yeSkgOgorCShmYWN0b3J5KChnbG9iYWwuVEhSRUUgPSBnbG9iYWwuVEhS
RUUgfHwge30pKSk7Cit9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7
CisKKwkvLyBQb2x5ZmlsbHMKKworCWlmICggTnVtYmVyLkVQU0lMT04gPT09IHVuZGVmaW5lZCAp
IHsKKworCQlOdW1iZXIuRVBTSUxPTiA9IE1hdGgucG93KCAyLCAtIDUyICk7CisKKwl9CisKKwlp
ZiAoIE51bWJlci5pc0ludGVnZXIgPT09IHVuZGVmaW5lZCApIHsKKworCQkvLyBNaXNzaW5nIGlu
IElFCisJCS8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0ph
dmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0ludGVnZXIKKworCQlO
dW1iZXIuaXNJbnRlZ2VyID0gZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJcmV0dXJuIHR5cGVv
ZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoIHZhbHVlICkgJiYgTWF0aC5mbG9vcigg
dmFsdWUgKSA9PT0gdmFsdWU7CisKKwkJfTsKKworCX0KKworCS8vCisKKwlpZiAoIE1hdGguc2ln
biA9PT0gdW5kZWZpbmVkICkgeworCisJCS8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3Jn
L2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgv
c2lnbgorCisJCU1hdGguc2lnbiA9IGZ1bmN0aW9uICggeCApIHsKKworCQkJcmV0dXJuICggeCA8
IDAgKSA/IC0gMSA6ICggeCA+IDAgKSA/IDEgOiArIHg7CisKKwkJfTsKKworCX0KKworCWlmICgg
RnVuY3Rpb24ucHJvdG90eXBlLm5hbWUgPT09IHVuZGVmaW5lZCApIHsKKworCQkvLyBNaXNzaW5n
IGluIElFCisJCS8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2Vi
L0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Z1bmN0aW9uL25hbWUKKworCQlP
YmplY3QuZGVmaW5lUHJvcGVydHkoIEZ1bmN0aW9uLnByb3RvdHlwZSwgJ25hbWUnLCB7CisKKwkJ
CWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJcmV0dXJuIHRoaXMudG9TdHJpbmcoKS5tYXRjaCgg
L15ccypmdW5jdGlvblxzKihbXlwoXHNdKikvIClbIDEgXTsKKworCQkJfQorCisJCX0gKTsKKwor
CX0KKworCWlmICggT2JqZWN0LmFzc2lnbiA9PT0gdW5kZWZpbmVkICkgeworCisJCS8vIE1pc3Np
bmcgaW4gSUUKKwkJLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9X
ZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnbgorCisJ
CSggZnVuY3Rpb24gKCkgeworCisJCQlPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKCB0YXJnZXQg
KSB7CisKKwkJCQkndXNlIHN0cmljdCc7CisKKwkJCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVk
IHx8IHRhcmdldCA9PT0gbnVsbCApIHsKKworCQkJCQl0aHJvdyBuZXcgVHlwZUVycm9yKCAnQ2Fu
bm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0JyApOworCisJCQkJfQorCisJ
CQkJdmFyIG91dHB1dCA9IE9iamVjdCggdGFyZ2V0ICk7CisKKwkJCQlmb3IgKCB2YXIgaW5kZXgg
PSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICsrICkgeworCisJCQkJCXZhciBz
b3VyY2UgPSBhcmd1bWVudHNbIGluZGV4IF07CisKKwkJCQkJaWYgKCBzb3VyY2UgIT09IHVuZGVm
aW5lZCAmJiBzb3VyY2UgIT09IG51bGwgKSB7CisKKwkJCQkJCWZvciAoIHZhciBuZXh0S2V5IGlu
IHNvdXJjZSApIHsKKworCQkJCQkJCWlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0
eS5jYWxsKCBzb3VyY2UsIG5leHRLZXkgKSApIHsKKworCQkJCQkJCQlvdXRwdXRbIG5leHRLZXkg
XSA9IHNvdXJjZVsgbmV4dEtleSBdOworCisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQkJfQor
CisJCQkJfQorCisJCQkJcmV0dXJuIG91dHB1dDsKKworCQkJfTsKKworCQl9ICkoKTsKKworCX0K
KworCS8qKgorCSAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvZXZlbnRkaXNwYXRjaGVyLmpz
LworCSAqLworCisJZnVuY3Rpb24gRXZlbnREaXNwYXRjaGVyKCkge30KKworCU9iamVjdC5hc3Np
Z24oIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHsKKworCQlhZGRFdmVudExpc3RlbmVyOiBm
dW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkgeworCisJCQlpZiAoIHRoaXMuX2xpc3RlbmVycyA9
PT0gdW5kZWZpbmVkICkgdGhpcy5fbGlzdGVuZXJzID0ge307CisKKwkJCXZhciBsaXN0ZW5lcnMg
PSB0aGlzLl9saXN0ZW5lcnM7CisKKwkJCWlmICggbGlzdGVuZXJzWyB0eXBlIF0gPT09IHVuZGVm
aW5lZCApIHsKKworCQkJCWxpc3RlbmVyc1sgdHlwZSBdID0gW107CisKKwkJCX0KKworCQkJaWYg
KCBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5lciApID09PSAtIDEgKSB7CisKKwkJ
CQlsaXN0ZW5lcnNbIHR5cGUgXS5wdXNoKCBsaXN0ZW5lciApOworCisJCQl9CisKKwkJfSwKKwor
CQloYXNFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkgeworCisJCQlp
ZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIGZhbHNlOworCisJCQl2
YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzOworCisJCQlyZXR1cm4gbGlzdGVuZXJzWyB0
eXBlIF0gIT09IHVuZGVmaW5lZCAmJiBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5l
ciApICE9PSAtIDE7CisKKwkJfSwKKworCQlyZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAo
IHR5cGUsIGxpc3RlbmVyICkgeworCisJCQlpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZp
bmVkICkgcmV0dXJuOworCisJCQl2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzOworCQkJ
dmFyIGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIHR5cGUgXTsKKworCQkJaWYgKCBsaXN0ZW5l
ckFycmF5ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQl2YXIgaW5kZXggPSBsaXN0ZW5lckFycmF5
LmluZGV4T2YoIGxpc3RlbmVyICk7CisKKwkJCQlpZiAoIGluZGV4ICE9PSAtIDEgKSB7CisKKwkJ
CQkJbGlzdGVuZXJBcnJheS5zcGxpY2UoIGluZGV4LCAxICk7CisKKwkJCQl9CisKKwkJCX0KKwor
CQl9LAorCisJCWRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICggZXZlbnQgKSB7CisKKwkJCWlmICgg
dGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47CisKKwkJCXZhciBsaXN0ZW5l
cnMgPSB0aGlzLl9saXN0ZW5lcnM7CisJCQl2YXIgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sg
ZXZlbnQudHlwZSBdOworCisJCQlpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHsK
KworCQkJCWV2ZW50LnRhcmdldCA9IHRoaXM7CisKKwkJCQl2YXIgYXJyYXkgPSBsaXN0ZW5lckFy
cmF5LnNsaWNlKCAwICk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7
IGkgPCBsOyBpICsrICkgeworCisJCQkJCWFycmF5WyBpIF0uY2FsbCggdGhpcywgZXZlbnQgKTsK
KworCQkJCX0KKworCQkJfQorCisJCX0KKworCX0gKTsKKworCXZhciBSRVZJU0lPTiA9ICc4Nic7
CisJdmFyIE1PVVNFID0geyBMRUZUOiAwLCBNSURETEU6IDEsIFJJR0hUOiAyIH07CisJdmFyIEN1
bGxGYWNlTm9uZSA9IDA7CisJdmFyIEN1bGxGYWNlQmFjayA9IDE7CisJdmFyIEN1bGxGYWNlRnJv
bnQgPSAyOworCXZhciBDdWxsRmFjZUZyb250QmFjayA9IDM7CisJdmFyIEZyb250RmFjZURpcmVj
dGlvbkNXID0gMDsKKwl2YXIgRnJvbnRGYWNlRGlyZWN0aW9uQ0NXID0gMTsKKwl2YXIgQmFzaWNT
aGFkb3dNYXAgPSAwOworCXZhciBQQ0ZTaGFkb3dNYXAgPSAxOworCXZhciBQQ0ZTb2Z0U2hhZG93
TWFwID0gMjsKKwl2YXIgRnJvbnRTaWRlID0gMDsKKwl2YXIgQmFja1NpZGUgPSAxOworCXZhciBE
b3VibGVTaWRlID0gMjsKKwl2YXIgRmxhdFNoYWRpbmcgPSAxOworCXZhciBTbW9vdGhTaGFkaW5n
ID0gMjsKKwl2YXIgTm9Db2xvcnMgPSAwOworCXZhciBGYWNlQ29sb3JzID0gMTsKKwl2YXIgVmVy
dGV4Q29sb3JzID0gMjsKKwl2YXIgTm9CbGVuZGluZyA9IDA7CisJdmFyIE5vcm1hbEJsZW5kaW5n
ID0gMTsKKwl2YXIgQWRkaXRpdmVCbGVuZGluZyA9IDI7CisJdmFyIFN1YnRyYWN0aXZlQmxlbmRp
bmcgPSAzOworCXZhciBNdWx0aXBseUJsZW5kaW5nID0gNDsKKwl2YXIgQ3VzdG9tQmxlbmRpbmcg
PSA1OworCXZhciBBZGRFcXVhdGlvbiA9IDEwMDsKKwl2YXIgU3VidHJhY3RFcXVhdGlvbiA9IDEw
MTsKKwl2YXIgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gPSAxMDI7CisJdmFyIE1pbkVxdWF0aW9u
ID0gMTAzOworCXZhciBNYXhFcXVhdGlvbiA9IDEwNDsKKwl2YXIgWmVyb0ZhY3RvciA9IDIwMDsK
Kwl2YXIgT25lRmFjdG9yID0gMjAxOworCXZhciBTcmNDb2xvckZhY3RvciA9IDIwMjsKKwl2YXIg
T25lTWludXNTcmNDb2xvckZhY3RvciA9IDIwMzsKKwl2YXIgU3JjQWxwaGFGYWN0b3IgPSAyMDQ7
CisJdmFyIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgPSAyMDU7CisJdmFyIERzdEFscGhhRmFjdG9y
ID0gMjA2OworCXZhciBPbmVNaW51c0RzdEFscGhhRmFjdG9yID0gMjA3OworCXZhciBEc3RDb2xv
ckZhY3RvciA9IDIwODsKKwl2YXIgT25lTWludXNEc3RDb2xvckZhY3RvciA9IDIwOTsKKwl2YXIg
U3JjQWxwaGFTYXR1cmF0ZUZhY3RvciA9IDIxMDsKKwl2YXIgTmV2ZXJEZXB0aCA9IDA7CisJdmFy
IEFsd2F5c0RlcHRoID0gMTsKKwl2YXIgTGVzc0RlcHRoID0gMjsKKwl2YXIgTGVzc0VxdWFsRGVw
dGggPSAzOworCXZhciBFcXVhbERlcHRoID0gNDsKKwl2YXIgR3JlYXRlckVxdWFsRGVwdGggPSA1
OworCXZhciBHcmVhdGVyRGVwdGggPSA2OworCXZhciBOb3RFcXVhbERlcHRoID0gNzsKKwl2YXIg
TXVsdGlwbHlPcGVyYXRpb24gPSAwOworCXZhciBNaXhPcGVyYXRpb24gPSAxOworCXZhciBBZGRP
cGVyYXRpb24gPSAyOworCXZhciBOb1RvbmVNYXBwaW5nID0gMDsKKwl2YXIgTGluZWFyVG9uZU1h
cHBpbmcgPSAxOworCXZhciBSZWluaGFyZFRvbmVNYXBwaW5nID0gMjsKKwl2YXIgVW5jaGFydGVk
MlRvbmVNYXBwaW5nID0gMzsKKwl2YXIgQ2luZW9uVG9uZU1hcHBpbmcgPSA0OworCXZhciBVVk1h
cHBpbmcgPSAzMDA7CisJdmFyIEN1YmVSZWZsZWN0aW9uTWFwcGluZyA9IDMwMTsKKwl2YXIgQ3Vi
ZVJlZnJhY3Rpb25NYXBwaW5nID0gMzAyOworCXZhciBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9u
TWFwcGluZyA9IDMwMzsKKwl2YXIgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgPSAz
MDQ7CisJdmFyIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nID0gMzA1OworCXZhciBDdWJlVVZS
ZWZsZWN0aW9uTWFwcGluZyA9IDMwNjsKKwl2YXIgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgPSAz
MDc7CisJdmFyIFJlcGVhdFdyYXBwaW5nID0gMTAwMDsKKwl2YXIgQ2xhbXBUb0VkZ2VXcmFwcGlu
ZyA9IDEwMDE7CisJdmFyIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgPSAxMDAyOworCXZhciBOZWFy
ZXN0RmlsdGVyID0gMTAwMzsKKwl2YXIgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA0
OworCXZhciBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyID0gMTAwNTsKKwl2YXIgTGluZWFyRmls
dGVyID0gMTAwNjsKKwl2YXIgTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDc7CisJdmFy
IExpbmVhck1pcE1hcExpbmVhckZpbHRlciA9IDEwMDg7CisJdmFyIFVuc2lnbmVkQnl0ZVR5cGUg
PSAxMDA5OworCXZhciBCeXRlVHlwZSA9IDEwMTA7CisJdmFyIFNob3J0VHlwZSA9IDEwMTE7CisJ
dmFyIFVuc2lnbmVkU2hvcnRUeXBlID0gMTAxMjsKKwl2YXIgSW50VHlwZSA9IDEwMTM7CisJdmFy
IFVuc2lnbmVkSW50VHlwZSA9IDEwMTQ7CisJdmFyIEZsb2F0VHlwZSA9IDEwMTU7CisJdmFyIEhh
bGZGbG9hdFR5cGUgPSAxMDE2OworCXZhciBVbnNpZ25lZFNob3J0NDQ0NFR5cGUgPSAxMDE3Owor
CXZhciBVbnNpZ25lZFNob3J0NTU1MVR5cGUgPSAxMDE4OworCXZhciBVbnNpZ25lZFNob3J0NTY1
VHlwZSA9IDEwMTk7CisJdmFyIFVuc2lnbmVkSW50MjQ4VHlwZSA9IDEwMjA7CisJdmFyIEFscGhh
Rm9ybWF0ID0gMTAyMTsKKwl2YXIgUkdCRm9ybWF0ID0gMTAyMjsKKwl2YXIgUkdCQUZvcm1hdCA9
IDEwMjM7CisJdmFyIEx1bWluYW5jZUZvcm1hdCA9IDEwMjQ7CisJdmFyIEx1bWluYW5jZUFscGhh
Rm9ybWF0ID0gMTAyNTsKKwl2YXIgUkdCRUZvcm1hdCA9IFJHQkFGb3JtYXQ7CisJdmFyIERlcHRo
Rm9ybWF0ID0gMTAyNjsKKwl2YXIgRGVwdGhTdGVuY2lsRm9ybWF0ID0gMTAyNzsKKwl2YXIgUkdC
X1MzVENfRFhUMV9Gb3JtYXQgPSAyMDAxOworCXZhciBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgPSAy
MDAyOworCXZhciBSR0JBX1MzVENfRFhUM19Gb3JtYXQgPSAyMDAzOworCXZhciBSR0JBX1MzVENf
RFhUNV9Gb3JtYXQgPSAyMDA0OworCXZhciBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDIxMDA7
CisJdmFyIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMjEwMTsKKwl2YXIgUkdCQV9QVlJUQ180
QlBQVjFfRm9ybWF0ID0gMjEwMjsKKwl2YXIgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMjEw
MzsKKwl2YXIgUkdCX0VUQzFfRm9ybWF0ID0gMjE1MTsKKwl2YXIgTG9vcE9uY2UgPSAyMjAwOwor
CXZhciBMb29wUmVwZWF0ID0gMjIwMTsKKwl2YXIgTG9vcFBpbmdQb25nID0gMjIwMjsKKwl2YXIg
SW50ZXJwb2xhdGVEaXNjcmV0ZSA9IDIzMDA7CisJdmFyIEludGVycG9sYXRlTGluZWFyID0gMjMw
MTsKKwl2YXIgSW50ZXJwb2xhdGVTbW9vdGggPSAyMzAyOworCXZhciBaZXJvQ3VydmF0dXJlRW5k
aW5nID0gMjQwMDsKKwl2YXIgWmVyb1Nsb3BlRW5kaW5nID0gMjQwMTsKKwl2YXIgV3JhcEFyb3Vu
ZEVuZGluZyA9IDI0MDI7CisJdmFyIFRyaWFuZ2xlc0RyYXdNb2RlID0gMDsKKwl2YXIgVHJpYW5n
bGVTdHJpcERyYXdNb2RlID0gMTsKKwl2YXIgVHJpYW5nbGVGYW5EcmF3TW9kZSA9IDI7CisJdmFy
IExpbmVhckVuY29kaW5nID0gMzAwMDsKKwl2YXIgc1JHQkVuY29kaW5nID0gMzAwMTsKKwl2YXIg
R2FtbWFFbmNvZGluZyA9IDMwMDc7CisJdmFyIFJHQkVFbmNvZGluZyA9IDMwMDI7CisJdmFyIExv
Z0x1dkVuY29kaW5nID0gMzAwMzsKKwl2YXIgUkdCTTdFbmNvZGluZyA9IDMwMDQ7CisJdmFyIFJH
Qk0xNkVuY29kaW5nID0gMzAwNTsKKwl2YXIgUkdCREVuY29kaW5nID0gMzAwNjsKKwl2YXIgQmFz
aWNEZXB0aFBhY2tpbmcgPSAzMjAwOworCXZhciBSR0JBRGVwdGhQYWNraW5nID0gMzIwMTsKKwor
CS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJ
ICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCXZhciBfTWF0
aCA9IHsKKworCQlERUcyUkFEOiBNYXRoLlBJIC8gMTgwLAorCQlSQUQyREVHOiAxODAgLyBNYXRo
LlBJLAorCisJCWdlbmVyYXRlVVVJRDogZnVuY3Rpb24gKCkgeworCisJCQkvLyBodHRwOi8vd3d3
LmJyb29mYS5jb20vVG9vbHMvTWF0aC51dWlkLmh0bQorCisJCQl2YXIgY2hhcnMgPSAnMDEyMzQ1
Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXon
LnNwbGl0KCAnJyApOworCQkJdmFyIHV1aWQgPSBuZXcgQXJyYXkoIDM2ICk7CisJCQl2YXIgcm5k
ID0gMCwgcjsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpIHsKKworCQkJCWZv
ciAoIHZhciBpID0gMDsgaSA8IDM2OyBpICsrICkgeworCisJCQkJCWlmICggaSA9PT0gOCB8fCBp
ID09PSAxMyB8fCBpID09PSAxOCB8fCBpID09PSAyMyApIHsKKworCQkJCQkJdXVpZFsgaSBdID0g
Jy0nOworCisJCQkJCX0gZWxzZSBpZiAoIGkgPT09IDE0ICkgeworCisJCQkJCQl1dWlkWyBpIF0g
PSAnNCc7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJaWYgKCBybmQgPD0gMHgwMiApIHJuZCA9
IDB4MjAwMDAwMCArICggTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMCApIHwgMDsKKwkJCQkJCXIg
PSBybmQgJiAweGY7CisJCQkJCQlybmQgPSBybmQgPj4gNDsKKwkJCQkJCXV1aWRbIGkgXSA9IGNo
YXJzWyAoIGkgPT09IDE5ICkgPyAoIHIgJiAweDMgKSB8IDB4OCA6IHIgXTsKKworCQkJCQl9CisK
KwkJCQl9CisKKwkJCQlyZXR1cm4gdXVpZC5qb2luKCAnJyApOworCisJCQl9OworCisJCX0oKSwK
KworCQljbGFtcDogZnVuY3Rpb24gKCB2YWx1ZSwgbWluLCBtYXggKSB7CisKKwkJCXJldHVybiBN
YXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB2YWx1ZSApICk7CisKKwkJfSwKKworCQkvLyBj
b21wdXRlIGV1Y2xpZGlhbiBtb2R1bG8gb2YgbSAlIG4KKwkJLy8gaHR0cHM6Ly9lbi53aWtpcGVk
aWEub3JnL3dpa2kvTW9kdWxvX29wZXJhdGlvbgorCisJCWV1Y2xpZGVhbk1vZHVsbzogZnVuY3Rp
b24gKCBuLCBtICkgeworCisJCQlyZXR1cm4gKCAoIG4gJSBtICkgKyBtICkgJSBtOworCisJCX0s
CisKKwkJLy8gTGluZWFyIG1hcHBpbmcgZnJvbSByYW5nZSA8YTEsIGEyPiB0byByYW5nZSA8YjEs
IGIyPgorCisJCW1hcExpbmVhcjogZnVuY3Rpb24gKCB4LCBhMSwgYTIsIGIxLCBiMiApIHsKKwor
CQkJcmV0dXJuIGIxICsgKCB4IC0gYTEgKSAqICggYjIgLSBiMSApIC8gKCBhMiAtIGExICk7CisK
KwkJfSwKKworCQkvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaW5lYXJfaW50ZXJw
b2xhdGlvbgorCisJCWxlcnA6IGZ1bmN0aW9uICggeCwgeSwgdCApIHsKKworCQkJcmV0dXJuICgg
MSAtIHQgKSAqIHggKyB0ICogeTsKKworCQl9LAorCisJCS8vIGh0dHA6Ly9lbi53aWtpcGVkaWEu
b3JnL3dpa2kvU21vb3Roc3RlcAorCisJCXNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBt
YXggKSB7CisKKwkJCWlmICggeCA8PSBtaW4gKSByZXR1cm4gMDsKKwkJCWlmICggeCA+PSBtYXgg
KSByZXR1cm4gMTsKKworCQkJeCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTsKKworCQkJ
cmV0dXJuIHggKiB4ICogKCAzIC0gMiAqIHggKTsKKworCQl9LAorCisJCXNtb290aGVyc3RlcDog
ZnVuY3Rpb24gKCB4LCBtaW4sIG1heCApIHsKKworCQkJaWYgKCB4IDw9IG1pbiApIHJldHVybiAw
OworCQkJaWYgKCB4ID49IG1heCApIHJldHVybiAxOworCisJCQl4ID0gKCB4IC0gbWluICkgLyAo
IG1heCAtIG1pbiApOworCisJCQlyZXR1cm4geCAqIHggKiB4ICogKCB4ICogKCB4ICogNiAtIDE1
ICkgKyAxMCApOworCisJCX0sCisKKwkJLy8gUmFuZG9tIGludGVnZXIgZnJvbSA8bG93LCBoaWdo
PiBpbnRlcnZhbAorCisJCXJhbmRJbnQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkgeworCisJCQly
ZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEg
KSApOworCisJCX0sCisKKwkJLy8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2
YWwKKworCQlyYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkgeworCisJCQlyZXR1cm4g
bG93ICsgTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyApOworCisJCX0sCisKKwkJLy8gUmFu
ZG9tIGZsb2F0IGZyb20gPC1yYW5nZS8yLCByYW5nZS8yPiBpbnRlcnZhbAorCisJCXJhbmRGbG9h
dFNwcmVhZDogZnVuY3Rpb24gKCByYW5nZSApIHsKKworCQkJcmV0dXJuIHJhbmdlICogKCAwLjUg
LSBNYXRoLnJhbmRvbSgpICk7CisKKwkJfSwKKworCQlkZWdUb1JhZDogZnVuY3Rpb24gKCBkZWdy
ZWVzICkgeworCisJCQlyZXR1cm4gZGVncmVlcyAqIF9NYXRoLkRFRzJSQUQ7CisKKwkJfSwKKwor
CQlyYWRUb0RlZzogZnVuY3Rpb24gKCByYWRpYW5zICkgeworCisJCQlyZXR1cm4gcmFkaWFucyAq
IF9NYXRoLlJBRDJERUc7CisKKwkJfSwKKworCQlpc1Bvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFs
dWUgKSB7CisKKwkJCXJldHVybiAoIHZhbHVlICYgKCB2YWx1ZSAtIDEgKSApID09PSAwICYmIHZh
bHVlICE9PSAwOworCisJCX0sCisKKwkJbmVhcmVzdFBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFs
dWUgKSB7CisKKwkJCXJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5yb3VuZCggTWF0aC5sb2coIHZh
bHVlICkgLyBNYXRoLkxOMiApICk7CisKKwkJfSwKKworCQluZXh0UG93ZXJPZlR3bzogZnVuY3Rp
b24gKCB2YWx1ZSApIHsKKworCQkJdmFsdWUgLS07CisJCQl2YWx1ZSB8PSB2YWx1ZSA+PiAxOwor
CQkJdmFsdWUgfD0gdmFsdWUgPj4gMjsKKwkJCXZhbHVlIHw9IHZhbHVlID4+IDQ7CisJCQl2YWx1
ZSB8PSB2YWx1ZSA+PiA4OworCQkJdmFsdWUgfD0gdmFsdWUgPj4gMTY7CisJCQl2YWx1ZSArKzsK
KworCQkJcmV0dXJuIHZhbHVlOworCisJCX0KKworCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIG1y
ZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9i
bG9nLnRoZWppdC5vcmcvCisJICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVy
LmNvbS8KKwkgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9i
bG9nCisJICovCisKKwlmdW5jdGlvbiBWZWN0b3IyKCB4LCB5ICkgeworCisJCXRoaXMueCA9IHgg
fHwgMDsKKwkJdGhpcy55ID0geSB8fCAwOworCisJfQorCisJT2JqZWN0LmRlZmluZVByb3BlcnRp
ZXMoIFZlY3RvcjIucHJvdG90eXBlLCB7CisKKwkJIndpZHRoIiA6IHsKKworCQkJZ2V0OiBmdW5j
dGlvbiAoKSB7CisKKwkJCQlyZXR1cm4gdGhpcy54OworCisJCQl9LAorCisJCQlzZXQ6IGZ1bmN0
aW9uICggdmFsdWUgKSB7CisKKwkJCQl0aGlzLnggPSB2YWx1ZTsKKworCQkJfQorCisJCX0sCisK
KwkJImhlaWdodCIgOiB7CisKKwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJcmV0dXJuIHRo
aXMueTsKKworCQkJfSwKKworCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJdGhp
cy55ID0gdmFsdWU7CisKKwkJCX0KKworCQl9CisKKwl9ICk7CisKKwlPYmplY3QuYXNzaWduKCBW
ZWN0b3IyLnByb3RvdHlwZSwgeworCisJCWlzVmVjdG9yMjogdHJ1ZSwKKworCQlzZXQ6IGZ1bmN0
aW9uICggeCwgeSApIHsKKworCQkJdGhpcy54ID0geDsKKwkJCXRoaXMueSA9IHk7CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHsK
KworCQkJdGhpcy54ID0gc2NhbGFyOworCQkJdGhpcy55ID0gc2NhbGFyOworCisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCXNldFg6IGZ1bmN0aW9uICggeCApIHsKKworCQkJdGhpcy54ID0g
eDsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRZOiBmdW5jdGlvbiAoIHkgKSB7
CisKKwkJCXRoaXMueSA9IHk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0Q29t
cG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHsKKworCQkJc3dpdGNoICggaW5kZXgg
KSB7CisKKwkJCQljYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhazsKKwkJCQljYXNlIDE6IHRo
aXMueSA9IHZhbHVlOyBicmVhazsKKwkJCQlkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRl
eCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApOworCisJCQl9CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJZ2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisJCQlz
d2l0Y2ggKCBpbmRleCApIHsKKworCQkJCWNhc2UgMDogcmV0dXJuIHRoaXMueDsKKwkJCQljYXNl
IDE6IHJldHVybiB0aGlzLnk7CisJCQkJZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXgg
aXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTsKKworCQkJfQorCisJCX0sCisKKwkJY2xvbmU6
IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngs
IHRoaXMueSApOworCisJCX0sCisKKwkJY29weTogZnVuY3Rpb24gKCB2ICkgeworCisJCQl0aGlz
LnggPSB2Lng7CisJCQl0aGlzLnkgPSB2Lnk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJYWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7CisKKwkJCWlmICggdyAhPT0gdW5kZWZpbmVkICkg
eworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFj
Y2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsK
KwkJCQlyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7CisKKwkJCX0KKworCQkJdGhpcy54
ICs9IHYueDsKKwkJCXRoaXMueSArPSB2Lnk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJYWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CisKKwkJCXRoaXMueCArPSBzOworCQkJdGhp
cy55ICs9IHM7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJYWRkVmVjdG9yczogZnVu
Y3Rpb24gKCBhLCBiICkgeworCisJCQl0aGlzLnggPSBhLnggKyBiLng7CisJCQl0aGlzLnkgPSBh
LnkgKyBiLnk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJYWRkU2NhbGVkVmVjdG9y
OiBmdW5jdGlvbiAoIHYsIHMgKSB7CisKKwkJCXRoaXMueCArPSB2LnggKiBzOworCQkJdGhpcy55
ICs9IHYueSAqIHM7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc3ViOiBmdW5jdGlv
biAoIHYsIHcgKSB7CisKKwkJCWlmICggdyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJY29uc29s
ZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3Vt
ZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsKKwkJCQlyZXR1cm4gdGhp
cy5zdWJWZWN0b3JzKCB2LCB3ICk7CisKKwkJCX0KKworCQkJdGhpcy54IC09IHYueDsKKwkJCXRo
aXMueSAtPSB2Lnk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc3ViU2NhbGFyOiBm
dW5jdGlvbiAoIHMgKSB7CisKKwkJCXRoaXMueCAtPSBzOworCQkJdGhpcy55IC09IHM7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkg
eworCisJCQl0aGlzLnggPSBhLnggLSBiLng7CisJCQl0aGlzLnkgPSBhLnkgLSBiLnk7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbXVsdGlwbHk6IGZ1bmN0aW9uICggdiApIHsKKwor
CQkJdGhpcy54ICo9IHYueDsKKwkJCXRoaXMueSAqPSB2Lnk7CisKKwkJCXJldHVybiB0aGlzOwor
CisJCX0sCisKKwkJbXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgeworCisJCQl0
aGlzLnggKj0gc2NhbGFyOworCQkJdGhpcy55ICo9IHNjYWxhcjsKKworCQkJcmV0dXJuIHRoaXM7
CisKKwkJfSwKKworCQlkaXZpZGU6IGZ1bmN0aW9uICggdiApIHsKKworCQkJdGhpcy54IC89IHYu
eDsKKwkJCXRoaXMueSAvPSB2Lnk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZGl2
aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHsKKworCQkJcmV0dXJuIHRoaXMubXVsdGlw
bHlTY2FsYXIoIDEgLyBzY2FsYXIgKTsKKworCQl9LAorCisJCW1pbjogZnVuY3Rpb24gKCB2ICkg
eworCisJCQl0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTsKKwkJCXRoaXMueSA9IE1h
dGgubWluKCB0aGlzLnksIHYueSApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCW1h
eDogZnVuY3Rpb24gKCB2ICkgeworCisJCQl0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2Lngg
KTsKKwkJCXRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApOworCisJCQlyZXR1cm4gdGhp
czsKKworCQl9LAorCisJCWNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkgeworCisJCQkvLyBh
c3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZQorCisJCQl0aGlzLnggPSBNYXRoLm1heCgg
bWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTsKKwkJCXRoaXMueSA9IE1hdGgubWF4
KCBtaW4ueSwgTWF0aC5taW4oIG1heC55LCB0aGlzLnkgKSApOworCisJCQlyZXR1cm4gdGhpczsK
KworCQl9LAorCisJCWNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBtaW4gPSBu
ZXcgVmVjdG9yMigpOworCQkJdmFyIG1heCA9IG5ldyBWZWN0b3IyKCk7CisKKwkJCXJldHVybiBm
dW5jdGlvbiBjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7CisKKwkJCQltaW4uc2V0KCBt
aW5WYWwsIG1pblZhbCApOworCQkJCW1heC5zZXQoIG1heFZhbCwgbWF4VmFsICk7CisKKwkJCQly
ZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJY2xh
bXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7CisKKwkJCXZhciBsZW5ndGggPSB0aGlz
Lmxlbmd0aCgpOworCisJCQlyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICku
bXVsdGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkg
KTsKKworCQl9LAorCisJCWZsb29yOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMueCA9IE1hdGgu
Zmxvb3IoIHRoaXMueCApOworCQkJdGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY2VpbDogZnVuY3Rpb24gKCkgeworCisJCQl0aGlz
LnggPSBNYXRoLmNlaWwoIHRoaXMueCApOworCQkJdGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkg
KTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlyb3VuZDogZnVuY3Rpb24gKCkgewor
CisJCQl0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTsKKwkJCXRoaXMueSA9IE1hdGgucm91
bmQoIHRoaXMueSApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXJvdW5kVG9aZXJv
OiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWls
KCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApOworCQkJdGhpcy55ID0gKCB0aGlzLnkg
PCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbmVnYXRlOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRo
aXMueCA9IC0gdGhpcy54OworCQkJdGhpcy55ID0gLSB0aGlzLnk7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJZG90OiBmdW5jdGlvbiAoIHYgKSB7CisKKwkJCXJldHVybiB0aGlzLngg
KiB2LnggKyB0aGlzLnkgKiB2Lnk7CisKKwkJfSwKKworCQlsZW5ndGhTcTogZnVuY3Rpb24gKCkg
eworCisJCQlyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55OworCisJCX0s
CisKKwkJbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBNYXRoLnNxcnQoIHRoaXMu
eCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSApOworCisJCX0sCisKKwkJbGVuZ3RoTWFuaGF0
dGFuOiBmdW5jdGlvbigpIHsKKworCQkJcmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGgu
YWJzKCB0aGlzLnkgKTsKKworCQl9LAorCisJCW5vcm1hbGl6ZTogZnVuY3Rpb24gKCkgeworCisJ
CQlyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApOworCisJCX0s
CisKKwkJYW5nbGU6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gY29tcHV0ZXMgdGhlIGFuZ2xlIGlu
IHJhZGlhbnMgd2l0aCByZXNwZWN0IHRvIHRoZSBwb3NpdGl2ZSB4LWF4aXMKKworCQkJdmFyIGFu
Z2xlID0gTWF0aC5hdGFuMiggdGhpcy55LCB0aGlzLnggKTsKKworCQkJaWYgKCBhbmdsZSA8IDAg
KSBhbmdsZSArPSAyICogTWF0aC5QSTsKKworCQkJcmV0dXJuIGFuZ2xlOworCisJCX0sCisKKwkJ
ZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkgeworCisJCQlyZXR1cm4gTWF0aC5zcXJ0KCB0aGlz
LmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTsKKworCQl9LAorCisJCWRpc3RhbmNlVG9TcXVhcmVk
OiBmdW5jdGlvbiAoIHYgKSB7CisKKwkJCXZhciBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlz
LnkgLSB2Lnk7CisJCQlyZXR1cm4gZHggKiBkeCArIGR5ICogZHk7CisKKwkJfSwKKworCQlkaXN0
YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7CisKKwkJCXJldHVybiBNYXRoLmFicygg
dGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICk7CisKKwkJfSwKKworCQlz
ZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkgeworCisJCQlyZXR1cm4gdGhpcy5ub3JtYWxp
emUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7CisKKwkJfSwKKworCQlsZXJwOiBmdW5jdGlv
biAoIHYsIGFscGhhICkgeworCisJCQl0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhh
OworCQkJdGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfSwKKworCQlsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkg
eworCisJCQlyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhcigg
YWxwaGEgKS5hZGQoIHYxICk7CisKKwkJfSwKKworCQllcXVhbHM6IGZ1bmN0aW9uICggdiApIHsK
KworCQkJcmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAp
OworCisJCX0sCisKKwkJZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CisK
KwkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisJCQl0aGlzLngg
PSBhcnJheVsgb2Zmc2V0IF07CisJCQl0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdOworCisJ
CQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9m
ZnNldCApIHsKKworCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKKwkJ
CWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisJCQlhcnJheVsgb2Zm
c2V0IF0gPSB0aGlzLng7CisJCQlhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55OworCisJCQly
ZXR1cm4gYXJyYXk7CisKKwkJfSwKKworCQlmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAo
IGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHsKKworCQkJaWYgKCBvZmZzZXQgIT09IHVuZGVm
aW5lZCApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMg
YmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7CisKKwkJCX0KKwor
CQkJdGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7CisJCQl0aGlzLnkgPSBhdHRyaWJ1
dGUuZ2V0WSggaW5kZXggKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlyb3RhdGVB
cm91bmQ6IGZ1bmN0aW9uICggY2VudGVyLCBhbmdsZSApIHsKKworCQkJdmFyIGMgPSBNYXRoLmNv
cyggYW5nbGUgKSwgcyA9IE1hdGguc2luKCBhbmdsZSApOworCisJCQl2YXIgeCA9IHRoaXMueCAt
IGNlbnRlci54OworCQkJdmFyIHkgPSB0aGlzLnkgLSBjZW50ZXIueTsKKworCQkJdGhpcy54ID0g
eCAqIGMgLSB5ICogcyArIGNlbnRlci54OworCQkJdGhpcy55ID0geCAqIHMgKyB5ICogYyArIGNl
bnRlci55OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBA
YXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgYWx0ZXJlZHEg
LyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICogQGF1dGhvciBzemltZWsgLyBodHRwczov
L2dpdGh1Yi5jb20vc3ppbWVrLworCSAqLworCisJdmFyIHRleHR1cmVJZCA9IDA7CisKKwlmdW5j
dGlvbiBUZXh0dXJlKCBpbWFnZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1p
bkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHsKKworCQlPYmpl
Y3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IHRleHR1cmVJZCArKyB9ICk7
CisKKwkJdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CisKKwkJdGhpcy5uYW1lID0g
Jyc7CisKKwkJdGhpcy5pbWFnZSA9IGltYWdlICE9PSB1bmRlZmluZWQgPyBpbWFnZSA6IFRleHR1
cmUuREVGQVVMVF9JTUFHRTsKKwkJdGhpcy5taXBtYXBzID0gW107CisKKwkJdGhpcy5tYXBwaW5n
ID0gbWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFwcGluZyA6IFRleHR1cmUuREVGQVVMVF9NQVBQ
SU5HOworCisJCXRoaXMud3JhcFMgPSB3cmFwUyAhPT0gdW5kZWZpbmVkID8gd3JhcFMgOiBDbGFt
cFRvRWRnZVdyYXBwaW5nOworCQl0aGlzLndyYXBUID0gd3JhcFQgIT09IHVuZGVmaW5lZCA/IHdy
YXBUIDogQ2xhbXBUb0VkZ2VXcmFwcGluZzsKKworCQl0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRl
ciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTGluZWFyRmlsdGVyOworCQl0aGlzLm1pbkZp
bHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTGluZWFyTWlwTWFw
TGluZWFyRmlsdGVyOworCisJCXRoaXMuYW5pc290cm9weSA9IGFuaXNvdHJvcHkgIT09IHVuZGVm
aW5lZCA/IGFuaXNvdHJvcHkgOiAxOworCisJCXRoaXMuZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRl
ZmluZWQgPyBmb3JtYXQgOiBSR0JBRm9ybWF0OworCQl0aGlzLnR5cGUgPSB0eXBlICE9PSB1bmRl
ZmluZWQgPyB0eXBlIDogVW5zaWduZWRCeXRlVHlwZTsKKworCQl0aGlzLm9mZnNldCA9IG5ldyBW
ZWN0b3IyKCAwLCAwICk7CisJCXRoaXMucmVwZWF0ID0gbmV3IFZlY3RvcjIoIDEsIDEgKTsKKwor
CQl0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHRydWU7CisJCXRoaXMucHJlbXVsdGlwbHlBbHBoYSA9
IGZhbHNlOworCQl0aGlzLmZsaXBZID0gdHJ1ZTsKKwkJdGhpcy51bnBhY2tBbGlnbm1lbnQgPSA0
OwkvLyB2YWxpZCB2YWx1ZXM6IDEsIDIsIDQsIDggKHNlZSBodHRwOi8vd3d3Lmtocm9ub3Mub3Jn
L29wZW5nbGVzL3Nkay9kb2NzL21hbi94aHRtbC9nbFBpeGVsU3RvcmVpLnhtbCkKKworCQkvLyBW
YWx1ZXMgb2YgZW5jb2RpbmcgIT09IFRIUkVFLkxpbmVhckVuY29kaW5nIG9ubHkgc3VwcG9ydGVk
IG9uIG1hcCwgZW52TWFwIGFuZCBlbWlzc2l2ZU1hcC4KKwkJLy8KKwkJLy8gQWxzbyBjaGFuZ2lu
ZyB0aGUgZW5jb2RpbmcgYWZ0ZXIgYWxyZWFkeSB1c2VkIGJ5IGEgTWF0ZXJpYWwgd2lsbCBub3Qg
YXV0b21hdGljYWxseSBtYWtlIHRoZSBNYXRlcmlhbAorCQkvLyB1cGRhdGUuICBZb3UgbmVlZCB0
byBleHBsaWNpdGx5IGNhbGwgTWF0ZXJpYWwubmVlZHNVcGRhdGUgdG8gdHJpZ2dlciBpdCB0byBy
ZWNvbXBpbGUuCisJCXRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZyAhPT0gdW5kZWZpbmVkID8gZW5j
b2RpbmcgOiBMaW5lYXJFbmNvZGluZzsKKworCQl0aGlzLnZlcnNpb24gPSAwOworCQl0aGlzLm9u
VXBkYXRlID0gbnVsbDsKKworCX0KKworCVRleHR1cmUuREVGQVVMVF9JTUFHRSA9IHVuZGVmaW5l
ZDsKKwlUZXh0dXJlLkRFRkFVTFRfTUFQUElORyA9IFVWTWFwcGluZzsKKworCU9iamVjdC5kZWZp
bmVQcm9wZXJ0eSggVGV4dHVyZS5wcm90b3R5cGUsICJuZWVkc1VwZGF0ZSIsIHsKKworCQlzZXQ6
IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCWlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZl
cnNpb24gKys7CisKKwkJfQorCisJfSApOworCisJT2JqZWN0LmFzc2lnbiggVGV4dHVyZS5wcm90
b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHsKKworCQljb25zdHJ1Y3RvcjogVGV4
dHVyZSwKKworCQlpc1RleHR1cmU6IHRydWUsCisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKwor
CQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOworCisJCX0sCisK
KwkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJCXRoaXMubmFtZSA9IHNvdXJjZS5u
YW1lOworCisJCQl0aGlzLmltYWdlID0gc291cmNlLmltYWdlOworCQkJdGhpcy5taXBtYXBzID0g
c291cmNlLm1pcG1hcHMuc2xpY2UoIDAgKTsKKworCQkJdGhpcy5tYXBwaW5nID0gc291cmNlLm1h
cHBpbmc7CisKKwkJCXRoaXMud3JhcFMgPSBzb3VyY2Uud3JhcFM7CisJCQl0aGlzLndyYXBUID0g
c291cmNlLndyYXBUOworCisJCQl0aGlzLm1hZ0ZpbHRlciA9IHNvdXJjZS5tYWdGaWx0ZXI7CisJ
CQl0aGlzLm1pbkZpbHRlciA9IHNvdXJjZS5taW5GaWx0ZXI7CisKKwkJCXRoaXMuYW5pc290cm9w
eSA9IHNvdXJjZS5hbmlzb3Ryb3B5OworCisJCQl0aGlzLmZvcm1hdCA9IHNvdXJjZS5mb3JtYXQ7
CisJCQl0aGlzLnR5cGUgPSBzb3VyY2UudHlwZTsKKworCQkJdGhpcy5vZmZzZXQuY29weSggc291
cmNlLm9mZnNldCApOworCQkJdGhpcy5yZXBlYXQuY29weSggc291cmNlLnJlcGVhdCApOworCisJ
CQl0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHNvdXJjZS5nZW5lcmF0ZU1pcG1hcHM7CisJCQl0aGlz
LnByZW11bHRpcGx5QWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbHlBbHBoYTsKKwkJCXRoaXMuZmxp
cFkgPSBzb3VyY2UuZmxpcFk7CisJCQl0aGlzLnVucGFja0FsaWdubWVudCA9IHNvdXJjZS51bnBh
Y2tBbGlnbm1lbnQ7CisJCQl0aGlzLmVuY29kaW5nID0gc291cmNlLmVuY29kaW5nOworCisJCQly
ZXR1cm4gdGhpczsKKworCQl9LAorCisJCXRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkgeworCisJ
CQlpZiAoIG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdICE9PSB1bmRlZmluZWQgKSB7CisKKwkJ
CQlyZXR1cm4gbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF07CisKKwkJCX0KKworCQkJZnVuY3Rp
b24gZ2V0RGF0YVVSTCggaW1hZ2UgKSB7CisKKwkJCQl2YXIgY2FudmFzOworCisJCQkJaWYgKCBp
bWFnZS50b0RhdGFVUkwgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQljYW52YXMgPSBpbWFnZTsK
KworCQkJCX0gZWxzZSB7CisKKwkJCQkJY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5T
KCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7CisJCQkJCWNhbnZh
cy53aWR0aCA9IGltYWdlLndpZHRoOworCQkJCQljYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0
OworCisJCQkJCWNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICkuZHJhd0ltYWdlKCBpbWFnZSwgMCwg
MCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApOworCisJCQkJfQorCisJCQkJaWYgKCBjYW52
YXMud2lkdGggPiAyMDQ4IHx8IGNhbnZhcy5oZWlnaHQgPiAyMDQ4ICkgeworCisJCQkJCXJldHVy
biBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvanBlZycsIDAuNiApOworCisJCQkJfSBlbHNlIHsK
KworCQkJCQlyZXR1cm4gY2FudmFzLnRvRGF0YVVSTCggJ2ltYWdlL3BuZycgKTsKKworCQkJCX0K
KworCQkJfQorCisJCQl2YXIgb3V0cHV0ID0geworCQkJCW1ldGFkYXRhOiB7CisJCQkJCXZlcnNp
b246IDQuNSwKKwkJCQkJdHlwZTogJ1RleHR1cmUnLAorCQkJCQlnZW5lcmF0b3I6ICdUZXh0dXJl
LnRvSlNPTicKKwkJCQl9LAorCisJCQkJdXVpZDogdGhpcy51dWlkLAorCQkJCW5hbWU6IHRoaXMu
bmFtZSwKKworCQkJCW1hcHBpbmc6IHRoaXMubWFwcGluZywKKworCQkJCXJlcGVhdDogWyB0aGlz
LnJlcGVhdC54LCB0aGlzLnJlcGVhdC55IF0sCisJCQkJb2Zmc2V0OiBbIHRoaXMub2Zmc2V0Lngs
IHRoaXMub2Zmc2V0LnkgXSwKKwkJCQl3cmFwOiBbIHRoaXMud3JhcFMsIHRoaXMud3JhcFQgXSwK
KworCQkJCW1pbkZpbHRlcjogdGhpcy5taW5GaWx0ZXIsCisJCQkJbWFnRmlsdGVyOiB0aGlzLm1h
Z0ZpbHRlciwKKwkJCQlhbmlzb3Ryb3B5OiB0aGlzLmFuaXNvdHJvcHksCisKKwkJCQlmbGlwWTog
dGhpcy5mbGlwWQorCQkJfTsKKworCQkJaWYgKCB0aGlzLmltYWdlICE9PSB1bmRlZmluZWQgKSB7
CisKKwkJCQkvLyBUT0RPOiBNb3ZlIHRvIFRIUkVFLkltYWdlCisKKwkJCQl2YXIgaW1hZ2UgPSB0
aGlzLmltYWdlOworCisJCQkJaWYgKCBpbWFnZS51dWlkID09PSB1bmRlZmluZWQgKSB7CisKKwkJ
CQkJaW1hZ2UudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOyAvLyBVR0gKKworCQkJCX0KKwor
CQkJCWlmICggbWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkgeworCisJ
CQkJCW1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPSB7CisJCQkJCQl1dWlkOiBpbWFnZS51dWlk
LAorCQkJCQkJdXJsOiBnZXREYXRhVVJMKCBpbWFnZSApCisJCQkJCX07CisKKwkJCQl9CisKKwkJ
CQlvdXRwdXQuaW1hZ2UgPSBpbWFnZS51dWlkOworCisJCQl9CisKKwkJCW1ldGEudGV4dHVyZXNb
IHRoaXMudXVpZCBdID0gb3V0cHV0OworCisJCQlyZXR1cm4gb3V0cHV0OworCisJCX0sCisKKwkJ
ZGlzcG9zZTogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTog
J2Rpc3Bvc2UnIH0gKTsKKworCQl9LAorCisJCXRyYW5zZm9ybVV2OiBmdW5jdGlvbiAoIHV2ICkg
eworCisJCQlpZiAoIHRoaXMubWFwcGluZyAhPT0gVVZNYXBwaW5nICkgcmV0dXJuOworCisJCQl1
di5tdWx0aXBseSggdGhpcy5yZXBlYXQgKTsKKwkJCXV2LmFkZCggdGhpcy5vZmZzZXQgKTsKKwor
CQkJaWYgKCB1di54IDwgMCB8fCB1di54ID4gMSApIHsKKworCQkJCXN3aXRjaCAoIHRoaXMud3Jh
cFMgKSB7CisKKwkJCQkJY2FzZSBSZXBlYXRXcmFwcGluZzoKKworCQkJCQkJdXYueCA9IHV2Lngg
LSBNYXRoLmZsb29yKCB1di54ICk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIENsYW1wVG9F
ZGdlV3JhcHBpbmc6CisKKwkJCQkJCXV2LnggPSB1di54IDwgMCA/IDAgOiAxOworCQkJCQkJYnJl
YWs7CisKKwkJCQkJY2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOgorCisJCQkJCQlpZiAoIE1h
dGguYWJzKCBNYXRoLmZsb29yKCB1di54ICkgJSAyICkgPT09IDEgKSB7CisKKwkJCQkJCQl1di54
ID0gTWF0aC5jZWlsKCB1di54ICkgLSB1di54OworCisJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJ
dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7CisKKwkJCQkJCX0KKwkJCQkJCWJyZWFr
OworCisJCQkJfQorCisJCQl9CisKKwkJCWlmICggdXYueSA8IDAgfHwgdXYueSA+IDEgKSB7CisK
KwkJCQlzd2l0Y2ggKCB0aGlzLndyYXBUICkgeworCisJCQkJCWNhc2UgUmVwZWF0V3JhcHBpbmc6
CisKKwkJCQkJCXV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApOworCQkJCQkJYnJlYWs7
CisKKwkJCQkJY2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOgorCisJCQkJCQl1di55ID0gdXYueSA8
IDAgPyAwIDogMTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTWlycm9yZWRSZXBlYXRXcmFw
cGluZzoKKworCQkJCQkJaWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueSApICUgMiApID09
PSAxICkgeworCisJCQkJCQkJdXYueSA9IE1hdGguY2VpbCggdXYueSApIC0gdXYueTsKKworCQkJ
CQkJfSBlbHNlIHsKKworCQkJCQkJCXV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApOwor
CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCX0KKworCQkJfQorCisJCQlpZiAoIHRoaXMu
ZmxpcFkgKSB7CisKKwkJCQl1di55ID0gMSAtIHV2Lnk7CisKKwkJCX0KKworCQl9CisKKwl9ICk7
CisKKwkvKioKKwkgKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50
LmNvLnVrLworCSAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvCisJ
ICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KKwkgKiBAYXV0aG9y
IGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tLworCSAqIEBhdXRob3IgV2VzdExhbmds
ZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorCSAqLworCisJZnVuY3Rpb24gVmVj
dG9yNCggeCwgeSwgeiwgdyApIHsKKworCQl0aGlzLnggPSB4IHx8IDA7CisJCXRoaXMueSA9IHkg
fHwgMDsKKwkJdGhpcy56ID0geiB8fCAwOworCQl0aGlzLncgPSAoIHcgIT09IHVuZGVmaW5lZCAp
ID8gdyA6IDE7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBWZWN0b3I0LnByb3RvdHlwZSwgewor
CisJCWlzVmVjdG9yNDogdHJ1ZSwKKworCQlzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHsK
KworCQkJdGhpcy54ID0geDsKKwkJCXRoaXMueSA9IHk7CisJCQl0aGlzLnogPSB6OworCQkJdGhp
cy53ID0gdzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRTY2FsYXI6IGZ1bmN0
aW9uICggc2NhbGFyICkgeworCisJCQl0aGlzLnggPSBzY2FsYXI7CisJCQl0aGlzLnkgPSBzY2Fs
YXI7CisJCQl0aGlzLnogPSBzY2FsYXI7CisJCQl0aGlzLncgPSBzY2FsYXI7CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0sCisKKwkJc2V0WDogZnVuY3Rpb24gKCB4ICkgeworCisJCQl0aGlzLngg
PSB4OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldFk6IGZ1bmN0aW9uICggeSAp
IHsKKworCQkJdGhpcy55ID0geTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRa
OiBmdW5jdGlvbiAoIHogKSB7CisKKwkJCXRoaXMueiA9IHo7CisKKwkJCXJldHVybiB0aGlzOwor
CisJCX0sCisKKwkJc2V0VzogZnVuY3Rpb24gKCB3ICkgeworCisJCQl0aGlzLncgPSB3OworCisJ
CQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRl
eCwgdmFsdWUgKSB7CisKKwkJCXN3aXRjaCAoIGluZGV4ICkgeworCisJCQkJY2FzZSAwOiB0aGlz
LnggPSB2YWx1ZTsgYnJlYWs7CisJCQkJY2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7CisJ
CQkJY2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7CisJCQkJY2FzZSAzOiB0aGlzLncgPSB2
YWx1ZTsgYnJlYWs7CisJCQkJZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0
IG9mIHJhbmdlOiAnICsgaW5kZXggKTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9
LAorCisJCWdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHsKKworCQkJc3dpdGNoICgg
aW5kZXggKSB7CisKKwkJCQljYXNlIDA6IHJldHVybiB0aGlzLng7CisJCQkJY2FzZSAxOiByZXR1
cm4gdGhpcy55OworCQkJCWNhc2UgMjogcmV0dXJuIHRoaXMuejsKKwkJCQljYXNlIDM6IHJldHVy
biB0aGlzLnc7CisJCQkJZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9m
IHJhbmdlOiAnICsgaW5kZXggKTsKKworCQkJfQorCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9u
ICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwg
dGhpcy56LCB0aGlzLncgKTsKKworCQl9LAorCisJCWNvcHk6IGZ1bmN0aW9uICggdiApIHsKKwor
CQkJdGhpcy54ID0gdi54OworCQkJdGhpcy55ID0gdi55OworCQkJdGhpcy56ID0gdi56OworCQkJ
dGhpcy53ID0gKCB2LncgIT09IHVuZGVmaW5lZCApID8gdi53IDogMTsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfSwKKworCQlhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHsKKworCQkJaWYgKCB3ICE9
PSB1bmRlZmluZWQgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuYWRk
KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiAp
IGluc3RlYWQuJyApOworCQkJCXJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTsKKworCQkJ
fQorCisJCQl0aGlzLnggKz0gdi54OworCQkJdGhpcy55ICs9IHYueTsKKwkJCXRoaXMueiArPSB2
Lno7CisJCQl0aGlzLncgKz0gdi53OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWFk
ZFNjYWxhcjogZnVuY3Rpb24gKCBzICkgeworCisJCQl0aGlzLnggKz0gczsKKwkJCXRoaXMueSAr
PSBzOworCQkJdGhpcy56ICs9IHM7CisJCQl0aGlzLncgKz0gczsKKworCQkJcmV0dXJuIHRoaXM7
CisKKwkJfSwKKworCQlhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CisKKwkJCXRoaXMu
eCA9IGEueCArIGIueDsKKwkJCXRoaXMueSA9IGEueSArIGIueTsKKwkJCXRoaXMueiA9IGEueiAr
IGIuejsKKwkJCXRoaXMudyA9IGEudyArIGIudzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQlhZGRTY2FsZWRWZWN0b3I6IGZ1bmN0aW9uICggdiwgcyApIHsKKworCQkJdGhpcy54ICs9
IHYueCAqIHM7CisJCQl0aGlzLnkgKz0gdi55ICogczsKKwkJCXRoaXMueiArPSB2LnogKiBzOwor
CQkJdGhpcy53ICs9IHYudyAqIHM7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc3Vi
OiBmdW5jdGlvbiAoIHYsIHcgKSB7CisKKwkJCWlmICggdyAhPT0gdW5kZWZpbmVkICkgeworCisJ
CQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMg
b25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsKKwkJCQly
ZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7CisKKwkJCX0KKworCQkJdGhpcy54IC09IHYu
eDsKKwkJCXRoaXMueSAtPSB2Lnk7CisJCQl0aGlzLnogLT0gdi56OworCQkJdGhpcy53IC09IHYu
dzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzdWJTY2FsYXI6IGZ1bmN0aW9uICgg
cyApIHsKKworCQkJdGhpcy54IC09IHM7CisJCQl0aGlzLnkgLT0gczsKKwkJCXRoaXMueiAtPSBz
OworCQkJdGhpcy53IC09IHM7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc3ViVmVj
dG9yczogZnVuY3Rpb24gKCBhLCBiICkgeworCisJCQl0aGlzLnggPSBhLnggLSBiLng7CisJCQl0
aGlzLnkgPSBhLnkgLSBiLnk7CisJCQl0aGlzLnogPSBhLnogLSBiLno7CisJCQl0aGlzLncgPSBh
LncgLSBiLnc7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbXVsdGlwbHlTY2FsYXI6
IGZ1bmN0aW9uICggc2NhbGFyICkgeworCisJCQl0aGlzLnggKj0gc2NhbGFyOworCQkJdGhpcy55
ICo9IHNjYWxhcjsKKwkJCXRoaXMueiAqPSBzY2FsYXI7CisJCQl0aGlzLncgKj0gc2NhbGFyOwor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBt
ICkgeworCisJCQl2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMueiwgdyA9IHRo
aXMudzsKKwkJCXZhciBlID0gbS5lbGVtZW50czsKKworCQkJdGhpcy54ID0gZVsgMCBdICogeCAr
IGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7CisJCQl0aGlzLnkgPSBlWyAx
IF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHogKyBlWyAxMyBdICogdzsKKwkJCXRoaXMu
eiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHogKyBlWyAxNCBdICogdzsK
KwkJCXRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAx
NSBdICogdzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlkaXZpZGVTY2FsYXI6IGZ1
bmN0aW9uICggc2NhbGFyICkgeworCisJCQlyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAv
IHNjYWxhciApOworCisJCX0sCisKKwkJc2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb246IGZ1bmN0
aW9uICggcSApIHsKKworCQkJLy8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMv
Z2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL3F1YXRlcm5pb25Ub0FuZ2xlL2luZGV4Lmh0
bQorCisJCQkvLyBxIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZAorCisJCQl0aGlzLncgPSAy
ICogTWF0aC5hY29zKCBxLncgKTsKKworCQkJdmFyIHMgPSBNYXRoLnNxcnQoIDEgLSBxLncgKiBx
LncgKTsKKworCQkJaWYgKCBzIDwgMC4wMDAxICkgeworCisJCQkJIHRoaXMueCA9IDE7CisJCQkJ
IHRoaXMueSA9IDA7CisJCQkJIHRoaXMueiA9IDA7CisKKwkJCX0gZWxzZSB7CisKKwkJCQkgdGhp
cy54ID0gcS54IC8gczsKKwkJCQkgdGhpcy55ID0gcS55IC8gczsKKwkJCQkgdGhpcy56ID0gcS56
IC8gczsKKworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldEF4aXNBbmds
ZUZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtICkgeworCisJCQkvLyBodHRwOi8vd3d3
LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMv
bWF0cml4VG9BbmdsZS9pbmRleC5odG0KKworCQkJLy8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9m
IG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZCkKKworCQkJdmFyIGFu
Z2xlLCB4LCB5LCB6LAkJLy8gdmFyaWFibGVzIGZvciByZXN1bHQKKwkJCQllcHNpbG9uID0gMC4w
MSwJCS8vIG1hcmdpbiB0byBhbGxvdyBmb3Igcm91bmRpbmcgZXJyb3JzCisJCQkJZXBzaWxvbjIg
PSAwLjEsCQkvLyBtYXJnaW4gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAwIGFuZCAxODAgZGVncmVl
cworCisJCQkJdGUgPSBtLmVsZW1lbnRzLAorCisJCQkJbTExID0gdGVbIDAgXSwgbTEyID0gdGVb
IDQgXSwgbTEzID0gdGVbIDggXSwKKwkJCQltMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBt
MjMgPSB0ZVsgOSBdLAorCQkJCW0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRl
WyAxMCBdOworCisJCQlpZiAoICggTWF0aC5hYnMoIG0xMiAtIG0yMSApIDwgZXBzaWxvbiApICYm
CisJCQkgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmCisJCQkgICAg
ICggTWF0aC5hYnMoIG0yMyAtIG0zMiApIDwgZXBzaWxvbiApICkgeworCisJCQkJLy8gc2luZ3Vs
YXJpdHkgZm91bmQKKwkJCQkvLyBmaXJzdCBjaGVjayBmb3IgaWRlbnRpdHkgbWF0cml4IHdoaWNo
IG11c3QgaGF2ZSArMSBmb3IgYWxsIHRlcm1zCisJCQkJLy8gaW4gbGVhZGluZyBkaWFnb25hbCBh
bmQgemVybyBpbiBvdGhlciB0ZXJtcworCisJCQkJaWYgKCAoIE1hdGguYWJzKCBtMTIgKyBtMjEg
KSA8IGVwc2lsb24yICkgJiYKKwkJCQkgICAgICggTWF0aC5hYnMoIG0xMyArIG0zMSApIDwgZXBz
aWxvbjIgKSAmJgorCQkJCSAgICAgKCBNYXRoLmFicyggbTIzICsgbTMyICkgPCBlcHNpbG9uMiAp
ICYmCisJCQkJICAgICAoIE1hdGguYWJzKCBtMTEgKyBtMjIgKyBtMzMgLSAzICkgPCBlcHNpbG9u
MiApICkgeworCisJCQkJCS8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNv
IGFuZ2xlID0gMAorCisJCQkJCXRoaXMuc2V0KCAxLCAwLCAwLCAwICk7CisKKwkJCQkJcmV0dXJu
IHRoaXM7IC8vIHplcm8gYW5nbGUsIGFyYml0cmFyeSBheGlzCisKKwkJCQl9CisKKwkJCQkvLyBv
dGhlcndpc2UgdGhpcyBzaW5ndWxhcml0eSBpcyBhbmdsZSA9IDE4MAorCisJCQkJYW5nbGUgPSBN
YXRoLlBJOworCisJCQkJdmFyIHh4ID0gKCBtMTEgKyAxICkgLyAyOworCQkJCXZhciB5eSA9ICgg
bTIyICsgMSApIC8gMjsKKwkJCQl2YXIgenogPSAoIG0zMyArIDEgKSAvIDI7CisJCQkJdmFyIHh5
ID0gKCBtMTIgKyBtMjEgKSAvIDQ7CisJCQkJdmFyIHh6ID0gKCBtMTMgKyBtMzEgKSAvIDQ7CisJ
CQkJdmFyIHl6ID0gKCBtMjMgKyBtMzIgKSAvIDQ7CisKKwkJCQlpZiAoICggeHggPiB5eSApICYm
ICggeHggPiB6eiApICkgeworCisJCQkJCS8vIG0xMSBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0
ZXJtCisKKwkJCQkJaWYgKCB4eCA8IGVwc2lsb24gKSB7CisKKwkJCQkJCXggPSAwOworCQkJCQkJ
eSA9IDAuNzA3MTA2NzgxOworCQkJCQkJeiA9IDAuNzA3MTA2NzgxOworCisJCQkJCX0gZWxzZSB7
CisKKwkJCQkJCXggPSBNYXRoLnNxcnQoIHh4ICk7CisJCQkJCQl5ID0geHkgLyB4OworCQkJCQkJ
eiA9IHh6IC8geDsKKworCQkJCQl9CisKKwkJCQl9IGVsc2UgaWYgKCB5eSA+IHp6ICkgeworCisJ
CQkJCS8vIG0yMiBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtCisKKwkJCQkJaWYgKCB5eSA8
IGVwc2lsb24gKSB7CisKKwkJCQkJCXggPSAwLjcwNzEwNjc4MTsKKwkJCQkJCXkgPSAwOworCQkJ
CQkJeiA9IDAuNzA3MTA2NzgxOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCXkgPSBNYXRoLnNx
cnQoIHl5ICk7CisJCQkJCQl4ID0geHkgLyB5OworCQkJCQkJeiA9IHl6IC8geTsKKworCQkJCQl9
CisKKwkJCQl9IGVsc2UgeworCisJCQkJCS8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0
ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXMKKworCQkJCQlpZiAoIHp6IDwgZXBzaWxvbiApIHsK
KworCQkJCQkJeCA9IDAuNzA3MTA2NzgxOworCQkJCQkJeSA9IDAuNzA3MTA2NzgxOworCQkJCQkJ
eiA9IDA7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJeiA9IE1hdGguc3FydCggenogKTsKKwkJ
CQkJCXggPSB4eiAvIHo7CisJCQkJCQl5ID0geXogLyB6OworCisJCQkJCX0KKworCQkJCX0KKwor
CQkJCXRoaXMuc2V0KCB4LCB5LCB6LCBhbmdsZSApOworCisJCQkJcmV0dXJuIHRoaXM7IC8vIHJl
dHVybiAxODAgZGVnIHJvdGF0aW9uCisKKwkJCX0KKworCQkJLy8gYXMgd2UgaGF2ZSByZWFjaGVk
IGhlcmUgdGhlcmUgYXJlIG5vIHNpbmd1bGFyaXRpZXMgc28gd2UgY2FuIGhhbmRsZSBub3JtYWxs
eQorCisJCQl2YXIgcyA9IE1hdGguc3FydCggKCBtMzIgLSBtMjMgKSAqICggbTMyIC0gbTIzICkg
KworCQkJICAgICAgICAgICAgICAgICAgICggbTEzIC0gbTMxICkgKiAoIG0xMyAtIG0zMSApICsK
KwkJCSAgICAgICAgICAgICAgICAgICAoIG0yMSAtIG0xMiApICogKCBtMjEgLSBtMTIgKSApOyAv
LyB1c2VkIHRvIG5vcm1hbGl6ZQorCisJCQlpZiAoIE1hdGguYWJzKCBzICkgPCAwLjAwMSApIHMg
PSAxOworCisJCQkvLyBwcmV2ZW50IGRpdmlkZSBieSB6ZXJvLCBzaG91bGQgbm90IGhhcHBlbiBp
ZiBtYXRyaXggaXMgb3J0aG9nb25hbCBhbmQgc2hvdWxkIGJlCisJCQkvLyBjYXVnaHQgYnkgc2lu
Z3VsYXJpdHkgdGVzdCBhYm92ZSwgYnV0IEkndmUgbGVmdCBpdCBpbiBqdXN0IGluIGNhc2UKKwor
CQkJdGhpcy54ID0gKCBtMzIgLSBtMjMgKSAvIHM7CisJCQl0aGlzLnkgPSAoIG0xMyAtIG0zMSAp
IC8gczsKKwkJCXRoaXMueiA9ICggbTIxIC0gbTEyICkgLyBzOworCQkJdGhpcy53ID0gTWF0aC5h
Y29zKCAoIG0xMSArIG0yMiArIG0zMyAtIDEgKSAvIDIgKTsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQltaW46IGZ1bmN0aW9uICggdiApIHsKKworCQkJdGhpcy54ID0gTWF0aC5taW4o
IHRoaXMueCwgdi54ICk7CisJCQl0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTsKKwkJ
CXRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApOworCQkJdGhpcy53ID0gTWF0aC5taW4o
IHRoaXMudywgdi53ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbWF4OiBmdW5j
dGlvbiAoIHYgKSB7CisKKwkJCXRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApOworCQkJ
dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7CisJCQl0aGlzLnogPSBNYXRoLm1heCgg
dGhpcy56LCB2LnogKTsKKwkJCXRoaXMudyA9IE1hdGgubWF4KCB0aGlzLncsIHYudyApOworCisJ
CQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkg
eworCisJCQkvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZQorCisJCQl0aGlzLngg
PSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTsKKwkJCXRoaXMu
eSA9IE1hdGgubWF4KCBtaW4ueSwgTWF0aC5taW4oIG1heC55LCB0aGlzLnkgKSApOworCQkJdGhp
cy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7CisJCQl0
aGlzLncgPSBNYXRoLm1heCggbWluLncsIE1hdGgubWluKCBtYXgudywgdGhpcy53ICkgKTsKKwor
CQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljbGFtcFNjYWxhcjogZnVuY3Rpb24gKCkgewor
CisJCQl2YXIgbWluLCBtYXg7CisKKwkJCXJldHVybiBmdW5jdGlvbiBjbGFtcFNjYWxhciggbWlu
VmFsLCBtYXhWYWwgKSB7CisKKwkJCQlpZiAoIG1pbiA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJ
CW1pbiA9IG5ldyBWZWN0b3I0KCk7CisJCQkJCW1heCA9IG5ldyBWZWN0b3I0KCk7CisKKwkJCQl9
CisKKwkJCQltaW4uc2V0KCBtaW5WYWwsIG1pblZhbCwgbWluVmFsLCBtaW5WYWwgKTsKKwkJCQlt
YXguc2V0KCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTsKKworCQkJCXJldHVybiB0
aGlzLmNsYW1wKCBtaW4sIG1heCApOworCisJCQl9OworCisJCX0oKSwKKworCQljbGFtcExlbmd0
aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHsKKworCQkJdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3Ro
KCk7CisKKwkJCXJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBs
eVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApOworCisJ
CX0sCisKKwkJZmxvb3I6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy54ID0gTWF0aC5mbG9vcigg
dGhpcy54ICk7CisJCQl0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTsKKwkJCXRoaXMueiA9
IE1hdGguZmxvb3IoIHRoaXMueiApOworCQkJdGhpcy53ID0gTWF0aC5mbG9vciggdGhpcy53ICk7
CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY2VpbDogZnVuY3Rpb24gKCkgeworCisJ
CQl0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApOworCQkJdGhpcy55ID0gTWF0aC5jZWlsKCB0
aGlzLnkgKTsKKwkJCXRoaXMueiA9IE1hdGguY2VpbCggdGhpcy56ICk7CisJCQl0aGlzLncgPSBN
YXRoLmNlaWwoIHRoaXMudyApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXJvdW5k
OiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApOworCQkJ
dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7CisJCQl0aGlzLnogPSBNYXRoLnJvdW5kKCB0
aGlzLnogKTsKKwkJCXRoaXMudyA9IE1hdGgucm91bmQoIHRoaXMudyApOworCisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCXJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMu
eCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRo
aXMueCApOworCQkJdGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSAp
IDogTWF0aC5mbG9vciggdGhpcy55ICk7CisJCQl0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1h
dGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTsKKwkJCXRoaXMudyA9ICgg
dGhpcy53IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLncgKSA6IE1hdGguZmxvb3IoIHRoaXMudyAp
OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCW5lZ2F0ZTogZnVuY3Rpb24gKCkgewor
CisJCQl0aGlzLnggPSAtIHRoaXMueDsKKwkJCXRoaXMueSA9IC0gdGhpcy55OworCQkJdGhpcy56
ID0gLSB0aGlzLno7CisJCQl0aGlzLncgPSAtIHRoaXMudzsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQlkb3Q6IGZ1bmN0aW9uICggdiApIHsKKworCQkJcmV0dXJuIHRoaXMueCAqIHYu
eCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYueiArIHRoaXMudyAqIHYudzsKKworCQl9LAor
CisJCWxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB0aGlzLnggKiB0aGlzLngg
KyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLnc7CisK
KwkJfSwKKworCQlsZW5ndGg6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIE1hdGguc3FydCgg
dGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhp
cy53ICogdGhpcy53ICk7CisKKwkJfSwKKworCQlsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgp
IHsKKworCQkJcmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSAr
IE1hdGguYWJzKCB0aGlzLnogKSArIE1hdGguYWJzKCB0aGlzLncgKTsKKworCQl9LAorCisJCW5v
cm1hbGl6ZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRo
aXMubGVuZ3RoKCkgfHwgMSApOworCisJCX0sCisKKwkJc2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxl
bmd0aCApIHsKKworCQkJcmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxl
bmd0aCApOworCisJCX0sCisKKwkJbGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHsKKworCQkJ
dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTsKKwkJCXRoaXMueSArPSAoIHYueSAt
IHRoaXMueSApICogYWxwaGE7CisJCQl0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhh
OworCQkJdGhpcy53ICs9ICggdi53IC0gdGhpcy53ICkgKiBhbHBoYTsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfSwKKworCQlsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkg
eworCisJCQlyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhcigg
YWxwaGEgKS5hZGQoIHYxICk7CisKKwkJfSwKKworCQllcXVhbHM6IGZ1bmN0aW9uICggdiApIHsK
KworCQkJcmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAm
JiAoIHYueiA9PT0gdGhpcy56ICkgJiYgKCB2LncgPT09IHRoaXMudyApICk7CisKKwkJfSwKKwor
CQlmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKKworCQkJaWYgKCBvZmZz
ZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CisKKwkJCXRoaXMueCA9IGFycmF5WyBvZmZz
ZXQgXTsKKwkJCXRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07CisJCQl0aGlzLnogPSBhcnJh
eVsgb2Zmc2V0ICsgMiBdOworCQkJdGhpcy53ID0gYXJyYXlbIG9mZnNldCArIDMgXTsKKworCQkJ
cmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQl0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZz
ZXQgKSB7CisKKwkJCWlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107CisJCQlp
ZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKKworCQkJYXJyYXlbIG9mZnNl
dCBdID0gdGhpcy54OworCQkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTsKKwkJCWFycmF5
WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7CisJCQlhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy53
OworCisJCQlyZXR1cm4gYXJyYXk7CisKKwkJfSwKKworCQlmcm9tQnVmZmVyQXR0cmlidXRlOiBm
dW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHsKKworCQkJaWYgKCBvZmZzZXQg
IT09IHVuZGVmaW5lZCApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IG9m
ZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7CisK
KwkJCX0KKworCQkJdGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7CisJCQl0aGlzLnkg
PSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTsKKwkJCXRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBp
bmRleCApOworCQkJdGhpcy53ID0gYXR0cmlidXRlLmdldFcoIGluZGV4ICk7CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3Igc3ppbWVrIC8gaHR0
cHM6Ly9naXRodWIuY29tL3N6aW1lay8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2Fs
dGVyZWRxdWFsaWEuY29tLworCSAqIEBhdXRob3IgTWFyaXVzIEtpbnRlbCAvIGh0dHBzOi8vZ2l0
aHViLmNvbS9raW50ZWwKKwkgKi8KKworCS8qCisJIEluIG9wdGlvbnMsIHdlIGNhbiBzcGVjaWZ5
OgorCSAqIFRleHR1cmUgcGFyYW1ldGVycyBmb3IgYW4gYXV0by1nZW5lcmF0ZWQgdGFyZ2V0IHRl
eHR1cmUKKwkgKiBkZXB0aEJ1ZmZlci9zdGVuY2lsQnVmZmVyOiBCb29sZWFucyB0byBpbmRpY2F0
ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgdGhlc2UgYnVmZmVycworCSovCisJZnVuY3Rpb24gV2Vi
R0xSZW5kZXJUYXJnZXQoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7CisKKwkJdGhpcy51dWlk
ID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CisKKwkJdGhpcy53aWR0aCA9IHdpZHRoOworCQl0aGlz
LmhlaWdodCA9IGhlaWdodDsKKworCQl0aGlzLnNjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwg
d2lkdGgsIGhlaWdodCApOworCQl0aGlzLnNjaXNzb3JUZXN0ID0gZmFsc2U7CisKKwkJdGhpcy52
aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7CisKKwkJb3B0aW9u
cyA9IG9wdGlvbnMgfHwge307CisKKwkJaWYgKCBvcHRpb25zLm1pbkZpbHRlciA9PT0gdW5kZWZp
bmVkICkgb3B0aW9ucy5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CisKKwkJdGhpcy50ZXh0dXJl
ID0gbmV3IFRleHR1cmUoIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvcHRpb25zLndyYXBTLCBvcHRp
b25zLndyYXBULCBvcHRpb25zLm1hZ0ZpbHRlciwgb3B0aW9ucy5taW5GaWx0ZXIsIG9wdGlvbnMu
Zm9ybWF0LCBvcHRpb25zLnR5cGUsIG9wdGlvbnMuYW5pc290cm9weSwgb3B0aW9ucy5lbmNvZGlu
ZyApOworCisJCXRoaXMuZGVwdGhCdWZmZXIgPSBvcHRpb25zLmRlcHRoQnVmZmVyICE9PSB1bmRl
ZmluZWQgPyBvcHRpb25zLmRlcHRoQnVmZmVyIDogdHJ1ZTsKKwkJdGhpcy5zdGVuY2lsQnVmZmVy
ID0gb3B0aW9ucy5zdGVuY2lsQnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZW5jaWxC
dWZmZXIgOiB0cnVlOworCQl0aGlzLmRlcHRoVGV4dHVyZSA9IG9wdGlvbnMuZGVwdGhUZXh0dXJl
ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoVGV4dHVyZSA6IG51bGw7CisKKwl9CisKKwlP
YmplY3QuYXNzaWduKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hl
ci5wcm90b3R5cGUsIHsKKworCQlpc1dlYkdMUmVuZGVyVGFyZ2V0OiB0cnVlLAorCisJCXNldFNp
emU6IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCApIHsKKworCQkJaWYgKCB0aGlzLndpZHRoICE9
PSB3aWR0aCB8fCB0aGlzLmhlaWdodCAhPT0gaGVpZ2h0ICkgeworCisJCQkJdGhpcy53aWR0aCA9
IHdpZHRoOworCQkJCXRoaXMuaGVpZ2h0ID0gaGVpZ2h0OworCisJCQkJdGhpcy5kaXNwb3NlKCk7
CisKKwkJCX0KKworCQkJdGhpcy52aWV3cG9ydC5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsK
KwkJCXRoaXMuc2Npc3Nvci5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKKworCQl9LAorCisJ
CWNsb25lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcigp
LmNvcHkoIHRoaXMgKTsKKworCQl9LAorCisJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewor
CisJCQl0aGlzLndpZHRoID0gc291cmNlLndpZHRoOworCQkJdGhpcy5oZWlnaHQgPSBzb3VyY2Uu
aGVpZ2h0OworCisJCQl0aGlzLnZpZXdwb3J0LmNvcHkoIHNvdXJjZS52aWV3cG9ydCApOworCisJ
CQl0aGlzLnRleHR1cmUgPSBzb3VyY2UudGV4dHVyZS5jbG9uZSgpOworCisJCQl0aGlzLmRlcHRo
QnVmZmVyID0gc291cmNlLmRlcHRoQnVmZmVyOworCQkJdGhpcy5zdGVuY2lsQnVmZmVyID0gc291
cmNlLnN0ZW5jaWxCdWZmZXI7CisJCQl0aGlzLmRlcHRoVGV4dHVyZSA9IHNvdXJjZS5kZXB0aFRl
eHR1cmU7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZGlzcG9zZTogZnVuY3Rpb24g
KCkgeworCisJCQl0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTsKKwor
CQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVy
ZWRxdWFsaWEuY29tCisJICovCisKKwlmdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldEN1YmUoIHdp
ZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7CisKKwkJV2ViR0xSZW5kZXJUYXJnZXQuY2FsbCggdGhp
cywgd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApOworCisJCXRoaXMuYWN0aXZlQ3ViZUZhY2UgPSAw
OyAvLyBQWCAwLCBOWCAxLCBQWSAyLCBOWSAzLCBQWiA0LCBOWiA1CisJCXRoaXMuYWN0aXZlTWlw
TWFwTGV2ZWwgPSAwOworCisJfQorCisJV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnByb3RvdHlwZSA9
IE9iamVjdC5jcmVhdGUoIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSApOworCVdlYkdMUmVu
ZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBXZWJHTFJlbmRlclRhcmdldEN1
YmU7CisKKwlXZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJn
ZXRDdWJlID0gdHJ1ZTsKKworCS8qKgorCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0
cDovL2dvbW8uc2UvCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlh
LmNvbS8KKwkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExh
bmdsZXkKKwkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCisJICovCisKKwlm
dW5jdGlvbiBRdWF0ZXJuaW9uKCB4LCB5LCB6LCB3ICkgeworCisJCXRoaXMuX3ggPSB4IHx8IDA7
CisJCXRoaXMuX3kgPSB5IHx8IDA7CisJCXRoaXMuX3ogPSB6IHx8IDA7CisJCXRoaXMuX3cgPSAo
IHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBRdWF0
ZXJuaW9uLCB7CisKKwkJc2xlcnA6IGZ1bmN0aW9uICggcWEsIHFiLCBxbSwgdCApIHsKKworCQkJ
cmV0dXJuIHFtLmNvcHkoIHFhICkuc2xlcnAoIHFiLCB0ICk7CisKKwkJfSwKKworCQlzbGVycEZs
YXQ6IGZ1bmN0aW9uICggZHN0LCBkc3RPZmZzZXQsIHNyYzAsIHNyY09mZnNldDAsIHNyYzEsIHNy
Y09mZnNldDEsIHQgKSB7CisKKwkJCS8vIGZ1enotZnJlZSwgYXJyYXktYmFzZWQgUXVhdGVybmlv
biBTTEVSUCBvcGVyYXRpb24KKworCQkJdmFyIHgwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDAgXSwK
KwkJCQl5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF0sCisJCQkJejAgPSBzcmMwWyBzcmNPZmZz
ZXQwICsgMiBdLAorCQkJCXcwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDMgXSwKKworCQkJCXgxID0g
c3JjMVsgc3JjT2Zmc2V0MSArIDAgXSwKKwkJCQl5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF0s
CisJCQkJejEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMiBdLAorCQkJCXcxID0gc3JjMVsgc3JjT2Zm
c2V0MSArIDMgXTsKKworCQkJaWYgKCB3MCAhPT0gdzEgfHwgeDAgIT09IHgxIHx8IHkwICE9PSB5
MSB8fCB6MCAhPT0gejEgKSB7CisKKwkJCQl2YXIgcyA9IDEgLSB0LAorCisJCQkJCWNvcyA9IHgw
ICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsCisKKwkJCQkJZGlyID0gKCBjb3Mg
Pj0gMCA/IDEgOiAtIDEgKSwKKwkJCQkJc3FyU2luID0gMSAtIGNvcyAqIGNvczsKKworCQkJCS8v
IFNraXAgdGhlIFNsZXJwIGZvciB0aW55IHN0ZXBzIHRvIGF2b2lkIG51bWVyaWMgcHJvYmxlbXM6
CisJCQkJaWYgKCBzcXJTaW4gPiBOdW1iZXIuRVBTSUxPTiApIHsKKworCQkJCQl2YXIgc2luID0g
TWF0aC5zcXJ0KCBzcXJTaW4gKSwKKwkJCQkJCWxlbiA9IE1hdGguYXRhbjIoIHNpbiwgY29zICog
ZGlyICk7CisKKwkJCQkJcyA9IE1hdGguc2luKCBzICogbGVuICkgLyBzaW47CisJCQkJCXQgPSBN
YXRoLnNpbiggdCAqIGxlbiApIC8gc2luOworCisJCQkJfQorCisJCQkJdmFyIHREaXIgPSB0ICog
ZGlyOworCisJCQkJeDAgPSB4MCAqIHMgKyB4MSAqIHREaXI7CisJCQkJeTAgPSB5MCAqIHMgKyB5
MSAqIHREaXI7CisJCQkJejAgPSB6MCAqIHMgKyB6MSAqIHREaXI7CisJCQkJdzAgPSB3MCAqIHMg
KyB3MSAqIHREaXI7CisKKwkJCQkvLyBOb3JtYWxpemUgaW4gY2FzZSB3ZSBqdXN0IGRpZCBhIGxl
cnA6CisJCQkJaWYgKCBzID09PSAxIC0gdCApIHsKKworCQkJCQl2YXIgZiA9IDEgLyBNYXRoLnNx
cnQoIHgwICogeDAgKyB5MCAqIHkwICsgejAgKiB6MCArIHcwICogdzAgKTsKKworCQkJCQl4MCAq
PSBmOworCQkJCQl5MCAqPSBmOworCQkJCQl6MCAqPSBmOworCQkJCQl3MCAqPSBmOworCisJCQkJ
fQorCisJCQl9CisKKwkJCWRzdFsgZHN0T2Zmc2V0IF0gPSB4MDsKKwkJCWRzdFsgZHN0T2Zmc2V0
ICsgMSBdID0geTA7CisJCQlkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowOworCQkJZHN0WyBkc3RP
ZmZzZXQgKyAzIF0gPSB3MDsKKworCQl9CisKKwl9ICk7CisKKwlPYmplY3QuZGVmaW5lUHJvcGVy
dGllcyggUXVhdGVybmlvbi5wcm90b3R5cGUsIHsKKworCQl4OiB7CisKKwkJCWdldDogZnVuY3Rp
b24gKCkgeworCisJCQkJcmV0dXJuIHRoaXMuX3g7CisKKwkJCX0sCisKKwkJCXNldDogZnVuY3Rp
b24gKCB2YWx1ZSApIHsKKworCQkJCXRoaXMuX3ggPSB2YWx1ZTsKKwkJCQl0aGlzLm9uQ2hhbmdl
Q2FsbGJhY2soKTsKKworCQkJfQorCisJCX0sCisKKwkJeTogeworCisJCQlnZXQ6IGZ1bmN0aW9u
ICgpIHsKKworCQkJCXJldHVybiB0aGlzLl95OworCisJCQl9LAorCisJCQlzZXQ6IGZ1bmN0aW9u
ICggdmFsdWUgKSB7CisKKwkJCQl0aGlzLl95ID0gdmFsdWU7CisJCQkJdGhpcy5vbkNoYW5nZUNh
bGxiYWNrKCk7CisKKwkJCX0KKworCQl9LAorCisJCXo6IHsKKworCQkJZ2V0OiBmdW5jdGlvbiAo
KSB7CisKKwkJCQlyZXR1cm4gdGhpcy5fejsKKworCQkJfSwKKworCQkJc2V0OiBmdW5jdGlvbiAo
IHZhbHVlICkgeworCisJCQkJdGhpcy5feiA9IHZhbHVlOworCQkJCXRoaXMub25DaGFuZ2VDYWxs
YmFjaygpOworCisJCQl9CisKKwkJfSwKKworCQl3OiB7CisKKwkJCWdldDogZnVuY3Rpb24gKCkg
eworCisJCQkJcmV0dXJuIHRoaXMuX3c7CisKKwkJCX0sCisKKwkJCXNldDogZnVuY3Rpb24gKCB2
YWx1ZSApIHsKKworCQkJCXRoaXMuX3cgPSB2YWx1ZTsKKwkJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJh
Y2soKTsKKworCQkJfQorCisJCX0KKworCX0gKTsKKworCU9iamVjdC5hc3NpZ24oIFF1YXRlcm5p
b24ucHJvdG90eXBlLCB7CisKKwkJc2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7CisKKwkJ
CXRoaXMuX3ggPSB4OworCQkJdGhpcy5feSA9IHk7CisJCQl0aGlzLl96ID0gejsKKwkJCXRoaXMu
X3cgPSB3OworCisJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworCQkJcmV0dXJuIHRoaXM7
CisKKwkJfSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMu
Y29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX3cgKTsKKworCQl9
LAorCisJCWNvcHk6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHsKKworCQkJdGhpcy5feCA9IHF1
YXRlcm5pb24ueDsKKwkJCXRoaXMuX3kgPSBxdWF0ZXJuaW9uLnk7CisJCQl0aGlzLl96ID0gcXVh
dGVybmlvbi56OworCQkJdGhpcy5fdyA9IHF1YXRlcm5pb24udzsKKworCQkJdGhpcy5vbkNoYW5n
ZUNhbGxiYWNrKCk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0RnJvbUV1bGVy
OiBmdW5jdGlvbiAoIGV1bGVyLCB1cGRhdGUgKSB7CisKKwkJCWlmICggISAoIGV1bGVyICYmIGV1
bGVyLmlzRXVsZXIgKSApIHsKKworCQkJCXRocm93IG5ldyBFcnJvciggJ1RIUkVFLlF1YXRlcm5p
b246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIg
dGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTsKKworCQkJfQorCisJCQl2YXIgeCA9IGV1bGVy
Ll94LCB5ID0gZXVsZXIuX3ksIHogPSBldWxlci5feiwgb3JkZXIgPSBldWxlci5vcmRlcjsKKwor
CQkJLy8gaHR0cDovL3d3dy5tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvZmlsZWV4Y2hhbmdl
LworCQkJLy8gCTIwNjk2LWZ1bmN0aW9uLXRvLWNvbnZlcnQtYmV0d2Vlbi1kY20tZXVsZXItYW5n
bGVzLXF1YXRlcm5pb25zLWFuZC1ldWxlci12ZWN0b3JzLworCQkJLy8JY29udGVudC9TcGluQ2Fs
Yy5tCisKKwkJCXZhciBjb3MgPSBNYXRoLmNvczsKKwkJCXZhciBzaW4gPSBNYXRoLnNpbjsKKwor
CQkJdmFyIGMxID0gY29zKCB4IC8gMiApOworCQkJdmFyIGMyID0gY29zKCB5IC8gMiApOworCQkJ
dmFyIGMzID0gY29zKCB6IC8gMiApOworCisJCQl2YXIgczEgPSBzaW4oIHggLyAyICk7CisJCQl2
YXIgczIgPSBzaW4oIHkgLyAyICk7CisJCQl2YXIgczMgPSBzaW4oIHogLyAyICk7CisKKwkJCWlm
ICggb3JkZXIgPT09ICdYWVonICkgeworCisJCQkJdGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMx
ICogczIgKiBzMzsKKwkJCQl0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzOwor
CQkJCXRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7CisJCQkJdGhpcy5fdyA9
IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMzsKKworCQkJfSBlbHNlIGlmICggb3JkZXIgPT09
ICdZWFonICkgeworCisJCQkJdGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMzsK
KwkJCQl0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzOworCQkJCXRoaXMuX3og
PSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7CisJCQkJdGhpcy5fdyA9IGMxICogYzIgKiBj
MyArIHMxICogczIgKiBzMzsKKworCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdaWFknICkgewor
CisJCQkJdGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMzsKKwkJCQl0aGlzLl95
ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzOworCQkJCXRoaXMuX3ogPSBjMSAqIGMyICog
czMgKyBzMSAqIHMyICogYzM7CisJCQkJdGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIg
KiBzMzsKKworCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkgeworCisJCQkJdGhpcy5f
eCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMzsKKwkJCQl0aGlzLl95ID0gYzEgKiBzMiAq
IGMzICsgczEgKiBjMiAqIHMzOworCQkJCXRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMy
ICogYzM7CisJCQkJdGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMzsKKworCQkJ
fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkgeworCisJCQkJdGhpcy5feCA9IHMxICogYzIg
KiBjMyArIGMxICogczIgKiBzMzsKKwkJCQl0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBj
MiAqIHMzOworCQkJCXRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7CisJCQkJ
dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMzsKKworCQkJfSBlbHNlIGlmICgg
b3JkZXIgPT09ICdYWlknICkgeworCisJCQkJdGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICog
czIgKiBzMzsKKwkJCQl0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzOworCQkJ
CXRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7CisJCQkJdGhpcy5fdyA9IGMx
ICogYzIgKiBjMyArIHMxICogczIgKiBzMzsKKworCQkJfQorCisJCQlpZiAoIHVwZGF0ZSAhPT0g
ZmFsc2UgKSB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJ
fSwKKworCQlzZXRGcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkgeworCisJ
CQkvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlv
bnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtCisKKwkJCS8vIGFzc3Vt
ZXMgYXhpcyBpcyBub3JtYWxpemVkCisKKwkJCXZhciBoYWxmQW5nbGUgPSBhbmdsZSAvIDIsIHMg
PSBNYXRoLnNpbiggaGFsZkFuZ2xlICk7CisKKwkJCXRoaXMuX3ggPSBheGlzLnggKiBzOworCQkJ
dGhpcy5feSA9IGF4aXMueSAqIHM7CisJCQl0aGlzLl96ID0gYXhpcy56ICogczsKKwkJCXRoaXMu
X3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7CisKKwkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygp
OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldEZyb21Sb3RhdGlvbk1hdHJpeDog
ZnVuY3Rpb24gKCBtICkgeworCisJCQkvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9t
YXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2lu
ZGV4Lmh0bQorCisJCQkvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90
YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKQorCisJCQl2YXIgdGUgPSBtLmVsZW1lbnRzLAor
CisJCQkJbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSwKKwkJCQlt
MjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLAorCQkJCW0zMSA9IHRl
WyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdLAorCisJCQkJdHJhY2UgPSBtMTEg
KyBtMjIgKyBtMzMsCisJCQkJczsKKworCQkJaWYgKCB0cmFjZSA+IDAgKSB7CisKKwkJCQlzID0g
MC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApOworCisJCQkJdGhpcy5fdyA9IDAuMjUgLyBz
OworCQkJCXRoaXMuX3ggPSAoIG0zMiAtIG0yMyApICogczsKKwkJCQl0aGlzLl95ID0gKCBtMTMg
LSBtMzEgKSAqIHM7CisJCQkJdGhpcy5feiA9ICggbTIxIC0gbTEyICkgKiBzOworCisJCQl9IGVs
c2UgaWYgKCBtMTEgPiBtMjIgJiYgbTExID4gbTMzICkgeworCisJCQkJcyA9IDIuMCAqIE1hdGgu
c3FydCggMS4wICsgbTExIC0gbTIyIC0gbTMzICk7CisKKwkJCQl0aGlzLl93ID0gKCBtMzIgLSBt
MjMgKSAvIHM7CisJCQkJdGhpcy5feCA9IDAuMjUgKiBzOworCQkJCXRoaXMuX3kgPSAoIG0xMiAr
IG0yMSApIC8gczsKKwkJCQl0aGlzLl96ID0gKCBtMTMgKyBtMzEgKSAvIHM7CisKKwkJCX0gZWxz
ZSBpZiAoIG0yMiA+IG0zMyApIHsKKworCQkJCXMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0y
MiAtIG0xMSAtIG0zMyApOworCisJCQkJdGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzOworCQkJ
CXRoaXMuX3ggPSAoIG0xMiArIG0yMSApIC8gczsKKwkJCQl0aGlzLl95ID0gMC4yNSAqIHM7CisJ
CQkJdGhpcy5feiA9ICggbTIzICsgbTMyICkgLyBzOworCisJCQl9IGVsc2UgeworCisJCQkJcyA9
IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7CisKKwkJCQl0aGlzLl93
ID0gKCBtMjEgLSBtMTIgKSAvIHM7CisJCQkJdGhpcy5feCA9ICggbTEzICsgbTMxICkgLyBzOwor
CQkJCXRoaXMuX3kgPSAoIG0yMyArIG0zMiApIC8gczsKKwkJCQl0aGlzLl96ID0gMC4yNSAqIHM7
CisKKwkJCX0KKworCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJc2V0RnJvbVVuaXRWZWN0b3JzOiBmdW5jdGlvbiAoKSB7CisKKwkJCS8v
IGFzc3VtZXMgZGlyZWN0aW9uIHZlY3RvcnMgdkZyb20gYW5kIHZUbyBhcmUgbm9ybWFsaXplZAor
CisJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIHI7CisKKwkJCXZhciBFUFMgPSAw
LjAwMDAwMTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHNldEZyb21Vbml0VmVjdG9ycyggdkZyb20s
IHZUbyApIHsKKworCQkJCWlmICggdjEgPT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMo
KTsKKworCQkJCXIgPSB2RnJvbS5kb3QoIHZUbyApICsgMTsKKworCQkJCWlmICggciA8IEVQUyAp
IHsKKworCQkJCQlyID0gMDsKKworCQkJCQlpZiAoIE1hdGguYWJzKCB2RnJvbS54ICkgPiBNYXRo
LmFicyggdkZyb20ueiApICkgeworCisJCQkJCQl2MS5zZXQoIC0gdkZyb20ueSwgdkZyb20ueCwg
MCApOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCXYxLnNldCggMCwgLSB2RnJvbS56LCB2RnJv
bS55ICk7CisKKwkJCQkJfQorCisJCQkJfSBlbHNlIHsKKworCQkJCQl2MS5jcm9zc1ZlY3RvcnMo
IHZGcm9tLCB2VG8gKTsKKworCQkJCX0KKworCQkJCXRoaXMuX3ggPSB2MS54OworCQkJCXRoaXMu
X3kgPSB2MS55OworCQkJCXRoaXMuX3ogPSB2MS56OworCQkJCXRoaXMuX3cgPSByOworCisJCQkJ
cmV0dXJuIHRoaXMubm9ybWFsaXplKCk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWludmVyc2U6
IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHRoaXMuY29uanVnYXRlKCkubm9ybWFsaXplKCk7
CisKKwkJfSwKKworCQljb25qdWdhdGU6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5feCAqPSAt
IDE7CisJCQl0aGlzLl95ICo9IC0gMTsKKwkJCXRoaXMuX3ogKj0gLSAxOworCisJCQl0aGlzLm9u
Q2hhbmdlQ2FsbGJhY2soKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlkb3Q6IGZ1
bmN0aW9uICggdiApIHsKKworCQkJcmV0dXJuIHRoaXMuX3ggKiB2Ll94ICsgdGhpcy5feSAqIHYu
X3kgKyB0aGlzLl96ICogdi5feiArIHRoaXMuX3cgKiB2Ll93OworCisJCX0sCisKKwkJbGVuZ3Ro
U3E6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5f
eSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93OworCisJ
CX0sCisKKwkJbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBNYXRoLnNxcnQoIHRo
aXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiAr
IHRoaXMuX3cgKiB0aGlzLl93ICk7CisKKwkJfSwKKworCQlub3JtYWxpemU6IGZ1bmN0aW9uICgp
IHsKKworCQkJdmFyIGwgPSB0aGlzLmxlbmd0aCgpOworCisJCQlpZiAoIGwgPT09IDAgKSB7CisK
KwkJCQl0aGlzLl94ID0gMDsKKwkJCQl0aGlzLl95ID0gMDsKKwkJCQl0aGlzLl96ID0gMDsKKwkJ
CQl0aGlzLl93ID0gMTsKKworCQkJfSBlbHNlIHsKKworCQkJCWwgPSAxIC8gbDsKKworCQkJCXRo
aXMuX3ggPSB0aGlzLl94ICogbDsKKwkJCQl0aGlzLl95ID0gdGhpcy5feSAqIGw7CisJCQkJdGhp
cy5feiA9IHRoaXMuX3ogKiBsOworCQkJCXRoaXMuX3cgPSB0aGlzLl93ICogbDsKKworCQkJfQor
CisJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQltdWx0aXBseTogZnVuY3Rpb24gKCBxLCBwICkgeworCisJCQlpZiAoIHAgIT09IHVuZGVm
aW5lZCApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBs
eSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlv
bnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsKKwkJCQlyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5p
b25zKCBxLCBwICk7CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9u
cyggdGhpcywgcSApOworCisJCX0sCisKKwkJcHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggcSApIHsK
KworCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgdGhpcyApOworCisJCX0s
CisKKwkJbXVsdGlwbHlRdWF0ZXJuaW9uczogZnVuY3Rpb24gKCBhLCBiICkgeworCisJCQkvLyBm
cm9tIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1l
ZEFsZ2VicmEvcXVhdGVybmlvbnMvY29kZS9pbmRleC5odG0KKworCQkJdmFyIHFheCA9IGEuX3gs
IHFheSA9IGEuX3ksIHFheiA9IGEuX3osIHFhdyA9IGEuX3c7CisJCQl2YXIgcWJ4ID0gYi5feCwg
cWJ5ID0gYi5feSwgcWJ6ID0gYi5feiwgcWJ3ID0gYi5fdzsKKworCQkJdGhpcy5feCA9IHFheCAq
IHFidyArIHFhdyAqIHFieCArIHFheSAqIHFieiAtIHFheiAqIHFieTsKKwkJCXRoaXMuX3kgPSBx
YXkgKiBxYncgKyBxYXcgKiBxYnkgKyBxYXogKiBxYnggLSBxYXggKiBxYno7CisJCQl0aGlzLl96
ID0gcWF6ICogcWJ3ICsgcWF3ICogcWJ6ICsgcWF4ICogcWJ5IC0gcWF5ICogcWJ4OworCQkJdGhp
cy5fdyA9IHFhdyAqIHFidyAtIHFheCAqIHFieCAtIHFheSAqIHFieSAtIHFheiAqIHFiejsKKwor
CQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJc2xlcnA6IGZ1bmN0aW9uICggcWIsIHQgKSB7CisKKwkJCWlmICggdCA9PT0gMCApIHJldHVy
biB0aGlzOworCQkJaWYgKCB0ID09PSAxICkgcmV0dXJuIHRoaXMuY29weSggcWIgKTsKKworCQkJ
dmFyIHggPSB0aGlzLl94LCB5ID0gdGhpcy5feSwgeiA9IHRoaXMuX3osIHcgPSB0aGlzLl93Owor
CisJCQkvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxO
b3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL3NsZXJwLworCisJCQl2YXIgY29zSGFsZlRoZXRhID0g
dyAqIHFiLl93ICsgeCAqIHFiLl94ICsgeSAqIHFiLl95ICsgeiAqIHFiLl96OworCisJCQlpZiAo
IGNvc0hhbGZUaGV0YSA8IDAgKSB7CisKKwkJCQl0aGlzLl93ID0gLSBxYi5fdzsKKwkJCQl0aGlz
Ll94ID0gLSBxYi5feDsKKwkJCQl0aGlzLl95ID0gLSBxYi5feTsKKwkJCQl0aGlzLl96ID0gLSBx
Yi5fejsKKworCQkJCWNvc0hhbGZUaGV0YSA9IC0gY29zSGFsZlRoZXRhOworCisJCQl9IGVsc2Ug
eworCisJCQkJdGhpcy5jb3B5KCBxYiApOworCisJCQl9CisKKwkJCWlmICggY29zSGFsZlRoZXRh
ID49IDEuMCApIHsKKworCQkJCXRoaXMuX3cgPSB3OworCQkJCXRoaXMuX3ggPSB4OworCQkJCXRo
aXMuX3kgPSB5OworCQkJCXRoaXMuX3ogPSB6OworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX0K
KworCQkJdmFyIHNpbkhhbGZUaGV0YSA9IE1hdGguc3FydCggMS4wIC0gY29zSGFsZlRoZXRhICog
Y29zSGFsZlRoZXRhICk7CisKKwkJCWlmICggTWF0aC5hYnMoIHNpbkhhbGZUaGV0YSApIDwgMC4w
MDEgKSB7CisKKwkJCQl0aGlzLl93ID0gMC41ICogKCB3ICsgdGhpcy5fdyApOworCQkJCXRoaXMu
X3ggPSAwLjUgKiAoIHggKyB0aGlzLl94ICk7CisJCQkJdGhpcy5feSA9IDAuNSAqICggeSArIHRo
aXMuX3kgKTsKKwkJCQl0aGlzLl96ID0gMC41ICogKCB6ICsgdGhpcy5feiApOworCisJCQkJcmV0
dXJuIHRoaXM7CisKKwkJCX0KKworCQkJdmFyIGhhbGZUaGV0YSA9IE1hdGguYXRhbjIoIHNpbkhh
bGZUaGV0YSwgY29zSGFsZlRoZXRhICk7CisJCQl2YXIgcmF0aW9BID0gTWF0aC5zaW4oICggMSAt
IHQgKSAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhLAorCQkJCXJhdGlvQiA9IE1hdGguc2lu
KCB0ICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGE7CisKKwkJCXRoaXMuX3cgPSAoIHcgKiBy
YXRpb0EgKyB0aGlzLl93ICogcmF0aW9CICk7CisJCQl0aGlzLl94ID0gKCB4ICogcmF0aW9BICsg
dGhpcy5feCAqIHJhdGlvQiApOworCQkJdGhpcy5feSA9ICggeSAqIHJhdGlvQSArIHRoaXMuX3kg
KiByYXRpb0IgKTsKKwkJCXRoaXMuX3ogPSAoIHogKiByYXRpb0EgKyB0aGlzLl96ICogcmF0aW9C
ICk7CisKKwkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisJCQlyZXR1cm4gdGhpczsKKwor
CQl9LAorCisJCWVxdWFsczogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkgeworCisJCQlyZXR1cm4g
KCBxdWF0ZXJuaW9uLl94ID09PSB0aGlzLl94ICkgJiYgKCBxdWF0ZXJuaW9uLl95ID09PSB0aGlz
Ll95ICkgJiYgKCBxdWF0ZXJuaW9uLl96ID09PSB0aGlzLl96ICkgJiYgKCBxdWF0ZXJuaW9uLl93
ID09PSB0aGlzLl93ICk7CisKKwkJfSwKKworCQlmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXks
IG9mZnNldCApIHsKKworCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7
CisKKwkJCXRoaXMuX3ggPSBhcnJheVsgb2Zmc2V0IF07CisJCQl0aGlzLl95ID0gYXJyYXlbIG9m
ZnNldCArIDEgXTsKKwkJCXRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdOworCQkJdGhpcy5f
dyA9IGFycmF5WyBvZmZzZXQgKyAzIF07CisKKwkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOwor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXks
IG9mZnNldCApIHsKKworCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsK
KwkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisJCQlhcnJheVsg
b2Zmc2V0IF0gPSB0aGlzLl94OworCQkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7CisJ
CQlhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejsKKwkJCWFycmF5WyBvZmZzZXQgKyAzIF0g
PSB0aGlzLl93OworCisJCQlyZXR1cm4gYXJyYXk7CisKKwkJfSwKKworCQlvbkNoYW5nZTogZnVu
Y3Rpb24gKCBjYWxsYmFjayApIHsKKworCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJh
Y2s7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJb25DaGFuZ2VDYWxsYmFjazogZnVu
Y3Rpb24gKCkge30KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDov
L21yZG9vYi5jb20vCisJICogQGF1dGhvciBraWxlIC8gaHR0cDovL2tpbGUuc3RyYXZhZ2FuemEu
b3JnLworCSAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvCisJICog
QGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KKwkgKiBAYXV0aG9yIGVn
cmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tLworCSAqIEBhdXRob3IgV2VzdExhbmdsZXkg
LyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorCSAqLworCisJZnVuY3Rpb24gVmVjdG9y
MyggeCwgeSwgeiApIHsKKworCQl0aGlzLnggPSB4IHx8IDA7CisJCXRoaXMueSA9IHkgfHwgMDsK
KwkJdGhpcy56ID0geiB8fCAwOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90
b3R5cGUsIHsKKworCQlpc1ZlY3RvcjM6IHRydWUsCisKKwkJc2V0OiBmdW5jdGlvbiAoIHgsIHks
IHogKSB7CisKKwkJCXRoaXMueCA9IHg7CisJCQl0aGlzLnkgPSB5OworCQkJdGhpcy56ID0gejsK
KworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2Nh
bGFyICkgeworCisJCQl0aGlzLnggPSBzY2FsYXI7CisJCQl0aGlzLnkgPSBzY2FsYXI7CisJCQl0
aGlzLnogPSBzY2FsYXI7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0WDogZnVu
Y3Rpb24gKCB4ICkgeworCisJCQl0aGlzLnggPSB4OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9
LAorCisJCXNldFk6IGZ1bmN0aW9uICggeSApIHsKKworCQkJdGhpcy55ID0geTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRaOiBmdW5jdGlvbiAoIHogKSB7CisKKwkJCXRoaXMu
eiA9IHo7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0Q29tcG9uZW50OiBmdW5j
dGlvbiAoIGluZGV4LCB2YWx1ZSApIHsKKworCQkJc3dpdGNoICggaW5kZXggKSB7CisKKwkJCQlj
YXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhazsKKwkJCQljYXNlIDE6IHRoaXMueSA9IHZhbHVl
OyBicmVhazsKKwkJCQljYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhazsKKwkJCQlkZWZhdWx0
OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApOwor
CisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZ2V0Q29tcG9uZW50OiBmdW5j
dGlvbiAoIGluZGV4ICkgeworCisJCQlzd2l0Y2ggKCBpbmRleCApIHsKKworCQkJCWNhc2UgMDog
cmV0dXJuIHRoaXMueDsKKwkJCQljYXNlIDE6IHJldHVybiB0aGlzLnk7CisJCQkJY2FzZSAyOiBy
ZXR1cm4gdGhpcy56OworCQkJCWRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91
dCBvZiByYW5nZTogJyArIGluZGV4ICk7CisKKwkJCX0KKworCQl9LAorCisJCWNsb25lOiBmdW5j
dGlvbiAoKSB7CisKKwkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlz
LnksIHRoaXMueiApOworCisJCX0sCisKKwkJY29weTogZnVuY3Rpb24gKCB2ICkgeworCisJCQl0
aGlzLnggPSB2Lng7CisJCQl0aGlzLnkgPSB2Lnk7CisJCQl0aGlzLnogPSB2Lno7CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJYWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7CisKKwkJCWlm
ICggdyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9y
MzogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMo
IGEsIGIgKSBpbnN0ZWFkLicgKTsKKwkJCQlyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7
CisKKwkJCX0KKworCQkJdGhpcy54ICs9IHYueDsKKwkJCXRoaXMueSArPSB2Lnk7CisJCQl0aGlz
LnogKz0gdi56OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWFkZFNjYWxhcjogZnVu
Y3Rpb24gKCBzICkgeworCisJCQl0aGlzLnggKz0gczsKKwkJCXRoaXMueSArPSBzOworCQkJdGhp
cy56ICs9IHM7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJYWRkVmVjdG9yczogZnVu
Y3Rpb24gKCBhLCBiICkgeworCisJCQl0aGlzLnggPSBhLnggKyBiLng7CisJCQl0aGlzLnkgPSBh
LnkgKyBiLnk7CisJCQl0aGlzLnogPSBhLnogKyBiLno7CisKKwkJCXJldHVybiB0aGlzOworCisJ
CX0sCisKKwkJYWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7CisKKwkJCXRoaXMu
eCArPSB2LnggKiBzOworCQkJdGhpcy55ICs9IHYueSAqIHM7CisJCQl0aGlzLnogKz0gdi56ICog
czsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzdWI6IGZ1bmN0aW9uICggdiwgdyAp
IHsKKworCQkJaWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdU
SFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAu
c3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOworCQkJCXJldHVybiB0aGlzLnN1YlZlY3Rv
cnMoIHYsIHcgKTsKKworCQkJfQorCisJCQl0aGlzLnggLT0gdi54OworCQkJdGhpcy55IC09IHYu
eTsKKwkJCXRoaXMueiAtPSB2Lno7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc3Vi
U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CisKKwkJCXRoaXMueCAtPSBzOworCQkJdGhpcy55IC09
IHM7CisJCQl0aGlzLnogLT0gczsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzdWJW
ZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CisKKwkJCXRoaXMueCA9IGEueCAtIGIueDsKKwkJ
CXRoaXMueSA9IGEueSAtIGIueTsKKwkJCXRoaXMueiA9IGEueiAtIGIuejsKKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQltdWx0aXBseTogZnVuY3Rpb24gKCB2LCB3ICkgeworCisJCQlp
ZiAoIHcgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3Rv
cjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRp
cGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOworCQkJCXJldHVybiB0aGlzLm11bHRpcGx5
VmVjdG9ycyggdiwgdyApOworCisJCQl9CisKKwkJCXRoaXMueCAqPSB2Lng7CisJCQl0aGlzLnkg
Kj0gdi55OworCQkJdGhpcy56ICo9IHYuejsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKwor
CQltdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CisKKwkJCXRoaXMueCAqPSBz
Y2FsYXI7CisJCQl0aGlzLnkgKj0gc2NhbGFyOworCQkJdGhpcy56ICo9IHNjYWxhcjsKKworCQkJ
cmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQltdWx0aXBseVZlY3RvcnM6IGZ1bmN0aW9uICggYSwg
YiApIHsKKworCQkJdGhpcy54ID0gYS54ICogYi54OworCQkJdGhpcy55ID0gYS55ICogYi55Owor
CQkJdGhpcy56ID0gYS56ICogYi56OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWFw
cGx5RXVsZXI6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVy
bmlvbigpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gYXBwbHlFdWxlciggZXVsZXIgKSB7CisKKwkJ
CQlpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7CisKKwkJCQkJY29uc29sZS5l
cnJvciggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIg
cm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7CisKKwkJCQl9CisK
KwkJCQlyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24uc2V0RnJvbUV1bGVy
KCBldWxlciApICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWFwcGx5QXhpc0FuZ2xlOiBmdW5j
dGlvbiAoKSB7CisKKwkJCXZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTsKKworCQkJ
cmV0dXJuIGZ1bmN0aW9uIGFwcGx5QXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApIHsKKworCQkJCXJl
dHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBh
eGlzLCBhbmdsZSApICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWFwcGx5TWF0cml4MzogZnVu
Y3Rpb24gKCBtICkgeworCisJCQl2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMu
ejsKKwkJCXZhciBlID0gbS5lbGVtZW50czsKKworCQkJdGhpcy54ID0gZVsgMCBdICogeCArIGVb
IDMgXSAqIHkgKyBlWyA2IF0gKiB6OworCQkJdGhpcy55ID0gZVsgMSBdICogeCArIGVbIDQgXSAq
IHkgKyBlWyA3IF0gKiB6OworCQkJdGhpcy56ID0gZVsgMiBdICogeCArIGVbIDUgXSAqIHkgKyBl
WyA4IF0gKiB6OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWFwcGx5TWF0cml4NDog
ZnVuY3Rpb24gKCBtICkgeworCisJCQl2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRo
aXMuejsKKwkJCXZhciBlID0gbS5lbGVtZW50czsKKworCQkJdmFyIHcgPSAxIC8gKCBlWyAzIF0g
KiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUgXSApOworCisJCQl0aGlzLngg
PSAoIGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICAqIHogKyBlWyAxMiBdICkgKiB3
OworCQkJdGhpcy55ID0gKCBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAgKiB6ICsg
ZVsgMTMgXSApICogdzsKKwkJCXRoaXMueiA9ICggZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBl
WyAxMCBdICogeiArIGVbIDE0IF0gKSAqIHc7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJYXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7CisKKwkJCXZhciB4ID0gdGhpcy54
LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56OworCQkJdmFyIHF4ID0gcS54LCBxeSA9IHEueSwgcXog
PSBxLnosIHF3ID0gcS53OworCisJCQkvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY3RvcgorCisJCQl2
YXIgaXggPSAgcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5OworCQkJdmFyIGl5ID0gIHF3ICogeSAr
IHF6ICogeCAtIHF4ICogejsKKwkJCXZhciBpeiA9ICBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHg7
CisJCQl2YXIgaXcgPSAtIHF4ICogeCAtIHF5ICogeSAtIHF6ICogejsKKworCQkJLy8gY2FsY3Vs
YXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdAorCisJCQl0aGlzLnggPSBpeCAqIHF3ICsgaXcgKiAt
IHF4ICsgaXkgKiAtIHF6IC0gaXogKiAtIHF5OworCQkJdGhpcy55ID0gaXkgKiBxdyArIGl3ICog
LSBxeSArIGl6ICogLSBxeCAtIGl4ICogLSBxejsKKwkJCXRoaXMueiA9IGl6ICogcXcgKyBpdyAq
IC0gcXogKyBpeCAqIC0gcXkgLSBpeSAqIC0gcXg7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0s
CisKKwkJcHJvamVjdDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgbWF0cml4ID0gbmV3IE1hdHJp
eDQoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHByb2plY3QoIGNhbWVyYSApIHsKKworCQkJCW1h
dHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgbWF0cml4Lmdl
dEludmVyc2UoIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7CisJCQkJcmV0dXJuIHRoaXMuYXBwbHlN
YXRyaXg0KCBtYXRyaXggKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJdW5wcm9qZWN0OiBmdW5j
dGlvbiAoKSB7CisKKwkJCXZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpOworCisJCQlyZXR1cm4g
ZnVuY3Rpb24gdW5wcm9qZWN0KCBjYW1lcmEgKSB7CisKKwkJCQltYXRyaXgubXVsdGlwbHlNYXRy
aWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkLCBtYXRyaXguZ2V0SW52ZXJzZSggY2FtZXJhLnByb2pl
Y3Rpb25NYXRyaXggKSApOworCQkJCXJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbWF0cml4ICk7
CisKKwkJCX07CisKKwkJfSgpLAorCisJCXRyYW5zZm9ybURpcmVjdGlvbjogZnVuY3Rpb24gKCBt
ICkgeworCisJCQkvLyBpbnB1dDogVEhSRUUuTWF0cml4NCBhZmZpbmUgbWF0cml4CisJCQkvLyB2
ZWN0b3IgaW50ZXJwcmV0ZWQgYXMgYSBkaXJlY3Rpb24KKworCQkJdmFyIHggPSB0aGlzLngsIHkg
PSB0aGlzLnksIHogPSB0aGlzLno7CisJCQl2YXIgZSA9IG0uZWxlbWVudHM7CisKKwkJCXRoaXMu
eCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICAqIHo7CisJCQl0aGlzLnkgPSBl
WyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAgKiB6OworCQkJdGhpcy56ID0gZVsgMiBd
ICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogejsKKworCQkJcmV0dXJuIHRoaXMubm9ybWFs
aXplKCk7CisKKwkJfSwKKworCQlkaXZpZGU6IGZ1bmN0aW9uICggdiApIHsKKworCQkJdGhpcy54
IC89IHYueDsKKwkJCXRoaXMueSAvPSB2Lnk7CisJCQl0aGlzLnogLz0gdi56OworCisJCQlyZXR1
cm4gdGhpczsKKworCQl9LAorCisJCWRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7
CisKKwkJCXJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7CisKKwkJfSwK
KworCQltaW46IGZ1bmN0aW9uICggdiApIHsKKworCQkJdGhpcy54ID0gTWF0aC5taW4oIHRoaXMu
eCwgdi54ICk7CisJCQl0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTsKKwkJCXRoaXMu
eiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAor
CisJCW1heDogZnVuY3Rpb24gKCB2ICkgeworCisJCQl0aGlzLnggPSBNYXRoLm1heCggdGhpcy54
LCB2LnggKTsKKwkJCXRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApOworCQkJdGhpcy56
ID0gTWF0aC5tYXgoIHRoaXMueiwgdi56ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJY2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7CisKKwkJCS8vIGFzc3VtZXMgbWluIDwg
bWF4LCBjb21wb25lbnR3aXNlCisKKwkJCXRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5t
aW4oIG1heC54LCB0aGlzLnggKSApOworCQkJdGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRo
Lm1pbiggbWF4LnksIHRoaXMueSApICk7CisJCQl0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1h
dGgubWluKCBtYXgueiwgdGhpcy56ICkgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKwor
CQljbGFtcFNjYWxhcjogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgbWluID0gbmV3IFZlY3RvcjMo
KTsKKwkJCXZhciBtYXggPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gY2xh
bXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkgeworCisJCQkJbWluLnNldCggbWluVmFsLCBtaW5W
YWwsIG1pblZhbCApOworCQkJCW1heC5zZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTsKKwor
CQkJCXJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApOworCisJCQl9OworCisJCX0oKSwKKwor
CQljbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHsKKworCQkJdmFyIGxlbmd0aCA9
IHRoaXMubGVuZ3RoKCk7CisKKwkJCXJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8
IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3Ro
ICkgKSApOworCisJCX0sCisKKwkJZmxvb3I6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy54ID0g
TWF0aC5mbG9vciggdGhpcy54ICk7CisJCQl0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTsK
KwkJCXRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApOworCisJCQlyZXR1cm4gdGhpczsKKwor
CQl9LAorCisJCWNlaWw6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy54ID0gTWF0aC5jZWlsKCB0
aGlzLnggKTsKKwkJCXRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7CisJCQl0aGlzLnogPSBN
YXRoLmNlaWwoIHRoaXMueiApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXJvdW5k
OiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApOworCQkJ
dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7CisJCQl0aGlzLnogPSBNYXRoLnJvdW5kKCB0
aGlzLnogKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlyb3VuZFRvWmVybzogZnVu
Y3Rpb24gKCkgeworCisJCQl0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhp
cy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTsKKwkJCXRoaXMueSA9ICggdGhpcy55IDwgMCAp
ID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApOworCQkJdGhpcy56
ID0gKCB0aGlzLnogPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueiApIDogTWF0aC5mbG9vciggdGhp
cy56ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbmVnYXRlOiBmdW5jdGlvbiAo
KSB7CisKKwkJCXRoaXMueCA9IC0gdGhpcy54OworCQkJdGhpcy55ID0gLSB0aGlzLnk7CisJCQl0
aGlzLnogPSAtIHRoaXMuejsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlkb3Q6IGZ1
bmN0aW9uICggdiApIHsKKworCQkJcmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSAr
IHRoaXMueiAqIHYuejsKKworCQl9LAorCisJCS8vIFRPRE8gbGVuZ3RoU3F1YXJlZD8KKworCQls
ZW5ndGhTcTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhp
cy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56OworCisJCX0sCisKKwkJbGVuZ3RoOiBmdW5j
dGlvbiAoKSB7CisKKwkJCXJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMu
eSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiApOworCisJCX0sCisKKwkJbGVuZ3RoTWFuaGF0
dGFuOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRo
LmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICk7CisKKwkJfSwKKworCQlub3JtYWxp
emU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxl
bmd0aCgpIHx8IDEgKTsKKworCQl9LAorCisJCXNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGgg
KSB7CisKKwkJCXJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGgg
KTsKKworCQl9LAorCisJCWxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7CisKKwkJCXRoaXMu
eCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7CisJCQl0aGlzLnkgKz0gKCB2LnkgLSB0aGlz
LnkgKSAqIGFscGhhOworCQkJdGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTsKKwor
CQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwg
djIsIGFscGhhICkgeworCisJCQlyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0
aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7CisKKwkJfSwKKworCQljcm9zczogZnVuY3Rp
b24gKCB2LCB3ICkgeworCisJCQlpZiAoIHcgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCWNvbnNv
bGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFy
Z3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOworCQkJCXJldHVy
biB0aGlzLmNyb3NzVmVjdG9ycyggdiwgdyApOworCisJCQl9CisKKwkJCXZhciB4ID0gdGhpcy54
LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56OworCisJCQl0aGlzLnggPSB5ICogdi56IC0geiAqIHYu
eTsKKwkJCXRoaXMueSA9IHogKiB2LnggLSB4ICogdi56OworCQkJdGhpcy56ID0geCAqIHYueSAt
IHkgKiB2Lng7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY3Jvc3NWZWN0b3JzOiBm
dW5jdGlvbiAoIGEsIGIgKSB7CisKKwkJCXZhciBheCA9IGEueCwgYXkgPSBhLnksIGF6ID0gYS56
OworCQkJdmFyIGJ4ID0gYi54LCBieSA9IGIueSwgYnogPSBiLno7CisKKwkJCXRoaXMueCA9IGF5
ICogYnogLSBheiAqIGJ5OworCQkJdGhpcy55ID0gYXogKiBieCAtIGF4ICogYno7CisJCQl0aGlz
LnogPSBheCAqIGJ5IC0gYXkgKiBieDsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlw
cm9qZWN0T25WZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkgeworCisJCQl2YXIgc2NhbGFyID0g
dmVjdG9yLmRvdCggdGhpcyApIC8gdmVjdG9yLmxlbmd0aFNxKCk7CisKKwkJCXJldHVybiB0aGlz
LmNvcHkoIHZlY3RvciApLm11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKTsKKworCQl9LAorCisJCXBy
b2plY3RPblBsYW5lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7
CisKKwkJCXJldHVybiBmdW5jdGlvbiBwcm9qZWN0T25QbGFuZSggcGxhbmVOb3JtYWwgKSB7CisK
KwkJCQl2MS5jb3B5KCB0aGlzICkucHJvamVjdE9uVmVjdG9yKCBwbGFuZU5vcm1hbCApOworCisJ
CQkJcmV0dXJuIHRoaXMuc3ViKCB2MSApOworCisJCQl9OworCisJCX0oKSwKKworCQlyZWZsZWN0
OiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIHJlZmxlY3QgaW5jaWRlbnQgdmVjdG9yIG9mZiBwbGFu
ZSBvcnRob2dvbmFsIHRvIG5vcm1hbAorCQkJLy8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gaGF2ZSB1
bml0IGxlbmd0aAorCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gZnVu
Y3Rpb24gcmVmbGVjdCggbm9ybWFsICkgeworCisJCQkJcmV0dXJuIHRoaXMuc3ViKCB2MS5jb3B5
KCBub3JtYWwgKS5tdWx0aXBseVNjYWxhciggMiAqIHRoaXMuZG90KCBub3JtYWwgKSApICk7CisK
KwkJCX07CisKKwkJfSgpLAorCisJCWFuZ2xlVG86IGZ1bmN0aW9uICggdiApIHsKKworCQkJdmFy
IHRoZXRhID0gdGhpcy5kb3QoIHYgKSAvICggTWF0aC5zcXJ0KCB0aGlzLmxlbmd0aFNxKCkgKiB2
Lmxlbmd0aFNxKCkgKSApOworCisJCQkvLyBjbGFtcCwgdG8gaGFuZGxlIG51bWVyaWNhbCBwcm9i
bGVtcworCisJCQlyZXR1cm4gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGhldGEsIC0gMSwgMSAp
ICk7CisKKwkJfSwKKworCQlkaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7CisKKwkJCXJldHVy
biBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApOworCisJCX0sCisKKwkJ
ZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1bmN0aW9uICggdiApIHsKKworCQkJdmFyIGR4ID0gdGhpcy54
IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwgZHogPSB0aGlzLnogLSB2Lno7CisKKwkJCXJldHVy
biBkeCAqIGR4ICsgZHkgKiBkeSArIGR6ICogZHo7CisKKwkJfSwKKworCQlkaXN0YW5jZVRvTWFu
aGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7CisKKwkJCXJldHVybiBNYXRoLmFicyggdGhpcy54IC0g
di54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICkgKyBNYXRoLmFicyggdGhpcy56IC0gdi56
ICk7CisKKwkJfSwKKworCQlzZXRGcm9tU3BoZXJpY2FsOiBmdW5jdGlvbiAoIHMgKSB7CisKKwkJ
CXZhciBzaW5QaGlSYWRpdXMgPSBNYXRoLnNpbiggcy5waGkgKSAqIHMucmFkaXVzOworCisJCQl0
aGlzLnggPSBzaW5QaGlSYWRpdXMgKiBNYXRoLnNpbiggcy50aGV0YSApOworCQkJdGhpcy55ID0g
TWF0aC5jb3MoIHMucGhpICkgKiBzLnJhZGl1czsKKwkJCXRoaXMueiA9IHNpblBoaVJhZGl1cyAq
IE1hdGguY29zKCBzLnRoZXRhICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0
RnJvbUN5bGluZHJpY2FsOiBmdW5jdGlvbiAoIGMgKSB7CisKKwkJCXRoaXMueCA9IGMucmFkaXVz
ICogTWF0aC5zaW4oIGMudGhldGEgKTsKKwkJCXRoaXMueSA9IGMueTsKKwkJCXRoaXMueiA9IGMu
cmFkaXVzICogTWF0aC5jb3MoIGMudGhldGEgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQlzZXRGcm9tTWF0cml4UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHsKKworCQkJdmFyIGUg
PSBtLmVsZW1lbnRzOworCisJCQl0aGlzLnggPSBlWyAxMiBdOworCQkJdGhpcy55ID0gZVsgMTMg
XTsKKwkJCXRoaXMueiA9IGVbIDE0IF07CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJ
c2V0RnJvbU1hdHJpeFNjYWxlOiBmdW5jdGlvbiAoIG0gKSB7CisKKwkJCXZhciBzeCA9IHRoaXMu
c2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpOworCQkJdmFyIHN5ID0gdGhpcy5z
ZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7CisJCQl2YXIgc3ogPSB0aGlzLnNl
dEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTsKKworCQkJdGhpcy54ID0gc3g7CisJ
CQl0aGlzLnkgPSBzeTsKKwkJCXRoaXMueiA9IHN6OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9
LAorCisJCXNldEZyb21NYXRyaXhDb2x1bW46IGZ1bmN0aW9uICggbSwgaW5kZXggKSB7CisKKwkJ
CXJldHVybiB0aGlzLmZyb21BcnJheSggbS5lbGVtZW50cywgaW5kZXggKiA0ICk7CisKKwkJfSwK
KworCQllcXVhbHM6IGZ1bmN0aW9uICggdiApIHsKKworCQkJcmV0dXJuICggKCB2LnggPT09IHRo
aXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgKTsKKwor
CQl9LAorCisJCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgeworCisJCQlp
ZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKKworCQkJdGhpcy54ID0gYXJy
YXlbIG9mZnNldCBdOworCQkJdGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTsKKwkJCXRoaXMu
eiA9IGFycmF5WyBvZmZzZXQgKyAyIF07CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJ
dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgeworCisJCQlpZiAoIGFycmF5ID09
PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOworCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCAp
IG9mZnNldCA9IDA7CisKKwkJCWFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDsKKwkJCWFycmF5WyBv
ZmZzZXQgKyAxIF0gPSB0aGlzLnk7CisJCQlhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56Owor
CisJCQlyZXR1cm4gYXJyYXk7CisKKwkJfSwKKworCQlmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5j
dGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHsKKworCQkJaWYgKCBvZmZzZXQgIT09
IHVuZGVmaW5lZCApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IG9mZnNl
dCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7CisKKwkJ
CX0KKworCQkJdGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7CisJCQl0aGlzLnkgPSBh
dHRyaWJ1dGUuZ2V0WSggaW5kZXggKTsKKwkJCXRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRl
eCApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0
aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0
IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvCisJICogQGF1dGhvciBwaGlsb2diIC8gaHR0
cDovL2Jsb2cudGhlaml0Lm9yZy8KKwkgKiBAYXV0aG9yIGpvcmRpX3JvcyAvIGh0dHA6Ly9wbGF0
dHNvZnQuY29tCisJICogQGF1dGhvciBEMXBsbzFkIC8gaHR0cDovL2dpdGh1Yi5jb20vRDFwbG8x
ZAorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICog
QGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KKwkgKiBAYXV0aG9yIHRp
bWtuaXAgLyBodHRwOi8vd3d3LmZsb29ycGxhbm5lci5jb20vCisJICogQGF1dGhvciBiaG91c3Rv
biAvIGh0dHA6Ly9jbGFyYS5pbworCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0
aHViLmNvbS9XZXN0TGFuZ2xleQorCSAqLworCisJZnVuY3Rpb24gTWF0cml4NCgpIHsKKworCQl0
aGlzLmVsZW1lbnRzID0gWworCisJCQkxLCAwLCAwLCAwLAorCQkJMCwgMSwgMCwgMCwKKwkJCTAs
IDAsIDEsIDAsCisJCQkwLCAwLCAwLCAxCisKKwkJXTsKKworCQlpZiAoIGFyZ3VtZW50cy5sZW5n
dGggPiAwICkgeworCisJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogdGhlIGNvbnN0
cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4nICk7
CisKKwkJfQorCisJfQorCisJT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHsKKwor
CQlpc01hdHJpeDQ6IHRydWUsCisKKwkJc2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4x
NCwgbjIxLCBuMjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMs
IG40NCApIHsKKworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworCQkJdGVbIDAgXSA9IG4x
MTsgdGVbIDQgXSA9IG4xMjsgdGVbIDggXSA9IG4xMzsgdGVbIDEyIF0gPSBuMTQ7CisJCQl0ZVsg
MSBdID0gbjIxOyB0ZVsgNSBdID0gbjIyOyB0ZVsgOSBdID0gbjIzOyB0ZVsgMTMgXSA9IG4yNDsK
KwkJCXRlWyAyIF0gPSBuMzE7IHRlWyA2IF0gPSBuMzI7IHRlWyAxMCBdID0gbjMzOyB0ZVsgMTQg
XSA9IG4zNDsKKwkJCXRlWyAzIF0gPSBuNDE7IHRlWyA3IF0gPSBuNDI7IHRlWyAxMSBdID0gbjQz
OyB0ZVsgMTUgXSA9IG40NDsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlpZGVudGl0
eTogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLnNldCgKKworCQkJCTEsIDAsIDAsIDAsCisJCQkJ
MCwgMSwgMCwgMCwKKwkJCQkwLCAwLCAxLCAwLAorCQkJCTAsIDAsIDAsIDEKKworCQkJKTsKKwor
CQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQly
ZXR1cm4gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTsKKworCQl9LAor
CisJCWNvcHk6IGZ1bmN0aW9uICggbSApIHsKKworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsK
KwkJCXZhciBtZSA9IG0uZWxlbWVudHM7CisKKwkJCXRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBd
ID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07IHRlWyAzIF0gPSBtZVsgMyBdOworCQkJdGVb
IDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdOyB0ZVsgNiBdID0gbWVbIDYgXTsgdGVb
IDcgXSA9IG1lWyA3IF07CisJCQl0ZVsgOCBdID0gbWVbIDggXTsgdGVbIDkgXSA9IG1lWyA5IF07
IHRlWyAxMCBdID0gbWVbIDEwIF07IHRlWyAxMSBdID0gbWVbIDExIF07CisJCQl0ZVsgMTIgXSA9
IG1lWyAxMiBdOyB0ZVsgMTMgXSA9IG1lWyAxMyBdOyB0ZVsgMTQgXSA9IG1lWyAxNCBdOyB0ZVsg
MTUgXSA9IG1lWyAxNSBdOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNvcHlQb3Np
dGlvbjogZnVuY3Rpb24gKCBtICkgeworCisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzLCBtZSA9
IG0uZWxlbWVudHM7CisKKwkJCXRlWyAxMiBdID0gbWVbIDEyIF07CisJCQl0ZVsgMTMgXSA9IG1l
WyAxMyBdOworCQkJdGVbIDE0IF0gPSBtZVsgMTQgXTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJ
fSwKKworCQlleHRyYWN0QmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHsK
KworCQkJeEF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMCApOworCQkJeUF4aXMuc2V0
RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMSApOworCQkJekF4aXMuc2V0RnJvbU1hdHJpeENvbHVt
biggdGhpcywgMiApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCW1ha2VCYXNpczog
ZnVuY3Rpb24gKCB4QXhpcywgeUF4aXMsIHpBeGlzICkgeworCisJCQl0aGlzLnNldCgKKwkJCQl4
QXhpcy54LCB5QXhpcy54LCB6QXhpcy54LCAwLAorCQkJCXhBeGlzLnksIHlBeGlzLnksIHpBeGlz
LnksIDAsCisJCQkJeEF4aXMueiwgeUF4aXMueiwgekF4aXMueiwgMCwKKwkJCQkwLCAgICAgICAw
LCAgICAgICAwLCAgICAgICAxCisJCQkpOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJ
CWV4dHJhY3RSb3RhdGlvbjogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9y
MygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gZXh0cmFjdFJvdGF0aW9uKCBtICkgeworCisJCQkJ
dmFyIHRlID0gdGhpcy5lbGVtZW50czsKKwkJCQl2YXIgbWUgPSBtLmVsZW1lbnRzOworCisJCQkJ
dmFyIHNjYWxlWCA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7
CisJCQkJdmFyIHNjYWxlWSA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVu
Z3RoKCk7CisJCQkJdmFyIHNjYWxlWiA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAy
ICkubGVuZ3RoKCk7CisKKwkJCQl0ZVsgMCBdID0gbWVbIDAgXSAqIHNjYWxlWDsKKwkJCQl0ZVsg
MSBdID0gbWVbIDEgXSAqIHNjYWxlWDsKKwkJCQl0ZVsgMiBdID0gbWVbIDIgXSAqIHNjYWxlWDsK
KworCQkJCXRlWyA0IF0gPSBtZVsgNCBdICogc2NhbGVZOworCQkJCXRlWyA1IF0gPSBtZVsgNSBd
ICogc2NhbGVZOworCQkJCXRlWyA2IF0gPSBtZVsgNiBdICogc2NhbGVZOworCisJCQkJdGVbIDgg
XSA9IG1lWyA4IF0gKiBzY2FsZVo7CisJCQkJdGVbIDkgXSA9IG1lWyA5IF0gKiBzY2FsZVo7CisJ
CQkJdGVbIDEwIF0gPSBtZVsgMTAgXSAqIHNjYWxlWjsKKworCQkJCXJldHVybiB0aGlzOworCisJ
CQl9OworCisJCX0oKSwKKworCQltYWtlUm90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVs
ZXIgKSB7CisKKwkJCWlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHsKKworCQkJ
CWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBu
b3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3Jk
ZXIuJyApOworCisJCQl9CisKKwkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisKKwkJCXZhciB4
ID0gZXVsZXIueCwgeSA9IGV1bGVyLnksIHogPSBldWxlci56OworCQkJdmFyIGEgPSBNYXRoLmNv
cyggeCApLCBiID0gTWF0aC5zaW4oIHggKTsKKwkJCXZhciBjID0gTWF0aC5jb3MoIHkgKSwgZCA9
IE1hdGguc2luKCB5ICk7CisJCQl2YXIgZSA9IE1hdGguY29zKCB6ICksIGYgPSBNYXRoLnNpbigg
eiApOworCisJCQlpZiAoIGV1bGVyLm9yZGVyID09PSAnWFlaJyApIHsKKworCQkJCXZhciBhZSA9
IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmOworCisJCQkJdGVbIDAg
XSA9IGMgKiBlOworCQkJCXRlWyA0IF0gPSAtIGMgKiBmOworCQkJCXRlWyA4IF0gPSBkOworCisJ
CQkJdGVbIDEgXSA9IGFmICsgYmUgKiBkOworCQkJCXRlWyA1IF0gPSBhZSAtIGJmICogZDsKKwkJ
CQl0ZVsgOSBdID0gLSBiICogYzsKKworCQkJCXRlWyAyIF0gPSBiZiAtIGFlICogZDsKKwkJCQl0
ZVsgNiBdID0gYmUgKyBhZiAqIGQ7CisJCQkJdGVbIDEwIF0gPSBhICogYzsKKworCQkJfSBlbHNl
IGlmICggZXVsZXIub3JkZXIgPT09ICdZWFonICkgeworCisJCQkJdmFyIGNlID0gYyAqIGUsIGNm
ID0gYyAqIGYsIGRlID0gZCAqIGUsIGRmID0gZCAqIGY7CisKKwkJCQl0ZVsgMCBdID0gY2UgKyBk
ZiAqIGI7CisJCQkJdGVbIDQgXSA9IGRlICogYiAtIGNmOworCQkJCXRlWyA4IF0gPSBhICogZDsK
KworCQkJCXRlWyAxIF0gPSBhICogZjsKKwkJCQl0ZVsgNSBdID0gYSAqIGU7CisJCQkJdGVbIDkg
XSA9IC0gYjsKKworCQkJCXRlWyAyIF0gPSBjZiAqIGIgLSBkZTsKKwkJCQl0ZVsgNiBdID0gZGYg
KyBjZSAqIGI7CisJCQkJdGVbIDEwIF0gPSBhICogYzsKKworCQkJfSBlbHNlIGlmICggZXVsZXIu
b3JkZXIgPT09ICdaWFknICkgeworCisJCQkJdmFyIGNlID0gYyAqIGUsIGNmID0gYyAqIGYsIGRl
ID0gZCAqIGUsIGRmID0gZCAqIGY7CisKKwkJCQl0ZVsgMCBdID0gY2UgLSBkZiAqIGI7CisJCQkJ
dGVbIDQgXSA9IC0gYSAqIGY7CisJCQkJdGVbIDggXSA9IGRlICsgY2YgKiBiOworCisJCQkJdGVb
IDEgXSA9IGNmICsgZGUgKiBiOworCQkJCXRlWyA1IF0gPSBhICogZTsKKwkJCQl0ZVsgOSBdID0g
ZGYgLSBjZSAqIGI7CisKKwkJCQl0ZVsgMiBdID0gLSBhICogZDsKKwkJCQl0ZVsgNiBdID0gYjsK
KwkJCQl0ZVsgMTAgXSA9IGEgKiBjOworCisJCQl9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0g
J1pZWCcgKSB7CisKKwkJCQl2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwg
YmYgPSBiICogZjsKKworCQkJCXRlWyAwIF0gPSBjICogZTsKKwkJCQl0ZVsgNCBdID0gYmUgKiBk
IC0gYWY7CisJCQkJdGVbIDggXSA9IGFlICogZCArIGJmOworCisJCQkJdGVbIDEgXSA9IGMgKiBm
OworCQkJCXRlWyA1IF0gPSBiZiAqIGQgKyBhZTsKKwkJCQl0ZVsgOSBdID0gYWYgKiBkIC0gYmU7
CisKKwkJCQl0ZVsgMiBdID0gLSBkOworCQkJCXRlWyA2IF0gPSBiICogYzsKKwkJCQl0ZVsgMTAg
XSA9IGEgKiBjOworCisJCQl9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1laWCcgKSB7CisK
KwkJCQl2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDsK
KworCQkJCXRlWyAwIF0gPSBjICogZTsKKwkJCQl0ZVsgNCBdID0gYmQgLSBhYyAqIGY7CisJCQkJ
dGVbIDggXSA9IGJjICogZiArIGFkOworCisJCQkJdGVbIDEgXSA9IGY7CisJCQkJdGVbIDUgXSA9
IGEgKiBlOworCQkJCXRlWyA5IF0gPSAtIGIgKiBlOworCisJCQkJdGVbIDIgXSA9IC0gZCAqIGU7
CisJCQkJdGVbIDYgXSA9IGFkICogZiArIGJjOworCQkJCXRlWyAxMCBdID0gYWMgLSBiZCAqIGY7
CisKKwkJCX0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWFpZJyApIHsKKworCQkJCXZhciBh
YyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkOworCisJCQkJdGVb
IDAgXSA9IGMgKiBlOworCQkJCXRlWyA0IF0gPSAtIGY7CisJCQkJdGVbIDggXSA9IGQgKiBlOwor
CisJCQkJdGVbIDEgXSA9IGFjICogZiArIGJkOworCQkJCXRlWyA1IF0gPSBhICogZTsKKwkJCQl0
ZVsgOSBdID0gYWQgKiBmIC0gYmM7CisKKwkJCQl0ZVsgMiBdID0gYmMgKiBmIC0gYWQ7CisJCQkJ
dGVbIDYgXSA9IGIgKiBlOworCQkJCXRlWyAxMCBdID0gYmQgKiBmICsgYWM7CisKKwkJCX0KKwor
CQkJLy8gbGFzdCBjb2x1bW4KKwkJCXRlWyAzIF0gPSAwOworCQkJdGVbIDcgXSA9IDA7CisJCQl0
ZVsgMTEgXSA9IDA7CisKKwkJCS8vIGJvdHRvbSByb3cKKwkJCXRlWyAxMiBdID0gMDsKKwkJCXRl
WyAxMyBdID0gMDsKKwkJCXRlWyAxNCBdID0gMDsKKwkJCXRlWyAxNSBdID0gMTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQltYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rp
b24gKCBxICkgeworCisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworCisJCQl2YXIgeCA9IHEu
X3gsIHkgPSBxLl95LCB6ID0gcS5feiwgdyA9IHEuX3c7CisJCQl2YXIgeDIgPSB4ICsgeCwgeTIg
PSB5ICsgeSwgejIgPSB6ICsgejsKKwkJCXZhciB4eCA9IHggKiB4MiwgeHkgPSB4ICogeTIsIHh6
ID0geCAqIHoyOworCQkJdmFyIHl5ID0geSAqIHkyLCB5eiA9IHkgKiB6MiwgenogPSB6ICogejI7
CisJCQl2YXIgd3ggPSB3ICogeDIsIHd5ID0gdyAqIHkyLCB3eiA9IHcgKiB6MjsKKworCQkJdGVb
IDAgXSA9IDEgLSAoIHl5ICsgenogKTsKKwkJCXRlWyA0IF0gPSB4eSAtIHd6OworCQkJdGVbIDgg
XSA9IHh6ICsgd3k7CisKKwkJCXRlWyAxIF0gPSB4eSArIHd6OworCQkJdGVbIDUgXSA9IDEgLSAo
IHh4ICsgenogKTsKKwkJCXRlWyA5IF0gPSB5eiAtIHd4OworCisJCQl0ZVsgMiBdID0geHogLSB3
eTsKKwkJCXRlWyA2IF0gPSB5eiArIHd4OworCQkJdGVbIDEwIF0gPSAxIC0gKCB4eCArIHl5ICk7
CisKKwkJCS8vIGxhc3QgY29sdW1uCisJCQl0ZVsgMyBdID0gMDsKKwkJCXRlWyA3IF0gPSAwOwor
CQkJdGVbIDExIF0gPSAwOworCisJCQkvLyBib3R0b20gcm93CisJCQl0ZVsgMTIgXSA9IDA7CisJ
CQl0ZVsgMTMgXSA9IDA7CisJCQl0ZVsgMTQgXSA9IDA7CisJCQl0ZVsgMTUgXSA9IDE7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbG9va0F0OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZh
ciB4ID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciB5ID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciB6
ID0gbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggZXllLCB0YXJn
ZXQsIHVwICkgeworCisJCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworCQkJCXouc3ViVmVj
dG9ycyggZXllLCB0YXJnZXQgKTsKKworCQkJCWlmICggei5sZW5ndGhTcSgpID09PSAwICkgewor
CisJCQkJCS8vIGV5ZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvbgorCisJCQkJ
CXoueiA9IDE7CisKKwkJCQl9CisKKwkJCQl6Lm5vcm1hbGl6ZSgpOworCQkJCXguY3Jvc3NWZWN0
b3JzKCB1cCwgeiApOworCisJCQkJaWYgKCB4Lmxlbmd0aFNxKCkgPT09IDAgKSB7CisKKwkJCQkJ
Ly8gdXAgYW5kIHogYXJlIHBhcmFsbGVsCisKKwkJCQkJaWYgKCBNYXRoLmFicyggdXAueiApID09
PSAxICkgeworCisJCQkJCQl6LnggKz0gMC4wMDAxOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJ
CXoueiArPSAwLjAwMDE7CisKKwkJCQkJfQorCisJCQkJCXoubm9ybWFsaXplKCk7CisJCQkJCXgu
Y3Jvc3NWZWN0b3JzKCB1cCwgeiApOworCisJCQkJfQorCisJCQkJeC5ub3JtYWxpemUoKTsKKwkJ
CQl5LmNyb3NzVmVjdG9ycyggeiwgeCApOworCisJCQkJdGVbIDAgXSA9IHgueDsgdGVbIDQgXSA9
IHkueDsgdGVbIDggXSA9IHoueDsKKwkJCQl0ZVsgMSBdID0geC55OyB0ZVsgNSBdID0geS55OyB0
ZVsgOSBdID0gei55OworCQkJCXRlWyAyIF0gPSB4Lno7IHRlWyA2IF0gPSB5Lno7IHRlWyAxMCBd
ID0gei56OworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCW11bHRp
cGx5OiBmdW5jdGlvbiAoIG0sIG4gKSB7CisKKwkJCWlmICggbiAhPT0gdW5kZWZpbmVkICkgewor
CisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5KCkgbm93IG9ubHkg
YWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIGluc3Rl
YWQuJyApOworCQkJCXJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIG4gKTsKKworCQkJ
fQorCisJCQlyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7CisKKwkJfSwK
KworCQlwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBtICkgeworCisJCQlyZXR1cm4gdGhpcy5tdWx0
aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7CisKKwkJfSwKKworCQltdWx0aXBseU1hdHJpY2VzOiBm
dW5jdGlvbiAoIGEsIGIgKSB7CisKKwkJCXZhciBhZSA9IGEuZWxlbWVudHM7CisJCQl2YXIgYmUg
PSBiLmVsZW1lbnRzOworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworCQkJdmFyIGExMSA9
IGFlWyAwIF0sIGExMiA9IGFlWyA0IF0sIGExMyA9IGFlWyA4IF0sIGExNCA9IGFlWyAxMiBdOwor
CQkJdmFyIGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA1IF0sIGEyMyA9IGFlWyA5IF0sIGEyNCA9
IGFlWyAxMyBdOworCQkJdmFyIGEzMSA9IGFlWyAyIF0sIGEzMiA9IGFlWyA2IF0sIGEzMyA9IGFl
WyAxMCBdLCBhMzQgPSBhZVsgMTQgXTsKKwkJCXZhciBhNDEgPSBhZVsgMyBdLCBhNDIgPSBhZVsg
NyBdLCBhNDMgPSBhZVsgMTEgXSwgYTQ0ID0gYWVbIDE1IF07CisKKwkJCXZhciBiMTEgPSBiZVsg
MCBdLCBiMTIgPSBiZVsgNCBdLCBiMTMgPSBiZVsgOCBdLCBiMTQgPSBiZVsgMTIgXTsKKwkJCXZh
ciBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNSBdLCBiMjMgPSBiZVsgOSBdLCBiMjQgPSBiZVsg
MTMgXTsKKwkJCXZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNiBdLCBiMzMgPSBiZVsgMTAg
XSwgYjM0ID0gYmVbIDE0IF07CisJCQl2YXIgYjQxID0gYmVbIDMgXSwgYjQyID0gYmVbIDcgXSwg
YjQzID0gYmVbIDExIF0sIGI0NCA9IGJlWyAxNSBdOworCisJCQl0ZVsgMCBdID0gYTExICogYjEx
ICsgYTEyICogYjIxICsgYTEzICogYjMxICsgYTE0ICogYjQxOworCQkJdGVbIDQgXSA9IGExMSAq
IGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMiArIGExNCAqIGI0MjsKKwkJCXRlWyA4IF0gPSBh
MTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzMgKyBhMTQgKiBiNDM7CisJCQl0ZVsgMTIg
XSA9IGExMSAqIGIxNCArIGExMiAqIGIyNCArIGExMyAqIGIzNCArIGExNCAqIGI0NDsKKworCQkJ
dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTsK
KwkJCXRlWyA1IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMgKiBiMzIgKyBhMjQgKiBi
NDI7CisJCQl0ZVsgOSBdID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzICsgYTI0
ICogYjQzOworCQkJdGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQg
KyBhMjQgKiBiNDQ7CisKKwkJCXRlWyAyIF0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMg
KiBiMzEgKyBhMzQgKiBiNDE7CisJCQl0ZVsgNiBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsg
YTMzICogYjMyICsgYTM0ICogYjQyOworCQkJdGVbIDEwIF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBi
MjMgKyBhMzMgKiBiMzMgKyBhMzQgKiBiNDM7CisJCQl0ZVsgMTQgXSA9IGEzMSAqIGIxNCArIGEz
MiAqIGIyNCArIGEzMyAqIGIzNCArIGEzNCAqIGI0NDsKKworCQkJdGVbIDMgXSA9IGE0MSAqIGIx
MSArIGE0MiAqIGIyMSArIGE0MyAqIGIzMSArIGE0NCAqIGI0MTsKKwkJCXRlWyA3IF0gPSBhNDEg
KiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBiMzIgKyBhNDQgKiBiNDI7CisJCQl0ZVsgMTEgXSA9
IGE0MSAqIGIxMyArIGE0MiAqIGIyMyArIGE0MyAqIGIzMyArIGE0NCAqIGI0MzsKKwkJCXRlWyAx
NSBdID0gYTQxICogYjE0ICsgYTQyICogYjI0ICsgYTQzICogYjM0ICsgYTQ0ICogYjQ0OworCisJ
CQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCW11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMg
KSB7CisKKwkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisKKwkJCXRlWyAwIF0gKj0gczsgdGVb
IDQgXSAqPSBzOyB0ZVsgOCBdICo9IHM7IHRlWyAxMiBdICo9IHM7CisJCQl0ZVsgMSBdICo9IHM7
IHRlWyA1IF0gKj0gczsgdGVbIDkgXSAqPSBzOyB0ZVsgMTMgXSAqPSBzOworCQkJdGVbIDIgXSAq
PSBzOyB0ZVsgNiBdICo9IHM7IHRlWyAxMCBdICo9IHM7IHRlWyAxNCBdICo9IHM7CisJCQl0ZVsg
MyBdICo9IHM7IHRlWyA3IF0gKj0gczsgdGVbIDExIF0gKj0gczsgdGVbIDE1IF0gKj0gczsKKwor
CQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5j
dGlvbiAoKSB7CisKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJldHVybiBmdW5j
dGlvbiBhcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7CisKKwkJCQlmb3IgKCB2
YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkgeworCisJCQkJCXYx
LnggPSBhdHRyaWJ1dGUuZ2V0WCggaSApOworCQkJCQl2MS55ID0gYXR0cmlidXRlLmdldFkoIGkg
KTsKKwkJCQkJdjEueiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7CisKKwkJCQkJdjEuYXBwbHlNYXRy
aXg0KCB0aGlzICk7CisKKwkJCQkJYXR0cmlidXRlLnNldFhZWiggaSwgdjEueCwgdjEueSwgdjEu
eiApOworCisJCQkJfQorCisJCQkJcmV0dXJuIGF0dHJpYnV0ZTsKKworCQkJfTsKKworCQl9KCks
CisKKwkJZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHRlID0gdGhpcy5lbGVt
ZW50czsKKworCQkJdmFyIG4xMSA9IHRlWyAwIF0sIG4xMiA9IHRlWyA0IF0sIG4xMyA9IHRlWyA4
IF0sIG4xNCA9IHRlWyAxMiBdOworCQkJdmFyIG4yMSA9IHRlWyAxIF0sIG4yMiA9IHRlWyA1IF0s
IG4yMyA9IHRlWyA5IF0sIG4yNCA9IHRlWyAxMyBdOworCQkJdmFyIG4zMSA9IHRlWyAyIF0sIG4z
MiA9IHRlWyA2IF0sIG4zMyA9IHRlWyAxMCBdLCBuMzQgPSB0ZVsgMTQgXTsKKwkJCXZhciBuNDEg
PSB0ZVsgMyBdLCBuNDIgPSB0ZVsgNyBdLCBuNDMgPSB0ZVsgMTEgXSwgbjQ0ID0gdGVbIDE1IF07
CisKKwkJCS8vVE9ETzogbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50CisJCQkvLyggYmFzZWQgb24g
aHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9tYXRyaXgvZnVuY3Rp
b25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtICkKKworCQkJcmV0dXJuICgKKwkJCQluNDEgKiAo
CisJCQkJCSsgbjE0ICogbjIzICogbjMyCisJCQkJCSAtIG4xMyAqIG4yNCAqIG4zMgorCQkJCQkg
LSBuMTQgKiBuMjIgKiBuMzMKKwkJCQkJICsgbjEyICogbjI0ICogbjMzCisJCQkJCSArIG4xMyAq
IG4yMiAqIG4zNAorCQkJCQkgLSBuMTIgKiBuMjMgKiBuMzQKKwkJCQkpICsKKwkJCQluNDIgKiAo
CisJCQkJCSsgbjExICogbjIzICogbjM0CisJCQkJCSAtIG4xMSAqIG4yNCAqIG4zMworCQkJCQkg
KyBuMTQgKiBuMjEgKiBuMzMKKwkJCQkJIC0gbjEzICogbjIxICogbjM0CisJCQkJCSArIG4xMyAq
IG4yNCAqIG4zMQorCQkJCQkgLSBuMTQgKiBuMjMgKiBuMzEKKwkJCQkpICsKKwkJCQluNDMgKiAo
CisJCQkJCSsgbjExICogbjI0ICogbjMyCisJCQkJCSAtIG4xMSAqIG4yMiAqIG4zNAorCQkJCQkg
LSBuMTQgKiBuMjEgKiBuMzIKKwkJCQkJICsgbjEyICogbjIxICogbjM0CisJCQkJCSArIG4xNCAq
IG4yMiAqIG4zMQorCQkJCQkgLSBuMTIgKiBuMjQgKiBuMzEKKwkJCQkpICsKKwkJCQluNDQgKiAo
CisJCQkJCS0gbjEzICogbjIyICogbjMxCisJCQkJCSAtIG4xMSAqIG4yMyAqIG4zMgorCQkJCQkg
KyBuMTEgKiBuMjIgKiBuMzMKKwkJCQkJICsgbjEzICogbjIxICogbjMyCisJCQkJCSAtIG4xMiAq
IG4yMSAqIG4zMworCQkJCQkgKyBuMTIgKiBuMjMgKiBuMzEKKwkJCQkpCisKKwkJCSk7CisKKwkJ
fSwKKworCQl0cmFuc3Bvc2U6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHRlID0gdGhpcy5lbGVt
ZW50czsKKwkJCXZhciB0bXA7CisKKwkJCXRtcCA9IHRlWyAxIF07IHRlWyAxIF0gPSB0ZVsgNCBd
OyB0ZVsgNCBdID0gdG1wOworCQkJdG1wID0gdGVbIDIgXTsgdGVbIDIgXSA9IHRlWyA4IF07IHRl
WyA4IF0gPSB0bXA7CisJCQl0bXAgPSB0ZVsgNiBdOyB0ZVsgNiBdID0gdGVbIDkgXTsgdGVbIDkg
XSA9IHRtcDsKKworCQkJdG1wID0gdGVbIDMgXTsgdGVbIDMgXSA9IHRlWyAxMiBdOyB0ZVsgMTIg
XSA9IHRtcDsKKwkJCXRtcCA9IHRlWyA3IF07IHRlWyA3IF0gPSB0ZVsgMTMgXTsgdGVbIDEzIF0g
PSB0bXA7CisJCQl0bXAgPSB0ZVsgMTEgXTsgdGVbIDExIF0gPSB0ZVsgMTQgXTsgdGVbIDE0IF0g
PSB0bXA7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0UG9zaXRpb246IGZ1bmN0
aW9uICggdiApIHsKKworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworCQkJdGVbIDEyIF0g
PSB2Lng7CisJCQl0ZVsgMTMgXSA9IHYueTsKKwkJCXRlWyAxNCBdID0gdi56OworCisJCQlyZXR1
cm4gdGhpczsKKworCQl9LAorCisJCWdldEludmVyc2U6IGZ1bmN0aW9uICggbSwgdGhyb3dPbkRl
Z2VuZXJhdGUgKSB7CisKKwkJCS8vIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2Uu
Y29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0
bQorCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50cywKKwkJCQltZSA9IG0uZWxlbWVudHMsCisKKwkJ
CQluMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLCBuNDEgPSBtZVsg
MyBdLAorCQkJCW4xMiA9IG1lWyA0IF0sIG4yMiA9IG1lWyA1IF0sIG4zMiA9IG1lWyA2IF0sIG40
MiA9IG1lWyA3IF0sCisJCQkJbjEzID0gbWVbIDggXSwgbjIzID0gbWVbIDkgXSwgbjMzID0gbWVb
IDEwIF0sIG40MyA9IG1lWyAxMSBdLAorCQkJCW4xNCA9IG1lWyAxMiBdLCBuMjQgPSBtZVsgMTMg
XSwgbjM0ID0gbWVbIDE0IF0sIG40NCA9IG1lWyAxNSBdLAorCisJCQkJdDExID0gbjIzICogbjM0
ICogbjQyIC0gbjI0ICogbjMzICogbjQyICsgbjI0ICogbjMyICogbjQzIC0gbjIyICogbjM0ICog
bjQzIC0gbjIzICogbjMyICogbjQ0ICsgbjIyICogbjMzICogbjQ0LAorCQkJCXQxMiA9IG4xNCAq
IG4zMyAqIG40MiAtIG4xMyAqIG4zNCAqIG40MiAtIG4xNCAqIG4zMiAqIG40MyArIG4xMiAqIG4z
NCAqIG40MyArIG4xMyAqIG4zMiAqIG40NCAtIG4xMiAqIG4zMyAqIG40NCwKKwkJCQl0MTMgPSBu
MTMgKiBuMjQgKiBuNDIgLSBuMTQgKiBuMjMgKiBuNDIgKyBuMTQgKiBuMjIgKiBuNDMgLSBuMTIg
KiBuMjQgKiBuNDMgLSBuMTMgKiBuMjIgKiBuNDQgKyBuMTIgKiBuMjMgKiBuNDQsCisJCQkJdDE0
ID0gbjE0ICogbjIzICogbjMyIC0gbjEzICogbjI0ICogbjMyIC0gbjE0ICogbjIyICogbjMzICsg
bjEyICogbjI0ICogbjMzICsgbjEzICogbjIyICogbjM0IC0gbjEyICogbjIzICogbjM0OworCisJ
CQl2YXIgZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzICsgbjQxICogdDE0
OworCisJCQlpZiAoIGRldCA9PT0gMCApIHsKKworCQkJCXZhciBtc2cgPSAiVEhSRUUuTWF0cml4
NC5nZXRJbnZlcnNlKCk6IGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiOwor
CisJCQkJaWYgKCB0aHJvd09uRGVnZW5lcmF0ZSA9PT0gdHJ1ZSApIHsKKworCQkJCQl0aHJvdyBu
ZXcgRXJyb3IoIG1zZyApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQljb25zb2xlLndhcm4oIG1z
ZyApOworCisJCQkJfQorCisJCQkJcmV0dXJuIHRoaXMuaWRlbnRpdHkoKTsKKworCQkJfQorCisJ
CQl2YXIgZGV0SW52ID0gMSAvIGRldDsKKworCQkJdGVbIDAgXSA9IHQxMSAqIGRldEludjsKKwkJ
CXRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4z
MSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAq
IG40NCApICogZGV0SW52OworCQkJdGVbIDIgXSA9ICggbjIyICogbjM0ICogbjQxIC0gbjI0ICog
bjMyICogbjQxICsgbjI0ICogbjMxICogbjQyIC0gbjIxICogbjM0ICogbjQyIC0gbjIyICogbjMx
ICogbjQ0ICsgbjIxICogbjMyICogbjQ0ICkgKiBkZXRJbnY7CisJCQl0ZVsgMyBdID0gKCBuMjMg
KiBuMzIgKiBuNDEgLSBuMjIgKiBuMzMgKiBuNDEgLSBuMjMgKiBuMzEgKiBuNDIgKyBuMjEgKiBu
MzMgKiBuNDIgKyBuMjIgKiBuMzEgKiBuNDMgLSBuMjEgKiBuMzIgKiBuNDMgKSAqIGRldEludjsK
KworCQkJdGVbIDQgXSA9IHQxMiAqIGRldEludjsKKwkJCXRlWyA1IF0gPSAoIG4xMyAqIG4zNCAq
IG40MSAtIG4xNCAqIG4zMyAqIG40MSArIG4xNCAqIG4zMSAqIG40MyAtIG4xMSAqIG4zNCAqIG40
MyAtIG4xMyAqIG4zMSAqIG40NCArIG4xMSAqIG4zMyAqIG40NCApICogZGV0SW52OworCQkJdGVb
IDYgXSA9ICggbjE0ICogbjMyICogbjQxIC0gbjEyICogbjM0ICogbjQxIC0gbjE0ICogbjMxICog
bjQyICsgbjExICogbjM0ICogbjQyICsgbjEyICogbjMxICogbjQ0IC0gbjExICogbjMyICogbjQ0
ICkgKiBkZXRJbnY7CisJCQl0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIg
KiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBu
NDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjsKKworCQkJdGVbIDggXSA9IHQxMyAqIGRl
dEludjsKKwkJCXRlWyA5IF0gPSAoIG4xNCAqIG4yMyAqIG40MSAtIG4xMyAqIG4yNCAqIG40MSAt
IG4xNCAqIG4yMSAqIG40MyArIG4xMSAqIG4yNCAqIG40MyArIG4xMyAqIG4yMSAqIG40NCAtIG4x
MSAqIG4yMyAqIG40NCApICogZGV0SW52OworCQkJdGVbIDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40
MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAqIG40MiAtIG4xMSAqIG4yNCAqIG40MiAt
IG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40NCApICogZGV0SW52OworCQkJdGVbIDEx
IF0gPSAoIG4xMyAqIG4yMiAqIG40MSAtIG4xMiAqIG4yMyAqIG40MSAtIG4xMyAqIG4yMSAqIG40
MiArIG4xMSAqIG4yMyAqIG40MiArIG4xMiAqIG4yMSAqIG40MyAtIG4xMSAqIG4yMiAqIG40MyAp
ICogZGV0SW52OworCisJCQl0ZVsgMTIgXSA9IHQxNCAqIGRldEludjsKKwkJCXRlWyAxMyBdID0g
KCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBu
MTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRl
dEludjsKKwkJCXRlWyAxNCBdID0gKCBuMTQgKiBuMjIgKiBuMzEgLSBuMTIgKiBuMjQgKiBuMzEg
LSBuMTQgKiBuMjEgKiBuMzIgKyBuMTEgKiBuMjQgKiBuMzIgKyBuMTIgKiBuMjEgKiBuMzQgLSBu
MTEgKiBuMjIgKiBuMzQgKSAqIGRldEludjsKKwkJCXRlWyAxNSBdID0gKCBuMTIgKiBuMjMgKiBu
MzEgLSBuMTMgKiBuMjIgKiBuMzEgKyBuMTMgKiBuMjEgKiBuMzIgLSBuMTEgKiBuMjMgKiBuMzIg
LSBuMTIgKiBuMjEgKiBuMzMgKyBuMTEgKiBuMjIgKiBuMzMgKSAqIGRldEludjsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQlzY2FsZTogZnVuY3Rpb24gKCB2ICkgeworCisJCQl2YXIg
dGUgPSB0aGlzLmVsZW1lbnRzOworCQkJdmFyIHggPSB2LngsIHkgPSB2LnksIHogPSB2Lno7CisK
KwkJCXRlWyAwIF0gKj0geDsgdGVbIDQgXSAqPSB5OyB0ZVsgOCBdICo9IHo7CisJCQl0ZVsgMSBd
ICo9IHg7IHRlWyA1IF0gKj0geTsgdGVbIDkgXSAqPSB6OworCQkJdGVbIDIgXSAqPSB4OyB0ZVsg
NiBdICo9IHk7IHRlWyAxMCBdICo9IHo7CisJCQl0ZVsgMyBdICo9IHg7IHRlWyA3IF0gKj0geTsg
dGVbIDExIF0gKj0gejsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlnZXRNYXhTY2Fs
ZU9uQXhpczogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworCisJ
CQl2YXIgc2NhbGVYU3EgPSB0ZVsgMCBdICogdGVbIDAgXSArIHRlWyAxIF0gKiB0ZVsgMSBdICsg
dGVbIDIgXSAqIHRlWyAyIF07CisJCQl2YXIgc2NhbGVZU3EgPSB0ZVsgNCBdICogdGVbIDQgXSAr
IHRlWyA1IF0gKiB0ZVsgNSBdICsgdGVbIDYgXSAqIHRlWyA2IF07CisJCQl2YXIgc2NhbGVaU3Eg
PSB0ZVsgOCBdICogdGVbIDggXSArIHRlWyA5IF0gKiB0ZVsgOSBdICsgdGVbIDEwIF0gKiB0ZVsg
MTAgXTsKKworCQkJcmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlT
cSwgc2NhbGVaU3EgKSApOworCisJCX0sCisKKwkJbWFrZVRyYW5zbGF0aW9uOiBmdW5jdGlvbiAo
IHgsIHksIHogKSB7CisKKwkJCXRoaXMuc2V0KAorCisJCQkJMSwgMCwgMCwgeCwKKwkJCQkwLCAx
LCAwLCB5LAorCQkJCTAsIDAsIDEsIHosCisJCQkJMCwgMCwgMCwgMQorCisJCQkpOworCisJCQly
ZXR1cm4gdGhpczsKKworCQl9LAorCisJCW1ha2VSb3RhdGlvblg6IGZ1bmN0aW9uICggdGhldGEg
KSB7CisKKwkJCXZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEg
KTsKKworCQkJdGhpcy5zZXQoCisKKwkJCQkxLCAwLCAgMCwgMCwKKwkJCQkwLCBjLCAtIHMsIDAs
CisJCQkJMCwgcywgIGMsIDAsCisJCQkJMCwgMCwgIDAsIDEKKworCQkJKTsKKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQltYWtlUm90YXRpb25ZOiBmdW5jdGlvbiAoIHRoZXRhICkgewor
CisJCQl2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7CisK
KwkJCXRoaXMuc2V0KAorCisJCQkJIGMsIDAsIHMsIDAsCisJCQkJIDAsIDEsIDAsIDAsCisJCQkJ
LSBzLCAwLCBjLCAwLAorCQkJCSAwLCAwLCAwLCAxCisKKwkJCSk7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJbWFrZVJvdGF0aW9uWjogZnVuY3Rpb24gKCB0aGV0YSApIHsKKworCQkJ
dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApOworCisJCQl0
aGlzLnNldCgKKworCQkJCWMsIC0gcywgMCwgMCwKKwkJCQlzLCAgYywgMCwgMCwKKwkJCQkwLCAg
MCwgMSwgMCwKKwkJCQkwLCAgMCwgMCwgMQorCisJCQkpOworCisJCQlyZXR1cm4gdGhpczsKKwor
CQl9LAorCisJCW1ha2VSb3RhdGlvbkF4aXM6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7CisK
KwkJCS8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVz
L2FydGljbGUxMTk5LmFzcAorCisJCQl2YXIgYyA9IE1hdGguY29zKCBhbmdsZSApOworCQkJdmFy
IHMgPSBNYXRoLnNpbiggYW5nbGUgKTsKKwkJCXZhciB0ID0gMSAtIGM7CisJCQl2YXIgeCA9IGF4
aXMueCwgeSA9IGF4aXMueSwgeiA9IGF4aXMuejsKKwkJCXZhciB0eCA9IHQgKiB4LCB0eSA9IHQg
KiB5OworCisJCQl0aGlzLnNldCgKKworCQkJCXR4ICogeCArIGMsIHR4ICogeSAtIHMgKiB6LCB0
eCAqIHogKyBzICogeSwgMCwKKwkJCQl0eCAqIHkgKyBzICogeiwgdHkgKiB5ICsgYywgdHkgKiB6
IC0gcyAqIHgsIDAsCisJCQkJdHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMgKiB4LCB0ICogeiAq
IHogKyBjLCAwLAorCQkJCTAsIDAsIDAsIDEKKworCQkJKTsKKworCQkJIHJldHVybiB0aGlzOwor
CisJCX0sCisKKwkJbWFrZVNjYWxlOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7CisKKwkJCXRoaXMu
c2V0KAorCisJCQkJeCwgMCwgMCwgMCwKKwkJCQkwLCB5LCAwLCAwLAorCQkJCTAsIDAsIHosIDAs
CisJCQkJMCwgMCwgMCwgMQorCisJCQkpOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJ
CW1ha2VTaGVhcjogZnVuY3Rpb24gKCB4LCB5LCB6ICkgeworCisJCQl0aGlzLnNldCgKKworCQkJ
CTEsIHksIHosIDAsCisJCQkJeCwgMSwgeiwgMCwKKwkJCQl4LCB5LCAxLCAwLAorCQkJCTAsIDAs
IDAsIDEKKworCQkJKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljb21wb3NlOiBm
dW5jdGlvbiAoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHsKKworCQkJdGhpcy5tYWtl
Um90YXRpb25Gcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiApOworCQkJdGhpcy5zY2FsZSggc2Nh
bGUgKTsKKwkJCXRoaXMuc2V0UG9zaXRpb24oIHBvc2l0aW9uICk7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJZGVjb21wb3NlOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2ZWN0b3Ig
PSBuZXcgVmVjdG9yMygpOworCQkJdmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CisKKwkJCXJl
dHVybiBmdW5jdGlvbiBkZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHsK
KworCQkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisKKwkJCQl2YXIgc3ggPSB2ZWN0b3Iuc2V0
KCB0ZVsgMCBdLCB0ZVsgMSBdLCB0ZVsgMiBdICkubGVuZ3RoKCk7CisJCQkJdmFyIHN5ID0gdmVj
dG9yLnNldCggdGVbIDQgXSwgdGVbIDUgXSwgdGVbIDYgXSApLmxlbmd0aCgpOworCQkJCXZhciBz
eiA9IHZlY3Rvci5zZXQoIHRlWyA4IF0sIHRlWyA5IF0sIHRlWyAxMCBdICkubGVuZ3RoKCk7CisK
KwkJCQkvLyBpZiBkZXRlcm1pbmUgaXMgbmVnYXRpdmUsIHdlIG5lZWQgdG8gaW52ZXJ0IG9uZSBz
Y2FsZQorCQkJCXZhciBkZXQgPSB0aGlzLmRldGVybWluYW50KCk7CisJCQkJaWYgKCBkZXQgPCAw
ICkgc3ggPSAtIHN4OworCisJCQkJcG9zaXRpb24ueCA9IHRlWyAxMiBdOworCQkJCXBvc2l0aW9u
LnkgPSB0ZVsgMTMgXTsKKwkJCQlwb3NpdGlvbi56ID0gdGVbIDE0IF07CisKKwkJCQkvLyBzY2Fs
ZSB0aGUgcm90YXRpb24gcGFydAorCQkJCW1hdHJpeC5jb3B5KCB0aGlzICk7CisKKwkJCQl2YXIg
aW52U1ggPSAxIC8gc3g7CisJCQkJdmFyIGludlNZID0gMSAvIHN5OworCQkJCXZhciBpbnZTWiA9
IDEgLyBzejsKKworCQkJCW1hdHJpeC5lbGVtZW50c1sgMCBdICo9IGludlNYOworCQkJCW1hdHJp
eC5lbGVtZW50c1sgMSBdICo9IGludlNYOworCQkJCW1hdHJpeC5lbGVtZW50c1sgMiBdICo9IGlu
dlNYOworCisJCQkJbWF0cml4LmVsZW1lbnRzWyA0IF0gKj0gaW52U1k7CisJCQkJbWF0cml4LmVs
ZW1lbnRzWyA1IF0gKj0gaW52U1k7CisJCQkJbWF0cml4LmVsZW1lbnRzWyA2IF0gKj0gaW52U1k7
CisKKwkJCQltYXRyaXguZWxlbWVudHNbIDggXSAqPSBpbnZTWjsKKwkJCQltYXRyaXguZWxlbWVu
dHNbIDkgXSAqPSBpbnZTWjsKKwkJCQltYXRyaXguZWxlbWVudHNbIDEwIF0gKj0gaW52U1o7CisK
KwkJCQlxdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbWF0cml4ICk7CisKKwkJCQlz
Y2FsZS54ID0gc3g7CisJCQkJc2NhbGUueSA9IHN5OworCQkJCXNjYWxlLnogPSBzejsKKworCQkJ
CXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKworCQltYWtlUGVyc3BlY3RpdmU6IGZ1
bmN0aW9uICggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7CisKKwkJCWlm
ICggZmFyID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRy
aXg0OiAubWFrZVBlcnNwZWN0aXZlKCkgaGFzIGJlZW4gcmVkZWZpbmVkIGFuZCBoYXMgYSBuZXcg
c2lnbmF0dXJlLiBQbGVhc2UgY2hlY2sgdGhlIGRvY3MuJyApOworCisJCQl9CisKKwkJCXZhciB0
ZSA9IHRoaXMuZWxlbWVudHM7CisJCQl2YXIgeCA9IDIgKiBuZWFyIC8gKCByaWdodCAtIGxlZnQg
KTsKKwkJCXZhciB5ID0gMiAqIG5lYXIgLyAoIHRvcCAtIGJvdHRvbSApOworCisJCQl2YXIgYSA9
ICggcmlnaHQgKyBsZWZ0ICkgLyAoIHJpZ2h0IC0gbGVmdCApOworCQkJdmFyIGIgPSAoIHRvcCAr
IGJvdHRvbSApIC8gKCB0b3AgLSBib3R0b20gKTsKKwkJCXZhciBjID0gLSAoIGZhciArIG5lYXIg
KSAvICggZmFyIC0gbmVhciApOworCQkJdmFyIGQgPSAtIDIgKiBmYXIgKiBuZWFyIC8gKCBmYXIg
LSBuZWFyICk7CisKKwkJCXRlWyAwIF0gPSB4Owl0ZVsgNCBdID0gMDsJdGVbIDggXSA9IGE7CXRl
WyAxMiBdID0gMDsKKwkJCXRlWyAxIF0gPSAwOwl0ZVsgNSBdID0geTsJdGVbIDkgXSA9IGI7CXRl
WyAxMyBdID0gMDsKKwkJCXRlWyAyIF0gPSAwOwl0ZVsgNiBdID0gMDsJdGVbIDEwIF0gPSBjOwl0
ZVsgMTQgXSA9IGQ7CisJCQl0ZVsgMyBdID0gMDsJdGVbIDcgXSA9IDA7CXRlWyAxMSBdID0gLSAx
Owl0ZVsgMTUgXSA9IDA7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbWFrZU9ydGhv
Z3JhcGhpYzogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciAp
IHsKKworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKwkJCXZhciB3ID0gMS4wIC8gKCByaWdo
dCAtIGxlZnQgKTsKKwkJCXZhciBoID0gMS4wIC8gKCB0b3AgLSBib3R0b20gKTsKKwkJCXZhciBw
ID0gMS4wIC8gKCBmYXIgLSBuZWFyICk7CisKKwkJCXZhciB4ID0gKCByaWdodCArIGxlZnQgKSAq
IHc7CisJCQl2YXIgeSA9ICggdG9wICsgYm90dG9tICkgKiBoOworCQkJdmFyIHogPSAoIGZhciAr
IG5lYXIgKSAqIHA7CisKKwkJCXRlWyAwIF0gPSAyICogdzsJdGVbIDQgXSA9IDA7CXRlWyA4IF0g
PSAwOwl0ZVsgMTIgXSA9IC0geDsKKwkJCXRlWyAxIF0gPSAwOwl0ZVsgNSBdID0gMiAqIGg7CXRl
WyA5IF0gPSAwOwl0ZVsgMTMgXSA9IC0geTsKKwkJCXRlWyAyIF0gPSAwOwl0ZVsgNiBdID0gMDsJ
dGVbIDEwIF0gPSAtIDIgKiBwOwl0ZVsgMTQgXSA9IC0gejsKKwkJCXRlWyAzIF0gPSAwOwl0ZVsg
NyBdID0gMDsJdGVbIDExIF0gPSAwOwl0ZVsgMTUgXSA9IDE7CisKKwkJCXJldHVybiB0aGlzOwor
CisJCX0sCisKKwkJZXF1YWxzOiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKKworCQkJdmFyIHRlID0g
dGhpcy5lbGVtZW50czsKKwkJCXZhciBtZSA9IG1hdHJpeC5lbGVtZW50czsKKworCQkJZm9yICgg
dmFyIGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7CisKKwkJCQlpZiAoIHRlWyBpIF0gIT09IG1lWyBp
IF0gKSByZXR1cm4gZmFsc2U7CisKKwkJCX0KKworCQkJcmV0dXJuIHRydWU7CisKKwkJfSwKKwor
CQlmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKKworCQkJaWYgKCBvZmZz
ZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8
IDE2OyBpICsrICkgeworCisJCQkJdGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZz
ZXQgXTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXRvQXJyYXk6IGZ1
bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKKworCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVk
ICkgYXJyYXkgPSBbXTsKKwkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAw
OworCisJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworCisJCQlhcnJheVsgb2Zmc2V0IF0gPSB0
ZVsgMCBdOworCQkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07CisJCQlhcnJheVsgb2Zm
c2V0ICsgMiBdID0gdGVbIDIgXTsKKwkJCWFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdOwor
CisJCQlhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTsKKwkJCWFycmF5WyBvZmZzZXQgKyA1
IF0gPSB0ZVsgNSBdOworCQkJYXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07CisJCQlhcnJh
eVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTsKKworCQkJYXJyYXlbIG9mZnNldCArIDggXSA9IHRl
WyA4IF07CisJCQlhcnJheVsgb2Zmc2V0ICsgOSBdID0gdGVbIDkgXTsKKwkJCWFycmF5WyBvZmZz
ZXQgKyAxMCBdID0gdGVbIDEwIF07CisJCQlhcnJheVsgb2Zmc2V0ICsgMTEgXSA9IHRlWyAxMSBd
OworCisJCQlhcnJheVsgb2Zmc2V0ICsgMTIgXSA9IHRlWyAxMiBdOworCQkJYXJyYXlbIG9mZnNl
dCArIDEzIF0gPSB0ZVsgMTMgXTsKKwkJCWFycmF5WyBvZmZzZXQgKyAxNCBdID0gdGVbIDE0IF07
CisJCQlhcnJheVsgb2Zmc2V0ICsgMTUgXSA9IHRlWyAxNSBdOworCisJCQlyZXR1cm4gYXJyYXk7
CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9h
bHRlcmVkcXVhbGlhLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIERhdGFUZXh0dXJlKCBkYXRhLCB3
aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmls
dGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkgeworCisJCVRleHR1cmUuY2Fs
bCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRl
ciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApOworCisJCXRoaXMuaW1hZ2Ug
PSB7IGRhdGE6IGRhdGEsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTsKKworCQl0aGlz
Lm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVz
dEZpbHRlcjsKKwkJdGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1p
bkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7CisKKwkJdGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxz
ZTsKKwkJdGhpcy5mbGlwWSA9IGZhbHNlOworCQl0aGlzLnVucGFja0FsaWdubWVudCA9IDE7CisK
Kwl9CisKKwlEYXRhVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnBy
b3RvdHlwZSApOworCURhdGFUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGFUZXh0
dXJlOworCisJRGF0YVRleHR1cmUucHJvdG90eXBlLmlzRGF0YVRleHR1cmUgPSB0cnVlOworCisJ
LyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1
bmN0aW9uIEN1YmVUZXh0dXJlKCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmls
dGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7CisK
KwkJaW1hZ2VzID0gaW1hZ2VzICE9PSB1bmRlZmluZWQgPyBpbWFnZXMgOiBbXTsKKwkJbWFwcGlu
ZyA9IG1hcHBpbmcgIT09IHVuZGVmaW5lZCA/IG1hcHBpbmcgOiBDdWJlUmVmbGVjdGlvbk1hcHBp
bmc7CisKKwkJVGV4dHVyZS5jYWxsKCB0aGlzLCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFw
VCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2Rp
bmcgKTsKKworCQl0aGlzLmZsaXBZID0gZmFsc2U7CisKKwl9CisKKwlDdWJlVGV4dHVyZS5wcm90
b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApOworCUN1YmVUZXh0dXJl
LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVUZXh0dXJlOworCisJQ3ViZVRleHR1cmUucHJv
dG90eXBlLmlzQ3ViZVRleHR1cmUgPSB0cnVlOworCisJT2JqZWN0LmRlZmluZVByb3BlcnR5KCBD
dWJlVGV4dHVyZS5wcm90b3R5cGUsICdpbWFnZXMnLCB7CisKKwkJZ2V0OiBmdW5jdGlvbiAoKSB7
CisKKwkJCXJldHVybiB0aGlzLmltYWdlOworCisJCX0sCisKKwkJc2V0OiBmdW5jdGlvbiAoIHZh
bHVlICkgeworCisJCQl0aGlzLmltYWdlID0gdmFsdWU7CisKKwkJfQorCisJfSApOworCisJLyoq
CisJICogQGF1dGhvciB0c2NodworCSAqCisJICogVW5pZm9ybXMgb2YgYSBwcm9ncmFtLgorCSAq
IFRob3NlIGZvcm0gYSB0cmVlIHN0cnVjdHVyZSB3aXRoIGEgc3BlY2lhbCB0b3AtbGV2ZWwgY29u
dGFpbmVyIGZvciB0aGUgcm9vdCwKKwkgKiB3aGljaCB5b3UgZ2V0IGJ5IGNhbGxpbmcgJ25ldyBX
ZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKScuCisJICoKKwkgKgorCSAqIFBy
b3BlcnRpZXMgb2YgaW5uZXIgbm9kZXMgaW5jbHVkaW5nIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVy
OgorCSAqCisJICogLnNlcSAtIGFycmF5IG9mIG5lc3RlZCB1bmlmb3JtcworCSAqIC5tYXAgLSBu
ZXN0ZWQgdW5pZm9ybXMgYnkgbmFtZQorCSAqCisJICoKKwkgKiBNZXRob2RzIG9mIGFsbCBub2Rl
cyBleGNlcHQgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6CisJICoKKwkgKiAuc2V0VmFsdWUoIGds
LCB2YWx1ZSwgW3JlbmRlcmVyXSApCisJICoKKwkgKiAJCXVwbG9hZHMgYSB1bmlmb3JtIHZhbHVl
KHMpCisJICogIAl0aGUgJ3JlbmRlcmVyJyBwYXJhbWV0ZXIgaXMgbmVlZGVkIGZvciBzYW1wbGVy
IHVuaWZvcm1zCisJICoKKwkgKgorCSAqIFN0YXRpYyBtZXRob2RzIG9mIHRoZSB0b3AtbGV2ZWwg
Y29udGFpbmVyIChyZW5kZXJlciBmYWN0b3JpemF0aW9ucyk6CisJICoKKwkgKiAudXBsb2FkKCBn
bCwgc2VxLCB2YWx1ZXMsIHJlbmRlcmVyICkKKwkgKgorCSAqIAkJc2V0cyB1bmlmb3JtcyBpbiAn
c2VxJyB0byAndmFsdWVzW2lkXS52YWx1ZScKKwkgKgorCSAqIC5zZXFXaXRoVmFsdWUoIHNlcSwg
dmFsdWVzICkgOiBmaWx0ZXJlZFNlcQorCSAqCisJICogCQlmaWx0ZXJzICdzZXEnIGVudHJpZXMg
d2l0aCBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHZhbHVlcworCSAqCisJICoKKwkgKiBNZXRob2Rz
IG9mIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyIChyZW5kZXJlciBmYWN0b3JpemF0aW9ucyk6CisJ
ICoKKwkgKiAuc2V0VmFsdWUoIGdsLCBuYW1lLCB2YWx1ZSApCisJICoKKwkgKiAJCXNldHMgdW5p
Zm9ybSB3aXRoICBuYW1lICduYW1lJyB0byAndmFsdWUnCisJICoKKwkgKiAuc2V0KCBnbCwgb2Jq
LCBwcm9wICkKKwkgKgorCSAqIAkJc2V0cyB1bmlmb3JtIGZyb20gb2JqZWN0IGFuZCBwcm9wZXJ0
eSB3aXRoIHNhbWUgbmFtZSB0aGFuIHVuaWZvcm0KKwkgKgorCSAqIC5zZXRPcHRpb25hbCggZ2ws
IG9iaiwgcHJvcCApCisJICoKKwkgKiAJCWxpa2UgLnNldCBmb3IgYW4gb3B0aW9uYWwgcHJvcGVy
dHkgb2YgdGhlIG9iamVjdAorCSAqCisJICovCisKKwl2YXIgZW1wdHlUZXh0dXJlID0gbmV3IFRl
eHR1cmUoKTsKKwl2YXIgZW1wdHlDdWJlVGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpOworCisJ
Ly8gLS0tIEJhc2UgZm9yIGlubmVyIG5vZGVzIChpbmNsdWRpbmcgdGhlIHJvb3QpIC0tLQorCisJ
ZnVuY3Rpb24gVW5pZm9ybUNvbnRhaW5lcigpIHsKKworCQl0aGlzLnNlcSA9IFtdOworCQl0aGlz
Lm1hcCA9IHt9OworCisJfQorCisJLy8gLS0tIFV0aWxpdGllcyAtLS0KKworCS8vIEFycmF5IENh
Y2hlcyAocHJvdmlkZSB0eXBlZCBhcnJheXMgZm9yIHRlbXBvcmFyeSBieSBzaXplKQorCisJdmFy
IGFycmF5Q2FjaGVGMzIgPSBbXTsKKwl2YXIgYXJyYXlDYWNoZUkzMiA9IFtdOworCisJLy8gRmxv
YXQzMkFycmF5IGNhY2hlcyB1c2VkIGZvciB1cGxvYWRpbmcgTWF0cml4IHVuaWZvcm1zCisKKwl2
YXIgbWF0NGFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggMTYgKTsKKwl2YXIgbWF0M2FycmF5ID0g
bmV3IEZsb2F0MzJBcnJheSggOSApOworCisJLy8gRmxhdHRlbmluZyBmb3IgYXJyYXlzIG9mIHZl
Y3RvcnMgYW5kIG1hdHJpY2VzCisKKwlmdW5jdGlvbiBmbGF0dGVuKCBhcnJheSwgbkJsb2Nrcywg
YmxvY2tTaXplICkgeworCisJCXZhciBmaXJzdEVsZW0gPSBhcnJheVsgMCBdOworCisJCWlmICgg
Zmlyc3RFbGVtIDw9IDAgfHwgZmlyc3RFbGVtID4gMCApIHJldHVybiBhcnJheTsKKwkJLy8gdW5v
cHRpbWl6ZWQ6ICEgaXNOYU4oIGZpcnN0RWxlbSApCisJCS8vIHNlZSBodHRwOi8vamFja3NvbmR1
bnN0YW4uY29tL2FydGljbGVzLzk4MworCisJCXZhciBuID0gbkJsb2NrcyAqIGJsb2NrU2l6ZSwK
KwkJCXIgPSBhcnJheUNhY2hlRjMyWyBuIF07CisKKwkJaWYgKCByID09PSB1bmRlZmluZWQgKSB7
CisKKwkJCXIgPSBuZXcgRmxvYXQzMkFycmF5KCBuICk7CisJCQlhcnJheUNhY2hlRjMyWyBuIF0g
PSByOworCisJCX0KKworCQlpZiAoIG5CbG9ja3MgIT09IDAgKSB7CisKKwkJCWZpcnN0RWxlbS50
b0FycmF5KCByLCAwICk7CisKKwkJCWZvciAoIHZhciBpID0gMSwgb2Zmc2V0ID0gMDsgaSAhPT0g
bkJsb2NrczsgKysgaSApIHsKKworCQkJCW9mZnNldCArPSBibG9ja1NpemU7CisJCQkJYXJyYXlb
IGkgXS50b0FycmF5KCByLCBvZmZzZXQgKTsKKworCQkJfQorCisJCX0KKworCQlyZXR1cm4gcjsK
KworCX0KKworCS8vIFRleHR1cmUgdW5pdCBhbGxvY2F0aW9uCisKKwlmdW5jdGlvbiBhbGxvY1Rl
eFVuaXRzKCByZW5kZXJlciwgbiApIHsKKworCQl2YXIgciA9IGFycmF5Q2FjaGVJMzJbIG4gXTsK
KworCQlpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsKKworCQkJciA9IG5ldyBJbnQzMkFycmF5KCBu
ICk7CisJCQlhcnJheUNhY2hlSTMyWyBuIF0gPSByOworCisJCX0KKworCQlmb3IgKCB2YXIgaSA9
IDA7IGkgIT09IG47ICsrIGkgKQorCQkJclsgaSBdID0gcmVuZGVyZXIuYWxsb2NUZXh0dXJlVW5p
dCgpOworCisJCXJldHVybiByOworCisJfQorCisJLy8gLS0tIFNldHRlcnMgLS0tCisKKwkvLyBO
b3RlOiBEZWZpbmluZyB0aGVzZSBtZXRob2RzIGV4dGVybmFsbHksIGJlY2F1c2UgdGhleSBjb21l
IGluIGEgYnVuY2gKKwkvLyBhbmQgdGhpcyB3YXkgdGhlaXIgbmFtZXMgbWluaWZ5LgorCisJLy8g
U2luZ2xlIHNjYWxhcgorCisJZnVuY3Rpb24gc2V0VmFsdWUxZiggZ2wsIHYgKSB7IGdsLnVuaWZv
cm0xZiggdGhpcy5hZGRyLCB2ICk7IH0KKwlmdW5jdGlvbiBzZXRWYWx1ZTFpKCBnbCwgdiApIHsg
Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHYgKTsgfQorCisJLy8gU2luZ2xlIGZsb2F0IHZlY3Rv
ciAoZnJvbSBmbGF0IGFycmF5IG9yIFRIUkVFLlZlY3Rvck4pCisKKwlmdW5jdGlvbiBzZXRWYWx1
ZTJmdiggZ2wsIHYgKSB7CisKKwkJaWYgKCB2LnggPT09IHVuZGVmaW5lZCApIGdsLnVuaWZvcm0y
ZnYoIHRoaXMuYWRkciwgdiApOworCQllbHNlIGdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2Lngs
IHYueSApOworCisJfQorCisJZnVuY3Rpb24gc2V0VmFsdWUzZnYoIGdsLCB2ICkgeworCisJCWlm
ICggdi54ICE9PSB1bmRlZmluZWQgKQorCQkJZ2wudW5pZm9ybTNmKCB0aGlzLmFkZHIsIHYueCwg
di55LCB2LnogKTsKKwkJZWxzZSBpZiAoIHYuciAhPT0gdW5kZWZpbmVkICkKKwkJCWdsLnVuaWZv
cm0zZiggdGhpcy5hZGRyLCB2LnIsIHYuZywgdi5iICk7CisJCWVsc2UKKwkJCWdsLnVuaWZvcm0z
ZnYoIHRoaXMuYWRkciwgdiApOworCisJfQorCisJZnVuY3Rpb24gc2V0VmFsdWU0ZnYoIGdsLCB2
ICkgeworCisJCWlmICggdi54ID09PSB1bmRlZmluZWQgKSBnbC51bmlmb3JtNGZ2KCB0aGlzLmFk
ZHIsIHYgKTsKKwkJZWxzZSBnbC51bmlmb3JtNGYoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiwg
di53ICk7CisKKwl9CisKKwkvLyBTaW5nbGUgbWF0cml4IChmcm9tIGZsYXQgYXJyYXkgb3IgTWF0
cml4TikKKworCWZ1bmN0aW9uIHNldFZhbHVlMmZtKCBnbCwgdiApIHsKKworCQlnbC51bmlmb3Jt
TWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2LmVsZW1lbnRzIHx8IHYgKTsKKworCX0KKwor
CWZ1bmN0aW9uIHNldFZhbHVlM2ZtKCBnbCwgdiApIHsKKworCQlpZiAoIHYuZWxlbWVudHMgPT09
IHVuZGVmaW5lZCApIHsKKworCQkJZ2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxz
ZSwgdiApOworCisJCX0gZWxzZSB7CisKKwkJCW1hdDNhcnJheS5zZXQoIHYuZWxlbWVudHMgKTsK
KwkJCWdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIG1hdDNhcnJheSApOwor
CisJCX0KKworCX0KKworCWZ1bmN0aW9uIHNldFZhbHVlNGZtKCBnbCwgdiApIHsKKworCQlpZiAo
IHYuZWxlbWVudHMgPT09IHVuZGVmaW5lZCApIHsKKworCQkJZ2wudW5pZm9ybU1hdHJpeDRmdigg
dGhpcy5hZGRyLCBmYWxzZSwgdiApOworCisJCX0gZWxzZSB7CisKKwkJCW1hdDRhcnJheS5zZXQo
IHYuZWxlbWVudHMgKTsKKwkJCWdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2Us
IG1hdDRhcnJheSApOworCisJCX0KKworCX0KKworCS8vIFNpbmdsZSB0ZXh0dXJlICgyRCAvIEN1
YmUpCisKKwlmdW5jdGlvbiBzZXRWYWx1ZVQxKCBnbCwgdiwgcmVuZGVyZXIgKSB7CisKKwkJdmFy
IHVuaXQgPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7CisJCWdsLnVuaWZvcm0xaSggdGhp
cy5hZGRyLCB1bml0ICk7CisJCXJlbmRlcmVyLnNldFRleHR1cmUyRCggdiB8fCBlbXB0eVRleHR1
cmUsIHVuaXQgKTsKKworCX0KKworCWZ1bmN0aW9uIHNldFZhbHVlVDYoIGdsLCB2LCByZW5kZXJl
ciApIHsKKworCQl2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTsKKwkJZ2wu
dW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTsKKwkJcmVuZGVyZXIuc2V0VGV4dHVyZUN1YmUo
IHYgfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdCApOworCisJfQorCisJLy8gSW50ZWdlciAvIEJv
b2xlYW4gdmVjdG9ycyBvciBhcnJheXMgdGhlcmVvZiAoYWx3YXlzIGZsYXQgYXJyYXlzKQorCisJ
ZnVuY3Rpb24gc2V0VmFsdWUyaXYoIGdsLCB2ICkgeyBnbC51bmlmb3JtMml2KCB0aGlzLmFkZHIs
IHYgKTsgfQorCWZ1bmN0aW9uIHNldFZhbHVlM2l2KCBnbCwgdiApIHsgZ2wudW5pZm9ybTNpdigg
dGhpcy5hZGRyLCB2ICk7IH0KKwlmdW5jdGlvbiBzZXRWYWx1ZTRpdiggZ2wsIHYgKSB7IGdsLnVu
aWZvcm00aXYoIHRoaXMuYWRkciwgdiApOyB9CisKKwkvLyBIZWxwZXIgdG8gcGljayB0aGUgcmln
aHQgc2V0dGVyIGZvciB0aGUgc2luZ3VsYXIgY2FzZQorCisJZnVuY3Rpb24gZ2V0U2luZ3VsYXJT
ZXR0ZXIoIHR5cGUgKSB7CisKKwkJc3dpdGNoICggdHlwZSApIHsKKworCQkJY2FzZSAweDE0MDY6
IHJldHVybiBzZXRWYWx1ZTFmOyAvLyBGTE9BVAorCQkJY2FzZSAweDhiNTA6IHJldHVybiBzZXRW
YWx1ZTJmdjsgLy8gX1ZFQzIKKwkJCWNhc2UgMHg4YjUxOiByZXR1cm4gc2V0VmFsdWUzZnY7IC8v
IF9WRUMzCisJCQljYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlNGZ2OyAvLyBfVkVDNAorCisJ
CQljYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlMmZtOyAvLyBfTUFUMgorCQkJY2FzZSAweDhi
NWI6IHJldHVybiBzZXRWYWx1ZTNmbTsgLy8gX01BVDMKKwkJCWNhc2UgMHg4YjVjOiByZXR1cm4g
c2V0VmFsdWU0Zm07IC8vIF9NQVQ0CisKKwkJCWNhc2UgMHg4YjVlOiBjYXNlIDB4OGQ2NjogcmV0
dXJuIHNldFZhbHVlVDE7IC8vIFNBTVBMRVJfMkQsIFNBTVBMRVJfRVhURVJOQUxfT0VTCisJCQlj
YXNlIDB4OGI2MDogcmV0dXJuIHNldFZhbHVlVDY7IC8vIFNBTVBMRVJfQ1VCRQorCisJCQljYXNl
IDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZTFpOyAvLyBJTlQsIEJPT0wKKwkJ
CWNhc2UgMHg4YjUzOiBjYXNlIDB4OGI1NzogcmV0dXJuIHNldFZhbHVlMml2OyAvLyBfVkVDMgor
CQkJY2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMz
CisJCQljYXNlIDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZTRpdjsgLy8gX1ZF
QzQKKworCQl9CisKKwl9CisKKwkvLyBBcnJheSBvZiBzY2FsYXJzCisKKwlmdW5jdGlvbiBzZXRW
YWx1ZTFmdiggZ2wsIHYgKSB7IGdsLnVuaWZvcm0xZnYoIHRoaXMuYWRkciwgdiApOyB9CisJZnVu
Y3Rpb24gc2V0VmFsdWUxaXYoIGdsLCB2ICkgeyBnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHYg
KTsgfQorCisJLy8gQXJyYXkgb2YgdmVjdG9ycyAoZmxhdCBvciBmcm9tIFRIUkVFIGNsYXNzZXMp
CisKKwlmdW5jdGlvbiBzZXRWYWx1ZVYyYSggZ2wsIHYgKSB7CisKKwkJZ2wudW5pZm9ybTJmdigg
dGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDIgKSApOworCisJfQorCisJZnVuY3Rp
b24gc2V0VmFsdWVWM2EoIGdsLCB2ICkgeworCisJCWdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwg
ZmxhdHRlbiggdiwgdGhpcy5zaXplLCAzICkgKTsKKworCX0KKworCWZ1bmN0aW9uIHNldFZhbHVl
VjRhKCBnbCwgdiApIHsKKworCQlnbC51bmlmb3JtNGZ2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYs
IHRoaXMuc2l6ZSwgNCApICk7CisKKwl9CisKKwkvLyBBcnJheSBvZiBtYXRyaWNlcyAoZmxhdCBv
ciBmcm9tIFRIUkVFIGNsYXNlcykKKworCWZ1bmN0aW9uIHNldFZhbHVlTTJhKCBnbCwgdiApIHsK
KworCQlnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBmbGF0dGVuKCB2LCB0
aGlzLnNpemUsIDQgKSApOworCisJfQorCisJZnVuY3Rpb24gc2V0VmFsdWVNM2EoIGdsLCB2ICkg
eworCisJCWdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIGZsYXR0ZW4oIHYs
IHRoaXMuc2l6ZSwgOSApICk7CisKKwl9CisKKwlmdW5jdGlvbiBzZXRWYWx1ZU00YSggZ2wsIHYg
KSB7CisKKwkJZ2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbigg
diwgdGhpcy5zaXplLCAxNiApICk7CisKKwl9CisKKwkvLyBBcnJheSBvZiB0ZXh0dXJlcyAoMkQg
LyBDdWJlKQorCisJZnVuY3Rpb24gc2V0VmFsdWVUMWEoIGdsLCB2LCByZW5kZXJlciApIHsKKwor
CQl2YXIgbiA9IHYubGVuZ3RoLAorCQkJdW5pdHMgPSBhbGxvY1RleFVuaXRzKCByZW5kZXJlciwg
biApOworCisJCWdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTsKKworCQlmb3IgKCB2
YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7CisKKwkJCXJlbmRlcmVyLnNldFRleHR1cmUyRCgg
dlsgaSBdIHx8IGVtcHR5VGV4dHVyZSwgdW5pdHNbIGkgXSApOworCisJCX0KKworCX0KKworCWZ1
bmN0aW9uIHNldFZhbHVlVDZhKCBnbCwgdiwgcmVuZGVyZXIgKSB7CisKKwkJdmFyIG4gPSB2Lmxl
bmd0aCwKKwkJCXVuaXRzID0gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKTsKKworCQlnbC51
bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7CisKKwkJZm9yICggdmFyIGkgPSAwOyBpICE9
PSBuOyArKyBpICkgeworCisJCQlyZW5kZXJlci5zZXRUZXh0dXJlQ3ViZSggdlsgaSBdIHx8IGVt
cHR5Q3ViZVRleHR1cmUsIHVuaXRzWyBpIF0gKTsKKworCQl9CisKKwl9CisKKwkvLyBIZWxwZXIg
dG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciBhIHB1cmUgKGJvdHRvbS1sZXZlbCkgYXJyYXkK
KworCWZ1bmN0aW9uIGdldFB1cmVBcnJheVNldHRlciggdHlwZSApIHsKKworCQlzd2l0Y2ggKCB0
eXBlICkgeworCisJCQljYXNlIDB4MTQwNjogcmV0dXJuIHNldFZhbHVlMWZ2OyAvLyBGTE9BVAor
CQkJY2FzZSAweDhiNTA6IHJldHVybiBzZXRWYWx1ZVYyYTsgLy8gX1ZFQzIKKwkJCWNhc2UgMHg4
YjUxOiByZXR1cm4gc2V0VmFsdWVWM2E7IC8vIF9WRUMzCisJCQljYXNlIDB4OGI1MjogcmV0dXJu
IHNldFZhbHVlVjRhOyAvLyBfVkVDNAorCisJCQljYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVl
TTJhOyAvLyBfTUFUMgorCQkJY2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZU0zYTsgLy8gX01B
VDMKKwkJCWNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWVNNGE7IC8vIF9NQVQ0CisKKwkJCWNh
c2UgMHg4YjVlOiByZXR1cm4gc2V0VmFsdWVUMWE7IC8vIFNBTVBMRVJfMkQKKwkJCWNhc2UgMHg4
YjYwOiByZXR1cm4gc2V0VmFsdWVUNmE7IC8vIFNBTVBMRVJfQ1VCRQorCisJCQljYXNlIDB4MTQw
NDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZTFpdjsgLy8gSU5ULCBCT09MCisJCQljYXNl
IDB4OGI1MzogY2FzZSAweDhiNTc6IHJldHVybiBzZXRWYWx1ZTJpdjsgLy8gX1ZFQzIKKwkJCWNh
c2UgMHg4YjU0OiBjYXNlIDB4OGI1ODogcmV0dXJuIHNldFZhbHVlM2l2OyAvLyBfVkVDMworCQkJ
Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0CisK
KwkJfQorCisJfQorCisJLy8gLS0tIFVuaWZvcm0gQ2xhc3NlcyAtLS0KKworCWZ1bmN0aW9uIFNp
bmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgeworCisJCXRoaXMuaWQgPSBpZDsK
KwkJdGhpcy5hZGRyID0gYWRkcjsKKwkJdGhpcy5zZXRWYWx1ZSA9IGdldFNpbmd1bGFyU2V0dGVy
KCBhY3RpdmVJbmZvLnR5cGUgKTsKKworCQkvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7
IC8vIERFQlVHCisKKwl9CisKKwlmdW5jdGlvbiBQdXJlQXJyYXlVbmlmb3JtKCBpZCwgYWN0aXZl
SW5mbywgYWRkciApIHsKKworCQl0aGlzLmlkID0gaWQ7CisJCXRoaXMuYWRkciA9IGFkZHI7CisJ
CXRoaXMuc2l6ZSA9IGFjdGl2ZUluZm8uc2l6ZTsKKwkJdGhpcy5zZXRWYWx1ZSA9IGdldFB1cmVB
cnJheVNldHRlciggYWN0aXZlSW5mby50eXBlICk7CisKKwkJLy8gdGhpcy5wYXRoID0gYWN0aXZl
SW5mby5uYW1lOyAvLyBERUJVRworCisJfQorCisJZnVuY3Rpb24gU3RydWN0dXJlZFVuaWZvcm0o
IGlkICkgeworCisJCXRoaXMuaWQgPSBpZDsKKworCQlVbmlmb3JtQ29udGFpbmVyLmNhbGwoIHRo
aXMgKTsgLy8gbWl4LWluCisKKwl9CisKKwlTdHJ1Y3R1cmVkVW5pZm9ybS5wcm90b3R5cGUuc2V0
VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCB2YWx1ZSApIHsKKworCQkvLyBOb3RlOiBEb24ndCBuZWVk
IGFuIGV4dHJhICdyZW5kZXJlcicgcGFyYW1ldGVyLCBzaW5jZSBzYW1wbGVycworCQkvLyBhcmUg
bm90IGFsbG93ZWQgaW4gc3RydWN0dXJlZCB1bmlmb3Jtcy4KKworCQl2YXIgc2VxID0gdGhpcy5z
ZXE7CisKKwkJZm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSAp
IHsKKworCQkJdmFyIHUgPSBzZXFbIGkgXTsKKwkJCXUuc2V0VmFsdWUoIGdsLCB2YWx1ZVsgdS5p
ZCBdICk7CisKKwkJfQorCisJfTsKKworCS8vIC0tLSBUb3AtbGV2ZWwgLS0tCisKKwkvLyBQYXJz
ZXIgLSBidWlsZHMgdXAgdGhlIHByb3BlcnR5IHRyZWUgZnJvbSB0aGUgcGF0aCBzdHJpbmdzCisK
Kwl2YXIgUmVQYXRoUGFydCA9IC8oW1x3XGRfXSspKFxdKT8oXFt8XC4pPy9nOworCisJLy8gZXh0
cmFjdHMKKwkvLyAJLSB0aGUgaWRlbnRpZmllciAobWVtYmVyIG5hbWUgb3IgYXJyYXkgaW5kZXgp
CisJLy8gIC0gZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgcmlnaHQgYnJhY2tldCAoZm91bmQgd2hl
biBhcnJheSBpbmRleCkKKwkvLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBsZWZ0IGJyYWNr
ZXQgb3IgZG90ICh0eXBlIG9mIHN1YnNjcmlwdCkKKwkvLworCS8vIE5vdGU6IFRoZXNlIHBvcnRp
b25zIGNhbiBiZSByZWFkIGluIGEgbm9uLW92ZXJsYXBwaW5nIGZhc2hpb24gYW5kCisJLy8gYWxs
b3cgc3RyYWlnaHRmb3J3YXJkIHBhcnNpbmcgb2YgdGhlIGhpZXJhcmNoeSB0aGF0IFdlYkdMIGVu
Y29kZXMKKwkvLyBpbiB0aGUgdW5pZm9ybSBuYW1lcy4KKworCWZ1bmN0aW9uIGFkZFVuaWZvcm0o
IGNvbnRhaW5lciwgdW5pZm9ybU9iamVjdCApIHsKKworCQljb250YWluZXIuc2VxLnB1c2goIHVu
aWZvcm1PYmplY3QgKTsKKwkJY29udGFpbmVyLm1hcFsgdW5pZm9ybU9iamVjdC5pZCBdID0gdW5p
Zm9ybU9iamVjdDsKKworCX0KKworCWZ1bmN0aW9uIHBhcnNlVW5pZm9ybSggYWN0aXZlSW5mbywg
YWRkciwgY29udGFpbmVyICkgeworCisJCXZhciBwYXRoID0gYWN0aXZlSW5mby5uYW1lLAorCQkJ
cGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoOworCisJCS8vIHJlc2V0IFJlZ0V4cCBvYmplY3QsIGJl
Y2F1c2Ugb2YgdGhlIGVhcmx5IGV4aXQgb2YgYSBwcmV2aW91cyBydW4KKwkJUmVQYXRoUGFydC5s
YXN0SW5kZXggPSAwOworCisJCWZvciAoIDsgOyApIHsKKworCQkJdmFyIG1hdGNoID0gUmVQYXRo
UGFydC5leGVjKCBwYXRoICksCisJCQkJbWF0Y2hFbmQgPSBSZVBhdGhQYXJ0Lmxhc3RJbmRleCwK
KworCQkJCWlkID0gbWF0Y2hbIDEgXSwKKwkJCQlpZElzSW5kZXggPSBtYXRjaFsgMiBdID09PSAn
XScsCisJCQkJc3Vic2NyaXB0ID0gbWF0Y2hbIDMgXTsKKworCQkJaWYgKCBpZElzSW5kZXggKSBp
ZCA9IGlkIHwgMDsgLy8gY29udmVydCB0byBpbnRlZ2VyCisKKwkJCWlmICggc3Vic2NyaXB0ID09
PSB1bmRlZmluZWQgfHwgc3Vic2NyaXB0ID09PSAnWycgJiYgbWF0Y2hFbmQgKyAyID09PSBwYXRo
TGVuZ3RoICkgeworCisJCQkJLy8gYmFyZSBuYW1lIG9yICJwdXJlIiBib3R0b20tbGV2ZWwgYXJy
YXkgIlswXSIgc3VmZml4CisKKwkJCQlhZGRVbmlmb3JtKCBjb250YWluZXIsIHN1YnNjcmlwdCA9
PT0gdW5kZWZpbmVkID8KKwkJCQkJCW5ldyBTaW5nbGVVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywg
YWRkciApIDoKKwkJCQkJCW5ldyBQdXJlQXJyYXlVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRk
ciApICk7CisKKwkJCQlicmVhazsKKworCQkJfSBlbHNlIHsKKworCQkJCS8vIHN0ZXAgaW50byBp
bm5lciBub2RlIC8gY3JlYXRlIGl0IGluIGNhc2UgaXQgZG9lc24ndCBleGlzdAorCisJCQkJdmFy
IG1hcCA9IGNvbnRhaW5lci5tYXAsIG5leHQgPSBtYXBbIGlkIF07CisKKwkJCQlpZiAoIG5leHQg
PT09IHVuZGVmaW5lZCApIHsKKworCQkJCQluZXh0ID0gbmV3IFN0cnVjdHVyZWRVbmlmb3JtKCBp
ZCApOworCQkJCQlhZGRVbmlmb3JtKCBjb250YWluZXIsIG5leHQgKTsKKworCQkJCX0KKworCQkJ
CWNvbnRhaW5lciA9IG5leHQ7CisKKwkJCX0KKworCQl9CisKKwl9CisKKwkvLyBSb290IENvbnRh
aW5lcgorCisJZnVuY3Rpb24gV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVyICkg
eworCisJCVVuaWZvcm1Db250YWluZXIuY2FsbCggdGhpcyApOworCisJCXRoaXMucmVuZGVyZXIg
PSByZW5kZXJlcjsKKworCQl2YXIgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0s
IGdsLkFDVElWRV9VTklGT1JNUyApOworCisJCWZvciAoIHZhciBpID0gMDsgaSA8IG47ICsrIGkg
KSB7CisKKwkJCXZhciBpbmZvID0gZ2wuZ2V0QWN0aXZlVW5pZm9ybSggcHJvZ3JhbSwgaSApLAor
CQkJCXBhdGggPSBpbmZvLm5hbWUsCisJCQkJYWRkciA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbigg
cHJvZ3JhbSwgcGF0aCApOworCisJCQlwYXJzZVVuaWZvcm0oIGluZm8sIGFkZHIsIHRoaXMgKTsK
KworCQl9CisKKwl9CisKKwlXZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0
aW9uICggZ2wsIG5hbWUsIHZhbHVlICkgeworCisJCXZhciB1ID0gdGhpcy5tYXBbIG5hbWUgXTsK
KworCQlpZiAoIHUgIT09IHVuZGVmaW5lZCApIHUuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgdGhpcy5y
ZW5kZXJlciApOworCisJfTsKKworCVdlYkdMVW5pZm9ybXMucHJvdG90eXBlLnNldE9wdGlvbmFs
ID0gZnVuY3Rpb24gKCBnbCwgb2JqZWN0LCBuYW1lICkgeworCisJCXZhciB2ID0gb2JqZWN0WyBu
YW1lIF07CisKKwkJaWYgKCB2ICE9PSB1bmRlZmluZWQgKSB0aGlzLnNldFZhbHVlKCBnbCwgbmFt
ZSwgdiApOworCisJfTsKKworCisJLy8gU3RhdGljIGludGVyZmFjZQorCisJV2ViR0xVbmlmb3Jt
cy51cGxvYWQgPSBmdW5jdGlvbiAoIGdsLCBzZXEsIHZhbHVlcywgcmVuZGVyZXIgKSB7CisKKwkJ
Zm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworCQkJ
dmFyIHUgPSBzZXFbIGkgXSwKKwkJCQl2ID0gdmFsdWVzWyB1LmlkIF07CisKKwkJCWlmICggdi5u
ZWVkc1VwZGF0ZSAhPT0gZmFsc2UgKSB7CisKKwkJCQkvLyBub3RlOiBhbHdheXMgdXBkYXRpbmcg
d2hlbiAubmVlZHNVcGRhdGUgaXMgdW5kZWZpbmVkCisJCQkJdS5zZXRWYWx1ZSggZ2wsIHYudmFs
dWUsIHJlbmRlcmVyICk7CisKKwkJCX0KKworCQl9CisKKwl9OworCisJV2ViR0xVbmlmb3Jtcy5z
ZXFXaXRoVmFsdWUgPSBmdW5jdGlvbiAoIHNlcSwgdmFsdWVzICkgeworCisJCXZhciByID0gW107
CisKKwkJZm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsK
KworCQkJdmFyIHUgPSBzZXFbIGkgXTsKKwkJCWlmICggdS5pZCBpbiB2YWx1ZXMgKSByLnB1c2go
IHUgKTsKKworCQl9CisKKwkJcmV0dXJuIHI7CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBt
cmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCXZhciBDb2xvcktleXdvcmRzID0g
eyAnYWxpY2VibHVlJzogMHhGMEY4RkYsICdhbnRpcXVld2hpdGUnOiAweEZBRUJENywgJ2FxdWEn
OiAweDAwRkZGRiwgJ2FxdWFtYXJpbmUnOiAweDdGRkZENCwgJ2F6dXJlJzogMHhGMEZGRkYsCisJ
CSdiZWlnZSc6IDB4RjVGNURDLCAnYmlzcXVlJzogMHhGRkU0QzQsICdibGFjayc6IDB4MDAwMDAw
LCAnYmxhbmNoZWRhbG1vbmQnOiAweEZGRUJDRCwgJ2JsdWUnOiAweDAwMDBGRiwgJ2JsdWV2aW9s
ZXQnOiAweDhBMkJFMiwKKwkJJ2Jyb3duJzogMHhBNTJBMkEsICdidXJseXdvb2QnOiAweERFQjg4
NywgJ2NhZGV0Ymx1ZSc6IDB4NUY5RUEwLCAnY2hhcnRyZXVzZSc6IDB4N0ZGRjAwLCAnY2hvY29s
YXRlJzogMHhEMjY5MUUsICdjb3JhbCc6IDB4RkY3RjUwLAorCQknY29ybmZsb3dlcmJsdWUnOiAw
eDY0OTVFRCwgJ2Nvcm5zaWxrJzogMHhGRkY4REMsICdjcmltc29uJzogMHhEQzE0M0MsICdjeWFu
JzogMHgwMEZGRkYsICdkYXJrYmx1ZSc6IDB4MDAwMDhCLCAnZGFya2N5YW4nOiAweDAwOEI4QiwK
KwkJJ2Rhcmtnb2xkZW5yb2QnOiAweEI4ODYwQiwgJ2RhcmtncmF5JzogMHhBOUE5QTksICdkYXJr
Z3JlZW4nOiAweDAwNjQwMCwgJ2RhcmtncmV5JzogMHhBOUE5QTksICdkYXJra2hha2knOiAweEJE
Qjc2QiwgJ2RhcmttYWdlbnRhJzogMHg4QjAwOEIsCisJCSdkYXJrb2xpdmVncmVlbic6IDB4NTU2
QjJGLCAnZGFya29yYW5nZSc6IDB4RkY4QzAwLCAnZGFya29yY2hpZCc6IDB4OTkzMkNDLCAnZGFy
a3JlZCc6IDB4OEIwMDAwLCAnZGFya3NhbG1vbic6IDB4RTk5NjdBLCAnZGFya3NlYWdyZWVuJzog
MHg4RkJDOEYsCisJCSdkYXJrc2xhdGVibHVlJzogMHg0ODNEOEIsICdkYXJrc2xhdGVncmF5Jzog
MHgyRjRGNEYsICdkYXJrc2xhdGVncmV5JzogMHgyRjRGNEYsICdkYXJrdHVycXVvaXNlJzogMHgw
MENFRDEsICdkYXJrdmlvbGV0JzogMHg5NDAwRDMsCisJCSdkZWVwcGluayc6IDB4RkYxNDkzLCAn
ZGVlcHNreWJsdWUnOiAweDAwQkZGRiwgJ2RpbWdyYXknOiAweDY5Njk2OSwgJ2RpbWdyZXknOiAw
eDY5Njk2OSwgJ2RvZGdlcmJsdWUnOiAweDFFOTBGRiwgJ2ZpcmVicmljayc6IDB4QjIyMjIyLAor
CQknZmxvcmFsd2hpdGUnOiAweEZGRkFGMCwgJ2ZvcmVzdGdyZWVuJzogMHgyMjhCMjIsICdmdWNo
c2lhJzogMHhGRjAwRkYsICdnYWluc2Jvcm8nOiAweERDRENEQywgJ2dob3N0d2hpdGUnOiAweEY4
RjhGRiwgJ2dvbGQnOiAweEZGRDcwMCwKKwkJJ2dvbGRlbnJvZCc6IDB4REFBNTIwLCAnZ3JheSc6
IDB4ODA4MDgwLCAnZ3JlZW4nOiAweDAwODAwMCwgJ2dyZWVueWVsbG93JzogMHhBREZGMkYsICdn
cmV5JzogMHg4MDgwODAsICdob25leWRldyc6IDB4RjBGRkYwLCAnaG90cGluayc6IDB4RkY2OUI0
LAorCQknaW5kaWFucmVkJzogMHhDRDVDNUMsICdpbmRpZ28nOiAweDRCMDA4MiwgJ2l2b3J5Jzog
MHhGRkZGRjAsICdraGFraSc6IDB4RjBFNjhDLCAnbGF2ZW5kZXInOiAweEU2RTZGQSwgJ2xhdmVu
ZGVyYmx1c2gnOiAweEZGRjBGNSwgJ2xhd25ncmVlbic6IDB4N0NGQzAwLAorCQknbGVtb25jaGlm
Zm9uJzogMHhGRkZBQ0QsICdsaWdodGJsdWUnOiAweEFERDhFNiwgJ2xpZ2h0Y29yYWwnOiAweEYw
ODA4MCwgJ2xpZ2h0Y3lhbic6IDB4RTBGRkZGLCAnbGlnaHRnb2xkZW5yb2R5ZWxsb3cnOiAweEZB
RkFEMiwgJ2xpZ2h0Z3JheSc6IDB4RDNEM0QzLAorCQknbGlnaHRncmVlbic6IDB4OTBFRTkwLCAn
bGlnaHRncmV5JzogMHhEM0QzRDMsICdsaWdodHBpbmsnOiAweEZGQjZDMSwgJ2xpZ2h0c2FsbW9u
JzogMHhGRkEwN0EsICdsaWdodHNlYWdyZWVuJzogMHgyMEIyQUEsICdsaWdodHNreWJsdWUnOiAw
eDg3Q0VGQSwKKwkJJ2xpZ2h0c2xhdGVncmF5JzogMHg3Nzg4OTksICdsaWdodHNsYXRlZ3JleSc6
IDB4Nzc4ODk5LCAnbGlnaHRzdGVlbGJsdWUnOiAweEIwQzRERSwgJ2xpZ2h0eWVsbG93JzogMHhG
RkZGRTAsICdsaW1lJzogMHgwMEZGMDAsICdsaW1lZ3JlZW4nOiAweDMyQ0QzMiwKKwkJJ2xpbmVu
JzogMHhGQUYwRTYsICdtYWdlbnRhJzogMHhGRjAwRkYsICdtYXJvb24nOiAweDgwMDAwMCwgJ21l
ZGl1bWFxdWFtYXJpbmUnOiAweDY2Q0RBQSwgJ21lZGl1bWJsdWUnOiAweDAwMDBDRCwgJ21lZGl1
bW9yY2hpZCc6IDB4QkE1NUQzLAorCQknbWVkaXVtcHVycGxlJzogMHg5MzcwREIsICdtZWRpdW1z
ZWFncmVlbic6IDB4M0NCMzcxLCAnbWVkaXVtc2xhdGVibHVlJzogMHg3QjY4RUUsICdtZWRpdW1z
cHJpbmdncmVlbic6IDB4MDBGQTlBLCAnbWVkaXVtdHVycXVvaXNlJzogMHg0OEQxQ0MsCisJCSdt
ZWRpdW12aW9sZXRyZWQnOiAweEM3MTU4NSwgJ21pZG5pZ2h0Ymx1ZSc6IDB4MTkxOTcwLCAnbWlu
dGNyZWFtJzogMHhGNUZGRkEsICdtaXN0eXJvc2UnOiAweEZGRTRFMSwgJ21vY2Nhc2luJzogMHhG
RkU0QjUsICduYXZham93aGl0ZSc6IDB4RkZERUFELAorCQknbmF2eSc6IDB4MDAwMDgwLCAnb2xk
bGFjZSc6IDB4RkRGNUU2LCAnb2xpdmUnOiAweDgwODAwMCwgJ29saXZlZHJhYic6IDB4NkI4RTIz
LCAnb3JhbmdlJzogMHhGRkE1MDAsICdvcmFuZ2VyZWQnOiAweEZGNDUwMCwgJ29yY2hpZCc6IDB4
REE3MEQ2LAorCQkncGFsZWdvbGRlbnJvZCc6IDB4RUVFOEFBLCAncGFsZWdyZWVuJzogMHg5OEZC
OTgsICdwYWxldHVycXVvaXNlJzogMHhBRkVFRUUsICdwYWxldmlvbGV0cmVkJzogMHhEQjcwOTMs
ICdwYXBheWF3aGlwJzogMHhGRkVGRDUsICdwZWFjaHB1ZmYnOiAweEZGREFCOSwKKwkJJ3BlcnUn
OiAweENEODUzRiwgJ3BpbmsnOiAweEZGQzBDQiwgJ3BsdW0nOiAweEREQTBERCwgJ3Bvd2RlcmJs
dWUnOiAweEIwRTBFNiwgJ3B1cnBsZSc6IDB4ODAwMDgwLCAncmVkJzogMHhGRjAwMDAsICdyb3N5
YnJvd24nOiAweEJDOEY4RiwKKwkJJ3JveWFsYmx1ZSc6IDB4NDE2OUUxLCAnc2FkZGxlYnJvd24n
OiAweDhCNDUxMywgJ3NhbG1vbic6IDB4RkE4MDcyLCAnc2FuZHlicm93bic6IDB4RjRBNDYwLCAn
c2VhZ3JlZW4nOiAweDJFOEI1NywgJ3NlYXNoZWxsJzogMHhGRkY1RUUsCisJCSdzaWVubmEnOiAw
eEEwNTIyRCwgJ3NpbHZlcic6IDB4QzBDMEMwLCAnc2t5Ymx1ZSc6IDB4ODdDRUVCLCAnc2xhdGVi
bHVlJzogMHg2QTVBQ0QsICdzbGF0ZWdyYXknOiAweDcwODA5MCwgJ3NsYXRlZ3JleSc6IDB4NzA4
MDkwLCAnc25vdyc6IDB4RkZGQUZBLAorCQknc3ByaW5nZ3JlZW4nOiAweDAwRkY3RiwgJ3N0ZWVs
Ymx1ZSc6IDB4NDY4MkI0LCAndGFuJzogMHhEMkI0OEMsICd0ZWFsJzogMHgwMDgwODAsICd0aGlz
dGxlJzogMHhEOEJGRDgsICd0b21hdG8nOiAweEZGNjM0NywgJ3R1cnF1b2lzZSc6IDB4NDBFMEQw
LAorCQkndmlvbGV0JzogMHhFRTgyRUUsICd3aGVhdCc6IDB4RjVERUIzLCAnd2hpdGUnOiAweEZG
RkZGRiwgJ3doaXRlc21va2UnOiAweEY1RjVGNSwgJ3llbGxvdyc6IDB4RkZGRjAwLCAneWVsbG93
Z3JlZW4nOiAweDlBQ0QzMiB9OworCisJZnVuY3Rpb24gQ29sb3IoIHIsIGcsIGIgKSB7CisKKwkJ
aWYgKCBnID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkICkgeworCisJCQkvLyByIGlz
IFRIUkVFLkNvbG9yLCBoZXggb3Igc3RyaW5nCisJCQlyZXR1cm4gdGhpcy5zZXQoIHIgKTsKKwor
CQl9CisKKwkJcmV0dXJuIHRoaXMuc2V0UkdCKCByLCBnLCBiICk7CisKKwl9CisKKwlPYmplY3Qu
YXNzaWduKCBDb2xvci5wcm90b3R5cGUsIHsKKworCQlpc0NvbG9yOiB0cnVlLAorCisJCXI6IDEs
IGc6IDEsIGI6IDEsCisKKwkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQlpZiAoIHZh
bHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7CisKKwkJCQl0aGlzLmNvcHkoIHZhbHVlICk7CisKKwkJ
CX0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSB7CisKKwkJCQl0aGlzLnNl
dEhleCggdmFsdWUgKTsKKworCQkJfSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5n
JyApIHsKKworCQkJCXRoaXMuc2V0U3R5bGUoIHZhbHVlICk7CisKKwkJCX0KKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQlzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgeworCisJ
CQl0aGlzLnIgPSBzY2FsYXI7CisJCQl0aGlzLmcgPSBzY2FsYXI7CisJCQl0aGlzLmIgPSBzY2Fs
YXI7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0SGV4OiBmdW5jdGlvbiAoIGhl
eCApIHsKKworCQkJaGV4ID0gTWF0aC5mbG9vciggaGV4ICk7CisKKwkJCXRoaXMuciA9ICggaGV4
ID4+IDE2ICYgMjU1ICkgLyAyNTU7CisJCQl0aGlzLmcgPSAoIGhleCA+PiA4ICYgMjU1ICkgLyAy
NTU7CisJCQl0aGlzLmIgPSAoIGhleCAmIDI1NSApIC8gMjU1OworCisJCQlyZXR1cm4gdGhpczsK
KworCQl9LAorCisJCXNldFJHQjogZnVuY3Rpb24gKCByLCBnLCBiICkgeworCisJCQl0aGlzLnIg
PSByOworCQkJdGhpcy5nID0gZzsKKwkJCXRoaXMuYiA9IGI7CisKKwkJCXJldHVybiB0aGlzOwor
CisJCX0sCisKKwkJc2V0SFNMOiBmdW5jdGlvbiAoKSB7CisKKwkJCWZ1bmN0aW9uIGh1ZTJyZ2Io
IHAsIHEsIHQgKSB7CisKKwkJCQlpZiAoIHQgPCAwICkgdCArPSAxOworCQkJCWlmICggdCA+IDEg
KSB0IC09IDE7CisJCQkJaWYgKCB0IDwgMSAvIDYgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYg
KiB0OworCQkJCWlmICggdCA8IDEgLyAyICkgcmV0dXJuIHE7CisJCQkJaWYgKCB0IDwgMiAvIDMg
KSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiAoIDIgLyAzIC0gdCApOworCQkJCXJldHVybiBw
OworCisJCQl9CisKKwkJCXJldHVybiBmdW5jdGlvbiBzZXRIU0woIGgsIHMsIGwgKSB7CisKKwkJ
CQkvLyBoLHMsbCByYW5nZXMgYXJlIGluIDAuMCAtIDEuMAorCQkJCWggPSBfTWF0aC5ldWNsaWRl
YW5Nb2R1bG8oIGgsIDEgKTsKKwkJCQlzID0gX01hdGguY2xhbXAoIHMsIDAsIDEgKTsKKwkJCQls
ID0gX01hdGguY2xhbXAoIGwsIDAsIDEgKTsKKworCQkJCWlmICggcyA9PT0gMCApIHsKKworCQkJ
CQl0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsOworCisJCQkJfSBlbHNlIHsKKworCQkJCQl2
YXIgcCA9IGwgPD0gMC41ID8gbCAqICggMSArIHMgKSA6IGwgKyBzIC0gKCBsICogcyApOworCQkJ
CQl2YXIgcSA9ICggMiAqIGwgKSAtIHA7CisKKwkJCQkJdGhpcy5yID0gaHVlMnJnYiggcSwgcCwg
aCArIDEgLyAzICk7CisJCQkJCXRoaXMuZyA9IGh1ZTJyZ2IoIHEsIHAsIGggKTsKKwkJCQkJdGhp
cy5iID0gaHVlMnJnYiggcSwgcCwgaCAtIDEgLyAzICk7CisKKwkJCQl9CisKKwkJCQlyZXR1cm4g
dGhpczsKKworCQkJfTsKKworCQl9KCksCisKKwkJc2V0U3R5bGU6IGZ1bmN0aW9uICggc3R5bGUg
KSB7CisKKwkJCWZ1bmN0aW9uIGhhbmRsZUFscGhhKCBzdHJpbmcgKSB7CisKKwkJCQlpZiAoIHN0
cmluZyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOworCisJCQkJaWYgKCBwYXJzZUZsb2F0KCBzdHJp
bmcgKSA8IDEgKSB7CisKKwkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNv
bXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7CisKKwkJCQl9CisK
KwkJCX0KKworCisJCQl2YXIgbTsKKworCQkJaWYgKCBtID0gL14oKD86cmdifGhzbClhPylcKFxz
KihbXlwpXSopXCkvLmV4ZWMoIHN0eWxlICkgKSB7CisKKwkJCQkvLyByZ2IgLyBoc2wKKworCQkJ
CXZhciBjb2xvcjsKKwkJCQl2YXIgbmFtZSA9IG1bIDEgXTsKKwkJCQl2YXIgY29tcG9uZW50cyA9
IG1bIDIgXTsKKworCQkJCXN3aXRjaCAoIG5hbWUgKSB7CisKKwkJCQkJY2FzZSAncmdiJzoKKwkJ
CQkJY2FzZSAncmdiYSc6CisKKwkJCQkJCWlmICggY29sb3IgPSAvXihcZCspXHMqLFxzKihcZCsp
XHMqLFxzKihcZCspXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyggY29tcG9u
ZW50cyApICkgeworCisJCQkJCQkJLy8gcmdiKDI1NSwwLDApIHJnYmEoMjU1LDAsMCwwLjUpCisJ
CQkJCQkJdGhpcy5yID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkg
KSAvIDI1NTsKKwkJCQkJCQl0aGlzLmcgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3Jb
IDIgXSwgMTAgKSApIC8gMjU1OworCQkJCQkJCXRoaXMuYiA9IE1hdGgubWluKCAyNTUsIHBhcnNl
SW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAyNTU7CisKKwkJCQkJCQloYW5kbGVBbHBoYSggY29s
b3JbIDUgXSApOworCisJCQkJCQkJcmV0dXJuIHRoaXM7CisKKwkJCQkJCX0KKworCQkJCQkJaWYg
KCBjb2xvciA9IC9eKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooLFxzKihb
MC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7CisKKwkJCQkJCQkv
LyByZ2IoMTAwJSwwJSwwJSkgcmdiYSgxMDAlLDAlLDAlLDAuNSkKKwkJCQkJCQl0aGlzLnIgPSBN
YXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMTAwOworCQkJCQkJ
CXRoaXMuZyA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApICkgLyAx
MDA7CisJCQkJCQkJdGhpcy5iID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAzIF0s
IDEwICkgKSAvIDEwMDsKKworCQkJCQkJCWhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7CisKKwkJ
CQkJCQlyZXR1cm4gdGhpczsKKworCQkJCQkJfQorCisJCQkJCQlicmVhazsKKworCQkJCQljYXNl
ICdoc2wnOgorCQkJCQljYXNlICdoc2xhJzoKKworCQkJCQkJaWYgKCBjb2xvciA9IC9eKFswLTld
KlwuP1swLTldKylccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKCxccyooWzAtOV0qXC4/
WzAtOV0rKVxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkgeworCisJCQkJCQkJLy8gaHNsKDEy
MCw1MCUsNTAlKSBoc2xhKDEyMCw1MCUsNTAlLDAuNSkKKwkJCQkJCQl2YXIgaCA9IHBhcnNlRmxv
YXQoIGNvbG9yWyAxIF0gKSAvIDM2MDsKKwkJCQkJCQl2YXIgcyA9IHBhcnNlSW50KCBjb2xvclsg
MiBdLCAxMCApIC8gMTAwOworCQkJCQkJCXZhciBsID0gcGFyc2VJbnQoIGNvbG9yWyAzIF0sIDEw
ICkgLyAxMDA7CisKKwkJCQkJCQloYW5kbGVBbHBoYSggY29sb3JbIDUgXSApOworCisJCQkJCQkJ
cmV0dXJuIHRoaXMuc2V0SFNMKCBoLCBzLCBsICk7CisKKwkJCQkJCX0KKworCQkJCQkJYnJlYWs7
CisKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoIG0gPSAvXlwjKFtBLUZhLWYwLTldKykkLy5leGVj
KCBzdHlsZSApICkgeworCisJCQkJLy8gaGV4IGNvbG9yCisKKwkJCQl2YXIgaGV4ID0gbVsgMSBd
OworCQkJCXZhciBzaXplID0gaGV4Lmxlbmd0aDsKKworCQkJCWlmICggc2l6ZSA9PT0gMyApIHsK
KworCQkJCQkvLyAjZmYwCisJCQkJCXRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkg
KyBoZXguY2hhckF0KCAwICksIDE2ICkgLyAyNTU7CisJCQkJCXRoaXMuZyA9IHBhcnNlSW50KCBo
ZXguY2hhckF0KCAxICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7CisJCQkJCXRoaXMu
YiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAyICksIDE2ICkgLyAy
NTU7CisKKwkJCQkJcmV0dXJuIHRoaXM7CisKKwkJCQl9IGVsc2UgaWYgKCBzaXplID09PSA2ICkg
eworCisJCQkJCS8vICNmZjAwMDAKKwkJCQkJdGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQo
IDAgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTsKKwkJCQkJdGhpcy5nID0gcGFyc2VJ
bnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDMgKSwgMTYgKSAvIDI1NTsKKwkJCQkJ
dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDQgKSArIGhleC5jaGFyQXQoIDUgKSwgMTYg
KSAvIDI1NTsKKworCQkJCQlyZXR1cm4gdGhpczsKKworCQkJCX0KKworCQkJfQorCisJCQlpZiAo
IHN0eWxlICYmIHN0eWxlLmxlbmd0aCA+IDAgKSB7CisKKwkJCQkvLyBjb2xvciBrZXl3b3Jkcwor
CQkJCXZhciBoZXggPSBDb2xvcktleXdvcmRzWyBzdHlsZSBdOworCisJCQkJaWYgKCBoZXggIT09
IHVuZGVmaW5lZCApIHsKKworCQkJCQkvLyByZWQKKwkJCQkJdGhpcy5zZXRIZXgoIGhleCApOwor
CisJCQkJfSBlbHNlIHsKKworCQkJCQkvLyB1bmtub3duIGNvbG9yCisJCQkJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICcgKyBzdHlsZSApOworCisJCQkJfQorCisJ
CQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsK
KworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnIsIHRoaXMuZywgdGhpcy5i
ICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIGNvbG9yICkgeworCisJCQl0aGlzLnIg
PSBjb2xvci5yOworCQkJdGhpcy5nID0gY29sb3IuZzsKKwkJCXRoaXMuYiA9IGNvbG9yLmI7CisK
KwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY29weUdhbW1hVG9MaW5lYXI6IGZ1bmN0aW9u
ICggY29sb3IsIGdhbW1hRmFjdG9yICkgeworCisJCQlpZiAoIGdhbW1hRmFjdG9yID09PSB1bmRl
ZmluZWQgKSBnYW1tYUZhY3RvciA9IDIuMDsKKworCQkJdGhpcy5yID0gTWF0aC5wb3coIGNvbG9y
LnIsIGdhbW1hRmFjdG9yICk7CisJCQl0aGlzLmcgPSBNYXRoLnBvdyggY29sb3IuZywgZ2FtbWFG
YWN0b3IgKTsKKwkJCXRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBnYW1tYUZhY3RvciApOwor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNvcHlMaW5lYXJUb0dhbW1hOiBmdW5jdGlv
biAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHsKKworCQkJaWYgKCBnYW1tYUZhY3RvciA9PT0gdW5k
ZWZpbmVkICkgZ2FtbWFGYWN0b3IgPSAyLjA7CisKKwkJCXZhciBzYWZlSW52ZXJzZSA9ICggZ2Ft
bWFGYWN0b3IgPiAwICkgPyAoIDEuMCAvIGdhbW1hRmFjdG9yICkgOiAxLjA7CisKKwkJCXRoaXMu
ciA9IE1hdGgucG93KCBjb2xvci5yLCBzYWZlSW52ZXJzZSApOworCQkJdGhpcy5nID0gTWF0aC5w
b3coIGNvbG9yLmcsIHNhZmVJbnZlcnNlICk7CisJCQl0aGlzLmIgPSBNYXRoLnBvdyggY29sb3Iu
Yiwgc2FmZUludmVyc2UgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljb252ZXJ0
R2FtbWFUb0xpbmVhcjogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgciA9IHRoaXMuciwgZyA9IHRo
aXMuZywgYiA9IHRoaXMuYjsKKworCQkJdGhpcy5yID0gciAqIHI7CisJCQl0aGlzLmcgPSBnICog
ZzsKKwkJCXRoaXMuYiA9IGIgKiBiOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNv
bnZlcnRMaW5lYXJUb0dhbW1hOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMuciA9IE1hdGguc3Fy
dCggdGhpcy5yICk7CisJCQl0aGlzLmcgPSBNYXRoLnNxcnQoIHRoaXMuZyApOworCQkJdGhpcy5i
ID0gTWF0aC5zcXJ0KCB0aGlzLmIgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQln
ZXRIZXg6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuICggdGhpcy5yICogMjU1ICkgPDwgMTYg
XiAoIHRoaXMuZyAqIDI1NSApIDw8IDggXiAoIHRoaXMuYiAqIDI1NSApIDw8IDA7CisKKwkJfSwK
KworCQlnZXRIZXhTdHJpbmc6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuICggJzAwMDAwMCcg
KyB0aGlzLmdldEhleCgpLnRvU3RyaW5nKCAxNiApICkuc2xpY2UoIC0gNiApOworCisJCX0sCisK
KwkJZ2V0SFNMOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQkvLyBoLHMsbCBy
YW5nZXMgYXJlIGluIDAuMCAtIDEuMAorCisJCQl2YXIgaHNsID0gb3B0aW9uYWxUYXJnZXQgfHwg
eyBoOiAwLCBzOiAwLCBsOiAwIH07CisKKwkJCXZhciByID0gdGhpcy5yLCBnID0gdGhpcy5nLCBi
ID0gdGhpcy5iOworCisJCQl2YXIgbWF4ID0gTWF0aC5tYXgoIHIsIGcsIGIgKTsKKwkJCXZhciBt
aW4gPSBNYXRoLm1pbiggciwgZywgYiApOworCisJCQl2YXIgaHVlLCBzYXR1cmF0aW9uOworCQkJ
dmFyIGxpZ2h0bmVzcyA9ICggbWluICsgbWF4ICkgLyAyLjA7CisKKwkJCWlmICggbWluID09PSBt
YXggKSB7CisKKwkJCQlodWUgPSAwOworCQkJCXNhdHVyYXRpb24gPSAwOworCisJCQl9IGVsc2Ug
eworCisJCQkJdmFyIGRlbHRhID0gbWF4IC0gbWluOworCisJCQkJc2F0dXJhdGlvbiA9IGxpZ2h0
bmVzcyA8PSAwLjUgPyBkZWx0YSAvICggbWF4ICsgbWluICkgOiBkZWx0YSAvICggMiAtIG1heCAt
IG1pbiApOworCisJCQkJc3dpdGNoICggbWF4ICkgeworCisJCQkJCWNhc2UgcjogaHVlID0gKCBn
IC0gYiApIC8gZGVsdGEgKyAoIGcgPCBiID8gNiA6IDAgKTsgYnJlYWs7CisJCQkJCWNhc2UgZzog
aHVlID0gKCBiIC0gciApIC8gZGVsdGEgKyAyOyBicmVhazsKKwkJCQkJY2FzZSBiOiBodWUgPSAo
IHIgLSBnICkgLyBkZWx0YSArIDQ7IGJyZWFrOworCisJCQkJfQorCisJCQkJaHVlIC89IDY7CisK
KwkJCX0KKworCQkJaHNsLmggPSBodWU7CisJCQloc2wucyA9IHNhdHVyYXRpb247CisJCQloc2wu
bCA9IGxpZ2h0bmVzczsKKworCQkJcmV0dXJuIGhzbDsKKworCQl9LAorCisJCWdldFN0eWxlOiBm
dW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiAncmdiKCcgKyAoICggdGhpcy5yICogMjU1ICkgfCAw
ICkgKyAnLCcgKyAoICggdGhpcy5nICogMjU1ICkgfCAwICkgKyAnLCcgKyAoICggdGhpcy5iICog
MjU1ICkgfCAwICkgKyAnKSc7CisKKwkJfSwKKworCQlvZmZzZXRIU0w6IGZ1bmN0aW9uICggaCwg
cywgbCApIHsKKworCQkJdmFyIGhzbCA9IHRoaXMuZ2V0SFNMKCk7CisKKwkJCWhzbC5oICs9IGg7
IGhzbC5zICs9IHM7IGhzbC5sICs9IGw7CisKKwkJCXRoaXMuc2V0SFNMKCBoc2wuaCwgaHNsLnMs
IGhzbC5sICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJYWRkOiBmdW5jdGlvbiAo
IGNvbG9yICkgeworCisJCQl0aGlzLnIgKz0gY29sb3IucjsKKwkJCXRoaXMuZyArPSBjb2xvci5n
OworCQkJdGhpcy5iICs9IGNvbG9yLmI7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJ
YWRkQ29sb3JzOiBmdW5jdGlvbiAoIGNvbG9yMSwgY29sb3IyICkgeworCisJCQl0aGlzLnIgPSBj
b2xvcjEuciArIGNvbG9yMi5yOworCQkJdGhpcy5nID0gY29sb3IxLmcgKyBjb2xvcjIuZzsKKwkJ
CXRoaXMuYiA9IGNvbG9yMS5iICsgY29sb3IyLmI7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0s
CisKKwkJYWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CisKKwkJCXRoaXMuciArPSBzOworCQkJ
dGhpcy5nICs9IHM7CisJCQl0aGlzLmIgKz0gczsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQlzdWI6IGZ1bmN0aW9uKCBjb2xvciApIHsKKworCQkJdGhpcy5yID0gTWF0aC5tYXgoIDAs
IHRoaXMuciAtIGNvbG9yLnIgKTsKKwkJCXRoaXMuZyA9IE1hdGgubWF4KCAwLCB0aGlzLmcgLSBj
b2xvci5nICk7CisJCQl0aGlzLmIgPSBNYXRoLm1heCggMCwgdGhpcy5iIC0gY29sb3IuYiApOwor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCW11bHRpcGx5OiBmdW5jdGlvbiAoIGNvbG9y
ICkgeworCisJCQl0aGlzLnIgKj0gY29sb3IucjsKKwkJCXRoaXMuZyAqPSBjb2xvci5nOworCQkJ
dGhpcy5iICo9IGNvbG9yLmI7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbXVsdGlw
bHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHsKKworCQkJdGhpcy5yICo9IHM7CisJCQl0aGlzLmcg
Kj0gczsKKwkJCXRoaXMuYiAqPSBzOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWxl
cnA6IGZ1bmN0aW9uICggY29sb3IsIGFscGhhICkgeworCisJCQl0aGlzLnIgKz0gKCBjb2xvci5y
IC0gdGhpcy5yICkgKiBhbHBoYTsKKwkJCXRoaXMuZyArPSAoIGNvbG9yLmcgLSB0aGlzLmcgKSAq
IGFscGhhOworCQkJdGhpcy5iICs9ICggY29sb3IuYiAtIHRoaXMuYiApICogYWxwaGE7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZXF1YWxzOiBmdW5jdGlvbiAoIGMgKSB7CisKKwkJ
CXJldHVybiAoIGMuciA9PT0gdGhpcy5yICkgJiYgKCBjLmcgPT09IHRoaXMuZyApICYmICggYy5i
ID09PSB0aGlzLmIgKTsKKworCQl9LAorCisJCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwg
b2Zmc2V0ICkgeworCisJCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsK
KworCQkJdGhpcy5yID0gYXJyYXlbIG9mZnNldCBdOworCQkJdGhpcy5nID0gYXJyYXlbIG9mZnNl
dCArIDEgXTsKKwkJCXRoaXMuYiA9IGFycmF5WyBvZmZzZXQgKyAyIF07CisKKwkJCXJldHVybiB0
aGlzOworCisJCX0sCisKKwkJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewor
CisJCQlpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOworCQkJaWYgKCBvZmZz
ZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CisKKwkJCWFycmF5WyBvZmZzZXQgXSA9IHRo
aXMucjsKKwkJCWFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLmc7CisJCQlhcnJheVsgb2Zmc2V0
ICsgMiBdID0gdGhpcy5iOworCisJCQlyZXR1cm4gYXJyYXk7CisKKwkJfSwKKworCQl0b0pTT046
IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHRoaXMuZ2V0SGV4KCk7CisKKwkJfQorCisJfSAp
OworCisJLyoqCisJICogVW5pZm9ybXMgbGlicmFyeSBmb3Igc2hhcmVkIHdlYmdsIHNoYWRlcnMK
KwkgKi8KKworCXZhciBVbmlmb3Jtc0xpYiA9IHsKKworCQljb21tb246IHsKKworCQkJZGlmZnVz
ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sCisJCQlvcGFjaXR5OiB7IHZhbHVl
OiAxLjAgfSwKKworCQkJbWFwOiB7IHZhbHVlOiBudWxsIH0sCisJCQlvZmZzZXRSZXBlYXQ6IHsg
dmFsdWU6IG5ldyBWZWN0b3I0KCAwLCAwLCAxLCAxICkgfSwKKworCQkJc3BlY3VsYXJNYXA6IHsg
dmFsdWU6IG51bGwgfSwKKwkJCWFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sCisKKwkJCWVudk1h
cDogeyB2YWx1ZTogbnVsbCB9LAorCQkJZmxpcEVudk1hcDogeyB2YWx1ZTogLSAxIH0sCisJCQly
ZWZsZWN0aXZpdHk6IHsgdmFsdWU6IDEuMCB9LAorCQkJcmVmcmFjdGlvblJhdGlvOiB7IHZhbHVl
OiAwLjk4IH0KKworCQl9LAorCisJCWFvbWFwOiB7CisKKwkJCWFvTWFwOiB7IHZhbHVlOiBudWxs
IH0sCisJCQlhb01hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9CisKKwkJfSwKKworCQlsaWdodG1h
cDogeworCisJCQlsaWdodE1hcDogeyB2YWx1ZTogbnVsbCB9LAorCQkJbGlnaHRNYXBJbnRlbnNp
dHk6IHsgdmFsdWU6IDEgfQorCisJCX0sCisKKwkJZW1pc3NpdmVtYXA6IHsKKworCQkJZW1pc3Np
dmVNYXA6IHsgdmFsdWU6IG51bGwgfQorCisJCX0sCisKKwkJYnVtcG1hcDogeworCisJCQlidW1w
TWFwOiB7IHZhbHVlOiBudWxsIH0sCisJCQlidW1wU2NhbGU6IHsgdmFsdWU6IDEgfQorCisJCX0s
CisKKwkJbm9ybWFsbWFwOiB7CisKKwkJCW5vcm1hbE1hcDogeyB2YWx1ZTogbnVsbCB9LAorCQkJ
bm9ybWFsU2NhbGU6IHsgdmFsdWU6IG5ldyBWZWN0b3IyKCAxLCAxICkgfQorCisJCX0sCisKKwkJ
ZGlzcGxhY2VtZW50bWFwOiB7CisKKwkJCWRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9
LAorCQkJZGlzcGxhY2VtZW50U2NhbGU6IHsgdmFsdWU6IDEgfSwKKwkJCWRpc3BsYWNlbWVudEJp
YXM6IHsgdmFsdWU6IDAgfQorCisJCX0sCisKKwkJcm91Z2huZXNzbWFwOiB7CisKKwkJCXJvdWdo
bmVzc01hcDogeyB2YWx1ZTogbnVsbCB9CisKKwkJfSwKKworCQltZXRhbG5lc3NtYXA6IHsKKwor
CQkJbWV0YWxuZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0KKworCQl9LAorCisJCWdyYWRpZW50bWFw
OiB7CisKKwkJCWdyYWRpZW50TWFwOiB7IHZhbHVlOiBudWxsIH0KKworCQl9LAorCisJCWZvZzog
eworCisJCQlmb2dEZW5zaXR5OiB7IHZhbHVlOiAwLjAwMDI1IH0sCisJCQlmb2dOZWFyOiB7IHZh
bHVlOiAxIH0sCisJCQlmb2dGYXI6IHsgdmFsdWU6IDIwMDAgfSwKKwkJCWZvZ0NvbG9yOiB7IHZh
bHVlOiBuZXcgQ29sb3IoIDB4ZmZmZmZmICkgfQorCisJCX0sCisKKwkJbGlnaHRzOiB7CisKKwkJ
CWFtYmllbnRMaWdodENvbG9yOiB7IHZhbHVlOiBbXSB9LAorCisJCQlkaXJlY3Rpb25hbExpZ2h0
czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHsKKwkJCQlkaXJlY3Rpb246IHt9LAorCQkJCWNv
bG9yOiB7fSwKKworCQkJCXNoYWRvdzoge30sCisJCQkJc2hhZG93Qmlhczoge30sCisJCQkJc2hh
ZG93UmFkaXVzOiB7fSwKKwkJCQlzaGFkb3dNYXBTaXplOiB7fQorCQkJfSB9LAorCisJCQlkaXJl
Y3Rpb25hbFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSwKKwkJCWRpcmVjdGlvbmFsU2hhZG93TWF0
cml4OiB7IHZhbHVlOiBbXSB9LAorCisJCQlzcG90TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVy
dGllczogeworCQkJCWNvbG9yOiB7fSwKKwkJCQlwb3NpdGlvbjoge30sCisJCQkJZGlyZWN0aW9u
OiB7fSwKKwkJCQlkaXN0YW5jZToge30sCisJCQkJY29uZUNvczoge30sCisJCQkJcGVudW1icmFD
b3M6IHt9LAorCQkJCWRlY2F5OiB7fSwKKworCQkJCXNoYWRvdzoge30sCisJCQkJc2hhZG93Qmlh
czoge30sCisJCQkJc2hhZG93UmFkaXVzOiB7fSwKKwkJCQlzaGFkb3dNYXBTaXplOiB7fQorCQkJ
fSB9LAorCisJCQlzcG90U2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LAorCQkJc3BvdFNoYWRvd01h
dHJpeDogeyB2YWx1ZTogW10gfSwKKworCQkJcG9pbnRMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9w
ZXJ0aWVzOiB7CisJCQkJY29sb3I6IHt9LAorCQkJCXBvc2l0aW9uOiB7fSwKKwkJCQlkZWNheTog
e30sCisJCQkJZGlzdGFuY2U6IHt9LAorCisJCQkJc2hhZG93OiB7fSwKKwkJCQlzaGFkb3dCaWFz
OiB7fSwKKwkJCQlzaGFkb3dSYWRpdXM6IHt9LAorCQkJCXNoYWRvd01hcFNpemU6IHt9CisJCQl9
IH0sCisKKwkJCXBvaW50U2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LAorCQkJcG9pbnRTaGFkb3dN
YXRyaXg6IHsgdmFsdWU6IFtdIH0sCisKKwkJCWhlbWlzcGhlcmVMaWdodHM6IHsgdmFsdWU6IFtd
LCBwcm9wZXJ0aWVzOiB7CisJCQkJZGlyZWN0aW9uOiB7fSwKKwkJCQlza3lDb2xvcjoge30sCisJ
CQkJZ3JvdW5kQ29sb3I6IHt9CisJCQl9IH0sCisKKwkJCS8vIFRPRE8gKGFiZWxuYXRpb24pOiBS
ZWN0QXJlYUxpZ2h0IEJSREYgZGF0YSBuZWVkcyB0byBiZSBtb3ZlZCBmcm9tIGV4YW1wbGUgdG8g
bWFpbiBzcmMKKwkJCXJlY3RBcmVhTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczogewor
CQkJCWNvbG9yOiB7fSwKKwkJCQlwb3NpdGlvbjoge30sCisJCQkJd2lkdGg6IHt9LAorCQkJCWhl
aWdodDoge30KKwkJCX0gfQorCisJCX0sCisKKwkJcG9pbnRzOiB7CisKKwkJCWRpZmZ1c2U6IHsg
dmFsdWU6IG5ldyBDb2xvciggMHhlZWVlZWUgKSB9LAorCQkJb3BhY2l0eTogeyB2YWx1ZTogMS4w
IH0sCisJCQlzaXplOiB7IHZhbHVlOiAxLjAgfSwKKwkJCXNjYWxlOiB7IHZhbHVlOiAxLjAgfSwK
KwkJCW1hcDogeyB2YWx1ZTogbnVsbCB9LAorCQkJb2Zmc2V0UmVwZWF0OiB7IHZhbHVlOiBuZXcg
VmVjdG9yNCggMCwgMCwgMSwgMSApIH0KKworCQl9CisKKwl9OworCisJLyoqCisJICogVW5pZm9y
bSBVdGlsaXRpZXMKKwkgKi8KKworCXZhciBVbmlmb3Jtc1V0aWxzID0geworCisJCW1lcmdlOiBm
dW5jdGlvbiAoIHVuaWZvcm1zICkgeworCisJCQl2YXIgbWVyZ2VkID0ge307CisKKwkJCWZvciAo
IHZhciB1ID0gMDsgdSA8IHVuaWZvcm1zLmxlbmd0aDsgdSArKyApIHsKKworCQkJCXZhciB0bXAg
PSB0aGlzLmNsb25lKCB1bmlmb3Jtc1sgdSBdICk7CisKKwkJCQlmb3IgKCB2YXIgcCBpbiB0bXAg
KSB7CisKKwkJCQkJbWVyZ2VkWyBwIF0gPSB0bXBbIHAgXTsKKworCQkJCX0KKworCQkJfQorCisJ
CQlyZXR1cm4gbWVyZ2VkOworCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9uICggdW5pZm9ybXNf
c3JjICkgeworCisJCQl2YXIgdW5pZm9ybXNfZHN0ID0ge307CisKKwkJCWZvciAoIHZhciB1IGlu
IHVuaWZvcm1zX3NyYyApIHsKKworCQkJCXVuaWZvcm1zX2RzdFsgdSBdID0ge307CisKKwkJCQlm
b3IgKCB2YXIgcCBpbiB1bmlmb3Jtc19zcmNbIHUgXSApIHsKKworCQkJCQl2YXIgcGFyYW1ldGVy
X3NyYyA9IHVuaWZvcm1zX3NyY1sgdSBdWyBwIF07CisKKwkJCQkJaWYgKCBwYXJhbWV0ZXJfc3Jj
ICYmICggcGFyYW1ldGVyX3NyYy5pc0NvbG9yIHx8CisJCQkJCQlwYXJhbWV0ZXJfc3JjLmlzTWF0
cml4MyB8fCBwYXJhbWV0ZXJfc3JjLmlzTWF0cml4NCB8fAorCQkJCQkJcGFyYW1ldGVyX3NyYy5p
c1ZlY3RvcjIgfHwgcGFyYW1ldGVyX3NyYy5pc1ZlY3RvcjMgfHwgcGFyYW1ldGVyX3NyYy5pc1Zl
Y3RvcjQgfHwKKwkJCQkJCXBhcmFtZXRlcl9zcmMuaXNUZXh0dXJlICkgKSB7CisKKwkJCQkJCXVu
aWZvcm1zX2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjLmNsb25lKCk7CisKKwkJCQkJfSBl
bHNlIGlmICggQXJyYXkuaXNBcnJheSggcGFyYW1ldGVyX3NyYyApICkgeworCisJCQkJCQl1bmlm
b3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYy5zbGljZSgpOworCisJCQkJCX0gZWxz
ZSB7CisKKwkJCQkJCXVuaWZvcm1zX2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjOworCisJ
CQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gdW5pZm9ybXNfZHN0OworCisJCX0K
KworCX07CisKKwl2YXIgYWxwaGFtYXBfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9BTFBIQU1BUFxu
XHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xuI2VuZGlm
XG4iOworCisJdmFyIGFscGhhbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9BTFBIQU1B
UFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcbiNlbmRpZlxuIjsKKworCXZhciBhbHBo
YXRlc3RfZnJhZ21lbnQgPSAiI2lmZGVmIEFMUEhBVEVTVFxuXHRpZiAoIGRpZmZ1c2VDb2xvci5h
IDwgQUxQSEFURVNUICkgZGlzY2FyZDtcbiNlbmRpZlxuIjsKKworCXZhciBhb21hcF9mcmFnbWVu
dCA9ICIjaWZkZWYgVVNFX0FPTUFQXG5cdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1
cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcblx0
cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XG5cdCNp
ZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUEhZU0lDQUwgKVxuXHRcdGZsb2F0
IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGly
ICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVj
dWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnNwZWN1bGFy
Um91Z2huZXNzICk7XG5cdCNlbmRpZlxuI2VuZGlmXG4iOworCisJdmFyIGFvbWFwX3BhcnNfZnJh
Z21lbnQgPSAiI2lmZGVmIFVTRV9BT01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcblx0
dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcbiNlbmRpZiI7CisKKwl2YXIgYmVnaW5fdmVy
dGV4ID0gIlxudmVjMyB0cmFuc2Zvcm1lZCA9IHZlYzMoIHBvc2l0aW9uICk7XG4iOworCisJdmFy
IGJlZ2lubm9ybWFsX3ZlcnRleCA9ICJcbnZlYzMgb2JqZWN0Tm9ybWFsID0gdmVjMyggbm9ybWFs
ICk7XG4iOworCisJdmFyIGJzZGZzID0gImZsb2F0IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0ly
cmFkaWFuY2VGYWN0b3IoIGNvbnN0IGluIGZsb2F0IGxpZ2h0RGlzdGFuY2UsIGNvbnN0IGluIGZs
b2F0IGN1dG9mZkRpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBkZWNheUV4cG9uZW50ICkge1xuXHRp
ZiggZGVjYXlFeHBvbmVudCA+IDAuMCApIHtcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JS
RUNUX0xJR0hUUyApXG5cdFx0ZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3co
IGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApO1xuXHRcdGZsb2F0IG1heERp
c3RhbmNlQ3V0b2ZmRmFjdG9yID0gcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlz
dGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcblx0XHRyZXR1cm4gZGlzdGFuY2VGYWxsb2Zm
ICogbWF4RGlzdGFuY2VDdXRvZmZGYWN0b3I7XG4jZWxzZVxuXHRcdHJldHVybiBwb3coIHNhdHVy
YXRlKCAtbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICsgMS4wICksIGRlY2F5RXhwb25l
bnQgKTtcbiNlbmRpZlxuXHR9XG5cdHJldHVybiAxLjA7XG59XG52ZWMzIEJSREZfRGlmZnVzZV9M
YW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvciApIHtcblx0cmV0dXJuIFJFQ0lQUk9D
QUxfUEkgKiBkaWZmdXNlQ29sb3I7XG59XG52ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBz
cGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBkb3RMSCApIHtcblx0ZmxvYXQgZnJlc25lbCA9
IGV4cDIoICggLTUuNTU0NzMgKiBkb3RMSCAtIDYuOTgzMTYgKSAqIGRvdExIICk7XG5cdHJldHVy
biAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIGZyZXNuZWwgKyBzcGVjdWxhckNvbG9yO1xufVxu
ZmxvYXQgR19HR1hfU21pdGgoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBk
b3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEg
KTtcblx0ZmxvYXQgZ2wgPSBkb3ROTCArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93Migg
ZG90TkwgKSApO1xuXHRmbG9hdCBndiA9IGRvdE5WICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkg
KiBwb3cyKCBkb3ROViApICk7XG5cdHJldHVybiAxLjAgLyAoIGdsICogZ3YgKTtcbn1cbmZsb2F0
IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZs
b2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcblx0ZmxvYXQgYTIgPSBwb3cyKCBh
bHBoYSApO1xuXHRmbG9hdCBndiA9IGRvdE5MICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBw
b3cyKCBkb3ROViApICk7XG5cdGZsb2F0IGdsID0gZG90TlYgKiBzcXJ0KCBhMiArICggMS4wIC0g
YTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcblx0cmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBT
SUxPTiApO1xufVxuZmxvYXQgRF9HR1goIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBm
bG9hdCBkb3ROSCApIHtcblx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xuXHRmbG9hdCBkZW5v
bSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7XG5cdHJldHVybiBSRUNJUFJP
Q0FMX1BJICogYTIgLyBwb3cyKCBkZW5vbSApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWCgg
Y29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWND
b250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZs
b2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcblx0
dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21l
dHJ5LnZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5u
b3JtYWwsIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0ZmxvYXQgZG90TlYgPSBzYXR1
cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xuXHRmbG9h
dCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGFsZkRpciApICk7XG5c
dGZsb2F0IGRvdExIID0gc2F0dXJhdGUoIGRvdCggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24sIGhh
bGZEaXIgKSApO1xuXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7
XG5cdGZsb2F0IEcgPSBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYg
KTtcblx0ZmxvYXQgRCA9IERfR0dYKCBhbHBoYSwgZG90TkggKTtcblx0cmV0dXJuIEYgKiAoIEcg
KiBEICk7XG59XG52ZWMyIExUQ19VdiggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYs
IGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0Y29uc3QgZmxvYXQgTFVUX1NJWkUgID0g
NjQuMDtcblx0Y29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVU
X1NJWkU7XG5cdGNvbnN0IGZsb2F0IExVVF9CSUFTICA9IDAuNSAvIExVVF9TSVpFO1xuXHRmbG9h
dCB0aGV0YSA9IGFjb3MoIGRvdCggTiwgViApICk7XG5cdHZlYzIgdXYgPSB2ZWMyKFxuXHRcdHNx
cnQoIHNhdHVyYXRlKCByb3VnaG5lc3MgKSApLFxuXHRcdHNhdHVyYXRlKCB0aGV0YSAvICggMC41
ICogUEkgKSApICk7XG5cdHV2ID0gdXYgKiBMVVRfU0NBTEUgKyBMVVRfQklBUztcblx0cmV0dXJu
IHV2O1xufVxuZmxvYXQgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMz
IGYgKSB7XG5cdGZsb2F0IGwgPSBsZW5ndGgoIGYgKTtcblx0cmV0dXJuIG1heCggKCBsICogbCAr
IGYueiApIC8gKCBsICsgMS4wICksIDAuMCApO1xufVxudmVjMyBMVENfRWRnZVZlY3RvckZvcm1G
YWN0b3IoIGNvbnN0IGluIHZlYzMgdjEsIGNvbnN0IGluIHZlYzMgdjIgKSB7XG5cdGZsb2F0IHgg
PSBkb3QoIHYxLCB2MiApO1xuXHRmbG9hdCB5ID0gYWJzKCB4ICk7XG5cdGZsb2F0IGEgPSAwLjg2
MjY3ICsgKDAuNDk3ODggKyAwLjAxNDM2ICogeSApICogeTtcblx0ZmxvYXQgYiA9IDMuNDUwNjgg
KyAoNC4xODgxNCArIHkpICogeTtcblx0ZmxvYXQgdiA9IGEgLyBiO1xuXHRmbG9hdCB0aGV0YV9z
aW50aGV0YSA9ICh4ID4gMC4wKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggMS4wIC0geCAqIHgg
KSAtIHY7XG5cdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcbn1cbnZl
YzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3Qg
aW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sg
NCBdICkge1xuXHR2ZWMzIHYxID0gcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xu
XHR2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIGxp
Z2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApO1xuXHRpZiggZG90KCBsaWdodE5vcm1hbCwgUCAt
IHJlY3RDb29yZHNbIDAgXSApIDwgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApO1xuXHR2ZWMzIFQx
LCBUMjtcblx0VDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcblx0VDIgPSAt
IGNyb3NzKCBOLCBUMSApO1xuXHRtYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2UoIG1hdDMoIFQx
LCBUMiwgTiApICk7XG5cdHZlYzMgY29vcmRzWyA0IF07XG5cdGNvb3Jkc1sgMCBdID0gbWF0ICog
KCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XG5cdGNvb3Jkc1sgMSBdID0gbWF0ICogKCByZWN0Q29v
cmRzWyAxIF0gLSBQICk7XG5cdGNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0g
LSBQICk7XG5cdGNvb3Jkc1sgMyBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XG5c
dGNvb3Jkc1sgMCBdID0gbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xuXHRjb29yZHNbIDEgXSA9
IG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcblx0Y29vcmRzWyAyIF0gPSBub3JtYWxpemUoIGNv
b3Jkc1sgMiBdICk7XG5cdGNvb3Jkc1sgMyBdID0gbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xu
XHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTtcblx0dmVjdG9yRm9ybUZhY3Rv
ciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSAp
O1xuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRz
WyAxIF0sIGNvb3Jkc1sgMiBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0
b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcblx0dmVjdG9yRm9ybUZh
Y3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAg
XSApO1xuXHR2ZWMzIHJlc3VsdCA9IHZlYzMoIExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3Rvcigg
dmVjdG9yRm9ybUZhY3RvciApICk7XG5cdHJldHVybiByZXN1bHQ7XG59XG52ZWMzIEJSREZfU3Bl
Y3VsYXJfR0dYX0Vudmlyb25tZW50KCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5
LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyAp
IHtcblx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21l
dHJ5LnZpZXdEaXIgKSApO1xuXHRjb25zdCB2ZWM0IGMwID0gdmVjNCggLSAxLCAtIDAuMDI3NSwg
LSAwLjU3MiwgMC4wMjIgKTtcblx0Y29uc3QgdmVjNCBjMSA9IHZlYzQoIDEsIDAuMDQyNSwgMS4w
NCwgLSAwLjA0ICk7XG5cdHZlYzQgciA9IHJvdWdobmVzcyAqIGMwICsgYzE7XG5cdGZsb2F0IGEw
MDQgPSBtaW4oIHIueCAqIHIueCwgZXhwMiggLSA5LjI4ICogZG90TlYgKSApICogci54ICsgci55
O1xuXHR2ZWMyIEFCID0gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xuXHRyZXR1
cm4gc3BlY3VsYXJDb2xvciAqIEFCLnggKyBBQi55O1xufVxuZmxvYXQgR19CbGlublBob25nX0lt
cGxpY2l0KCApIHtcblx0cmV0dXJuIDAuMjU7XG59XG5mbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0
IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdHJldHVybiBS
RUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNo
aW5pbmVzcyApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIElu
Y2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9t
ZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5l
c3MgKSB7XG5cdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rp
b24gKyBnZW9tZXRyeS52aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCgg
Z2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSgg
ZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiA9IEZf
U2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0ZmxvYXQgRyA9IEdfQmxpbm5QaG9u
Z19JbXBsaWNpdCggKTtcblx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3RO
SCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbmZsb2F0IEdHWFJvdWdobmVzc1RvQmxp
bm5FeHBvbmVudCggY29uc3QgaW4gZmxvYXQgZ2d4Um91Z2huZXNzICkge1xuXHRyZXR1cm4gKCAy
LjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xufVxuZmxvYXQgQmxp
bm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCBibGlubkV4cG9uZW50ICkg
e1xuXHRyZXR1cm4gc3FydCggMi4wIC8gKCBibGlubkV4cG9uZW50ICsgMi4wICkgKTtcbn1cbiI7
CisKKwl2YXIgYnVtcG1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfQlVNUE1BUFxuXHR1
bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwO1xuXHR1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTtcblx0
dmVjMiBkSGR4eV9md2QoKSB7XG5cdFx0dmVjMiBkU1RkeCA9IGRGZHgoIHZVdiApO1xuXHRcdHZl
YzIgZFNUZHkgPSBkRmR5KCB2VXYgKTtcblx0XHRmbG9hdCBIbGwgPSBidW1wU2NhbGUgKiB0ZXh0
dXJlMkQoIGJ1bXBNYXAsIHZVdiApLng7XG5cdFx0ZmxvYXQgZEJ4ID0gYnVtcFNjYWxlICogdGV4
dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeCApLnggLSBIbGw7XG5cdFx0ZmxvYXQgZEJ5ID0g
YnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeSApLnggLSBIbGw7XG5c
dFx0cmV0dXJuIHZlYzIoIGRCeCwgZEJ5ICk7XG5cdH1cblx0dmVjMyBwZXJ0dXJiTm9ybWFsQXJi
KCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSApIHtcblx0XHR2ZWMz
IHZTaWdtYVggPSB2ZWMzKCBkRmR4KCBzdXJmX3Bvcy54ICksIGRGZHgoIHN1cmZfcG9zLnkgKSwg
ZEZkeCggc3VyZl9wb3MueiApICk7XG5cdFx0dmVjMyB2U2lnbWFZID0gdmVjMyggZEZkeSggc3Vy
Zl9wb3MueCApLCBkRmR5KCBzdXJmX3Bvcy55ICksIGRGZHkoIHN1cmZfcG9zLnogKSApO1xuXHRc
dHZlYzMgdk4gPSBzdXJmX25vcm07XG5cdFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiAp
O1xuXHRcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcblx0XHRmbG9hdCBmRGV0ID0g
ZG90KCB2U2lnbWFYLCBSMSApO1xuXHRcdHZlYzMgdkdyYWQgPSBzaWduKCBmRGV0ICkgKiAoIGRI
ZHh5LnggKiBSMSArIGRIZHh5LnkgKiBSMiApO1xuXHRcdHJldHVybiBub3JtYWxpemUoIGFicygg
ZkRldCApICogc3VyZl9ub3JtIC0gdkdyYWQgKTtcblx0fVxuI2VuZGlmXG4iOworCisJdmFyIGNs
aXBwaW5nX3BsYW5lc19mcmFnbWVudCA9ICIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcblx0
Zm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyArKyBpICkge1xuXHRc
dHZlYzQgcGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xuXHRcdGlmICggZG90KCB2Vmlld1Bv
c2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSBkaXNjYXJkO1xuXHR9XG5cdFx0XG5cdCNp
ZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTXG5cdFx0Ym9vbCBj
bGlwcGVkID0gdHJ1ZTtcblx0XHRmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsg
aSA8IE5VTV9DTElQUElOR19QTEFORVM7ICsrIGkgKSB7XG5cdFx0XHR2ZWM0IHBsYW5lID0gY2xp
cHBpbmdQbGFuZXNbIGkgXTtcblx0XHRcdGNsaXBwZWQgPSAoIGRvdCggdlZpZXdQb3NpdGlvbiwg
cGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDtcblx0XHR9XG5cdFx0aWYgKCBjbGlw
cGVkICkgZGlzY2FyZDtcblx0XG5cdCNlbmRpZlxuI2VuZGlmXG4iOworCisJdmFyIGNsaXBwaW5n
X3BsYW5lc19wYXJzX2ZyYWdtZW50ID0gIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxuXHQj
aWYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxuXHRcdHZhcnlp
bmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuXHQjZW5kaWZcblx0dW5pZm9ybSB2ZWM0IGNsaXBwaW5n
UGxhbmVzWyBOVU1fQ0xJUFBJTkdfUExBTkVTIF07XG4jZW5kaWZcbiI7CisKKwl2YXIgY2xpcHBp
bmdfcGxhbmVzX3BhcnNfdmVydGV4ID0gIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMCAmJiAh
IGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXG5cdHZhcnlpbmcgdmVj
MyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4iOworCisJdmFyIGNsaXBwaW5nX3BsYW5lc192ZXJ0
ZXggPSAiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwICYmICEgZGVmaW5lZCggUEhZU0lDQUwg
KSAmJiAhIGRlZmluZWQoIFBIT05HIClcblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54
eXo7XG4jZW5kaWZcbiI7CisKKwl2YXIgY29sb3JfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9DT0xP
UlxuXHRkaWZmdXNlQ29sb3IucmdiICo9IHZDb2xvcjtcbiNlbmRpZiI7CisKKwl2YXIgY29sb3Jf
cGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0NPTE9SXG5cdHZhcnlpbmcgdmVjMyB2Q29sb3I7
XG4jZW5kaWZcbiI7CisKKwl2YXIgY29sb3JfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9DT0xP
UlxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIjsKKworCXZhciBjb2xvcl92ZXJ0ZXgg
PSAiI2lmZGVmIFVTRV9DT0xPUlxuXHR2Q29sb3IueHl6ID0gY29sb3IueHl6O1xuI2VuZGlmIjsK
KworCXZhciBjb21tb24gPSAiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU5XG4jZGVmaW5lIFBJMiA2
LjI4MzE4NTMwNzE4XG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XG4jZGVmaW5lIFJF
Q0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1
NDk0XG4jZGVmaW5lIExPRzIgMS40NDI2OTVcbiNkZWZpbmUgRVBTSUxPTiAxZS02XG4jZGVmaW5l
IHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZGVmaW5lIHdoaXRlQ29tcGxpbWVu
dChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQg
eCApIHsgcmV0dXJuIHgqeDsgfVxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0
dXJuIHgqeCp4OyB9XG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9
IHgqeDsgcmV0dXJuIHgyKngyOyB9XG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9y
ICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxuaGlnaHAgZmxvYXQg
cmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcblx0Y29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4
OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzO1xuXHRoaWdocCBmbG9hdCBkdCA9IGRvdCgg
dXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcblx0cmV0dXJuIGZyYWN0
KHNpbihzbikgKiBjKTtcbn1cbnN0cnVjdCBJbmNpZGVudExpZ2h0IHtcblx0dmVjMyBjb2xvcjtc
blx0dmVjMyBkaXJlY3Rpb247XG5cdGJvb2wgdmlzaWJsZTtcbn07XG5zdHJ1Y3QgUmVmbGVjdGVk
TGlnaHQge1xuXHR2ZWMzIGRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgZGlyZWN0U3BlY3VsYXI7XG5c
dHZlYzMgaW5kaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGluZGlyZWN0U3BlY3VsYXI7XG59O1xuc3Ry
dWN0IEdlb21ldHJpY0NvbnRleHQge1xuXHR2ZWMzIHBvc2l0aW9uO1xuXHR2ZWMzIG5vcm1hbDtc
blx0dmVjMyB2aWV3RGlyO1xufTtcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRp
ciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVj
NCggZGlyLCAwLjAgKSApLnh5eiApO1xufVxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9u
KCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICgg
dmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xufVxudmVjMyBwcm9qZWN0T25QbGFu
ZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1h
bCApIHtcblx0ZmxvYXQgZGlzdGFuY2UgPSBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludCAtIHBvaW50
T25QbGFuZSApO1xuXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XG59
XG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUs
IGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBzaWduKCBkb3QoIHBvaW50IC0gcG9p
bnRPblBsYW5lLCBwbGFuZU5vcm1hbCApICk7XG59XG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCgg
aW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50
T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0cmV0dXJuIGxpbmVEaXJlY3Rpb24g
KiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3Qo
IHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xufVxubWF0MyB0
cmFuc3Bvc2UoIGNvbnN0IGluIG1hdDMgdiApIHtcblx0bWF0MyB0bXA7XG5cdHRtcFswXSA9IHZl
YzModlswXS54LCB2WzFdLngsIHZbMl0ueCk7XG5cdHRtcFsxXSA9IHZlYzModlswXS55LCB2WzFd
LnksIHZbMl0ueSk7XG5cdHRtcFsyXSA9IHZlYzModlswXS56LCB2WzFdLnosIHZbMl0ueik7XG5c
dHJldHVybiB0bXA7XG59XG4iOworCisJdmFyIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCA9
ICIjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuI2RlZmluZSBjdWJlVVZfdGV4dHVyZVNpemUg
KDEwMjQuMClcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xuXHR2
ZWMzIGFic0RpcmVjdGlvbiA9IGFicyhkaXJlY3Rpb24pO1xuXHRpbnQgZmFjZSA9IC0xO1xuXHRp
ZiggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcblx0XHRpZihhYnNEaXJlY3Rp
b24ueCA+IGFic0RpcmVjdGlvbi55IClcblx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueCA+IDAuMCA/
IDAgOiAzO1xuXHRcdGVsc2Vcblx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEgOiA0
O1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmKGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkg
KVxuXHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi56ID4gMC4wID8gMiA6IDU7XG5cdFx0ZWxzZVxuXHRc
dFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMSA6IDQ7XG5cdH1cblx0cmV0dXJuIGZhY2U7
XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMSAgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAu
MjUpIC0gMS4wKVxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAq
IDIuMCkpXG52ZWMyIE1pcExldmVsSW5mbyggdmVjMyB2ZWMsIGZsb2F0IHJvdWdobmVzc0xldmVs
LCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHNjYWxlID0gZXhwMihjdWJlVVZfbWF4TG9k
czEgLSByb3VnaG5lc3NMZXZlbCk7XG5cdGZsb2F0IGR4Um91Z2huZXNzID0gZEZkeChyb3VnaG5l
c3MpO1xuXHRmbG9hdCBkeVJvdWdobmVzcyA9IGRGZHkocm91Z2huZXNzKTtcblx0dmVjMyBkeCA9
IGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcblx0dmVjMyBkeSA9IGRGZHkoIHZl
YyAqIHNjYWxlICogZHlSb3VnaG5lc3MgKTtcblx0ZmxvYXQgZCA9IG1heCggZG90KCBkeCwgZHgg
KSwgZG90KCBkeSwgZHkgKSApO1xuXHRkID0gY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFt
cCk7XG5cdGZsb2F0IG1pcExldmVsID0gMC41ICogbG9nMihkKTtcblx0cmV0dXJuIHZlYzIoZmxv
b3IobWlwTGV2ZWwpLCBmcmFjdChtaXBMZXZlbCkpO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9k
czIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxuI2RlZmluZSBjdWJlVVZf
cmNwVGV4dHVyZVNpemUgKDEuMCAvIGN1YmVVVl90ZXh0dXJlU2l6ZSlcbnZlYzIgZ2V0Q3ViZVVW
KHZlYzMgZGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgbWlwTGV2ZWwpIHtc
blx0bWlwTGV2ZWwgPSByb3VnaG5lc3NMZXZlbCA+IGN1YmVVVl9tYXhMb2RzMiAtIDMuMCA/IDAu
MCA6IG1pcExldmVsO1xuXHRmbG9hdCBhID0gMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtc
blx0dmVjMiBleHAyX3BhY2tlZCA9IGV4cDIoIHZlYzIoIHJvdWdobmVzc0xldmVsLCBtaXBMZXZl
bCApICk7XG5cdHZlYzIgcmNwX2V4cDJfcGFja2VkID0gdmVjMiggMS4wICkgLyBleHAyX3BhY2tl
ZDtcblx0ZmxvYXQgcG93U2NhbGUgPSBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcblx0
ZmxvYXQgc2NhbGUgPSByY3BfZXhwMl9wYWNrZWQueCAqIHJjcF9leHAyX3BhY2tlZC55ICogMC4y
NTtcblx0ZmxvYXQgbWlwT2Zmc2V0ID0gMC43NSooMS4wIC0gcmNwX2V4cDJfcGFja2VkLnkpICog
cmNwX2V4cDJfcGFja2VkLng7XG5cdGJvb2wgYlJlcyA9IG1pcExldmVsID09IDAuMDtcblx0c2Nh
bGUgPSAgYlJlcyAmJiAoc2NhbGUgPCBhKSA/IGEgOiBzY2FsZTtcblx0dmVjMyByO1xuXHR2ZWMy
IG9mZnNldDtcblx0aW50IGZhY2UgPSBnZXRGYWNlRnJvbURpcmVjdGlvbihkaXJlY3Rpb24pO1xu
XHRmbG9hdCByY3BQb3dTY2FsZSA9IDEuMCAvIHBvd1NjYWxlO1xuXHRpZiggZmFjZSA9PSAwKSB7
XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xu
XHRcdG9mZnNldCA9IHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xuXHRc
dG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XG5c
dH1cblx0ZWxzZSBpZiggZmFjZSA9PSAxKSB7XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLnksIGRp
cmVjdGlvbi54LCBkaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0ID0gdmVjMihzY2FsZSttaXBPZmZz
ZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQu
eSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlID09IDIpIHtc
blx0XHRyID0gdmVjMyhkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcblx0
XHRvZmZzZXQgPSB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7
XG5cdFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQu
eTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlID09IDMpIHtcblx0XHRyID0gdmVjMyhkaXJlY3Rpb24u
eCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgPSB2ZWMyKDAuMCttaXBP
ZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0
LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlID09IDQp
IHtcblx0XHRyID0gdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueik7
XG5cdFx0b2Zmc2V0ID0gdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtc
blx0XHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gMC4wIDogb2Zmc2V0
Lnk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLnosIC1kaXJlY3Rpb24u
eCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCA9IHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwg
MC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAy
LjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRyID0gbm9ybWFsaXplKHIpO1xuXHRmbG9h
dCB0ZXhlbE9mZnNldCA9IDAuNSAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBzID0g
KCByLnl6IC8gYWJzKCByLnggKSArIHZlYzIoIDEuMCApICkgKiAwLjU7XG5cdHZlYzIgYmFzZSA9
IG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XG5cdHJldHVybiBiYXNlICsgcyAqICggc2Nh
bGUgLSAyLjAgKiB0ZXhlbE9mZnNldCApO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczMgKGxv
ZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMy4wKVxudmVjNCB0ZXh0dXJlQ3ViZVVWKHZl
YzMgcmVmbGVjdGVkRGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHJvdWdo
bmVzc1ZhbCA9IHJvdWdobmVzcyogY3ViZVVWX21heExvZHMzO1xuXHRmbG9hdCByMSA9IGZsb29y
KHJvdWdobmVzc1ZhbCk7XG5cdGZsb2F0IHIyID0gcjEgKyAxLjA7XG5cdGZsb2F0IHQgPSBmcmFj
dChyb3VnaG5lc3NWYWwpO1xuXHR2ZWMyIG1pcEluZm8gPSBNaXBMZXZlbEluZm8ocmVmbGVjdGVk
RGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcblx0ZmxvYXQgcyA9IG1pcEluZm8ueTtcblx0Zmxv
YXQgbGV2ZWwwID0gbWlwSW5mby54O1xuXHRmbG9hdCBsZXZlbDEgPSBsZXZlbDAgKyAxLjA7XG5c
dGxldmVsMSA9IGxldmVsMSA+IDUuMCA/IDUuMCA6IGxldmVsMTtcblx0bGV2ZWwwICs9IG1pbigg
Zmxvb3IoIHMgKyAwLjUgKSwgNS4wICk7XG5cdHZlYzIgdXZfMTAgPSBnZXRDdWJlVVYocmVmbGVj
dGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcblx0dmVjNCBjb2xvcjEwID0gZW52TWFwVGV4ZWxU
b0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8xMCkpO1xuXHR2ZWMyIHV2XzIwID0gZ2V0Q3Vi
ZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjIsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IyMCA9IGVu
dk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcblx0dmVjNCByZXN1
bHQgPSBtaXgoY29sb3IxMCwgY29sb3IyMCwgdCk7XG5cdHJldHVybiB2ZWM0KHJlc3VsdC5yZ2Is
IDEuMCk7XG59XG4jZW5kaWZcbiI7CisKKwl2YXIgZGVmYXVsdG5vcm1hbF92ZXJ0ZXggPSAidmVj
MyB0cmFuc2Zvcm1lZE5vcm1hbCA9IG5vcm1hbE1hdHJpeCAqIG9iamVjdE5vcm1hbDtcbiNpZmRl
ZiBGTElQX1NJREVEXG5cdHRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDtc
biNlbmRpZlxuIjsKKworCXZhciBkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXggPSAiI2lmZGVm
IFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFw
O1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xuXHR1bmlmb3JtIGZsb2F0IGRp
c3BsYWNlbWVudEJpYXM7XG4jZW5kaWZcbiI7CisKKwl2YXIgZGlzcGxhY2VtZW50bWFwX3ZlcnRl
eCA9ICIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHR0cmFuc2Zvcm1lZCArPSBub3JtYWxp
emUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdXYgKS54
ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XG4jZW5kaWZcbiI7CisK
Kwl2YXIgZW1pc3NpdmVtYXBfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR2
ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcblx0ZW1p
c3NpdmVDb2xvci5yZ2IgPSBlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIoIGVtaXNzaXZlQ29sb3Ig
KS5yZ2I7XG5cdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqPSBlbWlzc2l2ZUNvbG9yLnJnYjtcbiNl
bmRpZlxuIjsKKworCXZhciBlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0Vf
RU1JU1NJVkVNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XG4jZW5kaWZcbiI7
CisKKwl2YXIgZW5jb2RpbmdzX2ZyYWdtZW50ID0gIiAgZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9P
dXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XG4iOworCisJdmFyIGVuY29kaW5nc19wYXJzX2Zy
YWdtZW50ID0gIlxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0
dXJuIHZhbHVlO1xufVxudmVjNCBHYW1tYVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9h
dCBnYW1tYUZhY3RvciApIHtcblx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUueHl6LCB2ZWMzKCBn
YW1tYUZhY3RvciApICksIHZhbHVlLncgKTtcbn1cbnZlYzQgTGluZWFyVG9HYW1tYSggaW4gdmVj
NCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZh
bHVlLnh5eiwgdmVjMyggMS4wIC8gZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS53ICk7XG59XG52ZWM0
IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIG1peCggcG93
KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMygg
Mi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2
YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUudyApO1xufVxudmVjNCBMaW5l
YXJUb3NSR0IoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFs
dWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUu
cmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMx
MzA4ICkgKSApICksIHZhbHVlLncgKTtcbn1cbnZlYzQgUkdCRVRvTGluZWFyKCBpbiB2ZWM0IHZh
bHVlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogZXhwMiggdmFsdWUuYSAqIDI1NS4w
IC0gMTI4LjAgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSAp
IHtcblx0ZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4KCBtYXgoIHZhbHVlLnIsIHZhbHVlLmcgKSwg
dmFsdWUuYiApO1xuXHRmbG9hdCBmRXhwID0gY2xhbXAoIGNlaWwoIGxvZzIoIG1heENvbXBvbmVu
dCApICksIC0xMjguMCwgMTI3LjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIo
IGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XG59XG52ZWM0IFJHQk1Ub0xpbmVh
ciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdHJldHVybiB2ZWM0KCB2
YWx1ZS54eXogKiB2YWx1ZS53ICogbWF4UmFuZ2UsIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JH
Qk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0Ig
PSBtYXgoIHZhbHVlLngsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IE0gICAg
ICA9IGNsYW1wKCBtYXhSR0IgLyBtYXhSYW5nZSwgMC4wLCAxLjAgKTtcblx0TSAgICAgICAgICAg
ID0gY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAv
ICggTSAqIG1heFJhbmdlICksIE0gKTtcbn1cbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZh
bHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICgg
KCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJU
b1JHQkQoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhS
R0IgPSBtYXgoIHZhbHVlLngsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IEQg
ICAgICA9IG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xuXHREICAgICAgICAgICAgPSBt
aW4oIGZsb29yKCBEICkgLyAyNTUuMCwgMS4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2Ig
KiAoIEQgKiAoIDI1NS4wIC8gbWF4UmFuZ2UgKSApLCBEICk7XG59XG5jb25zdCBtYXQzIGNMb2dM
dXZNID0gbWF0MyggMC4yMjA5LCAwLjMzOTAsIDAuNDE4NCwgMC4xMTM4LCAwLjY3ODAsIDAuNzMx
OSwgMC4wMTAyLCAwLjExMzAsIDAuMjk2OSApO1xudmVjNCBMaW5lYXJUb0xvZ0x1diggaW4gdmVj
NCB2YWx1ZSApICB7XG5cdHZlYzMgWHBfWV9YWVpwID0gdmFsdWUucmdiICogY0xvZ0x1dk07XG5c
dFhwX1lfWFlacCA9IG1heChYcF9ZX1hZWnAsIHZlYzMoMWUtNiwgMWUtNiwgMWUtNikpO1xuXHR2
ZWM0IHZSZXN1bHQ7XG5cdHZSZXN1bHQueHkgPSBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtc
blx0ZmxvYXQgTGUgPSAyLjAgKiBsb2cyKFhwX1lfWFlacC55KSArIDEyNy4wO1xuXHR2UmVzdWx0
LncgPSBmcmFjdChMZSk7XG5cdHZSZXN1bHQueiA9IChMZSAtIChmbG9vcih2UmVzdWx0LncqMjU1
LjApKS8yNTUuMCkvMjU1LjA7XG5cdHJldHVybiB2UmVzdWx0O1xufVxuY29uc3QgbWF0MyBjTG9n
THV2SW52ZXJzZU0gPSBtYXQzKCA2LjAwMTQsIC0yLjcwMDgsIC0xLjc5OTYsIC0xLjMzMjAsIDMu
MTAyOSwgLTUuNzcyMSwgMC4zMDA4LCAtMS4wODgyLCA1LjYyNjggKTtcbnZlYzQgTG9nTHV2VG9M
aW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdGZsb2F0IExlID0gdmFsdWUueiAqIDI1NS4wICsg
dmFsdWUudztcblx0dmVjMyBYcF9ZX1hZWnA7XG5cdFhwX1lfWFlacC55ID0gZXhwMigoTGUgLSAx
MjcuMCkgLyAyLjApO1xuXHRYcF9ZX1hZWnAueiA9IFhwX1lfWFlacC55IC8gdmFsdWUueTtcblx0
WHBfWV9YWVpwLnggPSB2YWx1ZS54ICogWHBfWV9YWVpwLno7XG5cdHZlYzMgdlJHQiA9IFhwX1lf
WFlacC5yZ2IgKiBjTG9nTHV2SW52ZXJzZU07XG5cdHJldHVybiB2ZWM0KCBtYXgodlJHQiwgMC4w
KSwgMS4wICk7XG59XG4iOworCisJdmFyIGVudm1hcF9mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0VO
Vk1BUFxuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFM
TUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxuXHRcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggPSBub3Jt
YWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR2ZWMzIHdvcmxk
Tm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7
XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZlYzMgcmVmbGVjdFZl
YyA9IHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5c
dFx0XHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3Jt
YWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQjZWxzZVxuXHRcdHZlYzMgcmVm
bGVjdFZlYyA9IHZSZWZsZWN0O1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVc
blx0XHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgZmxpcE5vcm1hbCAqIHZl
YzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xuXHQjZWxp
ZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHR2ZWMyIHNhbXBsZVVWO1xuXHRc
dHNhbXBsZVVWLnkgPSBhc2luKCBmbGlwTm9ybWFsICogcmVmbGVjdFZlYy55ICkgKiBSRUNJUFJP
Q0FMX1BJICsgMC41O1xuXHRcdHNhbXBsZVVWLnggPSBhdGFuKCBmbGlwTm9ybWFsICogcmVmbGVj
dFZlYy56LCBmbGlwTm9ybWFsICogcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAu
NTtcblx0XHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWICk7XG5c
dCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0dmVjMyByZWZsZWN0Vmll
dyA9IGZsaXBOb3JtYWwgKiBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RW
ZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLCAwLjAsIDEuMCApICk7XG5cdFx0dmVjNCBlbnZD
b2xvciA9IHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSApO1xu
XHQjZWxzZVxuXHRcdHZlYzQgZW52Q29sb3IgPSB2ZWM0KCAwLjAgKTtcblx0I2VuZGlmXG5cdGVu
dkNvbG9yID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcblx0I2lmZGVmIEVOVk1B
UF9CTEVORElOR19NVUxUSVBMWVxuXHRcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGln
aHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZs
ZWN0aXZpdHkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXG5cdFx0
b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxh
clN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVO
RElOR19BREQgKVxuXHRcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJT
dHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcblx0I2VuZGlmXG4jZW5kaWZcbiI7CisKKwl2YXIgZW52
bWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVk
KCBQSFlTSUNBTCApXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuXHR1bmlmb3JtIGZs
b2F0IGVudk1hcEludGVuc2l0eTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmICEg
ZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAoIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5l
ZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgKVxuXHRcdHZhcnlpbmcgdmVj
MyB2V29ybGRQb3NpdGlvbjtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5c
dFx0dW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBzYW1w
bGVyMkQgZW52TWFwO1xuXHQjZW5kaWZcblx0dW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xuXHQj
aWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwg
ZGVmaW5lZCggUEhPTkcgKSB8fCBkZWZpbmVkKCBQSFlTSUNBTCApXG5cdFx0dW5pZm9ybSBmbG9h
dCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xu
XHQjZW5kaWZcbiNlbmRpZlxuIjsKKworCXZhciBlbnZtYXBfcGFyc192ZXJ0ZXggPSAiI2lmZGVm
IFVTRV9FTlZNQVBcblx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNF
X05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxk
UG9zaXRpb247XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHRcdHVuaWZv
cm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZW5kaWZcbiNlbmRpZlxuIjsKKworCXZhciBl
bnZtYXBfdmVydGV4ID0gIiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVN
UE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXG5c
dFx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcblx0I2Vsc2Vcblx0XHR2ZWMz
IGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBv
c2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rp
b24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9N
T0RFX1JFRkxFQ1RJT05cblx0XHRcdHZSZWZsZWN0ID0gcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgs
IHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZSZWZsZWN0ID0gcmVmcmFjdCggY2Ft
ZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZc
blx0I2VuZGlmXG4jZW5kaWZcbiI7CisKKwl2YXIgZm9nX3ZlcnRleCA9ICJcbiNpZmRlZiBVU0Vf
Rk9HXG5mb2dEZXB0aCA9IC1tdlBvc2l0aW9uLno7XG4jZW5kaWYiOworCisJdmFyIGZvZ19wYXJz
X3ZlcnRleCA9ICIjaWZkZWYgVVNFX0ZPR1xuICB2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xuI2Vu
ZGlmXG4iOworCisJdmFyIGZvZ19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0ZPR1xuXHQjaWZkZWYg
Rk9HX0VYUDJcblx0XHRmbG9hdCBmb2dGYWN0b3IgPSB3aGl0ZUNvbXBsaW1lbnQoIGV4cDIoIC0g
Zm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICogTE9HMiApICk7
XG5cdCNlbHNlXG5cdFx0ZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9n
RmFyLCBmb2dEZXB0aCApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xf
RnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApO1xuI2VuZGlmXG4iOworCisJdmFy
IGZvZ19wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRk9HXG5cdHVuaWZvcm0gdmVjMyBmb2dD
b2xvcjtcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0
dW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgZm9n
TmVhcjtcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0Zhcjtcblx0I2VuZGlmXG4jZW5kaWZcbiI7CisK
Kwl2YXIgZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVE9PTlxuXHR1bmlmb3Jt
IHNhbXBsZXIyRCBncmFkaWVudE1hcDtcblx0dmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZl
YzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xuXHRcdGZsb2F0IGRvdE5MID0gZG90
KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XG5cdFx0dmVjMiBjb29yZCA9IHZlYzIoIGRvdE5M
ICogMC41ICsgMC41LCAwLjAgKTtcblx0XHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdFx0XHRy
ZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XG5cdFx0I2Vsc2Vcblx0
XHRcdHJldHVybiAoIGNvb3JkLnggPCAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7
XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuIjsKKworCXZhciBsaWdodG1hcF9mcmFnbWVudCA9
ICIjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAr
PSBQSSAqIHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0
eTtcbiNlbmRpZlxuIjsKKworCXZhciBsaWdodG1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBV
U0VfTElHSFRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7XG5cdHVuaWZvcm0gZmxv
YXQgbGlnaHRNYXBJbnRlbnNpdHk7XG4jZW5kaWYiOworCisJdmFyIGxpZ2h0c19sYW1iZXJ0X3Zl
cnRleCA9ICJ2ZWMzIGRpZmZ1c2UgPSB2ZWMzKCAxLjAgKTtcbkdlb21ldHJpY0NvbnRleHQgZ2Vv
bWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiA9IG12UG9zaXRpb24ueHl6O1xuZ2VvbWV0cnkubm9y
bWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuZ2VvbWV0cnkudmlld0RpciA9
IG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9t
ZXRyeTtcbmJhY2tHZW9tZXRyeS5wb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xuYmFja0dl
b21ldHJ5Lm5vcm1hbCA9IC1nZW9tZXRyeS5ub3JtYWw7XG5iYWNrR2VvbWV0cnkudmlld0RpciA9
IGdlb21ldHJ5LnZpZXdEaXI7XG52TGlnaHRGcm9udCA9IHZlYzMoIDAuMCApO1xuI2lmZGVmIERP
VUJMRV9TSURFRFxuXHR2TGlnaHRCYWNrID0gdmVjMyggMC4wICk7XG4jZW5kaWZcbkluY2lkZW50
TGlnaHQgZGlyZWN0TGlnaHQ7XG5mbG9hdCBkb3ROTDtcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9E
aWZmdXNlO1xuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXG5cdGZvciAoIGludCBpID0gMDsgaSA8
IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFk
aWFuY2UoIHBvaW50TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRv
dE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRc
dGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0
dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1
c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0
ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1c
biNlbmRpZlxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcblx0Zm9yICggaW50IGkgPSAwOyBpIDwg
TlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFu
Y2UoIHNwb3RMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90Tkwg
PSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGly
ZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGln
aHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtc
blx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAt
ZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2Vu
ZGlmXG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9E
SVJfTElHSFRTOyBpICsrICkge1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlh
bmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0
XHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtc
blx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xu
XHRcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9E
aWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgKz0gc2F0
dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxu
XHR9XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXG5cdGZvciAoIGludCBpID0gMDsg
aSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcblx0XHR2TGlnaHRGcm9udCArPSBnZXRIZW1p
c3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7
XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArPSBnZXRIZW1pc3Bo
ZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGJhY2tHZW9tZXRyeSAp
O1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiI7CisKKwl2YXIgbGlnaHRzX3BhcnMgPSAidW5p
Zm9ybSB2ZWMzIGFtYmllbnRMaWdodENvbG9yO1xudmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlh
bmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkge1xuXHR2ZWMzIGlycmFkaWFu
Y2UgPSBhbWJpZW50TGlnaHRDb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElH
SFRTXG5cdFx0aXJyYWRpYW5jZSAqPSBQSTtcblx0I2VuZGlmXG5cdHJldHVybiBpcnJhZGlhbmNl
O1xufVxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxuXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7
XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRpbnQgc2hhZG93O1xu
XHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIg
c2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlv
bmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdO1xuXHR2b2lkIGdldERpcmVjdGlvbmFsRGlyZWN0
TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGln
aHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0
IGRpcmVjdExpZ2h0ICkge1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yID0gZGlyZWN0aW9uYWxMaWdo
dC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25hbExpZ2h0LmRp
cmVjdGlvbjtcblx0XHRkaXJlY3RMaWdodC52aXNpYmxlID0gdHJ1ZTtcblx0fVxuI2VuZGlmXG4j
aWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcblx0c3RydWN0IFBvaW50TGlnaHQge1xuXHRcdHZlYzMg
cG9zaXRpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRmbG9hdCBkaXN0YW5jZTtcblx0XHRmbG9h
dCBkZWNheTtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0Zmxv
YXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9y
bSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdHZvaWQgZ2V0
UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdo
dCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQg
ZGlyZWN0TGlnaHQgKSB7XG5cdFx0dmVjMyBsVmVjdG9yID0gcG9pbnRMaWdodC5wb3NpdGlvbiAt
IGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6
ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3Ig
KTtcblx0XHRkaXJlY3RMaWdodC5jb2xvciA9IHBvaW50TGlnaHQuY29sb3I7XG5cdFx0ZGlyZWN0
TGlnaHQuY29sb3IgKj0gcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3Rvcigg
bGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xu
XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSAoIGRpcmVjdExpZ2h0LmNvbG9yICE9IHZlYzMoIDAu
MCApICk7XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcblx0c3RydWN0IFNw
b3RMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2
ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGZs
b2F0IGNvbmVDb3M7XG5cdFx0ZmxvYXQgcGVudW1icmFDb3M7XG5cdFx0aW50IHNoYWRvdztcblx0
XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHR2ZWMyIHNo
YWRvd01hcFNpemU7XG5cdH07XG5cdHVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9T
UE9UX0xJR0hUUyBdO1xuXHR2b2lkIGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0
IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0
cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICApIHtcblx0XHR2ZWMzIGxWZWN0b3Ig
PSBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRkaXJlY3RMaWdo
dC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBsaWdodERpc3Rh
bmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgYW5nbGVDb3MgPSBkb3QoIGRpcmVj
dExpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGlmICggYW5nbGVD
b3MgPiBzcG90TGlnaHQuY29uZUNvcyApIHtcblx0XHRcdGZsb2F0IHNwb3RFZmZlY3QgPSBzbW9v
dGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNv
cyApO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3I7XG5cdFx0XHRk
aXJlY3RMaWdodC5jb2xvciAqPSBzcG90RWZmZWN0ICogcHVuY3R1YWxMaWdodEludGVuc2l0eVRv
SXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90
TGlnaHQuZGVjYXkgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xuXHRcdH0g
ZWxzZSB7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciA9IHZlYzMoIDAuMCApO1xuXHRcdFx0ZGly
ZWN0TGlnaHQudmlzaWJsZSA9IGZhbHNlO1xuXHRcdH1cblx0fVxuI2VuZGlmXG4jaWYgTlVNX1JF
Q1RfQVJFQV9MSUdIVFMgPiAwXG5cdHN0cnVjdCBSZWN0QXJlYUxpZ2h0IHtcblx0XHR2ZWMzIGNv
bG9yO1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGg7XG5cdFx0dmVjMyBo
YWxmSGVpZ2h0O1xuXHR9O1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNNYXQ7XHR1bmlmb3JtIHNh
bXBsZXIyRCBsdGNNYWc7XG5cdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sg
TlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcbiNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBc
blx0c3RydWN0IEhlbWlzcGhlcmVMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVj
MyBza3lDb2xvcjtcblx0XHR2ZWMzIGdyb3VuZENvbG9yO1xuXHR9O1xuXHR1bmlmb3JtIEhlbWlz
cGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcblx0dmVjMyBn
ZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVt
aUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xuXHRcdGZsb2F0
IGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhlbWlMaWdodC5kaXJlY3Rpb24gKTtcblx0
XHRmbG9hdCBoZW1pRGlmZnVzZVdlaWdodCA9IDAuNSAqIGRvdE5MICsgMC41O1xuXHRcdHZlYzMg
aXJyYWRpYW5jZSA9IG1peCggaGVtaUxpZ2h0Lmdyb3VuZENvbG9yLCBoZW1pTGlnaHQuc2t5Q29s
b3IsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1Rf
TElHSFRTXG5cdFx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBp
cnJhZGlhbmNlO1xuXHR9XG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVm
aW5lZCggUEhZU0lDQUwgKVxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2Uo
IGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGludCBtYXhNSVBM
ZXZlbCApIHtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlv
biggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBF
X0NVQkVcblx0XHRcdHZlYzMgcXVlcnlWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3Jt
YWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0
XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5
VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBl
bnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQ
TGV2ZWwgKSApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBU
ZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZN
QVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlWZWMgPSB2ZWMzKCBmbGlwRW52TWFw
ICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdHZlYzQgZW52TWFwQ29s
b3IgPSB0ZXh0dXJlQ3ViZVVWKCBxdWVyeVZlYywgMS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZl
YzQgZW52TWFwQ29sb3IgPSB2ZWM0KCAwLjAgKTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gUEkg
KiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XG5cdH1cblx0ZmxvYXQgZ2V0U3Bl
Y3VsYXJNSVBMZXZlbCggY29uc3QgaW4gZmxvYXQgYmxpbm5TaGluaW5lc3NFeHBvbmVudCwgY29u
c3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdGZsb2F0IG1heE1JUExldmVsU2NhbGFyID0g
ZmxvYXQoIG1heE1JUExldmVsICk7XG5cdFx0ZmxvYXQgZGVzaXJlZE1JUExldmVsID0gbWF4TUlQ
TGV2ZWxTY2FsYXIgLSAwLjc5MjQ4IC0gMC41ICogbG9nMiggcG93MiggYmxpbm5TaGluaW5lc3NF
eHBvbmVudCApICsgMS4wICk7XG5cdFx0cmV0dXJuIGNsYW1wKCBkZXNpcmVkTUlQTGV2ZWwsIDAu
MCwgbWF4TUlQTGV2ZWxTY2FsYXIgKTtcblx0fVxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVj
dFJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBm
bG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7
XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZlYzMgcmVmbGVjdFZl
YyA9IHJlZmxlY3QoIC1nZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwgKTtcblx0XHQj
ZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggLWdlb21ldHJ5LnZpZXdEaXIs
IGdlb21ldHJ5Lm5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdFx0cmVm
bGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRy
aXggKTtcblx0XHRmbG9hdCBzcGVjdWxhck1JUExldmVsID0gZ2V0U3BlY3VsYXJNSVBMZXZlbCgg
Ymxpbm5TaGluaW5lc3NFeHBvbmVudCwgbWF4TUlQTGV2ZWwgKTtcblx0XHQjaWZkZWYgRU5WTUFQ
X1RZUEVfQ1VCRVxuXHRcdFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFw
ICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9M
T0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52
TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbHNlXG5c
dFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVJlZmxl
Y3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29s
b3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2Vs
aWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0XHR2ZWMzIHF1ZXJ5UmVmbGVj
dFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtc
blx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKHF1ZXJ5UmVmbGVjdFZlYywg
Qmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKGJsaW5uU2hpbmluZXNzRXhwb25lbnQpKTtcblx0
XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHRcdHZlYzIgc2FtcGxl
VVY7XG5cdFx0XHRzYW1wbGVVVi55ID0gc2F0dXJhdGUoIHJlZmxlY3RWZWMueSAqIDAuNSArIDAu
NSApO1xuXHRcdFx0c2FtcGxlVVYueCA9IGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54
ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRc
blx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRExvZEVYVCggZW52TWFwLCBzYW1w
bGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZN
YXBDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCAp
O1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGlu
ZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9T
UEhFUkUgKVxuXHRcdFx0dmVjMyByZWZsZWN0VmlldyA9IG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4
ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsMC4wLDEuMCApICk7
XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3Ig
PSB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNw
ZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3Ig
PSB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFy
TUlQTGV2ZWwgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFw
VGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJu
IGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuI2VuZGlmXG4iOworCisJ
dmFyIGxpZ2h0c19waG9uZ19mcmFnbWVudCA9ICJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7
XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xubWF0ZXJpYWwuc3Bl
Y3VsYXJDb2xvciA9IHNwZWN1bGFyO1xubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgPSBzaGlu
aW5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtcbiI7
CisKKwl2YXIgbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQgPSAidmFyeWluZyB2ZWMzIHZWaWV3
UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xu
I2VuZGlmXG5zdHJ1Y3QgQmxpbm5QaG9uZ01hdGVyaWFsIHtcblx0dmVjM1x0ZGlmZnVzZUNvbG9y
O1xuXHR2ZWMzXHRzcGVjdWxhckNvbG9yO1xuXHRmbG9hdFx0c3BlY3VsYXJTaGluaW5lc3M7XG5c
dGZsb2F0XHRzcGVjdWxhclN0cmVuZ3RoO1xufTtcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmco
IGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0Nv
bnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5v
dXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdCNpZmRlZiBUT09OXG5cdFx0
dmVjMyBpcnJhZGlhbmNlID0gZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCBnZW9tZXRyeS5ub3JtYWws
IGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNlbHNlXG5c
dFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExp
Z2h0LmRpcmVjdGlvbiApICk7XG5cdFx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RM
aWdodC5jb2xvcjtcblx0I2VuZGlmXG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hU
U1xuXHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJl
Y3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwu
ZGlmZnVzZUNvbG9yICk7XG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFk
aWFuY2UgKiBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwg
bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgKSAqIG1h
dGVyaWFsLnNwZWN1bGFyU3RyZW5ndGg7XG59XG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlu
blBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRl
eHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQg
UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGly
ZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFs
LmRpZmZ1c2VDb2xvciApO1xufVxuI2RlZmluZSBSRV9EaXJlY3RcdFx0XHRcdFJFX0RpcmVjdF9C
bGlublBob25nXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVx0XHRSRV9JbmRpcmVjdERpZmZ1
c2VfQmxpbm5QaG9uZ1xuI2RlZmluZSBNYXRlcmlhbF9MaWdodFByb2JlTE9EKCBtYXRlcmlhbCAp
XHQoMClcbiI7CisKKwl2YXIgbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50ID0gIlBoeXNpY2FsTWF0
ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3Iucmdi
ICogKCAxLjAgLSBtZXRhbG5lc3NGYWN0b3IgKTtcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNz
ID0gY2xhbXAoIHJvdWdobmVzc0ZhY3RvciwgMC4wNCwgMS4wICk7XG4jaWZkZWYgU1RBTkRBUkRc
blx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9D
T0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcbiNlbHNl
XG5cdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIE1BWElNVU1fU1BFQ1VMQVJf
Q09FRkZJQ0lFTlQgKiBwb3cyKCByZWZsZWN0aXZpdHkgKSApLCBkaWZmdXNlQ29sb3IucmdiLCBt
ZXRhbG5lc3NGYWN0b3IgKTtcblx0bWF0ZXJpYWwuY2xlYXJDb2F0ID0gc2F0dXJhdGUoIGNsZWFy
Q29hdCApO1x0bWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzID0gY2xhbXAoIGNsZWFyQ29hdFJv
dWdobmVzcywgMC4wNCwgMS4wICk7XG4jZW5kaWZcbiI7CisKKwl2YXIgbGlnaHRzX3BoeXNpY2Fs
X3BhcnNfZnJhZ21lbnQgPSAic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZm
dXNlQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclJvdWdobmVzcztcblx0dmVjM1x0c3BlY3VsYXJD
b2xvcjtcblx0I2lmbmRlZiBTVEFOREFSRFxuXHRcdGZsb2F0IGNsZWFyQ29hdDtcblx0XHRmbG9h
dCBjbGVhckNvYXRSb3VnaG5lc3M7XG5cdCNlbmRpZlxufTtcbiNkZWZpbmUgTUFYSU1VTV9TUEVD
VUxBUl9DT0VGRklDSUVOVCAwLjE2XG4jZGVmaW5lIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lF
TlQgMC4wNFxuZmxvYXQgY2xlYXJDb2F0REhSQXBwcm94KCBjb25zdCBpbiBmbG9hdCByb3VnaG5l
c3MsIGNvbnN0IGluIGZsb2F0IGRvdE5MICkge1xuXHRyZXR1cm4gREVGQVVMVF9TUEVDVUxBUl9D
T0VGRklDSUVOVCArICggMS4wIC0gREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApICogKCBw
b3coIDEuMCAtIGRvdE5MLCA1LjAgKSAqIHBvdyggMS4wIC0gcm91Z2huZXNzLCAyLjAgKSApO1xu
fVxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxuXHR2b2lkIFJFX0RpcmVjdF9SZWN0QXJl
YV9QaHlzaWNhbCggY29uc3QgaW4gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0LCBjb25zdCBp
biBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1h
dGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0XHR2ZWMz
IG5vcm1hbCA9IGdlb21ldHJ5Lm5vcm1hbDtcblx0XHR2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeS52
aWV3RGlyO1xuXHRcdHZlYzMgcG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHR2ZWMz
IGxpZ2h0UG9zID0gcmVjdEFyZWFMaWdodC5wb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aCA9
IHJlY3RBcmVhTGlnaHQuaGFsZldpZHRoO1xuXHRcdHZlYzMgaGFsZkhlaWdodCA9IHJlY3RBcmVh
TGlnaHQuaGFsZkhlaWdodDtcblx0XHR2ZWMzIGxpZ2h0Q29sb3IgPSByZWN0QXJlYUxpZ2h0LmNv
bG9yO1xuXHRcdGZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzO1xu
XHRcdHZlYzMgcmVjdENvb3Jkc1sgNCBdO1xuXHRcdHJlY3RDb29yZHNbIDAgXSA9IGxpZ2h0UG9z
IC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcdFx0cmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3Mg
KyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9z
ICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHRyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBv
cyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XG5cdFx0dmVjMiB1diA9IExUQ19Vdiggbm9ybWFs
LCB2aWV3RGlyLCByb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBub3JtID0gdGV4dHVyZTJEKCBsdGNN
YWcsIHV2ICkuYTtcblx0XHR2ZWM0IHQgPSB0ZXh0dXJlMkQoIGx0Y01hdCwgdXYgKTtcblx0XHRt
YXQzIG1JbnYgPSBtYXQzKFxuXHRcdFx0dmVjMyggICAxLCAgIDAsIHQueSApLFxuXHRcdFx0dmVj
MyggICAwLCB0LnosICAgMCApLFxuXHRcdFx0dmVjMyggdC53LCAgIDAsIHQueCApXG5cdFx0KTtc
blx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogbWF0ZXJp
YWwuc3BlY3VsYXJDb2xvciAqIG5vcm0gKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0Rpciwg
cG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RE
aWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVh
dGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEgKSwgcmVjdENvb3JkcyApO1xu
XHR9XG4jZW5kaWZcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExp
Z2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25z
dCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZs
ZWN0ZWRMaWdodCApIHtcblx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5u
b3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IGRv
dE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJ
R0hUU1xuXHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdCNlbmRpZlxuXHQjaWZuZGVmIFNUQU5EQVJE
XG5cdFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gbWF0ZXJpYWwuY2xlYXJDb2F0ICogY2xlYXJDb2F0
REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MsIGRvdE5MICk7XG5cdCNlbHNl
XG5cdFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGln
aHQuZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIGlycmFkaWFuY2Ug
KiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVj
dWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHRyZWZsZWN0ZWRMaWdo
dC5kaXJlY3REaWZmdXNlICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICog
QlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHQjaWZuZGVm
IFNUQU5EQVJEXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5j
ZSAqIG1hdGVyaWFsLmNsZWFyQ29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwg
Z2VvbWV0cnksIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwu
Y2xlYXJDb2F0Um91Z2huZXNzICk7XG5cdCNlbmRpZlxufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1
c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmlj
Q29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5v
dXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0Lmlu
ZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVy
aWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2Fs
KCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyQ29hdFJhZGlhbmNl
LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1h
dGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtc
blx0I2lmbmRlZiBTVEFOREFSRFxuXHRcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2Vv
bWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRmbG9hdCBkb3ROTCA9IGRv
dE5WO1xuXHRcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFy
Q29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xuXHQj
ZWxzZVxuXHRcdGZsb2F0IGNsZWFyQ29hdERIUiA9IDAuMDtcblx0I2VuZGlmXG5cdHJlZmxlY3Rl
ZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIHJhZGlh
bmNlICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5z
cGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHQjaWZuZGVmIFNU
QU5EQVJEXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSBjbGVhckNvYXRS
YWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyQ29hdCAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25t
ZW50KCBnZW9tZXRyeSwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRl
cmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKTtcblx0I2VuZGlmXG59XG4jZGVmaW5lIFJFX0RpcmVj
dFx0XHRcdFx0UkVfRGlyZWN0X1BoeXNpY2FsXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVx0
XHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNl
XHRcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1
bGFyXHRcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcbiNkZWZpbmUgTWF0ZXJpYWxfQmxp
bm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBv
bmVudCggbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKVxuI2RlZmluZSBNYXRlcmlhbF9DbGVh
ckNvYXRfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1Rv
Qmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzIClcbmZsb2F0IGNvbXB1
dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0
IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0cmV0dXJu
IHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICog
cm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcbn1cbiI7CisK
Kwl2YXIgbGlnaHRzX3RlbXBsYXRlID0gIlxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdl
b21ldHJ5LnBvc2l0aW9uID0gLSB2Vmlld1Bvc2l0aW9uO1xuZ2VvbWV0cnkubm9ybWFsID0gbm9y
bWFsO1xuZ2VvbWV0cnkudmlld0RpciA9IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xuSW5j
aWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYg
ZGVmaW5lZCggUkVfRGlyZWN0IClcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHRmb3IgKCBp
bnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQg
PSBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBw
b2ludExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWZkZWYgVVNFX1NIQURP
V01BUFxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIHBvaW50TGlnaHQuc2hh
ZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRv
d01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93Qmlh
cywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEu
MDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0
ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX1NQT1RfTElH
SFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFNwb3RMaWdodCBzcG90TGlnaHQ7
XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRz
cG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07XG5cdFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRp
YW5jZSggc3BvdExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWZkZWYgVVNF
X1NIQURPV01BUFxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIHNwb3RMaWdo
dC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93
TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywg
c3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5c
dFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFs
LCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9ESVJfTElHSFRTID4g
MCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9u
YWxMaWdodDtcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7
XG5cdFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XG5cdFx0Z2V0
RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHQsIGdlb21l
dHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdFx0ZGlyZWN0
TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3csIGRpcmVj
dExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBd
LCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93
QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nv
b3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0
LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lm
ICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RB
cmVhIClcblx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xuXHRmb3IgKCBpbnQgaSA9IDA7
IGkgPCBOVU1fUkVDVF9BUkVBX0xJR0hUUzsgaSArKyApIHtcblx0XHRyZWN0QXJlYUxpZ2h0ID0g
cmVjdEFyZWFMaWdodHNbIGkgXTtcblx0XHRSRV9EaXJlY3RfUmVjdEFyZWEoIHJlY3RBcmVhTGln
aHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4j
aWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcblx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0
QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0I2lmZGVmIFVT
RV9MSUdIVE1BUFxuXHRcdHZlYzMgbGlnaHRNYXBJcnJhZGlhbmNlID0gdGV4dHVyZTJEKCBsaWdo
dE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuXHRcdCNpZm5kZWYgUEhZU0lD
QUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0bGlnaHRNYXBJcnJhZGlhbmNlICo9IFBJO1xuXHRc
dCNlbmRpZlxuXHRcdGlycmFkaWFuY2UgKz0gbGlnaHRNYXBJcnJhZGlhbmNlO1xuXHQjZW5kaWZc
blx0I2lmICggTlVNX0hFTUlfTElHSFRTID4gMCApXG5cdFx0Zm9yICggaW50IGkgPSAwOyBpIDwg
TlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdFx0aXJyYWRpYW5jZSArPSBnZXRIZW1pc3Bo
ZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XG5c
dFx0fVxuXHQjZW5kaWZcblx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQ
SFlTSUNBTCApICYmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdGlycmFkaWFu
Y2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggZ2VvbWV0cnksIDggKTtcblx0
I2VuZGlmXG5cdFJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVy
aWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlmXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCAp
ICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHR2ZWMzIHJhZGlhbmNlID0gZ2V0
TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LCBNYXRlcmlhbF9CbGlublNoaW5p
bmVzc0V4cG9uZW50KCBtYXRlcmlhbCApLCA4ICk7XG5cdCNpZm5kZWYgU1RBTkRBUkRcblx0XHR2
ZWMzIGNsZWFyQ29hdFJhZGlhbmNlID0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdl
b21ldHJ5LCBNYXRlcmlhbF9DbGVhckNvYXRfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJp
YWwgKSwgOCApO1xuXHQjZWxzZVxuXHRcdHZlYzMgY2xlYXJDb2F0UmFkaWFuY2UgPSB2ZWMzKCAw
LjAgKTtcblx0I2VuZGlmXG5cdFJFX0luZGlyZWN0U3BlY3VsYXIoIHJhZGlhbmNlLCBjbGVhckNv
YXRSYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlm
XG4iOworCisJdmFyIGxvZ2RlcHRoYnVmX2ZyYWdtZW50ID0gIiNpZiBkZWZpbmVkKFVTRV9MT0dE
RVBUSEJVRikgJiYgZGVmaW5lZChVU0VfTE9HREVQVEhCVUZfRVhUKVxuXHRnbF9GcmFnRGVwdGhF
WFQgPSBsb2cyKHZGcmFnRGVwdGgpICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcbiNlbmRpZiI7CisK
Kwl2YXIgbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0xPR0RFUFRIQlVG
XG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJV
Rl9FWFRcblx0XHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XG5cdCNlbmRpZlxuI2VuZGlmXG4i
OworCisJdmFyIGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4ID0gIiNpZmRlZiBVU0VfTE9HREVQVEhC
VUZcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2YXJ5aW5nIGZsb2F0IHZGcmFn
RGVwdGg7XG5cdCNlbmRpZlxuXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG4jZW5kaWYi
OworCisJdmFyIGxvZ2RlcHRoYnVmX3ZlcnRleCA9ICIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5c
dGdsX1Bvc2l0aW9uLnogPSBsb2cyKG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCAp
KSAqIGxvZ0RlcHRoQnVmRkM7XG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dkZy
YWdEZXB0aCA9IDEuMCArIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbHNlXG5cdFx0Z2xfUG9zaXRpb24u
eiA9IChnbF9Qb3NpdGlvbi56IC0gMS4wKSAqIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbmRpZlxuI2Vu
ZGlmXG4iOworCisJdmFyIG1hcF9mcmFnbWVudCA9ICIjaWZkZWYgVVNFX01BUFxuXHR2ZWM0IHRl
eGVsQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdlV2ICk7XG5cdHRleGVsQ29sb3IgPSBtYXBUZXhl
bFRvTGluZWFyKCB0ZXhlbENvbG9yICk7XG5cdGRpZmZ1c2VDb2xvciAqPSB0ZXhlbENvbG9yO1xu
I2VuZGlmXG4iOworCisJdmFyIG1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTUFQXG5c
dHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcbiNlbmRpZlxuIjsKKworCXZhciBtYXBfcGFydGljbGVf
ZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9NQVBcblx0dmVjNCBtYXBUZXhlbCA9IHRleHR1cmUyRCgg
bWFwLCB2ZWMyKCBnbF9Qb2ludENvb3JkLngsIDEuMCAtIGdsX1BvaW50Q29vcmQueSApICogb2Zm
c2V0UmVwZWF0Lnp3ICsgb2Zmc2V0UmVwZWF0Lnh5ICk7XG5cdGRpZmZ1c2VDb2xvciAqPSBtYXBU
ZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xuI2VuZGlmXG4iOworCisJdmFyIG1hcF9wYXJ0aWNs
ZV9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTUFQXG5cdHVuaWZvcm0gdmVjNCBvZmZzZXRS
ZXBlYXQ7XG5cdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcbiNlbmRpZlxuIjsKKworCXZhciBtZXRh
bG5lc3NtYXBfZnJhZ21lbnQgPSAiZmxvYXQgbWV0YWxuZXNzRmFjdG9yID0gbWV0YWxuZXNzO1xu
I2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dmVjNCB0ZXhlbE1ldGFsbmVzcyA9IHRleHR1cmUy
RCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcblx0bWV0YWxuZXNzRmFjdG9yICo9IHRleGVsTWV0YWxu
ZXNzLmI7XG4jZW5kaWZcbiI7CisKKwl2YXIgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSAi
I2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFw
O1xuI2VuZGlmIjsKKworCXZhciBtb3JwaG5vcm1hbF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9NT1JQ
SE5PUk1BTFNcblx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwwIC0gbm9ybWFsICkgKiBt
b3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3Jt
YWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0b2JqZWN0Tm9y
bWFsICs9ICggbW9ycGhOb3JtYWwyIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNb
IDIgXTtcblx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwzIC0gbm9ybWFsICkgKiBtb3Jw
aFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcbiNlbmRpZlxuIjsKKworCXZhciBtb3JwaHRhcmdldF9w
YXJzX3ZlcnRleCA9ICIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xuXHQjaWZuZGVmIFVTRV9NT1JQ
SE5PUk1BTFNcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcblx0
I2Vsc2Vcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0I2Vu
ZGlmXG4jZW5kaWYiOworCisJdmFyIG1vcnBodGFyZ2V0X3ZlcnRleCA9ICIjaWZkZWYgVVNFX01P
UlBIVEFSR0VUU1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MCAtIHBvc2l0aW9uICkg
KiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRh
cmdldDEgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdHRyYW5z
Zm9ybWVkICs9ICggbW9ycGhUYXJnZXQyIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVl
bmNlc1sgMiBdO1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MyAtIHBvc2l0aW9uICkg
KiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcblx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxT
XG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ0IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFy
Z2V0SW5mbHVlbmNlc1sgNCBdO1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NSAtIHBv
c2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDUgXTtcblx0dHJhbnNmb3JtZWQgKz0g
KCBtb3JwaFRhcmdldDYgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA2IF07
XG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ3IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFy
Z2V0SW5mbHVlbmNlc1sgNyBdO1xuXHQjZW5kaWZcbiNlbmRpZlxuIjsKKworCXZhciBub3JtYWxf
ZmxpcCA9ICIjaWZkZWYgRE9VQkxFX1NJREVEXG5cdGZsb2F0IGZsaXBOb3JtYWwgPSAoIGZsb2F0
KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG4jZWxzZVxuXHRmbG9hdCBmbGlwTm9y
bWFsID0gMS4wO1xuI2VuZGlmXG4iOworCisJdmFyIG5vcm1hbF9mcmFnbWVudCA9ICIjaWZkZWYg
RkxBVF9TSEFERURcblx0dmVjMyBmZHggPSB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwg
ZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZl
YzMgZmR5ID0gdmVjMyggZEZkeSggdlZpZXdQb3NpdGlvbi54ICksIGRGZHkoIHZWaWV3UG9zaXRp
b24ueSApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIG5vcm1hbCA9IG5vcm1h
bGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcbiNlbHNlXG5cdHZlYzMgbm9ybWFsID0gbm9ybWFs
aXplKCB2Tm9ybWFsICkgKiBmbGlwTm9ybWFsO1xuI2VuZGlmXG4jaWZkZWYgVVNFX05PUk1BTE1B
UFxuXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCAp
O1xuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxuXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFs
QXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSApO1xuI2VuZGlmXG4iOwor
CisJdmFyIG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTk9STUFMTUFQXG5c
dHVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxl
O1xuXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3Jt
ICkge1xuXHRcdHZlYzMgcTAgPSB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bv
cy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMyBxMSA9IHZlYzMoIGRGZHkoIGV5
ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcblx0XHR2
ZWMyIHN0MCA9IGRGZHgoIHZVdi5zdCApO1xuXHRcdHZlYzIgc3QxID0gZEZkeSggdlV2LnN0ICk7
XG5cdFx0dmVjMyBTID0gbm9ybWFsaXplKCBxMCAqIHN0MS50IC0gcTEgKiBzdDAudCApO1xuXHRc
dHZlYzMgVCA9IG5vcm1hbGl6ZSggLXEwICogc3QxLnMgKyBxMSAqIHN0MC5zICk7XG5cdFx0dmVj
MyBOID0gbm9ybWFsaXplKCBzdXJmX25vcm0gKTtcblx0XHR2ZWMzIG1hcE4gPSB0ZXh0dXJlMkQo
IG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRcdG1hcE4ueHkgPSBub3JtYWxT
Y2FsZSAqIG1hcE4ueHk7XG5cdFx0bWF0MyB0c24gPSBtYXQzKCBTLCBULCBOICk7XG5cdFx0cmV0
dXJuIG5vcm1hbGl6ZSggdHNuICogbWFwTiApO1xuXHR9XG4jZW5kaWZcbiI7CisKKwl2YXIgcGFj
a2luZyA9ICJ2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XG5c
dHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xufVxudmVjMyB1bnBhY2tS
R0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7XG5cdHJldHVybiAxLjAgLSAyLjAgKiBy
Z2IueHl6O1xufVxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBm
bG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjtcbmNvbnN0IHZlYzMgUGFja0ZhY3Rv
cnMgPSB2ZWMzKCAyNTYuICogMjU2LiAqIDI1Ni4sIDI1Ni4gKiAyNTYuLCAgMjU2LiApO1xuY29u
c3QgdmVjNCBVbnBhY2tGYWN0b3JzID0gVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3Rv
cnMsIDEuICk7XG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjtcbnZlYzQgcGFj
a0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xuXHR2ZWM0IHIgPSB2ZWM0KCBmcmFj
dCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcblx0ci55encgLT0gci54eXogKiBTaGlmdFJpZ2h0
ODtcdHJldHVybiByICogUGFja1Vwc2NhbGU7XG59XG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCgg
Y29uc3QgaW4gdmVjNCB2ICkge1xuXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XG59
XG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBj
b25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoIHZp
ZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7XG59XG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0
aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFy
LCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAt
IGZhciApIC0gbmVhcjtcbn1cbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBp
biBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkg
e1xuXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAq
IHZpZXdaICk7XG59XG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxv
YXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtc
blx0cmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGludkNsaXBaIC0g
ZmFyICk7XG59XG4iOworCisJdmFyIHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQgPSAiI2lm
ZGVmIFBSRU1VTFRJUExJRURfQUxQSEFcblx0Z2xfRnJhZ0NvbG9yLnJnYiAqPSBnbF9GcmFnQ29s
b3IuYTtcbiNlbmRpZlxuIjsKKworCXZhciBwcm9qZWN0X3ZlcnRleCA9ICJ2ZWM0IG12UG9zaXRp
b24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG5nbF9Qb3Np
dGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuIjsKKworCXZhciBkaXRoZXJp
bmdfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoIERJVEhFUklORyApXG4gIGdsX0ZyYWdDb2xvci5y
Z2IgPSBkaXRoZXJpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZlxuIjsKKworCXZhciBk
aXRoZXJpbmdfcGFyc19mcmFnbWVudCA9ICIjaWYgZGVmaW5lZCggRElUSEVSSU5HIClcblx0dmVj
MyBkaXRoZXJpbmcoIHZlYzMgY29sb3IgKSB7XG5cdFx0ZmxvYXQgZ3JpZF9wb3NpdGlvbiA9IHJh
bmQoIGdsX0ZyYWdDb29yZC54eSApO1xuXHRcdHZlYzMgZGl0aGVyX3NoaWZ0X1JHQiA9IHZlYzMo
IDAuMjUgLyAyNTUuMCwgLTAuMjUgLyAyNTUuMCwgMC4yNSAvIDI1NS4wICk7XG5cdFx0ZGl0aGVy
X3NoaWZ0X1JHQiA9IG1peCggMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgLTIuMCAqIGRpdGhlcl9z
aGlmdF9SR0IsIGdyaWRfcG9zaXRpb24gKTtcblx0XHRyZXR1cm4gY29sb3IgKyBkaXRoZXJfc2hp
ZnRfUkdCO1xuXHR9XG4jZW5kaWZcbiI7CisKKwl2YXIgcm91Z2huZXNzbWFwX2ZyYWdtZW50ID0g
ImZsb2F0IHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzcztcbiNpZmRlZiBVU0VfUk9VR0hORVNT
TUFQXG5cdHZlYzQgdGV4ZWxSb3VnaG5lc3MgPSB0ZXh0dXJlMkQoIHJvdWdobmVzc01hcCwgdlV2
ICk7XG5cdHJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nO1xuI2VuZGlmXG4iOwor
CisJdmFyIHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfUk9VR0hORVNT
TUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHJvdWdobmVzc01hcDtcbiNlbmRpZiI7CisKKwl2YXIg
c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5V
TV9ESVJfTElHSFRTID4gMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93
TWFwWyBOVU1fRElSX0xJR0hUUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFk
b3dDb29yZFsgTlVNX0RJUl9MSUdIVFMgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdI
VFMgPiAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElH
SFRTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hU
UyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXG5cdFx0dW5pZm9ybSBz
YW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0XHR2YXJ5aW5n
IHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0I2VuZGlmXG5c
dGZsb2F0IHRleHR1cmUyRENvbXBhcmUoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgdXYsIGZsb2F0
IGNvbXBhcmUgKSB7XG5cdFx0cmV0dXJuIHN0ZXAoIGNvbXBhcmUsIHVucGFja1JHQkFUb0RlcHRo
KCB0ZXh0dXJlMkQoIGRlcHRocywgdXYgKSApICk7XG5cdH1cblx0ZmxvYXQgdGV4dHVyZTJEU2hh
ZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21w
YXJlICkge1xuXHRcdGNvbnN0IHZlYzIgb2Zmc2V0ID0gdmVjMiggMC4wLCAxLjAgKTtcblx0XHR2
ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2l6ZTtcblx0XHR2ZWMyIGNlbnRyb2lkVVYg
PSBmbG9vciggdXYgKiBzaXplICsgMC41ICkgLyBzaXplO1xuXHRcdGZsb2F0IGxiID0gdGV4dHVy
ZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBj
b21wYXJlICk7XG5cdFx0ZmxvYXQgbHQgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRy
b2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcblx0XHRmbG9hdCByYiA9
IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNl
dC55eCwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJ0ID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhz
LCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XG5cdFx0dmVj
MiBmID0gZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xuXHRcdGZsb2F0IGEgPSBtaXgoIGxiLCBs
dCwgZi55ICk7XG5cdFx0ZmxvYXQgYiA9IG1peCggcmIsIHJ0LCBmLnkgKTtcblx0XHRmbG9hdCBj
ID0gbWl4KCBhLCBiLCBmLnggKTtcblx0XHRyZXR1cm4gYztcblx0fVxuXHRmbG9hdCBnZXRTaGFk
b3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93
QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xuXHRcdGZsb2F0
IHNoYWRvdyA9IDEuMDtcblx0XHRzaGFkb3dDb29yZC54eXogLz0gc2hhZG93Q29vcmQudztcblx0
XHRzaGFkb3dDb29yZC56ICs9IHNoYWRvd0JpYXM7XG5cdFx0YnZlYzQgaW5GcnVzdHVtVmVjID0g
YnZlYzQgKCBzaGFkb3dDb29yZC54ID49IDAuMCwgc2hhZG93Q29vcmQueCA8PSAxLjAsIHNoYWRv
d0Nvb3JkLnkgPj0gMC4wLCBzaGFkb3dDb29yZC55IDw9IDEuMCApO1xuXHRcdGJvb2wgaW5GcnVz
dHVtID0gYWxsKCBpbkZydXN0dW1WZWMgKTtcblx0XHRidmVjMiBmcnVzdHVtVGVzdFZlYyA9IGJ2
ZWMyKCBpbkZydXN0dW0sIHNoYWRvd0Nvb3JkLnogPD0gMS4wICk7XG5cdFx0Ym9vbCBmcnVzdHVt
VGVzdCA9IGFsbCggZnJ1c3R1bVRlc3RWZWMgKTtcblx0XHRpZiAoIGZydXN0dW1UZXN0ICkge1xu
XHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxuXHRcdFx0dmVjMiB0ZXhlbFNp
emUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgPSAtIHRl
eGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwID0gLSB0ZXhlbFNpemUu
eSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFk
b3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVz
O1xuXHRcdFx0c2hhZG93ID0gKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAs
IHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0
XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIo
IDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUo
IHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29y
ZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3Jk
Lnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVy
ZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtc
blx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZl
YzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBh
cmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dD
b29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nv
b3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4
dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkx
ICksIHNoYWRvd0Nvb3JkLnogKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2VsaWYg
ZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUg
PSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgPSAtIHRleGVs
U2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwID0gLSB0ZXhlbFNpemUueSAq
IHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dS
YWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xu
XHRcdFx0c2hhZG93ID0gKFxuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAs
IHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93
Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFk
b3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3Jk
LnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFw
U2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkg
K1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUs
IHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0
XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFk
b3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVy
cCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwg
MC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNo
YWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSAp
LCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dN
YXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hh
ZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBz
aGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nv
b3JkLnogKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHNoYWRv
dyA9IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nv
b3JkLnogKTtcblx0XHQjZW5kaWZcblx0XHR9XG5cdFx0cmV0dXJuIHNoYWRvdztcblx0fVxuXHR2
ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7XG5cdFx0dmVjMyBhYnNW
ID0gYWJzKCB2ICk7XG5cdFx0ZmxvYXQgc2NhbGVUb0N1YmUgPSAxLjAgLyBtYXgoIGFic1YueCwg
bWF4KCBhYnNWLnksIGFic1YueiApICk7XG5cdFx0YWJzViAqPSBzY2FsZVRvQ3ViZTtcblx0XHR2
ICo9IHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7XG5cdFx0dmVjMiBw
bGFuYXIgPSB2Lnh5O1xuXHRcdGZsb2F0IGFsbW9zdEFUZXhlbCA9IDEuNSAqIHRleGVsU2l6ZVk7
XG5cdFx0ZmxvYXQgYWxtb3N0T25lID0gMS4wIC0gYWxtb3N0QVRleGVsO1xuXHRcdGlmICggYWJz
Vi56ID49IGFsbW9zdE9uZSApIHtcblx0XHRcdGlmICggdi56ID4gMC4wIClcblx0XHRcdFx0cGxh
bmFyLnggPSA0LjAgLSB2Lng7XG5cdFx0fSBlbHNlIGlmICggYWJzVi54ID49IGFsbW9zdE9uZSAp
IHtcblx0XHRcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XG5cdFx0XHRwbGFuYXIueCA9IHYu
eiAqIHNpZ25YICsgMi4wICogc2lnblg7XG5cdFx0fSBlbHNlIGlmICggYWJzVi55ID49IGFsbW9z
dE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25ZID0gc2lnbiggdi55ICk7XG5cdFx0XHRwbGFuYXIu
eCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xuXHRcdFx0cGxhbmFyLnkgPSB2LnogKiBzaWdu
WSAtIDIuMDtcblx0XHR9XG5cdFx0cmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIg
KyB2ZWMyKCAwLjM3NSwgMC43NSApO1xuXHR9XG5cdGZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1w
bGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZs
b2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCApIHtcblx0XHR2ZWMyIHRleGVsU2l6
ZSA9IHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xu
XHRcdHZlYzMgbGlnaHRUb1Bvc2l0aW9uID0gc2hhZG93Q29vcmQueHl6O1xuXHRcdHZlYzMgYmQz
RCA9IG5vcm1hbGl6ZSggbGlnaHRUb1Bvc2l0aW9uICk7XG5cdFx0ZmxvYXQgZHAgPSAoIGxlbmd0
aCggbGlnaHRUb1Bvc2l0aW9uICkgLSBzaGFkb3dCaWFzICkgLyAxMDAwLjA7XG5cdFx0I2lmIGRl
ZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BD
Rl9TT0ZUIClcblx0XHRcdHZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRp
dXMgKiB0ZXhlbFNpemUueTtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBh
cmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSAp
LCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VVigg
YmQzRCArIG9mZnNldC55eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJl
MkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eCwgdGV4ZWxT
aXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3Vi
ZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0
dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkg
KSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYo
IGJkM0QgKyBvZmZzZXQueHh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVy
ZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVs
U2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1
YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRc
dHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh4
LCB0ZXhlbFNpemUueSApLCBkcCApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxz
ZVxuXHRcdFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJk
M0QsIHRleGVsU2l6ZS55ICksIGRwICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuIjsKKwor
CXZhciBzaGFkb3dtYXBfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lm
IE5VTV9ESVJfTElHSFRTID4gMFxuXHRcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01h
dHJpeFsgTlVNX0RJUl9MSUdIVFMgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hh
ZG93Q29vcmRbIE5VTV9ESVJfTElHSFRTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElH
SFRTID4gMFxuXHRcdHVuaWZvcm0gbWF0NCBzcG90U2hhZG93TWF0cml4WyBOVU1fU1BPVF9MSUdI
VFMgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRT
IF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcblx0XHR1bmlmb3JtIG1h
dDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0XHR2YXJ5aW5nIHZl
YzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0I2VuZGlmXG4jZW5k
aWZcbiI7CisKKwl2YXIgc2hhZG93bWFwX3ZlcnRleCA9ICIjaWZkZWYgVVNFX1NIQURPV01BUFxu
XHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJf
TElHSFRTOyBpICsrICkge1xuXHRcdHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gPSBkaXJl
Y3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcblx0fVxuXHQjZW5kaWZc
blx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQ
T1RfTElHSFRTOyBpICsrICkge1xuXHRcdHZTcG90U2hhZG93Q29vcmRbIGkgXSA9IHNwb3RTaGFk
b3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1f
UE9JTlRfTElHSFRTID4gMFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRT
OyBpICsrICkge1xuXHRcdHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0gPSBwb2ludFNoYWRvd01hdHJp
eFsgaSBdICogd29ybGRQb3NpdGlvbjtcblx0fVxuXHQjZW5kaWZcbiNlbmRpZlxuIjsKKworCXZh
ciBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQgPSAiZmxvYXQgZ2V0U2hhZG93TWFzaygpIHtcblx0
ZmxvYXQgc2hhZG93ID0gMS4wO1xuXHQjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJ
Ul9MSUdIVFMgPiAwXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0Zm9y
ICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XG5cdFx0ZGlyZWN0aW9u
YWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICo9IGJvb2woIGRp
cmVjdGlvbmFsTGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFw
WyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5z
aGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hh
ZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElH
SFRTID4gMFxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBO
VU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBd
O1xuXHRcdHNoYWRvdyAqPSBib29sKCBzcG90TGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIHNw
b3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFk
b3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6
IDEuMDtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXG5cdFBvaW50
TGlnaHQgcG9pbnRMaWdodDtcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hU
UzsgaSArKyApIHtcblx0XHRwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTtcblx0XHRzaGFk
b3cgKj0gYm9vbCggcG9pbnRMaWdodC5zaGFkb3cgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNo
YWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93
QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0gKSA6
IDEuMDtcblx0fVxuXHQjZW5kaWZcblx0I2VuZGlmXG5cdHJldHVybiBzaGFkb3c7XG59XG4iOwor
CisJdmFyIHNraW5iYXNlX3ZlcnRleCA9ICIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgYm9u
ZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xuXHRtYXQ0IGJvbmVNYXRZID0g
Z2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcblx0bWF0NCBib25lTWF0WiA9IGdldEJvbmVN
YXRyaXgoIHNraW5JbmRleC56ICk7XG5cdG1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBz
a2luSW5kZXgudyApO1xuI2VuZGlmIjsKKworCXZhciBza2lubmluZ19wYXJzX3ZlcnRleCA9ICIj
aWZkZWYgVVNFX1NLSU5OSU5HXG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4O1xuXHR1bmlmb3Jt
IG1hdDQgYmluZE1hdHJpeEludmVyc2U7XG5cdCNpZmRlZiBCT05FX1RFWFRVUkVcblx0XHR1bmlm
b3JtIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcblx0XHR1bmlmb3JtIGludCBib25lVGV4dHVyZVNp
emU7XG5cdFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xuXHRcdFx0
ZmxvYXQgaiA9IGkgKiA0LjA7XG5cdFx0XHRmbG9hdCB4ID0gbW9kKCBqLCBmbG9hdCggYm9uZVRl
eHR1cmVTaXplICkgKTtcblx0XHRcdGZsb2F0IHkgPSBmbG9vciggaiAvIGZsb2F0KCBib25lVGV4
dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgZHggPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVT
aXplICk7XG5cdFx0XHRmbG9hdCBkeSA9IDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtc
blx0XHRcdHkgPSBkeSAqICggeSArIDAuNSApO1xuXHRcdFx0dmVjNCB2MSA9IHRleHR1cmUyRCgg
Ym9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2
MiA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMS41ICksIHkgKSAp
O1xuXHRcdFx0dmVjNCB2MyA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4
ICsgMi41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2NCA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUs
IHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xuXHRcdFx0bWF0NCBib25lID0gbWF0NCgg
djEsIHYyLCB2MywgdjQgKTtcblx0XHRcdHJldHVybiBib25lO1xuXHRcdH1cblx0I2Vsc2Vcblx0
XHR1bmlmb3JtIG1hdDQgYm9uZU1hdHJpY2VzWyBNQVhfQk9ORVMgXTtcblx0XHRtYXQ0IGdldEJv
bmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRtYXQ0IGJvbmUgPSBib25lTWF0
cmljZXNbIGludChpKSBdO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZW5kaWZcbiNl
bmRpZlxuIjsKKworCXZhciBza2lubmluZ192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9TS0lOTklOR1xu
XHR2ZWM0IHNraW5WZXJ0ZXggPSBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCAp
O1xuXHR2ZWM0IHNraW5uZWQgPSB2ZWM0KCAwLjAgKTtcblx0c2tpbm5lZCArPSBib25lTWF0WCAq
IHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFkgKiBza2lu
VmVydGV4ICogc2tpbldlaWdodC55O1xuXHRza2lubmVkICs9IGJvbmVNYXRaICogc2tpblZlcnRl
eCAqIHNraW5XZWlnaHQuejtcblx0c2tpbm5lZCArPSBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBz
a2luV2VpZ2h0Lnc7XG5cdHRyYW5zZm9ybWVkID0gKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5u
ZWQgKS54eXo7XG4jZW5kaWZcbiI7CisKKwl2YXIgc2tpbm5vcm1hbF92ZXJ0ZXggPSAiI2lmZGVm
IFVTRV9TS0lOTklOR1xuXHRtYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTtcblx0c2tpbk1h
dHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcblx0c2tpbk1hdHJpeCArPSBza2luV2Vp
Z2h0LnkgKiBib25lTWF0WTtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0
Wjtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0Vztcblx0c2tpbk1hdHJp
eCAgPSBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5NYXRyaXggKiBiaW5kTWF0cml4O1xuXHRvYmpl
Y3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSAp
Lnh5ejtcbiNlbmRpZlxuIjsKKworCXZhciBzcGVjdWxhcm1hcF9mcmFnbWVudCA9ICJmbG9hdCBz
cGVjdWxhclN0cmVuZ3RoO1xuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR2ZWM0IHRleGVsU3Bl
Y3VsYXIgPSB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcblx0c3BlY3VsYXJTdHJlbmd0
aCA9IHRleGVsU3BlY3VsYXIucjtcbiNlbHNlXG5cdHNwZWN1bGFyU3RyZW5ndGggPSAxLjA7XG4j
ZW5kaWYiOworCisJdmFyIHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9T
UEVDVUxBUk1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcbiNlbmRpZiI7CisK
Kwl2YXIgdG9uZW1hcHBpbmdfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoIFRPTkVfTUFQUElORyAp
XG4gIGdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xu
I2VuZGlmXG4iOworCisJdmFyIHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQgPSAiI2RlZmluZSBz
YXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxudW5pZm9ybSBmbG9hdCB0b25lTWFwcGlu
Z0V4cG9zdXJlO1xudW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ1doaXRlUG9pbnQ7XG52ZWMzIExp
bmVhclRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBv
c3VyZSAqIGNvbG9yO1xufVxudmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkg
e1xuXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xuXHRyZXR1cm4gc2F0dXJhdGUoIGNv
bG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcbn1cbiNkZWZpbmUgVW5jaGFydGVkMkhl
bHBlciggeCApIG1heCggKCAoIHggKiAoIDAuMTUgKiB4ICsgMC4xMCAqIDAuNTAgKSArIDAuMjAg
KiAwLjAyICkgLyAoIHggKiAoIDAuMTUgKiB4ICsgMC41MCApICsgMC4yMCAqIDAuMzAgKSApIC0g
MC4wMiAvIDAuMzAsIHZlYzMoIDAuMCApIClcbnZlYzMgVW5jaGFydGVkMlRvbmVNYXBwaW5nKCB2
ZWMzIGNvbG9yICkge1xuXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xuXHRyZXR1cm4g
c2F0dXJhdGUoIFVuY2hhcnRlZDJIZWxwZXIoIGNvbG9yICkgLyBVbmNoYXJ0ZWQySGVscGVyKCB2
ZWMzKCB0b25lTWFwcGluZ1doaXRlUG9pbnQgKSApICk7XG59XG52ZWMzIE9wdGltaXplZENpbmVv
blRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9z
dXJlO1xuXHRjb2xvciA9IG1heCggdmVjMyggMC4wICksIGNvbG9yIC0gMC4wMDQgKTtcblx0cmV0
dXJuIHBvdyggKCBjb2xvciAqICggNi4yICogY29sb3IgKyAwLjUgKSApIC8gKCBjb2xvciAqICgg
Ni4yICogY29sb3IgKyAxLjcgKSArIDAuMDYgKSwgdmVjMyggMi4yICkgKTtcbn1cbiI7CisKKwl2
YXIgdXZfcGFyc19mcmFnbWVudCA9ICIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQo
IFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVT
RV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVT
RV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVk
KCBVU0VfTUVUQUxORVNTTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjtcbiNlbmRpZiI7CisKKwl2
YXIgdXZfcGFyc192ZXJ0ZXggPSAiI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBV
U0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0Vf
U1BFQ1VMQVJNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKSB8fCBkZWZpbmVkKCBVU0Vf
RU1JU1NJVkVNQVAgKSB8fCBkZWZpbmVkKCBVU0VfUk9VR0hORVNTTUFQICkgfHwgZGVmaW5lZCgg
VVNFX01FVEFMTkVTU01BUCApXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG5cdHVuaWZvcm0gdmVjNCBv
ZmZzZXRSZXBlYXQ7XG4jZW5kaWZcbiI7CisKKwl2YXIgdXZfdmVydGV4ID0gIiNpZiBkZWZpbmVk
KCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9S
TUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FM
UEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JP
VUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NNQVAgKVxuXHR2VXYgPSB1diAq
IG9mZnNldFJlcGVhdC56dyArIG9mZnNldFJlcGVhdC54eTtcbiNlbmRpZiI7CisKKwl2YXIgdXYy
X3BhcnNfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQo
IFVTRV9BT01BUCApXG5cdHZhcnlpbmcgdmVjMiB2VXYyO1xuI2VuZGlmIjsKKworCXZhciB1djJf
cGFyc192ZXJ0ZXggPSAiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVT
RV9BT01BUCApXG5cdGF0dHJpYnV0ZSB2ZWMyIHV2Mjtcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4j
ZW5kaWYiOworCisJdmFyIHV2Ml92ZXJ0ZXggPSAiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCAp
IHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdHZVdjIgPSB1djI7XG4jZW5kaWYiOworCisJdmFy
IHdvcmxkcG9zX3ZlcnRleCA9ICIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQo
IFBIT05HICkgfHwgZGVmaW5lZCggUEhZU0lDQUwgKSB8fCBkZWZpbmVkKCBMQU1CRVJUICkgfHwg
ZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxuXHR2ZWM0IHdvcmxkUG9zaXRpb24gPSBtb2RlbE1h
dHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbiNlbmRpZlxuIjsKKworCXZhciBjdWJl
X2ZyYWcgPSAidW5pZm9ybSBzYW1wbGVyQ3ViZSB0Q3ViZTtcbnVuaWZvcm0gZmxvYXQgdEZsaXA7
XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4j
aW5jbHVkZSA8Y29tbW9uPlxudm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJl
Q3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkUG9zaXRpb24ueCwgdldvcmxkUG9zaXRp
b24ueXogKSApO1xuXHRnbF9GcmFnQ29sb3IuYSAqPSBvcGFjaXR5O1xufVxuIjsKKworCXZhciBj
dWJlX3ZlcnQgPSAidmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgPGNvbW1v
bj5cbnZvaWQgbWFpbigpIHtcblx0dldvcmxkUG9zaXRpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24o
IHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQj
aW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG59XG4iOworCisJdmFyIGRlcHRoX2ZyYWcgPSAiI2lm
IERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxuXHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jZW5kaWZc
biNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJz
X2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhh
bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5c
biNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtc
blx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29s
b3IgPSB2ZWM0KCAxLjAgKTtcblx0I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxuXHRcdGRpZmZ1
c2VDb2xvci5hID0gb3BhY2l0eTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+
XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9m
cmFnbWVudD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaWYgREVQVEhf
UEFDS0lORyA9PSAzMjAwXG5cdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggdmVjMyggZ2xfRnJhZ0Nv
b3JkLnogKSwgb3BhY2l0eSApO1xuXHQjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDFcblx0XHRn
bF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGdsX0ZyYWdDb29yZC56ICk7XG5cdCNlbmRp
ZlxufVxuIjsKKworCXZhciBkZXB0aF92ZXJ0ID0gIiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVk
ZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4
PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5n
X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1
ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1
ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2lmZGVmIFVT
RV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHRc
dCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPHNraW5ub3JtYWxf
dmVydGV4PlxuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUg
PG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2lu
Y2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRl
eD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5n
X3BsYW5lc192ZXJ0ZXg+XG59XG4iOworCisJdmFyIGRpc3RhbmNlUkdCQV9mcmFnID0gInVuaWZv
cm0gdmVjMyBsaWdodFBvcztcbnZhcnlpbmcgdmVjNCB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRl
IDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNf
cGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbiAoKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFu
ZXNfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggbGVuZ3RoKCB2
V29ybGRQb3NpdGlvbi54eXogLSBsaWdodFBvcy54eXogKSAvIDEwMDAuMCApO1xufVxuIjsKKwor
CXZhciBkaXN0YW5jZVJHQkFfdmVydCA9ICJ2YXJ5aW5nIHZlYzQgdldvcmxkUG9zaXRpb247XG4j
aW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2lu
Y2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19w
YXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5c
blx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRl
eD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVy
dGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdf
cGxhbmVzX3ZlcnRleD5cblx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uO1xufVxuIjsK
KworCXZhciBlcXVpcmVjdF9mcmFnID0gInVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDtcbnVu
aWZvcm0gZmxvYXQgdEZsaXA7XG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4jaW5jbHVk
ZSA8Y29tbW9uPlxudm9pZCBtYWluKCkge1xuXHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSgg
dldvcmxkUG9zaXRpb24gKTtcblx0dmVjMiBzYW1wbGVVVjtcblx0c2FtcGxlVVYueSA9IHNhdHVy
YXRlKCB0RmxpcCAqIGRpcmVjdGlvbi55ICogLTAuNSArIDAuNSApO1xuXHRzYW1wbGVVVi54ID0g
YXRhbiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtc
blx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XG59XG4i
OworCisJdmFyIGVxdWlyZWN0X3ZlcnQgPSAidmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xu
I2luY2x1ZGUgPGNvbW1vbj5cbnZvaWQgbWFpbigpIHtcblx0dldvcmxkUG9zaXRpb24gPSB0cmFu
c2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xuXHQjaW5jbHVkZSA8YmVn
aW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG59XG4iOworCisJdmFyIGxp
bmVkYXNoZWRfZnJhZyA9ICJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3Bh
Y2l0eTtcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtc
bnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVk
ZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNp
bmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3Bs
YW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdf
cGxhbmVzX2ZyYWdtZW50PlxuXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkg
PiBkYXNoU2l6ZSApIHtcblx0XHRkaXNjYXJkO1xuXHR9XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9
IHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNp
dHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29s
b3JfZnJhZ21lbnQ+XG5cdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9G
cmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5j
bHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHRvbmVtYXBw
aW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVk
ZSA8Zm9nX2ZyYWdtZW50PlxufVxuIjsKKworCXZhciBsaW5lZGFzaGVkX3ZlcnQgPSAidW5pZm9y
bSBmbG9hdCBzY2FsZTtcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XG52YXJ5aW5nIGZs
b2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3Bh
cnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0
aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+
XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdHZMaW5lRGlzdGFu
Y2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcblx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3
TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rp
b25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4Plxu
XHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0
ZXg+XG59XG4iOworCisJdmFyIG1lc2hiYXNpY19mcmFnID0gInVuaWZvcm0gdmVjMyBkaWZmdXNl
O1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5n
IHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxjb2xv
cl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8
dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVk
ZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50
PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3Bh
cnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c3Bl
Y3VsYXJtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdt
ZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWlu
KCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1
c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRo
YnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29s
b3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUg
PGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50Plxu
XHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAw
LjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHQjaWZkZWYg
VVNFX0xJR0hUTUFQXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHRleHR1
cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcblx0I2Vsc2Vc
blx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7XG5cdCNl
bmRpZlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHJlZmxlY3RlZExpZ2h0LmluZGly
ZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiO1xuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSBy
ZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7XG5cdCNpbmNsdWRlIDxub3JtYWxfZmxpcD5c
blx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0
Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRf
YWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2lu
Y2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cbn1c
biI7CisKKwl2YXIgbWVzaGJhc2ljX3ZlcnQgPSAiI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRl
IDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8
ZW52bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1
ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5c
biNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9w
YXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lk
IG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4
PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4
PlxuXHQjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4Plxu
XHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92
ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2VuZGlmXG5cdCNp
bmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5c
dCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5c
blx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3Zl
cnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxl
bnZtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn1cbiI7CisKKwl2YXIgbWVz
aGxhbWJlcnRfZnJhZyA9ICJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlz
c2l2ZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtc
biNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG4jZW5kaWZc
biNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJp
bmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1
ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5j
bHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVu
dD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3Bh
cnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNs
dWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxs
aWdodHNfcGFycz5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzaGFk
b3dtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+
XG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0
aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdt
ZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50
PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVm
bGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICks
IHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVt
aXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdt
ZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21l
bnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVz
dF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVk
ZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVz
ZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XG5cdCNp
bmNsdWRlIDxsaWdodG1hcF9mcmFnbWVudD5cblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZm
dXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICk7XG5cdCNpZmRl
ZiBET1VCTEVfU0lERURcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlID0gKCBnbF9G
cm9udEZhY2luZyApID8gdkxpZ2h0RnJvbnQgOiB2TGlnaHRCYWNrO1xuXHQjZWxzZVxuXHRcdHJl
ZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSB2TGlnaHRGcm9udDtcblx0I2VuZGlmXG5cdHJl
ZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1
c2VDb2xvci5yZ2IgKSAqIGdldFNoYWRvd01hc2soKTtcblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdt
ZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNl
ICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNl
O1xuXHQjaW5jbHVkZSA8bm9ybWFsX2ZsaXA+XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+
XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7
XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5n
c19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11
bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+
XG59XG4iOworCisJdmFyIG1lc2hsYW1iZXJ0X3ZlcnQgPSAiI2RlZmluZSBMQU1CRVJUXG52YXJ5
aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVj
MyB2TGlnaHRCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3Bh
cnNfdmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxlbnZtYXBf
cGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XG4j
aW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4Plxu
I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3Bh
cnNfdmVydGV4PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxs
b2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192
ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRl
IDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVn
aW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5j
bHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5c
dCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRl
eD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5n
X3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVw
dGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2lu
Y2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNp
bmNsdWRlIDxsaWdodHNfbGFtYmVydF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVy
dGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn1cbiI7CisKKwl2YXIgbWVzaHBob25nX2Zy
YWcgPSAiI2RlZmluZSBQSE9OR1xudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMg
ZW1pc3NpdmU7XG51bmlmb3JtIHZlYzMgc3BlY3VsYXI7XG51bmlmb3JtIGZsb2F0IHNoaW5pbmVz
cztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8
cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxj
b2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVk
ZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5j
bHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdt
ZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3Np
dmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cbiNp
bmNsdWRlIDxncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2Zy
YWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzPlxuI2luY2x1
ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJz
X2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxu
b3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdt
ZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xp
cHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxj
bGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlm
ZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxl
Y3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAw
LjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5j
bHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5c
dCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50
PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8c3BlY3VsYXJt
YXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZmxpcD5cblx0I2luY2x1ZGUgPG5vcm1h
bF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVk
ZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX3RlbXBsYXRlPlxu
XHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxl
Y3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2Ug
KyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0
U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJh
Z21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xv
ci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVu
Y29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUg
PHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJh
Z21lbnQ+XG59XG4iOworCisJdmFyIG1lc2hwaG9uZ192ZXJ0ID0gIiNkZWZpbmUgUEhPTkdcbnZh
cnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5n
IHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9w
YXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxh
Y2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cbiNp
bmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4j
aW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFy
c192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxv
Z2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3Zl
cnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUg
PHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdp
bm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNs
dWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0
I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2
Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuI2VuZGlmXG5cdCNpbmNs
dWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNp
bmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVy
dGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1
Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2Vmlld1Bv
c2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5c
blx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4
PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn1cbiI7CisKKwl2YXIgbWVzaHBoeXNpY2FsX2Zy
YWcgPSAiI2RlZmluZSBQSFlTSUNBTFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZl
YzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcztcbnVuaWZvcm0gZmxvYXQgbWV0
YWxuZXNzO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmbmRlZiBTVEFOREFSRFxuXHR1bmlm
b3JtIGZsb2F0IGNsZWFyQ29hdDtcblx0dW5pZm9ybSBmbG9hdCBjbGVhckNvYXRSb3VnaG5lc3M7
XG4jZW5kaWZcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURF
RFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNp
bmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2lu
Y2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5c
biNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVu
dD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3Bh
cnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRl
IDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdt
ZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2lu
Y2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodHNfcGFy
cz5cbiNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxz
aGFkb3dtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+
XG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8cm91Z2huZXNz
bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+
XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGlu
Z19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBw
aW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNl
LCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVk
TGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCAp
ICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XG5cdCNpbmNsdWRl
IDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2lu
Y2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5c
dCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxyb3VnaG5lc3NtYXBf
ZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRl
IDxub3JtYWxfZmxpcD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudD5cblx0I2luY2x1ZGUg
PGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX2ZyYWdt
ZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX3RlbXBsYXRlPlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJh
Z21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1
c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJl
Y3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNz
aXZlUmFkaWFuY2U7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1
c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1
ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2lu
Y2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJp
bmdfZnJhZ21lbnQ+XG59XG4iOworCisJdmFyIG1lc2hwaHlzaWNhbF92ZXJ0ID0gIiNkZWZpbmUg
UEhZU0lDQUxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURF
RFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNp
bmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5j
bHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNf
dmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdl
dF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRl
IDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0
ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkg
e1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2lu
Y2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0
I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRl
eD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5v
cm1hbF92ZXJ0ZXg+XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgPSBub3JtYWxpemUo
IHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5c
blx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3Zl
cnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxw
cm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1
ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRp
b24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93
bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59XG4iOworCisJdmFyIG5vcm1h
bF9mcmFnID0gIiNkZWZpbmUgTk9STUFMXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWYgZGVm
aW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQo
IFVTRV9OT1JNQUxNQVAgKVxuXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNlbmRpZlxu
I2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2lu
Y2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxi
dW1wbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+
XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0
I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZsaXA+
XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHBh
Y2tOb3JtYWxUb1JHQiggbm9ybWFsICksIG9wYWNpdHkgKTtcbn1cbiI7CisKKwl2YXIgbm9ybWFs
X3ZlcnQgPSAiI2RlZmluZSBOT1JNQUxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRl
ZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXG5cdHZhcnlp
bmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZh
cnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4j
aW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFy
Z2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1
ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8
dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8
bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5j
bHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRl
eD5cbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3Jt
ZWROb3JtYWwgKTtcbiNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVk
ZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQj
aW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVy
dGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuI2lmIGRlZmluZWQoIEZMQVRf
U0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFM
TUFQIClcblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWZcbn1cbiI7
CisKKwl2YXIgcG9pbnRzX2ZyYWcgPSAidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZs
b2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5j
bHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFydGljbGVfcGFyc19m
cmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzaGFkb3dt
YXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50Plxu
I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xu
XHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGln
aHQgPSB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBv
cGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUg
PG1hcF9wYXJ0aWNsZV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQj
aW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNv
bG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNv
bG9yLmEgKTtcblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNp
bmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFn
bWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cbn1cbiI7CisKKwl2YXIgcG9pbnRzX3Zl
cnQgPSAidW5pZm9ybSBmbG9hdCBzaXplO1xudW5pZm9ybSBmbG9hdCBzY2FsZTtcbiNpbmNsdWRl
IDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3Bh
cnNfdmVydGV4PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxs
b2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192
ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNs
dWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2lmZGVm
IFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRnbF9Qb2ludFNpemUgPSBzaXplICogKCBzY2FsZSAv
IC0gbXZQb3NpdGlvbi56ICk7XG5cdCNlbHNlXG5cdFx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcblx0
I2VuZGlmXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlw
cGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5j
bHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59XG4iOwor
CisJdmFyIHNoYWRvd19mcmFnID0gInVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxj
b21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxs
aWdodHNfcGFycz5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRl
IDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xv
ciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIG9wYWNpdHkgKiAoIDEuMCAtIGdldFNoYWRvd01hc2so
KSApICk7XG59XG4iOworCisJdmFyIHNoYWRvd192ZXJ0ID0gIiNpbmNsdWRlIDxzaGFkb3dtYXBf
cGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5c
dCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5c
blx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG59XG4iOworCisJdmFyIFNoYWRlckNodW5r
ID0geworCQlhbHBoYW1hcF9mcmFnbWVudDogYWxwaGFtYXBfZnJhZ21lbnQsCisJCWFscGhhbWFw
X3BhcnNfZnJhZ21lbnQ6IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQsCisJCWFscGhhdGVzdF9mcmFn
bWVudDogYWxwaGF0ZXN0X2ZyYWdtZW50LAorCQlhb21hcF9mcmFnbWVudDogYW9tYXBfZnJhZ21l
bnQsCisJCWFvbWFwX3BhcnNfZnJhZ21lbnQ6IGFvbWFwX3BhcnNfZnJhZ21lbnQsCisJCWJlZ2lu
X3ZlcnRleDogYmVnaW5fdmVydGV4LAorCQliZWdpbm5vcm1hbF92ZXJ0ZXg6IGJlZ2lubm9ybWFs
X3ZlcnRleCwKKwkJYnNkZnM6IGJzZGZzLAorCQlidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IGJ1bXBt
YXBfcGFyc19mcmFnbWVudCwKKwkJY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiBjbGlwcGluZ19w
bGFuZXNfZnJhZ21lbnQsCisJCWNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBjbGlwcGlu
Z19wbGFuZXNfcGFyc19mcmFnbWVudCwKKwkJY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiBj
bGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsCisJCWNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IGNs
aXBwaW5nX3BsYW5lc192ZXJ0ZXgsCisJCWNvbG9yX2ZyYWdtZW50OiBjb2xvcl9mcmFnbWVudCwK
KwkJY29sb3JfcGFyc19mcmFnbWVudDogY29sb3JfcGFyc19mcmFnbWVudCwKKwkJY29sb3JfcGFy
c192ZXJ0ZXg6IGNvbG9yX3BhcnNfdmVydGV4LAorCQljb2xvcl92ZXJ0ZXg6IGNvbG9yX3ZlcnRl
eCwKKwkJY29tbW9uOiBjb21tb24sCisJCWN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDogY3Vi
ZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50LAorCQlkZWZhdWx0bm9ybWFsX3ZlcnRleDogZGVmYXVs
dG5vcm1hbF92ZXJ0ZXgsCisJCWRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogZGlzcGxhY2Vt
ZW50bWFwX3BhcnNfdmVydGV4LAorCQlkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiBkaXNwbGFjZW1l
bnRtYXBfdmVydGV4LAorCQllbWlzc2l2ZW1hcF9mcmFnbWVudDogZW1pc3NpdmVtYXBfZnJhZ21l
bnQsCisJCWVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21l
bnQsCisJCWVuY29kaW5nc19mcmFnbWVudDogZW5jb2RpbmdzX2ZyYWdtZW50LAorCQllbmNvZGlu
Z3NfcGFyc19mcmFnbWVudDogZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsCisJCWVudm1hcF9mcmFn
bWVudDogZW52bWFwX2ZyYWdtZW50LAorCQllbnZtYXBfcGFyc19mcmFnbWVudDogZW52bWFwX3Bh
cnNfZnJhZ21lbnQsCisJCWVudm1hcF9wYXJzX3ZlcnRleDogZW52bWFwX3BhcnNfdmVydGV4LAor
CQllbnZtYXBfdmVydGV4OiBlbnZtYXBfdmVydGV4LAorCQlmb2dfdmVydGV4OiBmb2dfdmVydGV4
LAorCQlmb2dfcGFyc192ZXJ0ZXg6IGZvZ19wYXJzX3ZlcnRleCwKKwkJZm9nX2ZyYWdtZW50OiBm
b2dfZnJhZ21lbnQsCisJCWZvZ19wYXJzX2ZyYWdtZW50OiBmb2dfcGFyc19mcmFnbWVudCwKKwkJ
Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDogZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCwKKwkJ
bGlnaHRtYXBfZnJhZ21lbnQ6IGxpZ2h0bWFwX2ZyYWdtZW50LAorCQlsaWdodG1hcF9wYXJzX2Zy
YWdtZW50OiBsaWdodG1hcF9wYXJzX2ZyYWdtZW50LAorCQlsaWdodHNfbGFtYmVydF92ZXJ0ZXg6
IGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCwKKwkJbGlnaHRzX3BhcnM6IGxpZ2h0c19wYXJzLAorCQls
aWdodHNfcGhvbmdfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19mcmFnbWVudCwKKwkJbGlnaHRzX3Bo
b25nX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50LAorCQlsaWdodHNf
cGh5c2ljYWxfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCwKKwkJbGlnaHRzX3Bo
eXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50LAorCQls
aWdodHNfdGVtcGxhdGU6IGxpZ2h0c190ZW1wbGF0ZSwKKwkJbG9nZGVwdGhidWZfZnJhZ21lbnQ6
IGxvZ2RlcHRoYnVmX2ZyYWdtZW50LAorCQlsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiBsb2dk
ZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50LAorCQlsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleDogbG9nZGVw
dGhidWZfcGFyc192ZXJ0ZXgsCisJCWxvZ2RlcHRoYnVmX3ZlcnRleDogbG9nZGVwdGhidWZfdmVy
dGV4LAorCQltYXBfZnJhZ21lbnQ6IG1hcF9mcmFnbWVudCwKKwkJbWFwX3BhcnNfZnJhZ21lbnQ6
IG1hcF9wYXJzX2ZyYWdtZW50LAorCQltYXBfcGFydGljbGVfZnJhZ21lbnQ6IG1hcF9wYXJ0aWNs
ZV9mcmFnbWVudCwKKwkJbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ6IG1hcF9wYXJ0aWNsZV9w
YXJzX2ZyYWdtZW50LAorCQltZXRhbG5lc3NtYXBfZnJhZ21lbnQ6IG1ldGFsbmVzc21hcF9mcmFn
bWVudCwKKwkJbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IG1ldGFsbmVzc21hcF9wYXJzX2Zy
YWdtZW50LAorCQltb3JwaG5vcm1hbF92ZXJ0ZXg6IG1vcnBobm9ybWFsX3ZlcnRleCwKKwkJbW9y
cGh0YXJnZXRfcGFyc192ZXJ0ZXg6IG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4LAorCQltb3JwaHRh
cmdldF92ZXJ0ZXg6IG1vcnBodGFyZ2V0X3ZlcnRleCwKKwkJbm9ybWFsX2ZsaXA6IG5vcm1hbF9m
bGlwLAorCQlub3JtYWxfZnJhZ21lbnQ6IG5vcm1hbF9mcmFnbWVudCwKKwkJbm9ybWFsbWFwX3Bh
cnNfZnJhZ21lbnQ6IG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50LAorCQlwYWNraW5nOiBwYWNraW5n
LAorCQlwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiBwcmVtdWx0aXBsaWVkX2FscGhhX2Zy
YWdtZW50LAorCQlwcm9qZWN0X3ZlcnRleDogcHJvamVjdF92ZXJ0ZXgsCisJCWRpdGhlcmluZ19m
cmFnbWVudDogZGl0aGVyaW5nX2ZyYWdtZW50LAorCQlkaXRoZXJpbmdfcGFyc19mcmFnbWVudDog
ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQsCisJCXJvdWdobmVzc21hcF9mcmFnbWVudDogcm91Z2hu
ZXNzbWFwX2ZyYWdtZW50LAorCQlyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudDogcm91Z2huZXNz
bWFwX3BhcnNfZnJhZ21lbnQsCisJCXNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXBf
cGFyc19mcmFnbWVudCwKKwkJc2hhZG93bWFwX3BhcnNfdmVydGV4OiBzaGFkb3dtYXBfcGFyc192
ZXJ0ZXgsCisJCXNoYWRvd21hcF92ZXJ0ZXg6IHNoYWRvd21hcF92ZXJ0ZXgsCisJCXNoYWRvd21h
c2tfcGFyc19mcmFnbWVudDogc2hhZG93bWFza19wYXJzX2ZyYWdtZW50LAorCQlza2luYmFzZV92
ZXJ0ZXg6IHNraW5iYXNlX3ZlcnRleCwKKwkJc2tpbm5pbmdfcGFyc192ZXJ0ZXg6IHNraW5uaW5n
X3BhcnNfdmVydGV4LAorCQlza2lubmluZ192ZXJ0ZXg6IHNraW5uaW5nX3ZlcnRleCwKKwkJc2tp
bm5vcm1hbF92ZXJ0ZXg6IHNraW5ub3JtYWxfdmVydGV4LAorCQlzcGVjdWxhcm1hcF9mcmFnbWVu
dDogc3BlY3VsYXJtYXBfZnJhZ21lbnQsCisJCXNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6IHNw
ZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQsCisJCXRvbmVtYXBwaW5nX2ZyYWdtZW50OiB0b25lbWFw
cGluZ19mcmFnbWVudCwKKwkJdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDogdG9uZW1hcHBpbmdf
cGFyc19mcmFnbWVudCwKKwkJdXZfcGFyc19mcmFnbWVudDogdXZfcGFyc19mcmFnbWVudCwKKwkJ
dXZfcGFyc192ZXJ0ZXg6IHV2X3BhcnNfdmVydGV4LAorCQl1dl92ZXJ0ZXg6IHV2X3ZlcnRleCwK
KwkJdXYyX3BhcnNfZnJhZ21lbnQ6IHV2Ml9wYXJzX2ZyYWdtZW50LAorCQl1djJfcGFyc192ZXJ0
ZXg6IHV2Ml9wYXJzX3ZlcnRleCwKKwkJdXYyX3ZlcnRleDogdXYyX3ZlcnRleCwKKwkJd29ybGRw
b3NfdmVydGV4OiB3b3JsZHBvc192ZXJ0ZXgsCisKKwkJY3ViZV9mcmFnOiBjdWJlX2ZyYWcsCisJ
CWN1YmVfdmVydDogY3ViZV92ZXJ0LAorCQlkZXB0aF9mcmFnOiBkZXB0aF9mcmFnLAorCQlkZXB0
aF92ZXJ0OiBkZXB0aF92ZXJ0LAorCQlkaXN0YW5jZVJHQkFfZnJhZzogZGlzdGFuY2VSR0JBX2Zy
YWcsCisJCWRpc3RhbmNlUkdCQV92ZXJ0OiBkaXN0YW5jZVJHQkFfdmVydCwKKwkJZXF1aXJlY3Rf
ZnJhZzogZXF1aXJlY3RfZnJhZywKKwkJZXF1aXJlY3RfdmVydDogZXF1aXJlY3RfdmVydCwKKwkJ
bGluZWRhc2hlZF9mcmFnOiBsaW5lZGFzaGVkX2ZyYWcsCisJCWxpbmVkYXNoZWRfdmVydDogbGlu
ZWRhc2hlZF92ZXJ0LAorCQltZXNoYmFzaWNfZnJhZzogbWVzaGJhc2ljX2ZyYWcsCisJCW1lc2hi
YXNpY192ZXJ0OiBtZXNoYmFzaWNfdmVydCwKKwkJbWVzaGxhbWJlcnRfZnJhZzogbWVzaGxhbWJl
cnRfZnJhZywKKwkJbWVzaGxhbWJlcnRfdmVydDogbWVzaGxhbWJlcnRfdmVydCwKKwkJbWVzaHBo
b25nX2ZyYWc6IG1lc2hwaG9uZ19mcmFnLAorCQltZXNocGhvbmdfdmVydDogbWVzaHBob25nX3Zl
cnQsCisJCW1lc2hwaHlzaWNhbF9mcmFnOiBtZXNocGh5c2ljYWxfZnJhZywKKwkJbWVzaHBoeXNp
Y2FsX3ZlcnQ6IG1lc2hwaHlzaWNhbF92ZXJ0LAorCQlub3JtYWxfZnJhZzogbm9ybWFsX2ZyYWcs
CisJCW5vcm1hbF92ZXJ0OiBub3JtYWxfdmVydCwKKwkJcG9pbnRzX2ZyYWc6IHBvaW50c19mcmFn
LAorCQlwb2ludHNfdmVydDogcG9pbnRzX3ZlcnQsCisJCXNoYWRvd19mcmFnOiBzaGFkb3dfZnJh
ZywKKwkJc2hhZG93X3ZlcnQ6IHNoYWRvd192ZXJ0CisJfTsKKworCS8qKgorCSAqIEBhdXRob3Ig
YWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICogQGF1dGhvciBtcmRvb2Ig
LyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6
Ly9nb21vLnNlLworCSAqLworCisJdmFyIFNoYWRlckxpYiA9IHsKKworCQliYXNpYzogeworCisJ
CQl1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggWworCQkJCVVuaWZvcm1zTGliLmNvbW1v
biwKKwkJCQlVbmlmb3Jtc0xpYi5hb21hcCwKKwkJCQlVbmlmb3Jtc0xpYi5saWdodG1hcCwKKwkJ
CQlVbmlmb3Jtc0xpYi5mb2cKKwkJCV0gKSwKKworCQkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVu
ay5tZXNoYmFzaWNfdmVydCwKKwkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFz
aWNfZnJhZworCisJCX0sCisKKwkJbGFtYmVydDogeworCisJCQl1bmlmb3JtczogVW5pZm9ybXNV
dGlscy5tZXJnZSggWworCQkJCVVuaWZvcm1zTGliLmNvbW1vbiwKKwkJCQlVbmlmb3Jtc0xpYi5h
b21hcCwKKwkJCQlVbmlmb3Jtc0xpYi5saWdodG1hcCwKKwkJCQlVbmlmb3Jtc0xpYi5lbWlzc2l2
ZW1hcCwKKwkJCQlVbmlmb3Jtc0xpYi5mb2csCisJCQkJVW5pZm9ybXNMaWIubGlnaHRzLAorCQkJ
CXsKKwkJCQkJZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9CisJCQkJ
fQorCQkJXSApLAorCisJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X3Zl
cnQsCisJCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGxhbWJlcnRfZnJhZworCisJ
CX0sCisKKwkJcGhvbmc6IHsKKworCQkJdW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFsK
KwkJCQlVbmlmb3Jtc0xpYi5jb21tb24sCisJCQkJVW5pZm9ybXNMaWIuYW9tYXAsCisJCQkJVW5p
Zm9ybXNMaWIubGlnaHRtYXAsCisJCQkJVW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsCisJCQkJVW5p
Zm9ybXNMaWIuYnVtcG1hcCwKKwkJCQlVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsCisJCQkJVW5pZm9y
bXNMaWIuZGlzcGxhY2VtZW50bWFwLAorCQkJCVVuaWZvcm1zTGliLmdyYWRpZW50bWFwLAorCQkJ
CVVuaWZvcm1zTGliLmZvZywKKwkJCQlVbmlmb3Jtc0xpYi5saWdodHMsCisJCQkJeworCQkJCQll
bWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sCisJCQkJCXNwZWN1bGFy
OiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MTExMTExICkgfSwKKwkJCQkJc2hpbmluZXNzOiB7IHZh
bHVlOiAzMCB9CisJCQkJfQorCQkJXSApLAorCisJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5r
Lm1lc2hwaG9uZ192ZXJ0LAorCQkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9u
Z19mcmFnCisKKwkJfSwKKworCQlzdGFuZGFyZDogeworCisJCQl1bmlmb3JtczogVW5pZm9ybXNV
dGlscy5tZXJnZSggWworCQkJCVVuaWZvcm1zTGliLmNvbW1vbiwKKwkJCQlVbmlmb3Jtc0xpYi5h
b21hcCwKKwkJCQlVbmlmb3Jtc0xpYi5saWdodG1hcCwKKwkJCQlVbmlmb3Jtc0xpYi5lbWlzc2l2
ZW1hcCwKKwkJCQlVbmlmb3Jtc0xpYi5idW1wbWFwLAorCQkJCVVuaWZvcm1zTGliLm5vcm1hbG1h
cCwKKwkJCQlVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsCisJCQkJVW5pZm9ybXNMaWIucm91
Z2huZXNzbWFwLAorCQkJCVVuaWZvcm1zTGliLm1ldGFsbmVzc21hcCwKKwkJCQlVbmlmb3Jtc0xp
Yi5mb2csCisJCQkJVW5pZm9ybXNMaWIubGlnaHRzLAorCQkJCXsKKwkJCQkJZW1pc3NpdmU6IHsg
dmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9LAorCQkJCQlyb3VnaG5lc3M6IHsgdmFsdWU6
IDAuNSB9LAorCQkJCQltZXRhbG5lc3M6IHsgdmFsdWU6IDAuNSB9LAorCQkJCQllbnZNYXBJbnRl
bnNpdHk6IHsgdmFsdWU6IDEgfSAvLyB0ZW1wb3JhcnkKKwkJCQl9CisJCQldICksCisKKwkJCXZl
cnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsCisJCQlmcmFnbWVudFNo
YWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWcKKworCQl9LAorCisJCXBvaW50czog
eworCisJCQl1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggWworCQkJCVVuaWZvcm1zTGli
LnBvaW50cywKKwkJCQlVbmlmb3Jtc0xpYi5mb2cKKwkJCV0gKSwKKworCQkJdmVydGV4U2hhZGVy
OiBTaGFkZXJDaHVuay5wb2ludHNfdmVydCwKKwkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVu
ay5wb2ludHNfZnJhZworCisJCX0sCisKKwkJZGFzaGVkOiB7CisKKwkJCXVuaWZvcm1zOiBVbmlm
b3Jtc1V0aWxzLm1lcmdlKCBbCisJCQkJVW5pZm9ybXNMaWIuY29tbW9uLAorCQkJCVVuaWZvcm1z
TGliLmZvZywKKwkJCQl7CisJCQkJCXNjYWxlOiB7IHZhbHVlOiAxIH0sCisJCQkJCWRhc2hTaXpl
OiB7IHZhbHVlOiAxIH0sCisJCQkJCXRvdGFsU2l6ZTogeyB2YWx1ZTogMiB9CisJCQkJfQorCQkJ
XSApLAorCisJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmxpbmVkYXNoZWRfdmVydCwKKwkJ
CWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWcKKworCQl9LAorCisJ
CWRlcHRoOiB7CisKKwkJCXVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbCisJCQkJVW5p
Zm9ybXNMaWIuY29tbW9uLAorCQkJCVVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcAorCQkJXSAp
LAorCisJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmRlcHRoX3ZlcnQsCisJCQlmcmFnbWVu
dFNoYWRlcjogU2hhZGVyQ2h1bmsuZGVwdGhfZnJhZworCisJCX0sCisKKwkJbm9ybWFsOiB7CisK
KwkJCXVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbCisJCQkJVW5pZm9ybXNMaWIuY29t
bW9uLAorCQkJCVVuaWZvcm1zTGliLmJ1bXBtYXAsCisJCQkJVW5pZm9ybXNMaWIubm9ybWFsbWFw
LAorCQkJCVVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCwKKwkJCQl7CisJCQkJCW9wYWNpdHk6
IHsgdmFsdWU6IDEuMCB9CisJCQkJfQorCQkJXSApLAorCisJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRl
ckNodW5rLm5vcm1hbF92ZXJ0LAorCQkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1h
bF9mcmFnCisKKwkJfSwKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vCUN1YmUgbWFwIHNo
YWRlcgorCQkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWN1YmU6IHsKKworCQkJdW5pZm9ybXM6
IHsKKwkJCQl0Q3ViZTogeyB2YWx1ZTogbnVsbCB9LAorCQkJCXRGbGlwOiB7IHZhbHVlOiAtIDEg
fSwKKwkJCQlvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfQorCQkJfSwKKworCQkJdmVydGV4U2hhZGVy
OiBTaGFkZXJDaHVuay5jdWJlX3ZlcnQsCisJCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsu
Y3ViZV9mcmFnCisKKwkJfSwKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vCUN1YmUgbWFw
IHNoYWRlcgorCQkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJCWVxdWlyZWN0OiB7CisKKwkJCXVu
aWZvcm1zOiB7CisJCQkJdEVxdWlyZWN0OiB7IHZhbHVlOiBudWxsIH0sCisJCQkJdEZsaXA6IHsg
dmFsdWU6IC0gMSB9CisJCQl9LAorCisJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmVxdWly
ZWN0X3ZlcnQsCisJCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfZnJhZwor
CisJCX0sCisKKwkJZGlzdGFuY2VSR0JBOiB7CisKKwkJCXVuaWZvcm1zOiB7CisJCQkJbGlnaHRQ
b3M6IHsgdmFsdWU6IG5ldyBWZWN0b3IzKCkgfQorCQkJfSwKKworCQkJdmVydGV4U2hhZGVyOiBT
aGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfdmVydCwKKwkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJD
aHVuay5kaXN0YW5jZVJHQkFfZnJhZworCisJCX0KKworCX07CisKKwlTaGFkZXJMaWIucGh5c2lj
YWwgPSB7CisKKwkJdW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFsKKwkJCVNoYWRlckxp
Yi5zdGFuZGFyZC51bmlmb3JtcywKKwkJCXsKKwkJCQljbGVhckNvYXQ6IHsgdmFsdWU6IDAgfSwK
KwkJCQljbGVhckNvYXRSb3VnaG5lc3M6IHsgdmFsdWU6IDAgfQorCQkJfQorCQldICksCisKKwkJ
dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCwKKwkJZnJhZ21lbnRT
aGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnCisKKwl9OworCisJLyoqCisJICog
QGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworCSAqLworCisJZnVuY3Rpb24gQm94
MiggbWluLCBtYXggKSB7CisKKwkJdGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZpbmVkICkgPyBt
aW4gOiBuZXcgVmVjdG9yMiggKyBJbmZpbml0eSwgKyBJbmZpbml0eSApOworCQl0aGlzLm1heCA9
ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3IyKCAtIEluZmluaXR5LCAt
IEluZmluaXR5ICk7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBCb3gyLnByb3RvdHlwZSwgewor
CisJCXNldDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHsKKworCQkJdGhpcy5taW4uY29weSggbWlu
ICk7CisJCQl0aGlzLm1heC5jb3B5KCBtYXggKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQlzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHsKKworCQkJdGhpcy5tYWtl
RW1wdHkoKTsKKworCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBp
bDsgaSArKyApIHsKKworCQkJCXRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTsKKwor
CQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldEZyb21DZW50ZXJBbmRTaXpl
OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3IyKCk7CisKKwkJCXJldHVy
biBmdW5jdGlvbiBzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBzaXplICkgeworCisJCQkJ
dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTsKKwkJ
CQl0aGlzLm1pbi5jb3B5KCBjZW50ZXIgKS5zdWIoIGhhbGZTaXplICk7CisJCQkJdGhpcy5tYXgu
Y29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApOworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJ
CX07CisKKwkJfSgpLAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBuZXcg
dGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKworCQl9LAorCisJCWNvcHk6IGZ1bmN0
aW9uICggYm94ICkgeworCisJCQl0aGlzLm1pbi5jb3B5KCBib3gubWluICk7CisJCQl0aGlzLm1h
eC5jb3B5KCBib3gubWF4ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbWFrZUVt
cHR5OiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gKyBJbmZp
bml0eTsKKwkJCXRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gLSBJbmZpbml0eTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQlpc0VtcHR5OiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIHRo
aXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkg
YmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzCisK
KwkJCXJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwg
dGhpcy5taW4ueSApOworCisJCX0sCisKKwkJZ2V0Q2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFs
VGFyZ2V0ICkgeworCisJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3Rv
cjIoKTsKKwkJCXJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHJlc3VsdC5zZXQoIDAsIDAgKSA6IHJl
c3VsdC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41
ICk7CisKKwkJfSwKKworCQlnZXRTaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgewor
CisJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTsKKwkJCXJl
dHVybiB0aGlzLmlzRW1wdHkoKSA/IHJlc3VsdC5zZXQoIDAsIDAgKSA6IHJlc3VsdC5zdWJWZWN0
b3JzKCB0aGlzLm1heCwgdGhpcy5taW4gKTsKKworCQl9LAorCisJCWV4cGFuZEJ5UG9pbnQ6IGZ1
bmN0aW9uICggcG9pbnQgKSB7CisKKwkJCXRoaXMubWluLm1pbiggcG9pbnQgKTsKKwkJCXRoaXMu
bWF4Lm1heCggcG9pbnQgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlleHBhbmRC
eVZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7CisKKwkJCXRoaXMubWluLnN1YiggdmVjdG9y
ICk7CisJCQl0aGlzLm1heC5hZGQoIHZlY3RvciApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9
LAorCisJCWV4cGFuZEJ5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHsKKworCQkJdGhpcy5t
aW4uYWRkU2NhbGFyKCAtIHNjYWxhciApOworCQkJdGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIg
KTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljb250YWluc1BvaW50OiBmdW5jdGlv
biAoIHBvaW50ICkgeworCisJCQlyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQu
eCA+IHRoaXMubWF4LnggfHwKKwkJCQlwb2ludC55IDwgdGhpcy5taW4ueSB8fCBwb2ludC55ID4g
dGhpcy5tYXgueSA/IGZhbHNlIDogdHJ1ZTsKKworCQl9LAorCisJCWNvbnRhaW5zQm94OiBmdW5j
dGlvbiAoIGJveCApIHsKKworCQkJcmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJv
eC5tYXgueCA8PSB0aGlzLm1heC54ICYmCisJCQkJdGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYg
Ym94Lm1heC55IDw9IHRoaXMubWF4Lnk7CisKKwkJfSwKKworCQlnZXRQYXJhbWV0ZXI6IGZ1bmN0
aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQkvLyBUaGlzIGNhbiBwb3RlbnRp
YWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveAorCQkJLy8gaGFzIGEgc2l6ZSBk
aW1lbnNpb24gb2YgMC4KKworCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBW
ZWN0b3IyKCk7CisKKwkJCXJldHVybiByZXN1bHQuc2V0KAorCQkJCSggcG9pbnQueCAtIHRoaXMu
bWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSwKKwkJCQkoIHBvaW50LnkgLSB0
aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55ICkKKwkJCSk7CisKKwkJfSwK
KworCQlpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHsKKworCQkJLy8gdXNpbmcgNCBz
cGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnMKKworCQkJcmV0dXJuIGJv
eC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fAorCQkJCWJv
eC5tYXgueSA8IHRoaXMubWluLnkgfHwgYm94Lm1pbi55ID4gdGhpcy5tYXgueSA/IGZhbHNlIDog
dHJ1ZTsKKworCQl9LAorCisJCWNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFs
VGFyZ2V0ICkgeworCisJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3Rv
cjIoKTsKKwkJCXJldHVybiByZXN1bHQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRo
aXMubWF4ICk7CisKKwkJfSwKKworCQlkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHsKKwor
CQkJdmFyIHYxID0gbmV3IFZlY3RvcjIoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNl
VG9Qb2ludCggcG9pbnQgKSB7CisKKwkJCQl2YXIgY2xhbXBlZFBvaW50ID0gdjEuY29weSggcG9p
bnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7CisJCQkJcmV0dXJuIGNsYW1wZWRQb2lu
dC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWludGVyc2Vj
dDogZnVuY3Rpb24gKCBib3ggKSB7CisKKwkJCXRoaXMubWluLm1heCggYm94Lm1pbiApOworCQkJ
dGhpcy5tYXgubWluKCBib3gubWF4ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJ
dW5pb246IGZ1bmN0aW9uICggYm94ICkgeworCisJCQl0aGlzLm1pbi5taW4oIGJveC5taW4gKTsK
KwkJCXRoaXMubWF4Lm1heCggYm94Lm1heCApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAor
CisJCXRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7CisKKwkJCXRoaXMubWluLmFkZCgg
b2Zmc2V0ICk7CisJCQl0aGlzLm1heC5hZGQoIG9mZnNldCApOworCisJCQlyZXR1cm4gdGhpczsK
KworCQl9LAorCisJCWVxdWFsczogZnVuY3Rpb24gKCBib3ggKSB7CisKKwkJCXJldHVybiBib3gu
bWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTsKKwor
CQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6
Ly9nb21vLnNlLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5j
b20vCisJICovCisKKwlmdW5jdGlvbiBMZW5zRmxhcmVQbHVnaW4oIHJlbmRlcmVyLCBmbGFyZXMg
KSB7CisKKwkJdmFyIGdsID0gcmVuZGVyZXIuY29udGV4dDsKKwkJdmFyIHN0YXRlID0gcmVuZGVy
ZXIuc3RhdGU7CisKKwkJdmFyIHZlcnRleEJ1ZmZlciwgZWxlbWVudEJ1ZmZlcjsKKwkJdmFyIHNo
YWRlciwgcHJvZ3JhbSwgYXR0cmlidXRlcywgdW5pZm9ybXM7CisKKwkJdmFyIHRlbXBUZXh0dXJl
LCBvY2NsdXNpb25UZXh0dXJlOworCisJCWZ1bmN0aW9uIGluaXQoKSB7CisKKwkJCXZhciB2ZXJ0
aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIFsKKwkJCQktIDEsIC0gMSwgIDAsIDAsCisJCQkJIDEs
IC0gMSwgIDEsIDAsCisJCQkJIDEsICAxLCAgMSwgMSwKKwkJCQktIDEsICAxLCAgMCwgMQorCQkJ
XSApOworCisJCQl2YXIgZmFjZXMgPSBuZXcgVWludDE2QXJyYXkoIFsKKwkJCQkwLCAxLCAyLAor
CQkJCTAsIDIsIDMKKwkJCV0gKTsKKworCQkJLy8gYnVmZmVycworCisJCQl2ZXJ0ZXhCdWZmZXIg
ICAgID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisJCQllbGVtZW50QnVmZmVyICAgID0gZ2wuY3JlYXRl
QnVmZmVyKCk7CisKKwkJCWdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVm
ZmVyICk7CisJCQlnbC5idWZmZXJEYXRhKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRpY2VzLCBnbC5T
VEFUSUNfRFJBVyApOworCisJCQlnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZF
UiwgZWxlbWVudEJ1ZmZlciApOworCQkJZ2wuYnVmZmVyRGF0YSggZ2wuRUxFTUVOVF9BUlJBWV9C
VUZGRVIsIGZhY2VzLCBnbC5TVEFUSUNfRFJBVyApOworCisJCQkvLyB0ZXh0dXJlcworCisJCQl0
ZW1wVGV4dHVyZSAgICAgID0gZ2wuY3JlYXRlVGV4dHVyZSgpOworCQkJb2NjbHVzaW9uVGV4dHVy
ZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKKworCQkJc3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRV
UkVfMkQsIHRlbXBUZXh0dXJlICk7CisJCQlnbC50ZXhJbWFnZTJEKCBnbC5URVhUVVJFXzJELCAw
LCBnbC5SR0IsIDE2LCAxNiwgMCwgZ2wuUkdCLCBnbC5VTlNJR05FRF9CWVRFLCBudWxsICk7CisJ
CQlnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wu
Q0xBTVBfVE9fRURHRSApOworCQkJZ2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wu
VEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UgKTsKKwkJCWdsLnRleFBhcmFtZXRlcmko
IGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApOworCQkJ
Z2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBn
bC5ORUFSRVNUICk7CisKKwkJCXN0YXRlLmJpbmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBvY2Ns
dXNpb25UZXh0dXJlICk7CisJCQlnbC50ZXhJbWFnZTJEKCBnbC5URVhUVVJFXzJELCAwLCBnbC5S
R0JBLCAxNiwgMTYsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIG51bGwgKTsKKwkJCWds
LnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFN
UF9UT19FREdFICk7CisJCQlnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhU
VVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSApOworCQkJZ2wudGV4UGFyYW1ldGVyaSggZ2wu
VEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUICk7CisJCQlnbC50
ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5F
QVJFU1QgKTsKKworCQkJc2hhZGVyID0geworCisJCQkJdmVydGV4U2hhZGVyOiBbCisKKwkJCQkJ
InVuaWZvcm0gbG93cCBpbnQgcmVuZGVyVHlwZTsiLAorCisJCQkJCSJ1bmlmb3JtIHZlYzMgc2Ny
ZWVuUG9zaXRpb247IiwKKwkJCQkJInVuaWZvcm0gdmVjMiBzY2FsZTsiLAorCQkJCQkidW5pZm9y
bSBmbG9hdCByb3RhdGlvbjsiLAorCisJCQkJCSJ1bmlmb3JtIHNhbXBsZXIyRCBvY2NsdXNpb25N
YXA7IiwKKworCQkJCQkiYXR0cmlidXRlIHZlYzIgcG9zaXRpb247IiwKKwkJCQkJImF0dHJpYnV0
ZSB2ZWMyIHV2OyIsCisKKwkJCQkJInZhcnlpbmcgdmVjMiB2VVY7IiwKKwkJCQkJInZhcnlpbmcg
ZmxvYXQgdlZpc2liaWxpdHk7IiwKKworCQkJCQkidm9pZCBtYWluKCkgeyIsCisKKwkJCQkJCSJ2
VVYgPSB1djsiLAorCisJCQkJCQkidmVjMiBwb3MgPSBwb3NpdGlvbjsiLAorCisJCQkJCQkiaWYg
KCByZW5kZXJUeXBlID09IDIgKSB7IiwKKworCQkJCQkJCSJ2ZWM0IHZpc2liaWxpdHkgPSB0ZXh0
dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC4xLCAwLjEgKSApOyIsCisJCQkJCQkJInZpc2li
aWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuNSwgMC4xICkgKTsiLAor
CQkJCQkJCSJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjks
IDAuMSApICk7IiwKKwkJCQkJCQkidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1h
cCwgdmVjMiggMC45LCAwLjUgKSApOyIsCisJCQkJCQkJInZpc2liaWxpdHkgKz0gdGV4dHVyZTJE
KCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuOSwgMC45ICkgKTsiLAorCQkJCQkJCSJ2aXNpYmlsaXR5
ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjUsIDAuOSApICk7IiwKKwkJCQkJ
CQkidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC4xLCAwLjkg
KSApOyIsCisJCQkJCQkJInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZl
YzIoIDAuMSwgMC41ICkgKTsiLAorCQkJCQkJCSJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2Nj
bHVzaW9uTWFwLCB2ZWMyKCAwLjUsIDAuNSApICk7IiwKKworCQkJCQkJCSJ2VmlzaWJpbGl0eSA9
ICAgICAgICB2aXNpYmlsaXR5LnIgLyA5LjA7IiwKKwkJCQkJCQkidlZpc2liaWxpdHkgKj0gMS4w
IC0gdmlzaWJpbGl0eS5nIC8gOS4wOyIsCisJCQkJCQkJInZWaXNpYmlsaXR5ICo9ICAgICAgIHZp
c2liaWxpdHkuYiAvIDkuMDsiLAorCQkJCQkJCSJ2VmlzaWJpbGl0eSAqPSAxLjAgLSB2aXNpYmls
aXR5LmEgLyA5LjA7IiwKKworCQkJCQkJCSJwb3MueCA9IGNvcyggcm90YXRpb24gKSAqIHBvc2l0
aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBwb3NpdGlvbi55OyIsCisJCQkJCQkJInBvcy55ID0g
c2luKCByb3RhdGlvbiApICogcG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIHBvc2l0aW9u
Lnk7IiwKKworCQkJCQkJIn0iLAorCisJCQkJCQkiZ2xfUG9zaXRpb24gPSB2ZWM0KCAoIHBvcyAq
IHNjYWxlICsgc2NyZWVuUG9zaXRpb24ueHkgKS54eSwgc2NyZWVuUG9zaXRpb24ueiwgMS4wICk7
IiwKKworCQkJCQkifSIKKworCQkJCV0uam9pbiggIlxuIiApLAorCisJCQkJZnJhZ21lbnRTaGFk
ZXI6IFsKKworCQkJCQkidW5pZm9ybSBsb3dwIGludCByZW5kZXJUeXBlOyIsCisKKwkJCQkJInVu
aWZvcm0gc2FtcGxlcjJEIG1hcDsiLAorCQkJCQkidW5pZm9ybSBmbG9hdCBvcGFjaXR5OyIsCisJ
CQkJCSJ1bmlmb3JtIHZlYzMgY29sb3I7IiwKKworCQkJCQkidmFyeWluZyB2ZWMyIHZVVjsiLAor
CQkJCQkidmFyeWluZyBmbG9hdCB2VmlzaWJpbGl0eTsiLAorCisJCQkJCSJ2b2lkIG1haW4oKSB7
IiwKKworCQkJCQkJLy8gcGluayBzcXVhcmUKKworCQkJCQkJImlmICggcmVuZGVyVHlwZSA9PSAw
ICkgeyIsCisKKwkJCQkJCQkiZ2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDEuMCwgMC4w
ICk7IiwKKworCQkJCQkJLy8gcmVzdG9yZQorCisJCQkJCQkifSBlbHNlIGlmICggcmVuZGVyVHlw
ZSA9PSAxICkgeyIsCisKKwkJCQkJCQkiZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZV
ViApOyIsCisKKwkJCQkJCS8vIGZsYXJlCisKKwkJCQkJCSJ9IGVsc2UgeyIsCisKKwkJCQkJCQki
dmVjNCB0ZXh0dXJlID0gdGV4dHVyZTJEKCBtYXAsIHZVViApOyIsCisJCQkJCQkJInRleHR1cmUu
YSAqPSBvcGFjaXR5ICogdlZpc2liaWxpdHk7IiwKKwkJCQkJCQkiZ2xfRnJhZ0NvbG9yID0gdGV4
dHVyZTsiLAorCQkJCQkJCSJnbF9GcmFnQ29sb3IucmdiICo9IGNvbG9yOyIsCisKKwkJCQkJCSJ9
IiwKKworCQkJCQkifSIKKworCQkJCV0uam9pbiggIlxuIiApCisKKwkJCX07CisKKwkJCXByb2dy
YW0gPSBjcmVhdGVQcm9ncmFtKCBzaGFkZXIgKTsKKworCQkJYXR0cmlidXRlcyA9IHsKKwkJCQl2
ZXJ0ZXg6IGdsLmdldEF0dHJpYkxvY2F0aW9uICggcHJvZ3JhbSwgInBvc2l0aW9uIiApLAorCQkJ
CXV2OiAgICAgZ2wuZ2V0QXR0cmliTG9jYXRpb24gKCBwcm9ncmFtLCAidXYiICkKKwkJCX07CisK
KwkJCXVuaWZvcm1zID0geworCQkJCXJlbmRlclR5cGU6ICAgICBnbC5nZXRVbmlmb3JtTG9jYXRp
b24oIHByb2dyYW0sICJyZW5kZXJUeXBlIiApLAorCQkJCW1hcDogICAgICAgICAgICBnbC5nZXRV
bmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICJtYXAiICksCisJCQkJb2NjbHVzaW9uTWFwOiAgIGds
LmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgIm9jY2x1c2lvbk1hcCIgKSwKKwkJCQlvcGFj
aXR5OiAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAib3BhY2l0eSIgKSwK
KwkJCQljb2xvcjogICAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAiY29s
b3IiICksCisJCQkJc2NhbGU6ICAgICAgICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3Jh
bSwgInNjYWxlIiApLAorCQkJCXJvdGF0aW9uOiAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24o
IHByb2dyYW0sICJyb3RhdGlvbiIgKSwKKwkJCQlzY3JlZW5Qb3NpdGlvbjogZ2wuZ2V0VW5pZm9y
bUxvY2F0aW9uKCBwcm9ncmFtLCAic2NyZWVuUG9zaXRpb24iICkKKwkJCX07CisKKwkJfQorCisJ
CS8qCisJCSAqIFJlbmRlciBsZW5zIGZsYXJlcworCQkgKiBNZXRob2Q6IHJlbmRlcnMgMTZ4MTYg
MHhmZjAwZmYtY29sb3JlZCBwb2ludHMgc2NhdHRlcmVkIG92ZXIgdGhlIGxpZ2h0IHNvdXJjZSBh
cmVhLAorCQkgKiAgICAgICAgIHJlYWRzIHRoZXNlIGJhY2sgYW5kIGNhbGN1bGF0ZXMgb2NjbHVz
aW9uLgorCQkgKi8KKworCQl0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSwg
dmlld3BvcnQgKSB7CisKKwkJCWlmICggZmxhcmVzLmxlbmd0aCA9PT0gMCApIHJldHVybjsKKwor
CQkJdmFyIHRlbXBQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXZhciBpbnZBc3BlY3Qg
PSB2aWV3cG9ydC53IC8gdmlld3BvcnQueiwKKwkJCQloYWxmVmlld3BvcnRXaWR0aCA9IHZpZXdw
b3J0LnogKiAwLjUsCisJCQkJaGFsZlZpZXdwb3J0SGVpZ2h0ID0gdmlld3BvcnQudyAqIDAuNTsK
KworCQkJdmFyIHNpemUgPSAxNiAvIHZpZXdwb3J0LncsCisJCQkJc2NhbGUgPSBuZXcgVmVjdG9y
Miggc2l6ZSAqIGludkFzcGVjdCwgc2l6ZSApOworCisJCQl2YXIgc2NyZWVuUG9zaXRpb24gPSBu
ZXcgVmVjdG9yMyggMSwgMSwgMCApLAorCQkJCXNjcmVlblBvc2l0aW9uUGl4ZWxzID0gbmV3IFZl
Y3RvcjIoIDEsIDEgKTsKKworCQkJdmFyIHZhbGlkQXJlYSA9IG5ldyBCb3gyKCk7CisKKwkJCXZh
bGlkQXJlYS5taW4uc2V0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55ICk7CisJCQl2YWxpZEFyZWEu
bWF4LnNldCggdmlld3BvcnQueCArICggdmlld3BvcnQueiAtIDE2ICksIHZpZXdwb3J0LnkgKyAo
IHZpZXdwb3J0LncgLSAxNiApICk7CisKKwkJCWlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkg
eworCisJCQkJaW5pdCgpOworCisJCQl9CisKKwkJCWdsLnVzZVByb2dyYW0oIHByb2dyYW0gKTsK
KworCQkJc3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTsKKwkJCXN0YXRlLmVuYWJsZUF0dHJpYnV0ZSgg
YXR0cmlidXRlcy52ZXJ0ZXggKTsKKwkJCXN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggYXR0cmlidXRl
cy51diApOworCQkJc3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTsKKworCQkJLy8gbG9v
cCB0aHJvdWdoIGFsbCBsZW5zIGZsYXJlcyB0byB1cGRhdGUgdGhlaXIgb2NjbHVzaW9uIGFuZCBw
b3NpdGlvbnMKKwkJCS8vIHNldHVwIGdsIGFuZCBjb21tb24gdXNlZCBhdHRyaWJzL3VuaWZvcm1z
CisKKwkJCWdsLnVuaWZvcm0xaSggdW5pZm9ybXMub2NjbHVzaW9uTWFwLCAwICk7CisJCQlnbC51
bmlmb3JtMWkoIHVuaWZvcm1zLm1hcCwgMSApOworCisJCQlnbC5iaW5kQnVmZmVyKCBnbC5BUlJB
WV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApOworCQkJZ2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0
cmlidXRlcy52ZXJ0ZXgsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDAgKTsKKwkJCWdsLnZl
cnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMudXYsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAq
IDgsIDggKTsKKworCQkJZ2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVs
ZW1lbnRCdWZmZXIgKTsKKworCQkJc3RhdGUuZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7CisJCQlz
dGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIGZhbHNlICk7CisKKwkJCWZvciAoIHZhciBpID0g
MCwgbCA9IGZsYXJlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJc2l6ZSA9IDE2IC8g
dmlld3BvcnQudzsKKwkJCQlzY2FsZS5zZXQoIHNpemUgKiBpbnZBc3BlY3QsIHNpemUgKTsKKwor
CQkJCS8vIGNhbGMgb2JqZWN0IHNjcmVlbiBwb3NpdGlvbgorCisJCQkJdmFyIGZsYXJlID0gZmxh
cmVzWyBpIF07CisKKwkJCQl0ZW1wUG9zaXRpb24uc2V0KCBmbGFyZS5tYXRyaXhXb3JsZC5lbGVt
ZW50c1sgMTIgXSwgZmxhcmUubWF0cml4V29ybGQuZWxlbWVudHNbIDEzIF0sIGZsYXJlLm1hdHJp
eFdvcmxkLmVsZW1lbnRzWyAxNCBdICk7CisKKwkJCQl0ZW1wUG9zaXRpb24uYXBwbHlNYXRyaXg0
KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7CisJCQkJdGVtcFBvc2l0aW9uLmFwcGx5TWF0
cml4NCggY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTsKKworCQkJCS8vIHNldHVwIGFycmF5cyBm
b3IgZ2wgcHJvZ3JhbXMKKworCQkJCXNjcmVlblBvc2l0aW9uLmNvcHkoIHRlbXBQb3NpdGlvbiAp
OworCisJCQkJLy8gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgY29vcmRpbmF0ZSBvZiB0aGUgbG93
ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHBpeGVscyB0byBjb3B5CisKKwkJCQlzY3JlZW5Qb3NpdGlv
blBpeGVscy54ID0gdmlld3BvcnQueCArICggc2NyZWVuUG9zaXRpb24ueCAqIGhhbGZWaWV3cG9y
dFdpZHRoICkgKyBoYWxmVmlld3BvcnRXaWR0aCAtIDg7CisJCQkJc2NyZWVuUG9zaXRpb25QaXhl
bHMueSA9IHZpZXdwb3J0LnkgKyAoIHNjcmVlblBvc2l0aW9uLnkgKiBoYWxmVmlld3BvcnRIZWln
aHQgKSArIGhhbGZWaWV3cG9ydEhlaWdodCAtIDg7CisKKwkJCQkvLyBzY3JlZW4gY3VsbAorCisJ
CQkJaWYgKCB2YWxpZEFyZWEuY29udGFpbnNQb2ludCggc2NyZWVuUG9zaXRpb25QaXhlbHMgKSA9
PT0gdHJ1ZSApIHsKKworCQkJCQkvLyBzYXZlIGN1cnJlbnQgUkdCIHRvIHRlbXAgdGV4dHVyZQor
CisJCQkJCXN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7CisJCQkJCXN0YXRlLmJp
bmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBudWxsICk7CisJCQkJCXN0YXRlLmFjdGl2ZVRleHR1
cmUoIGdsLlRFWFRVUkUxICk7CisJCQkJCXN0YXRlLmJpbmRUZXh0dXJlKCBnbC5URVhUVVJFXzJE
LCB0ZW1wVGV4dHVyZSApOworCQkJCQlnbC5jb3B5VGV4SW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwg
MCwgZ2wuUkdCLCBzY3JlZW5Qb3NpdGlvblBpeGVscy54LCBzY3JlZW5Qb3NpdGlvblBpeGVscy55
LCAxNiwgMTYsIDAgKTsKKworCisJCQkJCS8vIHJlbmRlciBwaW5rIHF1YWQKKworCQkJCQlnbC51
bmlmb3JtMWkoIHVuaWZvcm1zLnJlbmRlclR5cGUsIDAgKTsKKwkJCQkJZ2wudW5pZm9ybTJmKCB1
bmlmb3Jtcy5zY2FsZSwgc2NhbGUueCwgc2NhbGUueSApOworCQkJCQlnbC51bmlmb3JtM2YoIHVu
aWZvcm1zLnNjcmVlblBvc2l0aW9uLCBzY3JlZW5Qb3NpdGlvbi54LCBzY3JlZW5Qb3NpdGlvbi55
LCBzY3JlZW5Qb3NpdGlvbi56ICk7CisKKwkJCQkJc3RhdGUuZGlzYWJsZSggZ2wuQkxFTkQgKTsK
KwkJCQkJc3RhdGUuZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7CisKKwkJCQkJZ2wuZHJhd0VsZW1l
bnRzKCBnbC5UUklBTkdMRVMsIDYsIGdsLlVOU0lHTkVEX1NIT1JULCAwICk7CisKKworCQkJCQkv
LyBjb3B5IHJlc3VsdCB0byBvY2NsdXNpb25NYXAKKworCQkJCQlzdGF0ZS5hY3RpdmVUZXh0dXJl
KCBnbC5URVhUVVJFMCApOworCQkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwg
b2NjbHVzaW9uVGV4dHVyZSApOworCQkJCQlnbC5jb3B5VGV4SW1hZ2UyRCggZ2wuVEVYVFVSRV8y
RCwgMCwgZ2wuUkdCQSwgc2NyZWVuUG9zaXRpb25QaXhlbHMueCwgc2NyZWVuUG9zaXRpb25QaXhl
bHMueSwgMTYsIDE2LCAwICk7CisKKworCQkJCQkvLyByZXN0b3JlIGdyYXBoaWNzCisKKwkJCQkJ
Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5yZW5kZXJUeXBlLCAxICk7CisJCQkJCXN0YXRlLmRpc2Fi
bGUoIGdsLkRFUFRIX1RFU1QgKTsKKworCQkJCQlzdGF0ZS5hY3RpdmVUZXh0dXJlKCBnbC5URVhU
VVJFMSApOworCQkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgdGVtcFRleHR1
cmUgKTsKKwkJCQkJZ2wuZHJhd0VsZW1lbnRzKCBnbC5UUklBTkdMRVMsIDYsIGdsLlVOU0lHTkVE
X1NIT1JULCAwICk7CisKKworCQkJCQkvLyB1cGRhdGUgb2JqZWN0IHBvc2l0aW9ucworCisJCQkJ
CWZsYXJlLnBvc2l0aW9uU2NyZWVuLmNvcHkoIHNjcmVlblBvc2l0aW9uICk7CisKKwkJCQkJaWYg
KCBmbGFyZS5jdXN0b21VcGRhdGVDYWxsYmFjayApIHsKKworCQkJCQkJZmxhcmUuY3VzdG9tVXBk
YXRlQ2FsbGJhY2soIGZsYXJlICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJZmxhcmUudXBk
YXRlTGVuc0ZsYXJlcygpOworCisJCQkJCX0KKworCQkJCQkvLyByZW5kZXIgZmxhcmVzCisKKwkJ
CQkJZ2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5yZW5kZXJUeXBlLCAyICk7CisJCQkJCXN0YXRlLmVu
YWJsZSggZ2wuQkxFTkQgKTsKKworCQkJCQlmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmxhcmUubGVu
c0ZsYXJlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKKworCQkJCQkJdmFyIHNwcml0ZSA9IGZs
YXJlLmxlbnNGbGFyZXNbIGogXTsKKworCQkJCQkJaWYgKCBzcHJpdGUub3BhY2l0eSA+IDAuMDAx
ICYmIHNwcml0ZS5zY2FsZSA+IDAuMDAxICkgeworCisJCQkJCQkJc2NyZWVuUG9zaXRpb24ueCA9
IHNwcml0ZS54OworCQkJCQkJCXNjcmVlblBvc2l0aW9uLnkgPSBzcHJpdGUueTsKKwkJCQkJCQlz
Y3JlZW5Qb3NpdGlvbi56ID0gc3ByaXRlLno7CisKKwkJCQkJCQlzaXplID0gc3ByaXRlLnNpemUg
KiBzcHJpdGUuc2NhbGUgLyB2aWV3cG9ydC53OworCisJCQkJCQkJc2NhbGUueCA9IHNpemUgKiBp
bnZBc3BlY3Q7CisJCQkJCQkJc2NhbGUueSA9IHNpemU7CisKKwkJCQkJCQlnbC51bmlmb3JtM2Yo
IHVuaWZvcm1zLnNjcmVlblBvc2l0aW9uLCBzY3JlZW5Qb3NpdGlvbi54LCBzY3JlZW5Qb3NpdGlv
bi55LCBzY3JlZW5Qb3NpdGlvbi56ICk7CisJCQkJCQkJZ2wudW5pZm9ybTJmKCB1bmlmb3Jtcy5z
Y2FsZSwgc2NhbGUueCwgc2NhbGUueSApOworCQkJCQkJCWdsLnVuaWZvcm0xZiggdW5pZm9ybXMu
cm90YXRpb24sIHNwcml0ZS5yb3RhdGlvbiApOworCisJCQkJCQkJZ2wudW5pZm9ybTFmKCB1bmlm
b3Jtcy5vcGFjaXR5LCBzcHJpdGUub3BhY2l0eSApOworCQkJCQkJCWdsLnVuaWZvcm0zZiggdW5p
Zm9ybXMuY29sb3IsIHNwcml0ZS5jb2xvci5yLCBzcHJpdGUuY29sb3IuZywgc3ByaXRlLmNvbG9y
LmIgKTsKKworCQkJCQkJCXN0YXRlLnNldEJsZW5kaW5nKCBzcHJpdGUuYmxlbmRpbmcsIHNwcml0
ZS5ibGVuZEVxdWF0aW9uLCBzcHJpdGUuYmxlbmRTcmMsIHNwcml0ZS5ibGVuZERzdCApOworCQkJ
CQkJCXJlbmRlcmVyLnNldFRleHR1cmUyRCggc3ByaXRlLnRleHR1cmUsIDEgKTsKKworCQkJCQkJ
CWdsLmRyYXdFbGVtZW50cyggZ2wuVFJJQU5HTEVTLCA2LCBnbC5VTlNJR05FRF9TSE9SVCwgMCAp
OworCisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJCS8vIHJlc3RvcmUg
Z2wKKworCQkJc3RhdGUuZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTsKKwkJCXN0YXRlLmVuYWJsZSgg
Z2wuREVQVEhfVEVTVCApOworCQkJc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCB0cnVlICk7
CisKKwkJCXJlbmRlcmVyLnJlc2V0R0xTdGF0ZSgpOworCisJCX07CisKKwkJZnVuY3Rpb24gY3Jl
YXRlUHJvZ3JhbSggc2hhZGVyICkgeworCisJCQl2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dy
YW0oKTsKKworCQkJdmFyIGZyYWdtZW50U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCBnbC5GUkFH
TUVOVF9TSEFERVIgKTsKKwkJCXZhciB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIGds
LlZFUlRFWF9TSEFERVIgKTsKKworCQkJdmFyIHByZWZpeCA9ICJwcmVjaXNpb24gIiArIHJlbmRl
cmVyLmdldFByZWNpc2lvbigpICsgIiBmbG9hdDtcbiI7CisKKwkJCWdsLnNoYWRlclNvdXJjZSgg
ZnJhZ21lbnRTaGFkZXIsIHByZWZpeCArIHNoYWRlci5mcmFnbWVudFNoYWRlciApOworCQkJZ2wu
c2hhZGVyU291cmNlKCB2ZXJ0ZXhTaGFkZXIsIHByZWZpeCArIHNoYWRlci52ZXJ0ZXhTaGFkZXIg
KTsKKworCQkJZ2wuY29tcGlsZVNoYWRlciggZnJhZ21lbnRTaGFkZXIgKTsKKwkJCWdsLmNvbXBp
bGVTaGFkZXIoIHZlcnRleFNoYWRlciApOworCisJCQlnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0s
IGZyYWdtZW50U2hhZGVyICk7CisJCQlnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIHZlcnRleFNo
YWRlciApOworCisJCQlnbC5saW5rUHJvZ3JhbSggcHJvZ3JhbSApOworCisJCQlyZXR1cm4gcHJv
Z3JhbTsKKworCQl9CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAv
IGh0dHA6Ly9nb21vLnNlLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1
YWxpYS5jb20vCisJICovCisKKwlmdW5jdGlvbiBTcHJpdGVQbHVnaW4oIHJlbmRlcmVyLCBzcHJp
dGVzICkgeworCisJCXZhciBnbCA9IHJlbmRlcmVyLmNvbnRleHQ7CisJCXZhciBzdGF0ZSA9IHJl
bmRlcmVyLnN0YXRlOworCisJCXZhciB2ZXJ0ZXhCdWZmZXIsIGVsZW1lbnRCdWZmZXI7CisJCXZh
ciBwcm9ncmFtLCBhdHRyaWJ1dGVzLCB1bmlmb3JtczsKKworCQl2YXIgdGV4dHVyZTsKKworCQkv
LyBkZWNvbXBvc2UgbWF0cml4V29ybGQKKworCQl2YXIgc3ByaXRlUG9zaXRpb24gPSBuZXcgVmVj
dG9yMygpOworCQl2YXIgc3ByaXRlUm90YXRpb24gPSBuZXcgUXVhdGVybmlvbigpOworCQl2YXIg
c3ByaXRlU2NhbGUgPSBuZXcgVmVjdG9yMygpOworCisJCWZ1bmN0aW9uIGluaXQoKSB7CisKKwkJ
CXZhciB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIFsKKwkJCQktIDAuNSwgLSAwLjUsICAw
LCAwLAorCQkJCSAgMC41LCAtIDAuNSwgIDEsIDAsCisJCQkJICAwLjUsICAgMC41LCAgMSwgMSwK
KwkJCQktIDAuNSwgICAwLjUsICAwLCAxCisJCQldICk7CisKKwkJCXZhciBmYWNlcyA9IG5ldyBV
aW50MTZBcnJheSggWworCQkJCTAsIDEsIDIsCisJCQkJMCwgMiwgMworCQkJXSApOworCisJCQl2
ZXJ0ZXhCdWZmZXIgID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisJCQllbGVtZW50QnVmZmVyID0gZ2wu
Y3JlYXRlQnVmZmVyKCk7CisKKwkJCWdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVy
dGV4QnVmZmVyICk7CisJCQlnbC5idWZmZXJEYXRhKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRpY2Vz
LCBnbC5TVEFUSUNfRFJBVyApOworCisJCQlnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZ
X0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApOworCQkJZ2wuYnVmZmVyRGF0YSggZ2wuRUxFTUVOVF9B
UlJBWV9CVUZGRVIsIGZhY2VzLCBnbC5TVEFUSUNfRFJBVyApOworCisJCQlwcm9ncmFtID0gY3Jl
YXRlUHJvZ3JhbSgpOworCisJCQlhdHRyaWJ1dGVzID0geworCQkJCXBvc2l0aW9uOgkJCWdsLmdl
dEF0dHJpYkxvY2F0aW9uICggcHJvZ3JhbSwgJ3Bvc2l0aW9uJyApLAorCQkJCXV2OgkJCQkJZ2wu
Z2V0QXR0cmliTG9jYXRpb24gKCBwcm9ncmFtLCAndXYnICkKKwkJCX07CisKKwkJCXVuaWZvcm1z
ID0geworCQkJCXV2T2Zmc2V0OgkJCWdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3V2
T2Zmc2V0JyApLAorCQkJCXV2U2NhbGU6CQkJZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFt
LCAndXZTY2FsZScgKSwKKworCQkJCXJvdGF0aW9uOgkJCWdsLmdldFVuaWZvcm1Mb2NhdGlvbigg
cHJvZ3JhbSwgJ3JvdGF0aW9uJyApLAorCQkJCXNjYWxlOgkJCQlnbC5nZXRVbmlmb3JtTG9jYXRp
b24oIHByb2dyYW0sICdzY2FsZScgKSwKKworCQkJCWNvbG9yOgkJCQlnbC5nZXRVbmlmb3JtTG9j
YXRpb24oIHByb2dyYW0sICdjb2xvcicgKSwKKwkJCQltYXA6CQkJCWdsLmdldFVuaWZvcm1Mb2Nh
dGlvbiggcHJvZ3JhbSwgJ21hcCcgKSwKKwkJCQlvcGFjaXR5OgkJCWdsLmdldFVuaWZvcm1Mb2Nh
dGlvbiggcHJvZ3JhbSwgJ29wYWNpdHknICksCisKKwkJCQltb2RlbFZpZXdNYXRyaXg6IAlnbC5n
ZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdtb2RlbFZpZXdNYXRyaXgnICksCisJCQkJcHJv
amVjdGlvbk1hdHJpeDoJZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAncHJvamVjdGlv
bk1hdHJpeCcgKSwKKworCQkJCWZvZ1R5cGU6CQkJZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9n
cmFtLCAnZm9nVHlwZScgKSwKKwkJCQlmb2dEZW5zaXR5OgkJCWdsLmdldFVuaWZvcm1Mb2NhdGlv
biggcHJvZ3JhbSwgJ2ZvZ0RlbnNpdHknICksCisJCQkJZm9nTmVhcjoJCQlnbC5nZXRVbmlmb3Jt
TG9jYXRpb24oIHByb2dyYW0sICdmb2dOZWFyJyApLAorCQkJCWZvZ0ZhcjoJCQkJZ2wuZ2V0VW5p
Zm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nRmFyJyApLAorCQkJCWZvZ0NvbG9yOgkJCWdsLmdl
dFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0NvbG9yJyApLAorCisJCQkJYWxwaGFUZXN0
OgkJCWdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2FscGhhVGVzdCcgKQorCQkJfTsK
KworCQkJdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cu
dzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApOworCQkJY2FudmFzLndpZHRoID0gODsKKwkJ
CWNhbnZhcy5oZWlnaHQgPSA4OworCisJCQl2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0
KCAnMmQnICk7CisJCQljb250ZXh0LmZpbGxTdHlsZSA9ICd3aGl0ZSc7CisJCQljb250ZXh0LmZp
bGxSZWN0KCAwLCAwLCA4LCA4ICk7CisKKwkJCXRleHR1cmUgPSBuZXcgVGV4dHVyZSggY2FudmFz
ICk7CisJCQl0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQl9CisKKwkJdGhpcy5yZW5k
ZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7CisKKwkJCWlmICggc3ByaXRlcy5sZW5n
dGggPT09IDAgKSByZXR1cm47CisKKwkJCS8vIHNldHVwIGdsCisKKwkJCWlmICggcHJvZ3JhbSA9
PT0gdW5kZWZpbmVkICkgeworCisJCQkJaW5pdCgpOworCisJCQl9CisKKwkJCWdsLnVzZVByb2dy
YW0oIHByb2dyYW0gKTsKKworCQkJc3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTsKKwkJCXN0YXRlLmVu
YWJsZUF0dHJpYnV0ZSggYXR0cmlidXRlcy5wb3NpdGlvbiApOworCQkJc3RhdGUuZW5hYmxlQXR0
cmlidXRlKCBhdHRyaWJ1dGVzLnV2ICk7CisJCQlzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRl
cygpOworCisJCQlzdGF0ZS5kaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKTsKKwkJCXN0YXRlLmVuYWJs
ZSggZ2wuQkxFTkQgKTsKKworCQkJZ2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0
ZXhCdWZmZXIgKTsKKwkJCWdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMucG9zaXRp
b24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDAgKTsKKwkJCWdsLnZlcnRleEF0dHJpYlBv
aW50ZXIoIGF0dHJpYnV0ZXMudXYsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDggKTsKKwor
CQkJZ2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIg
KTsKKworCQkJZ2wudW5pZm9ybU1hdHJpeDRmdiggdW5pZm9ybXMucHJvamVjdGlvbk1hdHJpeCwg
ZmFsc2UsIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzICk7CisKKwkJCXN0YXRlLmFj
dGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7CisJCQlnbC51bmlmb3JtMWkoIHVuaWZvcm1zLm1h
cCwgMCApOworCisJCQl2YXIgb2xkRm9nVHlwZSA9IDA7CisJCQl2YXIgc2NlbmVGb2dUeXBlID0g
MDsKKwkJCXZhciBmb2cgPSBzY2VuZS5mb2c7CisKKwkJCWlmICggZm9nICkgeworCisJCQkJZ2wu
dW5pZm9ybTNmKCB1bmlmb3Jtcy5mb2dDb2xvciwgZm9nLmNvbG9yLnIsIGZvZy5jb2xvci5nLCBm
b2cuY29sb3IuYiApOworCisJCQkJaWYgKCBmb2cuaXNGb2cgKSB7CisKKwkJCQkJZ2wudW5pZm9y
bTFmKCB1bmlmb3Jtcy5mb2dOZWFyLCBmb2cubmVhciApOworCQkJCQlnbC51bmlmb3JtMWYoIHVu
aWZvcm1zLmZvZ0ZhciwgZm9nLmZhciApOworCisJCQkJCWdsLnVuaWZvcm0xaSggdW5pZm9ybXMu
Zm9nVHlwZSwgMSApOworCQkJCQlvbGRGb2dUeXBlID0gMTsKKwkJCQkJc2NlbmVGb2dUeXBlID0g
MTsKKworCQkJCX0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7CisKKwkJCQkJZ2wudW5pZm9y
bTFmKCB1bmlmb3Jtcy5mb2dEZW5zaXR5LCBmb2cuZGVuc2l0eSApOworCisJCQkJCWdsLnVuaWZv
cm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMiApOworCQkJCQlvbGRGb2dUeXBlID0gMjsKKwkJCQkJ
c2NlbmVGb2dUeXBlID0gMjsKKworCQkJCX0KKworCQkJfSBlbHNlIHsKKworCQkJCWdsLnVuaWZv
cm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMCApOworCQkJCW9sZEZvZ1R5cGUgPSAwOworCQkJCXNj
ZW5lRm9nVHlwZSA9IDA7CisKKwkJCX0KKworCisJCQkvLyB1cGRhdGUgcG9zaXRpb25zIGFuZCBz
b3J0CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHNwcml0ZXMubGVuZ3RoOyBpIDwgbDsgaSAr
KyApIHsKKworCQkJCXZhciBzcHJpdGUgPSBzcHJpdGVzWyBpIF07CisKKwkJCQlzcHJpdGUubW9k
ZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2Us
IHNwcml0ZS5tYXRyaXhXb3JsZCApOworCQkJCXNwcml0ZS56ID0gLSBzcHJpdGUubW9kZWxWaWV3
TWF0cml4LmVsZW1lbnRzWyAxNCBdOworCisJCQl9CisKKwkJCXNwcml0ZXMuc29ydCggcGFpbnRl
clNvcnRTdGFibGUgKTsKKworCQkJLy8gcmVuZGVyIGFsbCBzcHJpdGVzCisKKwkJCXZhciBzY2Fs
ZSA9IFtdOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBzcHJpdGVzLmxlbmd0aDsgaSA8IGw7
IGkgKysgKSB7CisKKwkJCQl2YXIgc3ByaXRlID0gc3ByaXRlc1sgaSBdOworCQkJCXZhciBtYXRl
cmlhbCA9IHNwcml0ZS5tYXRlcmlhbDsKKworCQkJCWlmICggbWF0ZXJpYWwudmlzaWJsZSA9PT0g
ZmFsc2UgKSBjb250aW51ZTsKKworCQkJCXNwcml0ZS5vbkJlZm9yZVJlbmRlciggcmVuZGVyZXIs
IHNjZW5lLCBjYW1lcmEsIHVuZGVmaW5lZCwgbWF0ZXJpYWwsIHVuZGVmaW5lZCApOworCisJCQkJ
Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5hbHBoYVRlc3QsIG1hdGVyaWFsLmFscGhhVGVzdCApOwor
CQkJCWdsLnVuaWZvcm1NYXRyaXg0ZnYoIHVuaWZvcm1zLm1vZGVsVmlld01hdHJpeCwgZmFsc2Us
IHNwcml0ZS5tb2RlbFZpZXdNYXRyaXguZWxlbWVudHMgKTsKKworCQkJCXNwcml0ZS5tYXRyaXhX
b3JsZC5kZWNvbXBvc2UoIHNwcml0ZVBvc2l0aW9uLCBzcHJpdGVSb3RhdGlvbiwgc3ByaXRlU2Nh
bGUgKTsKKworCQkJCXNjYWxlWyAwIF0gPSBzcHJpdGVTY2FsZS54OworCQkJCXNjYWxlWyAxIF0g
PSBzcHJpdGVTY2FsZS55OworCisJCQkJdmFyIGZvZ1R5cGUgPSAwOworCisJCQkJaWYgKCBzY2Vu
ZS5mb2cgJiYgbWF0ZXJpYWwuZm9nICkgeworCisJCQkJCWZvZ1R5cGUgPSBzY2VuZUZvZ1R5cGU7
CisKKwkJCQl9CisKKwkJCQlpZiAoIG9sZEZvZ1R5cGUgIT09IGZvZ1R5cGUgKSB7CisKKwkJCQkJ
Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCBmb2dUeXBlICk7CisJCQkJCW9sZEZvZ1R5
cGUgPSBmb2dUeXBlOworCisJCQkJfQorCisJCQkJaWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwg
KSB7CisKKwkJCQkJZ2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dk9mZnNldCwgbWF0ZXJpYWwubWFw
Lm9mZnNldC54LCBtYXRlcmlhbC5tYXAub2Zmc2V0LnkgKTsKKwkJCQkJZ2wudW5pZm9ybTJmKCB1
bmlmb3Jtcy51dlNjYWxlLCBtYXRlcmlhbC5tYXAucmVwZWF0LngsIG1hdGVyaWFsLm1hcC5yZXBl
YXQueSApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQlnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2
T2Zmc2V0LCAwLCAwICk7CisJCQkJCWdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZTY2FsZSwgMSwg
MSApOworCisJCQkJfQorCisJCQkJZ2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5vcGFjaXR5LCBtYXRl
cmlhbC5vcGFjaXR5ICk7CisJCQkJZ2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5jb2xvciwgbWF0ZXJp
YWwuY29sb3IuciwgbWF0ZXJpYWwuY29sb3IuZywgbWF0ZXJpYWwuY29sb3IuYiApOworCisJCQkJ
Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5yb3RhdGlvbiwgbWF0ZXJpYWwucm90YXRpb24gKTsKKwkJ
CQlnbC51bmlmb3JtMmZ2KCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUgKTsKKworCQkJCXN0YXRlLnNl
dEJsZW5kaW5nKCBtYXRlcmlhbC5ibGVuZGluZywgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiwgbWF0
ZXJpYWwuYmxlbmRTcmMsIG1hdGVyaWFsLmJsZW5kRHN0LCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9u
QWxwaGEsIG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEsIG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEsIG1h
dGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSApOworCQkJCXN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0
VGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7CisJCQkJc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRN
YXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7CisKKwkJCQlpZiAoIG1hdGVyaWFsLm1hcCApIHsK
KworCQkJCQlyZW5kZXJlci5zZXRUZXh0dXJlMkQoIG1hdGVyaWFsLm1hcCwgMCApOworCisJCQkJ
fSBlbHNlIHsKKworCQkJCQlyZW5kZXJlci5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIDAgKTsKKwor
CQkJCX0KKworCQkJCWdsLmRyYXdFbGVtZW50cyggZ2wuVFJJQU5HTEVTLCA2LCBnbC5VTlNJR05F
RF9TSE9SVCwgMCApOworCisJCQkJc3ByaXRlLm9uQWZ0ZXJSZW5kZXIoIHJlbmRlcmVyLCBzY2Vu
ZSwgY2FtZXJhLCB1bmRlZmluZWQsIG1hdGVyaWFsLCB1bmRlZmluZWQgKTsKKworCQkJfQorCisJ
CQkvLyByZXN0b3JlIGdsCisKKwkJCXN0YXRlLmVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7CisKKwkJ
CXJlbmRlcmVyLnJlc2V0R0xTdGF0ZSgpOworCisJCX07CisKKwkJZnVuY3Rpb24gY3JlYXRlUHJv
Z3JhbSgpIHsKKworCQkJdmFyIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7CisKKwkJCXZh
ciB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIGdsLlZFUlRFWF9TSEFERVIgKTsKKwkJ
CXZhciBmcmFnbWVudFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuRlJBR01FTlRfU0hBREVS
ICk7CisKKwkJCWdsLnNoYWRlclNvdXJjZSggdmVydGV4U2hhZGVyLCBbCisKKwkJCQkncHJlY2lz
aW9uICcgKyByZW5kZXJlci5nZXRQcmVjaXNpb24oKSArICcgZmxvYXQ7JywKKworCQkJCScjZGVm
aW5lIFNIQURFUl9OQU1FICcgKyAnU3ByaXRlTWF0ZXJpYWwnLAorCisJCQkJJ3VuaWZvcm0gbWF0
NCBtb2RlbFZpZXdNYXRyaXg7JywKKwkJCQkndW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7
JywKKwkJCQkndW5pZm9ybSBmbG9hdCByb3RhdGlvbjsnLAorCQkJCSd1bmlmb3JtIHZlYzIgc2Nh
bGU7JywKKwkJCQkndW5pZm9ybSB2ZWMyIHV2T2Zmc2V0OycsCisJCQkJJ3VuaWZvcm0gdmVjMiB1
dlNjYWxlOycsCisKKwkJCQknYXR0cmlidXRlIHZlYzIgcG9zaXRpb247JywKKwkJCQknYXR0cmli
dXRlIHZlYzIgdXY7JywKKworCQkJCSd2YXJ5aW5nIHZlYzIgdlVWOycsCisKKwkJCQkndm9pZCBt
YWluKCkgeycsCisKKwkJCQkJJ3ZVViA9IHV2T2Zmc2V0ICsgdXYgKiB1dlNjYWxlOycsCisKKwkJ
CQkJJ3ZlYzIgYWxpZ25lZFBvc2l0aW9uID0gcG9zaXRpb24gKiBzY2FsZTsnLAorCisJCQkJCSd2
ZWMyIHJvdGF0ZWRQb3NpdGlvbjsnLAorCQkJCQkncm90YXRlZFBvc2l0aW9uLnggPSBjb3MoIHJv
dGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQ
b3NpdGlvbi55OycsCisJCQkJCSdyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAq
IGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7
JywKKworCQkJCQkndmVjNCBmaW5hbFBvc2l0aW9uOycsCisKKwkJCQkJJ2ZpbmFsUG9zaXRpb24g
PSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsnLAorCQkJCQkn
ZmluYWxQb3NpdGlvbi54eSArPSByb3RhdGVkUG9zaXRpb247JywKKwkJCQkJJ2ZpbmFsUG9zaXRp
b24gPSBwcm9qZWN0aW9uTWF0cml4ICogZmluYWxQb3NpdGlvbjsnLAorCisJCQkJCSdnbF9Qb3Np
dGlvbiA9IGZpbmFsUG9zaXRpb247JywKKworCQkJCSd9JworCisJCQldLmpvaW4oICdcbicgKSAp
OworCisJCQlnbC5zaGFkZXJTb3VyY2UoIGZyYWdtZW50U2hhZGVyLCBbCisKKwkJCQkncHJlY2lz
aW9uICcgKyByZW5kZXJlci5nZXRQcmVjaXNpb24oKSArICcgZmxvYXQ7JywKKworCQkJCScjZGVm
aW5lIFNIQURFUl9OQU1FICcgKyAnU3ByaXRlTWF0ZXJpYWwnLAorCisJCQkJJ3VuaWZvcm0gdmVj
MyBjb2xvcjsnLAorCQkJCSd1bmlmb3JtIHNhbXBsZXIyRCBtYXA7JywKKwkJCQkndW5pZm9ybSBm
bG9hdCBvcGFjaXR5OycsCisKKwkJCQkndW5pZm9ybSBpbnQgZm9nVHlwZTsnLAorCQkJCSd1bmlm
b3JtIHZlYzMgZm9nQ29sb3I7JywKKwkJCQkndW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5OycsCisJ
CQkJJ3VuaWZvcm0gZmxvYXQgZm9nTmVhcjsnLAorCQkJCSd1bmlmb3JtIGZsb2F0IGZvZ0Zhcjsn
LAorCQkJCSd1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsnLAorCisJCQkJJ3ZhcnlpbmcgdmVjMiB2
VVY7JywKKworCQkJCSd2b2lkIG1haW4oKSB7JywKKworCQkJCQkndmVjNCB0ZXh0dXJlID0gdGV4
dHVyZTJEKCBtYXAsIHZVViApOycsCisKKwkJCQkJJ2lmICggdGV4dHVyZS5hIDwgYWxwaGFUZXN0
ICkgZGlzY2FyZDsnLAorCisJCQkJCSdnbF9GcmFnQ29sb3IgPSB2ZWM0KCBjb2xvciAqIHRleHR1
cmUueHl6LCB0ZXh0dXJlLmEgKiBvcGFjaXR5ICk7JywKKworCQkJCQknaWYgKCBmb2dUeXBlID4g
MCApIHsnLAorCisJCQkJCQknZmxvYXQgZGVwdGggPSBnbF9GcmFnQ29vcmQueiAvIGdsX0ZyYWdD
b29yZC53OycsCisJCQkJCQknZmxvYXQgZm9nRmFjdG9yID0gMC4wOycsCisKKwkJCQkJCSdpZiAo
IGZvZ1R5cGUgPT0gMSApIHsnLAorCisJCQkJCQkJJ2ZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZv
Z05lYXIsIGZvZ0ZhciwgZGVwdGggKTsnLAorCisJCQkJCQknfSBlbHNlIHsnLAorCisJCQkJCQkJ
J2NvbnN0IGZsb2F0IExPRzIgPSAxLjQ0MjY5NTsnLAorCQkJCQkJCSdmb2dGYWN0b3IgPSBleHAy
KCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZGVwdGggKiBkZXB0aCAqIExPRzIgKTsnLAor
CQkJCQkJCSdmb2dGYWN0b3IgPSAxLjAgLSBjbGFtcCggZm9nRmFjdG9yLCAwLjAsIDEuMCApOycs
CisKKwkJCQkJCSd9JywKKworCQkJCQkJJ2dsX0ZyYWdDb2xvciA9IG1peCggZ2xfRnJhZ0NvbG9y
LCB2ZWM0KCBmb2dDb2xvciwgZ2xfRnJhZ0NvbG9yLncgKSwgZm9nRmFjdG9yICk7JywKKworCQkJ
CQknfScsCisKKwkJCQknfScKKworCQkJXS5qb2luKCAnXG4nICkgKTsKKworCQkJZ2wuY29tcGls
ZVNoYWRlciggdmVydGV4U2hhZGVyICk7CisJCQlnbC5jb21waWxlU2hhZGVyKCBmcmFnbWVudFNo
YWRlciApOworCisJCQlnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIHZlcnRleFNoYWRlciApOwor
CQkJZ2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBmcmFnbWVudFNoYWRlciApOworCisJCQlnbC5s
aW5rUHJvZ3JhbSggcHJvZ3JhbSApOworCisJCQlyZXR1cm4gcHJvZ3JhbTsKKworCQl9CisKKwkJ
ZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7CisKKwkJCWlmICggYS5yZW5kZXJP
cmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHsKKworCQkJCXJldHVybiBhLnJlbmRlck9yZGVyIC0g
Yi5yZW5kZXJPcmRlcjsKKworCQkJfSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7CisKKwkJCQly
ZXR1cm4gYi56IC0gYS56OworCisJCQl9IGVsc2UgeworCisJCQkJcmV0dXJuIGIuaWQgLSBhLmlk
OworCisJCQl9CisKKwkJfQorCisJfQorCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRw
Oi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFs
aWEuY29tLworCSAqLworCisJdmFyIG1hdGVyaWFsSWQgPSAwOworCisJZnVuY3Rpb24gTWF0ZXJp
YWwoKSB7CisKKwkJT2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBt
YXRlcmlhbElkICsrIH0gKTsKKworCQl0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsK
KworCQl0aGlzLm5hbWUgPSAnJzsKKwkJdGhpcy50eXBlID0gJ01hdGVyaWFsJzsKKworCQl0aGlz
LmZvZyA9IHRydWU7CisJCXRoaXMubGlnaHRzID0gdHJ1ZTsKKworCQl0aGlzLmJsZW5kaW5nID0g
Tm9ybWFsQmxlbmRpbmc7CisJCXRoaXMuc2lkZSA9IEZyb250U2lkZTsKKwkJdGhpcy5zaGFkaW5n
ID0gU21vb3RoU2hhZGluZzsgLy8gVEhSRUUuRmxhdFNoYWRpbmcsIFRIUkVFLlNtb290aFNoYWRp
bmcKKwkJdGhpcy52ZXJ0ZXhDb2xvcnMgPSBOb0NvbG9yczsgLy8gVEhSRUUuTm9Db2xvcnMsIFRI
UkVFLlZlcnRleENvbG9ycywgVEhSRUUuRmFjZUNvbG9ycworCisJCXRoaXMub3BhY2l0eSA9IDE7
CisJCXRoaXMudHJhbnNwYXJlbnQgPSBmYWxzZTsKKworCQl0aGlzLmJsZW5kU3JjID0gU3JjQWxw
aGFGYWN0b3I7CisJCXRoaXMuYmxlbmREc3QgPSBPbmVNaW51c1NyY0FscGhhRmFjdG9yOworCQl0
aGlzLmJsZW5kRXF1YXRpb24gPSBBZGRFcXVhdGlvbjsKKwkJdGhpcy5ibGVuZFNyY0FscGhhID0g
bnVsbDsKKwkJdGhpcy5ibGVuZERzdEFscGhhID0gbnVsbDsKKwkJdGhpcy5ibGVuZEVxdWF0aW9u
QWxwaGEgPSBudWxsOworCisJCXRoaXMuZGVwdGhGdW5jID0gTGVzc0VxdWFsRGVwdGg7CisJCXRo
aXMuZGVwdGhUZXN0ID0gdHJ1ZTsKKwkJdGhpcy5kZXB0aFdyaXRlID0gdHJ1ZTsKKworCQl0aGlz
LmNsaXBwaW5nUGxhbmVzID0gbnVsbDsKKwkJdGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gZmFsc2U7
CisJCXRoaXMuY2xpcFNoYWRvd3MgPSBmYWxzZTsKKworCQl0aGlzLmNvbG9yV3JpdGUgPSB0cnVl
OworCisJCXRoaXMucHJlY2lzaW9uID0gbnVsbDsgLy8gb3ZlcnJpZGUgdGhlIHJlbmRlcmVyJ3Mg
ZGVmYXVsdCBwcmVjaXNpb24gZm9yIHRoaXMgbWF0ZXJpYWwKKworCQl0aGlzLnBvbHlnb25PZmZz
ZXQgPSBmYWxzZTsKKwkJdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gMDsKKwkJdGhpcy5wb2x5
Z29uT2Zmc2V0VW5pdHMgPSAwOworCisJCXRoaXMuZGl0aGVyaW5nID0gZmFsc2U7CisKKwkJdGhp
cy5hbHBoYVRlc3QgPSAwOworCQl0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlOworCisJ
CXRoaXMub3ZlcmRyYXcgPSAwOyAvLyBPdmVyZHJhd24gcGl4ZWxzICh0eXBpY2FsbHkgYmV0d2Vl
biAwIGFuZCAxKSBmb3IgZml4aW5nIGFudGlhbGlhc2luZyBnYXBzIGluIENhbnZhc1JlbmRlcmVy
CisKKwkJdGhpcy52aXNpYmxlID0gdHJ1ZTsKKworCQl0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTsK
KworCX0KKworCU9iamVjdC5hc3NpZ24oIE1hdGVyaWFsLnByb3RvdHlwZSwgRXZlbnREaXNwYXRj
aGVyLnByb3RvdHlwZSwgeworCisJCWlzTWF0ZXJpYWw6IHRydWUsCisKKwkJb25CZWZvcmVDb21w
aWxlOiBmdW5jdGlvbiAoKSB7fSwKKworCQlzZXRWYWx1ZXM6IGZ1bmN0aW9uICggdmFsdWVzICkg
eworCisJCQlpZiAoIHZhbHVlcyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOworCisJCQlmb3IgKCB2
YXIga2V5IGluIHZhbHVlcyApIHsKKworCQkJCXZhciBuZXdWYWx1ZSA9IHZhbHVlc1sga2V5IF07
CisKKwkJCQlpZiAoIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJY29uc29sZS53
YXJuKCAiVEhSRUUuTWF0ZXJpYWw6ICciICsga2V5ICsgIicgcGFyYW1ldGVyIGlzIHVuZGVmaW5l
ZC4iICk7CisJCQkJCWNvbnRpbnVlOworCisJCQkJfQorCisJCQkJdmFyIGN1cnJlbnRWYWx1ZSA9
IHRoaXNbIGtleSBdOworCisJCQkJaWYgKCBjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCApIHsK
KworCQkJCQljb25zb2xlLndhcm4oICJUSFJFRS4iICsgdGhpcy50eXBlICsgIjogJyIgKyBrZXkg
KyAiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIG1hdGVyaWFsLiIgKTsKKwkJCQkJY29udGlu
dWU7CisKKwkJCQl9CisKKwkJCQlpZiAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXND
b2xvciApIHsKKworCQkJCQljdXJyZW50VmFsdWUuc2V0KCBuZXdWYWx1ZSApOworCisJCQkJfSBl
bHNlIGlmICggKCBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzVmVjdG9yMyApICYmICgg
bmV3VmFsdWUgJiYgbmV3VmFsdWUuaXNWZWN0b3IzICkgKSB7CisKKwkJCQkJY3VycmVudFZhbHVl
LmNvcHkoIG5ld1ZhbHVlICk7CisKKwkJCQl9IGVsc2UgaWYgKCBrZXkgPT09ICdvdmVyZHJhdycg
KSB7CisKKwkJCQkJLy8gZW5zdXJlIG92ZXJkcmF3IGlzIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdp
dGggbGVnYWN5IGJvb2xlYW4gdHlwZQorCQkJCQl0aGlzWyBrZXkgXSA9IE51bWJlciggbmV3VmFs
dWUgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJdGhpc1sga2V5IF0gPSBuZXdWYWx1ZTsKKwor
CQkJCX0KKworCQkJfQorCisJCX0sCisKKwkJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CisK
KwkJCXZhciBpc1Jvb3QgPSBtZXRhID09PSB1bmRlZmluZWQ7CisKKwkJCWlmICggaXNSb290ICkg
eworCisJCQkJbWV0YSA9IHsKKwkJCQkJdGV4dHVyZXM6IHt9LAorCQkJCQlpbWFnZXM6IHt9CisJ
CQkJfTsKKworCQkJfQorCisJCQl2YXIgZGF0YSA9IHsKKwkJCQltZXRhZGF0YTogeworCQkJCQl2
ZXJzaW9uOiA0LjUsCisJCQkJCXR5cGU6ICdNYXRlcmlhbCcsCisJCQkJCWdlbmVyYXRvcjogJ01h
dGVyaWFsLnRvSlNPTicKKwkJCQl9CisJCQl9OworCisJCQkvLyBzdGFuZGFyZCBNYXRlcmlhbCBz
ZXJpYWxpemF0aW9uCisJCQlkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7CisJCQlkYXRhLnR5cGUgPSB0
aGlzLnR5cGU7CisKKwkJCWlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMu
bmFtZTsKKworCQkJaWYgKCB0aGlzLmNvbG9yICYmIHRoaXMuY29sb3IuaXNDb2xvciApIGRhdGEu
Y29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpOworCisJCQlpZiAoIHRoaXMucm91Z2huZXNzICE9
PSB1bmRlZmluZWQgKSBkYXRhLnJvdWdobmVzcyA9IHRoaXMucm91Z2huZXNzOworCQkJaWYgKCB0
aGlzLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5tZXRhbG5lc3MgPSB0aGlzLm1ldGFs
bmVzczsKKworCQkJaWYgKCB0aGlzLmVtaXNzaXZlICYmIHRoaXMuZW1pc3NpdmUuaXNDb2xvciAp
IGRhdGEuZW1pc3NpdmUgPSB0aGlzLmVtaXNzaXZlLmdldEhleCgpOworCQkJaWYgKCB0aGlzLnNw
ZWN1bGFyICYmIHRoaXMuc3BlY3VsYXIuaXNDb2xvciApIGRhdGEuc3BlY3VsYXIgPSB0aGlzLnNw
ZWN1bGFyLmdldEhleCgpOworCQkJaWYgKCB0aGlzLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkg
ZGF0YS5zaGluaW5lc3MgPSB0aGlzLnNoaW5pbmVzczsKKwkJCWlmICggdGhpcy5jbGVhckNvYXQg
IT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJDb2F0ID0gdGhpcy5jbGVhckNvYXQ7CisJCQlpZiAo
IHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyQ29hdFJv
dWdobmVzcyA9IHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzOworCisJCQlpZiAoIHRoaXMubWFwICYm
IHRoaXMubWFwLmlzVGV4dHVyZSApIGRhdGEubWFwID0gdGhpcy5tYXAudG9KU09OKCBtZXRhICku
dXVpZDsKKwkJCWlmICggdGhpcy5hbHBoYU1hcCAmJiB0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSAp
IGRhdGEuYWxwaGFNYXAgPSB0aGlzLmFscGhhTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CisJCQlp
ZiAoIHRoaXMubGlnaHRNYXAgJiYgdGhpcy5saWdodE1hcC5pc1RleHR1cmUgKSBkYXRhLmxpZ2h0
TWFwID0gdGhpcy5saWdodE1hcC50b0pTT04oIG1ldGEgKS51dWlkOworCQkJaWYgKCB0aGlzLmJ1
bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSApIHsKKworCQkJCWRhdGEuYnVtcE1hcCA9
IHRoaXMuYnVtcE1hcC50b0pTT04oIG1ldGEgKS51dWlkOworCQkJCWRhdGEuYnVtcFNjYWxlID0g
dGhpcy5idW1wU2NhbGU7CisKKwkJCX0KKwkJCWlmICggdGhpcy5ub3JtYWxNYXAgJiYgdGhpcy5u
b3JtYWxNYXAuaXNUZXh0dXJlICkgeworCisJCQkJZGF0YS5ub3JtYWxNYXAgPSB0aGlzLm5vcm1h
bE1hcC50b0pTT04oIG1ldGEgKS51dWlkOworCQkJCWRhdGEubm9ybWFsU2NhbGUgPSB0aGlzLm5v
cm1hbFNjYWxlLnRvQXJyYXkoKTsKKworCQkJfQorCQkJaWYgKCB0aGlzLmRpc3BsYWNlbWVudE1h
cCAmJiB0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUgKSB7CisKKwkJCQlkYXRhLmRpc3Bs
YWNlbWVudE1hcCA9IHRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CisJ
CQkJZGF0YS5kaXNwbGFjZW1lbnRTY2FsZSA9IHRoaXMuZGlzcGxhY2VtZW50U2NhbGU7CisJCQkJ
ZGF0YS5kaXNwbGFjZW1lbnRCaWFzID0gdGhpcy5kaXNwbGFjZW1lbnRCaWFzOworCisJCQl9CisJ
CQlpZiAoIHRoaXMucm91Z2huZXNzTWFwICYmIHRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSAp
IGRhdGEucm91Z2huZXNzTWFwID0gdGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVp
ZDsKKwkJCWlmICggdGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0
dXJlICkgZGF0YS5tZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEg
KS51dWlkOworCisJCQlpZiAoIHRoaXMuZW1pc3NpdmVNYXAgJiYgdGhpcy5lbWlzc2l2ZU1hcC5p
c1RleHR1cmUgKSBkYXRhLmVtaXNzaXZlTWFwID0gdGhpcy5lbWlzc2l2ZU1hcC50b0pTT04oIG1l
dGEgKS51dWlkOworCQkJaWYgKCB0aGlzLnNwZWN1bGFyTWFwICYmIHRoaXMuc3BlY3VsYXJNYXAu
aXNUZXh0dXJlICkgZGF0YS5zcGVjdWxhck1hcCA9IHRoaXMuc3BlY3VsYXJNYXAudG9KU09OKCBt
ZXRhICkudXVpZDsKKworCQkJaWYgKCB0aGlzLmVudk1hcCAmJiB0aGlzLmVudk1hcC5pc1RleHR1
cmUgKSB7CisKKwkJCQlkYXRhLmVudk1hcCA9IHRoaXMuZW52TWFwLnRvSlNPTiggbWV0YSApLnV1
aWQ7CisJCQkJZGF0YS5yZWZsZWN0aXZpdHkgPSB0aGlzLnJlZmxlY3Rpdml0eTsgLy8gU2NhbGUg
YmVoaW5kIGVudk1hcAorCisJCQl9CisKKwkJCWlmICggdGhpcy5ncmFkaWVudE1hcCAmJiB0aGlz
LmdyYWRpZW50TWFwLmlzVGV4dHVyZSApIHsKKworCQkJCWRhdGEuZ3JhZGllbnRNYXAgPSB0aGlz
LmdyYWRpZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CisKKwkJCX0KKworCQkJaWYgKCB0aGlz
LnNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZSA9IHRoaXMuc2l6ZTsKKwkJCWlmICggdGhp
cy5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZUF0dGVudWF0aW9uID0g
dGhpcy5zaXplQXR0ZW51YXRpb247CisKKwkJCWlmICggdGhpcy5ibGVuZGluZyAhPT0gTm9ybWFs
QmxlbmRpbmcgKSBkYXRhLmJsZW5kaW5nID0gdGhpcy5ibGVuZGluZzsKKwkJCWlmICggdGhpcy5z
aGFkaW5nICE9PSBTbW9vdGhTaGFkaW5nICkgZGF0YS5zaGFkaW5nID0gdGhpcy5zaGFkaW5nOwor
CQkJaWYgKCB0aGlzLnNpZGUgIT09IEZyb250U2lkZSApIGRhdGEuc2lkZSA9IHRoaXMuc2lkZTsK
KwkJCWlmICggdGhpcy52ZXJ0ZXhDb2xvcnMgIT09IE5vQ29sb3JzICkgZGF0YS52ZXJ0ZXhDb2xv
cnMgPSB0aGlzLnZlcnRleENvbG9yczsKKworCQkJaWYgKCB0aGlzLm9wYWNpdHkgPCAxICkgZGF0
YS5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5OworCQkJaWYgKCB0aGlzLnRyYW5zcGFyZW50ID09PSB0
cnVlICkgZGF0YS50cmFuc3BhcmVudCA9IHRoaXMudHJhbnNwYXJlbnQ7CisKKwkJCWRhdGEuZGVw
dGhGdW5jID0gdGhpcy5kZXB0aEZ1bmM7CisJCQlkYXRhLmRlcHRoVGVzdCA9IHRoaXMuZGVwdGhU
ZXN0OworCQkJZGF0YS5kZXB0aFdyaXRlID0gdGhpcy5kZXB0aFdyaXRlOworCisJCQlpZiAoIHRo
aXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7CisJCQlp
ZiAoIHRoaXMucHJlbXVsdGlwbGllZEFscGhhID09PSB0cnVlICkgZGF0YS5wcmVtdWx0aXBsaWVk
QWxwaGEgPSB0aGlzLnByZW11bHRpcGxpZWRBbHBoYTsKKwkJCWlmICggdGhpcy53aXJlZnJhbWUg
PT09IHRydWUgKSBkYXRhLndpcmVmcmFtZSA9IHRoaXMud2lyZWZyYW1lOworCQkJaWYgKCB0aGlz
LndpcmVmcmFtZUxpbmV3aWR0aCA+IDEgKSBkYXRhLndpcmVmcmFtZUxpbmV3aWR0aCA9IHRoaXMu
d2lyZWZyYW1lTGluZXdpZHRoOworCQkJaWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdy
b3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7CisJ
CQlpZiAoIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFt
ZUxpbmVqb2luID0gdGhpcy53aXJlZnJhbWVMaW5lam9pbjsKKworCQkJZGF0YS5za2lubmluZyA9
IHRoaXMuc2tpbm5pbmc7CisJCQlkYXRhLm1vcnBoVGFyZ2V0cyA9IHRoaXMubW9ycGhUYXJnZXRz
OworCisJCQlkYXRhLmRpdGhlcmluZyA9IHRoaXMuZGl0aGVyaW5nOworCisJCQkvLyBUT0RPOiBD
b3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT04KKworCQkJZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNo
ZSggY2FjaGUgKSB7CisKKwkJCQl2YXIgdmFsdWVzID0gW107CisKKwkJCQlmb3IgKCB2YXIga2V5
IGluIGNhY2hlICkgeworCisJCQkJCXZhciBkYXRhID0gY2FjaGVbIGtleSBdOworCQkJCQlkZWxl
dGUgZGF0YS5tZXRhZGF0YTsKKwkJCQkJdmFsdWVzLnB1c2goIGRhdGEgKTsKKworCQkJCX0KKwor
CQkJCXJldHVybiB2YWx1ZXM7CisKKwkJCX0KKworCQkJaWYgKCBpc1Jvb3QgKSB7CisKKwkJCQl2
YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7CisJCQkJdmFy
IGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7CisKKwkJCQlpZiAoIHRl
eHR1cmVzLmxlbmd0aCA+IDAgKSBkYXRhLnRleHR1cmVzID0gdGV4dHVyZXM7CisJCQkJaWYgKCBp
bWFnZXMubGVuZ3RoID4gMCApIGRhdGEuaW1hZ2VzID0gaW1hZ2VzOworCisJCQl9CisKKwkJCXJl
dHVybiBkYXRhOworCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJu
IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOworCisJCX0sCisKKwkJY29weTog
ZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJCXRoaXMubmFtZSA9IHNvdXJjZS5uYW1lOworCisJ
CQl0aGlzLmZvZyA9IHNvdXJjZS5mb2c7CisJCQl0aGlzLmxpZ2h0cyA9IHNvdXJjZS5saWdodHM7
CisKKwkJCXRoaXMuYmxlbmRpbmcgPSBzb3VyY2UuYmxlbmRpbmc7CisJCQl0aGlzLnNpZGUgPSBz
b3VyY2Uuc2lkZTsKKwkJCXRoaXMuc2hhZGluZyA9IHNvdXJjZS5zaGFkaW5nOworCQkJdGhpcy52
ZXJ0ZXhDb2xvcnMgPSBzb3VyY2UudmVydGV4Q29sb3JzOworCisJCQl0aGlzLm9wYWNpdHkgPSBz
b3VyY2Uub3BhY2l0eTsKKwkJCXRoaXMudHJhbnNwYXJlbnQgPSBzb3VyY2UudHJhbnNwYXJlbnQ7
CisKKwkJCXRoaXMuYmxlbmRTcmMgPSBzb3VyY2UuYmxlbmRTcmM7CisJCQl0aGlzLmJsZW5kRHN0
ID0gc291cmNlLmJsZW5kRHN0OworCQkJdGhpcy5ibGVuZEVxdWF0aW9uID0gc291cmNlLmJsZW5k
RXF1YXRpb247CisJCQl0aGlzLmJsZW5kU3JjQWxwaGEgPSBzb3VyY2UuYmxlbmRTcmNBbHBoYTsK
KwkJCXRoaXMuYmxlbmREc3RBbHBoYSA9IHNvdXJjZS5ibGVuZERzdEFscGhhOworCQkJdGhpcy5i
bGVuZEVxdWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhOworCisJCQl0aGlz
LmRlcHRoRnVuYyA9IHNvdXJjZS5kZXB0aEZ1bmM7CisJCQl0aGlzLmRlcHRoVGVzdCA9IHNvdXJj
ZS5kZXB0aFRlc3Q7CisJCQl0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTsKKwor
CQkJdGhpcy5jb2xvcldyaXRlID0gc291cmNlLmNvbG9yV3JpdGU7CisKKwkJCXRoaXMucHJlY2lz
aW9uID0gc291cmNlLnByZWNpc2lvbjsKKworCQkJdGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNl
LnBvbHlnb25PZmZzZXQ7CisJCQl0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBzb3VyY2UucG9s
eWdvbk9mZnNldEZhY3RvcjsKKwkJCXRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gc291cmNlLnBv
bHlnb25PZmZzZXRVbml0czsKKworCQkJdGhpcy5kaXRoZXJpbmcgPSBzb3VyY2UuZGl0aGVyaW5n
OworCisJCQl0aGlzLmFscGhhVGVzdCA9IHNvdXJjZS5hbHBoYVRlc3Q7CisKKwkJCXRoaXMucHJl
bXVsdGlwbGllZEFscGhhID0gc291cmNlLnByZW11bHRpcGxpZWRBbHBoYTsKKworCQkJdGhpcy5v
dmVyZHJhdyA9IHNvdXJjZS5vdmVyZHJhdzsKKworCQkJdGhpcy52aXNpYmxlID0gc291cmNlLnZp
c2libGU7CisJCQl0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzOworCQkJdGhp
cy5jbGlwSW50ZXJzZWN0aW9uID0gc291cmNlLmNsaXBJbnRlcnNlY3Rpb247CisKKwkJCXZhciBz
cmNQbGFuZXMgPSBzb3VyY2UuY2xpcHBpbmdQbGFuZXMsCisJCQkJZHN0UGxhbmVzID0gbnVsbDsK
KworCQkJaWYgKCBzcmNQbGFuZXMgIT09IG51bGwgKSB7CisKKwkJCQl2YXIgbiA9IHNyY1BsYW5l
cy5sZW5ndGg7CisJCQkJZHN0UGxhbmVzID0gbmV3IEFycmF5KCBuICk7CisKKwkJCQlmb3IgKCB2
YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKQorCQkJCQlkc3RQbGFuZXNbIGkgXSA9IHNyY1BsYW5l
c1sgaSBdLmNsb25lKCk7CisKKwkJCX0KKworCQkJdGhpcy5jbGlwcGluZ1BsYW5lcyA9IGRzdFBs
YW5lczsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlkaXNwb3NlOiBmdW5jdGlvbiAo
KSB7CisKKwkJCXRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApOworCisJ
CX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJl
ZHF1YWxpYS5jb20vCisJICoKKwkgKiBwYXJhbWV0ZXJzID0geworCSAqICBkZWZpbmVzOiB7ICJs
YWJlbCIgOiAidmFsdWUiIH0sCisJICogIHVuaWZvcm1zOiB7ICJwYXJhbWV0ZXIxIjogeyB2YWx1
ZTogMS4wIH0sICJwYXJhbWV0ZXIyIjogeyB2YWx1ZTI6IDIgfSB9LAorCSAqCisJICogIGZyYWdt
ZW50U2hhZGVyOiA8c3RyaW5nPiwKKwkgKiAgdmVydGV4U2hhZGVyOiA8c3RyaW5nPiwKKwkgKgor
CSAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKKwkgKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8Zmxv
YXQ+LAorCSAqCisJICogIGxpZ2h0czogPGJvb2w+LAorCSAqCisJICogIHNraW5uaW5nOiA8Ym9v
bD4sCisJICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LAorCSAqICBtb3JwaE5vcm1hbHM6IDxib29s
PgorCSAqIH0KKwkgKi8KKworCWZ1bmN0aW9uIFNoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkg
eworCisJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnU2hhZGVyTWF0
ZXJpYWwnOworCisJCXRoaXMuZGVmaW5lcyA9IHt9OworCQl0aGlzLnVuaWZvcm1zID0ge307CisK
KwkJdGhpcy52ZXJ0ZXhTaGFkZXIgPSAndm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiA9IHBy
b2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7
XG59JzsKKwkJdGhpcy5mcmFnbWVudFNoYWRlciA9ICd2b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdD
b2xvciA9IHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApO1xufSc7CisKKwkJdGhpcy5saW5ld2lk
dGggPSAxOworCisJCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CisJCXRoaXMud2lyZWZyYW1lTGlu
ZXdpZHRoID0gMTsKKworCQl0aGlzLmZvZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGZv
ZworCQl0aGlzLmxpZ2h0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGxpZ2h0cworCQl0
aGlzLmNsaXBwaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2UgdXNlci1kZWZpbmVkIGNsaXBwaW5n
IHBsYW5lcworCisJCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBza2lubmlu
ZyBhdHRyaWJ1dGUgc3RyZWFtcworCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOyAvLyBzZXQg
dG8gdXNlIG1vcnBoIHRhcmdldHMKKwkJdGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsgLy8gc2V0
IHRvIHVzZSBtb3JwaCBub3JtYWxzCisKKwkJdGhpcy5leHRlbnNpb25zID0geworCQkJZGVyaXZh
dGl2ZXM6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRlcml2YXRpdmVzCisJCQlmcmFnRGVwdGg6IGZh
bHNlLCAvLyBzZXQgdG8gdXNlIGZyYWdtZW50IGRlcHRoIHZhbHVlcworCQkJZHJhd0J1ZmZlcnM6
IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRyYXcgYnVmZmVycworCQkJc2hhZGVyVGV4dHVyZUxPRDog
ZmFsc2UgLy8gc2V0IHRvIHVzZSBzaGFkZXIgdGV4dHVyZSBMT0QKKwkJfTsKKworCQkvLyBXaGVu
IHJlbmRlcmVkIGdlb21ldHJ5IGRvZXNuJ3QgaW5jbHVkZSB0aGVzZSBhdHRyaWJ1dGVzIGJ1dCB0
aGUgbWF0ZXJpYWwgZG9lcywKKwkJLy8gdXNlIHRoZXNlIGRlZmF1bHQgdmFsdWVzIGluIFdlYkdM
LiBUaGlzIGF2b2lkcyBlcnJvcnMgd2hlbiBidWZmZXIgZGF0YSBpcyBtaXNzaW5nLgorCQl0aGlz
LmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgPSB7CisJCQknY29sb3InOiBbIDEsIDEsIDEgXSwKKwkJ
CSd1dic6IFsgMCwgMCBdLAorCQkJJ3V2Mic6IFsgMCwgMCBdCisJCX07CisKKwkJdGhpcy5pbmRl
eDBBdHRyaWJ1dGVOYW1lID0gdW5kZWZpbmVkOworCisJCWlmICggcGFyYW1ldGVycyAhPT0gdW5k
ZWZpbmVkICkgeworCisJCQlpZiAoIHBhcmFtZXRlcnMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVk
ICkgeworCisJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlNoYWRlck1hdGVyaWFsOiBhdHRyaWJ1
dGVzIHNob3VsZCBub3cgYmUgZGVmaW5lZCBpbiBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFk
LicgKTsKKworCQkJfQorCisJCQl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOworCisJCX0K
KworCX0KKworCVNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVy
aWFsLnByb3RvdHlwZSApOworCVNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9
IFNoYWRlck1hdGVyaWFsOworCisJU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZGVyTWF0
ZXJpYWwgPSB0cnVlOworCisJU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlv
biAoIHNvdXJjZSApIHsKKworCQlNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBz
b3VyY2UgKTsKKworCQl0aGlzLmZyYWdtZW50U2hhZGVyID0gc291cmNlLmZyYWdtZW50U2hhZGVy
OworCQl0aGlzLnZlcnRleFNoYWRlciA9IHNvdXJjZS52ZXJ0ZXhTaGFkZXI7CisKKwkJdGhpcy51
bmlmb3JtcyA9IFVuaWZvcm1zVXRpbHMuY2xvbmUoIHNvdXJjZS51bmlmb3JtcyApOworCisJCXRo
aXMuZGVmaW5lcyA9IHNvdXJjZS5kZWZpbmVzOworCisJCXRoaXMud2lyZWZyYW1lID0gc291cmNl
LndpcmVmcmFtZTsKKwkJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1l
TGluZXdpZHRoOworCisJCXRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0czsKKwkJdGhpcy5jbGlw
cGluZyA9IHNvdXJjZS5jbGlwcGluZzsKKworCQl0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5u
aW5nOworCisJCXRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0czsKKwkJdGhp
cy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzOworCisJCXRoaXMuZXh0ZW5zaW9u
cyA9IHNvdXJjZS5leHRlbnNpb25zOworCisJCXJldHVybiB0aGlzOworCisJfTsKKworCVNoYWRl
ck1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIG1ldGEgKSB7CisKKwkJdmFy
IGRhdGEgPSBNYXRlcmlhbC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTsKKwor
CQlkYXRhLnVuaWZvcm1zID0gdGhpcy51bmlmb3JtczsKKwkJZGF0YS52ZXJ0ZXhTaGFkZXIgPSB0
aGlzLnZlcnRleFNoYWRlcjsKKwkJZGF0YS5mcmFnbWVudFNoYWRlciA9IHRoaXMuZnJhZ21lbnRT
aGFkZXI7CisKKwkJcmV0dXJuIGRhdGE7CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBtcmRv
b2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2Fs
dGVyZWRxdWFsaWEuY29tLworCSAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwczovL2NsYXJhLmlv
CisJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5
CisJICoKKwkgKiBwYXJhbWV0ZXJzID0geworCSAqCisJICogIG9wYWNpdHk6IDxmbG9hdD4sCisJ
ICoKKwkgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqCisJICogIGFs
cGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqCisJICogIGRpc3BsYWNl
bWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKiAgZGlzcGxhY2VtZW50
U2NhbGU6IDxmbG9hdD4sCisJICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sCisJICoKKwkg
KiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCisJICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0
PgorCSAqIH0KKwkgKi8KKworCWZ1bmN0aW9uIE1lc2hEZXB0aE1hdGVyaWFsKCBwYXJhbWV0ZXJz
ICkgeworCisJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnTWVzaERl
cHRoTWF0ZXJpYWwnOworCisJCXRoaXMuZGVwdGhQYWNraW5nID0gQmFzaWNEZXB0aFBhY2tpbmc7
CisKKwkJdGhpcy5za2lubmluZyA9IGZhbHNlOworCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNl
OworCisJCXRoaXMubWFwID0gbnVsbDsKKworCQl0aGlzLmFscGhhTWFwID0gbnVsbDsKKworCQl0
aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CisJCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAx
OworCQl0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwOworCisJCXRoaXMud2lyZWZyYW1lID0gZmFs
c2U7CisJCXRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTsKKworCQl0aGlzLmZvZyA9IGZhbHNl
OworCQl0aGlzLmxpZ2h0cyA9IGZhbHNlOworCisJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJz
ICk7CisKKwl9CisKKwlNZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRl
KCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKKwlNZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29u
c3RydWN0b3IgPSBNZXNoRGVwdGhNYXRlcmlhbDsKKworCU1lc2hEZXB0aE1hdGVyaWFsLnByb3Rv
dHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsID0gdHJ1ZTsKKworCU1lc2hEZXB0aE1hdGVyaWFsLnBy
b3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJTWF0ZXJpYWwucHJvdG90
eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CisKKwkJdGhpcy5kZXB0aFBhY2tpbmcgPSBz
b3VyY2UuZGVwdGhQYWNraW5nOworCisJCXRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7
CisJCXRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0czsKKworCQl0aGlzLm1h
cCA9IHNvdXJjZS5tYXA7CisKKwkJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKKwor
CQl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7CisJCXRoaXMu
ZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7CisJCXRoaXMuZGlz
cGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzOworCisJCXRoaXMud2lyZWZy
YW1lID0gc291cmNlLndpcmVmcmFtZTsKKwkJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3Vy
Y2Uud2lyZWZyYW1lTGluZXdpZHRoOworCisJCXJldHVybiB0aGlzOworCisJfTsKKworCS8qKgor
CSAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KKwkgKiBAYXV0aG9yIFdlc3RM
YW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKwkgKi8KKworCWZ1bmN0aW9u
IEJveDMoIG1pbiwgbWF4ICkgeworCisJCXRoaXMubWluID0gKCBtaW4gIT09IHVuZGVmaW5lZCAp
ID8gbWluIDogbmV3IFZlY3RvcjMoICsgSW5maW5pdHksICsgSW5maW5pdHksICsgSW5maW5pdHkg
KTsKKwkJdGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9y
MyggLSBJbmZpbml0eSwgLSBJbmZpbml0eSwgLSBJbmZpbml0eSApOworCisJfQorCisJT2JqZWN0
LmFzc2lnbiggQm94My5wcm90b3R5cGUsIHsKKworCQlpc0JveDM6IHRydWUsCisKKwkJc2V0OiBm
dW5jdGlvbiAoIG1pbiwgbWF4ICkgeworCisJCQl0aGlzLm1pbi5jb3B5KCBtaW4gKTsKKwkJCXRo
aXMubWF4LmNvcHkoIG1heCApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldEZy
b21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHsKKworCQkJdmFyIG1pblggPSArIEluZmluaXR5
OworCQkJdmFyIG1pblkgPSArIEluZmluaXR5OworCQkJdmFyIG1pblogPSArIEluZmluaXR5Owor
CisJCQl2YXIgbWF4WCA9IC0gSW5maW5pdHk7CisJCQl2YXIgbWF4WSA9IC0gSW5maW5pdHk7CisJ
CQl2YXIgbWF4WiA9IC0gSW5maW5pdHk7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5
Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHsKKworCQkJCXZhciB4ID0gYXJyYXlbIGkgXTsKKwkJ
CQl2YXIgeSA9IGFycmF5WyBpICsgMSBdOworCQkJCXZhciB6ID0gYXJyYXlbIGkgKyAyIF07CisK
KwkJCQlpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7CisJCQkJaWYgKCB5IDwgbWluWSApIG1pblkg
PSB5OworCQkJCWlmICggeiA8IG1pblogKSBtaW5aID0gejsKKworCQkJCWlmICggeCA+IG1heFgg
KSBtYXhYID0geDsKKwkJCQlpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7CisJCQkJaWYgKCB6ID4g
bWF4WiApIG1heFogPSB6OworCisJCQl9CisKKwkJCXRoaXMubWluLnNldCggbWluWCwgbWluWSwg
bWluWiApOworCQkJdGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0sCisKKwkJc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBh
dHRyaWJ1dGUgKSB7CisKKwkJCXZhciBtaW5YID0gKyBJbmZpbml0eTsKKwkJCXZhciBtaW5ZID0g
KyBJbmZpbml0eTsKKwkJCXZhciBtaW5aID0gKyBJbmZpbml0eTsKKworCQkJdmFyIG1heFggPSAt
IEluZmluaXR5OworCQkJdmFyIG1heFkgPSAtIEluZmluaXR5OworCQkJdmFyIG1heFogPSAtIElu
ZmluaXR5OworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBs
OyBpICsrICkgeworCisJCQkJdmFyIHggPSBhdHRyaWJ1dGUuZ2V0WCggaSApOworCQkJCXZhciB5
ID0gYXR0cmlidXRlLmdldFkoIGkgKTsKKwkJCQl2YXIgeiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7
CisKKwkJCQlpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7CisJCQkJaWYgKCB5IDwgbWluWSApIG1p
blkgPSB5OworCQkJCWlmICggeiA8IG1pblogKSBtaW5aID0gejsKKworCQkJCWlmICggeCA+IG1h
eFggKSBtYXhYID0geDsKKwkJCQlpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7CisJCQkJaWYgKCB6
ID4gbWF4WiApIG1heFogPSB6OworCisJCQl9CisKKwkJCXRoaXMubWluLnNldCggbWluWCwgbWlu
WSwgbWluWiApOworCQkJdGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMg
KSB7CisKKwkJCXRoaXMubWFrZUVtcHR5KCk7CisKKwkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBw
b2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQl0aGlzLmV4cGFuZEJ5UG9pbnQo
IHBvaW50c1sgaSBdICk7CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlz
ZXRGcm9tQ2VudGVyQW5kU2l6ZTogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdjEgPSBuZXcgVmVj
dG9yMygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRl
ciwgc2l6ZSApIHsKKworCQkJCXZhciBoYWxmU2l6ZSA9IHYxLmNvcHkoIHNpemUgKS5tdWx0aXBs
eVNjYWxhciggMC41ICk7CisKKwkJCQl0aGlzLm1pbi5jb3B5KCBjZW50ZXIgKS5zdWIoIGhhbGZT
aXplICk7CisJCQkJdGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApOworCisJ
CQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCXNldEZyb21PYmplY3Q6IGZ1
bmN0aW9uICggb2JqZWN0ICkgeworCisJCQl0aGlzLm1ha2VFbXB0eSgpOworCisJCQlyZXR1cm4g
dGhpcy5leHBhbmRCeU9iamVjdCggb2JqZWN0ICk7CisKKwkJfSwKKworCQljbG9uZTogZnVuY3Rp
b24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7
CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIGJveCApIHsKKworCQkJdGhpcy5taW4uY29w
eSggYm94Lm1pbiApOworCQkJdGhpcy5tYXguY29weSggYm94Lm1heCApOworCisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCW1ha2VFbXB0eTogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLm1p
bi54ID0gdGhpcy5taW4ueSA9IHRoaXMubWluLnogPSArIEluZmluaXR5OworCQkJdGhpcy5tYXgu
eCA9IHRoaXMubWF4LnkgPSB0aGlzLm1heC56ID0gLSBJbmZpbml0eTsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfSwKKworCQlpc0VtcHR5OiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIHRoaXMgaXMg
YSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVz
ZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzCisKKwkJCXJl
dHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5t
aW4ueSApIHx8ICggdGhpcy5tYXgueiA8IHRoaXMubWluLnogKTsKKworCQl9LAorCisJCWdldENl
bnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJdmFyIHJlc3VsdCA9IG9w
dGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisJCQlyZXR1cm4gdGhpcy5pc0VtcHR5KCkg
PyByZXN1bHQuc2V0KCAwLCAwLCAwICkgOiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRo
aXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApOworCisJCX0sCisKKwkJZ2V0U2l6ZTogZnVu
Y3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFy
Z2V0IHx8IG5ldyBWZWN0b3IzKCk7CisJCQlyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyByZXN1bHQu
c2V0KCAwLCAwLCAwICkgOiByZXN1bHQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7
CisKKwkJfSwKKworCQlleHBhbmRCeVBvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgeworCisJCQl0
aGlzLm1pbi5taW4oIHBvaW50ICk7CisJCQl0aGlzLm1heC5tYXgoIHBvaW50ICk7CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9y
ICkgeworCisJCQl0aGlzLm1pbi5zdWIoIHZlY3RvciApOworCQkJdGhpcy5tYXguYWRkKCB2ZWN0
b3IgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlleHBhbmRCeVNjYWxhcjogZnVu
Y3Rpb24gKCBzY2FsYXIgKSB7CisKKwkJCXRoaXMubWluLmFkZFNjYWxhciggLSBzY2FsYXIgKTsK
KwkJCXRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7CisKKwkJCXJldHVybiB0aGlzOworCisJ
CX0sCisKKwkJZXhwYW5kQnlPYmplY3Q6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gQ29tcHV0ZXMg
dGhlIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggb2YgYW4gb2JqZWN0IChpbmNsdWRp
bmcgaXRzIGNoaWxkcmVuKSwKKwkJCS8vIGFjY291bnRpbmcgZm9yIGJvdGggdGhlIG9iamVjdCdz
LCBhbmQgY2hpbGRyZW4ncywgd29ybGQgdHJhbnNmb3JtcworCisJCQl2YXIgdjEgPSBuZXcgVmVj
dG9yMygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gZXhwYW5kQnlPYmplY3QoIG9iamVjdCApIHsK
KworCQkJCXZhciBzY29wZSA9IHRoaXM7CisKKwkJCQlvYmplY3QudXBkYXRlTWF0cml4V29ybGQo
IHRydWUgKTsKKworCQkJCW9iamVjdC50cmF2ZXJzZSggZnVuY3Rpb24gKCBub2RlICkgeworCisJ
CQkJCXZhciBpLCBsOworCisJCQkJCXZhciBnZW9tZXRyeSA9IG5vZGUuZ2VvbWV0cnk7CisKKwkJ
CQkJaWYgKCBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCQlpZiAoIGdlb21ldHJ5
LmlzR2VvbWV0cnkgKSB7CisKKwkJCQkJCQl2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNl
czsKKworCQkJCQkJCWZvciAoIGkgPSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSAr
KyApIHsKKworCQkJCQkJCQl2MS5jb3B5KCB2ZXJ0aWNlc1sgaSBdICk7CisJCQkJCQkJCXYxLmFw
cGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCApOworCisJCQkJCQkJCXNjb3BlLmV4cGFuZEJ5
UG9pbnQoIHYxICk7CisKKwkJCQkJCQl9CisKKwkJCQkJCX0gZWxzZSBpZiAoIGdlb21ldHJ5Lmlz
QnVmZmVyR2VvbWV0cnkgKSB7CisKKwkJCQkJCQl2YXIgYXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0
cmlidXRlcy5wb3NpdGlvbjsKKworCQkJCQkJCWlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQg
KSB7CisKKwkJCQkJCQkJZm9yICggaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBp
ICsrICkgeworCisJCQkJCQkJCQl2MS5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGkg
KS5hcHBseU1hdHJpeDQoIG5vZGUubWF0cml4V29ybGQgKTsKKworCQkJCQkJCQkJc2NvcGUuZXhw
YW5kQnlQb2ludCggdjEgKTsKKworCQkJCQkJCQl9CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwor
CQkJCQl9CisKKwkJCQl9ICk7CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJfTsKKworCQl9KCks
CisKKwkJY29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKKworCQkJcmV0dXJuIHBv
aW50LnggPCB0aGlzLm1pbi54IHx8IHBvaW50LnggPiB0aGlzLm1heC54IHx8CisJCQkJcG9pbnQu
eSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgfHwKKwkJCQlwb2ludC56IDwg
dGhpcy5taW4ueiB8fCBwb2ludC56ID4gdGhpcy5tYXgueiA/IGZhbHNlIDogdHJ1ZTsKKworCQl9
LAorCisJCWNvbnRhaW5zQm94OiBmdW5jdGlvbiAoIGJveCApIHsKKworCQkJcmV0dXJuIHRoaXMu
bWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmCisJCQkJdGhp
cy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4LnkgJiYKKwkJCQl0
aGlzLm1pbi56IDw9IGJveC5taW4ueiAmJiBib3gubWF4LnogPD0gdGhpcy5tYXguejsKKworCQl9
LAorCisJCWdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7
CisKKwkJCS8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0
aGUgYm94CisJCQkvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLgorCisJCQl2YXIgcmVzdWx0
ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJuIHJlc3VsdC5z
ZXQoCisJCQkJKCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5t
aW4ueCApLAorCQkJCSggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRo
aXMubWluLnkgKSwKKwkJCQkoIHBvaW50LnogLSB0aGlzLm1pbi56ICkgLyAoIHRoaXMubWF4Lnog
LSB0aGlzLm1pbi56ICkKKwkJCSk7CisKKwkJfSwKKworCQlpbnRlcnNlY3RzQm94OiBmdW5jdGlv
biAoIGJveCApIHsKKworCQkJLy8gdXNpbmcgNiBzcGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0
IGludGVyc2VjdGlvbnMuCisJCQlyZXR1cm4gYm94Lm1heC54IDwgdGhpcy5taW4ueCB8fCBib3gu
bWluLnggPiB0aGlzLm1heC54IHx8CisJCQkJYm94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gu
bWluLnkgPiB0aGlzLm1heC55IHx8CisJCQkJYm94Lm1heC56IDwgdGhpcy5taW4ueiB8fCBib3gu
bWluLnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlOworCisJCX0sCisKKwkJaW50ZXJzZWN0
c1NwaGVyZTogKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBjbG9zZXN0UG9pbnQgPSBuZXcgVmVj
dG9yMygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkg
eworCisJCQkJLy8gRmluZCB0aGUgcG9pbnQgb24gdGhlIEFBQkIgY2xvc2VzdCB0byB0aGUgc3Bo
ZXJlIGNlbnRlci4KKwkJCQl0aGlzLmNsYW1wUG9pbnQoIHNwaGVyZS5jZW50ZXIsIGNsb3Nlc3RQ
b2ludCApOworCisJCQkJLy8gSWYgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgdGhl
IEFBQkIgYW5kIHNwaGVyZSBpbnRlcnNlY3QuCisJCQkJcmV0dXJuIGNsb3Nlc3RQb2ludC5kaXN0
YW5jZVRvU3F1YXJlZCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1cyAqIHNwaGVy
ZS5yYWRpdXMgKTsKKworCQkJfTsKKworCQl9ICkoKSwKKworCQlpbnRlcnNlY3RzUGxhbmU6IGZ1
bmN0aW9uICggcGxhbmUgKSB7CisKKwkJCS8vIFdlIGNvbXB1dGUgdGhlIG1pbmltdW0gYW5kIG1h
eGltdW0gZG90IHByb2R1Y3QgdmFsdWVzLiBJZiB0aG9zZSB2YWx1ZXMKKwkJCS8vIGFyZSBvbiB0
aGUgc2FtZSBzaWRlIChiYWNrIG9yIGZyb250KSBvZiB0aGUgcGxhbmUsIHRoZW4gdGhlcmUgaXMg
bm8gaW50ZXJzZWN0aW9uLgorCisJCQl2YXIgbWluLCBtYXg7CisKKwkJCWlmICggcGxhbmUubm9y
bWFsLnggPiAwICkgeworCisJCQkJbWluID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1pbi54Owor
CQkJCW1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDsKKworCQkJfSBlbHNlIHsKKwor
CQkJCW1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDsKKwkJCQltYXggPSBwbGFuZS5u
b3JtYWwueCAqIHRoaXMubWluLng7CisKKwkJCX0KKworCQkJaWYgKCBwbGFuZS5ub3JtYWwueSA+
IDAgKSB7CisKKwkJCQltaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55OworCQkJCW1h
eCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlt
aW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55OworCQkJCW1heCArPSBwbGFuZS5ub3Jt
YWwueSAqIHRoaXMubWluLnk7CisKKwkJCX0KKworCQkJaWYgKCBwbGFuZS5ub3JtYWwueiA+IDAg
KSB7CisKKwkJCQltaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56OworCQkJCW1heCAr
PSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7CisKKwkJCX0gZWxzZSB7CisKKwkJCQltaW4g
Kz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56OworCQkJCW1heCArPSBwbGFuZS5ub3JtYWwu
eiAqIHRoaXMubWluLno7CisKKwkJCX0KKworCQkJcmV0dXJuICggbWluIDw9IHBsYW5lLmNvbnN0
YW50ICYmIG1heCA+PSBwbGFuZS5jb25zdGFudCApOworCisJCX0sCisKKwkJY2xhbXBQb2ludDog
ZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCXZhciByZXN1bHQgPSBv
cHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCQkJcmV0dXJuIHJlc3VsdC5jb3B5KCBw
b2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTsKKworCQl9LAorCisJCWRpc3RhbmNl
VG9Qb2ludDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCisJ
CQlyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHsKKworCQkJCXZhciBj
bGFtcGVkUG9pbnQgPSB2MS5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXgg
KTsKKwkJCQlyZXR1cm4gY2xhbXBlZFBvaW50LnN1YiggcG9pbnQgKS5sZW5ndGgoKTsKKworCQkJ
fTsKKworCQl9KCksCisKKwkJZ2V0Qm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHsKKworCQkJ
dmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGdldEJvdW5kaW5n
U3BoZXJlKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRh
cmdldCB8fCBuZXcgU3BoZXJlKCk7CisKKwkJCQl0aGlzLmdldENlbnRlciggcmVzdWx0LmNlbnRl
ciApOworCisJCQkJcmVzdWx0LnJhZGl1cyA9IHRoaXMuZ2V0U2l6ZSggdjEgKS5sZW5ndGgoKSAq
IDAuNTsKKworCQkJCXJldHVybiByZXN1bHQ7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWludGVy
c2VjdDogZnVuY3Rpb24gKCBib3ggKSB7CisKKwkJCXRoaXMubWluLm1heCggYm94Lm1pbiApOwor
CQkJdGhpcy5tYXgubWluKCBib3gubWF4ICk7CisKKwkJCS8vIGVuc3VyZSB0aGF0IGlmIHRoZXJl
IGlzIG5vIG92ZXJsYXAsIHRoZSByZXN1bHQgaXMgZnVsbHkgZW1wdHksIG5vdCBzbGlnaHRseSBl
bXB0eSB3aXRoIG5vbi1pbmYvK2luZiB2YWx1ZXMgdGhhdCB3aWxsIGNhdXNlIHN1YnNlcXVlbmNl
IGludGVyc2VjdHMgdG8gZXJyb25lb3VzbHkgcmV0dXJuIHZhbGlkIHZhbHVlcy4KKwkJCWlmKCB0
aGlzLmlzRW1wdHkoKSApIHRoaXMubWFrZUVtcHR5KCk7CisKKwkJCXJldHVybiB0aGlzOworCisJ
CX0sCisKKwkJdW5pb246IGZ1bmN0aW9uICggYm94ICkgeworCisJCQl0aGlzLm1pbi5taW4oIGJv
eC5taW4gKTsKKwkJCXRoaXMubWF4Lm1heCggYm94Lm1heCApOworCisJCQlyZXR1cm4gdGhpczsK
KworCQl9LAorCisJCWFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgcG9pbnRz
ID0gWworCQkJCW5ldyBWZWN0b3IzKCksCisJCQkJbmV3IFZlY3RvcjMoKSwKKwkJCQluZXcgVmVj
dG9yMygpLAorCQkJCW5ldyBWZWN0b3IzKCksCisJCQkJbmV3IFZlY3RvcjMoKSwKKwkJCQluZXcg
VmVjdG9yMygpLAorCQkJCW5ldyBWZWN0b3IzKCksCisJCQkJbmV3IFZlY3RvcjMoKQorCQkJXTsK
KworCQkJcmV0dXJuIGZ1bmN0aW9uIGFwcGx5TWF0cml4NCggbWF0cml4ICkgeworCisJCQkJLy8g
dHJhbnNmb3JtIG9mIGVtcHR5IGJveCBpcyBhbiBlbXB0eSBib3guCisJCQkJaWYoIHRoaXMuaXNF
bXB0eSgpICkgcmV0dXJuIHRoaXM7CisKKwkJCQkvLyBOT1RFOiBJIGFtIHVzaW5nIGEgYmluYXJ5
IHBhdHRlcm4gdG8gc3BlY2lmeSBhbGwgMl4zIGNvbWJpbmF0aW9ucyBiZWxvdworCQkJCXBvaW50
c1sgMCBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0
cml4NCggbWF0cml4ICk7IC8vIDAwMAorCQkJCXBvaW50c1sgMSBdLnNldCggdGhpcy5taW4ueCwg
dGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMQor
CQkJCXBvaW50c1sgMiBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiAp
LmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMAorCQkJCXBvaW50c1sgMyBdLnNldCggdGhp
cy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7
IC8vIDAxMQorCQkJCXBvaW50c1sgNCBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhp
cy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMAorCQkJCXBvaW50c1sgNSBd
LnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCgg
bWF0cml4ICk7IC8vIDEwMQorCQkJCXBvaW50c1sgNiBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5t
YXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDExMAorCQkJCXBv
aW50c1sgNyBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5
TWF0cml4NCggbWF0cml4ICk7CS8vIDExMQorCisJCQkJdGhpcy5zZXRGcm9tUG9pbnRzKCBwb2lu
dHMgKTsKKworCQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKworCQl0cmFuc2xh
dGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkgeworCisJCQl0aGlzLm1pbi5hZGQoIG9mZnNldCApOwor
CQkJdGhpcy5tYXguYWRkKCBvZmZzZXQgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKwor
CQllcXVhbHM6IGZ1bmN0aW9uICggYm94ICkgeworCisJCQlyZXR1cm4gYm94Lm1pbi5lcXVhbHMo
IHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7CisKKwkJfQorCisJfSAp
OworCisJLyoqCisJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworCSAqIEBh
dXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBTcGhl
cmUoIGNlbnRlciwgcmFkaXVzICkgeworCisJCXRoaXMuY2VudGVyID0gKCBjZW50ZXIgIT09IHVu
ZGVmaW5lZCApID8gY2VudGVyIDogbmV3IFZlY3RvcjMoKTsKKwkJdGhpcy5yYWRpdXMgPSAoIHJh
ZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAwOworCisJfQorCisJT2JqZWN0LmFzc2ln
biggU3BoZXJlLnByb3RvdHlwZSwgeworCisJCXNldDogZnVuY3Rpb24gKCBjZW50ZXIsIHJhZGl1
cyApIHsKKworCQkJdGhpcy5jZW50ZXIuY29weSggY2VudGVyICk7CisJCQl0aGlzLnJhZGl1cyA9
IHJhZGl1czsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRGcm9tUG9pbnRzOiBm
dW5jdGlvbiAoKSB7CisKKwkJCXZhciBib3ggPSBuZXcgQm94MygpOworCisJCQlyZXR1cm4gZnVu
Y3Rpb24gc2V0RnJvbVBvaW50cyggcG9pbnRzLCBvcHRpb25hbENlbnRlciApIHsKKworCQkJCXZh
ciBjZW50ZXIgPSB0aGlzLmNlbnRlcjsKKworCQkJCWlmICggb3B0aW9uYWxDZW50ZXIgIT09IHVu
ZGVmaW5lZCApIHsKKworCQkJCQljZW50ZXIuY29weSggb3B0aW9uYWxDZW50ZXIgKTsKKworCQkJ
CX0gZWxzZSB7CisKKwkJCQkJYm94LnNldEZyb21Qb2ludHMoIHBvaW50cyApLmdldENlbnRlcigg
Y2VudGVyICk7CisKKwkJCQl9CisKKwkJCQl2YXIgbWF4UmFkaXVzU3EgPSAwOworCisJCQkJZm9y
ICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJ
CQltYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9T
cXVhcmVkKCBwb2ludHNbIGkgXSApICk7CisKKwkJCQl9CisKKwkJCQl0aGlzLnJhZGl1cyA9IE1h
dGguc3FydCggbWF4UmFkaXVzU3EgKTsKKworCQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJ
CX0oKSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29u
c3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIHNw
aGVyZSApIHsKKworCQkJdGhpcy5jZW50ZXIuY29weSggc3BoZXJlLmNlbnRlciApOworCQkJdGhp
cy5yYWRpdXMgPSBzcGhlcmUucmFkaXVzOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJ
CWVtcHR5OiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiAoIHRoaXMucmFkaXVzIDw9IDAgKTsK
KworCQl9LAorCisJCWNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CisKKwkJCXJl
dHVybiAoIHBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggdGhpcy5y
YWRpdXMgKiB0aGlzLnJhZGl1cyApICk7CisKKwkJfSwKKworCQlkaXN0YW5jZVRvUG9pbnQ6IGZ1
bmN0aW9uICggcG9pbnQgKSB7CisKKwkJCXJldHVybiAoIHBvaW50LmRpc3RhbmNlVG8oIHRoaXMu
Y2VudGVyICkgLSB0aGlzLnJhZGl1cyApOworCisJCX0sCisKKwkJaW50ZXJzZWN0c1NwaGVyZTog
ZnVuY3Rpb24gKCBzcGhlcmUgKSB7CisKKwkJCXZhciByYWRpdXNTdW0gPSB0aGlzLnJhZGl1cyAr
IHNwaGVyZS5yYWRpdXM7CisKKwkJCXJldHVybiBzcGhlcmUuY2VudGVyLmRpc3RhbmNlVG9TcXVh
cmVkKCB0aGlzLmNlbnRlciApIDw9ICggcmFkaXVzU3VtICogcmFkaXVzU3VtICk7CisKKwkJfSwK
KworCQlpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHsKKworCQkJcmV0dXJuIGJveC5p
bnRlcnNlY3RzU3BoZXJlKCB0aGlzICk7CisKKwkJfSwKKworCQlpbnRlcnNlY3RzUGxhbmU6IGZ1
bmN0aW9uICggcGxhbmUgKSB7CisKKwkJCS8vIFdlIHVzZSB0aGUgZm9sbG93aW5nIGVxdWF0aW9u
IHRvIGNvbXB1dGUgdGhlIHNpZ25lZCBkaXN0YW5jZSBmcm9tCisJCQkvLyB0aGUgY2VudGVyIG9m
IHRoZSBzcGhlcmUgdG8gdGhlIHBsYW5lLgorCQkJLy8KKwkJCS8vIGRpc3RhbmNlID0gcSAqIG4g
LSBkCisJCQkvLworCQkJLy8gSWYgdGhpcyBkaXN0YW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIHJh
ZGl1cyBvZiB0aGUgc3BoZXJlLAorCQkJLy8gdGhlbiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24u
CisKKwkJCXJldHVybiBNYXRoLmFicyggdGhpcy5jZW50ZXIuZG90KCBwbGFuZS5ub3JtYWwgKSAt
IHBsYW5lLmNvbnN0YW50ICkgPD0gdGhpcy5yYWRpdXM7CisKKwkJfSwKKworCQljbGFtcFBvaW50
OiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJdmFyIGRlbHRhTGVu
Z3RoU3EgPSB0aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTsKKworCQkJdmFy
IHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJlc3VsdC5j
b3B5KCBwb2ludCApOworCisJCQlpZiAoIGRlbHRhTGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICog
dGhpcy5yYWRpdXMgKSApIHsKKworCQkJCXJlc3VsdC5zdWIoIHRoaXMuY2VudGVyICkubm9ybWFs
aXplKCk7CisJCQkJcmVzdWx0Lm11bHRpcGx5U2NhbGFyKCB0aGlzLnJhZGl1cyApLmFkZCggdGhp
cy5jZW50ZXIgKTsKKworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCisJCX0sCisKKwkJZ2V0
Qm91bmRpbmdCb3g6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCXZhciBib3gg
PSBvcHRpb25hbFRhcmdldCB8fCBuZXcgQm94MygpOworCisJCQlib3guc2V0KCB0aGlzLmNlbnRl
ciwgdGhpcy5jZW50ZXIgKTsKKwkJCWJveC5leHBhbmRCeVNjYWxhciggdGhpcy5yYWRpdXMgKTsK
KworCQkJcmV0dXJuIGJveDsKKworCQl9LAorCisJCWFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBt
YXRyaXggKSB7CisKKwkJCXRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCggbWF0cml4ICk7CisJCQl0
aGlzLnJhZGl1cyA9IHRoaXMucmFkaXVzICogbWF0cml4LmdldE1heFNjYWxlT25BeGlzKCk7CisK
KwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJdHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNl
dCApIHsKKworCQkJdGhpcy5jZW50ZXIuYWRkKCBvZmZzZXQgKTsKKworCQkJcmV0dXJuIHRoaXM7
CisKKwkJfSwKKworCQllcXVhbHM6IGZ1bmN0aW9uICggc3BoZXJlICkgeworCisJCQlyZXR1cm4g
c3BoZXJlLmNlbnRlci5lcXVhbHMoIHRoaXMuY2VudGVyICkgJiYgKCBzcGhlcmUucmFkaXVzID09
PSB0aGlzLnJhZGl1cyApOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgYWx0
ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICogQGF1dGhvciBXZXN0TGFuZ2xl
eSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisJICogQGF1dGhvciBiaG91c3RvbiAv
IGh0dHA6Ly9jbGFyYS5pbworCSAqIEBhdXRob3IgdHNjaHcKKwkgKi8KKworCWZ1bmN0aW9uIE1h
dHJpeDMoKSB7CisKKwkJdGhpcy5lbGVtZW50cyA9IFsKKworCQkJMSwgMCwgMCwKKwkJCTAsIDEs
IDAsCisJCQkwLCAwLCAxCisKKwkJXTsKKworCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAwICkg
eworCisJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5v
IGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4nICk7CisKKwkJfQor
CisJfQorCisJT2JqZWN0LmFzc2lnbiggTWF0cml4My5wcm90b3R5cGUsIHsKKworCQlpc01hdHJp
eDM6IHRydWUsCisKKwkJc2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4yMSwgbjIyLCBu
MjMsIG4zMSwgbjMyLCBuMzMgKSB7CisKKwkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisKKwkJ
CXRlWyAwIF0gPSBuMTE7IHRlWyAxIF0gPSBuMjE7IHRlWyAyIF0gPSBuMzE7CisJCQl0ZVsgMyBd
ID0gbjEyOyB0ZVsgNCBdID0gbjIyOyB0ZVsgNSBdID0gbjMyOworCQkJdGVbIDYgXSA9IG4xMzsg
dGVbIDcgXSA9IG4yMzsgdGVbIDggXSA9IG4zMzsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQlpZGVudGl0eTogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLnNldCgKKworCQkJCTEsIDAs
IDAsCisJCQkJMCwgMSwgMCwKKwkJCQkwLCAwLCAxCisKKwkJCSk7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlz
LmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KCB0aGlzLmVsZW1lbnRzICk7CisKKwkJfSwKKworCQlj
b3B5OiBmdW5jdGlvbiAoIG0gKSB7CisKKwkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisJCQl2
YXIgbWUgPSBtLmVsZW1lbnRzOworCisJCQl0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1l
WyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdOworCQkJdGVbIDMgXSA9IG1lWyAzIF07IHRlWyA0IF0g
PSBtZVsgNCBdOyB0ZVsgNSBdID0gbWVbIDUgXTsKKwkJCXRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsg
NyBdID0gbWVbIDcgXTsgdGVbIDggXSA9IG1lWyA4IF07CisKKwkJCXJldHVybiB0aGlzOworCisJ
CX0sCisKKwkJc2V0RnJvbU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHsKKworCQkJdmFyIG1lID0g
bS5lbGVtZW50czsKKworCQkJdGhpcy5zZXQoCisKKwkJCQltZVsgMCBdLCBtZVsgNCBdLCBtZVsg
IDggXSwKKwkJCQltZVsgMSBdLCBtZVsgNSBdLCBtZVsgIDkgXSwKKwkJCQltZVsgMiBdLCBtZVsg
NiBdLCBtZVsgMTAgXQorCisJCQkpOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWFw
cGx5VG9CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHYxID0gbmV3IFZl
Y3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0
dHJpYnV0ZSApIHsKKworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsg
aSA8IGw7IGkgKysgKSB7CisKKwkJCQkJdjEueCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7CisJCQkJ
CXYxLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApOworCQkJCQl2MS56ID0gYXR0cmlidXRlLmdldFoo
IGkgKTsKKworCQkJCQl2MS5hcHBseU1hdHJpeDMoIHRoaXMgKTsKKworCQkJCQlhdHRyaWJ1dGUu
c2V0WFlaKCBpLCB2MS54LCB2MS55LCB2MS56ICk7CisKKwkJCQl9CisKKwkJCQlyZXR1cm4gYXR0
cmlidXRlOworCisJCQl9OworCisJCX0oKSwKKworCQltdWx0aXBseTogZnVuY3Rpb24gKCBtICkg
eworCisJCQlyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7CisKKwkJfSwK
KworCQlwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBtICkgeworCisJCQlyZXR1cm4gdGhpcy5tdWx0
aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7CisKKwkJfSwKKworCQltdWx0aXBseU1hdHJpY2VzOiBm
dW5jdGlvbiAoIGEsIGIgKSB7CisKKwkJCXZhciBhZSA9IGEuZWxlbWVudHM7CisJCQl2YXIgYmUg
PSBiLmVsZW1lbnRzOworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworCQkJdmFyIGExMSA9
IGFlWyAwIF0sIGExMiA9IGFlWyAzIF0sIGExMyA9IGFlWyA2IF07CisJCQl2YXIgYTIxID0gYWVb
IDEgXSwgYTIyID0gYWVbIDQgXSwgYTIzID0gYWVbIDcgXTsKKwkJCXZhciBhMzEgPSBhZVsgMiBd
LCBhMzIgPSBhZVsgNSBdLCBhMzMgPSBhZVsgOCBdOworCisJCQl2YXIgYjExID0gYmVbIDAgXSwg
YjEyID0gYmVbIDMgXSwgYjEzID0gYmVbIDYgXTsKKwkJCXZhciBiMjEgPSBiZVsgMSBdLCBiMjIg
PSBiZVsgNCBdLCBiMjMgPSBiZVsgNyBdOworCQkJdmFyIGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJl
WyA1IF0sIGIzMyA9IGJlWyA4IF07CisKKwkJCXRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBi
MjEgKyBhMTMgKiBiMzE7CisJCQl0ZVsgMyBdID0gYTExICogYjEyICsgYTEyICogYjIyICsgYTEz
ICogYjMyOworCQkJdGVbIDYgXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMzsK
KworCQkJdGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMTsKKwkJCXRl
WyA0IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMgKiBiMzI7CisJCQl0ZVsgNyBdID0g
YTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzOworCisJCQl0ZVsgMiBdID0gYTMxICog
YjExICsgYTMyICogYjIxICsgYTMzICogYjMxOworCQkJdGVbIDUgXSA9IGEzMSAqIGIxMiArIGEz
MiAqIGIyMiArIGEzMyAqIGIzMjsKKwkJCXRlWyA4IF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMg
KyBhMzMgKiBiMzM7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJbXVsdGlwbHlTY2Fs
YXI6IGZ1bmN0aW9uICggcyApIHsKKworCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworCQkJ
dGVbIDAgXSAqPSBzOyB0ZVsgMyBdICo9IHM7IHRlWyA2IF0gKj0gczsKKwkJCXRlWyAxIF0gKj0g
czsgdGVbIDQgXSAqPSBzOyB0ZVsgNyBdICo9IHM7CisJCQl0ZVsgMiBdICo9IHM7IHRlWyA1IF0g
Kj0gczsgdGVbIDggXSAqPSBzOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWRldGVy
bWluYW50OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisKKwkJ
CXZhciBhID0gdGVbIDAgXSwgYiA9IHRlWyAxIF0sIGMgPSB0ZVsgMiBdLAorCQkJCWQgPSB0ZVsg
MyBdLCBlID0gdGVbIDQgXSwgZiA9IHRlWyA1IF0sCisJCQkJZyA9IHRlWyA2IF0sIGggPSB0ZVsg
NyBdLCBpID0gdGVbIDggXTsKKworCQkJcmV0dXJuIGEgKiBlICogaSAtIGEgKiBmICogaCAtIGIg
KiBkICogaSArIGIgKiBmICogZyArIGMgKiBkICogaCAtIGMgKiBlICogZzsKKworCQl9LAorCisJ
CWdldEludmVyc2U6IGZ1bmN0aW9uICggbWF0cml4LCB0aHJvd09uRGVnZW5lcmF0ZSApIHsKKwor
CQkJaWYgKCBtYXRyaXggJiYgbWF0cml4LmlzTWF0cml4NCApIHsKKworCQkJCWNvbnNvbGUuZXJy
b3IoICJUSFJFRS5NYXRyaXgzLmdldEludmVyc2Ugbm8gbG9uZ2VyIHRha2VzIGEgTWF0cml4NCBh
cmd1bWVudC4iICk7CisKKwkJCX0KKworCQkJdmFyIG1lID0gbWF0cml4LmVsZW1lbnRzLAorCQkJ
CXRlID0gdGhpcy5lbGVtZW50cywKKworCQkJCW4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0s
IG4zMSA9IG1lWyAyIF0sCisJCQkJbjEyID0gbWVbIDMgXSwgbjIyID0gbWVbIDQgXSwgbjMyID0g
bWVbIDUgXSwKKwkJCQluMTMgPSBtZVsgNiBdLCBuMjMgPSBtZVsgNyBdLCBuMzMgPSBtZVsgOCBd
LAorCisJCQkJdDExID0gbjMzICogbjIyIC0gbjMyICogbjIzLAorCQkJCXQxMiA9IG4zMiAqIG4x
MyAtIG4zMyAqIG4xMiwKKwkJCQl0MTMgPSBuMjMgKiBuMTIgLSBuMjIgKiBuMTMsCisKKwkJCQlk
ZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTM7CisKKwkJCWlmICggZGV0ID09
PSAwICkgeworCisJCQkJdmFyIG1zZyA9ICJUSFJFRS5NYXRyaXgzLmdldEludmVyc2UoKTogY2Fu
J3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCI7CisKKwkJCQlpZiAoIHRocm93T25E
ZWdlbmVyYXRlID09PSB0cnVlICkgeworCisJCQkJCXRocm93IG5ldyBFcnJvciggbXNnICk7CisK
KwkJCQl9IGVsc2UgeworCisJCQkJCWNvbnNvbGUud2FybiggbXNnICk7CisKKwkJCQl9CisKKwkJ
CQlyZXR1cm4gdGhpcy5pZGVudGl0eSgpOworCisJCQl9CisKKwkJCXZhciBkZXRJbnYgPSAxIC8g
ZGV0OworCisJCQl0ZVsgMCBdID0gdDExICogZGV0SW52OworCQkJdGVbIDEgXSA9ICggbjMxICog
bjIzIC0gbjMzICogbjIxICkgKiBkZXRJbnY7CisJCQl0ZVsgMiBdID0gKCBuMzIgKiBuMjEgLSBu
MzEgKiBuMjIgKSAqIGRldEludjsKKworCQkJdGVbIDMgXSA9IHQxMiAqIGRldEludjsKKwkJCXRl
WyA0IF0gPSAoIG4zMyAqIG4xMSAtIG4zMSAqIG4xMyApICogZGV0SW52OworCQkJdGVbIDUgXSA9
ICggbjMxICogbjEyIC0gbjMyICogbjExICkgKiBkZXRJbnY7CisKKwkJCXRlWyA2IF0gPSB0MTMg
KiBkZXRJbnY7CisJCQl0ZVsgNyBdID0gKCBuMjEgKiBuMTMgLSBuMjMgKiBuMTEgKSAqIGRldElu
djsKKwkJCXRlWyA4IF0gPSAoIG4yMiAqIG4xMSAtIG4yMSAqIG4xMiApICogZGV0SW52OworCisJ
CQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXRyYW5zcG9zZTogZnVuY3Rpb24gKCkgeworCisJ
CQl2YXIgdG1wLCBtID0gdGhpcy5lbGVtZW50czsKKworCQkJdG1wID0gbVsgMSBdOyBtWyAxIF0g
PSBtWyAzIF07IG1bIDMgXSA9IHRtcDsKKwkJCXRtcCA9IG1bIDIgXTsgbVsgMiBdID0gbVsgNiBd
OyBtWyA2IF0gPSB0bXA7CisJCQl0bXAgPSBtWyA1IF07IG1bIDUgXSA9IG1bIDcgXTsgbVsgNyBd
ID0gdG1wOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWdldE5vcm1hbE1hdHJpeDog
ZnVuY3Rpb24gKCBtYXRyaXg0ICkgeworCisJCQlyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCgg
bWF0cml4NCApLmdldEludmVyc2UoIHRoaXMgKS50cmFuc3Bvc2UoKTsKKworCQl9LAorCisJCXRy
YW5zcG9zZUludG9BcnJheTogZnVuY3Rpb24gKCByICkgeworCisJCQl2YXIgbSA9IHRoaXMuZWxl
bWVudHM7CisKKwkJCXJbIDAgXSA9IG1bIDAgXTsKKwkJCXJbIDEgXSA9IG1bIDMgXTsKKwkJCXJb
IDIgXSA9IG1bIDYgXTsKKwkJCXJbIDMgXSA9IG1bIDEgXTsKKwkJCXJbIDQgXSA9IG1bIDQgXTsK
KwkJCXJbIDUgXSA9IG1bIDcgXTsKKwkJCXJbIDYgXSA9IG1bIDIgXTsKKwkJCXJbIDcgXSA9IG1b
IDUgXTsKKwkJCXJbIDggXSA9IG1bIDggXTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKwor
CQllcXVhbHM6IGZ1bmN0aW9uICggbWF0cml4ICkgeworCisJCQl2YXIgdGUgPSB0aGlzLmVsZW1l
bnRzOworCQkJdmFyIG1lID0gbWF0cml4LmVsZW1lbnRzOworCisJCQlmb3IgKCB2YXIgaSA9IDA7
IGkgPCA5OyBpICsrICkgeworCisJCQkJaWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJu
IGZhbHNlOworCisJCQl9CisKKwkJCXJldHVybiB0cnVlOworCisJCX0sCisKKwkJZnJvbUFycmF5
OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CisKKwkJCWlmICggb2Zmc2V0ID09PSB1bmRl
ZmluZWQgKSBvZmZzZXQgPSAwOworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkg
eworCisJCQkJdGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTsKKworCQkJ
fQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXRvQXJyYXk6IGZ1bmN0aW9uICggYXJy
YXksIG9mZnNldCApIHsKKworCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBb
XTsKKwkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisJCQl2YXIg
dGUgPSB0aGlzLmVsZW1lbnRzOworCisJCQlhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdOworCQkJ
YXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07CisJCQlhcnJheVsgb2Zmc2V0ICsgMiBdID0g
dGVbIDIgXTsKKworCQkJYXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07CisJCQlhcnJheVsg
b2Zmc2V0ICsgNCBdID0gdGVbIDQgXTsKKwkJCWFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBd
OworCisJCQlhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTsKKwkJCWFycmF5WyBvZmZzZXQg
KyA3IF0gPSB0ZVsgNyBdOworCQkJYXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07CisKKwkJ
CXJldHVybiBhcnJheTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGJob3Vz
dG9uIC8gaHR0cDovL2NsYXJhLmlvCisJICovCisKKwlmdW5jdGlvbiBQbGFuZSggbm9ybWFsLCBj
b25zdGFudCApIHsKKworCQl0aGlzLm5vcm1hbCA9ICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSA/
IG5vcm1hbCA6IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7CisJCXRoaXMuY29uc3RhbnQgPSAoIGNv
bnN0YW50ICE9PSB1bmRlZmluZWQgKSA/IGNvbnN0YW50IDogMDsKKworCX0KKworCU9iamVjdC5h
c3NpZ24oIFBsYW5lLnByb3RvdHlwZSwgeworCisJCXNldDogZnVuY3Rpb24gKCBub3JtYWwsIGNv
bnN0YW50ICkgeworCisJCQl0aGlzLm5vcm1hbC5jb3B5KCBub3JtYWwgKTsKKwkJCXRoaXMuY29u
c3RhbnQgPSBjb25zdGFudDsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRDb21w
b25lbnRzOiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7CisKKwkJCXRoaXMubm9ybWFsLnNldCgg
eCwgeSwgeiApOworCQkJdGhpcy5jb25zdGFudCA9IHc7CisKKwkJCXJldHVybiB0aGlzOworCisJ
CX0sCisKKwkJc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggbm9ybWFs
LCBwb2ludCApIHsKKworCQkJdGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7CisJCQl0aGlzLmNv
bnN0YW50ID0gLSBwb2ludC5kb3QoIHRoaXMubm9ybWFsICk7CS8vIG11c3QgYmUgdGhpcy5ub3Jt
YWwsIG5vdCBub3JtYWwsIGFzIHRoaXMubm9ybWFsIGlzIG5vcm1hbGl6ZWQKKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQlzZXRGcm9tQ29wbGFuYXJQb2ludHM6IGZ1bmN0aW9uICgpIHsK
KworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciB2MiA9IG5ldyBWZWN0b3IzKCk7
CisKKwkJCXJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ29wbGFuYXJQb2ludHMoIGEsIGIsIGMgKSB7
CisKKwkJCQl2YXIgbm9ybWFsID0gdjEuc3ViVmVjdG9ycyggYywgYiApLmNyb3NzKCB2Mi5zdWJW
ZWN0b3JzKCBhLCBiICkgKS5ub3JtYWxpemUoKTsKKworCQkJCS8vIFE6IHNob3VsZCBhbiBlcnJv
ciBiZSB0aHJvd24gaWYgbm9ybWFsIGlzIHplcm8gKGUuZy4gZGVnZW5lcmF0ZSBwbGFuZSk/CisK
KwkJCQl0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KCBub3JtYWwsIGEgKTsKKwor
CQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKworCQljbG9uZTogZnVuY3Rpb24g
KCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisK
KwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIHBsYW5lICkgeworCisJCQl0aGlzLm5vcm1hbC5j
b3B5KCBwbGFuZS5ub3JtYWwgKTsKKwkJCXRoaXMuY29uc3RhbnQgPSBwbGFuZS5jb25zdGFudDsK
KworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlub3JtYWxpemU6IGZ1bmN0aW9uICgpIHsK
KworCQkJLy8gTm90ZTogd2lsbCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIHBsYW5l
IGlzIGludmFsaWQuCisKKwkJCXZhciBpbnZlcnNlTm9ybWFsTGVuZ3RoID0gMS4wIC8gdGhpcy5u
b3JtYWwubGVuZ3RoKCk7CisJCQl0aGlzLm5vcm1hbC5tdWx0aXBseVNjYWxhciggaW52ZXJzZU5v
cm1hbExlbmd0aCApOworCQkJdGhpcy5jb25zdGFudCAqPSBpbnZlcnNlTm9ybWFsTGVuZ3RoOwor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCW5lZ2F0ZTogZnVuY3Rpb24gKCkgeworCisJ
CQl0aGlzLmNvbnN0YW50ICo9IC0gMTsKKwkJCXRoaXMubm9ybWFsLm5lZ2F0ZSgpOworCisJCQly
ZXR1cm4gdGhpczsKKworCQl9LAorCisJCWRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCBwb2lu
dCApIHsKKworCQkJcmV0dXJuIHRoaXMubm9ybWFsLmRvdCggcG9pbnQgKSArIHRoaXMuY29uc3Rh
bnQ7CisKKwkJfSwKKworCQlkaXN0YW5jZVRvU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHsK
KworCQkJcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgLSBzcGhl
cmUucmFkaXVzOworCisJCX0sCisKKwkJcHJvamVjdFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBv
cHRpb25hbFRhcmdldCApIHsKKworCQkJcmV0dXJuIHRoaXMub3J0aG9Qb2ludCggcG9pbnQsIG9w
dGlvbmFsVGFyZ2V0ICkuc3ViKCBwb2ludCApLm5lZ2F0ZSgpOworCisJCX0sCisKKwkJb3J0aG9Q
b2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCXZhciBwZXJw
ZW5kaWN1bGFyTWFnbml0dWRlID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICk7CisKKwkJ
CXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCQkJcmV0dXJu
IHJlc3VsdC5jb3B5KCB0aGlzLm5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCBwZXJwZW5kaWN1bGFy
TWFnbml0dWRlICk7CisKKwkJfSwKKworCQlpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiAoKSB7CisK
KwkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiBpbnRlcnNl
Y3RMaW5lKCBsaW5lLCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJCXZhciByZXN1bHQgPSBvcHRp
b25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCisJCQkJdmFyIGRpcmVjdGlvbiA9IGxpbmUu
ZGVsdGEoIHYxICk7CisKKwkJCQl2YXIgZGVub21pbmF0b3IgPSB0aGlzLm5vcm1hbC5kb3QoIGRp
cmVjdGlvbiApOworCisJCQkJaWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHsKKworCQkJCQkvLyBs
aW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luCisJCQkJCWlmICggdGhpcy5kaXN0YW5jZVRv
UG9pbnQoIGxpbmUuc3RhcnQgKSA9PT0gMCApIHsKKworCQkJCQkJcmV0dXJuIHJlc3VsdC5jb3B5
KCBsaW5lLnN0YXJ0ICk7CisKKwkJCQkJfQorCisJCQkJCS8vIFVuc3VyZSBpZiB0aGlzIGlzIHRo
ZSBjb3JyZWN0IG1ldGhvZCB0byBoYW5kbGUgdGhpcyBjYXNlLgorCQkJCQlyZXR1cm4gdW5kZWZp
bmVkOworCisJCQkJfQorCisJCQkJdmFyIHQgPSAtICggbGluZS5zdGFydC5kb3QoIHRoaXMubm9y
bWFsICkgKyB0aGlzLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjsKKworCQkJCWlmICggdCA8IDAg
fHwgdCA+IDEgKSB7CisKKwkJCQkJcmV0dXJuIHVuZGVmaW5lZDsKKworCQkJCX0KKworCQkJCXJl
dHVybiByZXN1bHQuY29weSggZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIGxp
bmUuc3RhcnQgKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJaW50ZXJzZWN0c0xpbmU6IGZ1bmN0
aW9uICggbGluZSApIHsKKworCQkJLy8gTm90ZTogdGhpcyB0ZXN0cyBpZiBhIGxpbmUgaW50ZXJz
ZWN0cyB0aGUgcGxhbmUsIG5vdCB3aGV0aGVyIGl0IChvciBpdHMgZW5kLXBvaW50cykgYXJlIGNv
cGxhbmFyIHdpdGggaXQuCisKKwkJCXZhciBzdGFydFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2lu
dCggbGluZS5zdGFydCApOworCQkJdmFyIGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCgg
bGluZS5lbmQgKTsKKworCQkJcmV0dXJuICggc3RhcnRTaWduIDwgMCAmJiBlbmRTaWduID4gMCAp
IHx8ICggZW5kU2lnbiA8IDAgJiYgc3RhcnRTaWduID4gMCApOworCisJCX0sCisKKwkJaW50ZXJz
ZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7CisKKwkJCXJldHVybiBib3guaW50ZXJzZWN0c1Bs
YW5lKCB0aGlzICk7CisKKwkJfSwKKworCQlpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNw
aGVyZSApIHsKKworCQkJcmV0dXJuIHNwaGVyZS5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTsKKwor
CQl9LAorCisJCWNvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CisK
KwkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCQkJcmV0
dXJuIHJlc3VsdC5jb3B5KCB0aGlzLm5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAtIHRoaXMuY29u
c3RhbnQgKTsKKworCQl9LAorCisJCWFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCkgeworCisJCQl2
YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIG0xID0gbmV3IE1hdHJpeDMoKTsKKworCQkJ
cmV0dXJuIGZ1bmN0aW9uIGFwcGx5TWF0cml4NCggbWF0cml4LCBvcHRpb25hbE5vcm1hbE1hdHJp
eCApIHsKKworCQkJCXZhciByZWZlcmVuY2VQb2ludCA9IHRoaXMuY29wbGFuYXJQb2ludCggdjEg
KS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOworCisJCQkJLy8gdHJhbnNmb3JtIG5vcm1hbCBiYXNl
ZCBvbiB0aGVvcnkgaGVyZToKKwkJCQkvLyBodHRwOi8vd3d3LnNvbmdoby5jYS9vcGVuZ2wvZ2xf
bm9ybWFsdHJhbnNmb3JtLmh0bWwKKwkJCQl2YXIgbm9ybWFsTWF0cml4ID0gb3B0aW9uYWxOb3Jt
YWxNYXRyaXggfHwgbTEuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTsKKwkJCQl2YXIgbm9ybWFs
ID0gdGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTsK
KworCQkJCS8vIHJlY2FsY3VsYXRlIGNvbnN0YW50IChsaWtlIGluIHNldEZyb21Ob3JtYWxBbmRD
b3BsYW5hclBvaW50KQorCQkJCXRoaXMuY29uc3RhbnQgPSAtIHJlZmVyZW5jZVBvaW50LmRvdCgg
bm9ybWFsICk7CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJfTsKKworCQl9KCksCisKKwkJdHJh
bnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHsKKworCQkJdGhpcy5jb25zdGFudCA9IHRoaXMu
Y29uc3RhbnQgLSBvZmZzZXQuZG90KCB0aGlzLm5vcm1hbCApOworCisJCQlyZXR1cm4gdGhpczsK
KworCQl9LAorCisJCWVxdWFsczogZnVuY3Rpb24gKCBwbGFuZSApIHsKKworCQkJcmV0dXJuIHBs
YW5lLm5vcm1hbC5lcXVhbHMoIHRoaXMubm9ybWFsICkgJiYgKCBwbGFuZS5jb25zdGFudCA9PT0g
dGhpcy5jb25zdGFudCApOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJk
b29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9h
bHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlv
CisJICovCisKKwlmdW5jdGlvbiBGcnVzdHVtKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkgewor
CisJCXRoaXMucGxhbmVzID0gWworCisJCQkoIHAwICE9PSB1bmRlZmluZWQgKSA/IHAwIDogbmV3
IFBsYW5lKCksCisJCQkoIHAxICE9PSB1bmRlZmluZWQgKSA/IHAxIDogbmV3IFBsYW5lKCksCisJ
CQkoIHAyICE9PSB1bmRlZmluZWQgKSA/IHAyIDogbmV3IFBsYW5lKCksCisJCQkoIHAzICE9PSB1
bmRlZmluZWQgKSA/IHAzIDogbmV3IFBsYW5lKCksCisJCQkoIHA0ICE9PSB1bmRlZmluZWQgKSA/
IHA0IDogbmV3IFBsYW5lKCksCisJCQkoIHA1ICE9PSB1bmRlZmluZWQgKSA/IHA1IDogbmV3IFBs
YW5lKCkKKworCQldOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggRnJ1c3R1bS5wcm90b3R5cGUs
IHsKKworCQlzZXQ6IGZ1bmN0aW9uICggcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSApIHsKKworCQkJ
dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzOworCisJCQlwbGFuZXNbIDAgXS5jb3B5KCBwMCApOwor
CQkJcGxhbmVzWyAxIF0uY29weSggcDEgKTsKKwkJCXBsYW5lc1sgMiBdLmNvcHkoIHAyICk7CisJ
CQlwbGFuZXNbIDMgXS5jb3B5KCBwMyApOworCQkJcGxhbmVzWyA0IF0uY29weSggcDQgKTsKKwkJ
CXBsYW5lc1sgNSBdLmNvcHkoIHA1ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJ
Y2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCku
Y29weSggdGhpcyApOworCisJCX0sCisKKwkJY29weTogZnVuY3Rpb24gKCBmcnVzdHVtICkgewor
CisJCQl2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8
IDY7IGkgKysgKSB7CisKKwkJCQlwbGFuZXNbIGkgXS5jb3B5KCBmcnVzdHVtLnBsYW5lc1sgaSBd
ICk7CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRGcm9tTWF0cml4
OiBmdW5jdGlvbiAoIG0gKSB7CisKKwkJCXZhciBwbGFuZXMgPSB0aGlzLnBsYW5lczsKKwkJCXZh
ciBtZSA9IG0uZWxlbWVudHM7CisJCQl2YXIgbWUwID0gbWVbIDAgXSwgbWUxID0gbWVbIDEgXSwg
bWUyID0gbWVbIDIgXSwgbWUzID0gbWVbIDMgXTsKKwkJCXZhciBtZTQgPSBtZVsgNCBdLCBtZTUg
PSBtZVsgNSBdLCBtZTYgPSBtZVsgNiBdLCBtZTcgPSBtZVsgNyBdOworCQkJdmFyIG1lOCA9IG1l
WyA4IF0sIG1lOSA9IG1lWyA5IF0sIG1lMTAgPSBtZVsgMTAgXSwgbWUxMSA9IG1lWyAxMSBdOwor
CQkJdmFyIG1lMTIgPSBtZVsgMTIgXSwgbWUxMyA9IG1lWyAxMyBdLCBtZTE0ID0gbWVbIDE0IF0s
IG1lMTUgPSBtZVsgMTUgXTsKKworCQkJcGxhbmVzWyAwIF0uc2V0Q29tcG9uZW50cyggbWUzIC0g
bWUwLCBtZTcgLSBtZTQsIG1lMTEgLSBtZTgsIG1lMTUgLSBtZTEyICkubm9ybWFsaXplKCk7CisJ
CQlwbGFuZXNbIDEgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTAsIG1lNyArIG1lNCwgbWUxMSAr
IG1lOCwgbWUxNSArIG1lMTIgKS5ub3JtYWxpemUoKTsKKwkJCXBsYW5lc1sgMiBdLnNldENvbXBv
bmVudHMoIG1lMyArIG1lMSwgbWU3ICsgbWU1LCBtZTExICsgbWU5LCBtZTE1ICsgbWUxMyApLm5v
cm1hbGl6ZSgpOworCQkJcGxhbmVzWyAzIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUxLCBtZTcg
LSBtZTUsIG1lMTEgLSBtZTksIG1lMTUgLSBtZTEzICkubm9ybWFsaXplKCk7CisJCQlwbGFuZXNb
IDQgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTIsIG1lNyAtIG1lNiwgbWUxMSAtIG1lMTAsIG1l
MTUgLSBtZTE0ICkubm9ybWFsaXplKCk7CisJCQlwbGFuZXNbIDUgXS5zZXRDb21wb25lbnRzKCBt
ZTMgKyBtZTIsIG1lNyArIG1lNiwgbWUxMSArIG1lMTAsIG1lMTUgKyBtZTE0ICkubm9ybWFsaXpl
KCk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJaW50ZXJzZWN0c09iamVjdDogZnVu
Y3Rpb24gKCkgeworCisJCQl2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpOworCisJCQlyZXR1cm4g
ZnVuY3Rpb24gaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgeworCisJCQkJdmFyIGdlb21ldHJ5
ID0gb2JqZWN0Lmdlb21ldHJ5OworCisJCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9
PT0gbnVsbCApCisJCQkJCWdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOworCisJCQkJ
c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICkKKwkJCQkJLmFwcGx5TWF0cml4
NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7CisKKwkJCQlyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3Bo
ZXJlKCBzcGhlcmUgKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJaW50ZXJzZWN0c1Nwcml0ZTog
ZnVuY3Rpb24gKCkgeworCisJCQl2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpOworCisJCQlyZXR1
cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1Nwcml0ZSggc3ByaXRlICkgeworCisJCQkJc3BoZXJlLmNl
bnRlci5zZXQoIDAsIDAsIDAgKTsKKwkJCQlzcGhlcmUucmFkaXVzID0gMC43MDcxMDY3ODExODY1
NDc2OworCQkJCXNwaGVyZS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApOworCisJ
CQkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7CisKKwkJCX07CisKKwkJ
fSgpLAorCisJCWludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkgeworCisJCQl2
YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7CisJCQl2YXIgY2VudGVyID0gc3BoZXJlLmNlbnRlcjsK
KwkJCXZhciBuZWdSYWRpdXMgPSAtIHNwaGVyZS5yYWRpdXM7CisKKwkJCWZvciAoIHZhciBpID0g
MDsgaSA8IDY7IGkgKysgKSB7CisKKwkJCQl2YXIgZGlzdGFuY2UgPSBwbGFuZXNbIGkgXS5kaXN0
YW5jZVRvUG9pbnQoIGNlbnRlciApOworCisJCQkJaWYgKCBkaXN0YW5jZSA8IG5lZ1JhZGl1cyAp
IHsKKworCQkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuIHRy
dWU7CisKKwkJfSwKKworCQlpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBw
MSA9IG5ldyBWZWN0b3IzKCksCisJCQkJcDIgPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4g
ZnVuY3Rpb24gaW50ZXJzZWN0c0JveCggYm94ICkgeworCisJCQkJdmFyIHBsYW5lcyA9IHRoaXMu
cGxhbmVzOworCisJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHsKKworCQkJCQl2
YXIgcGxhbmUgPSBwbGFuZXNbIGkgXTsKKworCQkJCQlwMS54ID0gcGxhbmUubm9ybWFsLnggPiAw
ID8gYm94Lm1pbi54IDogYm94Lm1heC54OworCQkJCQlwMi54ID0gcGxhbmUubm9ybWFsLnggPiAw
ID8gYm94Lm1heC54IDogYm94Lm1pbi54OworCQkJCQlwMS55ID0gcGxhbmUubm9ybWFsLnkgPiAw
ID8gYm94Lm1pbi55IDogYm94Lm1heC55OworCQkJCQlwMi55ID0gcGxhbmUubm9ybWFsLnkgPiAw
ID8gYm94Lm1heC55IDogYm94Lm1pbi55OworCQkJCQlwMS56ID0gcGxhbmUubm9ybWFsLnogPiAw
ID8gYm94Lm1pbi56IDogYm94Lm1heC56OworCQkJCQlwMi56ID0gcGxhbmUubm9ybWFsLnogPiAw
ID8gYm94Lm1heC56IDogYm94Lm1pbi56OworCisJCQkJCXZhciBkMSA9IHBsYW5lLmRpc3RhbmNl
VG9Qb2ludCggcDEgKTsKKwkJCQkJdmFyIGQyID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBwMiAp
OworCisJCQkJCS8vIGlmIGJvdGggb3V0c2lkZSBwbGFuZSwgbm8gaW50ZXJzZWN0aW9uCisKKwkJ
CQkJaWYgKCBkMSA8IDAgJiYgZDIgPCAwICkgeworCisJCQkJCQlyZXR1cm4gZmFsc2U7CisKKwkJ
CQkJfQorCisJCQkJfQorCisJCQkJcmV0dXJuIHRydWU7CisKKwkJCX07CisKKwkJfSgpLAorCisJ
CWNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CisKKwkJCXZhciBwbGFuZXMgPSB0
aGlzLnBsYW5lczsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHsKKworCQkJ
CWlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIDwgMCApIHsKKworCQkJ
CQlyZXR1cm4gZmFsc2U7CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuIHRydWU7CisKKwkJ
fQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVk
cXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAq
LworCisJZnVuY3Rpb24gV2ViR0xTaGFkb3dNYXAoIF9yZW5kZXJlciwgX2xpZ2h0cywgX29iamVj
dHMsIGNhcGFiaWxpdGllcyApIHsKKworCQl2YXIgX2dsID0gX3JlbmRlcmVyLmNvbnRleHQsCisJ
CQlfc3RhdGUgPSBfcmVuZGVyZXIuc3RhdGUsCisJCQlfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCks
CisJCQlfcHJvalNjcmVlbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCksCisKKwkJCV9saWdodFNoYWRv
d3MgPSBfbGlnaHRzLnNoYWRvd3MsCisKKwkJCV9zaGFkb3dNYXBTaXplID0gbmV3IFZlY3RvcjIo
KSwKKwkJCV9tYXhTaGFkb3dNYXBTaXplID0gbmV3IFZlY3RvcjIoIGNhcGFiaWxpdGllcy5tYXhU
ZXh0dXJlU2l6ZSwgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICksCisKKwkJCV9sb29rVGFy
Z2V0ID0gbmV3IFZlY3RvcjMoKSwKKwkJCV9saWdodFBvc2l0aW9uV29ybGQgPSBuZXcgVmVjdG9y
MygpLAorCisJCQlfTW9ycGhpbmdGbGFnID0gMSwKKwkJCV9Ta2lubmluZ0ZsYWcgPSAyLAorCisJ
CQlfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzID0gKCBfTW9ycGhpbmdGbGFnIHwgX1NraW5uaW5n
RmxhZyApICsgMSwKKworCQkJX2RlcHRoTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZN
YXRlcmlhbFZhcmlhbnRzICksCisJCQlfZGlzdGFuY2VNYXRlcmlhbHMgPSBuZXcgQXJyYXkoIF9O
dW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgKSwKKworCQkJX21hdGVyaWFsQ2FjaGUgPSB7fTsKKwor
CQl2YXIgY3ViZURpcmVjdGlvbnMgPSBbCisJCQluZXcgVmVjdG9yMyggMSwgMCwgMCApLCBuZXcg
VmVjdG9yMyggLSAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAwLCAwLCAxICksCisJCQluZXcgVmVj
dG9yMyggMCwgMCwgLSAxICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAw
LCAtIDEsIDAgKQorCQldOworCisJCXZhciBjdWJlVXBzID0gWworCQkJbmV3IFZlY3RvcjMoIDAs
IDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwK
KwkJCW5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAwLCAxICksCW5ldyBW
ZWN0b3IzKCAwLCAwLCAtIDEgKQorCQldOworCisJCXZhciBjdWJlMkRWaWV3UG9ydHMgPSBbCisJ
CQluZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLAorCQkJbmV3IFZl
Y3RvcjQoKSwgbmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKQorCQldOworCisJCS8vIGluaXQK
KworCQl2YXIgZGVwdGhNYXRlcmlhbFRlbXBsYXRlID0gbmV3IE1lc2hEZXB0aE1hdGVyaWFsKCk7
CisJCWRlcHRoTWF0ZXJpYWxUZW1wbGF0ZS5kZXB0aFBhY2tpbmcgPSBSR0JBRGVwdGhQYWNraW5n
OworCQlkZXB0aE1hdGVyaWFsVGVtcGxhdGUuY2xpcHBpbmcgPSB0cnVlOworCisJCXZhciBkaXN0
YW5jZVNoYWRlciA9IFNoYWRlckxpYlsgImRpc3RhbmNlUkdCQSIgXTsKKwkJdmFyIGRpc3RhbmNl
VW5pZm9ybXMgPSBVbmlmb3Jtc1V0aWxzLmNsb25lKCBkaXN0YW5jZVNoYWRlci51bmlmb3JtcyAp
OworCisJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gX051bWJlck9mTWF0ZXJpYWxWYXJpYW50czsg
KysgaSApIHsKKworCQkJdmFyIHVzZU1vcnBoaW5nID0gKCBpICYgX01vcnBoaW5nRmxhZyApICE9
PSAwOworCQkJdmFyIHVzZVNraW5uaW5nID0gKCBpICYgX1NraW5uaW5nRmxhZyApICE9PSAwOwor
CisJCQl2YXIgZGVwdGhNYXRlcmlhbCA9IGRlcHRoTWF0ZXJpYWxUZW1wbGF0ZS5jbG9uZSgpOwor
CQkJZGVwdGhNYXRlcmlhbC5tb3JwaFRhcmdldHMgPSB1c2VNb3JwaGluZzsKKwkJCWRlcHRoTWF0
ZXJpYWwuc2tpbm5pbmcgPSB1c2VTa2lubmluZzsKKworCQkJX2RlcHRoTWF0ZXJpYWxzWyBpIF0g
PSBkZXB0aE1hdGVyaWFsOworCisJCQl2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBTaGFkZXJN
YXRlcmlhbCggeworCQkJCWRlZmluZXM6IHsKKwkJCQkJJ1VTRV9TSEFET1dNQVAnOiAnJworCQkJ
CX0sCisJCQkJdW5pZm9ybXM6IGRpc3RhbmNlVW5pZm9ybXMsCisJCQkJdmVydGV4U2hhZGVyOiBk
aXN0YW5jZVNoYWRlci52ZXJ0ZXhTaGFkZXIsCisJCQkJZnJhZ21lbnRTaGFkZXI6IGRpc3RhbmNl
U2hhZGVyLmZyYWdtZW50U2hhZGVyLAorCQkJCW1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsCisJ
CQkJc2tpbm5pbmc6IHVzZVNraW5uaW5nLAorCQkJCWNsaXBwaW5nOiB0cnVlCisJCQl9ICk7CisK
KwkJCV9kaXN0YW5jZU1hdGVyaWFsc1sgaSBdID0gZGlzdGFuY2VNYXRlcmlhbDsKKworCQl9CisK
KwkJLy8KKworCQl2YXIgc2NvcGUgPSB0aGlzOworCisJCXRoaXMuZW5hYmxlZCA9IGZhbHNlOwor
CisJCXRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7CisJCXRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTsK
KworCQl0aGlzLnR5cGUgPSBQQ0ZTaGFkb3dNYXA7CisKKwkJdGhpcy5yZW5kZXJSZXZlcnNlU2lk
ZWQgPSB0cnVlOworCQl0aGlzLnJlbmRlclNpbmdsZVNpZGVkID0gdHJ1ZTsKKworCQl0aGlzLnJl
bmRlciA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHsKKworCQkJaWYgKCBzY29wZS5lbmFi
bGVkID09PSBmYWxzZSApIHJldHVybjsKKwkJCWlmICggc2NvcGUuYXV0b1VwZGF0ZSA9PT0gZmFs
c2UgJiYgc2NvcGUubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgcmV0dXJuOworCisJCQlpZiAoIF9s
aWdodFNoYWRvd3MubGVuZ3RoID09PSAwICkgcmV0dXJuOworCisJCQkvLyBTZXQgR0wgc3RhdGUg
Zm9yIGRlcHRoIG1hcC4KKwkJCV9zdGF0ZS5kaXNhYmxlKCBfZ2wuQkxFTkQgKTsKKwkJCV9zdGF0
ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCAxLCAxLCAxLCAxICk7CisJCQlfc3RhdGUuYnVmZmVy
cy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7CisJCQlfc3RhdGUuc2V0U2Npc3NvclRlc3QoIGZhbHNl
ICk7CisKKwkJCS8vIHJlbmRlciBkZXB0aCBtYXAKKworCQkJdmFyIGZhY2VDb3VudDsKKworCQkJ
Zm9yICggdmFyIGkgPSAwLCBpbCA9IF9saWdodFNoYWRvd3MubGVuZ3RoOyBpIDwgaWw7IGkgKysg
KSB7CisKKwkJCQl2YXIgbGlnaHQgPSBfbGlnaHRTaGFkb3dzWyBpIF07CisJCQkJdmFyIHNoYWRv
dyA9IGxpZ2h0LnNoYWRvdzsKKwkJCQl2YXIgaXNQb2ludExpZ2h0ID0gbGlnaHQgJiYgbGlnaHQu
aXNQb2ludExpZ2h0OworCisJCQkJaWYgKCBzaGFkb3cgPT09IHVuZGVmaW5lZCApIHsKKworCQkJ
CQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDonLCBsaWdodCwgJ2hhcyBubyBz
aGFkb3cuJyApOworCQkJCQljb250aW51ZTsKKworCQkJCX0KKworCQkJCXZhciBzaGFkb3dDYW1l
cmEgPSBzaGFkb3cuY2FtZXJhOworCisJCQkJX3NoYWRvd01hcFNpemUuY29weSggc2hhZG93Lm1h
cFNpemUgKTsKKwkJCQlfc2hhZG93TWFwU2l6ZS5taW4oIF9tYXhTaGFkb3dNYXBTaXplICk7CisK
KwkJCQlpZiAoIGlzUG9pbnRMaWdodCApIHsKKworCQkJCQl2YXIgdnBXaWR0aCA9IF9zaGFkb3dN
YXBTaXplLng7CisJCQkJCXZhciB2cEhlaWdodCA9IF9zaGFkb3dNYXBTaXplLnk7CisKKwkJCQkJ
Ly8gVGhlc2Ugdmlld3BvcnRzIG1hcCBhIGN1YmUtbWFwIG9udG8gYSAyRCB0ZXh0dXJlIHdpdGgg
dGhlCisJCQkJCS8vIGZvbGxvd2luZyBvcmllbnRhdGlvbjoKKwkJCQkJLy8KKwkJCQkJLy8gIHh6
WFoKKwkJCQkJLy8gICB5IFkKKwkJCQkJLy8KKwkJCQkJLy8gWCAtIFBvc2l0aXZlIHggZGlyZWN0
aW9uCisJCQkJCS8vIHggLSBOZWdhdGl2ZSB4IGRpcmVjdGlvbgorCQkJCQkvLyBZIC0gUG9zaXRp
dmUgeSBkaXJlY3Rpb24KKwkJCQkJLy8geSAtIE5lZ2F0aXZlIHkgZGlyZWN0aW9uCisJCQkJCS8v
IFogLSBQb3NpdGl2ZSB6IGRpcmVjdGlvbgorCQkJCQkvLyB6IC0gTmVnYXRpdmUgeiBkaXJlY3Rp
b24KKworCQkJCQkvLyBwb3NpdGl2ZSBYCisJCQkJCWN1YmUyRFZpZXdQb3J0c1sgMCBdLnNldCgg
dnBXaWR0aCAqIDIsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApOworCQkJCQkvLyBuZWdh
dGl2ZSBYCisJCQkJCWN1YmUyRFZpZXdQb3J0c1sgMSBdLnNldCggMCwgdnBIZWlnaHQsIHZwV2lk
dGgsIHZwSGVpZ2h0ICk7CisJCQkJCS8vIHBvc2l0aXZlIFoKKwkJCQkJY3ViZTJEVmlld1BvcnRz
WyAyIF0uc2V0KCB2cFdpZHRoICogMywgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7CisJ
CQkJCS8vIG5lZ2F0aXZlIFoKKwkJCQkJY3ViZTJEVmlld1BvcnRzWyAzIF0uc2V0KCB2cFdpZHRo
LCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTsKKwkJCQkJLy8gcG9zaXRpdmUgWQorCQkJ
CQljdWJlMkRWaWV3UG9ydHNbIDQgXS5zZXQoIHZwV2lkdGggKiAzLCAwLCB2cFdpZHRoLCB2cEhl
aWdodCApOworCQkJCQkvLyBuZWdhdGl2ZSBZCisJCQkJCWN1YmUyRFZpZXdQb3J0c1sgNSBdLnNl
dCggdnBXaWR0aCwgMCwgdnBXaWR0aCwgdnBIZWlnaHQgKTsKKworCQkJCQlfc2hhZG93TWFwU2l6
ZS54ICo9IDQuMDsKKwkJCQkJX3NoYWRvd01hcFNpemUueSAqPSAyLjA7CisKKwkJCQl9CisKKwkJ
CQlpZiAoIHNoYWRvdy5tYXAgPT09IG51bGwgKSB7CisKKwkJCQkJdmFyIHBhcnMgPSB7IG1pbkZp
bHRlcjogTmVhcmVzdEZpbHRlciwgbWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBmb3JtYXQ6IFJH
QkFGb3JtYXQgfTsKKworCQkJCQlzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBf
c2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7CisJCQkJCXNoYWRvdy5t
YXAudGV4dHVyZS5uYW1lID0gbGlnaHQubmFtZSArICIuc2hhZG93TWFwIjsKKworCQkJCQlzaGFk
b3dDYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOworCisJCQkJfQorCisJCQkJaWYgKCBz
aGFkb3cuaXNTcG90TGlnaHRTaGFkb3cgKSB7CisKKwkJCQkJc2hhZG93LnVwZGF0ZSggbGlnaHQg
KTsKKworCQkJCX0KKworCQkJCXZhciBzaGFkb3dNYXAgPSBzaGFkb3cubWFwOworCQkJCXZhciBz
aGFkb3dNYXRyaXggPSBzaGFkb3cubWF0cml4OworCisJCQkJX2xpZ2h0UG9zaXRpb25Xb3JsZC5z
ZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CisJCQkJc2hhZG93Q2Ft
ZXJhLnBvc2l0aW9uLmNvcHkoIF9saWdodFBvc2l0aW9uV29ybGQgKTsKKworCQkJCWlmICggaXNQ
b2ludExpZ2h0ICkgeworCisJCQkJCWZhY2VDb3VudCA9IDY7CisKKwkJCQkJLy8gZm9yIHBvaW50
IGxpZ2h0cyB3ZSBzZXQgdGhlIHNoYWRvdyBtYXRyaXggdG8gYmUgYSB0cmFuc2xhdGlvbi1vbmx5
IG1hdHJpeAorCQkJCQkvLyBlcXVhbCB0byBpbnZlcnNlIG9mIHRoZSBsaWdodCdzIHBvc2l0aW9u
CisKKwkJCQkJc2hhZG93TWF0cml4Lm1ha2VUcmFuc2xhdGlvbiggLSBfbGlnaHRQb3NpdGlvbldv
cmxkLngsIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC55LCAtIF9saWdodFBvc2l0aW9uV29ybGQueiAp
OworCisJCQkJfSBlbHNlIHsKKworCQkJCQlmYWNlQ291bnQgPSAxOworCisJCQkJCV9sb29rVGFy
Z2V0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7CisJ
CQkJCXNoYWRvd0NhbWVyYS5sb29rQXQoIF9sb29rVGFyZ2V0ICk7CisJCQkJCXNoYWRvd0NhbWVy
YS51cGRhdGVNYXRyaXhXb3JsZCgpOworCisJCQkJCS8vIGNvbXB1dGUgc2hhZG93IG1hdHJpeAor
CisJCQkJCXNoYWRvd01hdHJpeC5zZXQoCisJCQkJCQkwLjUsIDAuMCwgMC4wLCAwLjUsCisJCQkJ
CQkwLjAsIDAuNSwgMC4wLCAwLjUsCisJCQkJCQkwLjAsIDAuMCwgMC41LCAwLjUsCisJCQkJCQkw
LjAsIDAuMCwgMC4wLCAxLjAKKwkJCQkJKTsKKworCQkJCQlzaGFkb3dNYXRyaXgubXVsdGlwbHko
IHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7CisJCQkJCXNoYWRvd01hdHJpeC5tdWx0
aXBseSggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApOworCisJCQkJfQorCisJCQkJ
X3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggc2hhZG93TWFwICk7CisJCQkJX3JlbmRlcmVyLmNs
ZWFyKCk7CisKKwkJCQkvLyByZW5kZXIgc2hhZG93IG1hcCBmb3IgZWFjaCBjdWJlIGZhY2UgKGlm
IG9tbmktZGlyZWN0aW9uYWwpIG9yCisJCQkJLy8gcnVuIGEgc2luZ2xlIHBhc3MgaWYgbm90CisK
KwkJCQlmb3IgKCB2YXIgZmFjZSA9IDA7IGZhY2UgPCBmYWNlQ291bnQ7IGZhY2UgKysgKSB7CisK
KwkJCQkJaWYgKCBpc1BvaW50TGlnaHQgKSB7CisKKwkJCQkJCV9sb29rVGFyZ2V0LmNvcHkoIHNo
YWRvd0NhbWVyYS5wb3NpdGlvbiApOworCQkJCQkJX2xvb2tUYXJnZXQuYWRkKCBjdWJlRGlyZWN0
aW9uc1sgZmFjZSBdICk7CisJCQkJCQlzaGFkb3dDYW1lcmEudXAuY29weSggY3ViZVVwc1sgZmFj
ZSBdICk7CisJCQkJCQlzaGFkb3dDYW1lcmEubG9va0F0KCBfbG9va1RhcmdldCApOworCQkJCQkJ
c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7CisKKwkJCQkJCXZhciB2cERpbWVuc2lv
bnMgPSBjdWJlMkRWaWV3UG9ydHNbIGZhY2UgXTsKKwkJCQkJCV9zdGF0ZS52aWV3cG9ydCggdnBE
aW1lbnNpb25zICk7CisKKwkJCQkJfQorCisJCQkJCS8vIHVwZGF0ZSBjYW1lcmEgbWF0cmljZXMg
YW5kIGZydXN0dW0KKworCQkJCQlfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBz
aGFkb3dDYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52
ZXJzZSApOworCQkJCQlfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCAp
OworCisJCQkJCS8vIHNldCBvYmplY3QgbWF0cmljZXMgJiBmcnVzdHVtIGN1bGxpbmcKKworCQkJ
CQlyZW5kZXJPYmplY3QoIHNjZW5lLCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgaXNQb2ludExpZ2h0
ICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gUmVzdG9yZSBHTCBzdGF0ZS4KKwkJCXZhciBj
bGVhckNvbG9yID0gX3JlbmRlcmVyLmdldENsZWFyQ29sb3IoKTsKKwkJCXZhciBjbGVhckFscGhh
ID0gX3JlbmRlcmVyLmdldENsZWFyQWxwaGEoKTsKKwkJCV9yZW5kZXJlci5zZXRDbGVhckNvbG9y
KCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7CisKKwkJCXNjb3BlLm5lZWRzVXBkYXRlID0gZmFs
c2U7CisKKwkJfTsKKworCQlmdW5jdGlvbiBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIG1hdGVy
aWFsLCBpc1BvaW50TGlnaHQsIGxpZ2h0UG9zaXRpb25Xb3JsZCApIHsKKworCQkJdmFyIGdlb21l
dHJ5ID0gb2JqZWN0Lmdlb21ldHJ5OworCisJCQl2YXIgcmVzdWx0ID0gbnVsbDsKKworCQkJdmFy
IG1hdGVyaWFsVmFyaWFudHMgPSBfZGVwdGhNYXRlcmlhbHM7CisJCQl2YXIgY3VzdG9tTWF0ZXJp
YWwgPSBvYmplY3QuY3VzdG9tRGVwdGhNYXRlcmlhbDsKKworCQkJaWYgKCBpc1BvaW50TGlnaHQg
KSB7CisKKwkJCQltYXRlcmlhbFZhcmlhbnRzID0gX2Rpc3RhbmNlTWF0ZXJpYWxzOworCQkJCWN1
c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw7CisKKwkJCX0KKwor
CQkJaWYgKCAhIGN1c3RvbU1hdGVyaWFsICkgeworCisJCQkJdmFyIHVzZU1vcnBoaW5nID0gZmFs
c2U7CisKKwkJCQlpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyApIHsKKworCQkJCQlpZiAoIGdl
b21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisKKwkJCQkJCXVzZU1vcnBo
aW5nID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRl
cy5wb3NpdGlvbiAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoID4g
MDsKKworCQkJCQl9IGVsc2UgaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkg
eworCisJCQkJCQl1c2VNb3JwaGluZyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyAmJiBnZW9tZXRy
eS5tb3JwaFRhcmdldHMubGVuZ3RoID4gMDsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlpZiAo
IG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nID09PSBmYWxzZSApIHsK
KworCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5l
ZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Jywgb2JqZWN0ICk7CisK
KwkJCQl9CisKKwkJCQl2YXIgdXNlU2tpbm5pbmcgPSBvYmplY3QuaXNTa2lubmVkTWVzaCAmJiBt
YXRlcmlhbC5za2lubmluZzsKKworCQkJCXZhciB2YXJpYW50SW5kZXggPSAwOworCisJCQkJaWYg
KCB1c2VNb3JwaGluZyApIHZhcmlhbnRJbmRleCB8PSBfTW9ycGhpbmdGbGFnOworCQkJCWlmICgg
dXNlU2tpbm5pbmcgKSB2YXJpYW50SW5kZXggfD0gX1NraW5uaW5nRmxhZzsKKworCQkJCXJlc3Vs
dCA9IG1hdGVyaWFsVmFyaWFudHNbIHZhcmlhbnRJbmRleCBdOworCisJCQl9IGVsc2UgeworCisJ
CQkJcmVzdWx0ID0gY3VzdG9tTWF0ZXJpYWw7CisKKwkJCX0KKworCQkJaWYgKCBfcmVuZGVyZXIu
bG9jYWxDbGlwcGluZ0VuYWJsZWQgJiYKKwkJCQkJbWF0ZXJpYWwuY2xpcFNoYWRvd3MgPT09IHRy
dWUgJiYKKwkJCQkJbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMubGVuZ3RoICE9PSAwICkgeworCisJ
CQkJLy8gaW4gdGhpcyBjYXNlIHdlIG5lZWQgYSB1bmlxdWUgbWF0ZXJpYWwgaW5zdGFuY2UgcmVm
bGVjdGluZyB0aGUKKwkJCQkvLyBhcHByb3ByaWF0ZSBzdGF0ZQorCisJCQkJdmFyIGtleUEgPSBy
ZXN1bHQudXVpZCwga2V5QiA9IG1hdGVyaWFsLnV1aWQ7CisKKwkJCQl2YXIgbWF0ZXJpYWxzRm9y
VmFyaWFudCA9IF9tYXRlcmlhbENhY2hlWyBrZXlBIF07CisKKwkJCQlpZiAoIG1hdGVyaWFsc0Zv
clZhcmlhbnQgPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQltYXRlcmlhbHNGb3JWYXJpYW50ID0g
e307CisJCQkJCV9tYXRlcmlhbENhY2hlWyBrZXlBIF0gPSBtYXRlcmlhbHNGb3JWYXJpYW50Owor
CisJCQkJfQorCisJCQkJdmFyIGNhY2hlZE1hdGVyaWFsID0gbWF0ZXJpYWxzRm9yVmFyaWFudFsg
a2V5QiBdOworCisJCQkJaWYgKCBjYWNoZWRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgeworCisJ
CQkJCWNhY2hlZE1hdGVyaWFsID0gcmVzdWx0LmNsb25lKCk7CisJCQkJCW1hdGVyaWFsc0ZvclZh
cmlhbnRbIGtleUIgXSA9IGNhY2hlZE1hdGVyaWFsOworCisJCQkJfQorCisJCQkJcmVzdWx0ID0g
Y2FjaGVkTWF0ZXJpYWw7CisKKwkJCX0KKworCQkJcmVzdWx0LnZpc2libGUgPSBtYXRlcmlhbC52
aXNpYmxlOworCQkJcmVzdWx0LndpcmVmcmFtZSA9IG1hdGVyaWFsLndpcmVmcmFtZTsKKworCQkJ
dmFyIHNpZGUgPSBtYXRlcmlhbC5zaWRlOworCisJCQlpZiAoIHNjb3BlLnJlbmRlclNpbmdsZVNp
ZGVkICYmIHNpZGUgPT0gRG91YmxlU2lkZSApIHsKKworCQkJCXNpZGUgPSBGcm9udFNpZGU7CisK
KwkJCX0KKworCQkJaWYgKCBzY29wZS5yZW5kZXJSZXZlcnNlU2lkZWQgKSB7CisKKwkJCQlpZiAo
IHNpZGUgPT09IEZyb250U2lkZSApIHNpZGUgPSBCYWNrU2lkZTsKKwkJCQllbHNlIGlmICggc2lk
ZSA9PT0gQmFja1NpZGUgKSBzaWRlID0gRnJvbnRTaWRlOworCisJCQl9CisKKwkJCXJlc3VsdC5z
aWRlID0gc2lkZTsKKworCQkJcmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRv
d3M7CisJCQlyZXN1bHQuY2xpcHBpbmdQbGFuZXMgPSBtYXRlcmlhbC5jbGlwcGluZ1BsYW5lczsK
KworCQkJcmVzdWx0LndpcmVmcmFtZUxpbmV3aWR0aCA9IG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3
aWR0aDsKKwkJCXJlc3VsdC5saW5ld2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGg7CisKKwkJCWlm
ICggaXNQb2ludExpZ2h0ICYmIHJlc3VsdC51bmlmb3Jtcy5saWdodFBvcyAhPT0gdW5kZWZpbmVk
ICkgeworCisJCQkJcmVzdWx0LnVuaWZvcm1zLmxpZ2h0UG9zLnZhbHVlLmNvcHkoIGxpZ2h0UG9z
aXRpb25Xb3JsZCApOworCisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfQorCisJCWZ1
bmN0aW9uIHJlbmRlck9iamVjdCggb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgaXNQb2lu
dExpZ2h0ICkgeworCisJCQlpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjsK
KworCQkJdmFyIHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTsK
KworCQkJaWYgKCB2aXNpYmxlICYmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8
IG9iamVjdC5pc1BvaW50cyApICkgeworCisJCQkJaWYgKCBvYmplY3QuY2FzdFNoYWRvdyAmJiAo
ICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2Jq
ZWN0ICkgKSApIHsKKworCQkJCQlvYmplY3QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmlj
ZXMoIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG9iamVjdC5tYXRyaXhXb3JsZCAp
OworCisJCQkJCXZhciBnZW9tZXRyeSA9IF9vYmplY3RzLnVwZGF0ZSggb2JqZWN0ICk7CisJCQkJ
CXZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDsKKworCQkJCQlpZiAoIEFycmF5LmlzQXJy
YXkoIG1hdGVyaWFsICkgKSB7CisKKwkJCQkJCXZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7
CisKKwkJCQkJCWZvciAoIHZhciBrID0gMCwga2wgPSBncm91cHMubGVuZ3RoOyBrIDwga2w7IGsg
KysgKSB7CisKKwkJCQkJCQl2YXIgZ3JvdXAgPSBncm91cHNbIGsgXTsKKwkJCQkJCQl2YXIgZ3Jv
dXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07CisKKwkJCQkJCQlp
ZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkgeworCisJCQkJCQkJ
CXZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBncm91cE1hdGVy
aWFsLCBpc1BvaW50TGlnaHQsIF9saWdodFBvc2l0aW9uV29ybGQgKTsKKwkJCQkJCQkJX3JlbmRl
cmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggc2hhZG93Q2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgZGVw
dGhNYXRlcmlhbCwgb2JqZWN0LCBncm91cCApOworCisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJ
CQkJfSBlbHNlIGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHsKKworCQkJCQkJdmFyIGRlcHRoTWF0
ZXJpYWwgPSBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIG1hdGVyaWFsLCBpc1BvaW50TGlnaHQs
IF9saWdodFBvc2l0aW9uV29ybGQgKTsKKwkJCQkJCV9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJl
Y3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwg
bnVsbCApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQl2YXIgY2hpbGRyZW4gPSBv
YmplY3QuY2hpbGRyZW47CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0
aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQlyZW5kZXJPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNh
bWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKTsKKworCQkJfQorCisJCX0KKworCX0K
KworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisK
KwlmdW5jdGlvbiBXZWJHTEF0dHJpYnV0ZXMoIGdsICkgeworCisJCXZhciBidWZmZXJzID0ge307
CisKKwkJZnVuY3Rpb24gY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7CisK
KwkJCXZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTsKKwkJCXZhciB1c2FnZSA9IGF0dHJpYnV0
ZS5keW5hbWljID8gZ2wuRFlOQU1JQ19EUkFXIDogZ2wuU1RBVElDX0RSQVc7CisKKwkJCXZhciBi
dWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTsKKworCQkJZ2wuYmluZEJ1ZmZlciggYnVmZmVyVHlw
ZSwgYnVmZmVyICk7CisJCQlnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgdXNhZ2Ug
KTsKKworCQkJYXR0cmlidXRlLm9uVXBsb2FkQ2FsbGJhY2soKTsKKworCQkJdmFyIHR5cGUgPSBn
bC5GTE9BVDsKKworCQkJaWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSApIHsKKwor
CQkJCXR5cGUgPSBnbC5GTE9BVDsKKworCQkJfSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBG
bG9hdDY0QXJyYXkgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTEF0dHJpYnV0
ZXM6IFVuc3VwcG9ydGVkIGRhdGEgYnVmZmVyIGZvcm1hdDogRmxvYXQ2NEFycmF5LicgKTsKKwor
CQkJfSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSApIHsKKworCQkJCXR5
cGUgPSBnbC5VTlNJR05FRF9TSE9SVDsKKworCQkJfSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2Vv
ZiBJbnQxNkFycmF5ICkgeworCisJCQkJdHlwZSA9IGdsLlNIT1JUOworCisJCQl9IGVsc2UgaWYg
KCBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICkgeworCisJCQkJdHlwZSA9IGdsLlVOU0lH
TkVEX0lOVDsKKworCQkJfSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkg
eworCisJCQkJdHlwZSA9IGdsLklOVDsKKworCQkJfSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2Vv
ZiBJbnQ4QXJyYXkgKSB7CisKKwkJCQl0eXBlID0gZ2wuQllURTsKKworCQkJfSBlbHNlIGlmICgg
YXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5ICkgeworCisJCQkJdHlwZSA9IGdsLlVOU0lHTkVE
X0JZVEU7CisKKwkJCX0KKworCQkJcmV0dXJuIHsKKwkJCQlidWZmZXI6IGJ1ZmZlciwKKwkJCQl0
eXBlOiB0eXBlLAorCQkJCWJ5dGVzUGVyRWxlbWVudDogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQs
CisJCQkJdmVyc2lvbjogYXR0cmlidXRlLnZlcnNpb24KKwkJCX07CisKKwkJfQorCisJCWZ1bmN0
aW9uIHVwZGF0ZUJ1ZmZlciggYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7CisKKwkJ
CXZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTsKKwkJCXZhciB1cGRhdGVSYW5nZSA9IGF0dHJp
YnV0ZS51cGRhdGVSYW5nZTsKKworCQkJZ2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVy
ICk7CisKKwkJCWlmICggYXR0cmlidXRlLmR5bmFtaWMgPT09IGZhbHNlICkgeworCisJCQkJZ2wu
YnVmZmVyRGF0YSggYnVmZmVyVHlwZSwgYXJyYXksIGdsLlNUQVRJQ19EUkFXICk7CisKKwkJCX0g
ZWxzZSBpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAtIDEgKSB7CisKKwkJCQkvLyBOb3QgdXNp
bmcgdXBkYXRlIHJhbmdlcworCisJCQkJZ2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgMCwg
YXJyYXkgKTsKKworCQkJfSBlbHNlIGlmICggdXBkYXRlUmFuZ2UuY291bnQgPT09IDAgKSB7CisK
KwkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xPYmplY3RzLnVwZGF0ZUJ1ZmZlcjogZHlu
YW1pYyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUgbWFya2VkIGFzIG5lZWRzVXBkYXRlIGJ1dCB1cGRh
dGVSYW5nZS5jb3VudCBpcyAwLCBlbnN1cmUgeW91IGFyZSB1c2luZyBzZXQgbWV0aG9kcyBvciB1
cGRhdGluZyBtYW51YWxseS4nICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlnbC5idWZmZXJTdWJE
YXRhKCBidWZmZXJUeXBlLCB1cGRhdGVSYW5nZS5vZmZzZXQgKiBhcnJheS5CWVRFU19QRVJfRUxF
TUVOVCwKKwkJCQkJYXJyYXkuc3ViYXJyYXkoIHVwZGF0ZVJhbmdlLm9mZnNldCwgdXBkYXRlUmFu
Z2Uub2Zmc2V0ICsgdXBkYXRlUmFuZ2UuY291bnQgKSApOworCisJCQkJdXBkYXRlUmFuZ2UuY291
bnQgPSAtMTsgLy8gcmVzZXQgcmFuZ2UKKworCQkJfQorCisJCX0KKworCQkvLworCisJCWZ1bmN0
aW9uIGdldCggYXR0cmlidXRlICkgeworCisJCQlpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVk
QnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7CisKKwkJCXJldHVy
biBidWZmZXJzWyBhdHRyaWJ1dGUudXVpZCBdOworCisJCX0KKworCQlmdW5jdGlvbiByZW1vdmUo
IGF0dHJpYnV0ZSApIHsKKworCQkJaWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0
dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhOworCQkJCisJCQl2YXIgZGF0YSA9
IGJ1ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF07CisKKwkJCWlmICggZGF0YSApIHsKKworCQkJCWds
LmRlbGV0ZUJ1ZmZlciggZGF0YS5idWZmZXIgKTsKKworCQkJCWRlbGV0ZSBidWZmZXJzWyBhdHRy
aWJ1dGUudXVpZCBdOworCisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIHVwZGF0ZSggYXR0cmli
dXRlLCBidWZmZXJUeXBlICkgeworCisJCQlpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVm
ZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7CisKKwkJCXZhciBkYXRh
ID0gYnVmZmVyc1sgYXR0cmlidXRlLnV1aWQgXTsKKworCQkJaWYgKCBkYXRhID09PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCQlidWZmZXJzWyBhdHRyaWJ1dGUudXVpZCBdID0gY3JlYXRlQnVmZmVyKCBh
dHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKTsKKworCQkJfSBlbHNlIGlmICggZGF0YS52ZXJzaW9uIDwg
YXR0cmlidXRlLnZlcnNpb24gKSB7CisKKwkJCQl1cGRhdGVCdWZmZXIoIGRhdGEuYnVmZmVyLCBh
dHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKTsKKworCQkJCWRhdGEudmVyc2lvbiA9IGF0dHJpYnV0ZS52
ZXJzaW9uOworCisJCQl9CisKKwkJfQorCisJCXJldHVybiB7CisKKwkJCWdldDogZ2V0LAorCQkJ
cmVtb3ZlOiByZW1vdmUsCisJCQl1cGRhdGU6IHVwZGF0ZQorCisJCX07CisKKwl9CisKKwkvKioK
KwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgV2Vz
dExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorCSAqIEBhdXRob3IgYmhv
dXN0b24gLyBodHRwOi8vY2xhcmEuaW8KKwkgKi8KKworCWZ1bmN0aW9uIEV1bGVyKCB4LCB5LCB6
LCBvcmRlciApIHsKKworCQl0aGlzLl94ID0geCB8fCAwOworCQl0aGlzLl95ID0geSB8fCAwOwor
CQl0aGlzLl96ID0geiB8fCAwOworCQl0aGlzLl9vcmRlciA9IG9yZGVyIHx8IEV1bGVyLkRlZmF1
bHRPcmRlcjsKKworCX0KKworCUV1bGVyLlJvdGF0aW9uT3JkZXJzID0gWyAnWFlaJywgJ1laWCcs
ICdaWFknLCAnWFpZJywgJ1lYWicsICdaWVgnIF07CisKKwlFdWxlci5EZWZhdWx0T3JkZXIgPSAn
WFlaJzsKKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBFdWxlci5wcm90b3R5cGUsIHsKKwor
CQl4OiB7CisKKwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJcmV0dXJuIHRoaXMuX3g7CisK
KwkJCX0sCisKKwkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJCXRoaXMuX3ggPSB2
YWx1ZTsKKwkJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworCQkJfQorCisJCX0sCisKKwkJ
eTogeworCisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCXJldHVybiB0aGlzLl95OworCisJ
CQl9LAorCisJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQl0aGlzLl95ID0gdmFs
dWU7CisJCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CisKKwkJCX0KKworCQl9LAorCisJCXo6
IHsKKworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQlyZXR1cm4gdGhpcy5fejsKKworCQkJ
fSwKKworCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJdGhpcy5feiA9IHZhbHVl
OworCQkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisJCQl9CisKKwkJfSwKKworCQlvcmRl
cjogeworCisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCXJldHVybiB0aGlzLl9vcmRlcjsK
KworCQkJfSwKKworCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJdGhpcy5fb3Jk
ZXIgPSB2YWx1ZTsKKwkJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworCQkJfQorCisJCX0K
KworCX0gKTsKKworCU9iamVjdC5hc3NpZ24oIEV1bGVyLnByb3RvdHlwZSwgeworCisJCWlzRXVs
ZXI6IHRydWUsCisKKwkJc2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIG9yZGVyICkgeworCisJCQl0
aGlzLl94ID0geDsKKwkJCXRoaXMuX3kgPSB5OworCQkJdGhpcy5feiA9IHo7CisJCQl0aGlzLl9v
cmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyOworCisJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2so
KTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgewor
CisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMu
X3osIHRoaXMuX29yZGVyICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIGV1bGVyICkg
eworCisJCQl0aGlzLl94ID0gZXVsZXIuX3g7CisJCQl0aGlzLl95ID0gZXVsZXIuX3k7CisJCQl0
aGlzLl96ID0gZXVsZXIuX3o7CisJCQl0aGlzLl9vcmRlciA9IGV1bGVyLl9vcmRlcjsKKworCQkJ
dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJ
c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0sIG9yZGVyLCB1cGRhdGUgKSB7CisK
KwkJCXZhciBjbGFtcCA9IF9NYXRoLmNsYW1wOworCisJCQkvLyBhc3N1bWVzIHRoZSB1cHBlciAz
eDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKQorCisJCQl2
YXIgdGUgPSBtLmVsZW1lbnRzOworCQkJdmFyIG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0s
IG0xMyA9IHRlWyA4IF07CisJCQl2YXIgbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIz
ID0gdGVbIDkgXTsKKwkJCXZhciBtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0
ZVsgMTAgXTsKKworCQkJb3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjsKKworCQkJaWYgKCBv
cmRlciA9PT0gJ1hZWicgKSB7CisKKwkJCQl0aGlzLl95ID0gTWF0aC5hc2luKCBjbGFtcCggbTEz
LCAtIDEsIDEgKSApOworCisJCQkJaWYgKCBNYXRoLmFicyggbTEzICkgPCAwLjk5OTk5ICkgewor
CisJCQkJCXRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7CisJCQkJCXRoaXMuX3og
PSBNYXRoLmF0YW4yKCAtIG0xMiwgbTExICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXRoaXMu
X3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApOworCQkJCQl0aGlzLl96ID0gMDsKKworCQkJCX0K
KworCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkgeworCisJCQkJdGhpcy5feCA9IE1h
dGguYXNpbiggLSBjbGFtcCggbTIzLCAtIDEsIDEgKSApOworCisJCQkJaWYgKCBNYXRoLmFicygg
bTIzICkgPCAwLjk5OTk5ICkgeworCisJCQkJCXRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0z
MyApOworCQkJCQl0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMjIgKTsKKworCQkJCX0gZWxz
ZSB7CisKKwkJCQkJdGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTsKKwkJCQkJdGhp
cy5feiA9IDA7CisKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHsK
KworCQkJCXRoaXMuX3ggPSBNYXRoLmFzaW4oIGNsYW1wKCBtMzIsIC0gMSwgMSApICk7CisKKwkJ
CQlpZiAoIE1hdGguYWJzKCBtMzIgKSA8IDAuOTk5OTkgKSB7CisKKwkJCQkJdGhpcy5feSA9IE1h
dGguYXRhbjIoIC0gbTMxLCBtMzMgKTsKKwkJCQkJdGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEy
LCBtMjIgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJdGhpcy5feSA9IDA7CisJCQkJCXRoaXMu
X3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApOworCisJCQkJfQorCisJCQl9IGVsc2UgaWYgKCBv
cmRlciA9PT0gJ1pZWCcgKSB7CisKKwkJCQl0aGlzLl95ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBt
MzEsIC0gMSwgMSApICk7CisKKwkJCQlpZiAoIE1hdGguYWJzKCBtMzEgKSA8IDAuOTk5OTkgKSB7
CisKKwkJCQkJdGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTMzICk7CisJCQkJCXRoaXMuX3og
PSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQl0aGlzLl94
ID0gMDsKKwkJCQkJdGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTsKKworCQkJCX0K
KworCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkgeworCisJCQkJdGhpcy5feiA9IE1h
dGguYXNpbiggY2xhbXAoIG0yMSwgLSAxLCAxICkgKTsKKworCQkJCWlmICggTWF0aC5hYnMoIG0y
MSApIDwgMC45OTk5OSApIHsKKworCQkJCQl0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0y
MiApOworCQkJCQl0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApOworCisJCQkJfSBl
bHNlIHsKKworCQkJCQl0aGlzLl94ID0gMDsKKwkJCQkJdGhpcy5feSA9IE1hdGguYXRhbjIoIG0x
MywgbTMzICk7CisKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHsK
KworCQkJCXRoaXMuX3ogPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0xMiwgLSAxLCAxICkgKTsKKwor
CQkJCWlmICggTWF0aC5hYnMoIG0xMiApIDwgMC45OTk5OSApIHsKKworCQkJCQl0aGlzLl94ID0g
TWF0aC5hdGFuMiggbTMyLCBtMjIgKTsKKwkJCQkJdGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywg
bTExICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0y
MywgbTMzICk7CisJCQkJCXRoaXMuX3kgPSAwOworCisJCQkJfQorCisJCQl9IGVsc2UgeworCisJ
CQkJY29uc29sZS53YXJuKCAnVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBn
aXZlbiB1bnN1cHBvcnRlZCBvcmRlcjogJyArIG9yZGVyICk7CisKKwkJCX0KKworCQkJdGhpcy5f
b3JkZXIgPSBvcmRlcjsKKworCQkJaWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5vbkNoYW5n
ZUNhbGxiYWNrKCk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0RnJvbVF1YXRl
cm5pb246IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CisK
KwkJCXJldHVybiBmdW5jdGlvbiBzZXRGcm9tUXVhdGVybmlvbiggcSwgb3JkZXIsIHVwZGF0ZSAp
IHsKKworCQkJCW1hdHJpeC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApOworCisJCQkJ
cmV0dXJuIHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXgsIG9yZGVyLCB1cGRhdGUg
KTsKKworCQkJfTsKKworCQl9KCksCisKKwkJc2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uICggdiwg
b3JkZXIgKSB7CisKKwkJCXJldHVybiB0aGlzLnNldCggdi54LCB2LnksIHYueiwgb3JkZXIgfHwg
dGhpcy5fb3JkZXIgKTsKKworCQl9LAorCisJCXJlb3JkZXI6IGZ1bmN0aW9uICgpIHsKKworCQkJ
Ly8gV0FSTklORzogdGhpcyBkaXNjYXJkcyByZXZvbHV0aW9uIGluZm9ybWF0aW9uIC1iaG91c3Rv
bgorCisJCQl2YXIgcSA9IG5ldyBRdWF0ZXJuaW9uKCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiBy
ZW9yZGVyKCBuZXdPcmRlciApIHsKKworCQkJCXEuc2V0RnJvbUV1bGVyKCB0aGlzICk7CisKKwkJ
CQlyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbiggcSwgbmV3T3JkZXIgKTsKKworCQkJfTsK
KworCQl9KCksCisKKwkJZXF1YWxzOiBmdW5jdGlvbiAoIGV1bGVyICkgeworCisJCQlyZXR1cm4g
KCBldWxlci5feCA9PT0gdGhpcy5feCApICYmICggZXVsZXIuX3kgPT09IHRoaXMuX3kgKSAmJiAo
IGV1bGVyLl96ID09PSB0aGlzLl96ICkgJiYgKCBldWxlci5fb3JkZXIgPT09IHRoaXMuX29yZGVy
ICk7CisKKwkJfSwKKworCQlmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7CisKKwkJCXRo
aXMuX3ggPSBhcnJheVsgMCBdOworCQkJdGhpcy5feSA9IGFycmF5WyAxIF07CisJCQl0aGlzLl96
ID0gYXJyYXlbIDIgXTsKKwkJCWlmICggYXJyYXlbIDMgXSAhPT0gdW5kZWZpbmVkICkgdGhpcy5f
b3JkZXIgPSBhcnJheVsgMyBdOworCisJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworCQkJ
cmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQl0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZz
ZXQgKSB7CisKKwkJCWlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107CisJCQlp
ZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKKworCQkJYXJyYXlbIG9mZnNl
dCBdID0gdGhpcy5feDsKKwkJCWFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95OworCQkJYXJy
YXlbIG9mZnNldCArIDIgXSA9IHRoaXMuX3o7CisJCQlhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhp
cy5fb3JkZXI7CisKKwkJCXJldHVybiBhcnJheTsKKworCQl9LAorCisJCXRvVmVjdG9yMzogZnVu
Y3Rpb24gKCBvcHRpb25hbFJlc3VsdCApIHsKKworCQkJaWYgKCBvcHRpb25hbFJlc3VsdCApIHsK
KworCQkJCXJldHVybiBvcHRpb25hbFJlc3VsdC5zZXQoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMu
X3ogKTsKKworCQkJfSBlbHNlIHsKKworCQkJCXJldHVybiBuZXcgVmVjdG9yMyggdGhpcy5feCwg
dGhpcy5feSwgdGhpcy5feiApOworCisJCQl9CisKKwkJfSwKKworCQlvbkNoYW5nZTogZnVuY3Rp
b24gKCBjYWxsYmFjayApIHsKKworCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7
CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJb25DaGFuZ2VDYWxsYmFjazogZnVuY3Rp
b24gKCkge30KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21y
ZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBMYXllcnMoKSB7CisKKwkJdGhpcy5tYXNrID0g
MSB8IDA7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBMYXllcnMucHJvdG90eXBlLCB7CisKKwkJ
c2V0OiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7CisKKwkJCXRoaXMubWFzayA9IDEgPDwgY2hhbm5l
bCB8IDA7CisKKwkJfSwKKworCQllbmFibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHsKKworCQkJ
dGhpcy5tYXNrIHw9IDEgPDwgY2hhbm5lbCB8IDA7CisKKwkJfSwKKworCQl0b2dnbGU6IGZ1bmN0
aW9uICggY2hhbm5lbCApIHsKKworCQkJdGhpcy5tYXNrIF49IDEgPDwgY2hhbm5lbCB8IDA7CisK
KwkJfSwKKworCQlkaXNhYmxlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7CisKKwkJCXRoaXMubWFz
ayAmPSB+ICggMSA8PCBjaGFubmVsIHwgMCApOworCisJCX0sCisKKwkJdGVzdDogZnVuY3Rpb24g
KCBsYXllcnMgKSB7CisKKwkJCXJldHVybiAoIHRoaXMubWFzayAmIGxheWVycy5tYXNrICkgIT09
IDA7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8v
bXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNl
LworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICog
QGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisJICog
QGF1dGhvciBlbGVwaGFudGF0d29yayAvIHd3dy5lbGVwaGFudGF0d29yay5jaAorCSAqLworCisJ
dmFyIG9iamVjdDNESWQgPSAwOworCisJZnVuY3Rpb24gT2JqZWN0M0QoKSB7CisKKwkJT2JqZWN0
LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBvYmplY3QzRElkICsrIH0gKTsK
KworCQl0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKKworCQl0aGlzLm5hbWUgPSAn
JzsKKwkJdGhpcy50eXBlID0gJ09iamVjdDNEJzsKKworCQl0aGlzLnBhcmVudCA9IG51bGw7CisJ
CXRoaXMuY2hpbGRyZW4gPSBbXTsKKworCQl0aGlzLnVwID0gT2JqZWN0M0QuRGVmYXVsdFVwLmNs
b25lKCk7CisKKwkJdmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIHJvdGF0aW9u
ID0gbmV3IEV1bGVyKCk7CisJCXZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTsKKwkJ
dmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTsKKworCQlmdW5jdGlvbiBvblJvdGF0
aW9uQ2hhbmdlKCkgeworCisJCQlxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggcm90YXRpb24sIGZh
bHNlICk7CisKKwkJfQorCisJCWZ1bmN0aW9uIG9uUXVhdGVybmlvbkNoYW5nZSgpIHsKKworCQkJ
cm90YXRpb24uc2V0RnJvbVF1YXRlcm5pb24oIHF1YXRlcm5pb24sIHVuZGVmaW5lZCwgZmFsc2Ug
KTsKKworCQl9CisKKwkJcm90YXRpb24ub25DaGFuZ2UoIG9uUm90YXRpb25DaGFuZ2UgKTsKKwkJ
cXVhdGVybmlvbi5vbkNoYW5nZSggb25RdWF0ZXJuaW9uQ2hhbmdlICk7CisKKwkJT2JqZWN0LmRl
ZmluZVByb3BlcnRpZXMoIHRoaXMsIHsKKwkJCXBvc2l0aW9uOiB7CisJCQkJZW51bWVyYWJsZTog
dHJ1ZSwKKwkJCQl2YWx1ZTogcG9zaXRpb24KKwkJCX0sCisJCQlyb3RhdGlvbjogeworCQkJCWVu
dW1lcmFibGU6IHRydWUsCisJCQkJdmFsdWU6IHJvdGF0aW9uCisJCQl9LAorCQkJcXVhdGVybmlv
bjogeworCQkJCWVudW1lcmFibGU6IHRydWUsCisJCQkJdmFsdWU6IHF1YXRlcm5pb24KKwkJCX0s
CisJCQlzY2FsZTogeworCQkJCWVudW1lcmFibGU6IHRydWUsCisJCQkJdmFsdWU6IHNjYWxlCisJ
CQl9LAorCQkJbW9kZWxWaWV3TWF0cml4OiB7CisJCQkJdmFsdWU6IG5ldyBNYXRyaXg0KCkKKwkJ
CX0sCisJCQlub3JtYWxNYXRyaXg6IHsKKwkJCQl2YWx1ZTogbmV3IE1hdHJpeDMoKQorCQkJfQor
CQl9ICk7CisKKwkJdGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpOworCQl0aGlzLm1hdHJpeFdv
cmxkID0gbmV3IE1hdHJpeDQoKTsKKworCQl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBPYmplY3Qz
RC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZTsKKwkJdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRl
ID0gZmFsc2U7CisKKwkJdGhpcy5sYXllcnMgPSBuZXcgTGF5ZXJzKCk7CisJCXRoaXMudmlzaWJs
ZSA9IHRydWU7CisKKwkJdGhpcy5jYXN0U2hhZG93ID0gZmFsc2U7CisJCXRoaXMucmVjZWl2ZVNo
YWRvdyA9IGZhbHNlOworCisJCXRoaXMuZnJ1c3R1bUN1bGxlZCA9IHRydWU7CisJCXRoaXMucmVu
ZGVyT3JkZXIgPSAwOworCisJCXRoaXMudXNlckRhdGEgPSB7fTsKKwl9CisKKwlPYmplY3QzRC5E
ZWZhdWx0VXAgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApOworCU9iamVjdDNELkRlZmF1bHRNYXRy
aXhBdXRvVXBkYXRlID0gdHJ1ZTsKKworCU9iamVjdC5hc3NpZ24oIE9iamVjdDNELnByb3RvdHlw
ZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwgeworCisJCWlzT2JqZWN0M0Q6IHRydWUsCisK
KwkJb25CZWZvcmVSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LAorCQlvbkFmdGVyUmVuZGVyOiBmdW5j
dGlvbiAoKSB7fSwKKworCQlhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7CisKKwkJ
CXRoaXMubWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeCwgdGhpcy5tYXRyaXggKTsKKwor
CQkJdGhpcy5tYXRyaXguZGVjb21wb3NlKCB0aGlzLnBvc2l0aW9uLCB0aGlzLnF1YXRlcm5pb24s
IHRoaXMuc2NhbGUgKTsKKworCQl9LAorCisJCWFwcGx5UXVhdGVybmlvbjogZnVuY3Rpb24gKCBx
ICkgeworCisJCQl0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHEgKTsKKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQlzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICgg
YXhpcywgYW5nbGUgKSB7CisKKwkJCS8vIGFzc3VtZXMgYXhpcyBpcyBub3JtYWxpemVkCisKKwkJ
CXRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApOworCisJCX0s
CisKKwkJc2V0Um90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7CisKKwkJCXRo
aXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyLCB0cnVlICk7CisKKwkJfSwKKworCQlz
ZXRSb3RhdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHsKKworCQkJLy8gYXNzdW1lcyB0
aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxl
ZCkKKworCQkJdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbSApOworCisJ
CX0sCisKKwkJc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkgeworCisJ
CQkvLyBhc3N1bWVzIHEgaXMgbm9ybWFsaXplZAorCisJCQl0aGlzLnF1YXRlcm5pb24uY29weSgg
cSApOworCisJCX0sCisKKwkJcm90YXRlT25BeGlzOiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIHJv
dGF0ZSBvYmplY3Qgb24gYXhpcyBpbiBvYmplY3Qgc3BhY2UKKwkJCS8vIGF4aXMgaXMgYXNzdW1l
ZCB0byBiZSBub3JtYWxpemVkCisKKwkJCXZhciBxMSA9IG5ldyBRdWF0ZXJuaW9uKCk7CisKKwkJ
CXJldHVybiBmdW5jdGlvbiByb3RhdGVPbkF4aXMoIGF4aXMsIGFuZ2xlICkgeworCisJCQkJcTEu
c2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTsKKworCQkJCXRoaXMucXVhdGVybmlvbi5t
dWx0aXBseSggcTEgKTsKKworCQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKwor
CQlyb3RhdGVYOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCAxLCAw
LCAwICk7CisKKwkJCXJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHsKKworCQkJCXJl
dHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7CisKKwkJCX07CisKKwkJfSgpLAor
CisJCXJvdGF0ZVk6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoIDAs
IDEsIDAgKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkgeworCisJCQkJ
cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTsKKworCQkJfTsKKworCQl9KCks
CisKKwkJcm90YXRlWjogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygg
MCwgMCwgMSApOworCisJCQlyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7CisKKwkJ
CQlyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApOworCisJCQl9OworCisJCX0o
KSwKKworCQl0cmFuc2xhdGVPbkF4aXM6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gdHJhbnNsYXRl
IG9iamVjdCBieSBkaXN0YW5jZSBhbG9uZyBheGlzIGluIG9iamVjdCBzcGFjZQorCQkJLy8gYXhp
cyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQKKworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMo
KTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2Ug
KSB7CisKKwkJCQl2MS5jb3B5KCBheGlzICkuYXBwbHlRdWF0ZXJuaW9uKCB0aGlzLnF1YXRlcm5p
b24gKTsKKworCQkJCXRoaXMucG9zaXRpb24uYWRkKCB2MS5tdWx0aXBseVNjYWxhciggZGlzdGFu
Y2UgKSApOworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCXRyYW5z
bGF0ZVg6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAg
KTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVgoIGRpc3RhbmNlICkgeworCisJCQkJ
cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTsKKworCQkJfTsKKwor
CQl9KCksCisKKwkJdHJhbnNsYXRlWTogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdjEgPSBuZXcg
VmVjdG9yMyggMCwgMSwgMCApOworCisJCQlyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWSggZGlz
dGFuY2UgKSB7CisKKwkJCQlyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5j
ZSApOworCisJCQl9OworCisJCX0oKSwKKworCQl0cmFuc2xhdGVaOiBmdW5jdGlvbiAoKSB7CisK
KwkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAwLCAxICk7CisKKwkJCXJldHVybiBmdW5jdGlv
biB0cmFuc2xhdGVaKCBkaXN0YW5jZSApIHsKKworCQkJCXJldHVybiB0aGlzLnRyYW5zbGF0ZU9u
QXhpcyggdjEsIGRpc3RhbmNlICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWxvY2FsVG9Xb3Js
ZDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7CisKKwkJCXJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0
KCB0aGlzLm1hdHJpeFdvcmxkICk7CisKKwkJfSwKKworCQl3b3JsZFRvTG9jYWw6IGZ1bmN0aW9u
ICgpIHsKKworCQkJdmFyIG0xID0gbmV3IE1hdHJpeDQoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9u
IHdvcmxkVG9Mb2NhbCggdmVjdG9yICkgeworCisJCQkJcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJp
eDQoIG0xLmdldEludmVyc2UoIHRoaXMubWF0cml4V29ybGQgKSApOworCisJCQl9OworCisJCX0o
KSwKKworCQlsb29rQXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gVGhpcyBtZXRob2QgZG9lcyBu
b3Qgc3VwcG9ydCBvYmplY3RzIHdpdGggcm90YXRlZCBhbmQvb3IgdHJhbnNsYXRlZCBwYXJlbnQo
cykKKworCQkJdmFyIG0xID0gbmV3IE1hdHJpeDQoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGxv
b2tBdCggdmVjdG9yICkgeworCisJCQkJaWYgKCB0aGlzLmlzQ2FtZXJhICkgeworCisJCQkJCW0x
Lmxvb2tBdCggdGhpcy5wb3NpdGlvbiwgdmVjdG9yLCB0aGlzLnVwICk7CisKKwkJCQl9IGVsc2Ug
eworCisJCQkJCW0xLmxvb2tBdCggdmVjdG9yLCB0aGlzLnBvc2l0aW9uLCB0aGlzLnVwICk7CisK
KwkJCQl9CisKKwkJCQl0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtMSAp
OworCisJCQl9OworCisJCX0oKSwKKworCQlhZGQ6IGZ1bmN0aW9uICggb2JqZWN0ICkgeworCisJ
CQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkgeworCisJCQkJZm9yICggdmFyIGkgPSAwOyBp
IDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHsKKworCQkJCQl0aGlzLmFkZCggYXJndW1lbnRz
WyBpIF0gKTsKKworCQkJCX0KKworCQkJCXJldHVybiB0aGlzOworCisJCQl9CisKKwkJCWlmICgg
b2JqZWN0ID09PSB0aGlzICkgeworCisJCQkJY29uc29sZS5lcnJvciggIlRIUkVFLk9iamVjdDNE
LmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLiIsIG9iamVj
dCApOworCQkJCXJldHVybiB0aGlzOworCisJCQl9CisKKwkJCWlmICggKCBvYmplY3QgJiYgb2Jq
ZWN0LmlzT2JqZWN0M0QgKSApIHsKKworCQkJCWlmICggb2JqZWN0LnBhcmVudCAhPT0gbnVsbCAp
IHsKKworCQkJCQlvYmplY3QucGFyZW50LnJlbW92ZSggb2JqZWN0ICk7CisKKwkJCQl9CisKKwkJ
CQlvYmplY3QucGFyZW50ID0gdGhpczsKKwkJCQlvYmplY3QuZGlzcGF0Y2hFdmVudCggeyB0eXBl
OiAnYWRkZWQnIH0gKTsKKworCQkJCXRoaXMuY2hpbGRyZW4ucHVzaCggb2JqZWN0ICk7CisKKwkJ
CX0gZWxzZSB7CisKKwkJCQljb25zb2xlLmVycm9yKCAiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmpl
Y3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELiIsIG9iamVjdCApOworCisJCQl9
CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJcmVtb3ZlOiBmdW5jdGlvbiAoIG9iamVj
dCApIHsKKworCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHsKKworCQkJCWZvciAoIHZh
ciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKysgKSB7CisKKwkJCQkJdGhpcy5yZW1v
dmUoIGFyZ3VtZW50c1sgaSBdICk7CisKKwkJCQl9CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJ
fQorCisJCQl2YXIgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YoIG9iamVjdCApOworCisJ
CQlpZiAoIGluZGV4ICE9PSAtIDEgKSB7CisKKwkJCQlvYmplY3QucGFyZW50ID0gbnVsbDsKKwor
CQkJCW9iamVjdC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdyZW1vdmVkJyB9ICk7CisKKwkJCQl0
aGlzLmNoaWxkcmVuLnNwbGljZSggaW5kZXgsIDEgKTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhp
czsKKwkJCQorCQl9LAorCisJCWdldE9iamVjdEJ5SWQ6IGZ1bmN0aW9uICggaWQgKSB7CisKKwkJ
CXJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICdpZCcsIGlkICk7CisKKwkJfSwKKwor
CQlnZXRPYmplY3RCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHsKKworCQkJcmV0dXJuIHRoaXMu
Z2V0T2JqZWN0QnlQcm9wZXJ0eSggJ25hbWUnLCBuYW1lICk7CisKKwkJfSwKKworCQlnZXRPYmpl
Y3RCeVByb3BlcnR5OiBmdW5jdGlvbiAoIG5hbWUsIHZhbHVlICkgeworCisJCQlpZiAoIHRoaXNb
IG5hbWUgXSA9PT0gdmFsdWUgKSByZXR1cm4gdGhpczsKKworCQkJZm9yICggdmFyIGkgPSAwLCBs
ID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJdmFyIGNoaWxk
ID0gdGhpcy5jaGlsZHJlblsgaSBdOworCQkJCXZhciBvYmplY3QgPSBjaGlsZC5nZXRPYmplY3RC
eVByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOworCisJCQkJaWYgKCBvYmplY3QgIT09IHVuZGVmaW5l
ZCApIHsKKworCQkJCQlyZXR1cm4gb2JqZWN0OworCisJCQkJfQorCisJCQl9CisKKwkJCXJldHVy
biB1bmRlZmluZWQ7CisKKwkJfSwKKworCQlnZXRXb3JsZFBvc2l0aW9uOiBmdW5jdGlvbiAoIG9w
dGlvbmFsVGFyZ2V0ICkgeworCisJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3
IFZlY3RvcjMoKTsKKworCQkJdGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApOworCisJCQly
ZXR1cm4gcmVzdWx0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApOwor
CisJCX0sCisKKwkJZ2V0V29ybGRRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBw
b3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMygpOwor
CisJCQlyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRRdWF0ZXJuaW9uKCBvcHRpb25hbFRhcmdldCAp
IHsKKworCQkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgUXVhdGVybmlvbigp
OworCisJCQkJdGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApOworCisJCQkJdGhpcy5tYXRy
aXhXb3JsZC5kZWNvbXBvc2UoIHBvc2l0aW9uLCByZXN1bHQsIHNjYWxlICk7CisKKwkJCQlyZXR1
cm4gcmVzdWx0OworCisJCQl9OworCisJCX0oKSwKKworCQlnZXRXb3JsZFJvdGF0aW9uOiBmdW5j
dGlvbiAoKSB7CisKKwkJCXZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTsKKworCQkJ
cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkUm90YXRpb24oIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJ
CQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBFdWxlcigpOworCisJCQkJdGhp
cy5nZXRXb3JsZFF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTsKKworCQkJCXJldHVybiByZXN1bHQu
c2V0RnJvbVF1YXRlcm5pb24oIHF1YXRlcm5pb24sIHRoaXMucm90YXRpb24ub3JkZXIsIGZhbHNl
ICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWdldFdvcmxkU2NhbGU6IGZ1bmN0aW9uICgpIHsK
KworCQkJdmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciBxdWF0ZXJuaW9uID0g
bmV3IFF1YXRlcm5pb24oKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkU2NhbGUoIG9w
dGlvbmFsVGFyZ2V0ICkgeworCisJCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5l
dyBWZWN0b3IzKCk7CisKKwkJCQl0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7CisKKwkJ
CQl0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHJlc3Vs
dCApOworCisJCQkJcmV0dXJuIHJlc3VsdDsKKworCQkJfTsKKworCQl9KCksCisKKwkJZ2V0V29y
bGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVh
dGVybmlvbigpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGREaXJlY3Rpb24oIG9wdGlv
bmFsVGFyZ2V0ICkgeworCisJCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBW
ZWN0b3IzKCk7CisKKwkJCQl0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApOwor
CisJCQkJcmV0dXJuIHJlc3VsdC5zZXQoIDAsIDAsIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRl
cm5pb24gKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJcmF5Y2FzdDogZnVuY3Rpb24gKCkge30s
CisKKwkJdHJhdmVyc2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7CisKKwkJCWNhbGxiYWNrKCB0
aGlzICk7CisKKwkJCXZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CisKKwkJCWZvciAoIHZh
ciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQljaGls
ZHJlblsgaSBdLnRyYXZlcnNlKCBjYWxsYmFjayApOworCisJCQl9CisKKwkJfSwKKworCQl0cmF2
ZXJzZVZpc2libGU6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7CisKKwkJCWlmICggdGhpcy52aXNp
YmxlID09PSBmYWxzZSApIHJldHVybjsKKworCQkJY2FsbGJhY2soIHRoaXMgKTsKKworCQkJdmFy
IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKKworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hp
bGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCWNoaWxkcmVuWyBpIF0udHJhdmVy
c2VWaXNpYmxlKCBjYWxsYmFjayApOworCisJCQl9CisKKwkJfSwKKworCQl0cmF2ZXJzZUFuY2Vz
dG9yczogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKKworCQkJdmFyIHBhcmVudCA9IHRoaXMucGFy
ZW50OworCisJCQlpZiAoIHBhcmVudCAhPT0gbnVsbCApIHsKKworCQkJCWNhbGxiYWNrKCBwYXJl
bnQgKTsKKworCQkJCXBhcmVudC50cmF2ZXJzZUFuY2VzdG9ycyggY2FsbGJhY2sgKTsKKworCQkJ
fQorCisJCX0sCisKKwkJdXBkYXRlTWF0cml4OiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMubWF0
cml4LmNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSAp
OworCisJCQl0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOworCisJCX0sCisKKwkJ
dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7CisKKwkJCWlmICggdGhpcy5t
YXRyaXhBdXRvVXBkYXRlICkgdGhpcy51cGRhdGVNYXRyaXgoKTsKKworCQkJaWYgKCB0aGlzLm1h
dHJpeFdvcmxkTmVlZHNVcGRhdGUgfHwgZm9yY2UgKSB7CisKKwkJCQlpZiAoIHRoaXMucGFyZW50
ID09PSBudWxsICkgeworCisJCQkJCXRoaXMubWF0cml4V29ybGQuY29weSggdGhpcy5tYXRyaXgg
KTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJdGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJp
Y2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTsKKworCQkJCX0KKwor
CQkJCXRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlOworCisJCQkJZm9yY2UgPSB0
cnVlOworCisJCQl9CisKKwkJCS8vIHVwZGF0ZSBjaGlsZHJlbgorCisJCQl2YXIgY2hpbGRyZW4g
PSB0aGlzLmNoaWxkcmVuOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5n
dGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJY2hpbGRyZW5bIGkgXS51cGRhdGVNYXRyaXhXb3Js
ZCggZm9yY2UgKTsKKworCQkJfQorCisJCX0sCisKKwkJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEg
KSB7CisKKwkJCS8vIG1ldGEgaXMgJycgd2hlbiBjYWxsZWQgZnJvbSBKU09OLnN0cmluZ2lmeQor
CQkJdmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGEgPT09ICcn
ICk7CisKKwkJCXZhciBvdXRwdXQgPSB7fTsKKworCQkJLy8gbWV0YSBpcyBhIGhhc2ggdXNlZCB0
byBjb2xsZWN0IGdlb21ldHJpZXMsIG1hdGVyaWFscy4KKwkJCS8vIG5vdCBwcm92aWRpbmcgaXQg
aW1wbGllcyB0aGF0IHRoaXMgaXMgdGhlIHJvb3Qgb2JqZWN0CisJCQkvLyBiZWluZyBzZXJpYWxp
emVkLgorCQkJaWYgKCBpc1Jvb3RPYmplY3QgKSB7CisKKwkJCQkvLyBpbml0aWFsaXplIG1ldGEg
b2JqCisJCQkJbWV0YSA9IHsKKwkJCQkJZ2VvbWV0cmllczoge30sCisJCQkJCW1hdGVyaWFsczog
e30sCisJCQkJCXRleHR1cmVzOiB7fSwKKwkJCQkJaW1hZ2VzOiB7fQorCQkJCX07CisKKwkJCQlv
dXRwdXQubWV0YWRhdGEgPSB7CisJCQkJCXZlcnNpb246IDQuNSwKKwkJCQkJdHlwZTogJ09iamVj
dCcsCisJCQkJCWdlbmVyYXRvcjogJ09iamVjdDNELnRvSlNPTicKKwkJCQl9OworCisJCQl9CisK
KwkJCS8vIHN0YW5kYXJkIE9iamVjdDNEIHNlcmlhbGl6YXRpb24KKworCQkJdmFyIG9iamVjdCA9
IHt9OworCisJCQlvYmplY3QudXVpZCA9IHRoaXMudXVpZDsKKwkJCW9iamVjdC50eXBlID0gdGhp
cy50eXBlOworCisJCQlpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBvYmplY3QubmFtZSA9IHRoaXMu
bmFtZTsKKwkJCWlmICggSlNPTi5zdHJpbmdpZnkoIHRoaXMudXNlckRhdGEgKSAhPT0gJ3t9JyAp
IG9iamVjdC51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7CisJCQlpZiAoIHRoaXMuY2FzdFNoYWRv
dyA9PT0gdHJ1ZSApIG9iamVjdC5jYXN0U2hhZG93ID0gdHJ1ZTsKKwkJCWlmICggdGhpcy5yZWNl
aXZlU2hhZG93ID09PSB0cnVlICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSB0cnVlOworCQkJaWYg
KCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgb2JqZWN0LnZpc2libGUgPSBmYWxzZTsKKworCQkJ
b2JqZWN0Lm1hdHJpeCA9IHRoaXMubWF0cml4LnRvQXJyYXkoKTsKKworCQkJLy8KKworCQkJZnVu
Y3Rpb24gc2VyaWFsaXplKCBsaWJyYXJ5LCBlbGVtZW50ICkgeworCisJCQkJaWYgKCBsaWJyYXJ5
WyBlbGVtZW50LnV1aWQgXSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCWxpYnJhcnlbIGVsZW1l
bnQudXVpZCBdID0gZWxlbWVudC50b0pTT04oIG1ldGEgKTsKKworCQkJCX0KKworCQkJCXJldHVy
biBlbGVtZW50LnV1aWQ7CisKKwkJCX0KKworCQkJaWYgKCB0aGlzLmdlb21ldHJ5ICE9PSB1bmRl
ZmluZWQgKSB7CisKKwkJCQlvYmplY3QuZ2VvbWV0cnkgPSBzZXJpYWxpemUoIG1ldGEuZ2VvbWV0
cmllcywgdGhpcy5nZW9tZXRyeSApOworCisJCQl9CisKKwkJCWlmICggdGhpcy5tYXRlcmlhbCAh
PT0gdW5kZWZpbmVkICkgeworCisJCQkJaWYgKCBBcnJheS5pc0FycmF5KCB0aGlzLm1hdGVyaWFs
ICkgKSB7CisKKwkJCQkJdmFyIHV1aWRzID0gW107CisKKwkJCQkJZm9yICggdmFyIGkgPSAwLCBs
ID0gdGhpcy5tYXRlcmlhbC5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJCQl1dWlkcy5w
dXNoKCBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsWyBpIF0gKSApOwor
CisJCQkJCX0KKworCQkJCQlvYmplY3QubWF0ZXJpYWwgPSB1dWlkczsKKworCQkJCX0gZWxzZSB7
CisKKwkJCQkJb2JqZWN0Lm1hdGVyaWFsID0gc2VyaWFsaXplKCBtZXRhLm1hdGVyaWFscywgdGhp
cy5tYXRlcmlhbCApOworCisJCQkJfQorCisJCQl9CisKKwkJCS8vCisKKwkJCWlmICggdGhpcy5j
aGlsZHJlbi5sZW5ndGggPiAwICkgeworCisJCQkJb2JqZWN0LmNoaWxkcmVuID0gW107CisKKwkJ
CQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHsKKwor
CQkJCQlvYmplY3QuY2hpbGRyZW4ucHVzaCggdGhpcy5jaGlsZHJlblsgaSBdLnRvSlNPTiggbWV0
YSApLm9iamVjdCApOworCisJCQkJfQorCisJCQl9CisKKwkJCWlmICggaXNSb290T2JqZWN0ICkg
eworCisJCQkJdmFyIGdlb21ldHJpZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmdlb21ldHJp
ZXMgKTsKKwkJCQl2YXIgbWF0ZXJpYWxzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5tYXRlcmlh
bHMgKTsKKwkJCQl2YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVz
ICk7CisJCQkJdmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7CisK
KwkJCQlpZiAoIGdlb21ldHJpZXMubGVuZ3RoID4gMCApIG91dHB1dC5nZW9tZXRyaWVzID0gZ2Vv
bWV0cmllczsKKwkJCQlpZiAoIG1hdGVyaWFscy5sZW5ndGggPiAwICkgb3V0cHV0Lm1hdGVyaWFs
cyA9IG1hdGVyaWFsczsKKwkJCQlpZiAoIHRleHR1cmVzLmxlbmd0aCA+IDAgKSBvdXRwdXQudGV4
dHVyZXMgPSB0ZXh0dXJlczsKKwkJCQlpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgb3V0cHV0Lmlt
YWdlcyA9IGltYWdlczsKKworCQkJfQorCisJCQlvdXRwdXQub2JqZWN0ID0gb2JqZWN0OworCisJ
CQlyZXR1cm4gb3V0cHV0OworCisJCQkvLyBleHRyYWN0IGRhdGEgZnJvbSB0aGUgY2FjaGUgaGFz
aAorCQkJLy8gcmVtb3ZlIG1ldGFkYXRhIG9uIGVhY2ggaXRlbQorCQkJLy8gYW5kIHJldHVybiBh
cyBhcnJheQorCQkJZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7CisKKwkJCQl2
YXIgdmFsdWVzID0gW107CisJCQkJZm9yICggdmFyIGtleSBpbiBjYWNoZSApIHsKKworCQkJCQl2
YXIgZGF0YSA9IGNhY2hlWyBrZXkgXTsKKwkJCQkJZGVsZXRlIGRhdGEubWV0YWRhdGE7CisJCQkJ
CXZhbHVlcy5wdXNoKCBkYXRhICk7CisKKwkJCQl9CisJCQkJcmV0dXJuIHZhbHVlczsKKworCQkJ
fQorCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9uICggcmVjdXJzaXZlICkgeworCisJCQlyZXR1
cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzLCByZWN1cnNpdmUgKTsKKworCQl9
LAorCisJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7CisKKwkJCWlmICgg
cmVjdXJzaXZlID09PSB1bmRlZmluZWQgKSByZWN1cnNpdmUgPSB0cnVlOworCisJCQl0aGlzLm5h
bWUgPSBzb3VyY2UubmFtZTsKKworCQkJdGhpcy51cC5jb3B5KCBzb3VyY2UudXAgKTsKKworCQkJ
dGhpcy5wb3NpdGlvbi5jb3B5KCBzb3VyY2UucG9zaXRpb24gKTsKKwkJCXRoaXMucXVhdGVybmlv
bi5jb3B5KCBzb3VyY2UucXVhdGVybmlvbiApOworCQkJdGhpcy5zY2FsZS5jb3B5KCBzb3VyY2Uu
c2NhbGUgKTsKKworCQkJdGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApOworCQkJdGhp
cy5tYXRyaXhXb3JsZC5jb3B5KCBzb3VyY2UubWF0cml4V29ybGQgKTsKKworCQkJdGhpcy5tYXRy
aXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7CisJCQl0aGlzLm1hdHJpeFdv
cmxkTmVlZHNVcGRhdGUgPSBzb3VyY2UubWF0cml4V29ybGROZWVkc1VwZGF0ZTsKKworCQkJdGhp
cy5sYXllcnMubWFzayA9IHNvdXJjZS5sYXllcnMubWFzazsKKwkJCXRoaXMudmlzaWJsZSA9IHNv
dXJjZS52aXNpYmxlOworCisJCQl0aGlzLmNhc3RTaGFkb3cgPSBzb3VyY2UuY2FzdFNoYWRvdzsK
KwkJCXRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93OworCisJCQl0aGlz
LmZydXN0dW1DdWxsZWQgPSBzb3VyY2UuZnJ1c3R1bUN1bGxlZDsKKwkJCXRoaXMucmVuZGVyT3Jk
ZXIgPSBzb3VyY2UucmVuZGVyT3JkZXI7CisKKwkJCXRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNl
KCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTsKKworCQkJaWYgKCByZWN1cnNp
dmUgPT09IHRydWUgKSB7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRy
ZW4ubGVuZ3RoOyBpICsrICkgeworCisJCQkJCXZhciBjaGlsZCA9IHNvdXJjZS5jaGlsZHJlblsg
aSBdOworCQkJCQl0aGlzLmFkZCggY2hpbGQuY2xvbmUoKSApOworCisJCQkJfQorCisJCQl9CisK
KwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJk
b29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBo
dHRwOi8vZ29tby5zZS8KKwkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5j
b20vV2VzdExhbmdsZXkKKwkqLworCisJZnVuY3Rpb24gQ2FtZXJhKCkgeworCisJCU9iamVjdDNE
LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnQ2FtZXJhJzsKKworCQl0aGlzLm1hdHJp
eFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7CisJCXRoaXMucHJvamVjdGlvbk1hdHJpeCA9
IG5ldyBNYXRyaXg0KCk7CisKKwl9CisKKwlDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2ln
biggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3Rv
cjogQ2FtZXJhLAorCisJCWlzQ2FtZXJhOiB0cnVlLAorCisJCWNvcHk6IGZ1bmN0aW9uICggc291
cmNlLCByZWN1cnNpdmUgKSB7CisKKwkJCU9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRo
aXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7CisKKwkJCXRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNv
cHkoIHNvdXJjZS5tYXRyaXhXb3JsZEludmVyc2UgKTsKKwkJCXRoaXMucHJvamVjdGlvbk1hdHJp
eC5jb3B5KCBzb3VyY2UucHJvamVjdGlvbk1hdHJpeCApOworCisJCQlyZXR1cm4gdGhpczsKKwor
CQl9LAorCisJCWdldFdvcmxkRGlyZWN0aW9uOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBxdWF0
ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxk
RGlyZWN0aW9uKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJCXZhciByZXN1bHQgPSBvcHRpb25h
bFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCisJCQkJdGhpcy5nZXRXb3JsZFF1YXRlcm5pb24o
IHF1YXRlcm5pb24gKTsKKworCQkJCXJldHVybiByZXN1bHQuc2V0KCAwLCAwLCAtIDEgKS5hcHBs
eVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTsKKworCQkJfTsKKworCQl9KCksCisKKwkJdXBkYXRl
TWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7CisKKwkJCU9iamVjdDNELnByb3RvdHlw
ZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApOworCisJCQl0aGlzLm1hdHJp
eFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7CisKKwkJfSwKKwor
CQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3Io
KS5jb3B5KCB0aGlzICk7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBhbHRl
cmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIGFyb3NlIC8gaHR0
cDovL2dpdGh1Yi5jb20vYXJvc2UKKwkgKi8KKworCWZ1bmN0aW9uIE9ydGhvZ3JhcGhpY0NhbWVy
YSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7CisKKwkJQ2FtZXJhLmNh
bGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnT3J0aG9ncmFwaGljQ2FtZXJhJzsKKworCQl0
aGlzLnpvb20gPSAxOworCQl0aGlzLnZpZXcgPSBudWxsOworCisJCXRoaXMubGVmdCA9IGxlZnQ7
CisJCXRoaXMucmlnaHQgPSByaWdodDsKKwkJdGhpcy50b3AgPSB0b3A7CisJCXRoaXMuYm90dG9t
ID0gYm90dG9tOworCisJCXRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFy
IDogMC4xOworCQl0aGlzLmZhciA9ICggZmFyICE9PSB1bmRlZmluZWQgKSA/IGZhciA6IDIwMDA7
CisKKwkJdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CisKKwl9CisKKwlPcnRob2dyYXBo
aWNDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJh
LnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IE9ydGhvZ3JhcGhpY0NhbWVyYSwKKwor
CQlpc09ydGhvZ3JhcGhpY0NhbWVyYTogdHJ1ZSwKKworCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJj
ZSwgcmVjdXJzaXZlICkgeworCisJCQlDYW1lcmEucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywg
c291cmNlLCByZWN1cnNpdmUgKTsKKworCQkJdGhpcy5sZWZ0ID0gc291cmNlLmxlZnQ7CisJCQl0
aGlzLnJpZ2h0ID0gc291cmNlLnJpZ2h0OworCQkJdGhpcy50b3AgPSBzb3VyY2UudG9wOworCQkJ
dGhpcy5ib3R0b20gPSBzb3VyY2UuYm90dG9tOworCQkJdGhpcy5uZWFyID0gc291cmNlLm5lYXI7
CisJCQl0aGlzLmZhciA9IHNvdXJjZS5mYXI7CisKKwkJCXRoaXMuem9vbSA9IHNvdXJjZS56b29t
OworCQkJdGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFz
c2lnbigge30sIHNvdXJjZS52aWV3ICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJ
c2V0Vmlld09mZnNldDogZnVuY3Rpb24oIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgeCwgeSwgd2lk
dGgsIGhlaWdodCApIHsKKworCQkJdGhpcy52aWV3ID0geworCQkJCWZ1bGxXaWR0aDogZnVsbFdp
ZHRoLAorCQkJCWZ1bGxIZWlnaHQ6IGZ1bGxIZWlnaHQsCisJCQkJb2Zmc2V0WDogeCwKKwkJCQlv
ZmZzZXRZOiB5LAorCQkJCXdpZHRoOiB3aWR0aCwKKwkJCQloZWlnaHQ6IGhlaWdodAorCQkJfTsK
KworCQkJdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CisKKwkJfSwKKworCQljbGVhclZp
ZXdPZmZzZXQ6IGZ1bmN0aW9uKCkgeworCisJCQl0aGlzLnZpZXcgPSBudWxsOworCQkJdGhpcy51
cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CisKKwkJfSwKKworCQl1cGRhdGVQcm9qZWN0aW9uTWF0
cml4OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBkeCA9ICggdGhpcy5yaWdodCAtIHRoaXMubGVm
dCApIC8gKCAyICogdGhpcy56b29tICk7CisJCQl2YXIgZHkgPSAoIHRoaXMudG9wIC0gdGhpcy5i
b3R0b20gKSAvICggMiAqIHRoaXMuem9vbSApOworCQkJdmFyIGN4ID0gKCB0aGlzLnJpZ2h0ICsg
dGhpcy5sZWZ0ICkgLyAyOworCQkJdmFyIGN5ID0gKCB0aGlzLnRvcCArIHRoaXMuYm90dG9tICkg
LyAyOworCisJCQl2YXIgbGVmdCA9IGN4IC0gZHg7CisJCQl2YXIgcmlnaHQgPSBjeCArIGR4Owor
CQkJdmFyIHRvcCA9IGN5ICsgZHk7CisJCQl2YXIgYm90dG9tID0gY3kgLSBkeTsKKworCQkJaWYg
KCB0aGlzLnZpZXcgIT09IG51bGwgKSB7CisKKwkJCQl2YXIgem9vbVcgPSB0aGlzLnpvb20gLyAo
IHRoaXMudmlldy53aWR0aCAvIHRoaXMudmlldy5mdWxsV2lkdGggKTsKKwkJCQl2YXIgem9vbUgg
PSB0aGlzLnpvb20gLyAoIHRoaXMudmlldy5oZWlnaHQgLyB0aGlzLnZpZXcuZnVsbEhlaWdodCAp
OworCQkJCXZhciBzY2FsZVcgPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvIHRoaXMudmll
dy53aWR0aDsKKwkJCQl2YXIgc2NhbGVIID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyB0
aGlzLnZpZXcuaGVpZ2h0OworCisJCQkJbGVmdCArPSBzY2FsZVcgKiAoIHRoaXMudmlldy5vZmZz
ZXRYIC8gem9vbVcgKTsKKwkJCQlyaWdodCA9IGxlZnQgKyBzY2FsZVcgKiAoIHRoaXMudmlldy53
aWR0aCAvIHpvb21XICk7CisJCQkJdG9wIC09IHNjYWxlSCAqICggdGhpcy52aWV3Lm9mZnNldFkg
LyB6b29tSCApOworCQkJCWJvdHRvbSA9IHRvcCAtIHNjYWxlSCAqICggdGhpcy52aWV3LmhlaWdo
dCAvIHpvb21IICk7CisKKwkJCX0KKworCQkJdGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VPcnRo
b2dyYXBoaWMoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgdGhpcy5uZWFyLCB0aGlzLmZhciAp
OworCisJCX0sCisKKwkJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CisKKwkJCXZhciBkYXRh
ID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CisKKwkJCWRh
dGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207CisJCQlkYXRhLm9iamVjdC5sZWZ0ID0gdGhpcy5s
ZWZ0OworCQkJZGF0YS5vYmplY3QucmlnaHQgPSB0aGlzLnJpZ2h0OworCQkJZGF0YS5vYmplY3Qu
dG9wID0gdGhpcy50b3A7CisJCQlkYXRhLm9iamVjdC5ib3R0b20gPSB0aGlzLmJvdHRvbTsKKwkJ
CWRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7CisJCQlkYXRhLm9iamVjdC5mYXIgPSB0aGlz
LmZhcjsKKworCQkJaWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0g
T2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApOworCisJCQlyZXR1cm4gZGF0YTsKKworCQl9
CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29t
LworCSAqIEBhdXRob3IgZ3JlZ2dtYW4gLyBodHRwOi8vZ2FtZXMuZ3JlZ2dtYW4uY29tLworCSAq
IEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKKwkgKiBA
YXV0aG9yIHRzY2h3CisJICovCisKKwlmdW5jdGlvbiBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBh
c3BlY3QsIG5lYXIsIGZhciApIHsKKworCQlDYW1lcmEuY2FsbCggdGhpcyApOworCisJCXRoaXMu
dHlwZSA9ICdQZXJzcGVjdGl2ZUNhbWVyYSc7CisKKwkJdGhpcy5mb3YgPSBmb3YgIT09IHVuZGVm
aW5lZCA/IGZvdiA6IDUwOworCQl0aGlzLnpvb20gPSAxOworCisJCXRoaXMubmVhciA9IG5lYXIg
IT09IHVuZGVmaW5lZCA/IG5lYXIgOiAwLjE7CisJCXRoaXMuZmFyID0gZmFyICE9PSB1bmRlZmlu
ZWQgPyBmYXIgOiAyMDAwOworCQl0aGlzLmZvY3VzID0gMTA7CisKKwkJdGhpcy5hc3BlY3QgPSBh
c3BlY3QgIT09IHVuZGVmaW5lZCA/IGFzcGVjdCA6IDE7CisJCXRoaXMudmlldyA9IG51bGw7CisK
KwkJdGhpcy5maWxtR2F1Z2UgPSAzNTsJLy8gd2lkdGggb2YgdGhlIGZpbG0gKGRlZmF1bHQgaW4g
bWlsbGltZXRlcnMpCisJCXRoaXMuZmlsbU9mZnNldCA9IDA7CS8vIGhvcml6b250YWwgZmlsbSBv
ZmZzZXQgKHNhbWUgdW5pdCBhcyBnYXVnZSkKKworCQl0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRy
aXgoKTsKKworCX0KKworCVBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3Np
Z24oIE9iamVjdC5jcmVhdGUoIENhbWVyYS5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9y
OiBQZXJzcGVjdGl2ZUNhbWVyYSwKKworCQlpc1BlcnNwZWN0aXZlQ2FtZXJhOiB0cnVlLAorCisJ
CWNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7CisKKwkJCUNhbWVyYS5wcm90
b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApOworCisJCQl0aGlzLmZv
diA9IHNvdXJjZS5mb3Y7CisJCQl0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTsKKworCQkJdGhpcy5u
ZWFyID0gc291cmNlLm5lYXI7CisJCQl0aGlzLmZhciA9IHNvdXJjZS5mYXI7CisJCQl0aGlzLmZv
Y3VzID0gc291cmNlLmZvY3VzOworCisJCQl0aGlzLmFzcGVjdCA9IHNvdXJjZS5hc3BlY3Q7CisJ
CQl0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWdu
KCB7fSwgc291cmNlLnZpZXcgKTsKKworCQkJdGhpcy5maWxtR2F1Z2UgPSBzb3VyY2UuZmlsbUdh
dWdlOworCQkJdGhpcy5maWxtT2Zmc2V0ID0gc291cmNlLmZpbG1PZmZzZXQ7CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0sCisKKwkJLyoqCisJCSAqIFNldHMgdGhlIEZPViBieSBmb2NhbCBsZW5n
dGggaW4gcmVzcGVjdCB0byB0aGUgY3VycmVudCAuZmlsbUdhdWdlLgorCQkgKgorCQkgKiBUaGUg
ZGVmYXVsdCBmaWxtIGdhdWdlIGlzIDM1LCBzbyB0aGF0IHRoZSBmb2NhbCBsZW5ndGggY2FuIGJl
IHNwZWNpZmllZCBmb3IKKwkJICogYSAzNW1tIChmdWxsIGZyYW1lKSBjYW1lcmEuCisJCSAqCisJ
CSAqIFZhbHVlcyBmb3IgZm9jYWwgbGVuZ3RoIGFuZCBmaWxtIGdhdWdlIG11c3QgaGF2ZSB0aGUg
c2FtZSB1bml0LgorCQkgKi8KKwkJc2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICggZm9jYWxMZW5n
dGggKSB7CisKKwkJCS8vIHNlZSBodHRwOi8vd3d3LmJvYmF0a2lucy5jb20vcGhvdG9ncmFwaHkv
dGVjaG5pY2FsL2ZpZWxkX29mX3ZpZXcuaHRtbAorCQkJdmFyIHZFeHRlbnRTbG9wZSA9IDAuNSAq
IHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gZm9jYWxMZW5ndGg7CisKKwkJCXRoaXMuZm92ID0gX01h
dGguUkFEMkRFRyAqIDIgKiBNYXRoLmF0YW4oIHZFeHRlbnRTbG9wZSApOworCQkJdGhpcy51cGRh
dGVQcm9qZWN0aW9uTWF0cml4KCk7CisKKwkJfSwKKworCQkvKioKKwkJICogQ2FsY3VsYXRlcyB0
aGUgZm9jYWwgbGVuZ3RoIGZyb20gdGhlIGN1cnJlbnQgLmZvdiBhbmQgLmZpbG1HYXVnZS4KKwkJ
ICovCisJCWdldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2RXh0ZW50U2xv
cGUgPSBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICk7CisKKwkJCXJl
dHVybiAwLjUgKiB0aGlzLmdldEZpbG1IZWlnaHQoKSAvIHZFeHRlbnRTbG9wZTsKKworCQl9LAor
CisJCWdldEVmZmVjdGl2ZUZPVjogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gX01hdGguUkFE
MkRFRyAqIDIgKiBNYXRoLmF0YW4oCisJCQkJCU1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41
ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSApOworCisJCX0sCisKKwkJZ2V0RmlsbVdpZHRoOiBm
dW5jdGlvbiAoKSB7CisKKwkJCS8vIGZpbG0gbm90IGNvbXBsZXRlbHkgY292ZXJlZCBpbiBwb3J0
cmFpdCBmb3JtYXQgKGFzcGVjdCA8IDEpCisJCQlyZXR1cm4gdGhpcy5maWxtR2F1Z2UgKiBNYXRo
Lm1pbiggdGhpcy5hc3BlY3QsIDEgKTsKKworCQl9LAorCisJCWdldEZpbG1IZWlnaHQ6IGZ1bmN0
aW9uICgpIHsKKworCQkJLy8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIGxhbmRzY2Fw
ZSBmb3JtYXQgKGFzcGVjdCA+IDEpCisJCQlyZXR1cm4gdGhpcy5maWxtR2F1Z2UgLyBNYXRoLm1h
eCggdGhpcy5hc3BlY3QsIDEgKTsKKworCQl9LAorCisJCS8qKgorCQkgKiBTZXRzIGFuIG9mZnNl
dCBpbiBhIGxhcmdlciBmcnVzdHVtLiBUaGlzIGlzIHVzZWZ1bCBmb3IgbXVsdGktd2luZG93IG9y
CisJCSAqIG11bHRpLW1vbml0b3IvbXVsdGktbWFjaGluZSBzZXR1cHMuCisJCSAqCisJCSAqIEZv
ciBleGFtcGxlLCBpZiB5b3UgaGF2ZSAzeDIgbW9uaXRvcnMgYW5kIGVhY2ggbW9uaXRvciBpcyAx
OTIweDEwODAgYW5kCisJCSAqIHRoZSBtb25pdG9ycyBhcmUgaW4gZ3JpZCBsaWtlIHRoaXMKKwkJ
ICoKKwkJICogICArLS0tKy0tLSstLS0rCisJCSAqICAgfCBBIHwgQiB8IEMgfAorCQkgKiAgICst
LS0rLS0tKy0tLSsKKwkJICogICB8IEQgfCBFIHwgRiB8CisJCSAqICAgKy0tLSstLS0rLS0tKwor
CQkgKgorCQkgKiB0aGVuIGZvciBlYWNoIG1vbml0b3IgeW91IHdvdWxkIGNhbGwgaXQgbGlrZSB0
aGlzCisJCSAqCisJCSAqICAgdmFyIHcgPSAxOTIwOworCQkgKiAgIHZhciBoID0gMTA4MDsKKwkJ
ICogICB2YXIgZnVsbFdpZHRoID0gdyAqIDM7CisJCSAqICAgdmFyIGZ1bGxIZWlnaHQgPSBoICog
MjsKKwkJICoKKwkJICogICAtLUEtLQorCQkgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0
aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAwLCB3LCBoICk7CisJCSAqICAgLS1CLS0KKwkJICog
ICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMCwg
dywgaCApOworCQkgKiAgIC0tQy0tCisJCSAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRo
LCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDAsIHcsIGggKTsKKwkJICogICAtLUQtLQorCQkgKiAg
IGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAxLCB3
LCBoICk7CisJCSAqICAgLS1FLS0KKwkJICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgs
IGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMSwgdywgaCApOworCQkgKiAgIC0tRi0tCisJCSAqICAg
Y2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDEsIHcs
IGggKTsKKwkJICoKKwkJICogICBOb3RlIHRoZXJlIGlzIG5vIHJlYXNvbiBtb25pdG9ycyBoYXZl
IHRvIGJlIHRoZSBzYW1lIHNpemUgb3IgaW4gYSBncmlkLgorCQkgKi8KKwkJc2V0Vmlld09mZnNl
dDogZnVuY3Rpb24gKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQg
KSB7CisKKwkJCXRoaXMuYXNwZWN0ID0gZnVsbFdpZHRoIC8gZnVsbEhlaWdodDsKKworCQkJdGhp
cy52aWV3ID0geworCQkJCWZ1bGxXaWR0aDogZnVsbFdpZHRoLAorCQkJCWZ1bGxIZWlnaHQ6IGZ1
bGxIZWlnaHQsCisJCQkJb2Zmc2V0WDogeCwKKwkJCQlvZmZzZXRZOiB5LAorCQkJCXdpZHRoOiB3
aWR0aCwKKwkJCQloZWlnaHQ6IGhlaWdodAorCQkJfTsKKworCQkJdGhpcy51cGRhdGVQcm9qZWN0
aW9uTWF0cml4KCk7CisKKwkJfSwKKworCQljbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uICgpIHsK
KworCQkJdGhpcy52aWV3ID0gbnVsbDsKKwkJCXRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgp
OworCisJCX0sCisKKwkJdXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkgeworCisJ
CQl2YXIgbmVhciA9IHRoaXMubmVhciwKKwkJCQl0b3AgPSBuZWFyICogTWF0aC50YW4oCisJCQkJ
CQlfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSwKKwkJCQloZWln
aHQgPSAyICogdG9wLAorCQkJCXdpZHRoID0gdGhpcy5hc3BlY3QgKiBoZWlnaHQsCisJCQkJbGVm
dCA9IC0gMC41ICogd2lkdGgsCisJCQkJdmlldyA9IHRoaXMudmlldzsKKworCQkJaWYgKCB2aWV3
ICE9PSBudWxsICkgeworCisJCQkJdmFyIGZ1bGxXaWR0aCA9IHZpZXcuZnVsbFdpZHRoLAorCQkJ
CQlmdWxsSGVpZ2h0ID0gdmlldy5mdWxsSGVpZ2h0OworCisJCQkJbGVmdCArPSB2aWV3Lm9mZnNl
dFggKiB3aWR0aCAvIGZ1bGxXaWR0aDsKKwkJCQl0b3AgLT0gdmlldy5vZmZzZXRZICogaGVpZ2h0
IC8gZnVsbEhlaWdodDsKKwkJCQl3aWR0aCAqPSB2aWV3LndpZHRoIC8gZnVsbFdpZHRoOworCQkJ
CWhlaWdodCAqPSB2aWV3LmhlaWdodCAvIGZ1bGxIZWlnaHQ7CisKKwkJCX0KKworCQkJdmFyIHNr
ZXcgPSB0aGlzLmZpbG1PZmZzZXQ7CisJCQlpZiAoIHNrZXcgIT09IDAgKSBsZWZ0ICs9IG5lYXIg
KiBza2V3IC8gdGhpcy5nZXRGaWxtV2lkdGgoKTsKKworCQkJdGhpcy5wcm9qZWN0aW9uTWF0cml4
Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgbGVmdCArIHdpZHRoLCB0b3AsIHRvcCAtIGhlaWdodCwg
bmVhciwgdGhpcy5mYXIgKTsKKworCQl9LAorCisJCXRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkg
eworCisJCQl2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywg
bWV0YSApOworCisJCQlkYXRhLm9iamVjdC5mb3YgPSB0aGlzLmZvdjsKKwkJCWRhdGEub2JqZWN0
Lnpvb20gPSB0aGlzLnpvb207CisKKwkJCWRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7CisJ
CQlkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjsKKwkJCWRhdGEub2JqZWN0LmZvY3VzID0gdGhp
cy5mb2N1czsKKworCQkJZGF0YS5vYmplY3QuYXNwZWN0ID0gdGhpcy5hc3BlY3Q7CisKKwkJCWlm
ICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24o
IHt9LCB0aGlzLnZpZXcgKTsKKworCQkJZGF0YS5vYmplY3QuZmlsbUdhdWdlID0gdGhpcy5maWxt
R2F1Z2U7CisJCQlkYXRhLm9iamVjdC5maWxtT2Zmc2V0ID0gdGhpcy5maWxtT2Zmc2V0OworCisJ
CQlyZXR1cm4gZGF0YTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9v
YiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0
ZXJlZHF1YWxpYS5jb20vCisJICovCisKKwlmdW5jdGlvbiBGYWNlMyggYSwgYiwgYywgbm9ybWFs
LCBjb2xvciwgbWF0ZXJpYWxJbmRleCApIHsKKworCQl0aGlzLmEgPSBhOworCQl0aGlzLmIgPSBi
OworCQl0aGlzLmMgPSBjOworCisJCXRoaXMubm9ybWFsID0gKCBub3JtYWwgJiYgbm9ybWFsLmlz
VmVjdG9yMyApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoKTsKKwkJdGhpcy52ZXJ0ZXhOb3JtYWxz
ID0gQXJyYXkuaXNBcnJheSggbm9ybWFsICkgPyBub3JtYWwgOiBbXTsKKworCQl0aGlzLmNvbG9y
ID0gKCBjb2xvciAmJiBjb2xvci5pc0NvbG9yICkgPyBjb2xvciA6IG5ldyBDb2xvcigpOworCQl0
aGlzLnZlcnRleENvbG9ycyA9IEFycmF5LmlzQXJyYXkoIGNvbG9yICkgPyBjb2xvciA6IFtdOwor
CisJCXRoaXMubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXggIT09IHVuZGVmaW5lZCA/IG1h
dGVyaWFsSW5kZXggOiAwOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggRmFjZTMucHJvdG90eXBl
LCB7CisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0
cnVjdG9yKCkuY29weSggdGhpcyApOworCisJCX0sCisKKwkJY29weTogZnVuY3Rpb24gKCBzb3Vy
Y2UgKSB7CisKKwkJCXRoaXMuYSA9IHNvdXJjZS5hOworCQkJdGhpcy5iID0gc291cmNlLmI7CisJ
CQl0aGlzLmMgPSBzb3VyY2UuYzsKKworCQkJdGhpcy5ub3JtYWwuY29weSggc291cmNlLm5vcm1h
bCApOworCQkJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKKworCQkJdGhpcy5tYXRl
cmlhbEluZGV4ID0gc291cmNlLm1hdGVyaWFsSW5kZXg7CisKKwkJCWZvciAoIHZhciBpID0gMCwg
aWwgPSBzb3VyY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJ
CXRoaXMudmVydGV4Tm9ybWFsc1sgaSBdID0gc291cmNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9u
ZSgpOworCisJCQl9CisKKwkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBzb3VyY2UudmVydGV4Q29s
b3JzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJdGhpcy52ZXJ0ZXhDb2xvcnNbIGkg
XSA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnNbIGkgXS5jbG9uZSgpOworCisJCQl9CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0
cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBraWxlIC8gaHR0cDovL2tpbGUuc3RyYXZhZ2Fu
emEub3JnLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20v
CisJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KKwkgKiBAYXV0
aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCisJICogQGF1dGhv
ciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworCSAqLworCisJdmFyIGNvdW50ID0gMDsKKwlm
dW5jdGlvbiBHZW9tZXRyeUlkQ291bnQoKSB7IHJldHVybiBjb3VudCsrOyB9CisKKwlmdW5jdGlv
biBHZW9tZXRyeSgpIHsKKworCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsg
dmFsdWU6IEdlb21ldHJ5SWRDb3VudCgpIH0gKTsKKworCQl0aGlzLnV1aWQgPSBfTWF0aC5nZW5l
cmF0ZVVVSUQoKTsKKworCQl0aGlzLm5hbWUgPSAnJzsKKwkJdGhpcy50eXBlID0gJ0dlb21ldHJ5
JzsKKworCQl0aGlzLnZlcnRpY2VzID0gW107CisJCXRoaXMuY29sb3JzID0gW107CisJCXRoaXMu
ZmFjZXMgPSBbXTsKKwkJdGhpcy5mYWNlVmVydGV4VXZzID0gW1tdXTsKKworCQl0aGlzLm1vcnBo
VGFyZ2V0cyA9IFtdOworCQl0aGlzLm1vcnBoTm9ybWFscyA9IFtdOworCisJCXRoaXMuc2tpbldl
aWdodHMgPSBbXTsKKwkJdGhpcy5za2luSW5kaWNlcyA9IFtdOworCisJCXRoaXMubGluZURpc3Rh
bmNlcyA9IFtdOworCisJCXRoaXMuYm91bmRpbmdCb3ggPSBudWxsOworCQl0aGlzLmJvdW5kaW5n
U3BoZXJlID0gbnVsbDsKKworCQkvLyB1cGRhdGUgZmxhZ3MKKworCQl0aGlzLmVsZW1lbnRzTmVl
ZFVwZGF0ZSA9IGZhbHNlOworCQl0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlOworCQl0
aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTsKKwkJdGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZh
bHNlOworCQl0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTsKKwkJdGhpcy5saW5lRGlzdGFu
Y2VzTmVlZFVwZGF0ZSA9IGZhbHNlOworCQl0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTsK
KworCX0KKworCU9iamVjdC5hc3NpZ24oIEdlb21ldHJ5LnByb3RvdHlwZSwgRXZlbnREaXNwYXRj
aGVyLnByb3RvdHlwZSwgeworCisJCWlzR2VvbWV0cnk6IHRydWUsCisKKwkJYXBwbHlNYXRyaXg6
IGZ1bmN0aW9uICggbWF0cml4ICkgeworCisJCQl2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJp
eDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGls
ID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJCXZhciB2ZXJ0
ZXggPSB0aGlzLnZlcnRpY2VzWyBpIF07CisJCQkJdmVydGV4LmFwcGx5TWF0cml4NCggbWF0cml4
ICk7CisKKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuZmFjZXMubGVuZ3Ro
OyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQl2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTsKKwkJ
CQlmYWNlLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOwor
CisJCQkJZm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGog
PCBqbDsgaiArKyApIHsKKworCQkJCQlmYWNlLnZlcnRleE5vcm1hbHNbIGogXS5hcHBseU1hdHJp
eDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOworCisJCQkJfQorCisJCQl9CisKKwkJCWlm
ICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKKworCQkJCXRoaXMuY29tcHV0ZUJvdW5k
aW5nQm94KCk7CisKKwkJCX0KKworCQkJaWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxs
ICkgeworCisJCQkJdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKKworCQkJfQorCisJCQl0
aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHRydWU7CisJCQl0aGlzLm5vcm1hbHNOZWVkVXBkYXRl
ID0gdHJ1ZTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlyb3RhdGVYOiBmdW5jdGlv
biAoKSB7CisKKwkJCS8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzCisKKwkJ
CXZhciBtMSA9IG5ldyBNYXRyaXg0KCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBh
bmdsZSApIHsKKworCQkJCW0xLm1ha2VSb3RhdGlvblgoIGFuZ2xlICk7CisKKwkJCQl0aGlzLmFw
cGx5TWF0cml4KCBtMSApOworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAor
CisJCXJvdGF0ZVk6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gcm90YXRlIGdlb21ldHJ5IGFyb3Vu
ZCB3b3JsZCB5LWF4aXMKKworCQkJdmFyIG0xID0gbmV3IE1hdHJpeDQoKTsKKworCQkJcmV0dXJu
IGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkgeworCisJCQkJbTEubWFrZVJvdGF0aW9uWSggYW5n
bGUgKTsKKworCQkJCXRoaXMuYXBwbHlNYXRyaXgoIG0xICk7CisKKwkJCQlyZXR1cm4gdGhpczsK
KworCQkJfTsKKworCQl9KCksCisKKwkJcm90YXRlWjogZnVuY3Rpb24gKCkgeworCisJCQkvLyBy
b3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHotYXhpcworCisJCQl2YXIgbTEgPSBuZXcgTWF0
cml4NCgpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7CisKKwkJCQlt
MS5tYWtlUm90YXRpb25aKCBhbmdsZSApOworCisJCQkJdGhpcy5hcHBseU1hdHJpeCggbTEgKTsK
KworCQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKworCQl0cmFuc2xhdGU6IGZ1
bmN0aW9uICgpIHsKKworCQkJLy8gdHJhbnNsYXRlIGdlb21ldHJ5CisKKwkJCXZhciBtMSA9IG5l
dyBNYXRyaXg0KCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGUoIHgsIHksIHogKSB7
CisKKwkJCQltMS5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTsKKworCQkJCXRoaXMuYXBwbHlN
YXRyaXgoIG0xICk7CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJfTsKKworCQl9KCksCisKKwkJ
c2NhbGU6IGZ1bmN0aW9uICgpIHsKKworCQkJLy8gc2NhbGUgZ2VvbWV0cnkKKworCQkJdmFyIG0x
ID0gbmV3IE1hdHJpeDQoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHNjYWxlKCB4LCB5LCB6ICkg
eworCisJCQkJbTEubWFrZVNjYWxlKCB4LCB5LCB6ICk7CisKKwkJCQl0aGlzLmFwcGx5TWF0cml4
KCBtMSApOworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWxvb2tB
dDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgb2JqID0gbmV3IE9iamVjdDNEKCk7CisKKwkJCXJl
dHVybiBmdW5jdGlvbiBsb29rQXQoIHZlY3RvciApIHsKKworCQkJCW9iai5sb29rQXQoIHZlY3Rv
ciApOworCisJCQkJb2JqLnVwZGF0ZU1hdHJpeCgpOworCisJCQkJdGhpcy5hcHBseU1hdHJpeCgg
b2JqLm1hdHJpeCApOworCisJCQl9OworCisJCX0oKSwKKworCQlmcm9tQnVmZmVyR2VvbWV0cnk6
IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7CisKKwkJCXZhciBzY29wZSA9IHRoaXM7CisKKwkJCXZh
ciBpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgPyBnZW9tZXRyeS5pbmRleC5hcnJh
eSA6IHVuZGVmaW5lZDsKKwkJCXZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsK
KworCQkJdmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7CisJCQl2YXIg
bm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLm5v
cm1hbC5hcnJheSA6IHVuZGVmaW5lZDsKKwkJCXZhciBjb2xvcnMgPSBhdHRyaWJ1dGVzLmNvbG9y
ICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLmNvbG9yLmFycmF5IDogdW5kZWZpbmVkOworCQkJ
dmFyIHV2cyA9IGF0dHJpYnV0ZXMudXYgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMudXYuYXJy
YXkgOiB1bmRlZmluZWQ7CisJCQl2YXIgdXZzMiA9IGF0dHJpYnV0ZXMudXYyICE9PSB1bmRlZmlu
ZWQgPyBhdHRyaWJ1dGVzLnV2Mi5hcnJheSA6IHVuZGVmaW5lZDsKKworCQkJaWYgKCB1dnMyICE9
PSB1bmRlZmluZWQgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IFtdOworCisJCQl2YXIgdGVt
cE5vcm1hbHMgPSBbXTsKKwkJCXZhciB0ZW1wVVZzID0gW107CisJCQl2YXIgdGVtcFVWczIgPSBb
XTsKKworCQkJZm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkg
Kz0gMywgaiArPSAyICkgeworCisJCQkJc2NvcGUudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMo
IHBvc2l0aW9uc1sgaSBdLCBwb3NpdGlvbnNbIGkgKyAxIF0sIHBvc2l0aW9uc1sgaSArIDIgXSAp
ICk7CisKKwkJCQlpZiAoIG5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQl0ZW1wTm9y
bWFscy5wdXNoKCBuZXcgVmVjdG9yMyggbm9ybWFsc1sgaSBdLCBub3JtYWxzWyBpICsgMSBdLCBu
b3JtYWxzWyBpICsgMiBdICkgKTsKKworCQkJCX0KKworCQkJCWlmICggY29sb3JzICE9PSB1bmRl
ZmluZWQgKSB7CisKKwkJCQkJc2NvcGUuY29sb3JzLnB1c2goIG5ldyBDb2xvciggY29sb3JzWyBp
IF0sIGNvbG9yc1sgaSArIDEgXSwgY29sb3JzWyBpICsgMiBdICkgKTsKKworCQkJCX0KKworCQkJ
CWlmICggdXZzICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJdGVtcFVWcy5wdXNoKCBuZXcgVmVj
dG9yMiggdXZzWyBqIF0sIHV2c1sgaiArIDEgXSApICk7CisKKwkJCQl9CisKKwkJCQlpZiAoIHV2
czIgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQl0ZW1wVVZzMi5wdXNoKCBuZXcgVmVjdG9yMigg
dXZzMlsgaiBdLCB1dnMyWyBqICsgMSBdICkgKTsKKworCQkJCX0KKworCQkJfQorCisJCQlmdW5j
dGlvbiBhZGRGYWNlKCBhLCBiLCBjLCBtYXRlcmlhbEluZGV4ICkgeworCisJCQkJdmFyIHZlcnRl
eE5vcm1hbHMgPSBub3JtYWxzICE9PSB1bmRlZmluZWQgPyBbIHRlbXBOb3JtYWxzWyBhIF0uY2xv
bmUoKSwgdGVtcE5vcm1hbHNbIGIgXS5jbG9uZSgpLCB0ZW1wTm9ybWFsc1sgYyBdLmNsb25lKCkg
XSA6IFtdOworCQkJCXZhciB2ZXJ0ZXhDb2xvcnMgPSBjb2xvcnMgIT09IHVuZGVmaW5lZCA/IFsg
c2NvcGUuY29sb3JzWyBhIF0uY2xvbmUoKSwgc2NvcGUuY29sb3JzWyBiIF0uY2xvbmUoKSwgc2Nv
cGUuY29sb3JzWyBjIF0uY2xvbmUoKSBdIDogW107CisKKwkJCQl2YXIgZmFjZSA9IG5ldyBGYWNl
MyggYSwgYiwgYywgdmVydGV4Tm9ybWFscywgdmVydGV4Q29sb3JzLCBtYXRlcmlhbEluZGV4ICk7
CisKKwkJCQlzY29wZS5mYWNlcy5wdXNoKCBmYWNlICk7CisKKwkJCQlpZiAoIHV2cyAhPT0gdW5k
ZWZpbmVkICkgeworCisJCQkJCXNjb3BlLmZhY2VWZXJ0ZXhVdnNbIDAgXS5wdXNoKCBbIHRlbXBV
VnNbIGEgXS5jbG9uZSgpLCB0ZW1wVVZzWyBiIF0uY2xvbmUoKSwgdGVtcFVWc1sgYyBdLmNsb25l
KCkgXSApOworCisJCQkJfQorCisJCQkJaWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB7CisKKwkJ
CQkJc2NvcGUuZmFjZVZlcnRleFV2c1sgMSBdLnB1c2goIFsgdGVtcFVWczJbIGEgXS5jbG9uZSgp
LCB0ZW1wVVZzMlsgYiBdLmNsb25lKCksIHRlbXBVVnMyWyBjIF0uY2xvbmUoKSBdICk7CisKKwkJ
CQl9CisKKwkJCX0KKworCQkJdmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwczsKKworCQkJaWYg
KCBncm91cHMubGVuZ3RoID4gMCApIHsKKworCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGdyb3Vw
cy5sZW5ndGg7IGkgKysgKSB7CisKKwkJCQkJdmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07CisKKwkJ
CQkJdmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7CisJCQkJCXZhciBjb3VudCA9IGdyb3VwLmNvdW50
OworCisJCQkJCWZvciAoIHZhciBqID0gc3RhcnQsIGpsID0gc3RhcnQgKyBjb3VudDsgaiA8IGps
OyBqICs9IDMgKSB7CisKKwkJCQkJCWlmICggaW5kaWNlcyAhPT0gdW5kZWZpbmVkICkgeworCisJ
CQkJCQkJYWRkRmFjZSggaW5kaWNlc1sgaiBdLCBpbmRpY2VzWyBqICsgMSBdLCBpbmRpY2VzWyBq
ICsgMiBdLCBncm91cC5tYXRlcmlhbEluZGV4ICk7CisKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJ
CQlhZGRGYWNlKCBqLCBqICsgMSwgaiArIDIsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTsKKworCQkJ
CQkJfQorCisJCQkJCX0KKworCQkJCX0KKworCQkJfSBlbHNlIHsKKworCQkJCWlmICggaW5kaWNl
cyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGluZGljZXMu
bGVuZ3RoOyBpICs9IDMgKSB7CisKKwkJCQkJCWFkZEZhY2UoIGluZGljZXNbIGkgXSwgaW5kaWNl
c1sgaSArIDEgXSwgaW5kaWNlc1sgaSArIDIgXSApOworCisJCQkJCX0KKworCQkJCX0gZWxzZSB7
CisKKwkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgKz0g
MyApIHsKKworCQkJCQkJYWRkRmFjZSggaSwgaSArIDEsIGkgKyAyICk7CisKKwkJCQkJfQorCisJ
CQkJfQorCisJCQl9CisKKwkJCXRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7CisKKwkJCWlmICgg
Z2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7CisKKwkJCQl0aGlzLmJvdW5kaW5nQm94
ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTsKKworCQkJfQorCisJCQlpZiAoIGdlb21l
dHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkgeworCisJCQkJdGhpcy5ib3VuZGluZ1NwaGVy
ZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7CisKKwkJCX0KKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQljZW50ZXI6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5jb21w
dXRlQm91bmRpbmdCb3goKTsKKworCQkJdmFyIG9mZnNldCA9IHRoaXMuYm91bmRpbmdCb3guZ2V0
Q2VudGVyKCkubmVnYXRlKCk7CisKKwkJCXRoaXMudHJhbnNsYXRlKCBvZmZzZXQueCwgb2Zmc2V0
LnksIG9mZnNldC56ICk7CisKKwkJCXJldHVybiBvZmZzZXQ7CisKKwkJfSwKKworCQlub3JtYWxp
emU6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKKwor
CQkJdmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyOworCQkJdmFyIHJhZGl1
cyA9IHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzOworCisJCQl2YXIgcyA9IHJhZGl1cyA9PT0g
MCA/IDEgOiAxLjAgLyByYWRpdXM7CisKKwkJCXZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpOwor
CQkJbWF0cml4LnNldCgKKwkJCQlzLCAwLCAwLCAtIHMgKiBjZW50ZXIueCwKKwkJCQkwLCBzLCAw
LCAtIHMgKiBjZW50ZXIueSwKKwkJCQkwLCAwLCBzLCAtIHMgKiBjZW50ZXIueiwKKwkJCQkwLCAw
LCAwLCAxCisJCQkpOworCisJCQl0aGlzLmFwcGx5TWF0cml4KCBtYXRyaXggKTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQljb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHsK
KworCQkJdmFyIGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpOworCisJCQlm
b3IgKCB2YXIgZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsK
KworCQkJCXZhciBmYWNlID0gdGhpcy5mYWNlc1sgZiBdOworCisJCQkJdmFyIHZBID0gdGhpcy52
ZXJ0aWNlc1sgZmFjZS5hIF07CisJCQkJdmFyIHZCID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5iIF07
CisJCQkJdmFyIHZDID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5jIF07CisKKwkJCQljYi5zdWJWZWN0
b3JzKCB2QywgdkIgKTsKKwkJCQlhYi5zdWJWZWN0b3JzKCB2QSwgdkIgKTsKKwkJCQljYi5jcm9z
cyggYWIgKTsKKworCQkJCWNiLm5vcm1hbGl6ZSgpOworCisJCQkJZmFjZS5ub3JtYWwuY29weSgg
Y2IgKTsKKworCQkJfQorCisJCX0sCisKKwkJY29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9u
ICggYXJlYVdlaWdodGVkICkgeworCisJCQlpZiAoIGFyZWFXZWlnaHRlZCA9PT0gdW5kZWZpbmVk
ICkgYXJlYVdlaWdodGVkID0gdHJ1ZTsKKworCQkJdmFyIHYsIHZsLCBmLCBmbCwgZmFjZSwgdmVy
dGljZXM7CisKKwkJCXZlcnRpY2VzID0gbmV3IEFycmF5KCB0aGlzLnZlcnRpY2VzLmxlbmd0aCAp
OworCisJCQlmb3IgKCB2ID0gMCwgdmwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2
ICsrICkgeworCisJCQkJdmVydGljZXNbIHYgXSA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCX0KKwor
CQkJaWYgKCBhcmVhV2VpZ2h0ZWQgKSB7CisKKwkJCQkvLyB2ZXJ0ZXggbm9ybWFscyB3ZWlnaHRl
ZCBieSB0cmlhbmdsZSBhcmVhcworCQkJCS8vIGh0dHA6Ly93d3cuaXF1aWxlemxlcy5vcmcvd3d3
L2FydGljbGVzL25vcm1hbHMvbm9ybWFscy5odG0KKworCQkJCXZhciB2QSwgdkIsIHZDOworCQkJ
CXZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTsKKworCQkJCWZvciAo
IGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CisKKwkJCQkJ
ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTsKKworCQkJCQl2QSA9IHRoaXMudmVydGljZXNbIGZhY2Uu
YSBdOworCQkJCQl2QiA9IHRoaXMudmVydGljZXNbIGZhY2UuYiBdOworCQkJCQl2QyA9IHRoaXMu
dmVydGljZXNbIGZhY2UuYyBdOworCisJCQkJCWNiLnN1YlZlY3RvcnMoIHZDLCB2QiApOworCQkJ
CQlhYi5zdWJWZWN0b3JzKCB2QSwgdkIgKTsKKwkJCQkJY2IuY3Jvc3MoIGFiICk7CisKKwkJCQkJ
dmVydGljZXNbIGZhY2UuYSBdLmFkZCggY2IgKTsKKwkJCQkJdmVydGljZXNbIGZhY2UuYiBdLmFk
ZCggY2IgKTsKKwkJCQkJdmVydGljZXNbIGZhY2UuYyBdLmFkZCggY2IgKTsKKworCQkJCX0KKwor
CQkJfSBlbHNlIHsKKworCQkJCXRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7CisKKwkJCQlmb3Ig
KCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgeworCisJCQkJ
CWZhY2UgPSB0aGlzLmZhY2VzWyBmIF07CisKKwkJCQkJdmVydGljZXNbIGZhY2UuYSBdLmFkZCgg
ZmFjZS5ub3JtYWwgKTsKKwkJCQkJdmVydGljZXNbIGZhY2UuYiBdLmFkZCggZmFjZS5ub3JtYWwg
KTsKKwkJCQkJdmVydGljZXNbIGZhY2UuYyBdLmFkZCggZmFjZS5ub3JtYWwgKTsKKworCQkJCX0K
KworCQkJfQorCisJCQlmb3IgKCB2ID0gMCwgdmwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgdiA8
IHZsOyB2ICsrICkgeworCisJCQkJdmVydGljZXNbIHYgXS5ub3JtYWxpemUoKTsKKworCQkJfQor
CisJCQlmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkg
eworCisJCQkJZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTsKKworCQkJCXZhciB2ZXJ0ZXhOb3JtYWxz
ID0gZmFjZS52ZXJ0ZXhOb3JtYWxzOworCisJCQkJaWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9
PT0gMyApIHsKKworCQkJCQl2ZXJ0ZXhOb3JtYWxzWyAwIF0uY29weSggdmVydGljZXNbIGZhY2Uu
YSBdICk7CisJCQkJCXZlcnRleE5vcm1hbHNbIDEgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5iIF0g
KTsKKwkJCQkJdmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmMgXSApOwor
CisJCQkJfSBlbHNlIHsKKworCQkJCQl2ZXJ0ZXhOb3JtYWxzWyAwIF0gPSB2ZXJ0aWNlc1sgZmFj
ZS5hIF0uY2xvbmUoKTsKKwkJCQkJdmVydGV4Tm9ybWFsc1sgMSBdID0gdmVydGljZXNbIGZhY2Uu
YiBdLmNsb25lKCk7CisJCQkJCXZlcnRleE5vcm1hbHNbIDIgXSA9IHZlcnRpY2VzWyBmYWNlLmMg
XS5jbG9uZSgpOworCisJCQkJfQorCisJCQl9CisKKwkJCWlmICggdGhpcy5mYWNlcy5sZW5ndGgg
PiAwICkgeworCisJCQkJdGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHRydWU7CisKKwkJCX0KKwor
CQl9LAorCisJCWNvbXB1dGVGbGF0VmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkgeworCisJCQl2
YXIgZiwgZmwsIGZhY2U7CisKKwkJCXRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7CisKKwkJCWZv
ciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CisKKwkJ
CQlmYWNlID0gdGhpcy5mYWNlc1sgZiBdOworCisJCQkJdmFyIHZlcnRleE5vcm1hbHMgPSBmYWNl
LnZlcnRleE5vcm1hbHM7CisKKwkJCQlpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkg
eworCisJCQkJCXZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCBmYWNlLm5vcm1hbCApOworCQkJCQl2
ZXJ0ZXhOb3JtYWxzWyAxIF0uY29weSggZmFjZS5ub3JtYWwgKTsKKwkJCQkJdmVydGV4Tm9ybWFs
c1sgMiBdLmNvcHkoIGZhY2Uubm9ybWFsICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXZlcnRl
eE5vcm1hbHNbIDAgXSA9IGZhY2Uubm9ybWFsLmNsb25lKCk7CisJCQkJCXZlcnRleE5vcm1hbHNb
IDEgXSA9IGZhY2Uubm9ybWFsLmNsb25lKCk7CisJCQkJCXZlcnRleE5vcm1hbHNbIDIgXSA9IGZh
Y2Uubm9ybWFsLmNsb25lKCk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCB0aGlzLmZhY2Vz
Lmxlbmd0aCA+IDAgKSB7CisKKwkJCQl0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTsKKwor
CQkJfQorCisJCX0sCisKKwkJY29tcHV0ZU1vcnBoTm9ybWFsczogZnVuY3Rpb24gKCkgeworCisJ
CQl2YXIgaSwgaWwsIGYsIGZsLCBmYWNlOworCisJCQkvLyBzYXZlIG9yaWdpbmFsIG5vcm1hbHMK
KwkJCS8vIC0gY3JlYXRlIHRlbXAgdmFyaWFibGVzIG9uIGZpcnN0IGFjY2VzcworCQkJLy8gICBv
dGhlcndpc2UganVzdCBjb3B5IChmb3IgZmFzdGVyIHJlcGVhdGVkIGNhbGxzKQorCisJCQlmb3Ig
KCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgeworCisJCQkJ
ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTsKKworCQkJCWlmICggISBmYWNlLl9fb3JpZ2luYWxGYWNl
Tm9ybWFsICkgeworCisJCQkJCWZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwgPSBmYWNlLm5vcm1h
bC5jbG9uZSgpOworCisJCQkJfSBlbHNlIHsKKworCQkJCQlmYWNlLl9fb3JpZ2luYWxGYWNlTm9y
bWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7CisKKwkJCQl9CisKKwkJCQlpZiAoICEgZmFjZS5fX29y
aWdpbmFsVmVydGV4Tm9ybWFscyApIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHMgPSBbXTsK
KworCQkJCWZvciAoIGkgPSAwLCBpbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGkgPCBp
bDsgaSArKyApIHsKKworCQkJCQlpZiAoICEgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1sg
aSBdICkgeworCisJCQkJCQlmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gPSBmYWNl
LnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWZh
Y2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNb
IGkgXSApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQkvLyB1c2UgdGVtcCBnZW9t
ZXRyeSB0byBjb21wdXRlIGZhY2UgYW5kIHZlcnRleCBub3JtYWxzIGZvciBlYWNoIG1vcnBoCisK
KwkJCXZhciB0bXBHZW8gPSBuZXcgR2VvbWV0cnkoKTsKKwkJCXRtcEdlby5mYWNlcyA9IHRoaXMu
ZmFjZXM7CisKKwkJCWZvciAoIGkgPSAwLCBpbCA9IHRoaXMubW9ycGhUYXJnZXRzLmxlbmd0aDsg
aSA8IGlsOyBpICsrICkgeworCisJCQkJLy8gY3JlYXRlIG9uIGZpcnN0IGFjY2VzcworCisJCQkJ
aWYgKCAhIHRoaXMubW9ycGhOb3JtYWxzWyBpIF0gKSB7CisKKwkJCQkJdGhpcy5tb3JwaE5vcm1h
bHNbIGkgXSA9IHt9OworCQkJCQl0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzID0g
W107CisJCQkJCXRoaXMubW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyA9IFtdOworCisJ
CQkJCXZhciBkc3ROb3JtYWxzRmFjZSA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1h
bHM7CisJCQkJCXZhciBkc3ROb3JtYWxzVmVydGV4ID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52
ZXJ0ZXhOb3JtYWxzOworCisJCQkJCXZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzOworCisJ
CQkJCWZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7
CisKKwkJCQkJCWZhY2VOb3JtYWwgPSBuZXcgVmVjdG9yMygpOworCQkJCQkJdmVydGV4Tm9ybWFs
cyA9IHsgYTogbmV3IFZlY3RvcjMoKSwgYjogbmV3IFZlY3RvcjMoKSwgYzogbmV3IFZlY3RvcjMo
KSB9OworCisJCQkJCQlkc3ROb3JtYWxzRmFjZS5wdXNoKCBmYWNlTm9ybWFsICk7CisJCQkJCQlk
c3ROb3JtYWxzVmVydGV4LnB1c2goIHZlcnRleE5vcm1hbHMgKTsKKworCQkJCQl9CisKKwkJCQl9
CisKKwkJCQl2YXIgbW9ycGhOb3JtYWxzID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXTsKKworCQkJ
CS8vIHNldCB2ZXJ0aWNlcyB0byBtb3JwaCB0YXJnZXQKKworCQkJCXRtcEdlby52ZXJ0aWNlcyA9
IHRoaXMubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7CisKKwkJCQkvLyBjb21wdXRlIG1vcnBo
IG5vcm1hbHMKKworCQkJCXRtcEdlby5jb21wdXRlRmFjZU5vcm1hbHMoKTsKKwkJCQl0bXBHZW8u
Y29tcHV0ZVZlcnRleE5vcm1hbHMoKTsKKworCQkJCS8vIHN0b3JlIG1vcnBoIG5vcm1hbHMKKwor
CQkJCXZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzOworCisJCQkJZm9yICggZiA9IDAsIGZs
ID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKKworCQkJCQlmYWNlID0gdGhp
cy5mYWNlc1sgZiBdOworCisJCQkJCWZhY2VOb3JtYWwgPSBtb3JwaE5vcm1hbHMuZmFjZU5vcm1h
bHNbIGYgXTsKKwkJCQkJdmVydGV4Tm9ybWFscyA9IG1vcnBoTm9ybWFscy52ZXJ0ZXhOb3JtYWxz
WyBmIF07CisKKwkJCQkJZmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApOworCisJCQkJCXZl
cnRleE5vcm1hbHMuYS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDAgXSApOworCQkJCQl2ZXJ0
ZXhOb3JtYWxzLmIuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAxIF0gKTsKKwkJCQkJdmVydGV4
Tm9ybWFscy5jLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMiBdICk7CisKKwkJCQl9CisKKwkJ
CX0KKworCQkJLy8gcmVzdG9yZSBvcmlnaW5hbCBub3JtYWxzCisKKwkJCWZvciAoIGYgPSAwLCBm
bCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CisKKwkJCQlmYWNlID0gdGhp
cy5mYWNlc1sgZiBdOworCisJCQkJZmFjZS5ub3JtYWwgPSBmYWNlLl9fb3JpZ2luYWxGYWNlTm9y
bWFsOworCQkJCWZhY2UudmVydGV4Tm9ybWFscyA9IGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1h
bHM7CisKKwkJCX0KKworCQl9LAorCisJCWNvbXB1dGVMaW5lRGlzdGFuY2VzOiBmdW5jdGlvbiAo
KSB7CisKKwkJCXZhciBkID0gMDsKKwkJCXZhciB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7CisK
KwkJCWZvciAoIHZhciBpID0gMCwgaWwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyAp
IHsKKworCQkJCWlmICggaSA+IDAgKSB7CisKKwkJCQkJZCArPSB2ZXJ0aWNlc1sgaSBdLmRpc3Rh
bmNlVG8oIHZlcnRpY2VzWyBpIC0gMSBdICk7CisKKwkJCQl9CisKKwkJCQl0aGlzLmxpbmVEaXN0
YW5jZXNbIGkgXSA9IGQ7CisKKwkJCX0KKworCQl9LAorCisJCWNvbXB1dGVCb3VuZGluZ0JveDog
ZnVuY3Rpb24gKCkgeworCisJCQlpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7CisK
KwkJCQl0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTsKKworCQkJfQorCisJCQl0aGlzLmJv
dW5kaW5nQm94LnNldEZyb21Qb2ludHMoIHRoaXMudmVydGljZXMgKTsKKworCQl9LAorCisJCWNv
bXB1dGVCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkgeworCisJCQlpZiAoIHRoaXMuYm91bmRp
bmdTcGhlcmUgPT09IG51bGwgKSB7CisKKwkJCQl0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFNw
aGVyZSgpOworCisJCQl9CisKKwkJCXRoaXMuYm91bmRpbmdTcGhlcmUuc2V0RnJvbVBvaW50cygg
dGhpcy52ZXJ0aWNlcyApOworCisJCX0sCisKKwkJbWVyZ2U6IGZ1bmN0aW9uICggZ2VvbWV0cnks
IG1hdHJpeCwgbWF0ZXJpYWxJbmRleE9mZnNldCApIHsKKworCQkJaWYgKCAhICggZ2VvbWV0cnkg
JiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApICkgeworCisJCQkJY29uc29sZS5lcnJvciggJ1RIUkVF
Lkdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5HZW9t
ZXRyeS4nLCBnZW9tZXRyeSApOworCQkJCXJldHVybjsKKworCQkJfQorCisJCQl2YXIgbm9ybWFs
TWF0cml4LAorCQkJCXZlcnRleE9mZnNldCA9IHRoaXMudmVydGljZXMubGVuZ3RoLAorCQkJCXZl
cnRpY2VzMSA9IHRoaXMudmVydGljZXMsCisJCQkJdmVydGljZXMyID0gZ2VvbWV0cnkudmVydGlj
ZXMsCisJCQkJZmFjZXMxID0gdGhpcy5mYWNlcywKKwkJCQlmYWNlczIgPSBnZW9tZXRyeS5mYWNl
cywKKwkJCQl1dnMxID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF0sCisJCQkJdXZzMiA9IGdlb21l
dHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXSwKKwkJCQljb2xvcnMxID0gdGhpcy5jb2xvcnMsCisJCQkJ
Y29sb3JzMiA9IGdlb21ldHJ5LmNvbG9yczsKKworCQkJaWYgKCBtYXRlcmlhbEluZGV4T2Zmc2V0
ID09PSB1bmRlZmluZWQgKSBtYXRlcmlhbEluZGV4T2Zmc2V0ID0gMDsKKworCQkJaWYgKCBtYXRy
aXggIT09IHVuZGVmaW5lZCApIHsKKworCQkJCW5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCku
Z2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTsKKworCQkJfQorCisJCQkvLyB2ZXJ0aWNlcworCisJ
CQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gdmVydGljZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkg
eworCisJCQkJdmFyIHZlcnRleCA9IHZlcnRpY2VzMlsgaSBdOworCisJCQkJdmFyIHZlcnRleENv
cHkgPSB2ZXJ0ZXguY2xvbmUoKTsKKworCQkJCWlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB2
ZXJ0ZXhDb3B5LmFwcGx5TWF0cml4NCggbWF0cml4ICk7CisKKwkJCQl2ZXJ0aWNlczEucHVzaCgg
dmVydGV4Q29weSApOworCisJCQl9CisKKwkJCS8vIGNvbG9ycworCisJCQlmb3IgKCB2YXIgaSA9
IDAsIGlsID0gY29sb3JzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJCWNvbG9yczEu
cHVzaCggY29sb3JzMlsgaSBdLmNsb25lKCkgKTsKKworCQkJfQorCisJCQkvLyBmYWNlcworCisJ
CQlmb3IgKCBpID0gMCwgaWwgPSBmYWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJ
CQl2YXIgZmFjZSA9IGZhY2VzMlsgaSBdLCBmYWNlQ29weSwgbm9ybWFsLCBjb2xvciwKKwkJCQkJ
ZmFjZVZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHMsCisJCQkJCWZhY2VWZXJ0ZXhD
b2xvcnMgPSBmYWNlLnZlcnRleENvbG9yczsKKworCQkJCWZhY2VDb3B5ID0gbmV3IEZhY2UzKCBm
YWNlLmEgKyB2ZXJ0ZXhPZmZzZXQsIGZhY2UuYiArIHZlcnRleE9mZnNldCwgZmFjZS5jICsgdmVy
dGV4T2Zmc2V0ICk7CisJCQkJZmFjZUNvcHkubm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7CisK
KwkJCQlpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWZhY2VDb3B5
Lm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOworCisJCQkJ
fQorCisJCQkJZm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhOb3JtYWxzLmxlbmd0aDsg
aiA8IGpsOyBqICsrICkgeworCisJCQkJCW5vcm1hbCA9IGZhY2VWZXJ0ZXhOb3JtYWxzWyBqIF0u
Y2xvbmUoKTsKKworCQkJCQlpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkgeworCisJ
CQkJCQlub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTsKKwor
CQkJCQl9CisKKwkJCQkJZmFjZUNvcHkudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTsKKwor
CQkJCX0KKworCQkJCWZhY2VDb3B5LmNvbG9yLmNvcHkoIGZhY2UuY29sb3IgKTsKKworCQkJCWZv
ciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4Q29sb3JzLmxlbmd0aDsgaiA8IGpsOyBqICsr
ICkgeworCisJCQkJCWNvbG9yID0gZmFjZVZlcnRleENvbG9yc1sgaiBdOworCQkJCQlmYWNlQ29w
eS52ZXJ0ZXhDb2xvcnMucHVzaCggY29sb3IuY2xvbmUoKSApOworCisJCQkJfQorCisJCQkJZmFj
ZUNvcHkubWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleCArIG1hdGVyaWFsSW5kZXhP
ZmZzZXQ7CisKKwkJCQlmYWNlczEucHVzaCggZmFjZUNvcHkgKTsKKworCQkJfQorCisJCQkvLyB1
dnMKKworCQkJZm9yICggaSA9IDAsIGlsID0gdXZzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsK
KworCQkJCXZhciB1diA9IHV2czJbIGkgXSwgdXZDb3B5ID0gW107CisKKwkJCQlpZiAoIHV2ID09
PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJY29udGludWU7CisKKwkJCQl9CisKKwkJCQlmb3IgKCB2
YXIgaiA9IDAsIGpsID0gdXYubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CisKKwkJCQkJdXZDb3B5
LnB1c2goIHV2WyBqIF0uY2xvbmUoKSApOworCisJCQkJfQorCisJCQkJdXZzMS5wdXNoKCB1dkNv
cHkgKTsKKworCQkJfQorCisJCX0sCisKKwkJbWVyZ2VNZXNoOiBmdW5jdGlvbiAoIG1lc2ggKSB7
CisKKwkJCWlmICggISAoIG1lc2ggJiYgbWVzaC5pc01lc2ggKSApIHsKKworCQkJCWNvbnNvbGUu
ZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ug
b2YgVEhSRUUuTWVzaC4nLCBtZXNoICk7CisJCQkJcmV0dXJuOworCisJCQl9CisKKwkJCW1lc2gu
bWF0cml4QXV0b1VwZGF0ZSAmJiBtZXNoLnVwZGF0ZU1hdHJpeCgpOworCisJCQl0aGlzLm1lcmdl
KCBtZXNoLmdlb21ldHJ5LCBtZXNoLm1hdHJpeCApOworCisJCX0sCisKKwkJLyoKKwkJICogQ2hl
Y2tzIGZvciBkdXBsaWNhdGUgdmVydGljZXMgd2l0aCBoYXNobWFwLgorCQkgKiBEdXBsaWNhdGVk
IHZlcnRpY2VzIGFyZSByZW1vdmVkCisJCSAqIGFuZCBmYWNlcycgdmVydGljZXMgYXJlIHVwZGF0
ZWQuCisJCSAqLworCisJCW1lcmdlVmVydGljZXM6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHZl
cnRpY2VzTWFwID0ge307IC8vIEhhc2htYXAgZm9yIGxvb2tpbmcgdXAgdmVydGljZXMgYnkgcG9z
aXRpb24gY29vcmRpbmF0ZXMgKGFuZCBtYWtpbmcgc3VyZSB0aGV5IGFyZSB1bmlxdWUpCisJCQl2
YXIgdW5pcXVlID0gW10sIGNoYW5nZXMgPSBbXTsKKworCQkJdmFyIHYsIGtleTsKKwkJCXZhciBw
cmVjaXNpb25Qb2ludHMgPSA0OyAvLyBudW1iZXIgb2YgZGVjaW1hbCBwb2ludHMsIGUuZy4gNCBm
b3IgZXBzaWxvbiBvZiAwLjAwMDEKKwkJCXZhciBwcmVjaXNpb24gPSBNYXRoLnBvdyggMTAsIHBy
ZWNpc2lvblBvaW50cyApOworCQkJdmFyIGksIGlsLCBmYWNlOworCQkJdmFyIGluZGljZXMsIGos
IGpsOworCisJCQlmb3IgKCBpID0gMCwgaWwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGls
OyBpICsrICkgeworCisJCQkJdiA9IHRoaXMudmVydGljZXNbIGkgXTsKKwkJCQlrZXkgPSBNYXRo
LnJvdW5kKCB2LnggKiBwcmVjaXNpb24gKSArICdfJyArIE1hdGgucm91bmQoIHYueSAqIHByZWNp
c2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi56ICogcHJlY2lzaW9uICk7CisKKwkJCQlpZiAo
IHZlcnRpY2VzTWFwWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCXZlcnRpY2VzTWFw
WyBrZXkgXSA9IGk7CisJCQkJCXVuaXF1ZS5wdXNoKCB0aGlzLnZlcnRpY2VzWyBpIF0gKTsKKwkJ
CQkJY2hhbmdlc1sgaSBdID0gdW5pcXVlLmxlbmd0aCAtIDE7CisKKwkJCQl9IGVsc2UgeworCisJ
CQkJCS8vY29uc29sZS5sb2coJ0R1cGxpY2F0ZSB2ZXJ0ZXggZm91bmQuICcsIGksICcgY291bGQg
YmUgdXNpbmcgJywgdmVydGljZXNNYXBba2V5XSk7CisJCQkJCWNoYW5nZXNbIGkgXSA9IGNoYW5n
ZXNbIHZlcnRpY2VzTWFwWyBrZXkgXSBdOworCisJCQkJfQorCisJCQl9CisKKworCQkJLy8gaWYg
ZmFjZXMgYXJlIGNvbXBsZXRlbHkgZGVnZW5lcmF0ZSBhZnRlciBtZXJnaW5nIHZlcnRpY2VzLCB3
ZQorCQkJLy8gaGF2ZSB0byByZW1vdmUgdGhlbSBmcm9tIHRoZSBnZW9tZXRyeS4KKwkJCXZhciBm
YWNlSW5kaWNlc1RvUmVtb3ZlID0gW107CisKKwkJCWZvciAoIGkgPSAwLCBpbCA9IHRoaXMuZmFj
ZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQlmYWNlID0gdGhpcy5mYWNlc1sgaSBd
OworCisJCQkJZmFjZS5hID0gY2hhbmdlc1sgZmFjZS5hIF07CisJCQkJZmFjZS5iID0gY2hhbmdl
c1sgZmFjZS5iIF07CisJCQkJZmFjZS5jID0gY2hhbmdlc1sgZmFjZS5jIF07CisKKwkJCQlpbmRp
Y2VzID0gWyBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jIF07CisKKwkJCQkvLyBpZiBhbnkgZHVwbGlj
YXRlIHZlcnRpY2VzIGFyZSBmb3VuZCBpbiBhIEZhY2UzCisJCQkJLy8gd2UgaGF2ZSB0byByZW1v
dmUgdGhlIGZhY2UgYXMgbm90aGluZyBjYW4gYmUgc2F2ZWQKKwkJCQlmb3IgKCB2YXIgbiA9IDA7
IG4gPCAzOyBuICsrICkgeworCisJCQkJCWlmICggaW5kaWNlc1sgbiBdID09PSBpbmRpY2VzWyAo
IG4gKyAxICkgJSAzIF0gKSB7CisKKwkJCQkJCWZhY2VJbmRpY2VzVG9SZW1vdmUucHVzaCggaSAp
OworCQkJCQkJYnJlYWs7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJCWZvciAoIGkg
PSBmYWNlSW5kaWNlc1RvUmVtb3ZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtLSApIHsKKworCQkJ
CXZhciBpZHggPSBmYWNlSW5kaWNlc1RvUmVtb3ZlWyBpIF07CisKKwkJCQl0aGlzLmZhY2VzLnNw
bGljZSggaWR4LCAxICk7CisKKwkJCQlmb3IgKCBqID0gMCwgamwgPSB0aGlzLmZhY2VWZXJ0ZXhV
dnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CisKKwkJCQkJdGhpcy5mYWNlVmVydGV4VXZzWyBq
IF0uc3BsaWNlKCBpZHgsIDEgKTsKKworCQkJCX0KKworCQkJfQorCisJCQkvLyBVc2UgdW5pcXVl
IHNldCBvZiB2ZXJ0aWNlcworCisJCQl2YXIgZGlmZiA9IHRoaXMudmVydGljZXMubGVuZ3RoIC0g
dW5pcXVlLmxlbmd0aDsKKwkJCXRoaXMudmVydGljZXMgPSB1bmlxdWU7CisJCQlyZXR1cm4gZGlm
ZjsKKworCQl9LAorCisJCXNvcnRGYWNlc0J5TWF0ZXJpYWxJbmRleDogZnVuY3Rpb24gKCkgewor
CisJCQl2YXIgZmFjZXMgPSB0aGlzLmZhY2VzOworCQkJdmFyIGxlbmd0aCA9IGZhY2VzLmxlbmd0
aDsKKworCQkJLy8gdGFnIGZhY2VzCisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsg
aSArKyApIHsKKworCQkJCWZhY2VzWyBpIF0uX2lkID0gaTsKKworCQkJfQorCisJCQkvLyBzb3J0
IGZhY2VzCisKKwkJCWZ1bmN0aW9uIG1hdGVyaWFsSW5kZXhTb3J0KCBhLCBiICkgeworCisJCQkJ
cmV0dXJuIGEubWF0ZXJpYWxJbmRleCAtIGIubWF0ZXJpYWxJbmRleDsKKworCQkJfQorCisJCQlm
YWNlcy5zb3J0KCBtYXRlcmlhbEluZGV4U29ydCApOworCisJCQkvLyBzb3J0IHV2cworCisJCQl2
YXIgdXZzMSA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdOworCQkJdmFyIHV2czIgPSB0aGlzLmZh
Y2VWZXJ0ZXhVdnNbIDEgXTsKKworCQkJdmFyIG5ld1V2czEsIG5ld1V2czI7CisKKwkJCWlmICgg
dXZzMSAmJiB1dnMxLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMSA9IFtdOworCQkJaWYgKCB1
dnMyICYmIHV2czIubGVuZ3RoID09PSBsZW5ndGggKSBuZXdVdnMyID0gW107CisKKwkJCWZvciAo
IHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHsKKworCQkJCXZhciBpZCA9IGZhY2VzWyBp
IF0uX2lkOworCisJCQkJaWYgKCBuZXdVdnMxICkgbmV3VXZzMS5wdXNoKCB1dnMxWyBpZCBdICk7
CisJCQkJaWYgKCBuZXdVdnMyICkgbmV3VXZzMi5wdXNoKCB1dnMyWyBpZCBdICk7CisKKwkJCX0K
KworCQkJaWYgKCBuZXdVdnMxICkgdGhpcy5mYWNlVmVydGV4VXZzWyAwIF0gPSBuZXdVdnMxOwor
CQkJaWYgKCBuZXdVdnMyICkgdGhpcy5mYWNlVmVydGV4VXZzWyAxIF0gPSBuZXdVdnMyOworCisJ
CX0sCisKKwkJdG9KU09OOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBkYXRhID0geworCQkJCW1l
dGFkYXRhOiB7CisJCQkJCXZlcnNpb246IDQuNSwKKwkJCQkJdHlwZTogJ0dlb21ldHJ5JywKKwkJ
CQkJZ2VuZXJhdG9yOiAnR2VvbWV0cnkudG9KU09OJworCQkJCX0KKwkJCX07CisKKwkJCS8vIHN0
YW5kYXJkIEdlb21ldHJ5IHNlcmlhbGl6YXRpb24KKworCQkJZGF0YS51dWlkID0gdGhpcy51dWlk
OworCQkJZGF0YS50eXBlID0gdGhpcy50eXBlOworCQkJaWYgKCB0aGlzLm5hbWUgIT09ICcnICkg
ZGF0YS5uYW1lID0gdGhpcy5uYW1lOworCisJCQlpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5k
ZWZpbmVkICkgeworCisJCQkJdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7CisKKwkJ
CQlmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7CisKKwkJCQkJaWYgKCBwYXJhbWV0ZXJz
WyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTsK
KworCQkJCX0KKworCQkJCXJldHVybiBkYXRhOworCisJCQl9CisKKwkJCXZhciB2ZXJ0aWNlcyA9
IFtdOworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSAr
KyApIHsKKworCQkJCXZhciB2ZXJ0ZXggPSB0aGlzLnZlcnRpY2VzWyBpIF07CisJCQkJdmVydGlj
ZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJCQl9CisKKwkJCXZh
ciBmYWNlcyA9IFtdOworCQkJdmFyIG5vcm1hbHMgPSBbXTsKKwkJCXZhciBub3JtYWxzSGFzaCA9
IHt9OworCQkJdmFyIGNvbG9ycyA9IFtdOworCQkJdmFyIGNvbG9yc0hhc2ggPSB7fTsKKwkJCXZh
ciB1dnMgPSBbXTsKKwkJCXZhciB1dnNIYXNoID0ge307CisKKwkJCWZvciAoIHZhciBpID0gMDsg
aSA8IHRoaXMuZmFjZXMubGVuZ3RoOyBpICsrICkgeworCisJCQkJdmFyIGZhY2UgPSB0aGlzLmZh
Y2VzWyBpIF07CisKKwkJCQl2YXIgaGFzTWF0ZXJpYWwgPSB0cnVlOworCQkJCXZhciBoYXNGYWNl
VXYgPSBmYWxzZTsgLy8gZGVwcmVjYXRlZAorCQkJCXZhciBoYXNGYWNlVmVydGV4VXYgPSB0aGlz
LmZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdICE9PSB1bmRlZmluZWQ7CisJCQkJdmFyIGhhc0ZhY2VO
b3JtYWwgPSBmYWNlLm5vcm1hbC5sZW5ndGgoKSA+IDA7CisJCQkJdmFyIGhhc0ZhY2VWZXJ0ZXhO
b3JtYWwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoID4gMDsKKwkJCQl2YXIgaGFzRmFjZUNv
bG9yID0gZmFjZS5jb2xvci5yICE9PSAxIHx8IGZhY2UuY29sb3IuZyAhPT0gMSB8fCBmYWNlLmNv
bG9yLmIgIT09IDE7CisJCQkJdmFyIGhhc0ZhY2VWZXJ0ZXhDb2xvciA9IGZhY2UudmVydGV4Q29s
b3JzLmxlbmd0aCA+IDA7CisKKwkJCQl2YXIgZmFjZVR5cGUgPSAwOworCisJCQkJZmFjZVR5cGUg
PSBzZXRCaXQoIGZhY2VUeXBlLCAwLCAwICk7IC8vIGlzUXVhZAorCQkJCWZhY2VUeXBlID0gc2V0
Qml0KCBmYWNlVHlwZSwgMSwgaGFzTWF0ZXJpYWwgKTsKKwkJCQlmYWNlVHlwZSA9IHNldEJpdCgg
ZmFjZVR5cGUsIDIsIGhhc0ZhY2VVdiApOworCQkJCWZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlw
ZSwgMywgaGFzRmFjZVZlcnRleFV2ICk7CisJCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBl
LCA0LCBoYXNGYWNlTm9ybWFsICk7CisJCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA1
LCBoYXNGYWNlVmVydGV4Tm9ybWFsICk7CisJCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBl
LCA2LCBoYXNGYWNlQ29sb3IgKTsKKwkJCQlmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDcs
IGhhc0ZhY2VWZXJ0ZXhDb2xvciApOworCisJCQkJZmFjZXMucHVzaCggZmFjZVR5cGUgKTsKKwkJ
CQlmYWNlcy5wdXNoKCBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jICk7CisJCQkJZmFjZXMucHVzaCgg
ZmFjZS5tYXRlcmlhbEluZGV4ICk7CisKKwkJCQlpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHsKKwor
CQkJCQl2YXIgZmFjZVZlcnRleFV2cyA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF07CisK
KwkJCQkJZmFjZXMucHVzaCgKKwkJCQkJCWdldFV2SW5kZXgoIGZhY2VWZXJ0ZXhVdnNbIDAgXSAp
LAorCQkJCQkJZ2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMSBdICksCisJCQkJCQlnZXRVdklu
ZGV4KCBmYWNlVmVydGV4VXZzWyAyIF0gKQorCQkJCQkpOworCisJCQkJfQorCisJCQkJaWYgKCBo
YXNGYWNlTm9ybWFsICkgeworCisJCQkJCWZhY2VzLnB1c2goIGdldE5vcm1hbEluZGV4KCBmYWNl
Lm5vcm1hbCApICk7CisKKwkJCQl9CisKKwkJCQlpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7
CisKKwkJCQkJdmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7CisKKwkJCQkJ
ZmFjZXMucHVzaCgKKwkJCQkJCWdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAwIF0gKSwK
KwkJCQkJCWdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAxIF0gKSwKKwkJCQkJCWdldE5v
cm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAyIF0gKQorCQkJCQkpOworCisJCQkJfQorCisJCQkJ
aWYgKCBoYXNGYWNlQ29sb3IgKSB7CisKKwkJCQkJZmFjZXMucHVzaCggZ2V0Q29sb3JJbmRleCgg
ZmFjZS5jb2xvciApICk7CisKKwkJCQl9CisKKwkJCQlpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciAp
IHsKKworCQkJCQl2YXIgdmVydGV4Q29sb3JzID0gZmFjZS52ZXJ0ZXhDb2xvcnM7CisKKwkJCQkJ
ZmFjZXMucHVzaCgKKwkJCQkJCWdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMCBdICksCisJ
CQkJCQlnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDEgXSApLAorCQkJCQkJZ2V0Q29sb3JJ
bmRleCggdmVydGV4Q29sb3JzWyAyIF0gKQorCQkJCQkpOworCisJCQkJfQorCisJCQl9CisKKwkJ
CWZ1bmN0aW9uIHNldEJpdCggdmFsdWUsIHBvc2l0aW9uLCBlbmFibGVkICkgeworCisJCQkJcmV0
dXJuIGVuYWJsZWQgPyB2YWx1ZSB8ICggMSA8PCBwb3NpdGlvbiApIDogdmFsdWUgJiAoIH4gKCAx
IDw8IHBvc2l0aW9uICkgKTsKKworCQkJfQorCisJCQlmdW5jdGlvbiBnZXROb3JtYWxJbmRleCgg
bm9ybWFsICkgeworCisJCQkJdmFyIGhhc2ggPSBub3JtYWwueC50b1N0cmluZygpICsgbm9ybWFs
LnkudG9TdHJpbmcoKSArIG5vcm1hbC56LnRvU3RyaW5nKCk7CisKKwkJCQlpZiAoIG5vcm1hbHNI
YXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQlyZXR1cm4gbm9ybWFsc0hhc2hb
IGhhc2ggXTsKKworCQkJCX0KKworCQkJCW5vcm1hbHNIYXNoWyBoYXNoIF0gPSBub3JtYWxzLmxl
bmd0aCAvIDM7CisJCQkJbm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56
ICk7CisKKwkJCQlyZXR1cm4gbm9ybWFsc0hhc2hbIGhhc2ggXTsKKworCQkJfQorCisJCQlmdW5j
dGlvbiBnZXRDb2xvckluZGV4KCBjb2xvciApIHsKKworCQkJCXZhciBoYXNoID0gY29sb3Iuci50
b1N0cmluZygpICsgY29sb3IuZy50b1N0cmluZygpICsgY29sb3IuYi50b1N0cmluZygpOworCisJ
CQkJaWYgKCBjb2xvcnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQlyZXR1
cm4gY29sb3JzSGFzaFsgaGFzaCBdOworCisJCQkJfQorCisJCQkJY29sb3JzSGFzaFsgaGFzaCBd
ID0gY29sb3JzLmxlbmd0aDsKKwkJCQljb2xvcnMucHVzaCggY29sb3IuZ2V0SGV4KCkgKTsKKwor
CQkJCXJldHVybiBjb2xvcnNIYXNoWyBoYXNoIF07CisKKwkJCX0KKworCQkJZnVuY3Rpb24gZ2V0
VXZJbmRleCggdXYgKSB7CisKKwkJCQl2YXIgaGFzaCA9IHV2LngudG9TdHJpbmcoKSArIHV2Lnku
dG9TdHJpbmcoKTsKKworCQkJCWlmICggdXZzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7
CisKKwkJCQkJcmV0dXJuIHV2c0hhc2hbIGhhc2ggXTsKKworCQkJCX0KKworCQkJCXV2c0hhc2hb
IGhhc2ggXSA9IHV2cy5sZW5ndGggLyAyOworCQkJCXV2cy5wdXNoKCB1di54LCB1di55ICk7CisK
KwkJCQlyZXR1cm4gdXZzSGFzaFsgaGFzaCBdOworCisJCQl9CisKKwkJCWRhdGEuZGF0YSA9IHt9
OworCisJCQlkYXRhLmRhdGEudmVydGljZXMgPSB2ZXJ0aWNlczsKKwkJCWRhdGEuZGF0YS5ub3Jt
YWxzID0gbm9ybWFsczsKKwkJCWlmICggY29sb3JzLmxlbmd0aCA+IDAgKSBkYXRhLmRhdGEuY29s
b3JzID0gY29sb3JzOworCQkJaWYgKCB1dnMubGVuZ3RoID4gMCApIGRhdGEuZGF0YS51dnMgPSBb
IHV2cyBdOyAvLyB0ZW1wb3JhbCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisJCQlkYXRhLmRhdGEu
ZmFjZXMgPSBmYWNlczsKKworCQkJcmV0dXJuIGRhdGE7CisKKwkJfSwKKworCQljbG9uZTogZnVu
Y3Rpb24gKCkgeworCisJCQkvKgorCQkJIC8vIEhhbmRsZSBwcmltaXRpdmVzCisKKwkJCSB2YXIg
cGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVyczsKKworCQkJIGlmICggcGFyYW1ldGVycyAhPT0g
dW5kZWZpbmVkICkgeworCisJCQkgdmFyIHZhbHVlcyA9IFtdOworCisJCQkgZm9yICggdmFyIGtl
eSBpbiBwYXJhbWV0ZXJzICkgeworCisJCQkgdmFsdWVzLnB1c2goIHBhcmFtZXRlcnNbIGtleSBd
ICk7CisKKwkJCSB9CisKKwkJCSB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNv
bnN0cnVjdG9yLnByb3RvdHlwZSApOworCQkJIHRoaXMuY29uc3RydWN0b3IuYXBwbHkoIGdlb21l
dHJ5LCB2YWx1ZXMgKTsKKwkJCSByZXR1cm4gZ2VvbWV0cnk7CisKKwkJCSB9CisKKwkJCSByZXR1
cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisJCQkgKi8KKworCQkJcmV0
dXJuIG5ldyBHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTsKKworCQl9LAorCisJCWNvcHk6IGZ1bmN0
aW9uICggc291cmNlICkgeworCisJCQl2YXIgaSwgaWwsIGosIGpsLCBrLCBrbDsKKworCQkJLy8g
cmVzZXQKKworCQkJdGhpcy52ZXJ0aWNlcyA9IFtdOworCQkJdGhpcy5jb2xvcnMgPSBbXTsKKwkJ
CXRoaXMuZmFjZXMgPSBbXTsKKwkJCXRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07CisJCQl0aGlz
Lm1vcnBoVGFyZ2V0cyA9IFtdOworCQkJdGhpcy5tb3JwaE5vcm1hbHMgPSBbXTsKKwkJCXRoaXMu
c2tpbldlaWdodHMgPSBbXTsKKwkJCXRoaXMuc2tpbkluZGljZXMgPSBbXTsKKwkJCXRoaXMubGlu
ZURpc3RhbmNlcyA9IFtdOworCQkJdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CisJCQl0aGlzLmJv
dW5kaW5nU3BoZXJlID0gbnVsbDsKKworCQkJLy8gbmFtZQorCisJCQl0aGlzLm5hbWUgPSBzb3Vy
Y2UubmFtZTsKKworCQkJLy8gdmVydGljZXMKKworCQkJdmFyIHZlcnRpY2VzID0gc291cmNlLnZl
cnRpY2VzOworCisJCQlmb3IgKCBpID0gMCwgaWwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsg
aSArKyApIHsKKworCQkJCXRoaXMudmVydGljZXMucHVzaCggdmVydGljZXNbIGkgXS5jbG9uZSgp
ICk7CisKKwkJCX0KKworCQkJLy8gY29sb3JzCisKKwkJCXZhciBjb2xvcnMgPSBzb3VyY2UuY29s
b3JzOworCisJCQlmb3IgKCBpID0gMCwgaWwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysg
KSB7CisKKwkJCQl0aGlzLmNvbG9ycy5wdXNoKCBjb2xvcnNbIGkgXS5jbG9uZSgpICk7CisKKwkJ
CX0KKworCQkJLy8gZmFjZXMKKworCQkJdmFyIGZhY2VzID0gc291cmNlLmZhY2VzOworCisJCQlm
b3IgKCBpID0gMCwgaWwgPSBmYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJCXRo
aXMuZmFjZXMucHVzaCggZmFjZXNbIGkgXS5jbG9uZSgpICk7CisKKwkJCX0KKworCQkJLy8gZmFj
ZSB2ZXJ0ZXggdXZzCisKKwkJCWZvciAoIGkgPSAwLCBpbCA9IHNvdXJjZS5mYWNlVmVydGV4VXZz
Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJdmFyIGZhY2VWZXJ0ZXhVdnMgPSBzb3Vy
Y2UuZmFjZVZlcnRleFV2c1sgaSBdOworCisJCQkJaWYgKCB0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkg
XSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCXRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID0gW107
CisKKwkJCQl9CisKKwkJCQlmb3IgKCBqID0gMCwgamwgPSBmYWNlVmVydGV4VXZzLmxlbmd0aDsg
aiA8IGpsOyBqICsrICkgeworCisJCQkJCXZhciB1dnMgPSBmYWNlVmVydGV4VXZzWyBqIF0sIHV2
c0NvcHkgPSBbXTsKKworCQkJCQlmb3IgKCBrID0gMCwga2wgPSB1dnMubGVuZ3RoOyBrIDwga2w7
IGsgKysgKSB7CisKKwkJCQkJCXZhciB1diA9IHV2c1sgayBdOworCisJCQkJCQl1dnNDb3B5LnB1
c2goIHV2LmNsb25lKCkgKTsKKworCQkJCQl9CisKKwkJCQkJdGhpcy5mYWNlVmVydGV4VXZzWyBp
IF0ucHVzaCggdXZzQ29weSApOworCisJCQkJfQorCisJCQl9CisKKwkJCS8vIG1vcnBoIHRhcmdl
dHMKKworCQkJdmFyIG1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CisKKwkJCWZv
ciAoIGkgPSAwLCBpbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKwor
CQkJCXZhciBtb3JwaFRhcmdldCA9IHt9OworCQkJCW1vcnBoVGFyZ2V0Lm5hbWUgPSBtb3JwaFRh
cmdldHNbIGkgXS5uYW1lOworCisJCQkJLy8gdmVydGljZXMKKworCQkJCWlmICggbW9ycGhUYXJn
ZXRzWyBpIF0udmVydGljZXMgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQltb3JwaFRhcmdldC52
ZXJ0aWNlcyA9IFtdOworCisJCQkJCWZvciAoIGogPSAwLCBqbCA9IG1vcnBoVGFyZ2V0c1sgaSBd
LnZlcnRpY2VzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgeworCisJCQkJCQltb3JwaFRhcmdldC52
ZXJ0aWNlcy5wdXNoKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlc1sgaiBdLmNsb25lKCkgKTsK
KworCQkJCQl9CisKKwkJCQl9CisKKwkJCQkvLyBub3JtYWxzCisKKwkJCQlpZiAoIG1vcnBoVGFy
Z2V0c1sgaSBdLm5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQltb3JwaFRhcmdldC5u
b3JtYWxzID0gW107CisKKwkJCQkJZm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0u
bm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKKworCQkJCQkJbW9ycGhUYXJnZXQubm9y
bWFscy5wdXNoKCBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzWyBqIF0uY2xvbmUoKSApOworCisJ
CQkJCX0KKworCQkJCX0KKworCQkJCXRoaXMubW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0
ICk7CisKKwkJCX0KKworCQkJLy8gbW9ycGggbm9ybWFscworCisJCQl2YXIgbW9ycGhOb3JtYWxz
ID0gc291cmNlLm1vcnBoTm9ybWFsczsKKworCQkJZm9yICggaSA9IDAsIGlsID0gbW9ycGhOb3Jt
YWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJdmFyIG1vcnBoTm9ybWFsID0ge307
CisKKwkJCQkvLyB2ZXJ0ZXggbm9ybWFscworCisJCQkJaWYgKCBtb3JwaE5vcm1hbHNbIGkgXS52
ZXJ0ZXhOb3JtYWxzICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJbW9ycGhOb3JtYWwudmVydGV4
Tm9ybWFscyA9IFtdOworCisJCQkJCWZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBd
LnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CisKKwkJCQkJCXZhciBzcmNW
ZXJ0ZXhOb3JtYWwgPSBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzWyBqIF07CisJCQkJ
CQl2YXIgZGVzdFZlcnRleE5vcm1hbCA9IHt9OworCisJCQkJCQlkZXN0VmVydGV4Tm9ybWFsLmEg
PSBzcmNWZXJ0ZXhOb3JtYWwuYS5jbG9uZSgpOworCQkJCQkJZGVzdFZlcnRleE5vcm1hbC5iID0g
c3JjVmVydGV4Tm9ybWFsLmIuY2xvbmUoKTsKKwkJCQkJCWRlc3RWZXJ0ZXhOb3JtYWwuYyA9IHNy
Y1ZlcnRleE5vcm1hbC5jLmNsb25lKCk7CisKKwkJCQkJCW1vcnBoTm9ybWFsLnZlcnRleE5vcm1h
bHMucHVzaCggZGVzdFZlcnRleE5vcm1hbCApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJCS8v
IGZhY2Ugbm9ybWFscworCisJCQkJaWYgKCBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscyAh
PT0gdW5kZWZpbmVkICkgeworCisJCQkJCW1vcnBoTm9ybWFsLmZhY2VOb3JtYWxzID0gW107CisK
KwkJCQkJZm9yICggaiA9IDAsIGpsID0gbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMubGVu
Z3RoOyBqIDwgamw7IGogKysgKSB7CisKKwkJCQkJCW1vcnBoTm9ybWFsLmZhY2VOb3JtYWxzLnB1
c2goIG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzWyBqIF0uY2xvbmUoKSApOworCisJCQkJ
CX0KKworCQkJCX0KKworCQkJCXRoaXMubW9ycGhOb3JtYWxzLnB1c2goIG1vcnBoTm9ybWFsICk7
CisKKwkJCX0KKworCQkJLy8gc2tpbiB3ZWlnaHRzCisKKwkJCXZhciBza2luV2VpZ2h0cyA9IHNv
dXJjZS5za2luV2VpZ2h0czsKKworCQkJZm9yICggaSA9IDAsIGlsID0gc2tpbldlaWdodHMubGVu
Z3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQl0aGlzLnNraW5XZWlnaHRzLnB1c2goIHNraW5X
ZWlnaHRzWyBpIF0uY2xvbmUoKSApOworCisJCQl9CisKKwkJCS8vIHNraW4gaW5kaWNlcworCisJ
CQl2YXIgc2tpbkluZGljZXMgPSBzb3VyY2Uuc2tpbkluZGljZXM7CisKKwkJCWZvciAoIGkgPSAw
LCBpbCA9IHNraW5JbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJdGhpcy5z
a2luSW5kaWNlcy5wdXNoKCBza2luSW5kaWNlc1sgaSBdLmNsb25lKCkgKTsKKworCQkJfQorCisJ
CQkvLyBsaW5lIGRpc3RhbmNlcworCisJCQl2YXIgbGluZURpc3RhbmNlcyA9IHNvdXJjZS5saW5l
RGlzdGFuY2VzOworCisJCQlmb3IgKCBpID0gMCwgaWwgPSBsaW5lRGlzdGFuY2VzLmxlbmd0aDsg
aSA8IGlsOyBpICsrICkgeworCisJCQkJdGhpcy5saW5lRGlzdGFuY2VzLnB1c2goIGxpbmVEaXN0
YW5jZXNbIGkgXSApOworCisJCQl9CisKKwkJCS8vIGJvdW5kaW5nIGJveAorCisJCQl2YXIgYm91
bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3g7CisKKwkJCWlmICggYm91bmRpbmdCb3ggIT09
IG51bGwgKSB7CisKKwkJCQl0aGlzLmJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3guY2xvbmUoKTsK
KworCQkJfQorCisJCQkvLyBib3VuZGluZyBzcGhlcmUKKworCQkJdmFyIGJvdW5kaW5nU3BoZXJl
ID0gc291cmNlLmJvdW5kaW5nU3BoZXJlOworCisJCQlpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBu
dWxsICkgeworCisJCQkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25l
KCk7CisKKwkJCX0KKworCQkJLy8gdXBkYXRlIGZsYWdzCisKKwkJCXRoaXMuZWxlbWVudHNOZWVk
VXBkYXRlID0gc291cmNlLmVsZW1lbnRzTmVlZFVwZGF0ZTsKKwkJCXRoaXMudmVydGljZXNOZWVk
VXBkYXRlID0gc291cmNlLnZlcnRpY2VzTmVlZFVwZGF0ZTsKKwkJCXRoaXMudXZzTmVlZFVwZGF0
ZSA9IHNvdXJjZS51dnNOZWVkVXBkYXRlOworCQkJdGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHNv
dXJjZS5ub3JtYWxzTmVlZFVwZGF0ZTsKKwkJCXRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IHNvdXJj
ZS5jb2xvcnNOZWVkVXBkYXRlOworCQkJdGhpcy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSA9IHNv
dXJjZS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZTsKKwkJCXRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9
IHNvdXJjZS5ncm91cHNOZWVkVXBkYXRlOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJ
CWRpc3Bvc2U6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6
ICdkaXNwb3NlJyB9ICk7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRv
b2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEJ1ZmZlckF0dHJpYnV0
ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkgeworCisJCWlmICggQXJyYXkuaXNBcnJh
eSggYXJyYXkgKSApIHsKKworCQkJdGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0
dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApOworCisJCX0KKworCQl0
aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKKwkJdGhpcy5uYW1lID0gJyc7CisKKwkJ
dGhpcy5hcnJheSA9IGFycmF5OworCQl0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7CisJCXRoaXMu
Y291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gaXRlbVNpemUgOiAw
OworCQl0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkID09PSB0cnVlOworCisJCXRoaXMuZHlu
YW1pYyA9IGZhbHNlOworCQl0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAt
IDEgfTsKKworCQl0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKKworCQl0
aGlzLnZlcnNpb24gPSAwOworCisJfQorCisJT2JqZWN0LmRlZmluZVByb3BlcnR5KCBCdWZmZXJB
dHRyaWJ1dGUucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7CisKKwkJc2V0OiBmdW5jdGlvbiAo
IHZhbHVlICkgeworCisJCQlpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrOwor
CisJCX0KKworCX0gKTsKKworCU9iamVjdC5hc3NpZ24oIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5
cGUsIHsKKworCQlpc0J1ZmZlckF0dHJpYnV0ZTogdHJ1ZSwKKworCQlzZXRBcnJheTogZnVuY3Rp
b24gKCBhcnJheSApIHsKKworCQkJaWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkgeworCisJ
CQkJdGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hv
dWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApOworCisJCQl9CisKKwkJCXRoaXMuY291bnQgPSBhcnJh
eSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gdGhpcy5pdGVtU2l6ZSA6IDA7CisJCQl0
aGlzLmFycmF5ID0gYXJyYXk7CisKKwkJfSwKKworCQlzZXREeW5hbWljOiBmdW5jdGlvbiAoIHZh
bHVlICkgeworCisJCQl0aGlzLmR5bmFtaWMgPSB2YWx1ZTsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworCQkJdGhpcy5hcnJheSA9
IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApOworCQkJdGhpcy5p
dGVtU2l6ZSA9IHNvdXJjZS5pdGVtU2l6ZTsKKwkJCXRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7
CisJCQl0aGlzLm5vcm1hbGl6ZWQgPSBzb3VyY2Uubm9ybWFsaXplZDsKKworCQkJdGhpcy5keW5h
bWljID0gc291cmNlLmR5bmFtaWM7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY29w
eUF0OiBmdW5jdGlvbiAoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIgKSB7CisKKwkJCWluZGV4
MSAqPSB0aGlzLml0ZW1TaXplOworCQkJaW5kZXgyICo9IGF0dHJpYnV0ZS5pdGVtU2l6ZTsKKwor
CQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5pdGVtU2l6ZTsgaSA8IGw7IGkgKysgKSB7CisK
KwkJCQl0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiAr
IGkgXTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNvcHlBcnJheTog
ZnVuY3Rpb24gKCBhcnJheSApIHsKKworCQkJdGhpcy5hcnJheS5zZXQoIGFycmF5ICk7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY29weUNvbG9yc0FycmF5OiBmdW5jdGlvbiAoIGNv
bG9ycyApIHsKKworCQkJdmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDsKKworCQkJ
Zm9yICggdmFyIGkgPSAwLCBsID0gY29sb3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJ
CQl2YXIgY29sb3IgPSBjb2xvcnNbIGkgXTsKKworCQkJCWlmICggY29sb3IgPT09IHVuZGVmaW5l
ZCApIHsKKworCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weUNv
bG9yc0FycmF5KCk6IGNvbG9yIGlzIHVuZGVmaW5lZCcsIGkgKTsKKwkJCQkJY29sb3IgPSBuZXcg
Q29sb3IoKTsKKworCQkJCX0KKworCQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLnI7CisJ
CQkJYXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IuZzsKKwkJCQlhcnJheVsgb2Zmc2V0ICsrIF0g
PSBjb2xvci5iOworCisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJY29weUlu
ZGljZXNBcnJheTogZnVuY3Rpb24gKCBpbmRpY2VzICkgeworCisJCQl2YXIgYXJyYXkgPSB0aGlz
LmFycmF5LCBvZmZzZXQgPSAwOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbmRpY2VzLmxl
bmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQl2YXIgaW5kZXggPSBpbmRpY2VzWyBpIF07CisK
KwkJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSBpbmRleC5hOworCQkJCWFycmF5WyBvZmZzZXQgKysg
XSA9IGluZGV4LmI7CisJCQkJYXJyYXlbIG9mZnNldCArKyBdID0gaW5kZXguYzsKKworCQkJfQor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNvcHlWZWN0b3Iyc0FycmF5OiBmdW5jdGlv
biAoIHZlY3RvcnMgKSB7CisKKwkJCXZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7
CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyAp
IHsKKworCQkJCXZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07CisKKwkJCQlpZiAoIHZlY3RvciA9
PT0gdW5kZWZpbmVkICkgeworCisJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJp
YnV0ZS5jb3B5VmVjdG9yMnNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApOworCQkJ
CQl2ZWN0b3IgPSBuZXcgVmVjdG9yMigpOworCisJCQkJfQorCisJCQkJYXJyYXlbIG9mZnNldCAr
KyBdID0gdmVjdG9yLng7CisJCQkJYXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7CisKKwkJ
CX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljb3B5VmVjdG9yM3NBcnJheTogZnVu
Y3Rpb24gKCB2ZWN0b3JzICkgeworCisJCQl2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQg
PSAwOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkg
KysgKSB7CisKKwkJCQl2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdOworCisJCQkJaWYgKCB2ZWN0
b3IgPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJB
dHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTsK
KwkJCQkJdmVjdG9yID0gbmV3IFZlY3RvcjMoKTsKKworCQkJCX0KKworCQkJCWFycmF5WyBvZmZz
ZXQgKysgXSA9IHZlY3Rvci54OworCQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55Owor
CQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56OworCisJCQl9CisKKwkJCXJldHVybiB0
aGlzOworCisJCX0sCisKKwkJY29weVZlY3RvcjRzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyAp
IHsKKworCQkJdmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDsKKworCQkJZm9yICgg
dmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJdmFy
IHZlY3RvciA9IHZlY3RvcnNbIGkgXTsKKworCQkJCWlmICggdmVjdG9yID09PSB1bmRlZmluZWQg
KSB7CisKKwkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0
b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7CisJCQkJCXZlY3RvciA9IG5l
dyBWZWN0b3I0KCk7CisKKwkJCQl9CisKKwkJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3Iu
eDsKKwkJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTsKKwkJCQlhcnJheVsgb2Zmc2V0
ICsrIF0gPSB2ZWN0b3IuejsKKwkJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IudzsKKwor
CQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldDogZnVuY3Rpb24gKCB2YWx1
ZSwgb2Zmc2V0ICkgeworCisJCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0g
MDsKKworCQkJdGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTsKKworCQkJcmV0dXJuIHRo
aXM7CisKKwkJfSwKKworCQlnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisJCQlyZXR1cm4g
dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplIF07CisKKwkJfSwKKworCQlzZXRYOiBm
dW5jdGlvbiAoIGluZGV4LCB4ICkgeworCisJCQl0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRl
bVNpemUgXSA9IHg7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZ2V0WTogZnVuY3Rp
b24gKCBpbmRleCApIHsKKworCQkJcmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVt
U2l6ZSArIDEgXTsKKworCQl9LAorCisJCXNldFk6IGZ1bmN0aW9uICggaW5kZXgsIHkgKSB7CisK
KwkJCXRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJZ2V0WjogZnVuY3Rpb24gKCBpbmRleCApIHsKKworCQkJ
cmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXTsKKworCQl9LAor
CisJCXNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7CisKKwkJCXRoaXMuYXJyYXlbIGluZGV4
ICogdGhpcy5pdGVtU2l6ZSArIDIgXSA9IHo7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJZ2V0VzogZnVuY3Rpb24gKCBpbmRleCApIHsKKworCQkJcmV0dXJuIHRoaXMuYXJyYXlbIGlu
ZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXTsKKworCQl9LAorCisJCXNldFc6IGZ1bmN0aW9uICgg
aW5kZXgsIHcgKSB7CisKKwkJCXRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMg
XSA9IHc7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0WFk6IGZ1bmN0aW9uICgg
aW5kZXgsIHgsIHkgKSB7CisKKwkJCWluZGV4ICo9IHRoaXMuaXRlbVNpemU7CisKKwkJCXRoaXMu
YXJyYXlbIGluZGV4ICsgMCBdID0geDsKKwkJCXRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTsK
KworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgs
IHgsIHksIHogKSB7CisKKwkJCWluZGV4ICo9IHRoaXMuaXRlbVNpemU7CisKKwkJCXRoaXMuYXJy
YXlbIGluZGV4ICsgMCBdID0geDsKKwkJCXRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTsKKwkJ
CXRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwK
KworCQlzZXRYWVpXOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6LCB3ICkgeworCisJCQlpbmRl
eCAqPSB0aGlzLml0ZW1TaXplOworCisJCQl0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7CisJ
CQl0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7CisJCQl0aGlzLmFycmF5WyBpbmRleCArIDIg
XSA9IHo7CisJCQl0aGlzLmFycmF5WyBpbmRleCArIDMgXSA9IHc7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJb25VcGxvYWQ6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7CisKKwkJCXRo
aXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9
LAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1
Y3RvciggdGhpcy5hcnJheSwgdGhpcy5pdGVtU2l6ZSApLmNvcHkoIHRoaXMgKTsKKworCQl9CisK
Kwl9ICk7CisKKwkvLworCisJZnVuY3Rpb24gSW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0
ZW1TaXplICkgeworCisJCUJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50OEFycmF5
KCBhcnJheSApLCBpdGVtU2l6ZSApOworCisJfQorCisJSW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90
b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7CisJSW50
OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQ4QnVmZmVyQXR0cmli
dXRlOworCisKKwlmdW5jdGlvbiBVaW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXpl
ICkgeworCisJCUJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhBcnJheSggYXJy
YXkgKSwgaXRlbVNpemUgKTsKKworCX0KKworCVVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlw
ZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTsKKwlVaW50OEJ1
ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OEJ1ZmZlckF0dHJpYnV0
ZTsKKworCisJZnVuY3Rpb24gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRl
bVNpemUgKSB7CisKKwkJQnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OENsYW1w
ZWRBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTsKKworCX0KKworCVVpbnQ4Q2xhbXBlZEJ1ZmZl
ckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJv
dG90eXBlICk7CisJVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1
Y3RvciA9IFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZTsKKworCisJZnVuY3Rpb24gSW50MTZC
dWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworCQlCdWZmZXJBdHRyaWJ1dGUu
Y2FsbCggdGhpcywgbmV3IEludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7CisKKwl9CisK
KwlJbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJB
dHRyaWJ1dGUucHJvdG90eXBlICk7CisJSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNv
bnN0cnVjdG9yID0gSW50MTZCdWZmZXJBdHRyaWJ1dGU7CisKKworCWZ1bmN0aW9uIFVpbnQxNkJ1
ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisJCUJ1ZmZlckF0dHJpYnV0ZS5j
YWxsKCB0aGlzLCBuZXcgVWludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7CisKKwl9CisK
KwlVaW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVy
QXR0cmlidXRlLnByb3RvdHlwZSApOworCVVpbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUu
Y29uc3RydWN0b3IgPSBVaW50MTZCdWZmZXJBdHRyaWJ1dGU7CisKKworCWZ1bmN0aW9uIEludDMy
QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKwkJQnVmZmVyQXR0cmlidXRl
LmNhbGwoIHRoaXMsIG5ldyBJbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApOworCisJfQor
CisJSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVy
QXR0cmlidXRlLnByb3RvdHlwZSApOworCUludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IEludDMyQnVmZmVyQXR0cmlidXRlOworCisKKwlmdW5jdGlvbiBVaW50MzJC
dWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworCQlCdWZmZXJBdHRyaWJ1dGUu
Y2FsbCggdGhpcywgbmV3IFVpbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApOworCisJfQor
CisJVWludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZl
ckF0dHJpYnV0ZS5wcm90b3R5cGUgKTsKKwlVaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBl
LmNvbnN0cnVjdG9yID0gVWludDMyQnVmZmVyQXR0cmlidXRlOworCisKKwlmdW5jdGlvbiBGbG9h
dDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKwkJQnVmZmVyQXR0cmli
dXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7CisK
Kwl9CisKKwlGbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUo
IEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTsKKwlGbG9hdDMyQnVmZmVyQXR0cmlidXRlLnBy
b3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU7CisKKworCWZ1bmN0
aW9uIEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworCQlCdWZm
ZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0NjRBcnJheSggYXJyYXkgKSwgaXRlbVNp
emUgKTsKKworCX0KKworCUZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0
LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApOworCUZsb2F0NjRCdWZmZXJBdHRy
aWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZTsKKwor
CS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlm
dW5jdGlvbiBEaXJlY3RHZW9tZXRyeSgpIHsKKworCQl0aGlzLmluZGljZXMgPSBbXTsKKwkJdGhp
cy52ZXJ0aWNlcyA9IFtdOworCQl0aGlzLm5vcm1hbHMgPSBbXTsKKwkJdGhpcy5jb2xvcnMgPSBb
XTsKKwkJdGhpcy51dnMgPSBbXTsKKwkJdGhpcy51dnMyID0gW107CisKKwkJdGhpcy5ncm91cHMg
PSBbXTsKKworCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IHt9OworCisJCXRoaXMuc2tpbldlaWdodHMg
PSBbXTsKKwkJdGhpcy5za2luSW5kaWNlcyA9IFtdOworCisJCS8vIHRoaXMubGluZURpc3RhbmNl
cyA9IFtdOworCisJCXRoaXMuYm91bmRpbmdCb3ggPSBudWxsOworCQl0aGlzLmJvdW5kaW5nU3Bo
ZXJlID0gbnVsbDsKKworCQkvLyB1cGRhdGUgZmxhZ3MKKworCQl0aGlzLnZlcnRpY2VzTmVlZFVw
ZGF0ZSA9IGZhbHNlOworCQl0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7CisJCXRoaXMu
Y29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlOworCQl0aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTsK
KwkJdGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7CisKKwl9CisKKwlPYmplY3QuYXNzaWdu
KCBEaXJlY3RHZW9tZXRyeS5wcm90b3R5cGUsIHsKKworCQljb21wdXRlR3JvdXBzOiBmdW5jdGlv
biAoIGdlb21ldHJ5ICkgeworCisJCQl2YXIgZ3JvdXA7CisJCQl2YXIgZ3JvdXBzID0gW107CisJ
CQl2YXIgbWF0ZXJpYWxJbmRleCA9IHVuZGVmaW5lZDsKKworCQkJdmFyIGZhY2VzID0gZ2VvbWV0
cnkuZmFjZXM7CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSArKyAp
IHsKKworCQkJCXZhciBmYWNlID0gZmFjZXNbIGkgXTsKKworCQkJCS8vIG1hdGVyaWFscworCisJ
CQkJaWYgKCBmYWNlLm1hdGVyaWFsSW5kZXggIT09IG1hdGVyaWFsSW5kZXggKSB7CisKKwkJCQkJ
bWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleDsKKworCQkJCQlpZiAoIGdyb3VwICE9
PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCWdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAu
c3RhcnQ7CisJCQkJCQlncm91cHMucHVzaCggZ3JvdXAgKTsKKworCQkJCQl9CisKKwkJCQkJZ3Jv
dXAgPSB7CisJCQkJCQlzdGFydDogaSAqIDMsCisJCQkJCQltYXRlcmlhbEluZGV4OiBtYXRlcmlh
bEluZGV4CisJCQkJCX07CisKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCBncm91cCAhPT0gdW5k
ZWZpbmVkICkgeworCisJCQkJZ3JvdXAuY291bnQgPSAoIGkgKiAzICkgLSBncm91cC5zdGFydDsK
KwkJCQlncm91cHMucHVzaCggZ3JvdXAgKTsKKworCQkJfQorCisJCQl0aGlzLmdyb3VwcyA9IGdy
b3VwczsKKworCQl9LAorCisJCWZyb21HZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHsK
KworCQkJdmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7CisJCQl2YXIgdmVydGljZXMgPSBnZW9t
ZXRyeS52ZXJ0aWNlczsKKwkJCXZhciBmYWNlVmVydGV4VXZzID0gZ2VvbWV0cnkuZmFjZVZlcnRl
eFV2czsKKworCQkJdmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IGZhY2VWZXJ0ZXhVdnNbIDAgXSAmJiBm
YWNlVmVydGV4VXZzWyAwIF0ubGVuZ3RoID4gMDsKKwkJCXZhciBoYXNGYWNlVmVydGV4VXYyID0g
ZmFjZVZlcnRleFV2c1sgMSBdICYmIGZhY2VWZXJ0ZXhVdnNbIDEgXS5sZW5ndGggPiAwOworCisJ
CQkvLyBtb3JwaHMKKworCQkJdmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0
czsKKwkJCXZhciBtb3JwaFRhcmdldHNMZW5ndGggPSBtb3JwaFRhcmdldHMubGVuZ3RoOworCisJ
CQl2YXIgbW9ycGhUYXJnZXRzUG9zaXRpb247CisKKwkJCWlmICggbW9ycGhUYXJnZXRzTGVuZ3Ro
ID4gMCApIHsKKworCQkJCW1vcnBoVGFyZ2V0c1Bvc2l0aW9uID0gW107CisKKwkJCQlmb3IgKCB2
YXIgaSA9IDA7IGkgPCBtb3JwaFRhcmdldHNMZW5ndGg7IGkgKysgKSB7CisKKwkJCQkJbW9ycGhU
YXJnZXRzUG9zaXRpb25bIGkgXSA9IFtdOworCisJCQkJfQorCisJCQkJdGhpcy5tb3JwaFRhcmdl
dHMucG9zaXRpb24gPSBtb3JwaFRhcmdldHNQb3NpdGlvbjsKKworCQkJfQorCisJCQl2YXIgbW9y
cGhOb3JtYWxzID0gZ2VvbWV0cnkubW9ycGhOb3JtYWxzOworCQkJdmFyIG1vcnBoTm9ybWFsc0xl
bmd0aCA9IG1vcnBoTm9ybWFscy5sZW5ndGg7CisKKwkJCXZhciBtb3JwaFRhcmdldHNOb3JtYWw7
CisKKwkJCWlmICggbW9ycGhOb3JtYWxzTGVuZ3RoID4gMCApIHsKKworCQkJCW1vcnBoVGFyZ2V0
c05vcm1hbCA9IFtdOworCisJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgbW9ycGhOb3JtYWxzTGVu
Z3RoOyBpICsrICkgeworCisJCQkJCW1vcnBoVGFyZ2V0c05vcm1hbFsgaSBdID0gW107CisKKwkJ
CQl9CisKKwkJCQl0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWwgPSBtb3JwaFRhcmdldHNOb3JtYWw7
CisKKwkJCX0KKworCQkJLy8gc2tpbnMKKworCQkJdmFyIHNraW5JbmRpY2VzID0gZ2VvbWV0cnku
c2tpbkluZGljZXM7CisJCQl2YXIgc2tpbldlaWdodHMgPSBnZW9tZXRyeS5za2luV2VpZ2h0czsK
KworCQkJdmFyIGhhc1NraW5JbmRpY2VzID0gc2tpbkluZGljZXMubGVuZ3RoID09PSB2ZXJ0aWNl
cy5sZW5ndGg7CisJCQl2YXIgaGFzU2tpbldlaWdodHMgPSBza2luV2VpZ2h0cy5sZW5ndGggPT09
IHZlcnRpY2VzLmxlbmd0aDsKKworCQkJLy8KKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgZmFj
ZXMubGVuZ3RoOyBpICsrICkgeworCisJCQkJdmFyIGZhY2UgPSBmYWNlc1sgaSBdOworCisJCQkJ
dGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgZmFjZS5hIF0sIHZlcnRpY2VzWyBmYWNlLmIg
XSwgdmVydGljZXNbIGZhY2UuYyBdICk7CisKKwkJCQl2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2Uu
dmVydGV4Tm9ybWFsczsKKworCQkJCWlmICggdmVydGV4Tm9ybWFscy5sZW5ndGggPT09IDMgKSB7
CisKKwkJCQkJdGhpcy5ub3JtYWxzLnB1c2goIHZlcnRleE5vcm1hbHNbIDAgXSwgdmVydGV4Tm9y
bWFsc1sgMSBdLCB2ZXJ0ZXhOb3JtYWxzWyAyIF0gKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJ
dmFyIG5vcm1hbCA9IGZhY2Uubm9ybWFsOworCisJCQkJCXRoaXMubm9ybWFscy5wdXNoKCBub3Jt
YWwsIG5vcm1hbCwgbm9ybWFsICk7CisKKwkJCQl9CisKKwkJCQl2YXIgdmVydGV4Q29sb3JzID0g
ZmFjZS52ZXJ0ZXhDb2xvcnM7CisKKwkJCQlpZiAoIHZlcnRleENvbG9ycy5sZW5ndGggPT09IDMg
KSB7CisKKwkJCQkJdGhpcy5jb2xvcnMucHVzaCggdmVydGV4Q29sb3JzWyAwIF0sIHZlcnRleENv
bG9yc1sgMSBdLCB2ZXJ0ZXhDb2xvcnNbIDIgXSApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQl2
YXIgY29sb3IgPSBmYWNlLmNvbG9yOworCisJCQkJCXRoaXMuY29sb3JzLnB1c2goIGNvbG9yLCBj
b2xvciwgY29sb3IgKTsKKworCQkJCX0KKworCQkJCWlmICggaGFzRmFjZVZlcnRleFV2ID09PSB0
cnVlICkgeworCisJCQkJCXZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAwIF1bIGkgXTsK
KworCQkJCQlpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCQl0aGlzLnV2
cy5wdXNoKCB2ZXJ0ZXhVdnNbIDAgXSwgdmVydGV4VXZzWyAxIF0sIHZlcnRleFV2c1sgMiBdICk7
CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuRGlyZWN0R2Vv
bWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdiAnLCBpICk7CisKKwkJCQkJ
CXRoaXMudXZzLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3Iy
KCkgKTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlpZiAoIGhhc0ZhY2VWZXJ0ZXhVdjIgPT09
IHRydWUgKSB7CisKKwkJCQkJdmFyIHZlcnRleFV2cyA9IGZhY2VWZXJ0ZXhVdnNbIDEgXVsgaSBd
OworCisJCQkJCWlmICggdmVydGV4VXZzICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCXRoaXMu
dXZzMi5wdXNoKCB2ZXJ0ZXhVdnNbIDAgXSwgdmVydGV4VXZzWyAxIF0sIHZlcnRleFV2c1sgMiBd
ICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuRGlyZWN0
R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdjIgJywgaSApOworCisJ
CQkJCQl0aGlzLnV2czIucHVzaCggbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSwgbmV3IFZl
Y3RvcjIoKSApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJCS8vIG1vcnBocworCisJCQkJZm9y
ICggdmFyIGogPSAwOyBqIDwgbW9ycGhUYXJnZXRzTGVuZ3RoOyBqICsrICkgeworCisJCQkJCXZh
ciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaiBdLnZlcnRpY2VzOworCisJCQkJCW1vcnBo
VGFyZ2V0c1Bvc2l0aW9uWyBqIF0ucHVzaCggbW9ycGhUYXJnZXRbIGZhY2UuYSBdLCBtb3JwaFRh
cmdldFsgZmFjZS5iIF0sIG1vcnBoVGFyZ2V0WyBmYWNlLmMgXSApOworCisJCQkJfQorCisJCQkJ
Zm9yICggdmFyIGogPSAwOyBqIDwgbW9ycGhOb3JtYWxzTGVuZ3RoOyBqICsrICkgeworCisJCQkJ
CXZhciBtb3JwaE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaiBdLnZlcnRleE5vcm1hbHNbIGkgXTsK
KworCQkJCQltb3JwaFRhcmdldHNOb3JtYWxbIGogXS5wdXNoKCBtb3JwaE5vcm1hbC5hLCBtb3Jw
aE5vcm1hbC5iLCBtb3JwaE5vcm1hbC5jICk7CisKKwkJCQl9CisKKwkJCQkvLyBza2lucworCisJ
CQkJaWYgKCBoYXNTa2luSW5kaWNlcyApIHsKKworCQkJCQl0aGlzLnNraW5JbmRpY2VzLnB1c2go
IHNraW5JbmRpY2VzWyBmYWNlLmEgXSwgc2tpbkluZGljZXNbIGZhY2UuYiBdLCBza2luSW5kaWNl
c1sgZmFjZS5jIF0gKTsKKworCQkJCX0KKworCQkJCWlmICggaGFzU2tpbldlaWdodHMgKSB7CisK
KwkJCQkJdGhpcy5za2luV2VpZ2h0cy5wdXNoKCBza2luV2VpZ2h0c1sgZmFjZS5hIF0sIHNraW5X
ZWlnaHRzWyBmYWNlLmIgXSwgc2tpbldlaWdodHNbIGZhY2UuYyBdICk7CisKKwkJCQl9CisKKwkJ
CX0KKworCQkJdGhpcy5jb21wdXRlR3JvdXBzKCBnZW9tZXRyeSApOworCisJCQl0aGlzLnZlcnRp
Y2VzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZTsKKwkJCXRoaXMubm9y
bWFsc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZTsKKwkJCXRoaXMuY29s
b3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7CisJCQl0aGlzLnV2c05l
ZWRVcGRhdGUgPSBnZW9tZXRyeS51dnNOZWVkVXBkYXRlOworCQkJdGhpcy5ncm91cHNOZWVkVXBk
YXRlID0gZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJ
fQorCisJfSApOworCisJZnVuY3Rpb24gYXJyYXlNYXgoIGFycmF5ICkgeworCisJCWlmICggYXJy
YXkubGVuZ3RoID09PSAwICkgcmV0dXJuIC0gSW5maW5pdHk7CisKKwkJdmFyIG1heCA9IGFycmF5
WyAwIF07CisKKwkJZm9yICggdmFyIGkgPSAxLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgKysg
aSApIHsKKworCQkJaWYgKCBhcnJheVsgaSBdID4gbWF4ICkgbWF4ID0gYXJyYXlbIGkgXTsKKwor
CQl9CisKKwkJcmV0dXJuIG1heDsKKworCX0KKworCS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEg
LyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8v
bXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEJ1ZmZlckdlb21ldHJ5KCkgeworCisJCU9i
amVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogR2VvbWV0cnlJZENvdW50
KCkgfSApOworCisJCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOworCisJCXRoaXMu
bmFtZSA9ICcnOworCQl0aGlzLnR5cGUgPSAnQnVmZmVyR2VvbWV0cnknOworCisJCXRoaXMuaW5k
ZXggPSBudWxsOworCQl0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKKworCQl0aGlzLm1vcnBoQXR0cmli
dXRlcyA9IHt9OworCisJCXRoaXMuZ3JvdXBzID0gW107CisKKwkJdGhpcy5ib3VuZGluZ0JveCA9
IG51bGw7CisJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOworCisJCXRoaXMuZHJhd1Jhbmdl
ID0geyBzdGFydDogMCwgY291bnQ6IEluZmluaXR5IH07CisKKwl9CisKKwlCdWZmZXJHZW9tZXRy
eS5NYXhJbmRleCA9IDY1NTM1OworCisJT2JqZWN0LmFzc2lnbiggQnVmZmVyR2VvbWV0cnkucHJv
dG90eXBlLCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7CisKKwkJaXNCdWZmZXJHZW9tZXRy
eTogdHJ1ZSwKKworCQlnZXRJbmRleDogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5p
bmRleDsKKworCQl9LAorCisJCXNldEluZGV4OiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisJCQlp
ZiAoIEFycmF5LmlzQXJyYXkoIGluZGV4ICkgKSB7CisKKwkJCQl0aGlzLmluZGV4ID0gbmV3ICgg
YXJyYXlNYXgoIGluZGV4ICkgPiA2NTUzNSA/IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA6IFVpbnQx
NkJ1ZmZlckF0dHJpYnV0ZSApKCBpbmRleCwgMSApOworCisJCQl9IGVsc2UgeworCisJCQkJdGhp
cy5pbmRleCA9IGluZGV4OworCisJCQl9CisKKwkJfSwKKworCQlhZGRBdHRyaWJ1dGU6IGZ1bmN0
aW9uICggbmFtZSwgYXR0cmlidXRlICkgeworCisJCQlpZiAoICEgKCBhdHRyaWJ1dGUgJiYgYXR0
cmlidXRlLmlzQnVmZmVyQXR0cmlidXRlICkgJiYgISAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUu
aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApICkgeworCisJCQkJY29uc29sZS53YXJuKCAn
VEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUs
IGF0dHJpYnV0ZSApLicgKTsKKworCQkJCXRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBuZXcgQnVm
ZmVyQXR0cmlidXRlKCBhcmd1bWVudHNbIDEgXSwgYXJndW1lbnRzWyAyIF0gKSApOworCisJCQkJ
cmV0dXJuOworCisJCQl9CisKKwkJCWlmICggbmFtZSA9PT0gJ2luZGV4JyApIHsKKworCQkJCWNv
bnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmFkZEF0dHJpYnV0ZTogVXNlIC5zZXRJ
bmRleCgpIGZvciBpbmRleCBhdHRyaWJ1dGUuJyApOworCQkJCXRoaXMuc2V0SW5kZXgoIGF0dHJp
YnV0ZSApOworCisJCQkJcmV0dXJuOworCisJCQl9CisKKwkJCXRoaXMuYXR0cmlidXRlc1sgbmFt
ZSBdID0gYXR0cmlidXRlOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWdldEF0dHJp
YnV0ZTogZnVuY3Rpb24gKCBuYW1lICkgeworCisJCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzWyBu
YW1lIF07CisKKwkJfSwKKworCQlyZW1vdmVBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSApIHsK
KworCQkJZGVsZXRlIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdOworCisJCQlyZXR1cm4gdGhpczsK
KworCQl9LAorCisJCWFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJ
bmRleCApIHsKKworCQkJdGhpcy5ncm91cHMucHVzaCggeworCisJCQkJc3RhcnQ6IHN0YXJ0LAor
CQkJCWNvdW50OiBjb3VudCwKKwkJCQltYXRlcmlhbEluZGV4OiBtYXRlcmlhbEluZGV4ICE9PSB1
bmRlZmluZWQgPyBtYXRlcmlhbEluZGV4IDogMAorCisJCQl9ICk7CisKKwkJfSwKKworCQljbGVh
ckdyb3VwczogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLmdyb3VwcyA9IFtdOworCisJCX0sCisK
KwkJc2V0RHJhd1JhbmdlOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCApIHsKKworCQkJdGhpcy5k
cmF3UmFuZ2Uuc3RhcnQgPSBzdGFydDsKKwkJCXRoaXMuZHJhd1JhbmdlLmNvdW50ID0gY291bnQ7
CisKKwkJfSwKKworCQlhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7CisKKwkJCXZh
ciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjsKKworCQkJaWYgKCBwb3NpdGlv
biAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUo
IHBvc2l0aW9uICk7CisJCQkJcG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlOworCisJCQl9CisK
KwkJCXZhciBub3JtYWwgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsOworCisJCQlpZiAoIG5vcm1h
bCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJdmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgz
KCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTsKKworCQkJCW5vcm1hbE1hdHJpeC5hcHBseVRv
QnVmZmVyQXR0cmlidXRlKCBub3JtYWwgKTsKKwkJCQlub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVl
OworCisJCQl9CisKKwkJCWlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKKworCQkJ
CXRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7CisKKwkJCX0KKworCQkJaWYgKCB0aGlzLmJvdW5k
aW5nU3BoZXJlICE9PSBudWxsICkgeworCisJCQkJdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUo
KTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXJvdGF0ZVg6IGZ1bmN0
aW9uICgpIHsKKworCQkJLy8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXMKKwor
CQkJdmFyIG0xID0gbmV3IE1hdHJpeDQoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgo
IGFuZ2xlICkgeworCisJCQkJbTEubWFrZVJvdGF0aW9uWCggYW5nbGUgKTsKKworCQkJCXRoaXMu
YXBwbHlNYXRyaXgoIG0xICk7CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJfTsKKworCQl9KCks
CisKKwkJcm90YXRlWTogZnVuY3Rpb24gKCkgeworCisJCQkvLyByb3RhdGUgZ2VvbWV0cnkgYXJv
dW5kIHdvcmxkIHktYXhpcworCisJCQl2YXIgbTEgPSBuZXcgTWF0cml4NCgpOworCisJCQlyZXR1
cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7CisKKwkJCQltMS5tYWtlUm90YXRpb25ZKCBh
bmdsZSApOworCisJCQkJdGhpcy5hcHBseU1hdHJpeCggbTEgKTsKKworCQkJCXJldHVybiB0aGlz
OworCisJCQl9OworCisJCX0oKSwKKworCQlyb3RhdGVaOiBmdW5jdGlvbiAoKSB7CisKKwkJCS8v
IHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzCisKKwkJCXZhciBtMSA9IG5ldyBN
YXRyaXg0KCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHsKKworCQkJ
CW0xLm1ha2VSb3RhdGlvblooIGFuZ2xlICk7CisKKwkJCQl0aGlzLmFwcGx5TWF0cml4KCBtMSAp
OworCisJCQkJcmV0dXJuIHRoaXM7CisKKwkJCX07CisKKwkJfSgpLAorCisJCXRyYW5zbGF0ZTog
ZnVuY3Rpb24gKCkgeworCisJCQkvLyB0cmFuc2xhdGUgZ2VvbWV0cnkKKworCQkJdmFyIG0xID0g
bmV3IE1hdHJpeDQoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiAp
IHsKKworCQkJCW0xLm1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApOworCisJCQkJdGhpcy5hcHBs
eU1hdHJpeCggbTEgKTsKKworCQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKwor
CQlzY2FsZTogZnVuY3Rpb24gKCkgeworCisJCQkvLyBzY2FsZSBnZW9tZXRyeQorCisJCQl2YXIg
bTEgPSBuZXcgTWF0cml4NCgpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gc2NhbGUoIHgsIHksIHog
KSB7CisKKwkJCQltMS5tYWtlU2NhbGUoIHgsIHksIHogKTsKKworCQkJCXRoaXMuYXBwbHlNYXRy
aXgoIG0xICk7CisKKwkJCQlyZXR1cm4gdGhpczsKKworCQkJfTsKKworCQl9KCksCisKKwkJbG9v
a0F0OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBvYmogPSBuZXcgT2JqZWN0M0QoKTsKKworCQkJ
cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkgeworCisJCQkJb2JqLmxvb2tBdCggdmVj
dG9yICk7CisKKwkJCQlvYmoudXBkYXRlTWF0cml4KCk7CisKKwkJCQl0aGlzLmFwcGx5TWF0cml4
KCBvYmoubWF0cml4ICk7CisKKwkJCX07CisKKwkJfSgpLAorCisJCWNlbnRlcjogZnVuY3Rpb24g
KCkgeworCisJCQl0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpOworCisJCQl2YXIgb2Zmc2V0ID0g
dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoKS5uZWdhdGUoKTsKKworCQkJdGhpcy50cmFuc2xh
dGUoIG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnogKTsKKworCQkJcmV0dXJuIG9mZnNldDsK
KworCQl9LAorCisJCXNldEZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkgeworCisJCQkv
LyBjb25zb2xlLmxvZyggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnNldEZyb21PYmplY3QoKS4gQ29u
dmVydGluZycsIG9iamVjdCwgdGhpcyApOworCisJCQl2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2Vv
bWV0cnk7CisKKwkJCWlmICggb2JqZWN0LmlzUG9pbnRzIHx8IG9iamVjdC5pc0xpbmUgKSB7CisK
KwkJCQl2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5
LnZlcnRpY2VzLmxlbmd0aCAqIDMsIDMgKTsKKwkJCQl2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJC
dWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzLCAzICk7CisKKwkJCQl0
aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zLmNvcHlWZWN0b3Izc0FycmF5
KCBnZW9tZXRyeS52ZXJ0aWNlcyApICk7CisJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoICdjb2xvcics
IGNvbG9ycy5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApICk7CisKKwkJCQlpZiAo
IGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMgJiYgZ2VvbWV0cnkubGluZURpc3RhbmNlcy5sZW5ndGgg
PT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApIHsKKworCQkJCQl2YXIgbGluZURpc3RhbmNl
cyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzLmxl
bmd0aCwgMSApOworCisJCQkJCXRoaXMuYWRkQXR0cmlidXRlKCAnbGluZURpc3RhbmNlJywgbGlu
ZURpc3RhbmNlcy5jb3B5QXJyYXkoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMgKSApOworCisJCQkJ
fQorCisJCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHsKKworCQkJ
CQl0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTsK
KworCQkJCX0KKworCQkJCWlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7CisK
KwkJCQkJdGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7CisK
KwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggKSB7CisKKwkJCQlpZiAoIGdl
b21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7CisKKwkJCQkJdGhpcy5mcm9tR2VvbWV0
cnkoIGdlb21ldHJ5ICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJ
fSwKKworCQl1cGRhdGVGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHsKKworCQkJdmFy
IGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5OworCisJCQlpZiAoIG9iamVjdC5pc01lc2ggKSB7
CisKKwkJCQl2YXIgZGlyZWN0ID0gZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeTsKKworCQkJCWlm
ICggZ2VvbWV0cnkuZWxlbWVudHNOZWVkVXBkYXRlID09PSB0cnVlICkgeworCisJCQkJCWRpcmVj
dCA9IHVuZGVmaW5lZDsKKwkJCQkJZ2VvbWV0cnkuZWxlbWVudHNOZWVkVXBkYXRlID0gZmFsc2U7
CisKKwkJCQl9CisKKwkJCQlpZiAoIGRpcmVjdCA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCXJl
dHVybiB0aGlzLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTsKKworCQkJCX0KKworCQkJCWRpcmVj
dC52ZXJ0aWNlc05lZWRVcGRhdGUgPSBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGU7CisJCQkJ
ZGlyZWN0Lm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7CisJ
CQkJZGlyZWN0LmNvbG9yc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlOwor
CQkJCWRpcmVjdC51dnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudXZzTmVlZFVwZGF0ZTsKKwkJCQlk
aXJlY3QuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7CisKKwkJ
CQlnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTsKKwkJCQlnZW9tZXRyeS5ub3Jt
YWxzTmVlZFVwZGF0ZSA9IGZhbHNlOworCQkJCWdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPSBm
YWxzZTsKKwkJCQlnZW9tZXRyeS51dnNOZWVkVXBkYXRlID0gZmFsc2U7CisJCQkJZ2VvbWV0cnku
Z3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlOworCisJCQkJZ2VvbWV0cnkgPSBkaXJlY3Q7CisKKwkJ
CX0KKworCQkJdmFyIGF0dHJpYnV0ZTsKKworCQkJaWYgKCBnZW9tZXRyeS52ZXJ0aWNlc05lZWRV
cGRhdGUgPT09IHRydWUgKSB7CisKKwkJCQlhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMucG9z
aXRpb247CisKKwkJCQlpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWF0
dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKTsKKwkJCQkJYXR0
cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQkJCX0KKworCQkJCWdlb21ldHJ5LnZlcnRp
Y2VzTmVlZFVwZGF0ZSA9IGZhbHNlOworCisJCQl9CisKKwkJCWlmICggZ2VvbWV0cnkubm9ybWFs
c05lZWRVcGRhdGUgPT09IHRydWUgKSB7CisKKwkJCQlhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0
ZXMubm9ybWFsOworCisJCQkJaWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHsKKworCQkJ
CQlhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMgKTsKKwkJCQkJ
YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQkJCX0KKworCQkJCWdlb21ldHJ5Lm5v
cm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7CisKKwkJCX0KKworCQkJaWYgKCBnZW9tZXRyeS5jb2xv
cnNOZWVkVXBkYXRlID09PSB0cnVlICkgeworCisJCQkJYXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1
dGVzLmNvbG9yOworCisJCQkJaWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHsKKworCQkJ
CQlhdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKTsKKwkJCQkJYXR0
cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQkJCX0KKworCQkJCWdlb21ldHJ5LmNvbG9y
c05lZWRVcGRhdGUgPSBmYWxzZTsKKworCQkJfQorCisJCQlpZiAoIGdlb21ldHJ5LnV2c05lZWRV
cGRhdGUgKSB7CisKKwkJCQlhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMudXY7CisKKwkJCQlp
ZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWF0dHJpYnV0ZS5jb3B5VmVj
dG9yMnNBcnJheSggZ2VvbWV0cnkudXZzICk7CisJCQkJCWF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9
IHRydWU7CisKKwkJCQl9CisKKwkJCQlnZW9tZXRyeS51dnNOZWVkVXBkYXRlID0gZmFsc2U7CisK
KwkJCX0KKworCQkJaWYgKCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSApIHsKKwor
CQkJCWF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2U7CisKKwkJCQlpZiAo
IGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWF0dHJpYnV0ZS5jb3B5QXJyYXko
IGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMgKTsKKwkJCQkJYXR0cmlidXRlLm5lZWRzVXBkYXRlID0g
dHJ1ZTsKKworCQkJCX0KKworCQkJCWdlb21ldHJ5LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0g
ZmFsc2U7CisKKwkJCX0KKworCQkJaWYgKCBnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlICkgewor
CisJCQkJZ2VvbWV0cnkuY29tcHV0ZUdyb3Vwcyggb2JqZWN0Lmdlb21ldHJ5ICk7CisJCQkJdGhp
cy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7CisKKwkJCQlnZW9tZXRyeS5ncm91cHNOZWVkVXBk
YXRlID0gZmFsc2U7CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlmcm9t
R2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7CisKKwkJCWdlb21ldHJ5Ll9fZGlyZWN0
R2VvbWV0cnkgPSBuZXcgRGlyZWN0R2VvbWV0cnkoKS5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7
CisKKwkJCXJldHVybiB0aGlzLmZyb21EaXJlY3RHZW9tZXRyeSggZ2VvbWV0cnkuX19kaXJlY3RH
ZW9tZXRyeSApOworCisJCX0sCisKKwkJZnJvbURpcmVjdEdlb21ldHJ5OiBmdW5jdGlvbiAoIGdl
b21ldHJ5ICkgeworCisJCQl2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0
cnkudmVydGljZXMubGVuZ3RoICogMyApOworCQkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlv
bicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApLmNvcHlWZWN0b3Izc0FycmF5
KCBnZW9tZXRyeS52ZXJ0aWNlcyApICk7CisKKwkJCWlmICggZ2VvbWV0cnkubm9ybWFscy5sZW5n
dGggPiAwICkgeworCisJCQkJdmFyIG5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRy
eS5ub3JtYWxzLmxlbmd0aCAqIDMgKTsKKwkJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcs
IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKS5jb3B5VmVjdG9yM3NBcnJheSggZ2Vv
bWV0cnkubm9ybWFscyApICk7CisKKwkJCX0KKworCQkJaWYgKCBnZW9tZXRyeS5jb2xvcnMubGVu
Z3RoID4gMCApIHsKKworCQkJCXZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRy
eS5jb2xvcnMubGVuZ3RoICogMyApOworCQkJCXRoaXMuYWRkQXR0cmlidXRlKCAnY29sb3InLCBu
ZXcgQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKS5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5
LmNvbG9ycyApICk7CisKKwkJCX0KKworCQkJaWYgKCBnZW9tZXRyeS51dnMubGVuZ3RoID4gMCAp
IHsKKworCQkJCXZhciB1dnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS51dnMubGVuZ3Ro
ICogMiApOworCQkJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgQnVmZmVyQXR0cmlidXRl
KCB1dnMsIDIgKS5jb3B5VmVjdG9yMnNBcnJheSggZ2VvbWV0cnkudXZzICkgKTsKKworCQkJfQor
CisJCQlpZiAoIGdlb21ldHJ5LnV2czIubGVuZ3RoID4gMCApIHsKKworCQkJCXZhciB1dnMyID0g
bmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkudXZzMi5sZW5ndGggKiAyICk7CisJCQkJdGhpcy5h
ZGRBdHRyaWJ1dGUoICd1djInLCBuZXcgQnVmZmVyQXR0cmlidXRlKCB1dnMyLCAyICkuY29weVZl
Y3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2czIgKSApOworCisJCQl9CisKKwkJCWlmICggZ2VvbWV0
cnkuaW5kaWNlcy5sZW5ndGggPiAwICkgeworCisJCQkJdmFyIFR5cGVBcnJheSA9IGFycmF5TWF4
KCBnZW9tZXRyeS5pbmRpY2VzICkgPiA2NTUzNSA/IFVpbnQzMkFycmF5IDogVWludDE2QXJyYXk7
CisJCQkJdmFyIGluZGljZXMgPSBuZXcgVHlwZUFycmF5KCBnZW9tZXRyeS5pbmRpY2VzLmxlbmd0
aCAqIDMgKTsKKwkJCQl0aGlzLnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2Vz
LCAxICkuY29weUluZGljZXNBcnJheSggZ2VvbWV0cnkuaW5kaWNlcyApICk7CisKKwkJCX0KKwor
CQkJLy8gZ3JvdXBzCisKKwkJCXRoaXMuZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOworCisJCQkv
LyBtb3JwaHMKKworCQkJZm9yICggdmFyIG5hbWUgaW4gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkg
eworCisJCQkJdmFyIGFycmF5ID0gW107CisJCQkJdmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5
Lm1vcnBoVGFyZ2V0c1sgbmFtZSBdOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gbW9ycGhU
YXJnZXRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJdmFyIG1vcnBoVGFyZ2V0ID0g
bW9ycGhUYXJnZXRzWyBpIF07CisKKwkJCQkJdmFyIGF0dHJpYnV0ZSA9IG5ldyBGbG9hdDMyQnVm
ZmVyQXR0cmlidXRlKCBtb3JwaFRhcmdldC5sZW5ndGggKiAzLCAzICk7CisKKwkJCQkJYXJyYXku
cHVzaCggYXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBtb3JwaFRhcmdldCApICk7CisKKwkJ
CQl9CisKKwkJCQl0aGlzLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gYXJyYXk7CisKKwkJCX0K
KworCQkJLy8gc2tpbm5pbmcKKworCQkJaWYgKCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGgg
PiAwICkgeworCisJCQkJdmFyIHNraW5JbmRpY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1
dGUoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCAqIDQsIDQgKTsKKwkJCQl0aGlzLmFkZEF0
dHJpYnV0ZSggJ3NraW5JbmRleCcsIHNraW5JbmRpY2VzLmNvcHlWZWN0b3I0c0FycmF5KCBnZW9t
ZXRyeS5za2luSW5kaWNlcyApICk7CisKKwkJCX0KKworCQkJaWYgKCBnZW9tZXRyeS5za2luV2Vp
Z2h0cy5sZW5ndGggPiAwICkgeworCisJCQkJdmFyIHNraW5XZWlnaHRzID0gbmV3IEZsb2F0MzJC
dWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCAqIDQsIDQgKTsKKwkJ
CQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnLCBza2luV2VpZ2h0cy5jb3B5VmVjdG9y
NHNBcnJheSggZ2VvbWV0cnkuc2tpbldlaWdodHMgKSApOworCisJCQl9CisKKwkJCS8vCisKKwkJ
CWlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CisKKwkJCQl0aGlzLmJv
dW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTsKKworCQkJfQor
CisJCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkgeworCisJCQkJdGhpcy5i
b3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7CisKKwkJCX0KKworCQkJ
cmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljb21wdXRlQm91bmRpbmdCb3g6IGZ1bmN0aW9uICgp
IHsKKworCQkJaWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkgeworCisJCQkJdGhpcy5i
b3VuZGluZ0JveCA9IG5ldyBCb3gzKCk7CisKKwkJCX0KKworCQkJdmFyIHBvc2l0aW9uID0gdGhp
cy5hdHRyaWJ1dGVzLnBvc2l0aW9uOworCisJCQlpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQg
KSB7CisKKwkJCQl0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0
aW9uICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQl0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgp
OworCisJCQl9CisKKwkJCWlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnggKSB8fCBp
c05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueSApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94
Lm1pbi56ICkgKSB7CisKKwkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnku
Y29tcHV0ZUJvdW5kaW5nQm94OiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhl
ICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhp
cyApOworCisJCQl9CisKKwkJfSwKKworCQljb21wdXRlQm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9u
ICgpIHsKKworCQkJdmFyIGJveCA9IG5ldyBCb3gzKCk7CisJCQl2YXIgdmVjdG9yID0gbmV3IFZl
Y3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHsK
KworCQkJCWlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHsKKworCQkJCQl0aGlz
LmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSgpOworCisJCQkJfQorCisJCQkJdmFyIHBvc2l0
aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uOworCisJCQkJaWYgKCBwb3NpdGlvbiApIHsK
KworCQkJCQl2YXIgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7CisKKwkJCQkJ
Ym94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7CisJCQkJCWJveC5nZXRDZW50
ZXIoIGNlbnRlciApOworCisJCQkJCS8vIGhvcGluZyB0byBmaW5kIGEgYm91bmRpbmdTcGhlcmUg
d2l0aCBhIHJhZGl1cyBzbWFsbGVyIHRoYW4gdGhlCisJCQkJCS8vIGJvdW5kaW5nU3BoZXJlIG9m
IHRoZSBib3VuZGluZ0JveDogc3FydCgzKSBzbWFsbGVyIGluIHRoZSBiZXN0IGNhc2UKKworCQkJ
CQl2YXIgbWF4UmFkaXVzU3EgPSAwOworCisJCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBwb3Np
dGlvbi5jb3VudDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJCQl2ZWN0b3IueCA9IHBvc2l0aW9u
LmdldFgoIGkgKTsKKwkJCQkJCXZlY3Rvci55ID0gcG9zaXRpb24uZ2V0WSggaSApOworCQkJCQkJ
dmVjdG9yLnogPSBwb3NpdGlvbi5nZXRaKCBpICk7CisJCQkJCQltYXhSYWRpdXNTcSA9IE1hdGgu
bWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCB2ZWN0b3IgKSApOwor
CisJCQkJCX0KKworCQkJCQl0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyA9IE1hdGguc3FydCgg
bWF4UmFkaXVzU3EgKTsKKworCQkJCQlpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nU3BoZXJlLnJh
ZGl1cyApICkgeworCisJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnku
Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9z
aXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTsK
KworCQkJCQl9CisKKwkJCQl9CisKKwkJCX07CisKKwkJfSgpLAorCisJCWNvbXB1dGVGYWNlTm9y
bWFsczogZnVuY3Rpb24gKCkgeworCisJCQkvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorCisJ
CX0sCisKKwkJY29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGlu
ZGV4ID0gdGhpcy5pbmRleDsKKwkJCXZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzOwor
CQkJdmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzOworCisJCQlpZiAoIGF0dHJpYnV0ZXMucG9zaXRp
b24gKSB7CisKKwkJCQl2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTsK
KworCQkJCWlmICggYXR0cmlidXRlcy5ub3JtYWwgPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQl0
aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9h
dDMyQXJyYXkoIHBvc2l0aW9ucy5sZW5ndGggKSwgMyApICk7CisKKwkJCQl9IGVsc2UgeworCisJ
CQkJCS8vIHJlc2V0IGV4aXN0aW5nIG5vcm1hbHMgdG8gemVybworCisJCQkJCXZhciBhcnJheSA9
IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5OworCisJCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBh
cnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJCQkJYXJyYXlbIGkgXSA9IDA7CisK
KwkJCQkJfQorCisJCQkJfQorCisJCQkJdmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC5h
cnJheTsKKworCQkJCXZhciB2QSwgdkIsIHZDOworCQkJCXZhciBwQSA9IG5ldyBWZWN0b3IzKCks
IHBCID0gbmV3IFZlY3RvcjMoKSwgcEMgPSBuZXcgVmVjdG9yMygpOworCQkJCXZhciBjYiA9IG5l
dyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTsKKworCQkJCS8vIGluZGV4ZWQgZWxlbWVu
dHMKKworCQkJCWlmICggaW5kZXggKSB7CisKKwkJCQkJdmFyIGluZGljZXMgPSBpbmRleC5hcnJh
eTsKKworCQkJCQlpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7CisKKwkJCQkJCXRoaXMuYWRk
R3JvdXAoIDAsIGluZGljZXMubGVuZ3RoICk7CisKKwkJCQkJfQorCisJCQkJCWZvciAoIHZhciBq
ID0gMCwgamwgPSBncm91cHMubGVuZ3RoOyBqIDwgamw7ICsrIGogKSB7CisKKwkJCQkJCXZhciBn
cm91cCA9IGdyb3Vwc1sgaiBdOworCisJCQkJCQl2YXIgc3RhcnQgPSBncm91cC5zdGFydDsKKwkJ
CQkJCXZhciBjb3VudCA9IGdyb3VwLmNvdW50OworCisJCQkJCQlmb3IgKCB2YXIgaSA9IHN0YXJ0
LCBpbCA9IHN0YXJ0ICsgY291bnQ7IGkgPCBpbDsgaSArPSAzICkgeworCisJCQkJCQkJdkEgPSBp
bmRpY2VzWyBpICsgMCBdICogMzsKKwkJCQkJCQl2QiA9IGluZGljZXNbIGkgKyAxIF0gKiAzOwor
CQkJCQkJCXZDID0gaW5kaWNlc1sgaSArIDIgXSAqIDM7CisKKwkJCQkJCQlwQS5mcm9tQXJyYXko
IHBvc2l0aW9ucywgdkEgKTsKKwkJCQkJCQlwQi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkIgKTsK
KwkJCQkJCQlwQy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkMgKTsKKworCQkJCQkJCWNiLnN1YlZl
Y3RvcnMoIHBDLCBwQiApOworCQkJCQkJCWFiLnN1YlZlY3RvcnMoIHBBLCBwQiApOworCQkJCQkJ
CWNiLmNyb3NzKCBhYiApOworCisJCQkJCQkJbm9ybWFsc1sgdkEgXSArPSBjYi54OworCQkJCQkJ
CW5vcm1hbHNbIHZBICsgMSBdICs9IGNiLnk7CisJCQkJCQkJbm9ybWFsc1sgdkEgKyAyIF0gKz0g
Y2IuejsKKworCQkJCQkJCW5vcm1hbHNbIHZCIF0gKz0gY2IueDsKKwkJCQkJCQlub3JtYWxzWyB2
QiArIDEgXSArPSBjYi55OworCQkJCQkJCW5vcm1hbHNbIHZCICsgMiBdICs9IGNiLno7CisKKwkJ
CQkJCQlub3JtYWxzWyB2QyBdICs9IGNiLng7CisJCQkJCQkJbm9ybWFsc1sgdkMgKyAxIF0gKz0g
Y2IueTsKKwkJCQkJCQlub3JtYWxzWyB2QyArIDIgXSArPSBjYi56OworCisJCQkJCQl9CisKKwkJ
CQkJfQorCisJCQkJfSBlbHNlIHsKKworCQkJCQkvLyBub24taW5kZXhlZCBlbGVtZW50cyAodW5j
b25uZWN0ZWQgdHJpYW5nbGUgc291cCkKKworCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9z
aXRpb25zLmxlbmd0aDsgaSA8IGlsOyBpICs9IDkgKSB7CisKKwkJCQkJCXBBLmZyb21BcnJheSgg
cG9zaXRpb25zLCBpICk7CisJCQkJCQlwQi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSArIDMgKTsK
KwkJCQkJCXBDLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgNiApOworCisJCQkJCQljYi5zdWJW
ZWN0b3JzKCBwQywgcEIgKTsKKwkJCQkJCWFiLnN1YlZlY3RvcnMoIHBBLCBwQiApOworCQkJCQkJ
Y2IuY3Jvc3MoIGFiICk7CisKKwkJCQkJCW5vcm1hbHNbIGkgXSA9IGNiLng7CisJCQkJCQlub3Jt
YWxzWyBpICsgMSBdID0gY2IueTsKKwkJCQkJCW5vcm1hbHNbIGkgKyAyIF0gPSBjYi56OworCisJ
CQkJCQlub3JtYWxzWyBpICsgMyBdID0gY2IueDsKKwkJCQkJCW5vcm1hbHNbIGkgKyA0IF0gPSBj
Yi55OworCQkJCQkJbm9ybWFsc1sgaSArIDUgXSA9IGNiLno7CisKKwkJCQkJCW5vcm1hbHNbIGkg
KyA2IF0gPSBjYi54OworCQkJCQkJbm9ybWFsc1sgaSArIDcgXSA9IGNiLnk7CisJCQkJCQlub3Jt
YWxzWyBpICsgOCBdID0gY2IuejsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQl0aGlzLm5vcm1h
bGl6ZU5vcm1hbHMoKTsKKworCQkJCWF0dHJpYnV0ZXMubm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1
ZTsKKworCQkJfQorCisJCX0sCisKKwkJbWVyZ2U6IGZ1bmN0aW9uICggZ2VvbWV0cnksIG9mZnNl
dCApIHsKKworCQkJaWYgKCAhICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRy
eSApICkgeworCisJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdl
KCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeS4nLCBn
ZW9tZXRyeSApOworCQkJCXJldHVybjsKKworCQkJfQorCisJCQlpZiAoIG9mZnNldCA9PT0gdW5k
ZWZpbmVkICkgb2Zmc2V0ID0gMDsKKworCQkJdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0
ZXM7CisKKwkJCWZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHsKKworCQkJCWlmICggZ2Vv
bWV0cnkuYXR0cmlidXRlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlOworCisJCQkJ
dmFyIGF0dHJpYnV0ZTEgPSBhdHRyaWJ1dGVzWyBrZXkgXTsKKwkJCQl2YXIgYXR0cmlidXRlQXJy
YXkxID0gYXR0cmlidXRlMS5hcnJheTsKKworCQkJCXZhciBhdHRyaWJ1dGUyID0gZ2VvbWV0cnku
YXR0cmlidXRlc1sga2V5IF07CisJCQkJdmFyIGF0dHJpYnV0ZUFycmF5MiA9IGF0dHJpYnV0ZTIu
YXJyYXk7CisKKwkJCQl2YXIgYXR0cmlidXRlU2l6ZSA9IGF0dHJpYnV0ZTIuaXRlbVNpemU7CisK
KwkJCQlmb3IgKCB2YXIgaSA9IDAsIGogPSBhdHRyaWJ1dGVTaXplICogb2Zmc2V0OyBpIDwgYXR0
cmlidXRlQXJyYXkyLmxlbmd0aDsgaSArKywgaiArKyApIHsKKworCQkJCQlhdHRyaWJ1dGVBcnJh
eTFbIGogXSA9IGF0dHJpYnV0ZUFycmF5MlsgaSBdOworCisJCQkJfQorCisJCQl9CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0sCisKKwkJbm9ybWFsaXplTm9ybWFsczogZnVuY3Rpb24gKCkgewor
CisJCQl2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7CisKKwkJCXZhciB4LCB5
LCB6LCBuOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gbm9ybWFscy5jb3VudDsgaSA8IGls
OyBpICsrICkgeworCisJCQkJeCA9IG5vcm1hbHMuZ2V0WCggaSApOworCQkJCXkgPSBub3JtYWxz
LmdldFkoIGkgKTsKKwkJCQl6ID0gbm9ybWFscy5nZXRaKCBpICk7CisKKwkJCQluID0gMS4wIC8g
TWF0aC5zcXJ0KCB4ICogeCArIHkgKiB5ICsgeiAqIHogKTsKKworCQkJCW5vcm1hbHMuc2V0WFla
KCBpLCB4ICogbiwgeSAqIG4sIHogKiBuICk7CisKKwkJCX0KKworCQl9LAorCisJCXRvTm9uSW5k
ZXhlZDogZnVuY3Rpb24gKCkgeworCisJCQlpZiAoIHRoaXMuaW5kZXggPT09IG51bGwgKSB7CisK
KwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTog
R2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4nICk7CisJCQkJcmV0dXJuIHRoaXM7CisK
KwkJCX0KKworCQkJdmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOworCisJCQl2
YXIgaW5kaWNlcyA9IHRoaXMuaW5kZXguYXJyYXk7CisJCQl2YXIgYXR0cmlidXRlcyA9IHRoaXMu
YXR0cmlidXRlczsKKworCQkJZm9yICggdmFyIG5hbWUgaW4gYXR0cmlidXRlcyApIHsKKworCQkJ
CXZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07CisKKwkJCQl2YXIgYXJyYXkgPSBh
dHRyaWJ1dGUuYXJyYXk7CisJCQkJdmFyIGl0ZW1TaXplID0gYXR0cmlidXRlLml0ZW1TaXplOwor
CisJCQkJdmFyIGFycmF5MiA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvciggaW5kaWNlcy5sZW5ndGgg
KiBpdGVtU2l6ZSApOworCisJCQkJdmFyIGluZGV4ID0gMCwgaW5kZXgyID0gMDsKKworCQkJCWZv
ciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJ
CQlpbmRleCA9IGluZGljZXNbIGkgXSAqIGl0ZW1TaXplOworCisJCQkJCWZvciAoIHZhciBqID0g
MDsgaiA8IGl0ZW1TaXplOyBqICsrICkgeworCisJCQkJCQlhcnJheTJbIGluZGV4MiArKyBdID0g
YXJyYXlbIGluZGV4ICsrIF07CisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJZ2VvbWV0cnkyLmFk
ZEF0dHJpYnV0ZSggbmFtZSwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXkyLCBpdGVtU2l6ZSAp
ICk7CisKKwkJCX0KKworCQkJcmV0dXJuIGdlb21ldHJ5MjsKKworCQl9LAorCisJCXRvSlNPTjog
ZnVuY3Rpb24gKCkgeworCisJCQl2YXIgZGF0YSA9IHsKKwkJCQltZXRhZGF0YTogeworCQkJCQl2
ZXJzaW9uOiA0LjUsCisJCQkJCXR5cGU6ICdCdWZmZXJHZW9tZXRyeScsCisJCQkJCWdlbmVyYXRv
cjogJ0J1ZmZlckdlb21ldHJ5LnRvSlNPTicKKwkJCQl9CisJCQl9OworCisJCQkvLyBzdGFuZGFy
ZCBCdWZmZXJHZW9tZXRyeSBzZXJpYWxpemF0aW9uCisKKwkJCWRhdGEudXVpZCA9IHRoaXMudXVp
ZDsKKwkJCWRhdGEudHlwZSA9IHRoaXMudHlwZTsKKwkJCWlmICggdGhpcy5uYW1lICE9PSAnJyAp
IGRhdGEubmFtZSA9IHRoaXMubmFtZTsKKworCQkJaWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVu
ZGVmaW5lZCApIHsKKworCQkJCXZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzOworCisJ
CQkJZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkgeworCisJCQkJCWlmICggcGFyYW1ldGVy
c1sga2V5IF0gIT09IHVuZGVmaW5lZCApIGRhdGFbIGtleSBdID0gcGFyYW1ldGVyc1sga2V5IF07
CisKKwkJCQl9CisKKwkJCQlyZXR1cm4gZGF0YTsKKworCQkJfQorCisJCQlkYXRhLmRhdGEgPSB7
IGF0dHJpYnV0ZXM6IHt9IH07CisKKwkJCXZhciBpbmRleCA9IHRoaXMuaW5kZXg7CisKKwkJCWlm
ICggaW5kZXggIT09IG51bGwgKSB7CisKKwkJCQl2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUu
c2xpY2UuY2FsbCggaW5kZXguYXJyYXkgKTsKKworCQkJCWRhdGEuZGF0YS5pbmRleCA9IHsKKwkJ
CQkJdHlwZTogaW5kZXguYXJyYXkuY29uc3RydWN0b3IubmFtZSwKKwkJCQkJYXJyYXk6IGFycmF5
CisJCQkJfTsKKworCQkJfQorCisJCQl2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlczsK
KworCQkJZm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkgeworCisJCQkJdmFyIGF0dHJpYnV0
ZSA9IGF0dHJpYnV0ZXNbIGtleSBdOworCisJCQkJdmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBl
LnNsaWNlLmNhbGwoIGF0dHJpYnV0ZS5hcnJheSApOworCisJCQkJZGF0YS5kYXRhLmF0dHJpYnV0
ZXNbIGtleSBdID0geworCQkJCQlpdGVtU2l6ZTogYXR0cmlidXRlLml0ZW1TaXplLAorCQkJCQl0
eXBlOiBhdHRyaWJ1dGUuYXJyYXkuY29uc3RydWN0b3IubmFtZSwKKwkJCQkJYXJyYXk6IGFycmF5
LAorCQkJCQlub3JtYWxpemVkOiBhdHRyaWJ1dGUubm9ybWFsaXplZAorCQkJCX07CisKKwkJCX0K
KworCQkJdmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzOworCisJCQlpZiAoIGdyb3Vwcy5sZW5ndGgg
PiAwICkgeworCisJCQkJZGF0YS5kYXRhLmdyb3VwcyA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5n
aWZ5KCBncm91cHMgKSApOworCisJCQl9CisKKwkJCXZhciBib3VuZGluZ1NwaGVyZSA9IHRoaXMu
Ym91bmRpbmdTcGhlcmU7CisKKwkJCWlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CisK
KwkJCQlkYXRhLmRhdGEuYm91bmRpbmdTcGhlcmUgPSB7CisJCQkJCWNlbnRlcjogYm91bmRpbmdT
cGhlcmUuY2VudGVyLnRvQXJyYXkoKSwKKwkJCQkJcmFkaXVzOiBib3VuZGluZ1NwaGVyZS5yYWRp
dXMKKwkJCQl9OworCisJCQl9CisKKwkJCXJldHVybiBkYXRhOworCisJCX0sCisKKwkJY2xvbmU6
IGZ1bmN0aW9uICgpIHsKKworCQkJLyoKKwkJCSAvLyBIYW5kbGUgcHJpbWl0aXZlcworCisJCQkg
dmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7CisKKwkJCSBpZiAoIHBhcmFtZXRlcnMg
IT09IHVuZGVmaW5lZCApIHsKKworCQkJIHZhciB2YWx1ZXMgPSBbXTsKKworCQkJIGZvciAoIHZh
ciBrZXkgaW4gcGFyYW1ldGVycyApIHsKKworCQkJIHZhbHVlcy5wdXNoKCBwYXJhbWV0ZXJzWyBr
ZXkgXSApOworCisJCQkgfQorCisJCQkgdmFyIGdlb21ldHJ5ID0gT2JqZWN0LmNyZWF0ZSggdGhp
cy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgKTsKKwkJCSB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBn
ZW9tZXRyeSwgdmFsdWVzICk7CisJCQkgcmV0dXJuIGdlb21ldHJ5OworCisJCQkgfQorCisJCQkg
cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOworCQkJICovCisKKwkJ
CXJldHVybiBuZXcgQnVmZmVyR2VvbWV0cnkoKS5jb3B5KCB0aGlzICk7CisKKwkJfSwKKworCQlj
b3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworCQkJdmFyIG5hbWUsIGksIGw7CisKKwkJCS8v
IHJlc2V0CisKKwkJCXRoaXMuaW5kZXggPSBudWxsOworCQkJdGhpcy5hdHRyaWJ1dGVzID0ge307
CisJCQl0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9OworCQkJdGhpcy5ncm91cHMgPSBbXTsKKwkJ
CXRoaXMuYm91bmRpbmdCb3ggPSBudWxsOworCQkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7
CisKKwkJCS8vIG5hbWUKKworCQkJdGhpcy5uYW1lID0gc291cmNlLm5hbWU7CisKKwkJCS8vIGlu
ZGV4CisKKwkJCXZhciBpbmRleCA9IHNvdXJjZS5pbmRleDsKKworCQkJaWYgKCBpbmRleCAhPT0g
bnVsbCApIHsKKworCQkJCXRoaXMuc2V0SW5kZXgoIGluZGV4LmNsb25lKCkgKTsKKworCQkJfQor
CisJCQkvLyBhdHRyaWJ1dGVzCisKKwkJCXZhciBhdHRyaWJ1dGVzID0gc291cmNlLmF0dHJpYnV0
ZXM7CisKKwkJCWZvciAoIG5hbWUgaW4gYXR0cmlidXRlcyApIHsKKworCQkJCXZhciBhdHRyaWJ1
dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07CisJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIGF0
dHJpYnV0ZS5jbG9uZSgpICk7CisKKwkJCX0KKworCQkJLy8gbW9ycGggYXR0cmlidXRlcworCisJ
CQl2YXIgbW9ycGhBdHRyaWJ1dGVzID0gc291cmNlLm1vcnBoQXR0cmlidXRlczsKKworCQkJZm9y
ICggbmFtZSBpbiBtb3JwaEF0dHJpYnV0ZXMgKSB7CisKKwkJCQl2YXIgYXJyYXkgPSBbXTsKKwkJ
CQl2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhB
dHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzCisKKwkJCQlmb3IgKCBp
ID0gMCwgbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJ
YXJyYXkucHVzaCggbW9ycGhBdHRyaWJ1dGVbIGkgXS5jbG9uZSgpICk7CisKKwkJCQl9CisKKwkJ
CQl0aGlzLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gYXJyYXk7CisKKwkJCX0KKworCQkJLy8g
Z3JvdXBzCisKKwkJCXZhciBncm91cHMgPSBzb3VyY2UuZ3JvdXBzOworCisJCQlmb3IgKCBpID0g
MCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJdmFyIGdyb3VwID0g
Z3JvdXBzWyBpIF07CisJCQkJdGhpcy5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50
LCBncm91cC5tYXRlcmlhbEluZGV4ICk7CisKKwkJCX0KKworCQkJLy8gYm91bmRpbmcgYm94CisK
KwkJCXZhciBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDsKKworCQkJaWYgKCBib3Vu
ZGluZ0JveCAhPT0gbnVsbCApIHsKKworCQkJCXRoaXMuYm91bmRpbmdCb3ggPSBib3VuZGluZ0Jv
eC5jbG9uZSgpOworCisJCQl9CisKKwkJCS8vIGJvdW5kaW5nIHNwaGVyZQorCisJCQl2YXIgYm91
bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmU7CisKKwkJCWlmICggYm91bmRpbmdT
cGhlcmUgIT09IG51bGwgKSB7CisKKwkJCQl0aGlzLmJvdW5kaW5nU3BoZXJlID0gYm91bmRpbmdT
cGhlcmUuY2xvbmUoKTsKKworCQkJfQorCisJCQkvLyBkcmF3IHJhbmdlCisKKwkJCXRoaXMuZHJh
d1JhbmdlLnN0YXJ0ID0gc291cmNlLmRyYXdSYW5nZS5zdGFydDsKKwkJCXRoaXMuZHJhd1Jhbmdl
LmNvdW50ID0gc291cmNlLmRyYXdSYW5nZS5jb3VudDsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJ
fSwKKworCQlkaXNwb3NlOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMuZGlzcGF0Y2hFdmVudCgg
eyB0eXBlOiAnZGlzcG9zZScgfSApOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRo
b3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0
cHM6Ly9naXRodWIuY29tL011Z2VuODcKKwkgKi8KKworCS8vIEJveEdlb21ldHJ5CisKKwlmdW5j
dGlvbiBCb3hHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhl
aWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkgeworCisJCUdlb21ldHJ5LmNhbGwoIHRoaXMg
KTsKKworCQl0aGlzLnR5cGUgPSAnQm94R2VvbWV0cnknOworCisJCXRoaXMucGFyYW1ldGVycyA9
IHsKKwkJCXdpZHRoOiB3aWR0aCwKKwkJCWhlaWdodDogaGVpZ2h0LAorCQkJZGVwdGg6IGRlcHRo
LAorCQkJd2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cywKKwkJCWhlaWdodFNlZ21lbnRzOiBo
ZWlnaHRTZWdtZW50cywKKwkJCWRlcHRoU2VnbWVudHM6IGRlcHRoU2VnbWVudHMKKwkJfTsKKwor
CQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEJveEJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwg
aGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIGRlcHRoU2VnbWVu
dHMgKSApOworCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKKworCX0KKworCUJveEdlb21ldHJ5LnBy
b3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOworCUJveEdlb21l
dHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveEdlb21ldHJ5OworCisJLy8gQm94QnVmZmVy
R2VvbWV0cnkKKworCWZ1bmN0aW9uIEJveEJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCBk
ZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIGRlcHRoU2VnbWVudHMgKSB7CisK
KwkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdCb3hCdWZm
ZXJHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJd2lkdGg6IHdpZHRoLAor
CQkJaGVpZ2h0OiBoZWlnaHQsCisJCQlkZXB0aDogZGVwdGgsCisJCQl3aWR0aFNlZ21lbnRzOiB3
aWR0aFNlZ21lbnRzLAorCQkJaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAorCQkJZGVw
dGhTZWdtZW50czogZGVwdGhTZWdtZW50cworCQl9OworCisJCXZhciBzY29wZSA9IHRoaXM7CisK
KwkJLy8gc2VnbWVudHMKKworCQl3aWR0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggd2lkdGhTZWdt
ZW50cyApIHx8IDE7CisJCWhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVu
dHMgKSB8fCAxOworCQlkZXB0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggZGVwdGhTZWdtZW50cyAp
IHx8IDE7CisKKwkJLy8gYnVmZmVycworCisJCXZhciBpbmRpY2VzID0gW107CisJCXZhciB2ZXJ0
aWNlcyA9IFtdOworCQl2YXIgbm9ybWFscyA9IFtdOworCQl2YXIgdXZzID0gW107CisKKwkJLy8g
aGVscGVyIHZhcmlhYmxlcworCisJCXZhciBudW1iZXJPZlZlcnRpY2VzID0gMDsKKwkJdmFyIGdy
b3VwU3RhcnQgPSAwOworCisJCS8vIGJ1aWxkIGVhY2ggc2lkZSBvZiB0aGUgYm94IGdlb21ldHJ5
CisKKwkJYnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQs
ICAgd2lkdGgsICBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweAorCQli
dWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAgIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgLSB3aWR0
aCwgIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAxICk7IC8vIG54CisJCWJ1aWxkUGxh
bmUoICd4JywgJ3onLCAneScsICAgMSwgICAxLCB3aWR0aCwgZGVwdGgsICAgIGhlaWdodCwgd2lk
dGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgIDIgKTsgLy8gcHkKKwkJYnVpbGRQbGFuZSggJ3gn
LCAneicsICd5JywgICAxLCAtIDEsIHdpZHRoLCBkZXB0aCwgIC0gaGVpZ2h0LCB3aWR0aFNlZ21l
bnRzLCBkZXB0aFNlZ21lbnRzLCAgMyApOyAvLyBueQorCQlidWlsZFBsYW5lKCAneCcsICd5Jywg
J3onLCAgIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgICBkZXB0aCwgIHdpZHRoU2VnbWVudHMsIGhl
aWdodFNlZ21lbnRzLCA0ICk7IC8vIHB6CisJCWJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsIC0g
MSwgLSAxLCB3aWR0aCwgaGVpZ2h0LCAtIGRlcHRoLCAgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2Vn
bWVudHMsIDUgKTsgLy8gbnoKKworCQkvLyBidWlsZCBnZW9tZXRyeQorCisJCXRoaXMuc2V0SW5k
ZXgoIGluZGljZXMgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9h
dDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CisJCXRoaXMuYWRkQXR0cmlidXRl
KCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOwor
CQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2
cywgMiApICk7CisKKwkJZnVuY3Rpb24gYnVpbGRQbGFuZSggdSwgdiwgdywgdWRpciwgdmRpciwg
d2lkdGgsIGhlaWdodCwgZGVwdGgsIGdyaWRYLCBncmlkWSwgbWF0ZXJpYWxJbmRleCApIHsKKwor
CQkJdmFyIHNlZ21lbnRXaWR0aCA9IHdpZHRoIC8gZ3JpZFg7CisJCQl2YXIgc2VnbWVudEhlaWdo
dCA9IGhlaWdodCAvIGdyaWRZOworCisJCQl2YXIgd2lkdGhIYWxmID0gd2lkdGggLyAyOworCQkJ
dmFyIGhlaWdodEhhbGYgPSBoZWlnaHQgLyAyOworCQkJdmFyIGRlcHRoSGFsZiA9IGRlcHRoIC8g
MjsKKworCQkJdmFyIGdyaWRYMSA9IGdyaWRYICsgMTsKKwkJCXZhciBncmlkWTEgPSBncmlkWSAr
IDE7CisKKwkJCXZhciB2ZXJ0ZXhDb3VudGVyID0gMDsKKwkJCXZhciBncm91cENvdW50ID0gMDsK
KworCQkJdmFyIGl4LCBpeTsKKworCQkJdmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7CisKKwkJ
CS8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKKworCQkJZm9yICggaXkgPSAw
OyBpeSA8IGdyaWRZMTsgaXkgKysgKSB7CisKKwkJCQl2YXIgeSA9IGl5ICogc2VnbWVudEhlaWdo
dCAtIGhlaWdodEhhbGY7CisKKwkJCQlmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyAp
IHsKKworCQkJCQl2YXIgeCA9IGl4ICogc2VnbWVudFdpZHRoIC0gd2lkdGhIYWxmOworCisJCQkJ
CS8vIHNldCB2YWx1ZXMgdG8gY29ycmVjdCB2ZWN0b3IgY29tcG9uZW50CisKKwkJCQkJdmVjdG9y
WyB1IF0gPSB4ICogdWRpcjsKKwkJCQkJdmVjdG9yWyB2IF0gPSB5ICogdmRpcjsKKwkJCQkJdmVj
dG9yWyB3IF0gPSBkZXB0aEhhbGY7CisKKwkJCQkJLy8gbm93IGFwcGx5IHZlY3RvciB0byB2ZXJ0
ZXggYnVmZmVyCisKKwkJCQkJdmVydGljZXMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0
b3IueiApOworCisJCQkJCS8vIHNldCB2YWx1ZXMgdG8gY29ycmVjdCB2ZWN0b3IgY29tcG9uZW50
CisKKwkJCQkJdmVjdG9yWyB1IF0gPSAwOworCQkJCQl2ZWN0b3JbIHYgXSA9IDA7CisJCQkJCXZl
Y3RvclsgdyBdID0gZGVwdGggPiAwID8gMSA6IC0gMTsKKworCQkJCQkvLyBub3cgYXBwbHkgdmVj
dG9yIHRvIG5vcm1hbCBidWZmZXIKKworCQkJCQlub3JtYWxzLnB1c2goIHZlY3Rvci54LCB2ZWN0
b3IueSwgdmVjdG9yLnogKTsKKworCQkJCQkvLyB1dnMKKworCQkJCQl1dnMucHVzaCggaXggLyBn
cmlkWCApOworCQkJCQl1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7CisKKwkJCQkJLy8g
Y291bnRlcnMKKworCQkJCQl2ZXJ0ZXhDb3VudGVyICs9IDE7CisKKwkJCQl9CisKKwkJCX0KKwor
CQkJLy8gaW5kaWNlcworCisJCQkvLyAxLiB5b3UgbmVlZCB0aHJlZSBpbmRpY2VzIHRvIGRyYXcg
YSBzaW5nbGUgZmFjZQorCQkJLy8gMi4gYSBzaW5nbGUgc2VnbWVudCBjb25zaXN0cyBvZiB0d28g
ZmFjZXMKKwkJCS8vIDMuIHNvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgc2l4ICgyKjMpIGluZGljZXMg
cGVyIHNlZ21lbnQKKworCQkJZm9yICggaXkgPSAwOyBpeSA8IGdyaWRZOyBpeSArKyApIHsKKwor
CQkJCWZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7CisKKwkJCQkJdmFyIGEgPSBu
dW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiBpeTsKKwkJCQkJdmFyIGIgPSBudW1iZXJP
ZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiAoIGl5ICsgMSApOworCQkJCQl2YXIgYyA9IG51bWJl
ck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTsKKwkJCQkJdmFy
IGQgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5OworCisJCQkJ
CS8vIGZhY2VzCisKKwkJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CisJCQkJCWluZGljZXMu
cHVzaCggYiwgYywgZCApOworCisJCQkJCS8vIGluY3JlYXNlIGNvdW50ZXIKKworCQkJCQlncm91
cENvdW50ICs9IDY7CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gYWRkIGEgZ3JvdXAgdG8gdGhl
IGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnQKKworCQkJ
c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIG1hdGVyaWFsSW5kZXggKTsK
KworCQkJLy8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzCisKKwkJCWdyb3Vw
U3RhcnQgKz0gZ3JvdXBDb3VudDsKKworCQkJLy8gdXBkYXRlIHRvdGFsIG51bWJlciBvZiB2ZXJ0
aWNlcworCisJCQludW1iZXJPZlZlcnRpY2VzICs9IHZlcnRleENvdW50ZXI7CisKKwkJfQorCisJ
fQorCisJQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVy
R2VvbWV0cnkucHJvdG90eXBlICk7CisJQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0
cnVjdG9yID0gQm94QnVmZmVyR2VvbWV0cnk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAv
IGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHVi
LmNvbS9NdWdlbjg3CisJICovCisKKwkvLyBQbGFuZUdlb21ldHJ5CisKKwlmdW5jdGlvbiBQbGFu
ZUdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyAp
IHsKKworCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1BsYW5lR2Vv
bWV0cnknOworCisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXdpZHRoOiB3aWR0aCwKKwkJCWhl
aWdodDogaGVpZ2h0LAorCQkJd2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cywKKwkJCWhlaWdo
dFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cworCQl9OworCisJCXRoaXMuZnJvbUJ1ZmZlckdlb21l
dHJ5KCBuZXcgUGxhbmVCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50
cywgaGVpZ2h0U2VnbWVudHMgKSApOworCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKKworCX0KKwor
CVBsYW5lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90
eXBlICk7CisJUGxhbmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUdlb21l
dHJ5OworCisJLy8gUGxhbmVCdWZmZXJHZW9tZXRyeQorCisJZnVuY3Rpb24gUGxhbmVCdWZmZXJH
ZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMgKSB7
CisKKwkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdQbGFu
ZUJ1ZmZlckdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQl3aWR0aDogd2lk
dGgsCisJCQloZWlnaHQ6IGhlaWdodCwKKwkJCXdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMs
CisJCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMKKwkJfTsKKworCQl2YXIgd2lkdGhf
aGFsZiA9IHdpZHRoIC8gMjsKKwkJdmFyIGhlaWdodF9oYWxmID0gaGVpZ2h0IC8gMjsKKworCQl2
YXIgZ3JpZFggPSBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgMTsKKwkJdmFyIGdyaWRZ
ID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxOworCisJCXZhciBncmlkWDEgPSBn
cmlkWCArIDE7CisJCXZhciBncmlkWTEgPSBncmlkWSArIDE7CisKKwkJdmFyIHNlZ21lbnRfd2lk
dGggPSB3aWR0aCAvIGdyaWRYOworCQl2YXIgc2VnbWVudF9oZWlnaHQgPSBoZWlnaHQgLyBncmlk
WTsKKworCQl2YXIgaXgsIGl5OworCisJCS8vIGJ1ZmZlcnMKKworCQl2YXIgaW5kaWNlcyA9IFtd
OworCQl2YXIgdmVydGljZXMgPSBbXTsKKwkJdmFyIG5vcm1hbHMgPSBbXTsKKwkJdmFyIHV2cyA9
IFtdOworCisJCS8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKKworCQlmb3Ig
KCBpeSA9IDA7IGl5IDwgZ3JpZFkxOyBpeSArKyApIHsKKworCQkJdmFyIHkgPSBpeSAqIHNlZ21l
bnRfaGVpZ2h0IC0gaGVpZ2h0X2hhbGY7CisKKwkJCWZvciAoIGl4ID0gMDsgaXggPCBncmlkWDE7
IGl4ICsrICkgeworCisJCQkJdmFyIHggPSBpeCAqIHNlZ21lbnRfd2lkdGggLSB3aWR0aF9oYWxm
OworCisJCQkJdmVydGljZXMucHVzaCggeCwgLSB5LCAwICk7CisKKwkJCQlub3JtYWxzLnB1c2go
IDAsIDAsIDEgKTsKKworCQkJCXV2cy5wdXNoKCBpeCAvIGdyaWRYICk7CisJCQkJdXZzLnB1c2go
IDEgLSAoIGl5IC8gZ3JpZFkgKSApOworCisJCQl9CisKKwkJfQorCisJCS8vIGluZGljZXMKKwor
CQlmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkgeworCisJCQlmb3IgKCBpeCA9IDA7
IGl4IDwgZ3JpZFg7IGl4ICsrICkgeworCisJCQkJdmFyIGEgPSBpeCArIGdyaWRYMSAqIGl5Owor
CQkJCXZhciBiID0gaXggKyBncmlkWDEgKiAoIGl5ICsgMSApOworCQkJCXZhciBjID0gKCBpeCAr
IDEgKSArIGdyaWRYMSAqICggaXkgKyAxICk7CisJCQkJdmFyIGQgPSAoIGl4ICsgMSApICsgZ3Jp
ZFgxICogaXk7CisKKwkJCQkvLyBmYWNlcworCisJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7
CisJCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CisKKwkJCX0KKworCQl9CisKKwkJLy8gYnVp
bGQgZ2VvbWV0cnkKKworCQl0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7CisJCXRoaXMuYWRkQXR0
cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMs
IDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVy
QXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5l
dyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApOworCisJfQorCisJUGxhbmVCdWZm
ZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90
b3R5cGUgKTsKKwlQbGFuZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBs
YW5lQnVmZmVyR2VvbWV0cnk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9t
cmRvb2IuY29tLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5j
b20vCisJICoKKwkgKiBwYXJhbWV0ZXJzID0geworCSAqICBjb2xvcjogPGhleD4sCisJICogIG9w
YWNpdHk6IDxmbG9hdD4sCisJICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwK
KwkgKgorCSAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKiAg
bGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD4KKwkgKgorCSAqICBhb01hcDogbmV3IFRIUkVFLlRl
eHR1cmUoIDxJbWFnZT4gKSwKKwkgKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD4KKwkgKgorCSAq
ICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKgorCSAqICBh
bHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKgorCSAqICBlbnZNYXA6
IG5ldyBUSFJFRS5UZXh0dXJlQ3ViZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5l
Z3pdICksCisJICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LAorCSAqICByZWZsZWN0aXZpdHk6
IDxmbG9hdD4sCisJICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PiwKKwkgKgorCSAqICBzaGFk
aW5nOiBUSFJFRS5TbW9vdGhTaGFkaW5nLAorCSAqICBkZXB0aFRlc3Q6IDxib29sPiwKKwkgKiAg
ZGVwdGhXcml0ZTogPGJvb2w+LAorCSAqCisJICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LAorCSAq
ICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sCisJICoKKwkgKiAgc2tpbm5pbmc6IDxib29s
PiwKKwkgKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4KKwkgKiB9CisJICovCisKKwlmdW5jdGlvbiBN
ZXNoQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKKworCQlNYXRlcmlhbC5jYWxsKCB0aGlz
ICk7CisKKwkJdGhpcy50eXBlID0gJ01lc2hCYXNpY01hdGVyaWFsJzsKKworCQl0aGlzLmNvbG9y
ID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBlbWlzc2l2ZQorCisJCXRoaXMubWFwID0gbnVs
bDsKKworCQl0aGlzLmxpZ2h0TWFwID0gbnVsbDsKKwkJdGhpcy5saWdodE1hcEludGVuc2l0eSA9
IDEuMDsKKworCQl0aGlzLmFvTWFwID0gbnVsbDsKKwkJdGhpcy5hb01hcEludGVuc2l0eSA9IDEu
MDsKKworCQl0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDsKKworCQl0aGlzLmFscGhhTWFwID0gbnVs
bDsKKworCQl0aGlzLmVudk1hcCA9IG51bGw7CisJCXRoaXMuY29tYmluZSA9IE11bHRpcGx5T3Bl
cmF0aW9uOworCQl0aGlzLnJlZmxlY3Rpdml0eSA9IDE7CisJCXRoaXMucmVmcmFjdGlvblJhdGlv
ID0gMC45ODsKKworCQl0aGlzLndpcmVmcmFtZSA9IGZhbHNlOworCQl0aGlzLndpcmVmcmFtZUxp
bmV3aWR0aCA9IDE7CisJCXRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7CisJCXRoaXMu
d2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnOworCisJCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsK
KwkJdGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTsKKworCQl0aGlzLmxpZ2h0cyA9IGZhbHNlOwor
CisJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CisKKwl9CisKKwlNZXNoQmFzaWNNYXRl
cmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKKwlN
ZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoQmFzaWNNYXRlcmlh
bDsKKworCU1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsID0g
dHJ1ZTsKKworCU1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBz
b3VyY2UgKSB7CisKKwkJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNl
ICk7CisKKwkJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKKworCQl0aGlzLm1hcCA9
IHNvdXJjZS5tYXA7CisKKwkJdGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDsKKwkJdGhp
cy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTsKKworCQl0aGlz
LmFvTWFwID0gc291cmNlLmFvTWFwOworCQl0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFv
TWFwSW50ZW5zaXR5OworCisJCXRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7
CisKKwkJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKKworCQl0aGlzLmVudk1hcCA9
IHNvdXJjZS5lbnZNYXA7CisJCXRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lOworCQl0aGlz
LnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7CisJCXRoaXMucmVmcmFjdGlvblJh
dGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbzsKKworCQl0aGlzLndpcmVmcmFtZSA9IHNvdXJj
ZS53aXJlZnJhbWU7CisJCXRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFt
ZUxpbmV3aWR0aDsKKwkJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxp
bmVjYXA7CisJCXRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpv
aW47CisKKwkJdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKKwkJdGhpcy5tb3JwaFRh
cmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzOworCisJCXJldHVybiB0aGlzOworCisJfTsKKwor
CS8qKgorCSAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KKwkgKi8KKworCWZ1
bmN0aW9uIFJheSggb3JpZ2luLCBkaXJlY3Rpb24gKSB7CisKKwkJdGhpcy5vcmlnaW4gPSAoIG9y
aWdpbiAhPT0gdW5kZWZpbmVkICkgPyBvcmlnaW4gOiBuZXcgVmVjdG9yMygpOworCQl0aGlzLmRp
cmVjdGlvbiA9ICggZGlyZWN0aW9uICE9PSB1bmRlZmluZWQgKSA/IGRpcmVjdGlvbiA6IG5ldyBW
ZWN0b3IzKCk7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7CisKKwkJ
c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkgeworCisJCQl0aGlzLm9yaWdpbi5j
b3B5KCBvcmlnaW4gKTsKKwkJCXRoaXMuZGlyZWN0aW9uLmNvcHkoIGRpcmVjdGlvbiApOworCisJ
CQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJl
dHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKworCQl9LAorCisJCWNv
cHk6IGZ1bmN0aW9uICggcmF5ICkgeworCisJCQl0aGlzLm9yaWdpbi5jb3B5KCByYXkub3JpZ2lu
ICk7CisJCQl0aGlzLmRpcmVjdGlvbi5jb3B5KCByYXkuZGlyZWN0aW9uICk7CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0sCisKKwkJYXQ6IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7
CisKKwkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCisJ
CQlyZXR1cm4gcmVzdWx0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQg
KS5hZGQoIHRoaXMub3JpZ2luICk7CisKKwkJfSwKKworCQlsb29rQXQ6IGZ1bmN0aW9uICggdiAp
IHsKKworCQkJdGhpcy5kaXJlY3Rpb24uY29weSggdiApLnN1YiggdGhpcy5vcmlnaW4gKS5ub3Jt
YWxpemUoKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlyZWNhc3Q6IGZ1bmN0aW9u
ICgpIHsKKworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9u
IHJlY2FzdCggdCApIHsKKworCQkJCXRoaXMub3JpZ2luLmNvcHkoIHRoaXMuYXQoIHQsIHYxICkg
KTsKKworCQkJCXJldHVybiB0aGlzOworCisJCQl9OworCisJCX0oKSwKKworCQljbG9zZXN0UG9p
bnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJdmFy
IHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisJCQlyZXN1bHQuc3Vi
VmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICk7CisJCQl2YXIgZGlyZWN0aW9uRGlzdGFuY2Ug
PSByZXN1bHQuZG90KCB0aGlzLmRpcmVjdGlvbiApOworCisJCQlpZiAoIGRpcmVjdGlvbkRpc3Rh
bmNlIDwgMCApIHsKKworCQkJCXJldHVybiByZXN1bHQuY29weSggdGhpcy5vcmlnaW4gKTsKKwor
CQkJfQorCisJCQlyZXR1cm4gcmVzdWx0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlT
Y2FsYXIoIGRpcmVjdGlvbkRpc3RhbmNlICkuYWRkKCB0aGlzLm9yaWdpbiApOworCisJCX0sCisK
KwkJZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgeworCisJCQlyZXR1cm4gTWF0
aC5zcXJ0KCB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApICk7CisKKwkJfSwKKworCQlk
aXN0YW5jZVNxVG9Qb2ludDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdjEgPSBuZXcgVmVjdG9y
MygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkgewor
CisJCQkJdmFyIGRpcmVjdGlvbkRpc3RhbmNlID0gdjEuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMu
b3JpZ2luICkuZG90KCB0aGlzLmRpcmVjdGlvbiApOworCisJCQkJLy8gcG9pbnQgYmVoaW5kIHRo
ZSByYXkKKworCQkJCWlmICggZGlyZWN0aW9uRGlzdGFuY2UgPCAwICkgeworCisJCQkJCXJldHVy
biB0aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTsKKworCQkJCX0KKworCQkJ
CXYxLmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIGRpcmVjdGlvbkRpc3Rh
bmNlICkuYWRkKCB0aGlzLm9yaWdpbiApOworCisJCQkJcmV0dXJuIHYxLmRpc3RhbmNlVG9TcXVh
cmVkKCBwb2ludCApOworCisJCQl9OworCisJCX0oKSwKKworCQlkaXN0YW5jZVNxVG9TZWdtZW50
OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBzZWdDZW50ZXIgPSBuZXcgVmVjdG9yMygpOworCQkJ
dmFyIHNlZ0RpciA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgZGlmZiA9IG5ldyBWZWN0b3IzKCk7
CisKKwkJCXJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9TZWdtZW50KCB2MCwgdjEsIG9wdGlv
bmFsUG9pbnRPblJheSwgb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHsKKworCQkJCS8vIGZyb20g
aHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGlj
cy9HdGVEaXN0UmF5U2VnbWVudC5oCisJCQkJLy8gSXQgcmV0dXJucyB0aGUgbWluIGRpc3RhbmNl
IGJldHdlZW4gdGhlIHJheSBhbmQgdGhlIHNlZ21lbnQKKwkJCQkvLyBkZWZpbmVkIGJ5IHYwIGFu
ZCB2MQorCQkJCS8vIEl0IGNhbiBhbHNvIHNldCB0d28gb3B0aW9uYWwgdGFyZ2V0cyA6CisJCQkJ
Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgcmF5CisJCQkJLy8gLSBUaGUgY2xvc2VzdCBw
b2ludCBvbiB0aGUgc2VnbWVudAorCisJCQkJc2VnQ2VudGVyLmNvcHkoIHYwICkuYWRkKCB2MSAp
Lm11bHRpcGx5U2NhbGFyKCAwLjUgKTsKKwkJCQlzZWdEaXIuY29weSggdjEgKS5zdWIoIHYwICku
bm9ybWFsaXplKCk7CisJCQkJZGlmZi5jb3B5KCB0aGlzLm9yaWdpbiApLnN1Yiggc2VnQ2VudGVy
ICk7CisKKwkJCQl2YXIgc2VnRXh0ZW50ID0gdjAuZGlzdGFuY2VUbyggdjEgKSAqIDAuNTsKKwkJ
CQl2YXIgYTAxID0gLSB0aGlzLmRpcmVjdGlvbi5kb3QoIHNlZ0RpciApOworCQkJCXZhciBiMCA9
IGRpZmYuZG90KCB0aGlzLmRpcmVjdGlvbiApOworCQkJCXZhciBiMSA9IC0gZGlmZi5kb3QoIHNl
Z0RpciApOworCQkJCXZhciBjID0gZGlmZi5sZW5ndGhTcSgpOworCQkJCXZhciBkZXQgPSBNYXRo
LmFicyggMSAtIGEwMSAqIGEwMSApOworCQkJCXZhciBzMCwgczEsIHNxckRpc3QsIGV4dERldDsK
KworCQkJCWlmICggZGV0ID4gMCApIHsKKworCQkJCQkvLyBUaGUgcmF5IGFuZCBzZWdtZW50IGFy
ZSBub3QgcGFyYWxsZWwuCisKKwkJCQkJczAgPSBhMDEgKiBiMSAtIGIwOworCQkJCQlzMSA9IGEw
MSAqIGIwIC0gYjE7CisJCQkJCWV4dERldCA9IHNlZ0V4dGVudCAqIGRldDsKKworCQkJCQlpZiAo
IHMwID49IDAgKSB7CisKKwkJCQkJCWlmICggczEgPj0gLSBleHREZXQgKSB7CisKKwkJCQkJCQlp
ZiAoIHMxIDw9IGV4dERldCApIHsKKworCQkJCQkJCQkvLyByZWdpb24gMAorCQkJCQkJCQkvLyBN
aW5pbXVtIGF0IGludGVyaW9yIHBvaW50cyBvZiByYXkgYW5kIHNlZ21lbnQuCisKKwkJCQkJCQkJ
dmFyIGludkRldCA9IDEgLyBkZXQ7CisJCQkJCQkJCXMwICo9IGludkRldDsKKwkJCQkJCQkJczEg
Kj0gaW52RGV0OworCQkJCQkJCQlzcXJEaXN0ID0gczAgKiAoIHMwICsgYTAxICogczEgKyAyICog
YjAgKSArIHMxICogKCBhMDEgKiBzMCArIHMxICsgMiAqIGIxICkgKyBjOworCisJCQkJCQkJfSBl
bHNlIHsKKworCQkJCQkJCQkvLyByZWdpb24gMQorCisJCQkJCQkJCXMxID0gc2VnRXh0ZW50Owor
CQkJCQkJCQlzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7CisJCQkJCQkJ
CXNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7CisKKwkJCQkJ
CQl9CisKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQkvLyByZWdpb24gNQorCisJCQkJCQkJczEg
PSAtIHNlZ0V4dGVudDsKKwkJCQkJCQlzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBi
MCApICk7CisJCQkJCQkJc3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSAp
ICsgYzsKKworCQkJCQkJfQorCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWlmICggczEgPD0gLSBl
eHREZXQgKSB7CisKKwkJCQkJCQkvLyByZWdpb24gNAorCisJCQkJCQkJczAgPSBNYXRoLm1heCgg
MCwgLSAoIC0gYTAxICogc2VnRXh0ZW50ICsgYjAgKSApOworCQkJCQkJCXMxID0gKCBzMCA+IDAg
KSA/IC0gc2VnRXh0ZW50IDogTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSAp
LCBzZWdFeHRlbnQgKTsKKwkJCQkJCQlzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsg
MiAqIGIxICkgKyBjOworCisJCQkJCQl9IGVsc2UgaWYgKCBzMSA8PSBleHREZXQgKSB7CisKKwkJ
CQkJCQkvLyByZWdpb24gMworCisJCQkJCQkJczAgPSAwOworCQkJCQkJCXMxID0gTWF0aC5taW4o
IE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTsKKwkJCQkJCQlzcXJE
aXN0ID0gczEgKiAoIHMxICsgMiAqIGIxICkgKyBjOworCisJCQkJCQl9IGVsc2UgeworCisJCQkJ
CQkJLy8gcmVnaW9uIDIKKworCQkJCQkJCXMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzZWdF
eHRlbnQgKyBiMCApICk7CisJCQkJCQkJczEgPSAoIHMwID4gMCApID8gc2VnRXh0ZW50IDogTWF0
aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTsKKwkJCQkJ
CQlzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjOworCisJCQkJ
CQl9CisKKwkJCQkJfQorCisJCQkJfSBlbHNlIHsKKworCQkJCQkvLyBSYXkgYW5kIHNlZ21lbnQg
YXJlIHBhcmFsbGVsLgorCisJCQkJCXMxID0gKCBhMDEgPiAwICkgPyAtIHNlZ0V4dGVudCA6IHNl
Z0V4dGVudDsKKwkJCQkJczAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApOwor
CQkJCQlzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjOworCisJ
CQkJfQorCisJCQkJaWYgKCBvcHRpb25hbFBvaW50T25SYXkgKSB7CisKKwkJCQkJb3B0aW9uYWxQ
b2ludE9uUmF5LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHMwICkuYWRk
KCB0aGlzLm9yaWdpbiApOworCisJCQkJfQorCisJCQkJaWYgKCBvcHRpb25hbFBvaW50T25TZWdt
ZW50ICkgeworCisJCQkJCW9wdGlvbmFsUG9pbnRPblNlZ21lbnQuY29weSggc2VnRGlyICkubXVs
dGlwbHlTY2FsYXIoIHMxICkuYWRkKCBzZWdDZW50ZXIgKTsKKworCQkJCX0KKworCQkJCXJldHVy
biBzcXJEaXN0OworCisJCQl9OworCisJCX0oKSwKKworCQlpbnRlcnNlY3RTcGhlcmU6IGZ1bmN0
aW9uICgpIHsKKworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1bmN0
aW9uIGludGVyc2VjdFNwaGVyZSggc3BoZXJlLCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJCXYx
LnN1YlZlY3RvcnMoIHNwaGVyZS5jZW50ZXIsIHRoaXMub3JpZ2luICk7CisJCQkJdmFyIHRjYSA9
IHYxLmRvdCggdGhpcy5kaXJlY3Rpb24gKTsKKwkJCQl2YXIgZDIgPSB2MS5kb3QoIHYxICkgLSB0
Y2EgKiB0Y2E7CisJCQkJdmFyIHJhZGl1czIgPSBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1
czsKKworCQkJCWlmICggZDIgPiByYWRpdXMyICkgcmV0dXJuIG51bGw7CisKKwkJCQl2YXIgdGhj
ID0gTWF0aC5zcXJ0KCByYWRpdXMyIC0gZDIgKTsKKworCQkJCS8vIHQwID0gZmlyc3QgaW50ZXJz
ZWN0IHBvaW50IC0gZW50cmFuY2Ugb24gZnJvbnQgb2Ygc3BoZXJlCisJCQkJdmFyIHQwID0gdGNh
IC0gdGhjOworCisJCQkJLy8gdDEgPSBzZWNvbmQgaW50ZXJzZWN0IHBvaW50IC0gZXhpdCBwb2lu
dCBvbiBiYWNrIG9mIHNwaGVyZQorCQkJCXZhciB0MSA9IHRjYSArIHRoYzsKKworCQkJCS8vIHRl
c3QgdG8gc2VlIGlmIGJvdGggdDAgYW5kIHQxIGFyZSBiZWhpbmQgdGhlIHJheSAtIGlmIHNvLCBy
ZXR1cm4gbnVsbAorCQkJCWlmICggdDAgPCAwICYmIHQxIDwgMCApIHJldHVybiBudWxsOworCisJ
CQkJLy8gdGVzdCB0byBzZWUgaWYgdDAgaXMgYmVoaW5kIHRoZSByYXk6CisJCQkJLy8gaWYgaXQg
aXMsIHRoZSByYXkgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHNvIHJldHVybiB0aGUgc2Vjb25kIGV4
aXQgcG9pbnQgc2NhbGVkIGJ5IHQxLAorCQkJCS8vIGluIG9yZGVyIHRvIGFsd2F5cyByZXR1cm4g
YW4gaW50ZXJzZWN0IHBvaW50IHRoYXQgaXMgaW4gZnJvbnQgb2YgdGhlIHJheS4KKwkJCQlpZiAo
IHQwIDwgMCApIHJldHVybiB0aGlzLmF0KCB0MSwgb3B0aW9uYWxUYXJnZXQgKTsKKworCQkJCS8v
IGVsc2UgdDAgaXMgaW4gZnJvbnQgb2YgdGhlIHJheSwgc28gcmV0dXJuIHRoZSBmaXJzdCBjb2xs
aXNpb24gcG9pbnQgc2NhbGVkIGJ5IHQwCisJCQkJcmV0dXJuIHRoaXMuYXQoIHQwLCBvcHRpb25h
bFRhcmdldCApOworCisJCQl9OworCisJCX0oKSwKKworCQlpbnRlcnNlY3RzU3BoZXJlOiBmdW5j
dGlvbiAoIHNwaGVyZSApIHsKKworCQkJcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhl
cmUuY2VudGVyICkgPD0gc3BoZXJlLnJhZGl1czsKKworCQl9LAorCisJCWRpc3RhbmNlVG9QbGFu
ZTogZnVuY3Rpb24gKCBwbGFuZSApIHsKKworCQkJdmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9y
bWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTsKKworCQkJaWYgKCBkZW5vbWluYXRvciA9PT0gMCAp
IHsKKworCQkJCS8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW4KKwkJCQlpZiAoIHBs
YW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKSA9PT0gMCApIHsKKworCQkJCQlyZXR1
cm4gMDsKKworCQkJCX0KKworCQkJCS8vIE51bGwgaXMgcHJlZmVyYWJsZSB0byB1bmRlZmluZWQg
c2luY2UgdW5kZWZpbmVkIG1lYW5zLi4uLiBpdCBpcyB1bmRlZmluZWQKKworCQkJCXJldHVybiBu
dWxsOworCisJCQl9CisKKwkJCXZhciB0ID0gLSAoIHRoaXMub3JpZ2luLmRvdCggcGxhbmUubm9y
bWFsICkgKyBwbGFuZS5jb25zdGFudCApIC8gZGVub21pbmF0b3I7CisKKwkJCS8vIFJldHVybiBp
ZiB0aGUgcmF5IG5ldmVyIGludGVyc2VjdHMgdGhlIHBsYW5lCisKKwkJCXJldHVybiB0ID49IDAg
PyB0IDogIG51bGw7CisKKwkJfSwKKworCQlpbnRlcnNlY3RQbGFuZTogZnVuY3Rpb24gKCBwbGFu
ZSwgb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCXZhciB0ID0gdGhpcy5kaXN0YW5jZVRvUGxhbmUo
IHBsYW5lICk7CisKKwkJCWlmICggdCA9PT0gbnVsbCApIHsKKworCQkJCXJldHVybiBudWxsOwor
CisJCQl9CisKKwkJCXJldHVybiB0aGlzLmF0KCB0LCBvcHRpb25hbFRhcmdldCApOworCisJCX0s
CisKKwkJaW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkgeworCisJCQkvLyBjaGVj
ayBpZiB0aGUgcmF5IGxpZXMgb24gdGhlIHBsYW5lIGZpcnN0CisKKwkJCXZhciBkaXN0VG9Qb2lu
dCA9IHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKTsKKworCQkJaWYgKCBkaXN0
VG9Qb2ludCA9PT0gMCApIHsKKworCQkJCXJldHVybiB0cnVlOworCisJCQl9CisKKwkJCXZhciBk
ZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7CisKKwkJCWlm
ICggZGVub21pbmF0b3IgKiBkaXN0VG9Qb2ludCA8IDAgKSB7CisKKwkJCQlyZXR1cm4gdHJ1ZTsK
KworCQkJfQorCisJCQkvLyByYXkgb3JpZ2luIGlzIGJlaGluZCB0aGUgcGxhbmUgKGFuZCBpcyBw
b2ludGluZyBiZWhpbmQgaXQpCisKKwkJCXJldHVybiBmYWxzZTsKKworCQl9LAorCisJCWludGVy
c2VjdEJveDogZnVuY3Rpb24gKCBib3gsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQl2YXIgdG1p
biwgdG1heCwgdHltaW4sIHR5bWF4LCB0em1pbiwgdHptYXg7CisKKwkJCXZhciBpbnZkaXJ4ID0g
MSAvIHRoaXMuZGlyZWN0aW9uLngsCisJCQkJaW52ZGlyeSA9IDEgLyB0aGlzLmRpcmVjdGlvbi55
LAorCQkJCWludmRpcnogPSAxIC8gdGhpcy5kaXJlY3Rpb24uejsKKworCQkJdmFyIG9yaWdpbiA9
IHRoaXMub3JpZ2luOworCisJCQlpZiAoIGludmRpcnggPj0gMCApIHsKKworCQkJCXRtaW4gPSAo
IGJveC5taW4ueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4OworCQkJCXRtYXggPSAoIGJveC5tYXgu
eCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4OworCisJCQl9IGVsc2UgeworCisJCQkJdG1pbiA9ICgg
Ym94Lm1heC54IC0gb3JpZ2luLnggKSAqIGludmRpcng7CisJCQkJdG1heCA9ICggYm94Lm1pbi54
IC0gb3JpZ2luLnggKSAqIGludmRpcng7CisKKwkJCX0KKworCQkJaWYgKCBpbnZkaXJ5ID49IDAg
KSB7CisKKwkJCQl0eW1pbiA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7CisJ
CQkJdHltYXggPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5OworCisJCQl9IGVs
c2UgeworCisJCQkJdHltaW4gPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5Owor
CQkJCXR5bWF4ID0gKCBib3gubWluLnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTsKKworCQkJfQor
CisJCQlpZiAoICggdG1pbiA+IHR5bWF4ICkgfHwgKCB0eW1pbiA+IHRtYXggKSApIHJldHVybiBu
dWxsOworCisJCQkvLyBUaGVzZSBsaW5lcyBhbHNvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0bWlu
IG9yIHRtYXggaXMgTmFOCisJCQkvLyAocmVzdWx0IG9mIDAgKiBJbmZpbml0eSkuIHggIT09IHgg
cmV0dXJucyB0cnVlIGlmIHggaXMgTmFOCisKKwkJCWlmICggdHltaW4gPiB0bWluIHx8IHRtaW4g
IT09IHRtaW4gKSB0bWluID0gdHltaW47CisKKwkJCWlmICggdHltYXggPCB0bWF4IHx8IHRtYXgg
IT09IHRtYXggKSB0bWF4ID0gdHltYXg7CisKKwkJCWlmICggaW52ZGlyeiA+PSAwICkgeworCisJ
CQkJdHptaW4gPSAoIGJveC5taW4ueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6OworCQkJCXR6bWF4
ID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejsKKworCQkJfSBlbHNlIHsKKwor
CQkJCXR6bWluID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejsKKwkJCQl0em1h
eCA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7CisKKwkJCX0KKworCQkJaWYg
KCAoIHRtaW4gPiB0em1heCApIHx8ICggdHptaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDsKKwor
CQkJaWYgKCB0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0em1pbjsKKwor
CQkJaWYgKCB0em1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0em1heDsKKwor
CQkJLy9yZXR1cm4gcG9pbnQgY2xvc2VzdCB0byB0aGUgcmF5IChwb3NpdGl2ZSBzaWRlKQorCisJ
CQlpZiAoIHRtYXggPCAwICkgcmV0dXJuIG51bGw7CisKKwkJCXJldHVybiB0aGlzLmF0KCB0bWlu
ID49IDAgPyB0bWluIDogdG1heCwgb3B0aW9uYWxUYXJnZXQgKTsKKworCQl9LAorCisJCWludGVy
c2VjdHNCb3g6ICggZnVuY3Rpb24gKCkgeworCisJCQl2YXIgdiA9IG5ldyBWZWN0b3IzKCk7CisK
KwkJCXJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzQm94KCBib3ggKSB7CisKKwkJCQlyZXR1cm4g
dGhpcy5pbnRlcnNlY3RCb3goIGJveCwgdiApICE9PSBudWxsOworCisJCQl9OworCisJCX0gKSgp
LAorCisJCWludGVyc2VjdFRyaWFuZ2xlOiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIENvbXB1dGUg
dGhlIG9mZnNldCBvcmlnaW4sIGVkZ2VzLCBhbmQgbm9ybWFsLgorCQkJdmFyIGRpZmYgPSBuZXcg
VmVjdG9yMygpOworCQkJdmFyIGVkZ2UxID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciBlZGdlMiA9
IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0
dXJuIGZ1bmN0aW9uIGludGVyc2VjdFRyaWFuZ2xlKCBhLCBiLCBjLCBiYWNrZmFjZUN1bGxpbmcs
IG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQkJLy8gZnJvbSBodHRwOi8vd3d3Lmdlb21ldHJpY3Rv
b2xzLmNvbS9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0ZUludHJSYXkzVHJpYW5nbGUz
LmgKKworCQkJCWVkZ2UxLnN1YlZlY3RvcnMoIGIsIGEgKTsKKwkJCQllZGdlMi5zdWJWZWN0b3Jz
KCBjLCBhICk7CisJCQkJbm9ybWFsLmNyb3NzVmVjdG9ycyggZWRnZTEsIGVkZ2UyICk7CisKKwkJ
CQkvLyBTb2x2ZSBRICsgdCpEID0gYjEqRTEgKyBiMipFMiAoUSA9IGtEaWZmLCBEID0gcmF5IGRp
cmVjdGlvbiwKKwkJCQkvLyBFMSA9IGtFZGdlMSwgRTIgPSBrRWRnZTIsIE4gPSBDcm9zcyhFMSxF
MikpIGJ5CisJCQkJLy8gICB8RG90KEQsTil8KmIxID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jv
c3MoUSxFMikpCisJCQkJLy8gICB8RG90KEQsTil8KmIyID0gc2lnbihEb3QoRCxOKSkqRG90KEQs
Q3Jvc3MoRTEsUSkpCisJCQkJLy8gICB8RG90KEQsTil8KnQgPSAtc2lnbihEb3QoRCxOKSkqRG90
KFEsTikKKwkJCQl2YXIgRGROID0gdGhpcy5kaXJlY3Rpb24uZG90KCBub3JtYWwgKTsKKwkJCQl2
YXIgc2lnbjsKKworCQkJCWlmICggRGROID4gMCApIHsKKworCQkJCQlpZiAoIGJhY2tmYWNlQ3Vs
bGluZyApIHJldHVybiBudWxsOworCQkJCQlzaWduID0gMTsKKworCQkJCX0gZWxzZSBpZiAoIERk
TiA8IDAgKSB7CisKKwkJCQkJc2lnbiA9IC0gMTsKKwkJCQkJRGROID0gLSBEZE47CisKKwkJCQl9
IGVsc2UgeworCisJCQkJCXJldHVybiBudWxsOworCisJCQkJfQorCisJCQkJZGlmZi5zdWJWZWN0
b3JzKCB0aGlzLm9yaWdpbiwgYSApOworCQkJCXZhciBEZFF4RTIgPSBzaWduICogdGhpcy5kaXJl
Y3Rpb24uZG90KCBlZGdlMi5jcm9zc1ZlY3RvcnMoIGRpZmYsIGVkZ2UyICkgKTsKKworCQkJCS8v
IGIxIDwgMCwgbm8gaW50ZXJzZWN0aW9uCisJCQkJaWYgKCBEZFF4RTIgPCAwICkgeworCisJCQkJ
CXJldHVybiBudWxsOworCisJCQkJfQorCisJCQkJdmFyIERkRTF4USA9IHNpZ24gKiB0aGlzLmRp
cmVjdGlvbi5kb3QoIGVkZ2UxLmNyb3NzKCBkaWZmICkgKTsKKworCQkJCS8vIGIyIDwgMCwgbm8g
aW50ZXJzZWN0aW9uCisJCQkJaWYgKCBEZEUxeFEgPCAwICkgeworCisJCQkJCXJldHVybiBudWxs
OworCisJCQkJfQorCisJCQkJLy8gYjErYjIgPiAxLCBubyBpbnRlcnNlY3Rpb24KKwkJCQlpZiAo
IERkUXhFMiArIERkRTF4USA+IERkTiApIHsKKworCQkJCQlyZXR1cm4gbnVsbDsKKworCQkJCX0K
KworCQkJCS8vIExpbmUgaW50ZXJzZWN0cyB0cmlhbmdsZSwgY2hlY2sgaWYgcmF5IGRvZXMuCisJ
CQkJdmFyIFFkTiA9IC0gc2lnbiAqIGRpZmYuZG90KCBub3JtYWwgKTsKKworCQkJCS8vIHQgPCAw
LCBubyBpbnRlcnNlY3Rpb24KKwkJCQlpZiAoIFFkTiA8IDAgKSB7CisKKwkJCQkJcmV0dXJuIG51
bGw7CisKKwkJCQl9CisKKwkJCQkvLyBSYXkgaW50ZXJzZWN0cyB0cmlhbmdsZS4KKwkJCQlyZXR1
cm4gdGhpcy5hdCggUWROIC8gRGROLCBvcHRpb25hbFRhcmdldCApOworCisJCQl9OworCisJCX0o
KSwKKworCQlhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4NCApIHsKKworCQkJdGhpcy5v
cmlnaW4uYXBwbHlNYXRyaXg0KCBtYXRyaXg0ICk7CisJCQl0aGlzLmRpcmVjdGlvbi50cmFuc2Zv
cm1EaXJlY3Rpb24oIG1hdHJpeDQgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQll
cXVhbHM6IGZ1bmN0aW9uICggcmF5ICkgeworCisJCQlyZXR1cm4gcmF5Lm9yaWdpbi5lcXVhbHMo
IHRoaXMub3JpZ2luICkgJiYgcmF5LmRpcmVjdGlvbi5lcXVhbHMoIHRoaXMuZGlyZWN0aW9uICk7
CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9j
bGFyYS5pbworCSAqLworCisJZnVuY3Rpb24gTGluZTMoIHN0YXJ0LCBlbmQgKSB7CisKKwkJdGhp
cy5zdGFydCA9ICggc3RhcnQgIT09IHVuZGVmaW5lZCApID8gc3RhcnQgOiBuZXcgVmVjdG9yMygp
OworCQl0aGlzLmVuZCA9ICggZW5kICE9PSB1bmRlZmluZWQgKSA/IGVuZCA6IG5ldyBWZWN0b3Iz
KCk7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBMaW5lMy5wcm90b3R5cGUsIHsKKworCQlzZXQ6
IGZ1bmN0aW9uICggc3RhcnQsIGVuZCApIHsKKworCQkJdGhpcy5zdGFydC5jb3B5KCBzdGFydCAp
OworCQkJdGhpcy5lbmQuY29weSggZW5kICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisK
KwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9y
KCkuY29weSggdGhpcyApOworCisJCX0sCisKKwkJY29weTogZnVuY3Rpb24gKCBsaW5lICkgewor
CisJCQl0aGlzLnN0YXJ0LmNvcHkoIGxpbmUuc3RhcnQgKTsKKwkJCXRoaXMuZW5kLmNvcHkoIGxp
bmUuZW5kICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZ2V0Q2VudGVyOiBmdW5j
dGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJn
ZXQgfHwgbmV3IFZlY3RvcjMoKTsKKwkJCXJldHVybiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5z
dGFydCwgdGhpcy5lbmQgKS5tdWx0aXBseVNjYWxhciggMC41ICk7CisKKwkJfSwKKworCQlkZWx0
YTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJdmFyIHJlc3VsdCA9IG9wdGlv
bmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisJCQlyZXR1cm4gcmVzdWx0LnN1YlZlY3RvcnMo
IHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7CisKKwkJfSwKKworCQlkaXN0YW5jZVNxOiBmdW5jdGlv
biAoKSB7CisKKwkJCXJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmVu
ZCApOworCisJCX0sCisKKwkJZGlzdGFuY2U6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHRo
aXMuc3RhcnQuZGlzdGFuY2VUbyggdGhpcy5lbmQgKTsKKworCQl9LAorCisJCWF0OiBmdW5jdGlv
biAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJn
ZXQgfHwgbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJuIHRoaXMuZGVsdGEoIHJlc3VsdCApLm11
bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0ICk7CisKKwkJfSwKKworCQljbG9zZXN0
UG9pbnRUb1BvaW50UGFyYW1ldGVyOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBzdGFydFAgPSBu
ZXcgVmVjdG9yMygpOworCQkJdmFyIHN0YXJ0RW5kID0gbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0
dXJuIGZ1bmN0aW9uIGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRv
TGluZSApIHsKKworCQkJCXN0YXJ0UC5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5zdGFydCApOwor
CQkJCXN0YXJ0RW5kLnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7CisKKwkJCQl2
YXIgc3RhcnRFbmQyID0gc3RhcnRFbmQuZG90KCBzdGFydEVuZCApOworCQkJCXZhciBzdGFydEVu
ZF9zdGFydFAgPSBzdGFydEVuZC5kb3QoIHN0YXJ0UCApOworCisJCQkJdmFyIHQgPSBzdGFydEVu
ZF9zdGFydFAgLyBzdGFydEVuZDI7CisKKwkJCQlpZiAoIGNsYW1wVG9MaW5lICkgeworCisJCQkJ
CXQgPSBfTWF0aC5jbGFtcCggdCwgMCwgMSApOworCisJCQkJfQorCisJCQkJcmV0dXJuIHQ7CisK
KwkJCX07CisKKwkJfSgpLAorCisJCWNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICggcG9p
bnQsIGNsYW1wVG9MaW5lLCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJdmFyIHQgPSB0aGlzLmNs
b3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRvTGluZSApOworCisJCQl2
YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJu
IHRoaXMuZGVsdGEoIHJlc3VsdCApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0
ICk7CisKKwkJfSwKKworCQlhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4ICkgeworCisJ
CQl0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCggbWF0cml4ICk7CisJCQl0aGlzLmVuZC5hcHBseU1h
dHJpeDQoIG1hdHJpeCApOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWVxdWFsczog
ZnVuY3Rpb24gKCBsaW5lICkgeworCisJCQlyZXR1cm4gbGluZS5zdGFydC5lcXVhbHMoIHRoaXMu
c3RhcnQgKSAmJiBsaW5lLmVuZC5lcXVhbHMoIHRoaXMuZW5kICk7CisKKwkJfQorCisJfSApOwor
CisJLyoqCisJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworCSAqIEBhdXRo
b3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBUcmlhbmds
ZSggYSwgYiwgYyApIHsKKworCQl0aGlzLmEgPSAoIGEgIT09IHVuZGVmaW5lZCApID8gYSA6IG5l
dyBWZWN0b3IzKCk7CisJCXRoaXMuYiA9ICggYiAhPT0gdW5kZWZpbmVkICkgPyBiIDogbmV3IFZl
Y3RvcjMoKTsKKwkJdGhpcy5jID0gKCBjICE9PSB1bmRlZmluZWQgKSA/IGMgOiBuZXcgVmVjdG9y
MygpOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUsIHsKKworCQlub3JtYWw6IGZ1
bmN0aW9uICgpIHsKKworCQkJdmFyIHYwID0gbmV3IFZlY3RvcjMoKTsKKworCQkJcmV0dXJuIGZ1
bmN0aW9uIG5vcm1hbCggYSwgYiwgYywgb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCQl2YXIgcmVz
dWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKworCQkJCXJlc3VsdC5zdWJW
ZWN0b3JzKCBjLCBiICk7CisJCQkJdjAuc3ViVmVjdG9ycyggYSwgYiApOworCQkJCXJlc3VsdC5j
cm9zcyggdjAgKTsKKworCQkJCXZhciByZXN1bHRMZW5ndGhTcSA9IHJlc3VsdC5sZW5ndGhTcSgp
OworCQkJCWlmICggcmVzdWx0TGVuZ3RoU3EgPiAwICkgeworCisJCQkJCXJldHVybiByZXN1bHQu
bXVsdGlwbHlTY2FsYXIoIDEgLyBNYXRoLnNxcnQoIHJlc3VsdExlbmd0aFNxICkgKTsKKworCQkJ
CX0KKworCQkJCXJldHVybiByZXN1bHQuc2V0KCAwLCAwLCAwICk7CisKKwkJCX07CisKKwkJfSgp
LAorCisJCS8vIHN0YXRpYy9pbnN0YW5jZSBtZXRob2QgdG8gY2FsY3VsYXRlIGJhcnljZW50cmlj
IGNvb3JkaW5hdGVzCisJCS8vIGJhc2VkIG9uOiBodHRwOi8vd3d3LmJsYWNrcGF3bi5jb20vdGV4
dHMvcG9pbnRpbnBvbHkvZGVmYXVsdC5odG1sCisJCWJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rp
b24gKCkgeworCisJCQl2YXIgdjAgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIHYxID0gbmV3IFZl
Y3RvcjMoKTsKKwkJCXZhciB2MiA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJldHVybiBmdW5jdGlv
biBiYXJ5Y29vcmRGcm9tUG9pbnQoIHBvaW50LCBhLCBiLCBjLCBvcHRpb25hbFRhcmdldCApIHsK
KworCQkJCXYwLnN1YlZlY3RvcnMoIGMsIGEgKTsKKwkJCQl2MS5zdWJWZWN0b3JzKCBiLCBhICk7
CisJCQkJdjIuc3ViVmVjdG9ycyggcG9pbnQsIGEgKTsKKworCQkJCXZhciBkb3QwMCA9IHYwLmRv
dCggdjAgKTsKKwkJCQl2YXIgZG90MDEgPSB2MC5kb3QoIHYxICk7CisJCQkJdmFyIGRvdDAyID0g
djAuZG90KCB2MiApOworCQkJCXZhciBkb3QxMSA9IHYxLmRvdCggdjEgKTsKKwkJCQl2YXIgZG90
MTIgPSB2MS5kb3QoIHYyICk7CisKKwkJCQl2YXIgZGVub20gPSAoIGRvdDAwICogZG90MTEgLSBk
b3QwMSAqIGRvdDAxICk7CisKKwkJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3
IFZlY3RvcjMoKTsKKworCQkJCS8vIGNvbGxpbmVhciBvciBzaW5ndWxhciB0cmlhbmdsZQorCQkJ
CWlmICggZGVub20gPT09IDAgKSB7CisKKwkJCQkJLy8gYXJiaXRyYXJ5IGxvY2F0aW9uIG91dHNp
ZGUgb2YgdHJpYW5nbGU/CisJCQkJCS8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgaWRl
YSwgbWF5YmUgc2hvdWxkIGJlIHJldHVybmluZyB1bmRlZmluZWQKKwkJCQkJcmV0dXJuIHJlc3Vs
dC5zZXQoIC0gMiwgLSAxLCAtIDEgKTsKKworCQkJCX0KKworCQkJCXZhciBpbnZEZW5vbSA9IDEg
LyBkZW5vbTsKKwkJCQl2YXIgdSA9ICggZG90MTEgKiBkb3QwMiAtIGRvdDAxICogZG90MTIgKSAq
IGludkRlbm9tOworCQkJCXZhciB2ID0gKCBkb3QwMCAqIGRvdDEyIC0gZG90MDEgKiBkb3QwMiAp
ICogaW52RGVub207CisKKwkJCQkvLyBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyBtdXN0IGFsd2F5
cyBzdW0gdG8gMQorCQkJCXJldHVybiByZXN1bHQuc2V0KCAxIC0gdSAtIHYsIHYsIHUgKTsKKwor
CQkJfTsKKworCQl9KCksCisKKwkJY29udGFpbnNQb2ludDogZnVuY3Rpb24gKCkgeworCisJCQl2
YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gY29udGFpbnNQb2lu
dCggcG9pbnQsIGEsIGIsIGMgKSB7CisKKwkJCQl2YXIgcmVzdWx0ID0gVHJpYW5nbGUuYmFyeWNv
b3JkRnJvbVBvaW50KCBwb2ludCwgYSwgYiwgYywgdjEgKTsKKworCQkJCXJldHVybiAoIHJlc3Vs
dC54ID49IDAgKSAmJiAoIHJlc3VsdC55ID49IDAgKSAmJiAoICggcmVzdWx0LnggKyByZXN1bHQu
eSApIDw9IDEgKTsKKworCQkJfTsKKworCQl9KCkKKworCX0gKTsKKworCU9iamVjdC5hc3NpZ24o
IFRyaWFuZ2xlLnByb3RvdHlwZSwgeworCisJCXNldDogZnVuY3Rpb24gKCBhLCBiLCBjICkgewor
CisJCQl0aGlzLmEuY29weSggYSApOworCQkJdGhpcy5iLmNvcHkoIGIgKTsKKwkJCXRoaXMuYy5j
b3B5KCBjICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0RnJvbVBvaW50c0Fu
ZEluZGljZXM6IGZ1bmN0aW9uICggcG9pbnRzLCBpMCwgaTEsIGkyICkgeworCisJCQl0aGlzLmEu
Y29weSggcG9pbnRzWyBpMCBdICk7CisJCQl0aGlzLmIuY29weSggcG9pbnRzWyBpMSBdICk7CisJ
CQl0aGlzLmMuY29weSggcG9pbnRzWyBpMiBdICk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0s
CisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVj
dG9yKCkuY29weSggdGhpcyApOworCisJCX0sCisKKwkJY29weTogZnVuY3Rpb24gKCB0cmlhbmds
ZSApIHsKKworCQkJdGhpcy5hLmNvcHkoIHRyaWFuZ2xlLmEgKTsKKwkJCXRoaXMuYi5jb3B5KCB0
cmlhbmdsZS5iICk7CisJCQl0aGlzLmMuY29weSggdHJpYW5nbGUuYyApOworCisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCWFyZWE6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIHYwID0gbmV3
IFZlY3RvcjMoKTsKKwkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXJldHVybiBmdW5j
dGlvbiBhcmVhKCkgeworCisJCQkJdjAuc3ViVmVjdG9ycyggdGhpcy5jLCB0aGlzLmIgKTsKKwkJ
CQl2MS5zdWJWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApOworCisJCQkJcmV0dXJuIHYwLmNyb3Nz
KCB2MSApLmxlbmd0aCgpICogMC41OworCisJCQl9OworCisJCX0oKSwKKworCQltaWRwb2ludDog
ZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFs
VGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisJCQlyZXR1cm4gcmVzdWx0LmFkZFZlY3RvcnMoIHRo
aXMuYSwgdGhpcy5iICkuYWRkKCB0aGlzLmMgKS5tdWx0aXBseVNjYWxhciggMSAvIDMgKTsKKwor
CQl9LAorCisJCW5vcm1hbDogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJcmV0
dXJuIFRyaWFuZ2xlLm5vcm1hbCggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgb3B0aW9uYWxUYXJn
ZXQgKTsKKworCQl9LAorCisJCXBsYW5lOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgewor
CisJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFBsYW5lKCk7CisKKwkJCXJl
dHVybiByZXN1bHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5j
ICk7CisKKwkJfSwKKworCQliYXJ5Y29vcmRGcm9tUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9w
dGlvbmFsVGFyZ2V0ICkgeworCisJCQlyZXR1cm4gVHJpYW5nbGUuYmFyeWNvb3JkRnJvbVBvaW50
KCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgb3B0aW9uYWxUYXJnZXQgKTsKKworCQl9
LAorCisJCWNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CisKKwkJCXJldHVybiBU
cmlhbmdsZS5jb250YWluc1BvaW50KCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApOwor
CisJCX0sCisKKwkJY2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCkgeworCisJCQl2YXIg
cGxhbmUgPSBuZXcgUGxhbmUoKTsKKwkJCXZhciBlZGdlTGlzdCA9IFsgbmV3IExpbmUzKCksIG5l
dyBMaW5lMygpLCBuZXcgTGluZTMoKSBdOworCQkJdmFyIHByb2plY3RlZFBvaW50ID0gbmV3IFZl
Y3RvcjMoKTsKKwkJCXZhciBjbG9zZXN0UG9pbnQgPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1
cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkg
eworCisJCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisJ
CQkJdmFyIG1pbkRpc3RhbmNlID0gSW5maW5pdHk7CisKKwkJCQkvLyBwcm9qZWN0IHRoZSBwb2lu
dCBvbnRvIHRoZSBwbGFuZSBvZiB0aGUgdHJpYW5nbGUKKworCQkJCXBsYW5lLnNldEZyb21Db3Bs
YW5hclBvaW50cyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApOworCQkJCXBsYW5lLnByb2plY3RQ
b2ludCggcG9pbnQsIHByb2plY3RlZFBvaW50ICk7CisKKwkJCQkvLyBjaGVjayBpZiB0aGUgcHJv
amVjdGlvbiBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGUKKworCQkJCWlmKCB0aGlzLmNvbnRhaW5z
UG9pbnQoIHByb2plY3RlZFBvaW50ICkgPT09IHRydWUgKSB7CisKKwkJCQkJLy8gaWYgc28sIHRo
aXMgaXMgdGhlIGNsb3Nlc3QgcG9pbnQKKworCQkJCQlyZXN1bHQuY29weSggcHJvamVjdGVkUG9p
bnQgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJLy8gaWYgbm90LCB0aGUgcG9pbnQgZmFsbHMg
b3V0c2lkZSB0aGUgdHJpYW5nbGUuIHRoZSByZXN1bHQgaXMgdGhlIGNsb3Nlc3QgcG9pbnQgdG8g
dGhlIHRyaWFuZ2xlJ3MgZWRnZXMgb3IgdmVydGljZXMKKworCQkJCQllZGdlTGlzdFsgMCBdLnNl
dCggdGhpcy5hLCB0aGlzLmIgKTsKKwkJCQkJZWRnZUxpc3RbIDEgXS5zZXQoIHRoaXMuYiwgdGhp
cy5jICk7CisJCQkJCWVkZ2VMaXN0WyAyIF0uc2V0KCB0aGlzLmMsIHRoaXMuYSApOworCisJCQkJ
CWZvciggdmFyIGkgPSAwOyBpIDwgZWRnZUxpc3QubGVuZ3RoOyBpICsrICkgeworCisJCQkJCQll
ZGdlTGlzdFsgaSBdLmNsb3Nlc3RQb2ludFRvUG9pbnQoIHByb2plY3RlZFBvaW50LCB0cnVlLCBj
bG9zZXN0UG9pbnQgKTsKKworCQkJCQkJdmFyIGRpc3RhbmNlID0gcHJvamVjdGVkUG9pbnQuZGlz
dGFuY2VUb1NxdWFyZWQoIGNsb3Nlc3RQb2ludCApOworCisJCQkJCQlpZiggZGlzdGFuY2UgPCBt
aW5EaXN0YW5jZSApIHsKKworCQkJCQkJCW1pbkRpc3RhbmNlID0gZGlzdGFuY2U7CisKKwkJCQkJ
CQlyZXN1bHQuY29weSggY2xvc2VzdFBvaW50ICk7CisKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJ
CQl9CisKKwkJCQlyZXR1cm4gcmVzdWx0OworCisJCQl9OworCisJCX0oKSwKKworCQllcXVhbHM6
IGZ1bmN0aW9uICggdHJpYW5nbGUgKSB7CisKKwkJCXJldHVybiB0cmlhbmdsZS5hLmVxdWFscygg
dGhpcy5hICkgJiYgdHJpYW5nbGUuYi5lcXVhbHMoIHRoaXMuYiApICYmIHRyaWFuZ2xlLmMuZXF1
YWxzKCB0aGlzLmMgKTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9v
YiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0
ZXJlZHF1YWxpYS5jb20vCisJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29t
by5zZS8KKwkgKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb20vCisJICovCisK
KwlmdW5jdGlvbiBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7CisKKwkJT2JqZWN0M0QuY2Fs
bCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdNZXNoJzsKKworCQl0aGlzLmdlb21ldHJ5ID0g
Z2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7
CisJCXRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBu
ZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9
ICk7CisKKwkJdGhpcy5kcmF3TW9kZSA9IFRyaWFuZ2xlc0RyYXdNb2RlOworCisJCXRoaXMudXBk
YXRlTW9ycGhUYXJnZXRzKCk7CisKKwl9CisKKwlNZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3Np
Z24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0
b3I6IE1lc2gsCisKKwkJaXNNZXNoOiB0cnVlLAorCisJCXNldERyYXdNb2RlOiBmdW5jdGlvbiAo
IHZhbHVlICkgeworCisJCQl0aGlzLmRyYXdNb2RlID0gdmFsdWU7CisKKwkJfSwKKworCQljb3B5
OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworCQkJT2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2Fs
bCggdGhpcywgc291cmNlICk7CisKKwkJCXRoaXMuZHJhd01vZGUgPSBzb3VyY2UuZHJhd01vZGU7
CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJdXBkYXRlTW9ycGhUYXJnZXRzOiBmdW5j
dGlvbiAoKSB7CisKKwkJCXZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CisJCQl2YXIgbSwg
bWwsIG5hbWU7CisKKwkJCWlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKKworCQkJ
CXZhciBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7CisJCQkJdmFy
IGtleXMgPSBPYmplY3Qua2V5cyggbW9ycGhBdHRyaWJ1dGVzICk7CisKKwkJCQlpZiAoIGtleXMu
bGVuZ3RoID4gMCApIHsKKworCQkJCQl2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0
ZXNbIGtleXNbIDAgXSBdOworCisJCQkJCWlmICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5l
ZCApIHsKKworCQkJCQkJdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTsKKwkJCQkJCXRo
aXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307CisKKwkJCQkJCWZvciAoIG0gPSAwLCBtbCA9
IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgbSA8IG1sOyBtICsrICkgeworCisJCQkJCQkJbmFtZSA9
IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTsKKworCQkJCQkJCXRoaXMu
bW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTsKKwkJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0
RGljdGlvbmFyeVsgbmFtZSBdID0gbTsKKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCX0KKwor
CQkJfSBlbHNlIHsKKworCQkJCXZhciBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdl
dHM7CisKKwkJCQlpZiAoIG1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICYmIG1vcnBoVGFyZ2V0
cy5sZW5ndGggPiAwICkgeworCisJCQkJCXRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107
CisJCQkJCXRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307CisKKwkJCQkJZm9yICggbSA9
IDAsIG1sID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgbSA8IG1sOyBtICsrICkgeworCisJCQkJCQlu
YW1lID0gbW9ycGhUYXJnZXRzWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTsKKworCQkJCQkJdGhp
cy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApOworCQkJCQkJdGhpcy5tb3JwaFRhcmdl
dERpY3Rpb25hcnlbIG5hbWUgXSA9IG07CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJ
fSwKKworCQlyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGludmVyc2VNYXRyaXgg
PSBuZXcgTWF0cml4NCgpOworCQkJdmFyIHJheSA9IG5ldyBSYXkoKTsKKwkJCXZhciBzcGhlcmUg
PSBuZXcgU3BoZXJlKCk7CisKKwkJCXZhciB2QSA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgdkIg
PSBuZXcgVmVjdG9yMygpOworCQkJdmFyIHZDID0gbmV3IFZlY3RvcjMoKTsKKworCQkJdmFyIHRl
bXBBID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciB0ZW1wQiA9IG5ldyBWZWN0b3IzKCk7CisJCQl2
YXIgdGVtcEMgPSBuZXcgVmVjdG9yMygpOworCisJCQl2YXIgdXZBID0gbmV3IFZlY3RvcjIoKTsK
KwkJCXZhciB1dkIgPSBuZXcgVmVjdG9yMigpOworCQkJdmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7
CisKKwkJCXZhciBiYXJ5Y29vcmQgPSBuZXcgVmVjdG9yMygpOworCisJCQl2YXIgaW50ZXJzZWN0
aW9uUG9pbnQgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIGludGVyc2VjdGlvblBvaW50V29ybGQg
PSBuZXcgVmVjdG9yMygpOworCisJCQlmdW5jdGlvbiB1dkludGVyc2VjdGlvbiggcG9pbnQsIHAx
LCBwMiwgcDMsIHV2MSwgdXYyLCB1djMgKSB7CisKKwkJCQlUcmlhbmdsZS5iYXJ5Y29vcmRGcm9t
UG9pbnQoIHBvaW50LCBwMSwgcDIsIHAzLCBiYXJ5Y29vcmQgKTsKKworCQkJCXV2MS5tdWx0aXBs
eVNjYWxhciggYmFyeWNvb3JkLnggKTsKKwkJCQl1djIubXVsdGlwbHlTY2FsYXIoIGJhcnljb29y
ZC55ICk7CisJCQkJdXYzLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueiApOworCisJCQkJdXYx
LmFkZCggdXYyICkuYWRkKCB1djMgKTsKKworCQkJCXJldHVybiB1djEuY2xvbmUoKTsKKworCQkJ
fQorCisJCQlmdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCByYXljYXN0ZXIsIHJh
eSwgcEEsIHBCLCBwQywgcG9pbnQgKSB7CisKKwkJCQl2YXIgaW50ZXJzZWN0OworCQkJCXZhciBt
YXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDsKKworCQkJCWlmICggbWF0ZXJpYWwuc2lkZSA9PT0g
QmFja1NpZGUgKSB7CisKKwkJCQkJaW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBw
QywgcEIsIHBBLCB0cnVlLCBwb2ludCApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQlpbnRlcnNl
Y3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBBLCBwQiwgcEMsIG1hdGVyaWFsLnNpZGUgIT09
IERvdWJsZVNpZGUsIHBvaW50ICk7CisKKwkJCQl9CisKKwkJCQlpZiAoIGludGVyc2VjdCA9PT0g
bnVsbCApIHJldHVybiBudWxsOworCisJCQkJaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jb3B5KCBw
b2ludCApOworCQkJCWludGVyc2VjdGlvblBvaW50V29ybGQuYXBwbHlNYXRyaXg0KCBvYmplY3Qu
bWF0cml4V29ybGQgKTsKKworCQkJCXZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2lu
LmRpc3RhbmNlVG8oIGludGVyc2VjdGlvblBvaW50V29ybGQgKTsKKworCQkJCWlmICggZGlzdGFu
Y2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm4g
bnVsbDsKKworCQkJCXJldHVybiB7CisJCQkJCWRpc3RhbmNlOiBkaXN0YW5jZSwKKwkJCQkJcG9p
bnQ6IGludGVyc2VjdGlvblBvaW50V29ybGQuY2xvbmUoKSwKKwkJCQkJb2JqZWN0OiBvYmplY3QK
KwkJCQl9OworCisJCQl9CisKKwkJCWZ1bmN0aW9uIGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNl
Y3Rpb24oIG9iamVjdCwgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApIHsK
KworCQkJCXZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBhICk7CisJCQkJdkIuZnJv
bUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGIgKTsKKwkJCQl2Qy5mcm9tQnVmZmVyQXR0cmli
dXRlKCBwb3NpdGlvbiwgYyApOworCisJCQkJdmFyIGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJz
ZWN0aW9uKCBvYmplY3QsIHJheWNhc3RlciwgcmF5LCB2QSwgdkIsIHZDLCBpbnRlcnNlY3Rpb25Q
b2ludCApOworCisJCQkJaWYgKCBpbnRlcnNlY3Rpb24gKSB7CisKKwkJCQkJaWYgKCB1diApIHsK
KworCQkJCQkJdXZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2LCBhICk7CisJCQkJCQl1dkIuZnJv
bUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGIgKTsKKwkJCQkJCXV2Qy5mcm9tQnVmZmVyQXR0cmlidXRl
KCB1diwgYyApOworCisJCQkJCQlpbnRlcnNlY3Rpb24udXYgPSB1dkludGVyc2VjdGlvbiggaW50
ZXJzZWN0aW9uUG9pbnQsIHZBLCB2QiwgdkMsIHV2QSwgdXZCLCB1dkMgKTsKKworCQkJCQl9CisK
KwkJCQkJaW50ZXJzZWN0aW9uLmZhY2UgPSBuZXcgRmFjZTMoIGEsIGIsIGMsIFRyaWFuZ2xlLm5v
cm1hbCggdkEsIHZCLCB2QyApICk7CisJCQkJCWludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBhOwor
CisJCQkJfQorCisJCQkJcmV0dXJuIGludGVyc2VjdGlvbjsKKworCQkJfQorCisJCQlyZXR1cm4g
ZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkgeworCisJCQkJdmFyIGdl
b21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKKwkJCQl2YXIgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFs
OworCQkJCXZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7CisKKwkJCQlpZiAoIG1h
dGVyaWFsID09PSB1bmRlZmluZWQgKSByZXR1cm47CisKKwkJCQkvLyBDaGVja2luZyBib3VuZGlu
Z1NwaGVyZSBkaXN0YW5jZSB0byByYXkKKworCQkJCWlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhl
cmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKKworCQkJCXNw
aGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApOworCQkJCXNwaGVyZS5hcHBseU1h
dHJpeDQoIG1hdHJpeFdvcmxkICk7CisKKwkJCQlpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0
c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuOworCisJCQkJLy8KKworCQkJCWlu
dmVyc2VNYXRyaXguZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTsKKwkJCQlyYXkuY29weSggcmF5
Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApOworCisJCQkJLy8gQ2hl
Y2sgYm91bmRpbmdCb3ggYmVmb3JlIGNvbnRpbnVpbmcKKworCQkJCWlmICggZ2VvbWV0cnkuYm91
bmRpbmdCb3ggIT09IG51bGwgKSB7CisKKwkJCQkJaWYgKCByYXkuaW50ZXJzZWN0c0JveCggZ2Vv
bWV0cnkuYm91bmRpbmdCb3ggKSA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCQl9CisKKwkJCQl2
YXIgaW50ZXJzZWN0aW9uOworCisJCQkJaWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkg
eworCisJCQkJCXZhciBhLCBiLCBjOworCQkJCQl2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDsK
KwkJCQkJdmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKKwkJCQkJ
dmFyIHV2ID0gZ2VvbWV0cnkuYXR0cmlidXRlcy51djsKKwkJCQkJdmFyIGksIGw7CisKKwkJCQkJ
aWYgKCBpbmRleCAhPT0gbnVsbCApIHsKKworCQkJCQkJLy8gaW5kZXhlZCBidWZmZXIgZ2VvbWV0
cnkKKworCQkJCQkJZm9yICggaSA9IDAsIGwgPSBpbmRleC5jb3VudDsgaSA8IGw7IGkgKz0gMyAp
IHsKKworCQkJCQkJCWEgPSBpbmRleC5nZXRYKCBpICk7CisJCQkJCQkJYiA9IGluZGV4LmdldFgo
IGkgKyAxICk7CisJCQkJCQkJYyA9IGluZGV4LmdldFgoIGkgKyAyICk7CisKKwkJCQkJCQlpbnRl
cnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0
ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICk7CisKKwkJCQkJCQlpZiAoIGludGVyc2Vj
dGlvbiApIHsKKworCQkJCQkJCQlpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vcigg
aSAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIGluZGljZXMgYnVmZmVyIHNlbWFudGljcwor
CQkJCQkJCQlpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApOworCisJCQkJCQkJfQorCisJ
CQkJCQl9CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJLy8gbm9uLWluZGV4ZWQgYnVmZmVyIGdl
b21ldHJ5CisKKwkJCQkJCWZvciAoIGkgPSAwLCBsID0gcG9zaXRpb24uY291bnQ7IGkgPCBsOyBp
ICs9IDMgKSB7CisKKwkJCQkJCQlhID0gaTsKKwkJCQkJCQliID0gaSArIDE7CisJCQkJCQkJYyA9
IGkgKyAyOworCisJCQkJCQkJaW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVy
c2VjdGlvbiggdGhpcywgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApOwor
CisJCQkJCQkJaWYgKCBpbnRlcnNlY3Rpb24gKSB7CisKKwkJCQkJCQkJaW50ZXJzZWN0aW9uLmlu
ZGV4ID0gYTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIHBvc2l0aW9ucyBidWZmZXIgc2VtYW50aWNz
CisJCQkJCQkJCWludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7CisKKwkJCQkJCQl9CisK
KwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5
ICkgeworCisJCQkJCXZhciBmdkEsIGZ2QiwgZnZDOworCQkJCQl2YXIgaXNNdWx0aU1hdGVyaWFs
ID0gQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKTsKKworCQkJCQl2YXIgdmVydGljZXMgPSBnZW9t
ZXRyeS52ZXJ0aWNlczsKKwkJCQkJdmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7CisJCQkJCXZh
ciB1dnM7CisKKwkJCQkJdmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZz
WyAwIF07CisJCQkJCWlmICggZmFjZVZlcnRleFV2cy5sZW5ndGggPiAwICkgdXZzID0gZmFjZVZl
cnRleFV2czsKKworCQkJCQlmb3IgKCB2YXIgZiA9IDAsIGZsID0gZmFjZXMubGVuZ3RoOyBmIDwg
Zmw7IGYgKysgKSB7CisKKwkJCQkJCXZhciBmYWNlID0gZmFjZXNbIGYgXTsKKwkJCQkJCXZhciBm
YWNlTWF0ZXJpYWwgPSBpc011bHRpTWF0ZXJpYWwgPyBtYXRlcmlhbFsgZmFjZS5tYXRlcmlhbElu
ZGV4IF0gOiBtYXRlcmlhbDsKKworCQkJCQkJaWYgKCBmYWNlTWF0ZXJpYWwgPT09IHVuZGVmaW5l
ZCApIGNvbnRpbnVlOworCisJCQkJCQlmdkEgPSB2ZXJ0aWNlc1sgZmFjZS5hIF07CisJCQkJCQlm
dkIgPSB2ZXJ0aWNlc1sgZmFjZS5iIF07CisJCQkJCQlmdkMgPSB2ZXJ0aWNlc1sgZmFjZS5jIF07
CisKKwkJCQkJCWlmICggZmFjZU1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHsKKwor
CQkJCQkJCXZhciBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHM7CisJCQkJCQkJ
dmFyIG1vcnBoSW5mbHVlbmNlcyA9IHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzOworCisJCQkJ
CQkJdkEuc2V0KCAwLCAwLCAwICk7CisJCQkJCQkJdkIuc2V0KCAwLCAwLCAwICk7CisJCQkJCQkJ
dkMuc2V0KCAwLCAwLCAwICk7CisKKwkJCQkJCQlmb3IgKCB2YXIgdCA9IDAsIHRsID0gbW9ycGhU
YXJnZXRzLmxlbmd0aDsgdCA8IHRsOyB0ICsrICkgeworCisJCQkJCQkJCXZhciBpbmZsdWVuY2Ug
PSBtb3JwaEluZmx1ZW5jZXNbIHQgXTsKKworCQkJCQkJCQlpZiAoIGluZmx1ZW5jZSA9PT0gMCAp
IGNvbnRpbnVlOworCisJCQkJCQkJCXZhciB0YXJnZXRzID0gbW9ycGhUYXJnZXRzWyB0IF0udmVy
dGljZXM7CisKKwkJCQkJCQkJdkEuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQS5zdWJWZWN0b3JzKCB0
YXJnZXRzWyBmYWNlLmEgXSwgZnZBICksIGluZmx1ZW5jZSApOworCQkJCQkJCQl2Qi5hZGRTY2Fs
ZWRWZWN0b3IoIHRlbXBCLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYiBdLCBmdkIgKSwgaW5m
bHVlbmNlICk7CisJCQkJCQkJCXZDLmFkZFNjYWxlZFZlY3RvciggdGVtcEMuc3ViVmVjdG9ycygg
dGFyZ2V0c1sgZmFjZS5jIF0sIGZ2QyApLCBpbmZsdWVuY2UgKTsKKworCQkJCQkJCX0KKworCQkJ
CQkJCXZBLmFkZCggZnZBICk7CisJCQkJCQkJdkIuYWRkKCBmdkIgKTsKKwkJCQkJCQl2Qy5hZGQo
IGZ2QyApOworCisJCQkJCQkJZnZBID0gdkE7CisJCQkJCQkJZnZCID0gdkI7CisJCQkJCQkJZnZD
ID0gdkM7CisKKwkJCQkJCX0KKworCQkJCQkJaW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rp
b24oIHRoaXMsIHJheWNhc3RlciwgcmF5LCBmdkEsIGZ2QiwgZnZDLCBpbnRlcnNlY3Rpb25Qb2lu
dCApOworCisJCQkJCQlpZiAoIGludGVyc2VjdGlvbiApIHsKKworCQkJCQkJCWlmICggdXZzICYm
IHV2c1sgZiBdICkgeworCisJCQkJCQkJCXZhciB1dnNfZiA9IHV2c1sgZiBdOworCQkJCQkJCQl1
dkEuY29weSggdXZzX2ZbIDAgXSApOworCQkJCQkJCQl1dkIuY29weSggdXZzX2ZbIDEgXSApOwor
CQkJCQkJCQl1dkMuY29weSggdXZzX2ZbIDIgXSApOworCisJCQkJCQkJCWludGVyc2VjdGlvbi51
diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNlY3Rpb25Qb2ludCwgZnZBLCBmdkIsIGZ2QywgdXZB
LCB1dkIsIHV2QyApOworCisJCQkJCQkJfQorCisJCQkJCQkJaW50ZXJzZWN0aW9uLmZhY2UgPSBm
YWNlOworCQkJCQkJCWludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBmOworCQkJCQkJCWludGVyc2Vj
dHMucHVzaCggaW50ZXJzZWN0aW9uICk7CisKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9CisK
KwkJCX07CisKKwkJfSgpICksCisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJu
IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29w
eSggdGhpcyApOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8g
aHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBXZWJHTEJhY2tncm91bmQoIHJl
bmRlcmVyLCBzdGF0ZSwgb2JqZWN0cywgcHJlbXVsdGlwbGllZEFscGhhICkgeworCisJCXZhciBj
bGVhckNvbG9yID0gbmV3IENvbG9yKCAweDAwMDAwMCApOworCQl2YXIgY2xlYXJBbHBoYSA9IDA7
CisKKwkJdmFyIHBsYW5lQ2FtZXJhLCBwbGFuZU1lc2g7CisJCXZhciBib3hDYW1lcmEsIGJveE1l
c2g7CisKKwkJZnVuY3Rpb24gcmVuZGVyKCBzY2VuZSwgY2FtZXJhLCBmb3JjZUNsZWFyICkgewor
CisJCQl2YXIgYmFja2dyb3VuZCA9IHNjZW5lLmJhY2tncm91bmQ7CisKKwkJCWlmICggYmFja2dy
b3VuZCA9PT0gbnVsbCApIHsKKworCQkJCXNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhh
ICk7CisKKwkJCX0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc0NvbG9yICkg
eworCisJCQkJc2V0Q2xlYXIoIGJhY2tncm91bmQsIDEgKTsKKwkJCQlmb3JjZUNsZWFyID0gdHJ1
ZTsKKworCQkJfQorCisJCQlpZiAoIHJlbmRlcmVyLmF1dG9DbGVhciB8fCBmb3JjZUNsZWFyICkg
eworCisJCQkJcmVuZGVyZXIuY2xlYXIoIHJlbmRlcmVyLmF1dG9DbGVhckNvbG9yLCByZW5kZXJl
ci5hdXRvQ2xlYXJEZXB0aCwgcmVuZGVyZXIuYXV0b0NsZWFyU3RlbmNpbCApOworCisJCQl9CisK
KwkJCWlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ3ViZVRleHR1cmUgKSB7CisKKwkJ
CQlpZiAoIGJveENhbWVyYSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCWJveENhbWVyYSA9IG5l
dyBQZXJzcGVjdGl2ZUNhbWVyYSgpOworCisJCQkJCWJveE1lc2ggPSBuZXcgTWVzaCgKKwkJCQkJ
CW5ldyBCb3hCdWZmZXJHZW9tZXRyeSggNSwgNSwgNSApLAorCQkJCQkJbmV3IFNoYWRlck1hdGVy
aWFsKCB7CisJCQkJCQkJdW5pZm9ybXM6IFNoYWRlckxpYi5jdWJlLnVuaWZvcm1zLAorCQkJCQkJ
CXZlcnRleFNoYWRlcjogU2hhZGVyTGliLmN1YmUudmVydGV4U2hhZGVyLAorCQkJCQkJCWZyYWdt
ZW50U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS5mcmFnbWVudFNoYWRlciwKKwkJCQkJCQlzaWRlOiBC
YWNrU2lkZSwKKwkJCQkJCQlkZXB0aFRlc3Q6IGZhbHNlLAorCQkJCQkJCWRlcHRoV3JpdGU6IGZh
bHNlLAorCQkJCQkJCWZvZzogZmFsc2UKKwkJCQkJCX0gKQorCQkJCQkpOworCisJCQkJfQorCisJ
CQkJYm94Q2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhLnByb2plY3Rpb25NYXRy
aXggKTsKKworCQkJCWJveENhbWVyYS5tYXRyaXhXb3JsZC5leHRyYWN0Um90YXRpb24oIGNhbWVy
YS5tYXRyaXhXb3JsZCApOworCQkJCWJveENhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52
ZXJzZSggYm94Q2FtZXJhLm1hdHJpeFdvcmxkICk7CisKKwkJCQlib3hNZXNoLm1hdGVyaWFsLnVu
aWZvcm1zWyAidEN1YmUiIF0udmFsdWUgPSBiYWNrZ3JvdW5kOworCQkJCWJveE1lc2gubW9kZWxW
aWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGJveENhbWVyYS5tYXRyaXhXb3JsZEludmVyc2Us
IGJveE1lc2gubWF0cml4V29ybGQgKTsKKworCQkJCW9iamVjdHMudXBkYXRlKCBib3hNZXNoICk7
CisKKwkJCQlyZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIGJveENhbWVyYSwgbnVsbCwgYm94
TWVzaC5nZW9tZXRyeSwgYm94TWVzaC5tYXRlcmlhbCwgYm94TWVzaCwgbnVsbCApOworCisJCQl9
IGVsc2UgaWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNUZXh0dXJlICkgeworCisJCQkJ
aWYgKCBwbGFuZUNhbWVyYSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCXBsYW5lQ2FtZXJhID0g
bmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSAxLCAxLCAxLCAtIDEsIDAsIDEgKTsKKworCQkJCQlw
bGFuZU1lc2ggPSBuZXcgTWVzaCgKKwkJCQkJCW5ldyBQbGFuZUJ1ZmZlckdlb21ldHJ5KCAyLCAy
ICksCisJCQkJCQluZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgZGVwdGhUZXN0OiBmYWxzZSwgZGVw
dGhXcml0ZTogZmFsc2UsIGZvZzogZmFsc2UgfSApCisJCQkJCSk7CisKKwkJCQl9CisKKwkJCQlw
bGFuZU1lc2gubWF0ZXJpYWwubWFwID0gYmFja2dyb3VuZDsKKworCQkJCW9iamVjdHMudXBkYXRl
KCBwbGFuZU1lc2ggKTsKKworCQkJCXJlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggcGxhbmVD
YW1lcmEsIG51bGwsIHBsYW5lTWVzaC5nZW9tZXRyeSwgcGxhbmVNZXNoLm1hdGVyaWFsLCBwbGFu
ZU1lc2gsIG51bGwgKTsKKworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiBzZXRDbGVhciggY29s
b3IsIGFscGhhICkgeworCisJCQlzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCBjb2xvci5y
LCBjb2xvci5nLCBjb2xvci5iLCBhbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICk7CisKKwkJfQor
CisJCXJldHVybiB7CisKKwkJCWdldENsZWFyQ29sb3I6IGZ1bmN0aW9uICgpIHsKKworCQkJCXJl
dHVybiBjbGVhckNvbG9yOworCisJCQl9LAorCQkJc2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCBj
b2xvciwgYWxwaGEgKSB7CisKKwkJCQljbGVhckNvbG9yLnNldCggY29sb3IgKTsKKwkJCQljbGVh
ckFscGhhID0gYWxwaGEgIT09IHVuZGVmaW5lZCA/IGFscGhhIDogMTsKKwkJCQlzZXRDbGVhcigg
Y2xlYXJDb2xvciwgY2xlYXJBbHBoYSApOworCisJCQl9LAorCQkJZ2V0Q2xlYXJBbHBoYTogZnVu
Y3Rpb24gKCkgeworCisJCQkJcmV0dXJuIGNsZWFyQWxwaGE7CisKKwkJCX0sCisJCQlzZXRDbGVh
ckFscGhhOiBmdW5jdGlvbiAoIGFscGhhICkgeworCisJCQkJY2xlYXJBbHBoYSA9IGFscGhhOwor
CQkJCXNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7CisKKwkJCX0sCisJCQlyZW5k
ZXI6IHJlbmRlcgorCisJCX07CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0
dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEs
IGIgKSB7CisKKwkJaWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkgeworCisJ
CQlyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7CisKKwkJfSBlbHNlIGlmICgg
YS5wcm9ncmFtICYmIGIucHJvZ3JhbSAmJiBhLnByb2dyYW0gIT09IGIucHJvZ3JhbSApIHsKKwor
CQkJcmV0dXJuIGEucHJvZ3JhbS5pZCAtIGIucHJvZ3JhbS5pZDsKKworCQl9IGVsc2UgaWYgKCBh
Lm1hdGVyaWFsLmlkICE9PSBiLm1hdGVyaWFsLmlkICkgeworCisJCQlyZXR1cm4gYS5tYXRlcmlh
bC5pZCAtIGIubWF0ZXJpYWwuaWQ7CisKKwkJfSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7CisK
KwkJCXJldHVybiBhLnogLSBiLno7CisKKwkJfSBlbHNlIHsKKworCQkJcmV0dXJuIGEuaWQgLSBi
LmlkOworCisJCX0KKworCX0KKworCWZ1bmN0aW9uIHJldmVyc2VQYWludGVyU29ydFN0YWJsZSgg
YSwgYiApIHsKKworCQlpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7CisK
KwkJCXJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjsKKworCQl9IGlmICggYS56
ICE9PSBiLnogKSB7CisKKwkJCXJldHVybiBiLnogLSBhLno7CisKKwkJfSBlbHNlIHsKKworCQkJ
cmV0dXJuIGEuaWQgLSBiLmlkOworCisJCX0KKworCX0KKworCWZ1bmN0aW9uIFdlYkdMUmVuZGVy
TGlzdCgpIHsKKworCQl2YXIgb3BhcXVlID0gW107CisJCXZhciBvcGFxdWVMYXN0SW5kZXggPSAt
IDE7CisKKwkJdmFyIHRyYW5zcGFyZW50ID0gW107CisJCXZhciB0cmFuc3BhcmVudExhc3RJbmRl
eCA9IC0gMTsKKworCQlmdW5jdGlvbiBpbml0KCkgeworCisJCQlvcGFxdWVMYXN0SW5kZXggPSAt
IDE7CisJCQl0cmFuc3BhcmVudExhc3RJbmRleCA9IC0gMTsKKworCQl9CisKKwkJZnVuY3Rpb24g
cHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHosIGdyb3VwICkgeworCisJCQl2YXIg
YXJyYXksIGluZGV4OworCisJCQkvLyBhbGxvY2F0ZSB0aGUgbmV4dCBwb3NpdGlvbiBpbiB0aGUg
YXBwcm9wcmlhdGUgYXJyYXkKKworCQkJaWYgKCBtYXRlcmlhbC50cmFuc3BhcmVudCApIHsKKwor
CQkJCWFycmF5ID0gdHJhbnNwYXJlbnQ7CisJCQkJaW5kZXggPSArKyB0cmFuc3BhcmVudExhc3RJ
bmRleDsKKworCQkJfSBlbHNlIHsKKworCQkJCWFycmF5ID0gb3BhcXVlOworCQkJCWluZGV4ID0g
Kysgb3BhcXVlTGFzdEluZGV4OworCisJCQl9CisKKwkJCS8vIHJlY3ljbGUgZXhpc3RpbmcgcmVu
ZGVyIGl0ZW0gb3IgZ3JvdyB0aGUgYXJyYXkKKworCQkJdmFyIHJlbmRlckl0ZW0gPSBhcnJheVsg
aW5kZXggXTsKKworCQkJaWYgKCByZW5kZXJJdGVtICkgeworCisJCQkJcmVuZGVySXRlbS5pZCA9
IG9iamVjdC5pZDsKKwkJCQlyZW5kZXJJdGVtLm9iamVjdCA9IG9iamVjdDsKKwkJCQlyZW5kZXJJ
dGVtLmdlb21ldHJ5ID0gZ2VvbWV0cnk7CisJCQkJcmVuZGVySXRlbS5tYXRlcmlhbCA9IG1hdGVy
aWFsOworCQkJCXJlbmRlckl0ZW0ucHJvZ3JhbSA9IG1hdGVyaWFsLnByb2dyYW07CisJCQkJcmVu
ZGVySXRlbS5yZW5kZXJPcmRlciA9IG9iamVjdC5yZW5kZXJPcmRlcjsKKwkJCQlyZW5kZXJJdGVt
LnogPSB6OworCQkJCXJlbmRlckl0ZW0uZ3JvdXAgPSBncm91cDsKKworCQkJfSBlbHNlIHsKKwor
CQkJCXJlbmRlckl0ZW0gPSB7CisJCQkJCWlkOiBvYmplY3QuaWQsCisJCQkJCW9iamVjdDogb2Jq
ZWN0LAorCQkJCQlnZW9tZXRyeTogZ2VvbWV0cnksCisJCQkJCW1hdGVyaWFsOiBtYXRlcmlhbCwK
KwkJCQkJcHJvZ3JhbTogbWF0ZXJpYWwucHJvZ3JhbSwKKwkJCQkJcmVuZGVyT3JkZXI6IG9iamVj
dC5yZW5kZXJPcmRlciwKKwkJCQkJejogeiwKKwkJCQkJZ3JvdXA6IGdyb3VwCisJCQkJfTsKKwor
CQkJCS8vIGFzc2VydCggaW5kZXggPT09IGFycmF5Lmxlbmd0aCApOworCQkJCWFycmF5LnB1c2go
IHJlbmRlckl0ZW0gKTsKKworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiBmaW5pc2goKSB7CisK
KwkJCW9wYXF1ZS5sZW5ndGggPSBvcGFxdWVMYXN0SW5kZXggKyAxOworCQkJdHJhbnNwYXJlbnQu
bGVuZ3RoID0gdHJhbnNwYXJlbnRMYXN0SW5kZXggKyAxOworCisJCX0KKworCQlmdW5jdGlvbiBz
b3J0KCkgeworCisJCQlvcGFxdWUuc29ydCggcGFpbnRlclNvcnRTdGFibGUgKTsKKwkJCXRyYW5z
cGFyZW50LnNvcnQoIHJldmVyc2VQYWludGVyU29ydFN0YWJsZSApOworCisJCX0KKworCQlyZXR1
cm4geworCQkJb3BhcXVlOiBvcGFxdWUsCisJCQl0cmFuc3BhcmVudDogdHJhbnNwYXJlbnQsCisK
KwkJCWluaXQ6IGluaXQsCisJCQlwdXNoOiBwdXNoLAorCQkJZmluaXNoOiBmaW5pc2gsCisKKwkJ
CXNvcnQ6IHNvcnQKKwkJfTsKKworCX0KKworCWZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdHMoKSB7
CisKKwkJdmFyIGxpc3RzID0ge307CisKKwkJZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkg
eworCisJCQl2YXIgaGFzaCA9IHNjZW5lLmlkICsgJywnICsgY2FtZXJhLmlkOworCQkJdmFyIGxp
c3QgPSBsaXN0c1sgaGFzaCBdOworCisJCQlpZiAoIGxpc3QgPT09IHVuZGVmaW5lZCApIHsKKwor
CQkJCS8vIGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJMaXN0czonLCBoYXNoICk7CisK
KwkJCQlsaXN0ID0gbmV3IFdlYkdMUmVuZGVyTGlzdCgpOworCQkJCWxpc3RzWyBoYXNoIF0gPSBs
aXN0OworCisJCQl9CisKKwkJCXJldHVybiBsaXN0OworCisJCX0KKworCQlmdW5jdGlvbiBkaXNw
b3NlKCkgeworCisJCQlsaXN0cyA9IHt9OworCisJCX0KKworCQlyZXR1cm4geworCQkJZ2V0OiBn
ZXQsCisJCQlkaXNwb3NlOiBkaXNwb3NlCisJCX07CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9y
IG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gV2ViR0xJbmRl
eGVkQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvUmVuZGVyICkgeworCisJCXZh
ciBtb2RlOworCisJCWZ1bmN0aW9uIHNldE1vZGUoIHZhbHVlICkgeworCisJCQltb2RlID0gdmFs
dWU7CisKKwkJfQorCisJCXZhciB0eXBlLCBieXRlc1BlckVsZW1lbnQ7CisKKwkJZnVuY3Rpb24g
c2V0SW5kZXgoIHZhbHVlICkgeworCisJCQl0eXBlID0gdmFsdWUudHlwZTsKKwkJCWJ5dGVzUGVy
RWxlbWVudCA9IHZhbHVlLmJ5dGVzUGVyRWxlbWVudDsKKworCQl9CisKKwkJZnVuY3Rpb24gcmVu
ZGVyKCBzdGFydCwgY291bnQgKSB7CisKKwkJCWdsLmRyYXdFbGVtZW50cyggbW9kZSwgY291bnQs
IHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50ICk7CisKKwkJCWluZm9SZW5kZXIuY2FsbHMg
Kys7CisJCQlpbmZvUmVuZGVyLnZlcnRpY2VzICs9IGNvdW50OworCisJCQlpZiAoIG1vZGUgPT09
IGdsLlRSSUFOR0xFUyApIGluZm9SZW5kZXIuZmFjZXMgKz0gY291bnQgLyAzOworCisJCX0KKwor
CQlmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBzdGFydCwgY291bnQgKSB7CisK
KwkJCXZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJh
eXMnICk7CisKKwkJCWlmICggZXh0ZW5zaW9uID09PSBudWxsICkgeworCisJCQkJY29uc29sZS5l
cnJvciggJ1RIUkVFLldlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0
YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNp
b24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7CisJCQkJcmV0dXJuOworCisJCQl9CisKKwkJ
CWV4dGVuc2lvbi5kcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSggbW9kZSwgY291bnQsIHR5cGUs
IHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApOwor
CisJCQlpbmZvUmVuZGVyLmNhbGxzICsrOworCQkJaW5mb1JlbmRlci52ZXJ0aWNlcyArPSBjb3Vu
dCAqIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50OworCisJCQlpZiAoIG1vZGUgPT09IGdsLlRS
SUFOR0xFUyApIGluZm9SZW5kZXIuZmFjZXMgKz0gZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQg
KiBjb3VudCAvIDM7CisKKwkJfQorCisJCS8vCisKKwkJdGhpcy5zZXRNb2RlID0gc2V0TW9kZTsK
KwkJdGhpcy5zZXRJbmRleCA9IHNldEluZGV4OworCQl0aGlzLnJlbmRlciA9IHJlbmRlcjsKKwkJ
dGhpcy5yZW5kZXJJbnN0YW5jZXMgPSByZW5kZXJJbnN0YW5jZXM7CisKKwl9CisKKwkvKioKKwkg
KiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24g
V2ViR0xCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm9SZW5kZXIgKSB7CisKKwkJ
dmFyIG1vZGU7CisKKwkJZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7CisKKwkJCW1vZGUgPSB2
YWx1ZTsKKworCQl9CisKKwkJZnVuY3Rpb24gcmVuZGVyKCBzdGFydCwgY291bnQgKSB7CisKKwkJ
CWdsLmRyYXdBcnJheXMoIG1vZGUsIHN0YXJ0LCBjb3VudCApOworCisJCQlpbmZvUmVuZGVyLmNh
bGxzICsrOworCQkJaW5mb1JlbmRlci52ZXJ0aWNlcyArPSBjb3VudDsKKworCQkJaWYgKCBtb2Rl
ID09PSBnbC5UUklBTkdMRVMgKSBpbmZvUmVuZGVyLmZhY2VzICs9IGNvdW50IC8gMzsKKworCQl9
CisKKwkJZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50ICkg
eworCisJCQl2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRf
YXJyYXlzJyApOworCisJCQlpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHsKKworCQkJCWNvbnNv
bGUuZXJyb3IoICdUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5j
ZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24g
QU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7CisJCQkJcmV0dXJuOworCisJCQl9CisKKwkJCXZh
ciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CisKKwkJCWlmICggcG9z
aXRpb24uaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHsKKworCQkJCWNvdW50ID0gcG9z
aXRpb24uZGF0YS5jb3VudDsKKworCQkJCWV4dGVuc2lvbi5kcmF3QXJyYXlzSW5zdGFuY2VkQU5H
TEUoIG1vZGUsIDAsIGNvdW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApOworCisJCQl9
IGVsc2UgeworCisJCQkJZXh0ZW5zaW9uLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSggbW9kZSwg
c3RhcnQsIGNvdW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApOworCisJCQl9CisKKwkJ
CWluZm9SZW5kZXIuY2FsbHMgKys7CisJCQlpbmZvUmVuZGVyLnZlcnRpY2VzICs9IGNvdW50ICog
Z2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQ7CisKKwkJCWlmICggbW9kZSA9PT0gZ2wuVFJJQU5H
TEVTICkgaW5mb1JlbmRlci5mYWNlcyArPSBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCAqIGNv
dW50IC8gMzsKKworCQl9CisKKwkJLy8KKworCQl0aGlzLnNldE1vZGUgPSBzZXRNb2RlOworCQl0
aGlzLnJlbmRlciA9IHJlbmRlcjsKKwkJdGhpcy5yZW5kZXJJbnN0YW5jZXMgPSByZW5kZXJJbnN0
YW5jZXM7CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2Iu
Y29tLworCSAqLworCisJZnVuY3Rpb24gV2ViR0xHZW9tZXRyaWVzKCBnbCwgYXR0cmlidXRlcywg
aW5mb01lbW9yeSApIHsKKworCQl2YXIgZ2VvbWV0cmllcyA9IHt9OworCQl2YXIgd2lyZWZyYW1l
QXR0cmlidXRlcyA9IHt9OworCisJCWZ1bmN0aW9uIG9uR2VvbWV0cnlEaXNwb3NlKCBldmVudCAp
IHsKKworCQkJdmFyIGdlb21ldHJ5ID0gZXZlbnQudGFyZ2V0OworCQkJdmFyIGJ1ZmZlcmdlb21l
dHJ5ID0gZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTsKKworCQkJaWYgKCBidWZmZXJnZW9tZXRy
eS5pbmRleCAhPT0gbnVsbCApIHsKKworCQkJCWF0dHJpYnV0ZXMucmVtb3ZlKCBidWZmZXJnZW9t
ZXRyeS5pbmRleCApOworCisJCQl9CisKKwkJCWZvciAoIHZhciBuYW1lIGluIGJ1ZmZlcmdlb21l
dHJ5LmF0dHJpYnV0ZXMgKSB7CisKKwkJCQlhdHRyaWJ1dGVzLnJlbW92ZSggYnVmZmVyZ2VvbWV0
cnkuYXR0cmlidXRlc1sgbmFtZSBdICk7CisKKwkJCX0KKworCQkJZ2VvbWV0cnkucmVtb3ZlRXZl
bnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkdlb21ldHJ5RGlzcG9zZSApOworCisJCQlkZWxldGUg
Z2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTsKKworCQkJLy8gVE9ETyBSZW1vdmUgZHVwbGljYXRl
IGNvZGUKKworCQkJdmFyIGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5
LmlkIF07CisKKwkJCWlmICggYXR0cmlidXRlICkgeworCisJCQkJYXR0cmlidXRlcy5yZW1vdmUo
IGF0dHJpYnV0ZSApOworCQkJCWRlbGV0ZSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5p
ZCBdOworCisJCQl9CisKKwkJCWF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZl
cmdlb21ldHJ5LmlkIF07CisKKwkJCWlmICggYXR0cmlidXRlICkgeworCisJCQkJYXR0cmlidXRl
cy5yZW1vdmUoIGF0dHJpYnV0ZSApOworCQkJCWRlbGV0ZSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBi
dWZmZXJnZW9tZXRyeS5pZCBdOworCisJCQl9CisKKwkJCS8vCisKKwkJCWluZm9NZW1vcnkuZ2Vv
bWV0cmllcyAtLTsKKworCQl9CisKKwkJZnVuY3Rpb24gZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICkg
eworCisJCQl2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdOwor
CisJCQlpZiAoIGJ1ZmZlcmdlb21ldHJ5ICkgcmV0dXJuIGJ1ZmZlcmdlb21ldHJ5OworCisJCQln
ZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7
CisKKwkJCWlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKKworCQkJCWJ1ZmZlcmdl
b21ldHJ5ID0gZ2VvbWV0cnk7CisKKwkJCX0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkg
KSB7CisKKwkJCQlpZiAoIGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkg
eworCisJCQkJCWdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgp
LnNldEZyb21PYmplY3QoIG9iamVjdCApOworCisJCQkJfQorCisJCQkJYnVmZmVyZ2VvbWV0cnkg
PSBnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnk7CisKKwkJCX0KKworCQkJZ2VvbWV0cmllc1sgZ2Vv
bWV0cnkuaWQgXSA9IGJ1ZmZlcmdlb21ldHJ5OworCisJCQlpbmZvTWVtb3J5Lmdlb21ldHJpZXMg
Kys7CisKKwkJCXJldHVybiBidWZmZXJnZW9tZXRyeTsKKworCQl9CisKKwkJZnVuY3Rpb24gdXBk
YXRlKCBnZW9tZXRyeSApIHsKKworCQkJdmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CisJCQl2
YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKKworCQkJaWYgKCBp
bmRleCAhPT0gbnVsbCApIHsKKworCQkJCWF0dHJpYnV0ZXMudXBkYXRlKCBpbmRleCwgZ2wuRUxF
TUVOVF9BUlJBWV9CVUZGRVIgKTsKKworCQkJfQorCisJCQlmb3IgKCB2YXIgbmFtZSBpbiBnZW9t
ZXRyeUF0dHJpYnV0ZXMgKSB7CisKKwkJCQlhdHRyaWJ1dGVzLnVwZGF0ZSggZ2VvbWV0cnlBdHRy
aWJ1dGVzWyBuYW1lIF0sIGdsLkFSUkFZX0JVRkZFUiApOworCisJCQl9CisKKwkJCS8vIG1vcnBo
IHRhcmdldHMKKworCQkJdmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmli
dXRlczsKKworCQkJZm9yICggdmFyIG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkgeworCisJCQkJ
dmFyIGFycmF5ID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07CisKKwkJCQlmb3IgKCB2YXIgaSA9
IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJCWF0dHJpYnV0ZXMu
dXBkYXRlKCBhcnJheVsgaSBdLCBnbC5BUlJBWV9CVUZGRVIgKTsKKworCQkJCX0KKworCQkJfQor
CisJCX0KKworCQlmdW5jdGlvbiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICkgewor
CisJCQl2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTsK
KworCQkJaWYgKCBhdHRyaWJ1dGUgKSByZXR1cm4gYXR0cmlidXRlOworCisJCQl2YXIgaW5kaWNl
cyA9IFtdOworCisJCQl2YXIgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4OworCQkJdmFy
IGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CisKKwkJCS8vIGNvbnNv
bGUudGltZSggJ3dpcmVmcmFtZScgKTsKKworCQkJaWYgKCBnZW9tZXRyeUluZGV4ICE9PSBudWxs
ICkgeworCisJCQkJdmFyIGFycmF5ID0gZ2VvbWV0cnlJbmRleC5hcnJheTsKKworCQkJCWZvciAo
IHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHsKKworCQkJCQl2
YXIgYSA9IGFycmF5WyBpICsgMCBdOworCQkJCQl2YXIgYiA9IGFycmF5WyBpICsgMSBdOworCQkJ
CQl2YXIgYyA9IGFycmF5WyBpICsgMiBdOworCisJCQkJCWluZGljZXMucHVzaCggYSwgYiwgYiwg
YywgYywgYSApOworCisJCQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJdmFyIGFycmF5ID0gZ2Vv
bWV0cnlBdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5OworCisJCQkJZm9yICggdmFyIGkgPSAwLCBs
ID0gKCBhcnJheS5sZW5ndGggLyAzICkgLSAxOyBpIDwgbDsgaSArPSAzICkgeworCisJCQkJCXZh
ciBhID0gaSArIDA7CisJCQkJCXZhciBiID0gaSArIDE7CisJCQkJCXZhciBjID0gaSArIDI7CisK
KwkJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7CisKKwkJCQl9CisKKwkJCX0K
KworCQkJLy8gY29uc29sZS50aW1lRW5kKCAnd2lyZWZyYW1lJyApOworCisJCQlhdHRyaWJ1dGUg
PSBuZXcgKCBhcnJheU1heCggaW5kaWNlcyApID4gNjU1MzUgPyBVaW50MzJCdWZmZXJBdHRyaWJ1
dGUgOiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgKSggaW5kaWNlcywgMSApOworCisJCQlhdHRyaWJ1
dGVzLnVwZGF0ZSggYXR0cmlidXRlLCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiApOworCisJCQl3
aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdID0gYXR0cmlidXRlOworCisJCQlyZXR1
cm4gYXR0cmlidXRlOworCisJCX0KKworCQlyZXR1cm4geworCisJCQlnZXQ6IGdldCwKKwkJCXVw
ZGF0ZTogdXBkYXRlLAorCisJCQlnZXRXaXJlZnJhbWVBdHRyaWJ1dGU6IGdldFdpcmVmcmFtZUF0
dHJpYnV0ZQorCisJCX07CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6
Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gV2ViR0xMaWdodHMoKSB7CisKKwkJdmFy
IGxpZ2h0cyA9IHt9OworCisJCXJldHVybiB7CisKKwkJCWdldDogZnVuY3Rpb24gKCBsaWdodCAp
IHsKKworCQkJCWlmICggbGlnaHRzWyBsaWdodC5pZCBdICE9PSB1bmRlZmluZWQgKSB7CisKKwkJ
CQkJcmV0dXJuIGxpZ2h0c1sgbGlnaHQuaWQgXTsKKworCQkJCX0KKworCQkJCXZhciB1bmlmb3Jt
czsKKworCQkJCXN3aXRjaCAoIGxpZ2h0LnR5cGUgKSB7CisKKwkJCQkJY2FzZSAnRGlyZWN0aW9u
YWxMaWdodCc6CisJCQkJCQl1bmlmb3JtcyA9IHsKKwkJCQkJCQlkaXJlY3Rpb246IG5ldyBWZWN0
b3IzKCksCisJCQkJCQkJY29sb3I6IG5ldyBDb2xvcigpLAorCisJCQkJCQkJc2hhZG93OiBmYWxz
ZSwKKwkJCQkJCQlzaGFkb3dCaWFzOiAwLAorCQkJCQkJCXNoYWRvd1JhZGl1czogMSwKKwkJCQkJ
CQlzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpCisJCQkJCQl9OworCQkJCQkJYnJlYWs7CisK
KwkJCQkJY2FzZSAnU3BvdExpZ2h0JzoKKwkJCQkJCXVuaWZvcm1zID0geworCQkJCQkJCXBvc2l0
aW9uOiBuZXcgVmVjdG9yMygpLAorCQkJCQkJCWRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSwKKwkJ
CQkJCQljb2xvcjogbmV3IENvbG9yKCksCisJCQkJCQkJZGlzdGFuY2U6IDAsCisJCQkJCQkJY29u
ZUNvczogMCwKKwkJCQkJCQlwZW51bWJyYUNvczogMCwKKwkJCQkJCQlkZWNheTogMCwKKworCQkJ
CQkJCXNoYWRvdzogZmFsc2UsCisJCQkJCQkJc2hhZG93QmlhczogMCwKKwkJCQkJCQlzaGFkb3dS
YWRpdXM6IDEsCisJCQkJCQkJc2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKQorCQkJCQkJfTsK
KwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgJ1BvaW50TGlnaHQnOgorCQkJCQkJdW5pZm9ybXMg
PSB7CisJCQkJCQkJcG9zaXRpb246IG5ldyBWZWN0b3IzKCksCisJCQkJCQkJY29sb3I6IG5ldyBD
b2xvcigpLAorCQkJCQkJCWRpc3RhbmNlOiAwLAorCQkJCQkJCWRlY2F5OiAwLAorCisJCQkJCQkJ
c2hhZG93OiBmYWxzZSwKKwkJCQkJCQlzaGFkb3dCaWFzOiAwLAorCQkJCQkJCXNoYWRvd1JhZGl1
czogMSwKKwkJCQkJCQlzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpCisJCQkJCQl9OworCQkJ
CQkJYnJlYWs7CisKKwkJCQkJY2FzZSAnSGVtaXNwaGVyZUxpZ2h0JzoKKwkJCQkJCXVuaWZvcm1z
ID0geworCQkJCQkJCWRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSwKKwkJCQkJCQlza3lDb2xvcjog
bmV3IENvbG9yKCksCisJCQkJCQkJZ3JvdW5kQ29sb3I6IG5ldyBDb2xvcigpCisJCQkJCQl9Owor
CQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAnUmVjdEFyZWFMaWdodCc6CisJCQkJCQl1bmlmb3Jt
cyA9IHsKKwkJCQkJCQljb2xvcjogbmV3IENvbG9yKCksCisJCQkJCQkJcG9zaXRpb246IG5ldyBW
ZWN0b3IzKCksCisJCQkJCQkJaGFsZldpZHRoOiBuZXcgVmVjdG9yMygpLAorCQkJCQkJCWhhbGZI
ZWlnaHQ6IG5ldyBWZWN0b3IzKCkKKwkJCQkJCQkvLyBUT0RPIChhYmVsbmF0aW9uKTogc2V0IFJl
Y3RBcmVhTGlnaHQgc2hhZG93IHVuaWZvcm1zCisJCQkJCQl9OworCQkJCQkJYnJlYWs7CisKKwkJ
CQl9CisKKwkJCQlsaWdodHNbIGxpZ2h0LmlkIF0gPSB1bmlmb3JtczsKKworCQkJCXJldHVybiB1
bmlmb3JtczsKKworCQkJfQorCisJCX07CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9v
YiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gV2ViR0xPYmplY3RzKCBn
bCwgZ2VvbWV0cmllcywgaW5mb1JlbmRlciApIHsKKworCQl2YXIgdXBkYXRlTGlzdCA9IHt9Owor
CisJCWZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkgeworCisJCQl2YXIgZnJhbWUgPSBpbmZvUmVu
ZGVyLmZyYW1lOworCisJCQl2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CisJCQl2YXIg
YnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzLmdldCggb2JqZWN0LCBnZW9tZXRyeSApOworCisJ
CQkvLyBVcGRhdGUgb25jZSBwZXIgZnJhbWUKKworCQkJaWYgKCB1cGRhdGVMaXN0WyBidWZmZXJn
ZW9tZXRyeS5pZCBdICE9PSBmcmFtZSApIHsKKworCQkJCWlmICggZ2VvbWV0cnkuaXNHZW9tZXRy
eSApIHsKKworCQkJCQlidWZmZXJnZW9tZXRyeS51cGRhdGVGcm9tT2JqZWN0KCBvYmplY3QgKTsK
KworCQkJCX0KKworCQkJCWdlb21ldHJpZXMudXBkYXRlKCBidWZmZXJnZW9tZXRyeSApOworCisJ
CQkJdXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSA9IGZyYW1lOworCisJCQl9CisKKwkJ
CXJldHVybiBidWZmZXJnZW9tZXRyeTsKKworCQl9CisKKwkJZnVuY3Rpb24gY2xlYXIoKSB7CisK
KwkJCXVwZGF0ZUxpc3QgPSB7fTsKKworCQl9CisKKwkJcmV0dXJuIHsKKworCQkJdXBkYXRlOiB1
cGRhdGUsCisJCQljbGVhcjogY2xlYXIKKworCQl9OworCisJfQorCisJLyoqCisJICogQGF1dGhv
ciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIGFkZExpbmVO
dW1iZXJzKCBzdHJpbmcgKSB7CisKKwkJdmFyIGxpbmVzID0gc3RyaW5nLnNwbGl0KCAnXG4nICk7
CisKKwkJZm9yICggdmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpICsrICkgeworCisJCQls
aW5lc1sgaSBdID0gKCBpICsgMSApICsgJzogJyArIGxpbmVzWyBpIF07CisKKwkJfQorCisJCXJl
dHVybiBsaW5lcy5qb2luKCAnXG4nICk7CisKKwl9CisKKwlmdW5jdGlvbiBXZWJHTFNoYWRlcigg
Z2wsIHR5cGUsIHN0cmluZyApIHsKKworCQl2YXIgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCB0
eXBlICk7CisKKwkJZ2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIHN0cmluZyApOworCQlnbC5jb21w
aWxlU2hhZGVyKCBzaGFkZXIgKTsKKworCQlpZiAoIGdsLmdldFNoYWRlclBhcmFtZXRlciggc2hh
ZGVyLCBnbC5DT01QSUxFX1NUQVRVUyApID09PSBmYWxzZSApIHsKKworCQkJY29uc29sZS5lcnJv
ciggJ1RIUkVFLldlYkdMU2hhZGVyOiBTaGFkZXIgY291bGRuXCd0IGNvbXBpbGUuJyApOworCisJ
CX0KKworCQlpZiAoIGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApICE9PSAnJyApIHsKKwor
CQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkZXI6IGdsLmdldFNoYWRlckluZm9Mb2co
KScsIHR5cGUgPT09IGdsLlZFUlRFWF9TSEFERVIgPyAndmVydGV4JyA6ICdmcmFnbWVudCcsIGds
LmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApLCBhZGRMaW5lTnVtYmVycyggc3RyaW5nICkgKTsK
KworCQl9CisKKwkJLy8gLS1lbmFibGUtcHJpdmlsZWdlZC13ZWJnbC1leHRlbnNpb24KKwkJLy8g
Y29uc29sZS5sb2coIHR5cGUsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMn
ICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggc2hhZGVyICkgKTsKKworCQlyZXR1cm4gc2hh
ZGVyOworCisJfQorCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNv
bS8KKwkgKi8KKworCXZhciBwcm9ncmFtSWRDb3VudCA9IDA7CisKKwlmdW5jdGlvbiBnZXRFbmNv
ZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICkgeworCisJCXN3aXRjaCAoIGVuY29kaW5nICkgewor
CisJCQljYXNlIExpbmVhckVuY29kaW5nOgorCQkJCXJldHVybiBbICdMaW5lYXInLCcoIHZhbHVl
ICknIF07CisJCQljYXNlIHNSR0JFbmNvZGluZzoKKwkJCQlyZXR1cm4gWyAnc1JHQicsJyggdmFs
dWUgKScgXTsKKwkJCWNhc2UgUkdCRUVuY29kaW5nOgorCQkJCXJldHVybiBbICdSR0JFJywnKCB2
YWx1ZSApJyBdOworCQkJY2FzZSBSR0JNN0VuY29kaW5nOgorCQkJCXJldHVybiBbICdSR0JNJywn
KCB2YWx1ZSwgNy4wICknIF07CisJCQljYXNlIFJHQk0xNkVuY29kaW5nOgorCQkJCXJldHVybiBb
ICdSR0JNJywnKCB2YWx1ZSwgMTYuMCApJyBdOworCQkJY2FzZSBSR0JERW5jb2Rpbmc6CisJCQkJ
cmV0dXJuIFsgJ1JHQkQnLCcoIHZhbHVlLCAyNTYuMCApJyBdOworCQkJY2FzZSBHYW1tYUVuY29k
aW5nOgorCQkJCXJldHVybiBbICdHYW1tYScsJyggdmFsdWUsIGZsb2F0KCBHQU1NQV9GQUNUT1Ig
KSApJyBdOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgRXJyb3IoICd1bnN1cHBvcnRlZCBl
bmNvZGluZzogJyArIGVuY29kaW5nICk7CisKKwkJfQorCisJfQorCisJZnVuY3Rpb24gZ2V0VGV4
ZWxEZWNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkgeworCisJCXZhciBj
b21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApOworCQlyZXR1cm4g
InZlYzQgIiArIGZ1bmN0aW9uTmFtZSArICIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAiICsgY29t
cG9uZW50c1sgMCBdICsgIlRvTGluZWFyIiArIGNvbXBvbmVudHNbIDEgXSArICI7IH0iOworCisJ
fQorCisJZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVu
Y29kaW5nICkgeworCisJCXZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBl
bmNvZGluZyApOworCQlyZXR1cm4gInZlYzQgIiArIGZ1bmN0aW9uTmFtZSArICIoIHZlYzQgdmFs
dWUgKSB7IHJldHVybiBMaW5lYXJUbyIgKyBjb21wb25lbnRzWyAwIF0gKyBjb21wb25lbnRzWyAx
IF0gKyAiOyB9IjsKKworCX0KKworCWZ1bmN0aW9uIGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oIGZ1
bmN0aW9uTmFtZSwgdG9uZU1hcHBpbmcgKSB7CisKKwkJdmFyIHRvbmVNYXBwaW5nTmFtZTsKKwor
CQlzd2l0Y2ggKCB0b25lTWFwcGluZyApIHsKKworCQkJY2FzZSBMaW5lYXJUb25lTWFwcGluZzoK
KwkJCQl0b25lTWFwcGluZ05hbWUgPSAiTGluZWFyIjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBS
ZWluaGFyZFRvbmVNYXBwaW5nOgorCQkJCXRvbmVNYXBwaW5nTmFtZSA9ICJSZWluaGFyZCI7CisJ
CQkJYnJlYWs7CisKKwkJCWNhc2UgVW5jaGFydGVkMlRvbmVNYXBwaW5nOgorCQkJCXRvbmVNYXBw
aW5nTmFtZSA9ICJVbmNoYXJ0ZWQyIjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBDaW5lb25Ub25l
TWFwcGluZzoKKwkJCQl0b25lTWFwcGluZ05hbWUgPSAiT3B0aW1pemVkQ2luZW9uIjsKKwkJCQli
cmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgRXJyb3IoICd1bnN1cHBvcnRlZCB0
b25lTWFwcGluZzogJyArIHRvbmVNYXBwaW5nICk7CisKKwkJfQorCisJCXJldHVybiAidmVjMyAi
ICsgZnVuY3Rpb25OYW1lICsgIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIgKyB0b25lTWFwcGlu
Z05hbWUgKyAiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0iOworCisJfQorCisJZnVuY3Rpb24gZ2Vu
ZXJhdGVFeHRlbnNpb25zKCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzLCByZW5kZXJlckV4dGVuc2lv
bnMgKSB7CisKKwkJZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgfHwge307CisKKwkJdmFyIGNodW5r
cyA9IFsKKwkJCSggZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyB8fCBwYXJhbWV0ZXJzLmVudk1hcEN1
YmVVViB8fCBwYXJhbWV0ZXJzLmJ1bXBNYXAgfHwgcGFyYW1ldGVycy5ub3JtYWxNYXAgfHwgcGFy
YW1ldGVycy5mbGF0U2hhZGluZyApID8gJyNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2
YXRpdmVzIDogZW5hYmxlJyA6ICcnLAorCQkJKCBleHRlbnNpb25zLmZyYWdEZXB0aCB8fCBwYXJh
bWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0
KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVu
YWJsZScgOiAnJywKKwkJCSggZXh0ZW5zaW9ucy5kcmF3QnVmZmVycyApICYmIHJlbmRlcmVyRXh0
ZW5zaW9ucy5nZXQoICdXRUJHTF9kcmF3X2J1ZmZlcnMnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRf
ZHJhd19idWZmZXJzIDogcmVxdWlyZScgOiAnJywKKwkJCSggZXh0ZW5zaW9ucy5zaGFkZXJUZXh0
dXJlTE9EIHx8IHBhcmFtZXRlcnMuZW52TWFwICkgJiYgcmVuZGVyZXJFeHRlbnNpb25zLmdldCgg
J0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3Rl
eHR1cmVfbG9kIDogZW5hYmxlJyA6ICcnCisJCV07CisKKwkJcmV0dXJuIGNodW5rcy5maWx0ZXIo
IGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcbicgKTsKKworCX0KKworCWZ1bmN0aW9uIGdlbmVy
YXRlRGVmaW5lcyggZGVmaW5lcyApIHsKKworCQl2YXIgY2h1bmtzID0gW107CisKKwkJZm9yICgg
dmFyIG5hbWUgaW4gZGVmaW5lcyApIHsKKworCQkJdmFyIHZhbHVlID0gZGVmaW5lc1sgbmFtZSBd
OworCisJCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIGNvbnRpbnVlOworCisJCQljaHVua3MucHVz
aCggJyNkZWZpbmUgJyArIG5hbWUgKyAnICcgKyB2YWx1ZSApOworCisJCX0KKworCQlyZXR1cm4g
Y2h1bmtzLmpvaW4oICdcbicgKTsKKworCX0KKworCWZ1bmN0aW9uIGZldGNoQXR0cmlidXRlTG9j
YXRpb25zKCBnbCwgcHJvZ3JhbSwgaWRlbnRpZmllcnMgKSB7CisKKwkJdmFyIGF0dHJpYnV0ZXMg
PSB7fTsKKworCQl2YXIgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkFD
VElWRV9BVFRSSUJVVEVTICk7CisKKwkJZm9yICggdmFyIGkgPSAwOyBpIDwgbjsgaSArKyApIHsK
KworCQkJdmFyIGluZm8gPSBnbC5nZXRBY3RpdmVBdHRyaWIoIHByb2dyYW0sIGkgKTsKKwkJCXZh
ciBuYW1lID0gaW5mby5uYW1lOworCisJCQkvLyBjb25zb2xlLmxvZygiVEhSRUUuV2ViR0xQcm9n
cmFtOiBBQ1RJVkUgVkVSVEVYIEFUVFJJQlVURToiLCBuYW1lLCBpICk7CisKKwkJCWF0dHJpYnV0
ZXNbIG5hbWUgXSA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCBuYW1lICk7CisKKwkJ
fQorCisJCXJldHVybiBhdHRyaWJ1dGVzOworCisJfQorCisJZnVuY3Rpb24gZmlsdGVyRW1wdHlM
aW5lKCBzdHJpbmcgKSB7CisKKwkJcmV0dXJuIHN0cmluZyAhPT0gJyc7CisKKwl9CisKKwlmdW5j
dGlvbiByZXBsYWNlTGlnaHROdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7CisKKwkJcmV0dXJu
IHN0cmluZworCQkJLnJlcGxhY2UoIC9OVU1fRElSX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bURp
ckxpZ2h0cyApCisJCQkucmVwbGFjZSggL05VTV9TUE9UX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51
bVNwb3RMaWdodHMgKQorCQkJLnJlcGxhY2UoIC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLCBwYXJh
bWV0ZXJzLm51bVJlY3RBcmVhTGlnaHRzICkKKwkJCS5yZXBsYWNlKCAvTlVNX1BPSU5UX0xJR0hU
Uy9nLCBwYXJhbWV0ZXJzLm51bVBvaW50TGlnaHRzICkKKwkJCS5yZXBsYWNlKCAvTlVNX0hFTUlf
TElHSFRTL2csIHBhcmFtZXRlcnMubnVtSGVtaUxpZ2h0cyApOworCisJfQorCisJZnVuY3Rpb24g
cGFyc2VJbmNsdWRlcyggc3RyaW5nICkgeworCisJCXZhciBwYXR0ZXJuID0gL15bIFx0XSojaW5j
bHVkZSArPChbXHdcZC5dKyk+L2dtOworCisJCWZ1bmN0aW9uIHJlcGxhY2UoIG1hdGNoLCBpbmNs
dWRlICkgeworCisJCQl2YXIgcmVwbGFjZSA9IFNoYWRlckNodW5rWyBpbmNsdWRlIF07CisKKwkJ
CWlmICggcmVwbGFjZSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJdGhyb3cgbmV3IEVycm9yKCAn
Q2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIDwnICsgaW5jbHVkZSArICc+JyApOworCisJCQl9CisK
KwkJCXJldHVybiBwYXJzZUluY2x1ZGVzKCByZXBsYWNlICk7CisKKwkJfQorCisJCXJldHVybiBz
dHJpbmcucmVwbGFjZSggcGF0dGVybiwgcmVwbGFjZSApOworCisJfQorCisJZnVuY3Rpb24gdW5y
b2xsTG9vcHMoIHN0cmluZyApIHsKKworCQl2YXIgcGF0dGVybiA9IC9mb3IgXCggaW50IGkgXD0g
KFxkKylcOyBpIDwgKFxkKylcOyBpIFwrXCsgXCkgXHsoW1xzXFNdKz8pKD89XH0pXH0vZzsKKwor
CQlmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHsKKworCQkJ
dmFyIHVucm9sbCA9ICcnOworCisJCQlmb3IgKCB2YXIgaSA9IHBhcnNlSW50KCBzdGFydCApOyBp
IDwgcGFyc2VJbnQoIGVuZCApOyBpICsrICkgeworCisJCQkJdW5yb2xsICs9IHNuaXBwZXQucmVw
bGFjZSggL1xbIGkgXF0vZywgJ1sgJyArIGkgKyAnIF0nICk7CisKKwkJCX0KKworCQkJcmV0dXJu
IHVucm9sbDsKKworCQl9CisKKwkJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBwYXR0ZXJuLCByZXBs
YWNlICk7CisKKwl9CisKKwlmdW5jdGlvbiBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBjb2RlLCBt
YXRlcmlhbCwgc2hhZGVyLCBwYXJhbWV0ZXJzICkgeworCisJCXZhciBnbCA9IHJlbmRlcmVyLmNv
bnRleHQ7CisKKwkJdmFyIGV4dGVuc2lvbnMgPSBtYXRlcmlhbC5leHRlbnNpb25zOworCQl2YXIg
ZGVmaW5lcyA9IG1hdGVyaWFsLmRlZmluZXM7CisKKwkJdmFyIHZlcnRleFNoYWRlciA9IHNoYWRl
ci52ZXJ0ZXhTaGFkZXI7CisJCXZhciBmcmFnbWVudFNoYWRlciA9IHNoYWRlci5mcmFnbWVudFNo
YWRlcjsKKworCQl2YXIgc2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9CQVNJ
Qyc7CisKKwkJaWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFBDRlNoYWRvd01hcCAp
IHsKKworCQkJc2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0YnOworCisJ
CX0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gUENGU29mdFNoYWRvd01h
cCApIHsKKworCQkJc2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0ZfU09G
VCc7CisKKwkJfQorCisJCXZhciBlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUn
OworCQl2YXIgZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZMRUNUSU9OJzsKKwkJ
dmFyIGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7CisK
KwkJaWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHsKKworCQkJc3dpdGNoICggbWF0ZXJpYWwuZW52
TWFwLm1hcHBpbmcgKSB7CisKKwkJCQljYXNlIEN1YmVSZWZsZWN0aW9uTWFwcGluZzoKKwkJCQlj
YXNlIEN1YmVSZWZyYWN0aW9uTWFwcGluZzoKKwkJCQkJZW52TWFwVHlwZURlZmluZSA9ICdFTlZN
QVBfVFlQRV9DVUJFJzsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEN1YmVVVlJlZmxlY3Rpb25N
YXBwaW5nOgorCQkJCWNhc2UgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6CisJCQkJCWVudk1hcFR5
cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRV9VVic7CisJCQkJCWJyZWFrOworCisJCQkJY2Fz
ZSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzoKKwkJCQljYXNlIEVxdWlyZWN0YW5n
dWxhclJlZnJhY3Rpb25NYXBwaW5nOgorCQkJCQllbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9U
WVBFX0VRVUlSRUMnOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgU3BoZXJpY2FsUmVmbGVjdGlv
bk1hcHBpbmc6CisJCQkJCWVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfU1BIRVJFJzsK
KwkJCQkJYnJlYWs7CisKKwkJCX0KKworCQkJc3dpdGNoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBp
bmcgKSB7CisKKwkJCQljYXNlIEN1YmVSZWZyYWN0aW9uTWFwcGluZzoKKwkJCQljYXNlIEVxdWly
ZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOgorCQkJCQllbnZNYXBNb2RlRGVmaW5lID0gJ0VO
Vk1BUF9NT0RFX1JFRlJBQ1RJT04nOworCQkJCQlicmVhazsKKworCQkJfQorCisJCQlzd2l0Y2gg
KCBtYXRlcmlhbC5jb21iaW5lICkgeworCisJCQkJY2FzZSBNdWx0aXBseU9wZXJhdGlvbjoKKwkJ
CQkJZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJzsKKwkJ
CQkJYnJlYWs7CisKKwkJCQljYXNlIE1peE9wZXJhdGlvbjoKKwkJCQkJZW52TWFwQmxlbmRpbmdE
ZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01JWCc7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBB
ZGRPcGVyYXRpb246CisJCQkJCWVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElO
R19BREQnOworCQkJCQlicmVhazsKKworCQkJfQorCisJCX0KKworCQl2YXIgZ2FtbWFGYWN0b3JE
ZWZpbmUgPSAoIHJlbmRlcmVyLmdhbW1hRmFjdG9yID4gMCApID8gcmVuZGVyZXIuZ2FtbWFGYWN0
b3IgOiAxLjA7CisKKwkJLy8gY29uc29sZS5sb2coICdidWlsZGluZyBuZXcgcHJvZ3JhbSAnICk7
CisKKwkJLy8KKworCQl2YXIgY3VzdG9tRXh0ZW5zaW9ucyA9IGdlbmVyYXRlRXh0ZW5zaW9ucygg
ZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgcmVuZGVyZXIuZXh0ZW5zaW9ucyApOworCisJCXZhciBj
dXN0b21EZWZpbmVzID0gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICk7CisKKwkJLy8KKworCQl2
YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKKworCQl2YXIgcHJlZml4VmVydGV4LCBw
cmVmaXhGcmFnbWVudDsKKworCQlpZiAoIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgKSB7
CisKKwkJCXByZWZpeFZlcnRleCA9IFsKKworCQkJCWN1c3RvbURlZmluZXMsCisKKwkJCQknXG4n
CisKKwkJCV0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXG4nICk7CisKKwkJCXBy
ZWZpeEZyYWdtZW50ID0gWworCisJCQkJY3VzdG9tRXh0ZW5zaW9ucywKKwkJCQljdXN0b21EZWZp
bmVzLAorCisJCQkJJ1xuJworCisJCQldLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbigg
J1xuJyApOworCisJCX0gZWxzZSB7CisKKwkJCXByZWZpeFZlcnRleCA9IFsKKworCQkJCSdwcmVj
aXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBmbG9hdDsnLAorCQkJCSdwcmVjaXNp
b24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBpbnQ7JywKKworCQkJCScjZGVmaW5lIFNI
QURFUl9OQU1FICcgKyBzaGFkZXIubmFtZSwKKworCQkJCWN1c3RvbURlZmluZXMsCisKKwkJCQlw
YXJhbWV0ZXJzLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMgPyAnI2RlZmluZSBWRVJURVhfVEVYVFVS
RVMnIDogJycsCisKKwkJCQknI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVm
aW5lLAorCisJCQkJJyNkZWZpbmUgTUFYX0JPTkVTICcgKyBwYXJhbWV0ZXJzLm1heEJvbmVzLAor
CQkJCSggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgKSA/ICcjZGVmaW5lIFVT
RV9GT0cnIDogJycsCisJCQkJKCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4
cCApID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsCisKKwkJCQlwYXJhbWV0ZXJzLm1hcCA/ICcj
ZGVmaW5lIFVTRV9NQVAnIDogJycsCisJCQkJcGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBV
U0VfRU5WTUFQJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVu
dk1hcE1vZGVEZWZpbmUgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLmxpZ2h0TWFwID8gJyNkZWZpbmUg
VVNFX0xJR0hUTUFQJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0Vf
QU9NQVAnIDogJycsCisJCQkJcGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9F
TUlTU0lWRU1BUCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLmJ1bXBNYXAgPyAnI2RlZmluZSBVU0Vf
QlVNUE1BUCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9O
T1JNQUxNQVAnIDogJycsCisJCQkJcGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgJiYgcGFyYW1l
dGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1B
UCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLnNwZWN1bGFyTWFwID8gJyNkZWZpbmUgVVNFX1NQRUNV
TEFSTUFQJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNF
X1JPVUdITkVTU01BUCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVm
aW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsCisJCQkJcGFyYW1ldGVycy5hbHBoYU1hcCA/ICcj
ZGVmaW5lIFVTRV9BTFBIQU1BUCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/
ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJywKKworCQkJCXBhcmFtZXRlcnMuZmxhdFNoYWRpbmcg
PyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJywKKworCQkJCXBhcmFtZXRlcnMuc2tpbm5pbmcg
PyAnI2RlZmluZSBVU0VfU0tJTk5JTkcnIDogJycsCisJCQkJcGFyYW1ldGVycy51c2VWZXJ0ZXhU
ZXh0dXJlID8gJyNkZWZpbmUgQk9ORV9URVhUVVJFJyA6ICcnLAorCisJCQkJcGFyYW1ldGVycy5t
b3JwaFRhcmdldHMgPyAnI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTJyA6ICcnLAorCQkJCXBhcmFt
ZXRlcnMubW9ycGhOb3JtYWxzICYmIHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPT09IGZhbHNlID8g
JyNkZWZpbmUgVVNFX01PUlBITk9STUFMUycgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLmRvdWJsZVNp
ZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMuZmxpcFNp
ZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJywKKworCQkJCScjZGVmaW5lIE5VTV9DTElQ
UElOR19QTEFORVMgJyArIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMsCisKKwkJCQlwYXJh
bWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLAor
CQkJCXBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBU
eXBlRGVmaW5lIDogJycsCisKKwkJCQlwYXJhbWV0ZXJzLnNpemVBdHRlbnVhdGlvbiA/ICcjZGVm
aW5lIFVTRV9TSVpFQVRURU5VQVRJT04nIDogJycsCisKKwkJCQlwYXJhbWV0ZXJzLmxvZ2FyaXRo
bWljRGVwdGhCdWZmZXIgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUYnIDogJycsCisJCQkJcGFy
YW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIHJlbmRlcmVyLmV4dGVuc2lvbnMuZ2V0
KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcn
LAorCisJCQkJJ3VuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDsnLAorCQkJCSd1bmlmb3JtIG1hdDQg
bW9kZWxWaWV3TWF0cml4OycsCisJCQkJJ3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4Oycs
CisJCQkJJ3VuaWZvcm0gbWF0NCB2aWV3TWF0cml4OycsCisJCQkJJ3VuaWZvcm0gbWF0MyBub3Jt
YWxNYXRyaXg7JywKKwkJCQkndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsCisKKwkJCQkn
YXR0cmlidXRlIHZlYzMgcG9zaXRpb247JywKKwkJCQknYXR0cmlidXRlIHZlYzMgbm9ybWFsOycs
CisJCQkJJ2F0dHJpYnV0ZSB2ZWMyIHV2OycsCisKKwkJCQknI2lmZGVmIFVTRV9DT0xPUicsCisK
KwkJCQknCWF0dHJpYnV0ZSB2ZWMzIGNvbG9yOycsCisKKwkJCQknI2VuZGlmJywKKworCQkJCScj
aWZkZWYgVVNFX01PUlBIVEFSR0VUUycsCisKKwkJCQknCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFy
Z2V0MDsnLAorCQkJCScJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQxOycsCisJCQkJJwlhdHRy
aWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7JywKKwkJCQknCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFy
Z2V0MzsnLAorCisJCQkJJwkjaWZkZWYgVVNFX01PUlBITk9STUFMUycsCisKKwkJCQknCQlhdHRy
aWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDA7JywKKwkJCQknCQlhdHRyaWJ1dGUgdmVjMyBtb3JwaE5v
cm1hbDE7JywKKwkJCQknCQlhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDI7JywKKwkJCQknCQlh
dHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7JywKKworCQkJCScJI2Vsc2UnLAorCisJCQkJJwkJ
YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ0OycsCisJCQkJJwkJYXR0cmlidXRlIHZlYzMgbW9y
cGhUYXJnZXQ1OycsCisJCQkJJwkJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OycsCisJCQkJ
JwkJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ3OycsCisKKwkJCQknCSNlbmRpZicsCisKKwkJ
CQknI2VuZGlmJywKKworCQkJCScjaWZkZWYgVVNFX1NLSU5OSU5HJywKKworCQkJCScJYXR0cmli
dXRlIHZlYzQgc2tpbkluZGV4OycsCisJCQkJJwlhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0Oycs
CisKKwkJCQknI2VuZGlmJywKKworCQkJCSdcbicKKworCQkJXS5maWx0ZXIoIGZpbHRlckVtcHR5
TGluZSApLmpvaW4oICdcbicgKTsKKworCQkJcHJlZml4RnJhZ21lbnQgPSBbCisKKwkJCQljdXN0
b21FeHRlbnNpb25zLAorCisJCQkJJ3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24g
KyAnIGZsb2F0OycsCisJCQkJJ3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAn
IGludDsnLAorCisJCQkJJyNkZWZpbmUgU0hBREVSX05BTUUgJyArIHNoYWRlci5uYW1lLAorCisJ
CQkJY3VzdG9tRGVmaW5lcywKKworCQkJCXBhcmFtZXRlcnMuYWxwaGFUZXN0ID8gJyNkZWZpbmUg
QUxQSEFURVNUICcgKyBwYXJhbWV0ZXJzLmFscGhhVGVzdCA6ICcnLAorCisJCQkJJyNkZWZpbmUg
R0FNTUFfRkFDVE9SICcgKyBnYW1tYUZhY3RvckRlZmluZSwKKworCQkJCSggcGFyYW1ldGVycy51
c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgKSA/ICcjZGVmaW5lIFVTRV9GT0cnIDogJycsCisJCQkJ
KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cCApID8gJyNkZWZpbmUgRk9H
X0VYUDInIDogJycsCisKKwkJCQlwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDog
JycsCisJCQkJcGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLAor
CQkJCXBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcFR5cGVEZWZpbmUgOiAn
JywKKwkJCQlwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5l
IDogJycsCisJCQkJcGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwQmxlbmRp
bmdEZWZpbmUgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLmxpZ2h0TWFwID8gJyNkZWZpbmUgVVNFX0xJ
R0hUTUFQJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAn
IDogJycsCisJCQkJcGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lW
RU1BUCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLmJ1bXBNYXAgPyAnI2RlZmluZSBVU0VfQlVNUE1B
UCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxN
QVAnIDogJycsCisJCQkJcGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVD
VUxBUk1BUCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVT
RV9ST1VHSE5FU1NNQVAnIDogJycsCisJCQkJcGFyYW1ldGVycy5tZXRhbG5lc3NNYXAgPyAnI2Rl
ZmluZSBVU0VfTUVUQUxORVNTTUFQJyA6ICcnLAorCQkJCXBhcmFtZXRlcnMuYWxwaGFNYXAgPyAn
I2RlZmluZSBVU0VfQUxQSEFNQVAnIDogJycsCisJCQkJcGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMg
PyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsCisKKwkJCQlwYXJhbWV0ZXJzLmdyYWRpZW50TWFw
ID8gJyNkZWZpbmUgVVNFX0dSQURJRU5UTUFQJyA6ICcnLAorCisJCQkJcGFyYW1ldGVycy5mbGF0
U2hhZGluZyA/ICcjZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLAorCisJCQkJcGFyYW1ldGVycy5k
b3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJywKKwkJCQlwYXJhbWV0ZXJz
LmZsaXBTaWRlZCA/ICcjZGVmaW5lIEZMSVBfU0lERUQnIDogJycsCisKKwkJCQknI2RlZmluZSBO
VU1fQ0xJUFBJTkdfUExBTkVTICcgKyBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzLAorCQkJ
CScjZGVmaW5lIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyAnICsgKHBhcmFtZXRlcnMubnVtQ2xpcHBp
bmdQbGFuZXMgLSBwYXJhbWV0ZXJzLm51bUNsaXBJbnRlcnNlY3Rpb24pLAorCisJCQkJcGFyYW1l
dGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJywKKwkJ
CQlwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSAnICsgc2hhZG93TWFwVHlw
ZURlZmluZSA6ICcnLAorCisJCQkJcGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgPyAiI2Rl
ZmluZSBQUkVNVUxUSVBMSUVEX0FMUEhBIiA6ICcnLAorCisJCQkJcGFyYW1ldGVycy5waHlzaWNh
bGx5Q29ycmVjdExpZ2h0cyA/ICIjZGVmaW5lIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMiIDog
JycsCisKKwkJCQlwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPyAnI2RlZmluZSBV
U0VfTE9HREVQVEhCVUYnIDogJycsCisJCQkJcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVm
ZmVyICYmIHJlbmRlcmVyLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2Rl
ZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLAorCisJCQkJcGFyYW1ldGVycy5lbnZNYXAg
JiYgcmVuZGVyZXIuZXh0ZW5zaW9ucy5nZXQoICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJyApID8g
JyNkZWZpbmUgVEVYVFVSRV9MT0RfRVhUJyA6ICcnLAorCisJCQkJJ3VuaWZvcm0gbWF0NCB2aWV3
TWF0cml4OycsCisJCQkJJ3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLAorCisJCQkJKCBw
YXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyAiI2RlZmluZSBUT05F
X01BUFBJTkciIDogJycsCisJCQkJKCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVN
YXBwaW5nICkgPyBTaGFkZXJDaHVua1sgJ3RvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQnIF0gOiAn
JywgIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0
aGUgdG9uZU1hcHBpbmcoKSBmdW5jdGlvbiBkZWZpbmVkIGJlbG93CisJCQkJKCBwYXJhbWV0ZXJz
LnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBnZXRUb25lTWFwcGluZ0Z1bmN0aW9u
KCAidG9uZU1hcHBpbmciLCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICkgOiAnJywKKworCQkJCXBh
cmFtZXRlcnMuZGl0aGVyaW5nID8gJyNkZWZpbmUgRElUSEVSSU5HJyA6ICcnLAorCisJCQkJKCBw
YXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nIHx8IHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgfHwgcGFy
YW1ldGVycy5lbnZNYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2Rpbmcg
KSA/IFNoYWRlckNodW5rWyAnZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhp
cyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB2YXJpb3Vz
IGVuY29kaW5nL2RlY29kaW5nIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3cKKwkJCQlwYXJhbWV0ZXJz
Lm1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnbWFwVGV4ZWxUb0xpbmVh
cicsIHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgKSA6ICcnLAorCQkJCXBhcmFtZXRlcnMuZW52TWFw
RW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbnZNYXBUZXhlbFRvTGluZWFy
JywgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyApIDogJycsCisJCQkJcGFyYW1ldGVycy5lbWlz
c2l2ZU1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW1pc3NpdmVNYXBU
ZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgOiAnJywKKwkJ
CQlwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nID8gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCAi
bGluZWFyVG9PdXRwdXRUZXhlbCIsIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgKSA6ICcnLAor
CisJCQkJcGFyYW1ldGVycy5kZXB0aFBhY2tpbmcgPyAiI2RlZmluZSBERVBUSF9QQUNLSU5HICIg
KyBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgOiAnJywKKworCQkJCSdcbicKKworCQkJXS5maWx0ZXIo
IGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcbicgKTsKKworCQl9CisKKwkJdmVydGV4U2hhZGVy
ID0gcGFyc2VJbmNsdWRlcyggdmVydGV4U2hhZGVyICk7CisJCXZlcnRleFNoYWRlciA9IHJlcGxh
Y2VMaWdodE51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApOworCisJCWZyYWdtZW50U2hh
ZGVyID0gcGFyc2VJbmNsdWRlcyggZnJhZ21lbnRTaGFkZXIgKTsKKwkJZnJhZ21lbnRTaGFkZXIg
PSByZXBsYWNlTGlnaHROdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApOworCisJCWlm
ICggISBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICkgeworCisJCQl2ZXJ0ZXhTaGFkZXIgPSB1
bnJvbGxMb29wcyggdmVydGV4U2hhZGVyICk7CisJCQlmcmFnbWVudFNoYWRlciA9IHVucm9sbExv
b3BzKCBmcmFnbWVudFNoYWRlciApOworCisJCX0KKworCQl2YXIgdmVydGV4R2xzbCA9IHByZWZp
eFZlcnRleCArIHZlcnRleFNoYWRlcjsKKwkJdmFyIGZyYWdtZW50R2xzbCA9IHByZWZpeEZyYWdt
ZW50ICsgZnJhZ21lbnRTaGFkZXI7CisKKwkJLy8gY29uc29sZS5sb2coICcqVkVSVEVYKicsIHZl
cnRleEdsc2wgKTsKKwkJLy8gY29uc29sZS5sb2coICcqRlJBR01FTlQqJywgZnJhZ21lbnRHbHNs
ICk7CisKKwkJdmFyIGdsVmVydGV4U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCBnbC5WRVJURVhf
U0hBREVSLCB2ZXJ0ZXhHbHNsICk7CisJCXZhciBnbEZyYWdtZW50U2hhZGVyID0gV2ViR0xTaGFk
ZXIoIGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50R2xzbCApOworCisJCWdsLmF0dGFj
aFNoYWRlciggcHJvZ3JhbSwgZ2xWZXJ0ZXhTaGFkZXIgKTsKKwkJZ2wuYXR0YWNoU2hhZGVyKCBw
cm9ncmFtLCBnbEZyYWdtZW50U2hhZGVyICk7CisKKwkJLy8gRm9yY2UgYSBwYXJ0aWN1bGFyIGF0
dHJpYnV0ZSB0byBpbmRleCAwLgorCisJCWlmICggbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFt
ZSAhPT0gdW5kZWZpbmVkICkgeworCisJCQlnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0s
IDAsIG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUgKTsKKworCQl9IGVsc2UgaWYgKCBwYXJh
bWV0ZXJzLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHsKKworCQkJLy8gcHJvZ3JhbXMgd2l0aCBt
b3JwaFRhcmdldHMgZGlzcGxhY2UgcG9zaXRpb24gb3V0IG9mIGF0dHJpYnV0ZSAwCisJCQlnbC5i
aW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsICdwb3NpdGlvbicgKTsKKworCQl9CisKKwkJ
Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTsKKworCQl2YXIgcHJvZ3JhbUxvZyA9IGdsLmdldFBy
b2dyYW1JbmZvTG9nKCBwcm9ncmFtICk7CisJCXZhciB2ZXJ0ZXhMb2cgPSBnbC5nZXRTaGFkZXJJ
bmZvTG9nKCBnbFZlcnRleFNoYWRlciApOworCQl2YXIgZnJhZ21lbnRMb2cgPSBnbC5nZXRTaGFk
ZXJJbmZvTG9nKCBnbEZyYWdtZW50U2hhZGVyICk7CisKKwkJdmFyIHJ1bm5hYmxlID0gdHJ1ZTsK
KwkJdmFyIGhhdmVEaWFnbm9zdGljcyA9IHRydWU7CisKKwkJLy8gY29uc29sZS5sb2coICcqKlZF
UlRFWCoqJywgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFu
c2xhdGVkU2hhZGVyU291cmNlKCBnbFZlcnRleFNoYWRlciApICk7CisJCS8vIGNvbnNvbGUubG9n
KCAnKipGUkFHTUVOVCoqJywgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycg
KS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBnbEZyYWdtZW50U2hhZGVyICkgKTsKKworCQlp
ZiAoIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkxJTktfU1RBVFVTICkgPT09
IGZhbHNlICkgeworCisJCQlydW5uYWJsZSA9IGZhbHNlOworCisJCQljb25zb2xlLmVycm9yKCAn
VEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICcsIGdsLmdldEVycm9yKCksICdnbC5W
QUxJREFURV9TVEFUVVMnLCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5WQUxJ
REFURV9TVEFUVVMgKSwgJ2dsLmdldFByb2dyYW1JbmZvTG9nJywgcHJvZ3JhbUxvZywgdmVydGV4
TG9nLCBmcmFnbWVudExvZyApOworCisJCX0gZWxzZSBpZiAoIHByb2dyYW1Mb2cgIT09ICcnICkg
eworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1J
bmZvTG9nKCknLCBwcm9ncmFtTG9nICk7CisKKwkJfSBlbHNlIGlmICggdmVydGV4TG9nID09PSAn
JyB8fCBmcmFnbWVudExvZyA9PT0gJycgKSB7CisKKwkJCWhhdmVEaWFnbm9zdGljcyA9IGZhbHNl
OworCisJCX0KKworCQlpZiAoIGhhdmVEaWFnbm9zdGljcyApIHsKKworCQkJdGhpcy5kaWFnbm9z
dGljcyA9IHsKKworCQkJCXJ1bm5hYmxlOiBydW5uYWJsZSwKKwkJCQltYXRlcmlhbDogbWF0ZXJp
YWwsCisKKwkJCQlwcm9ncmFtTG9nOiBwcm9ncmFtTG9nLAorCisJCQkJdmVydGV4U2hhZGVyOiB7
CisKKwkJCQkJbG9nOiB2ZXJ0ZXhMb2csCisJCQkJCXByZWZpeDogcHJlZml4VmVydGV4CisKKwkJ
CQl9LAorCisJCQkJZnJhZ21lbnRTaGFkZXI6IHsKKworCQkJCQlsb2c6IGZyYWdtZW50TG9nLAor
CQkJCQlwcmVmaXg6IHByZWZpeEZyYWdtZW50CisKKwkJCQl9CisKKwkJCX07CisKKwkJfQorCisJ
CS8vIGNsZWFuIHVwCisKKwkJZ2wuZGVsZXRlU2hhZGVyKCBnbFZlcnRleFNoYWRlciApOworCQln
bC5kZWxldGVTaGFkZXIoIGdsRnJhZ21lbnRTaGFkZXIgKTsKKworCQkvLyBzZXQgdXAgY2FjaGlu
ZyBmb3IgdW5pZm9ybSBsb2NhdGlvbnMKKworCQl2YXIgY2FjaGVkVW5pZm9ybXM7CisKKwkJdGhp
cy5nZXRVbmlmb3JtcyA9IGZ1bmN0aW9uKCkgeworCisJCQlpZiAoIGNhY2hlZFVuaWZvcm1zID09
PSB1bmRlZmluZWQgKSB7CisKKwkJCQljYWNoZWRVbmlmb3JtcyA9CisJCQkJCW5ldyBXZWJHTFVu
aWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKTsKKworCQkJfQorCisJCQlyZXR1cm4gY2Fj
aGVkVW5pZm9ybXM7CisKKwkJfTsKKworCQkvLyBzZXQgdXAgY2FjaGluZyBmb3IgYXR0cmlidXRl
IGxvY2F0aW9ucworCisJCXZhciBjYWNoZWRBdHRyaWJ1dGVzOworCisJCXRoaXMuZ2V0QXR0cmli
dXRlcyA9IGZ1bmN0aW9uKCkgeworCisJCQlpZiAoIGNhY2hlZEF0dHJpYnV0ZXMgPT09IHVuZGVm
aW5lZCApIHsKKworCQkJCWNhY2hlZEF0dHJpYnV0ZXMgPSBmZXRjaEF0dHJpYnV0ZUxvY2F0aW9u
cyggZ2wsIHByb2dyYW0gKTsKKworCQkJfQorCisJCQlyZXR1cm4gY2FjaGVkQXR0cmlidXRlczsK
KworCQl9OworCisJCS8vIGZyZWUgcmVzb3VyY2UKKworCQl0aGlzLmRlc3Ryb3kgPSBmdW5jdGlv
bigpIHsKKworCQkJZ2wuZGVsZXRlUHJvZ3JhbSggcHJvZ3JhbSApOworCQkJdGhpcy5wcm9ncmFt
ID0gdW5kZWZpbmVkOworCisJCX07CisKKwkJLy8gREVQUkVDQVRFRAorCisJCU9iamVjdC5kZWZp
bmVQcm9wZXJ0aWVzKCB0aGlzLCB7CisKKwkJCXVuaWZvcm1zOiB7CisJCQkJZ2V0OiBmdW5jdGlv
bigpIHsKKworCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IC51bmlmb3Jt
cyBpcyBub3cgLmdldFVuaWZvcm1zKCkuJyApOworCQkJCQlyZXR1cm4gdGhpcy5nZXRVbmlmb3Jt
cygpOworCisJCQkJfQorCQkJfSwKKworCQkJYXR0cmlidXRlczogeworCQkJCWdldDogZnVuY3Rp
b24oKSB7CisKKwkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiAuYXR0cmli
dXRlcyBpcyBub3cgLmdldEF0dHJpYnV0ZXMoKS4nICk7CisJCQkJCXJldHVybiB0aGlzLmdldEF0
dHJpYnV0ZXMoKTsKKworCQkJCX0KKwkJCX0KKworCQl9ICk7CisKKworCQkvLworCisJCXRoaXMu
aWQgPSBwcm9ncmFtSWRDb3VudCArKzsKKwkJdGhpcy5jb2RlID0gY29kZTsKKwkJdGhpcy51c2Vk
VGltZXMgPSAxOworCQl0aGlzLnByb2dyYW0gPSBwcm9ncmFtOworCQl0aGlzLnZlcnRleFNoYWRl
ciA9IGdsVmVydGV4U2hhZGVyOworCQl0aGlzLmZyYWdtZW50U2hhZGVyID0gZ2xGcmFnbWVudFNo
YWRlcjsKKworCQlyZXR1cm4gdGhpczsKKworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29i
IC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBXZWJHTFByb2dyYW1zKCBy
ZW5kZXJlciwgY2FwYWJpbGl0aWVzICkgeworCisJCXZhciBwcm9ncmFtcyA9IFtdOworCisJCXZh
ciBzaGFkZXJJRHMgPSB7CisJCQlNZXNoRGVwdGhNYXRlcmlhbDogJ2RlcHRoJywKKwkJCU1lc2hO
b3JtYWxNYXRlcmlhbDogJ25vcm1hbCcsCisJCQlNZXNoQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJywK
KwkJCU1lc2hMYW1iZXJ0TWF0ZXJpYWw6ICdsYW1iZXJ0JywKKwkJCU1lc2hQaG9uZ01hdGVyaWFs
OiAncGhvbmcnLAorCQkJTWVzaFRvb25NYXRlcmlhbDogJ3Bob25nJywKKwkJCU1lc2hTdGFuZGFy
ZE1hdGVyaWFsOiAncGh5c2ljYWwnLAorCQkJTWVzaFBoeXNpY2FsTWF0ZXJpYWw6ICdwaHlzaWNh
bCcsCisJCQlMaW5lQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJywKKwkJCUxpbmVEYXNoZWRNYXRlcmlh
bDogJ2Rhc2hlZCcsCisJCQlQb2ludHNNYXRlcmlhbDogJ3BvaW50cycKKwkJfTsKKworCQl2YXIg
cGFyYW1ldGVyTmFtZXMgPSBbCisJCQkicHJlY2lzaW9uIiwgInN1cHBvcnRzVmVydGV4VGV4dHVy
ZXMiLCAibWFwIiwgIm1hcEVuY29kaW5nIiwgImVudk1hcCIsICJlbnZNYXBNb2RlIiwgImVudk1h
cEVuY29kaW5nIiwKKwkJCSJsaWdodE1hcCIsICJhb01hcCIsICJlbWlzc2l2ZU1hcCIsICJlbWlz
c2l2ZU1hcEVuY29kaW5nIiwgImJ1bXBNYXAiLCAibm9ybWFsTWFwIiwgImRpc3BsYWNlbWVudE1h
cCIsICJzcGVjdWxhck1hcCIsCisJCQkicm91Z2huZXNzTWFwIiwgIm1ldGFsbmVzc01hcCIsICJn
cmFkaWVudE1hcCIsCisJCQkiYWxwaGFNYXAiLCAiY29tYmluZSIsICJ2ZXJ0ZXhDb2xvcnMiLCAi
Zm9nIiwgInVzZUZvZyIsICJmb2dFeHAiLAorCQkJImZsYXRTaGFkaW5nIiwgInNpemVBdHRlbnVh
dGlvbiIsICJsb2dhcml0aG1pY0RlcHRoQnVmZmVyIiwgInNraW5uaW5nIiwKKwkJCSJtYXhCb25l
cyIsICJ1c2VWZXJ0ZXhUZXh0dXJlIiwgIm1vcnBoVGFyZ2V0cyIsICJtb3JwaE5vcm1hbHMiLAor
CQkJIm1heE1vcnBoVGFyZ2V0cyIsICJtYXhNb3JwaE5vcm1hbHMiLCAicHJlbXVsdGlwbGllZEFs
cGhhIiwKKwkJCSJudW1EaXJMaWdodHMiLCAibnVtUG9pbnRMaWdodHMiLCAibnVtU3BvdExpZ2h0
cyIsICJudW1IZW1pTGlnaHRzIiwgIm51bVJlY3RBcmVhTGlnaHRzIiwKKwkJCSJzaGFkb3dNYXBF
bmFibGVkIiwgInNoYWRvd01hcFR5cGUiLCAidG9uZU1hcHBpbmciLCAncGh5c2ljYWxseUNvcnJl
Y3RMaWdodHMnLAorCQkJImFscGhhVGVzdCIsICJkb3VibGVTaWRlZCIsICJmbGlwU2lkZWQiLCAi
bnVtQ2xpcHBpbmdQbGFuZXMiLCAibnVtQ2xpcEludGVyc2VjdGlvbiIsICJkZXB0aFBhY2tpbmci
LCAiZGl0aGVyaW5nIgorCQldOworCisKKwkJZnVuY3Rpb24gYWxsb2NhdGVCb25lcyggb2JqZWN0
ICkgeworCisJCQl2YXIgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247CisJCQl2YXIgYm9uZXMg
PSBza2VsZXRvbi5ib25lczsKKworCQkJaWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0
dXJlcyApIHsKKworCQkJCXJldHVybiAxMDI0OworCisJCQl9IGVsc2UgeworCisJCQkJLy8gZGVm
YXVsdCBmb3Igd2hlbiBvYmplY3QgaXMgbm90IHNwZWNpZmllZAorCQkJCS8vICggZm9yIGV4YW1w
bGUgd2hlbiBwcmVidWlsZGluZyBzaGFkZXIgdG8gYmUgdXNlZCB3aXRoIG11bHRpcGxlIG9iamVj
dHMgKQorCQkJCS8vCisJCQkJLy8gIC0gbGVhdmUgc29tZSBleHRyYSBzcGFjZSBmb3Igb3RoZXIg
dW5pZm9ybXMKKwkJCQkvLyAgLSBsaW1pdCBoZXJlIGlzIEFOR0xFJ3MgMjU0IG1heCB1bmlmb3Jt
IHZlY3RvcnMKKwkJCQkvLyAgICAodXAgdG8gNTQgc2hvdWxkIGJlIHNhZmUpCisKKwkJCQl2YXIg
blZlcnRleFVuaWZvcm1zID0gY2FwYWJpbGl0aWVzLm1heFZlcnRleFVuaWZvcm1zOworCQkJCXZh
ciBuVmVydGV4TWF0cmljZXMgPSBNYXRoLmZsb29yKCAoIG5WZXJ0ZXhVbmlmb3JtcyAtIDIwICkg
LyA0ICk7CisKKwkJCQl2YXIgbWF4Qm9uZXMgPSBNYXRoLm1pbiggblZlcnRleE1hdHJpY2VzLCBi
b25lcy5sZW5ndGggKTsKKworCQkJCWlmICggbWF4Qm9uZXMgPCBib25lcy5sZW5ndGggKSB7CisK
KwkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICcg
KyBib25lcy5sZW5ndGggKyAnIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAnICsgbWF4Qm9uZXMg
KyAnLicgKTsKKwkJCQkJcmV0dXJuIDA7CisKKwkJCQl9CisKKwkJCQlyZXR1cm4gbWF4Qm9uZXM7
CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCgg
bWFwLCBnYW1tYU92ZXJyaWRlTGluZWFyICkgeworCisJCQl2YXIgZW5jb2Rpbmc7CisKKwkJCWlm
ICggISBtYXAgKSB7CisKKwkJCQllbmNvZGluZyA9IExpbmVhckVuY29kaW5nOworCisJCQl9IGVs
c2UgaWYgKCBtYXAuaXNUZXh0dXJlICkgeworCisJCQkJZW5jb2RpbmcgPSBtYXAuZW5jb2Rpbmc7
CisKKwkJCX0gZWxzZSBpZiAoIG1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkgeworCisJCQkJY29u
c29sZS53YXJuKCAiVEhSRUUuV2ViR0xQcm9ncmFtcy5nZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFw
OiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVy
ZSBwcm9wZXJ0eSBpbnN0ZWFkLiIgKTsKKwkJCQllbmNvZGluZyA9IG1hcC50ZXh0dXJlLmVuY29k
aW5nOworCisJCQl9CisKKwkJCS8vIGFkZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgV2Vi
R0xSZW5kZXJlci5nYW1tYUlucHV0L2dhbW1hT3V0cHV0IHBhcmFtZXRlciwgc2hvdWxkIHByb2Jh
Ymx5IGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludC4KKwkJCWlmICggZW5jb2RpbmcgPT09IExpbmVh
ckVuY29kaW5nICYmIGdhbW1hT3ZlcnJpZGVMaW5lYXIgKSB7CisKKwkJCQllbmNvZGluZyA9IEdh
bW1hRW5jb2Rpbmc7CisKKwkJCX0KKworCQkJcmV0dXJuIGVuY29kaW5nOworCisJCX0KKworCQl0
aGlzLmdldFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBsaWdodHMsIGZvZywgbkNs
aXBQbGFuZXMsIG5DbGlwSW50ZXJzZWN0aW9uLCBvYmplY3QgKSB7CisKKwkJCXZhciBzaGFkZXJJ
RCA9IHNoYWRlcklEc1sgbWF0ZXJpYWwudHlwZSBdOworCisJCQkvLyBoZXVyaXN0aWNzIHRvIGNy
ZWF0ZSBzaGFkZXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gbGlnaHRzIGluIHRoZSBzY2VuZQor
CQkJLy8gKG5vdCB0byBibG93IG92ZXIgbWF4TGlnaHRzIGJ1ZGdldCkKKworCQkJdmFyIG1heEJv
bmVzID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggPyBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSA6IDA7
CisJCQl2YXIgcHJlY2lzaW9uID0gcmVuZGVyZXIuZ2V0UHJlY2lzaW9uKCk7CisKKwkJCWlmICgg
bWF0ZXJpYWwucHJlY2lzaW9uICE9PSBudWxsICkgeworCisJCQkJcHJlY2lzaW9uID0gY2FwYWJp
bGl0aWVzLmdldE1heFByZWNpc2lvbiggbWF0ZXJpYWwucHJlY2lzaW9uICk7CisKKwkJCQlpZiAo
IHByZWNpc2lvbiAhPT0gbWF0ZXJpYWwucHJlY2lzaW9uICkgeworCisJCQkJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLldlYkdMUHJvZ3JhbS5nZXRQYXJhbWV0ZXJzOicsIG1hdGVyaWFsLnByZWNpc2lv
biwgJ25vdCBzdXBwb3J0ZWQsIHVzaW5nJywgcHJlY2lzaW9uLCAnaW5zdGVhZC4nICk7CisKKwkJ
CQl9CisKKwkJCX0KKworCQkJdmFyIGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRS
ZW5kZXJUYXJnZXQoKTsKKworCQkJdmFyIHBhcmFtZXRlcnMgPSB7CisKKwkJCQlzaGFkZXJJRDog
c2hhZGVySUQsCisKKwkJCQlwcmVjaXNpb246IHByZWNpc2lvbiwKKwkJCQlzdXBwb3J0c1ZlcnRl
eFRleHR1cmVzOiBjYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMsCisJCQkJb3V0cHV0RW5jb2Rp
bmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoICggISBjdXJyZW50UmVuZGVyVGFyZ2V0ICkg
PyBudWxsIDogY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLCByZW5kZXJlci5nYW1tYU91dHB1
dCApLAorCQkJCW1hcDogISEgbWF0ZXJpYWwubWFwLAorCQkJCW1hcEVuY29kaW5nOiBnZXRUZXh0
dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5tYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSwK
KwkJCQllbnZNYXA6ICEhIG1hdGVyaWFsLmVudk1hcCwKKwkJCQllbnZNYXBNb2RlOiBtYXRlcmlh
bC5lbnZNYXAgJiYgbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcsCisJCQkJZW52TWFwRW5jb2Rpbmc6
IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLmVudk1hcCwgcmVuZGVyZXIuZ2Ft
bWFJbnB1dCApLAorCQkJCWVudk1hcEN1YmVVVjogKCAhISBtYXRlcmlhbC5lbnZNYXAgKSAmJiAo
ICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nICkg
fHwgKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcg
KSApLAorCQkJCWxpZ2h0TWFwOiAhISBtYXRlcmlhbC5saWdodE1hcCwKKwkJCQlhb01hcDogISEg
bWF0ZXJpYWwuYW9NYXAsCisJCQkJZW1pc3NpdmVNYXA6ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFw
LAorCQkJCWVtaXNzaXZlTWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1h
dGVyaWFsLmVtaXNzaXZlTWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksCisJCQkJYnVtcE1hcDog
ISEgbWF0ZXJpYWwuYnVtcE1hcCwKKwkJCQlub3JtYWxNYXA6ICEhIG1hdGVyaWFsLm5vcm1hbE1h
cCwKKwkJCQlkaXNwbGFjZW1lbnRNYXA6ICEhIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCwKKwkJ
CQlyb3VnaG5lc3NNYXA6ICEhIG1hdGVyaWFsLnJvdWdobmVzc01hcCwKKwkJCQltZXRhbG5lc3NN
YXA6ICEhIG1hdGVyaWFsLm1ldGFsbmVzc01hcCwKKwkJCQlzcGVjdWxhck1hcDogISEgbWF0ZXJp
YWwuc3BlY3VsYXJNYXAsCisJCQkJYWxwaGFNYXA6ICEhIG1hdGVyaWFsLmFscGhhTWFwLAorCisJ
CQkJZ3JhZGllbnRNYXA6ICEhIG1hdGVyaWFsLmdyYWRpZW50TWFwLAorCisJCQkJY29tYmluZTog
bWF0ZXJpYWwuY29tYmluZSwKKworCQkJCXZlcnRleENvbG9yczogbWF0ZXJpYWwudmVydGV4Q29s
b3JzLAorCisJCQkJZm9nOiAhISBmb2csCisJCQkJdXNlRm9nOiBtYXRlcmlhbC5mb2csCisJCQkJ
Zm9nRXhwOiAoIGZvZyAmJiBmb2cuaXNGb2dFeHAyICksCisKKwkJCQlmbGF0U2hhZGluZzogbWF0
ZXJpYWwuc2hhZGluZyA9PT0gRmxhdFNoYWRpbmcsCisKKwkJCQlzaXplQXR0ZW51YXRpb246IG1h
dGVyaWFsLnNpemVBdHRlbnVhdGlvbiwKKwkJCQlsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiBjYXBh
YmlsaXRpZXMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciwKKworCQkJCXNraW5uaW5nOiBtYXRlcmlh
bC5za2lubmluZyAmJiBtYXhCb25lcyA+IDAsCisJCQkJbWF4Qm9uZXM6IG1heEJvbmVzLAorCQkJ
CXVzZVZlcnRleFRleHR1cmU6IGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzLAorCisJ
CQkJbW9ycGhUYXJnZXRzOiBtYXRlcmlhbC5tb3JwaFRhcmdldHMsCisJCQkJbW9ycGhOb3JtYWxz
OiBtYXRlcmlhbC5tb3JwaE5vcm1hbHMsCisJCQkJbWF4TW9ycGhUYXJnZXRzOiByZW5kZXJlci5t
YXhNb3JwaFRhcmdldHMsCisJCQkJbWF4TW9ycGhOb3JtYWxzOiByZW5kZXJlci5tYXhNb3JwaE5v
cm1hbHMsCisKKwkJCQludW1EaXJMaWdodHM6IGxpZ2h0cy5kaXJlY3Rpb25hbC5sZW5ndGgsCisJ
CQkJbnVtUG9pbnRMaWdodHM6IGxpZ2h0cy5wb2ludC5sZW5ndGgsCisJCQkJbnVtU3BvdExpZ2h0
czogbGlnaHRzLnNwb3QubGVuZ3RoLAorCQkJCW51bVJlY3RBcmVhTGlnaHRzOiBsaWdodHMucmVj
dEFyZWEubGVuZ3RoLAorCQkJCW51bUhlbWlMaWdodHM6IGxpZ2h0cy5oZW1pLmxlbmd0aCwKKwor
CQkJCW51bUNsaXBwaW5nUGxhbmVzOiBuQ2xpcFBsYW5lcywKKwkJCQludW1DbGlwSW50ZXJzZWN0
aW9uOiBuQ2xpcEludGVyc2VjdGlvbiwKKworCQkJCWRpdGhlcmluZzogbWF0ZXJpYWwuZGl0aGVy
aW5nLAorCisJCQkJc2hhZG93TWFwRW5hYmxlZDogcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQg
JiYgb2JqZWN0LnJlY2VpdmVTaGFkb3cgJiYgbGlnaHRzLnNoYWRvd3MubGVuZ3RoID4gMCwKKwkJ
CQlzaGFkb3dNYXBUeXBlOiByZW5kZXJlci5zaGFkb3dNYXAudHlwZSwKKworCQkJCXRvbmVNYXBw
aW5nOiByZW5kZXJlci50b25lTWFwcGluZywKKwkJCQlwaHlzaWNhbGx5Q29ycmVjdExpZ2h0czog
cmVuZGVyZXIucGh5c2ljYWxseUNvcnJlY3RMaWdodHMsCisKKwkJCQlwcmVtdWx0aXBsaWVkQWxw
aGE6IG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSwKKworCQkJCWFscGhhVGVzdDogbWF0ZXJp
YWwuYWxwaGFUZXN0LAorCQkJCWRvdWJsZVNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBEb3VibGVT
aWRlLAorCQkJCWZsaXBTaWRlZDogbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUsCisKKwkJCQlk
ZXB0aFBhY2tpbmc6ICggbWF0ZXJpYWwuZGVwdGhQYWNraW5nICE9PSB1bmRlZmluZWQgKSA/IG1h
dGVyaWFsLmRlcHRoUGFja2luZyA6IGZhbHNlCisKKwkJCX07CisKKwkJCXJldHVybiBwYXJhbWV0
ZXJzOworCisJCX07CisKKwkJdGhpcy5nZXRQcm9ncmFtQ29kZSA9IGZ1bmN0aW9uICggbWF0ZXJp
YWwsIHBhcmFtZXRlcnMgKSB7CisKKwkJCXZhciBhcnJheSA9IFtdOworCisJCQlpZiAoIHBhcmFt
ZXRlcnMuc2hhZGVySUQgKSB7CisKKwkJCQlhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoYWRlcklE
ICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlhcnJheS5wdXNoKCBtYXRlcmlhbC5mcmFnbWVudFNo
YWRlciApOworCQkJCWFycmF5LnB1c2goIG1hdGVyaWFsLnZlcnRleFNoYWRlciApOworCisJCQl9
CisKKwkJCWlmICggbWF0ZXJpYWwuZGVmaW5lcyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJZm9y
ICggdmFyIG5hbWUgaW4gbWF0ZXJpYWwuZGVmaW5lcyApIHsKKworCQkJCQlhcnJheS5wdXNoKCBu
YW1lICk7CisJCQkJCWFycmF5LnB1c2goIG1hdGVyaWFsLmRlZmluZXNbIG5hbWUgXSApOworCisJ
CQkJfQorCisJCQl9CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8IHBhcmFtZXRlck5hbWVzLmxl
bmd0aDsgaSArKyApIHsKKworCQkJCWFycmF5LnB1c2goIHBhcmFtZXRlcnNbIHBhcmFtZXRlck5h
bWVzWyBpIF0gXSApOworCisJCQl9CisKKwkJCWFycmF5LnB1c2goIG1hdGVyaWFsLm9uQmVmb3Jl
Q29tcGlsZS50b1N0cmluZygpICk7CisKKwkJCWFycmF5LnB1c2goIHJlbmRlcmVyLmdhbW1hT3V0
cHV0ICk7CisKKwkJCXJldHVybiBhcnJheS5qb2luKCk7CisKKwkJfTsKKworCQl0aGlzLmFjcXVp
cmVQcm9ncmFtID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgc2hhZGVyLCBwYXJhbWV0ZXJzLCBjb2Rl
ICkgeworCisJCQl2YXIgcHJvZ3JhbTsKKworCQkJLy8gQ2hlY2sgaWYgY29kZSBoYXMgYmVlbiBh
bHJlYWR5IGNvbXBpbGVkCisJCQlmb3IgKCB2YXIgcCA9IDAsIHBsID0gcHJvZ3JhbXMubGVuZ3Ro
OyBwIDwgcGw7IHAgKysgKSB7CisKKwkJCQl2YXIgcHJvZ3JhbUluZm8gPSBwcm9ncmFtc1sgcCBd
OworCisJCQkJaWYgKCBwcm9ncmFtSW5mby5jb2RlID09PSBjb2RlICkgeworCisJCQkJCXByb2dy
YW0gPSBwcm9ncmFtSW5mbzsKKwkJCQkJKysgcHJvZ3JhbS51c2VkVGltZXM7CisKKwkJCQkJYnJl
YWs7CisKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7
CisKKwkJCQlwcm9ncmFtID0gbmV3IFdlYkdMUHJvZ3JhbSggcmVuZGVyZXIsIGNvZGUsIG1hdGVy
aWFsLCBzaGFkZXIsIHBhcmFtZXRlcnMgKTsKKwkJCQlwcm9ncmFtcy5wdXNoKCBwcm9ncmFtICk7
CisKKwkJCX0KKworCQkJcmV0dXJuIHByb2dyYW07CisKKwkJfTsKKworCQl0aGlzLnJlbGVhc2VQ
cm9ncmFtID0gZnVuY3Rpb24gKCBwcm9ncmFtICkgeworCisJCQlpZiAoIC0tIHByb2dyYW0udXNl
ZFRpbWVzID09PSAwICkgeworCisJCQkJLy8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldAorCQkJ
CXZhciBpID0gcHJvZ3JhbXMuaW5kZXhPZiggcHJvZ3JhbSApOworCQkJCXByb2dyYW1zWyBpIF0g
PSBwcm9ncmFtc1sgcHJvZ3JhbXMubGVuZ3RoIC0gMSBdOworCQkJCXByb2dyYW1zLnBvcCgpOwor
CisJCQkJLy8gRnJlZSBXZWJHTCByZXNvdXJjZXMKKwkJCQlwcm9ncmFtLmRlc3Ryb3koKTsKKwor
CQkJfQorCisJCX07CisKKwkJLy8gRXhwb3NlZCBmb3IgcmVzb3VyY2UgbW9uaXRvcmluZyAmIGVy
cm9yIGZlZWRiYWNrIHZpYSByZW5kZXJlci5pbmZvOgorCQl0aGlzLnByb2dyYW1zID0gcHJvZ3Jh
bXM7CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29t
LworCSAqLworCisJZnVuY3Rpb24gV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0
ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCBwYXJhbVRocmVlVG9HTCwgaW5mb01lbW9yeSAp
IHsKKworCQl2YXIgX2lzV2ViR0wyID0gKCB0eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCAh
PT0gJ3VuZGVmaW5lZCcgJiYgX2dsIGluc3RhbmNlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCAp
OworCisJCS8vCisKKwkJZnVuY3Rpb24gY2xhbXBUb01heFNpemUoIGltYWdlLCBtYXhTaXplICkg
eworCisJCQlpZiAoIGltYWdlLndpZHRoID4gbWF4U2l6ZSB8fCBpbWFnZS5oZWlnaHQgPiBtYXhT
aXplICkgeworCisJCQkJLy8gV2FybmluZzogU2NhbGluZyB0aHJvdWdoIHRoZSBjYW52YXMgd2ls
bCBvbmx5IHdvcmsgd2l0aCBpbWFnZXMgdGhhdCB1c2UKKwkJCQkvLyBwcmVtdWx0aXBsaWVkIGFs
cGhhLgorCisJCQkJdmFyIHNjYWxlID0gbWF4U2l6ZSAvIE1hdGgubWF4KCBpbWFnZS53aWR0aCwg
aW1hZ2UuaGVpZ2h0ICk7CisKKwkJCQl2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7CisJCQkJY2Fu
dmFzLndpZHRoID0gTWF0aC5mbG9vciggaW1hZ2Uud2lkdGggKiBzY2FsZSApOworCQkJCWNhbnZh
cy5oZWlnaHQgPSBNYXRoLmZsb29yKCBpbWFnZS5oZWlnaHQgKiBzY2FsZSApOworCisJCQkJdmFy
IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApOworCQkJCWNvbnRleHQuZHJhd0lt
YWdlKCBpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgMCwgY2FudmFz
LndpZHRoLCBjYW52YXMuaGVpZ2h0ICk7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJH
TFJlbmRlcmVyOiBpbWFnZSBpcyB0b28gYmlnICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFn
ZS5oZWlnaHQgKyAnKS4gUmVzaXplZCB0byAnICsgY2FudmFzLndpZHRoICsgJ3gnICsgY2FudmFz
LmhlaWdodCwgaW1hZ2UgKTsKKworCQkJCXJldHVybiBjYW52YXM7CisKKwkJCX0KKworCQkJcmV0
dXJuIGltYWdlOworCisJCX0KKworCQlmdW5jdGlvbiBpc1Bvd2VyT2ZUd28oIGltYWdlICkgewor
CisJCQlyZXR1cm4gX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS53aWR0aCApICYmIF9NYXRoLmlz
UG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7CisKKwkJfQorCisJCWZ1bmN0aW9uIG1ha2VQb3dl
ck9mVHdvKCBpbWFnZSApIHsKKworCQkJaWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVs
ZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCApIHsKKworCQkJCXZh
ciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8x
OTk5L3hodG1sJywgJ2NhbnZhcycgKTsKKwkJCQljYW52YXMud2lkdGggPSBfTWF0aC5uZWFyZXN0
UG93ZXJPZlR3byggaW1hZ2Uud2lkdGggKTsKKwkJCQljYW52YXMuaGVpZ2h0ID0gX01hdGgubmVh
cmVzdFBvd2VyT2ZUd28oIGltYWdlLmhlaWdodCApOworCisJCQkJdmFyIGNvbnRleHQgPSBjYW52
YXMuZ2V0Q29udGV4dCggJzJkJyApOworCQkJCWNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwg
MCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0ICk7CisKKwkJCQljb25zb2xlLndhcm4oICdU
SFJFRS5XZWJHTFJlbmRlcmVyOiBpbWFnZSBpcyBub3QgcG93ZXIgb2YgdHdvICgnICsgaW1hZ2Uu
d2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKS4gUmVzaXplZCB0byAnICsgY2FudmFzLndp
ZHRoICsgJ3gnICsgY2FudmFzLmhlaWdodCwgaW1hZ2UgKTsKKworCQkJCXJldHVybiBjYW52YXM7
CisKKwkJCX0KKworCQkJcmV0dXJuIGltYWdlOworCisJCX0KKworCQlmdW5jdGlvbiB0ZXh0dXJl
TmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkgeworCisJCQlyZXR1cm4gKCB0ZXh0dXJlLndyYXBT
ICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nIHx8IHRleHR1cmUud3JhcFQgIT09IENsYW1wVG9FZGdl
V3JhcHBpbmcgKSB8fAorCQkJCSggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIg
JiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApOworCisJCX0KKworCQlmdW5j
dGlvbiB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzUG93ZXJPZlR3byAp
IHsKKworCQkJcmV0dXJuIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICYmIGlzUG93ZXJPZlR3byAm
JgorCQkJCXRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWlu
RmlsdGVyICE9PSBMaW5lYXJGaWx0ZXI7CisKKwkJfQorCisJCS8vIEZhbGxiYWNrIGZpbHRlcnMg
Zm9yIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzCisKKwkJZnVuY3Rpb24gZmlsdGVyRmFsbGJhY2so
IGYgKSB7CisKKwkJCWlmICggZiA9PT0gTmVhcmVzdEZpbHRlciB8fCBmID09PSBOZWFyZXN0TWlw
TWFwTmVhcmVzdEZpbHRlciB8fCBmID09PSBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyICkgewor
CisJCQkJcmV0dXJuIF9nbC5ORUFSRVNUOworCisJCQl9CisKKwkJCXJldHVybiBfZ2wuTElORUFS
OworCisJCX0KKworCQkvLworCisJCWZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoIGV2ZW50ICkg
eworCisJCQl2YXIgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDsKKworCQkJdGV4dHVyZS5yZW1vdmVF
dmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTsKKworCQkJZGVhbGxv
Y2F0ZVRleHR1cmUoIHRleHR1cmUgKTsKKworCQkJaW5mb01lbW9yeS50ZXh0dXJlcyAtLTsKKwor
CisJCX0KKworCQlmdW5jdGlvbiBvblJlbmRlclRhcmdldERpc3Bvc2UoIGV2ZW50ICkgeworCisJ
CQl2YXIgcmVuZGVyVGFyZ2V0ID0gZXZlbnQudGFyZ2V0OworCisJCQlyZW5kZXJUYXJnZXQucmVt
b3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTsKKwor
CQkJZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7CisKKwkJCWluZm9NZW1v
cnkudGV4dHVyZXMgLS07CisKKwkJfQorCisJCS8vCisKKwkJZnVuY3Rpb24gZGVhbGxvY2F0ZVRl
eHR1cmUoIHRleHR1cmUgKSB7CisKKwkJCXZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRp
ZXMuZ2V0KCB0ZXh0dXJlICk7CisKKwkJCWlmICggdGV4dHVyZS5pbWFnZSAmJiB0ZXh0dXJlUHJv
cGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICkgeworCisJCQkJLy8gY3ViZSB0ZXh0
dXJlCisKKwkJCQlfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9f
d2ViZ2xUZXh0dXJlQ3ViZSApOworCisJCQl9IGVsc2UgeworCisJCQkJLy8gMkQgdGV4dHVyZQor
CisJCQkJaWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkg
cmV0dXJuOworCisJCQkJX2dsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2Vi
Z2xUZXh0dXJlICk7CisKKwkJCX0KKworCQkJLy8gcmVtb3ZlIGFsbCB3ZWJnbCBwcm9wZXJ0aWVz
CisJCQlwcm9wZXJ0aWVzLnJlbW92ZSggdGV4dHVyZSApOworCisJCX0KKworCQlmdW5jdGlvbiBk
ZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7CisKKwkJCXZhciByZW5kZXJU
YXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApOworCQkJdmFy
IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJl
ICk7CisKKwkJCWlmICggISByZW5kZXJUYXJnZXQgKSByZXR1cm47CisKKwkJCWlmICggdGV4dHVy
ZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCV9nbC5k
ZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApOworCisJCQl9
CisKKwkJCWlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHsKKworCQkJCXJlbmRlclRh
cmdldC5kZXB0aFRleHR1cmUuZGlzcG9zZSgpOworCisJCQl9CisKKwkJCWlmICggcmVuZGVyVGFy
Z2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkgeworCisJCQkJZm9yICggdmFyIGkgPSAwOyBp
IDwgNjsgaSArKyApIHsKKworCQkJCQlfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdl
dFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTsKKwkJCQkJaWYgKCByZW5kZXJU
YXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZm
ZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gKTsKKwor
CQkJCX0KKworCQkJfSBlbHNlIHsKKworCQkJCV9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVy
VGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTsKKwkJCQlpZiAoIHJlbmRlclRh
cmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZl
ciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKTsKKworCQkJfQor
CisJCQlwcm9wZXJ0aWVzLnJlbW92ZSggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTsKKwkJCXByb3Bl
cnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQgKTsKKworCQl9CisKKwkJLy8KKworCisKKwkJZnVu
Y3Rpb24gc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkgeworCisJCQl2YXIgdGV4dHVyZVBy
b3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApOworCisJCQlpZiAoIHRleHR1cmUu
dmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZl
cnNpb24gKSB7CisKKwkJCQl2YXIgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlOworCisJCQkJaWYgKCBp
bWFnZSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdM
UmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5l
ZCcsIHRleHR1cmUgKTsKKworCQkJCX0gZWxzZSBpZiAoIGltYWdlLmNvbXBsZXRlID09PSBmYWxz
ZSApIHsKKworCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJl
IG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlJywgdGV4dHVyZSApOwor
CisJCQkJfSBlbHNlIHsKKworCQkJCQl1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywg
dGV4dHVyZSwgc2xvdCApOworCQkJCQlyZXR1cm47CisKKwkJCQl9CisKKwkJCX0KKworCQkJc3Rh
dGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApOworCQkJc3RhdGUuYmluZFRl
eHR1cmUoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSAp
OworCisJCX0KKworCQlmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHsK
KworCQkJdmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTsK
KworCQkJaWYgKCB0ZXh0dXJlLmltYWdlLmxlbmd0aCA9PT0gNiApIHsKKworCQkJCWlmICggdGV4
dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1
cmUudmVyc2lvbiApIHsKKworCQkJCQlpZiAoICEgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9f
d2ViZ2xUZXh0dXJlQ3ViZSApIHsKKworCQkJCQkJdGV4dHVyZS5hZGRFdmVudExpc3RlbmVyKCAn
ZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTsKKworCQkJCQkJdGV4dHVyZVByb3BlcnRpZXMu
X19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7CisKKwkJCQkJ
CWluZm9NZW1vcnkudGV4dHVyZXMgKys7CisKKwkJCQkJfQorCisJCQkJCXN0YXRlLmFjdGl2ZVRl
eHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTsKKwkJCQkJc3RhdGUuYmluZFRleHR1cmUoIF9n
bC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1
cmVDdWJlICk7CisKKwkJCQkJX2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0ZMSVBfWV9XRUJH
TCwgdGV4dHVyZS5mbGlwWSApOworCisJCQkJCXZhciBpc0NvbXByZXNzZWQgPSAoIHRleHR1cmUg
JiYgdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICk7CisJCQkJCXZhciBpc0RhdGFUZXh0dXJl
ID0gKCB0ZXh0dXJlLmltYWdlWyAwIF0gJiYgdGV4dHVyZS5pbWFnZVsgMCBdLmlzRGF0YVRleHR1
cmUgKTsKKworCQkJCQl2YXIgY3ViZUltYWdlID0gW107CisKKwkJCQkJZm9yICggdmFyIGkgPSAw
OyBpIDwgNjsgaSArKyApIHsKKworCQkJCQkJaWYgKCAhIGlzQ29tcHJlc3NlZCAmJiAhIGlzRGF0
YVRleHR1cmUgKSB7CisKKwkJCQkJCQljdWJlSW1hZ2VbIGkgXSA9IGNsYW1wVG9NYXhTaXplKCB0
ZXh0dXJlLmltYWdlWyBpIF0sIGNhcGFiaWxpdGllcy5tYXhDdWJlbWFwU2l6ZSApOworCisJCQkJ
CQl9IGVsc2UgeworCisJCQkJCQkJY3ViZUltYWdlWyBpIF0gPSBpc0RhdGFUZXh0dXJlID8gdGV4
dHVyZS5pbWFnZVsgaSBdLmltYWdlIDogdGV4dHVyZS5pbWFnZVsgaSBdOworCisJCQkJCQl9CisK
KwkJCQkJfQorCisJCQkJCXZhciBpbWFnZSA9IGN1YmVJbWFnZVsgMCBdLAorCQkJCQlpc1Bvd2Vy
T2ZUd29JbWFnZSA9IGlzUG93ZXJPZlR3byggaW1hZ2UgKSwKKwkJCQkJZ2xGb3JtYXQgPSBwYXJh
bVRocmVlVG9HTCggdGV4dHVyZS5mb3JtYXQgKSwKKwkJCQkJZ2xUeXBlID0gcGFyYW1UaHJlZVRv
R0woIHRleHR1cmUudHlwZSApOworCisJCQkJCXNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVY
VFVSRV9DVUJFX01BUCwgdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKTsKKworCQkJCQlmb3Ig
KCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgeworCisJCQkJCQlpZiAoICEgaXNDb21wcmVzc2Vk
ICkgeworCisJCQkJCQkJaWYgKCBpc0RhdGFUZXh0dXJlICkgeworCisJCQkJCQkJCXN0YXRlLnRl
eEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1h
dCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3Jt
YXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApOworCisJCQkJCQkJfSBlbHNlIHsKKwor
CQkJCQkJCQlzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9Y
ICsgaSwgMCwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGN1YmVJbWFnZVsgaSBdICk7CisK
KwkJCQkJCQl9CisKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQl2YXIgbWlwbWFwLCBtaXBtYXBz
ID0gY3ViZUltYWdlWyBpIF0ubWlwbWFwczsKKworCQkJCQkJCWZvciAoIHZhciBqID0gMCwgamwg
PSBtaXBtYXBzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgeworCisJCQkJCQkJCW1pcG1hcCA9IG1p
cG1hcHNbIGogXTsKKworCQkJCQkJCQlpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0
ICYmIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JGb3JtYXQgKSB7CisKKwkJCQkJCQkJCWlmICggc3Rh
dGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZiggZ2xGb3JtYXQgKSA+IC0g
MSApIHsKKworCQkJCQkJCQkJCXN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCBfZ2wuVEVYVFVS
RV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlw
bWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTsKKworCQkJCQkJCQkJfSBlbHNlIHsKKworCQkJ
CQkJCQkJCWNvbnNvbGUud2FybiggIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9h
ZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3Vi
ZSgpIiApOworCisJCQkJCQkJCQl9CisKKwkJCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCQkJc3Rh
dGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGosIGds
Rm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUs
IG1pcG1hcC5kYXRhICk7CisKKwkJCQkJCQkJfQorCisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJ
CQkJfQorCisJCQkJCWlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBp
c1Bvd2VyT2ZUd29JbWFnZSApICkgeworCisJCQkJCQlfZ2wuZ2VuZXJhdGVNaXBtYXAoIF9nbC5U
RVhUVVJFX0NVQkVfTUFQICk7CisKKwkJCQkJfQorCisJCQkJCXRleHR1cmVQcm9wZXJ0aWVzLl9f
dmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjsKKworCQkJCQlpZiAoIHRleHR1cmUub25VcGRhdGUg
KSB0ZXh0dXJlLm9uVXBkYXRlKCB0ZXh0dXJlICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXN0
YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTsKKwkJCQkJc3RhdGUuYmlu
ZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdl
X193ZWJnbFRleHR1cmVDdWJlICk7CisKKwkJCQl9CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rp
b24gc2V0VGV4dHVyZUN1YmVEeW5hbWljKCB0ZXh0dXJlLCBzbG90ICkgeworCisJCQlzdGF0ZS5h
Y3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7CisJCQlzdGF0ZS5iaW5kVGV4dHVy
ZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJn
bFRleHR1cmUgKTsKKworCQl9CisKKwkJZnVuY3Rpb24gc2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRl
eHR1cmVUeXBlLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApIHsKKworCQkJdmFyIGV4dGVu
c2lvbjsKKworCQkJaWYgKCBpc1Bvd2VyT2ZUd29JbWFnZSApIHsKKworCQkJCV9nbC50ZXhQYXJh
bWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9TLCBwYXJhbVRocmVlVG9HTCgg
dGV4dHVyZS53cmFwUyApICk7CisJCQkJX2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBf
Z2wuVEVYVFVSRV9XUkFQX1QsIHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLndyYXBUICkgKTsKKwor
CQkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRF
UiwgcGFyYW1UaHJlZVRvR0woIHRleHR1cmUubWFnRmlsdGVyICkgKTsKKwkJCQlfZ2wudGV4UGFy
YW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01JTl9GSUxURVIsIHBhcmFtVGhyZWVU
b0dMKCB0ZXh0dXJlLm1pbkZpbHRlciApICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlfZ2wudGV4
UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgX2dsLkNMQU1QX1RP
X0VER0UgKTsKKwkJCQlfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJF
X1dSQVBfVCwgX2dsLkNMQU1QX1RPX0VER0UgKTsKKworCQkJCWlmICggdGV4dHVyZS53cmFwUyAh
PT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdy
YXBwaW5nICkgeworCisJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRl
eHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS53cmFwUyBhbmQgVGV4dHVyZS53cmFw
VCBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLkNsYW1wVG9FZGdlV3JhcHBpbmcuJywgdGV4dHVyZSAp
OworCisJCQkJfQorCisJCQkJX2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVY
VFVSRV9NQUdfRklMVEVSLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5tYWdGaWx0ZXIgKSApOwor
CQkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUlOX0ZJTFRF
UiwgZmlsdGVyRmFsbGJhY2soIHRleHR1cmUubWluRmlsdGVyICkgKTsKKworCQkJCWlmICggdGV4
dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09
IExpbmVhckZpbHRlciApIHsKKworCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRl
cmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUubWluRmlsdGVyIHNob3Vs
ZCBiZSBzZXQgdG8gVEhSRUUuTmVhcmVzdEZpbHRlciBvciBUSFJFRS5MaW5lYXJGaWx0ZXIuJywg
dGV4dHVyZSApOworCisJCQkJfQorCisJCQl9CisKKwkJCWV4dGVuc2lvbiA9IGV4dGVuc2lvbnMu
Z2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApOworCisJCQlpZiAoIGV4dGVu
c2lvbiApIHsKKworCQkJCWlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgJiYgZXh0ZW5z
aW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICkgPT09IG51bGwgKSByZXR1cm47
CisJCQkJaWYgKCB0ZXh0dXJlLnR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5n
ZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKSA9PT0gbnVsbCApIHJldHVybjsK
KworCQkJCWlmICggdGV4dHVyZS5hbmlzb3Ryb3B5ID4gMSB8fCBwcm9wZXJ0aWVzLmdldCggdGV4
dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgKSB7CisKKwkJCQkJX2dsLnRleFBhcmFtZXRlcmYo
IHRleHR1cmVUeXBlLCBleHRlbnNpb24uVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIE1hdGgu
bWluKCB0ZXh0dXJlLmFuaXNvdHJvcHksIGNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkg
KSApOworCQkJCQlwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkg
PSB0ZXh0dXJlLmFuaXNvdHJvcHk7CisKKwkJCQl9CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rp
b24gdXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKSB7CisK
KwkJCWlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHsK
KworCQkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID0gdHJ1ZTsKKworCQkJCXRleHR1
cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7CisKKwkJ
CQl0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7
CisKKwkJCQlpbmZvTWVtb3J5LnRleHR1cmVzICsrOworCisJCQl9CisKKwkJCXN0YXRlLmFjdGl2
ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTsKKwkJCXN0YXRlLmJpbmRUZXh0dXJlKCBf
Z2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTsKKworCQkJ
X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgdGV4dHVyZS5mbGlwWSAp
OworCQkJX2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdM
LCB0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgKTsKKwkJCV9nbC5waXhlbFN0b3JlaSggX2dsLlVO
UEFDS19BTElHTk1FTlQsIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7CisKKwkJCXZhciBpbWFn
ZSA9IGNsYW1wVG9NYXhTaXplKCB0ZXh0dXJlLmltYWdlLCBjYXBhYmlsaXRpZXMubWF4VGV4dHVy
ZVNpemUgKTsKKworCQkJaWYgKCB0ZXh0dXJlTmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkgJiYg
aXNQb3dlck9mVHdvKCBpbWFnZSApID09PSBmYWxzZSApIHsKKworCQkJCWltYWdlID0gbWFrZVBv
d2VyT2ZUd28oIGltYWdlICk7CisKKwkJCX0KKworCQkJdmFyIGlzUG93ZXJPZlR3b0ltYWdlID0g
aXNQb3dlck9mVHdvKCBpbWFnZSApLAorCQkJZ2xGb3JtYXQgPSBwYXJhbVRocmVlVG9HTCggdGV4
dHVyZS5mb3JtYXQgKSwKKwkJCWdsVHlwZSA9IHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLnR5cGUg
KTsKKworCQkJc2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlLCBp
c1Bvd2VyT2ZUd29JbWFnZSApOworCisJCQl2YXIgbWlwbWFwLCBtaXBtYXBzID0gdGV4dHVyZS5t
aXBtYXBzOworCisJCQlpZiAoIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSB7CisKKwkJCQkvLyBw
b3B1bGF0ZSBkZXB0aCB0ZXh0dXJlIHdpdGggZHVtbXkgZGF0YQorCisJCQkJdmFyIGludGVybmFs
Rm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDsKKworCQkJCWlmICggdGV4dHVyZS50eXBlID09
PSBGbG9hdFR5cGUgKSB7CisKKwkJCQkJaWYgKCAhX2lzV2ViR0wyICkgdGhyb3cgbmV3IEVycm9y
KCdGbG9hdCBEZXB0aCBUZXh0dXJlIG9ubHkgc3VwcG9ydGVkIGluIFdlYkdMMi4wJyk7CisJCQkJ
CWludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDMyRjsKKworCQkJCX0gZWxzZSBp
ZiAoIF9pc1dlYkdMMiApIHsKKworCQkJCQkvLyBXZWJHTCAyLjAgcmVxdWlyZXMgc2lnbmVkIGlu
dGVybmFsZm9ybWF0IGZvciBnbFRleEltYWdlMkQKKwkJCQkJaW50ZXJuYWxGb3JtYXQgPSBfZ2wu
REVQVEhfQ09NUE9ORU5UMTY7CisKKwkJCQl9CisKKwkJCQlpZiAoIHRleHR1cmUuZm9ybWF0ID09
PSBEZXB0aEZvcm1hdCAmJiBpbnRlcm5hbEZvcm1hdCA9PT0gX2dsLkRFUFRIX0NPTVBPTkVOVCAp
IHsKKworCQkJCQkvLyBUaGUgZXJyb3IgSU5WQUxJRF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5
IHRleEltYWdlMkQgaWYgZm9ybWF0IGFuZCBpbnRlcm5hbGZvcm1hdCBhcmUKKwkJCQkJLy8gREVQ
VEhfQ09NUE9ORU5UIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9TSE9SVCBvciBVTlNJR05FRF9J
TlQKKwkJCQkJLy8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVu
c2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pCisJCQkJCWlmICggdGV4dHVyZS50eXBlICE9PSBV
bnNpZ25lZFNob3J0VHlwZSAmJiB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50VHlwZSApIHsK
KworCQkJCQkgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBV
bnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRo
VGV4dHVyZS4nICk7CisKKwkJCQkJCXRleHR1cmUudHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlOwor
CQkJCQkJZ2xUeXBlID0gcGFyYW1UaHJlZVRvR0woIHRleHR1cmUudHlwZSApOworCisJCQkJCX0K
KworCQkJCX0KKworCQkJCS8vIERlcHRoIHN0ZW5jaWwgdGV4dHVyZXMgbmVlZCB0aGUgREVQVEhf
U1RFTkNJTCBpbnRlcm5hbCBmb3JtYXQKKwkJCQkvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcv
cmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLykKKwkJCQlpZiAo
IHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7CisKKwkJCQkJaW50ZXJu
YWxGb3JtYXQgPSBfZ2wuREVQVEhfU1RFTkNJTDsKKworCQkJCQkvLyBUaGUgZXJyb3IgSU5WQUxJ
RF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5IHRleEltYWdlMkQgaWYgZm9ybWF0IGFuZCBpbnRl
cm5hbGZvcm1hdCBhcmUKKwkJCQkJLy8gREVQVEhfU1RFTkNJTCBhbmQgdHlwZSBpcyBub3QgVU5T
SUdORURfSU5UXzI0XzhfV0VCR0wuCisJCQkJCS8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9y
ZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKQorCQkJCQlpZiAo
IHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRJbnQyNDhUeXBlICkgeworCisJCQkJCQljb25zb2xl
Lndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRJbnQyNDhUeXBlIGZvciBE
ZXB0aFN0ZW5jaWxGb3JtYXQgRGVwdGhUZXh0dXJlLicgKTsKKworCQkJCQkJdGV4dHVyZS50eXBl
ID0gVW5zaWduZWRJbnQyNDhUeXBlOworCQkJCQkJZ2xUeXBlID0gcGFyYW1UaHJlZVRvR0woIHRl
eHR1cmUudHlwZSApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJCXN0YXRlLnRleEltYWdlMkQo
IF9nbC5URVhUVVJFXzJELCAwLCBpbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhl
aWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApOworCisJCQl9IGVsc2UgaWYgKCB0ZXh0
dXJlLmlzRGF0YVRleHR1cmUgKSB7CisKKwkJCQkvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBt
YXBzIGlmIGF2YWlsYWJsZQorCQkJCS8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwcwor
CQkJCS8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3Ro
ZXIgbWlwbWFwIGxldmVscworCisJCQkJaWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgJiYgaXNQb3dl
ck9mVHdvSW1hZ2UgKSB7CisKKwkJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVu
Z3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQkJCW1pcG1hcCA9IG1pcG1hcHNbIGkgXTsKKwkJ
CQkJCXN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFw
LndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSAp
OworCisJCQkJCX0KKworCQkJCQl0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOworCisJ
CQkJfSBlbHNlIHsKKworCQkJCQlzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwg
Z2xGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUs
IGltYWdlLmRhdGEgKTsKKworCQkJCX0KKworCQkJfSBlbHNlIGlmICggdGV4dHVyZS5pc0NvbXBy
ZXNzZWRUZXh0dXJlICkgeworCisJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVu
Z3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQkJbWlwbWFwID0gbWlwbWFwc1sgaSBdOworCisJ
CQkJCWlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3JtYXQg
IT09IFJHQkZvcm1hdCApIHsKKworCQkJCQkJaWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVy
ZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkgeworCisJCQkJCQkJc3RhdGUu
Y29tcHJlc3NlZFRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFw
LndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBtaXBtYXAuZGF0YSApOworCisJCQkJCQl9IGVsc2Ug
eworCisJCQkJCQkJY29uc29sZS53YXJuKCAiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0
byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnVwbG9hZFRl
eHR1cmUoKSIgKTsKKworCQkJCQkJfQorCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCXN0YXRlLnRl
eEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBt
YXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApOworCisJCQkJCX0K
KworCQkJCX0KKworCQkJfSBlbHNlIHsKKworCQkJCS8vIHJlZ3VsYXIgVGV4dHVyZSAoaW1hZ2Us
IHZpZGVvLCBjYW52YXMpCisKKwkJCQkvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBtYXBzIGlm
IGF2YWlsYWJsZQorCQkJCS8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwcworCQkJCS8v
IHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlw
bWFwIGxldmVscworCisJCQkJaWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgJiYgaXNQb3dlck9mVHdv
SW1hZ2UgKSB7CisKKwkJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBp
IDwgaWw7IGkgKysgKSB7CisKKwkJCQkJCW1pcG1hcCA9IG1pcG1hcHNbIGkgXTsKKwkJCQkJCXN0
YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGds
VHlwZSwgbWlwbWFwICk7CisKKwkJCQkJfQorCisJCQkJCXRleHR1cmUuZ2VuZXJhdGVNaXBtYXBz
ID0gZmFsc2U7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXN0YXRlLnRleEltYWdlMkQoIF9nbC5U
RVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTsKKworCQkJ
CX0KKworCQkJfQorCisJCQlpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVy
ZSwgaXNQb3dlck9mVHdvSW1hZ2UgKSApIF9nbC5nZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVf
MkQgKTsKKworCQkJdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9u
OworCisJCQlpZiAoIHRleHR1cmUub25VcGRhdGUgKSB0ZXh0dXJlLm9uVXBkYXRlKCB0ZXh0dXJl
ICk7CisKKwkJfQorCisJCS8vIFJlbmRlciB0YXJnZXRzCisKKwkJLy8gU2V0dXAgc3RvcmFnZSBm
b3IgdGFyZ2V0IHRleHR1cmUgYW5kIGJpbmQgaXQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlcgorCQlm
dW5jdGlvbiBzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdl
dCwgYXR0YWNobWVudCwgdGV4dHVyZVRhcmdldCApIHsKKworCQkJdmFyIGdsRm9ybWF0ID0gcGFy
YW1UaHJlZVRvR0woIHJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdCApOworCQkJdmFyIGdsVHlw
ZSA9IHBhcmFtVGhyZWVUb0dMKCByZW5kZXJUYXJnZXQudGV4dHVyZS50eXBlICk7CisJCQlzdGF0
ZS50ZXhJbWFnZTJEKCB0ZXh0dXJlVGFyZ2V0LCAwLCBnbEZvcm1hdCwgcmVuZGVyVGFyZ2V0Lndp
ZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7CisJ
CQlfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7CisJ
CQlfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgYXR0YWNobWVudCwg
dGV4dHVyZVRhcmdldCwgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICkuX193
ZWJnbFRleHR1cmUsIDAgKTsKKwkJCV9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZF
UiwgbnVsbCApOworCisJCX0KKworCQkvLyBTZXR1cCBzdG9yYWdlIGZvciBpbnRlcm5hbCBkZXB0
aC9zdGVuY2lsIGJ1ZmZlcnMgYW5kIGJpbmQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlcgorCQlmdW5j
dGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0
ICkgeworCisJCQlfZ2wuYmluZFJlbmRlcmJ1ZmZlciggX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVy
YnVmZmVyICk7CisKKwkJCWlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmICEgcmVuZGVy
VGFyZ2V0LnN0ZW5jaWxCdWZmZXIgKSB7CisKKwkJCQlfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSgg
X2dsLlJFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX0NPTVBPTkVOVDE2LCByZW5kZXJUYXJnZXQud2lk
dGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTsKKwkJCQlfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZm
ZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZG
RVIsIHJlbmRlcmJ1ZmZlciApOworCisJCQl9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhC
dWZmZXIgJiYgcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgKSB7CisKKwkJCQlfZ2wucmVuZGVy
YnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUwsIHJlbmRl
clRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOworCQkJCV9nbC5mcmFtZWJ1ZmZl
clJlbmRlcmJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hN
RU5ULCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTsKKworCQkJfSBlbHNlIHsKKwor
CQkJCS8vIEZJWE1FOiBXZSBkb24ndCBzdXBwb3J0ICFkZXB0aCAhc3RlbmNpbAorCQkJCV9nbC5y
ZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuUkdCQTQsIHJlbmRlclRh
cmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOworCisJCQl9CisKKwkJCV9nbC5iaW5k
UmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCBudWxsICk7CisKKwkJfQorCisJCS8vIFNl
dHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0
ZW5zaW9uKQorCQlmdW5jdGlvbiBzZXR1cERlcHRoVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRl
clRhcmdldCApIHsKKworCQkJdmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRh
cmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApOworCQkJaWYgKCBpc0N1YmUgKSB0aHJvdyBu
ZXcgRXJyb3IoJ0RlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBz
dXBwb3J0ZWQhJyk7CisKKwkJCV9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwg
ZnJhbWVidWZmZXIgKTsKKworCQkJaWYgKCAhKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICYm
IHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSApIHsKKworCQkJCXRo
cm93IG5ldyBFcnJvcigncmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3Rh
bmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZScpOworCisJCQl9CisKKwkJCS8vIHVwbG9hZCBhbiBl
bXB0eSBkZXB0aCB0ZXh0dXJlIHdpdGggZnJhbWVidWZmZXIgc2l6ZQorCQkJaWYgKCAhcHJvcGVy
dGllcy5nZXQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSB8fAor
CQkJCQlyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoICE9PSByZW5kZXJUYXJn
ZXQud2lkdGggfHwKKwkJCQkJcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQg
IT09IHJlbmRlclRhcmdldC5oZWlnaHQgKSB7CisJCQkJcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVy
ZS5pbWFnZS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDsKKwkJCQlyZW5kZXJUYXJnZXQuZGVw
dGhUZXh0dXJlLmltYWdlLmhlaWdodCA9IHJlbmRlclRhcmdldC5oZWlnaHQ7CisJCQkJcmVuZGVy
VGFyZ2V0LmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CisJCQl9CisKKwkJCXNldFRl
eHR1cmUyRCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSwgMCApOworCisJCQl2YXIgd2ViZ2xE
ZXB0aFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSAp
Ll9fd2ViZ2xUZXh0dXJlOworCisJCQlpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9y
bWF0ID09PSBEZXB0aEZvcm1hdCApIHsKKworCQkJCV9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCgg
X2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdl
YmdsRGVwdGhUZXh0dXJlLCAwICk7CisKKwkJCX0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0
aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7CisKKwkJCQlfZ2wuZnJh
bWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRU
QUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7CisKKwkJCX0g
ZWxzZSB7CisKKwkJCQl0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZGVwdGhUZXh0dXJlIGZvcm1h
dCcpCisKKwkJCX0KKworCQl9CisKKwkJLy8gU2V0dXAgR0wgcmVzb3VyY2VzIGZvciBhIG5vbi10
ZXh0dXJlIGRlcHRoIGJ1ZmZlcgorCQlmdW5jdGlvbiBzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCBy
ZW5kZXJUYXJnZXQgKSB7CisKKwkJCXZhciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVy
dGllcy5nZXQoIHJlbmRlclRhcmdldCApOworCisJCQl2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJn
ZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPT09IHRydWUgKTsKKworCQkJaWYgKCByZW5kZXJU
YXJnZXQuZGVwdGhUZXh0dXJlICkgeworCisJCQkJaWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJy
b3IoJ3RhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJn
ZXRzJyk7CisKKwkJCQlzZXR1cERlcHRoVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5f
X3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApOworCisJCQl9IGVsc2UgeworCisJCQkJ
aWYgKCBpc0N1YmUgKSB7CisKKwkJCQkJcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVw
dGhidWZmZXIgPSBbXTsKKworCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewor
CisJCQkJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdl
dFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTsKKwkJCQkJCXJlbmRlclRhcmdl
dFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlUmVuZGVyYnVm
ZmVyKCk7CisJCQkJCQlzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlclRhcmdldFByb3Bl
cnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0sIHJlbmRlclRhcmdldCApOworCisJCQkJCX0K
KworCQkJCX0gZWxzZSB7CisKKwkJCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVG
RkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApOworCQkJCQly
ZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5k
ZXJidWZmZXIoKTsKKwkJCQkJc2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQ
cm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICk7CisKKwkJCQl9CisK
KwkJCX0KKworCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBudWxsICk7
CisKKwkJfQorCisJCS8vIFNldCB1cCBHTCByZXNvdXJjZXMgZm9yIHRoZSByZW5kZXIgdGFyZ2V0
CisJCWZ1bmN0aW9uIHNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7CisKKwkJCXZh
ciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCAp
OworCQkJdmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdl
dC50ZXh0dXJlICk7CisKKwkJCXJlbmRlclRhcmdldC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9z
ZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApOworCisJCQl0ZXh0dXJlUHJvcGVydGllcy5fX3dl
YmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7CisKKwkJCWluZm9NZW1vcnkudGV4dHVy
ZXMgKys7CisKKwkJCXZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFy
Z2V0Q3ViZSA9PT0gdHJ1ZSApOworCQkJdmFyIGlzVGFyZ2V0UG93ZXJPZlR3byA9IGlzUG93ZXJP
ZlR3byggcmVuZGVyVGFyZ2V0ICk7CisKKwkJCS8vIFNldHVwIGZyYW1lYnVmZmVyCisKKwkJCWlm
ICggaXNDdWJlICkgeworCisJCQkJcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVi
dWZmZXIgPSBbXTsKKworCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CisKKwkJ
CQkJcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSA9IF9nbC5j
cmVhdGVGcmFtZWJ1ZmZlcigpOworCisJCQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJcmVuZGVy
VGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBfZ2wuY3JlYXRlRnJhbWVidWZm
ZXIoKTsKKworCQkJfQorCisJCQkvLyBTZXR1cCBjb2xvciBidWZmZXIKKworCQkJaWYgKCBpc0N1
YmUgKSB7CisKKwkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRl
eHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7CisJCQkJc2V0VGV4dHVyZVBhcmFtZXRl
cnMoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQ
b3dlck9mVHdvICk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgeworCisJ
CQkJCXNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2Vi
Z2xGcmFtZWJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwg
X2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGkgKTsKKworCQkJCX0KKworCQkJCWlm
ICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNU
YXJnZXRQb3dlck9mVHdvICkgKSBfZ2wuZ2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFX0NVQkVf
TUFQICk7CisJCQkJc3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCBudWxs
ICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVf
MkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7CisJCQkJc2V0VGV4dHVyZVBh
cmFtZXRlcnMoIF9nbC5URVhUVVJFXzJELCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQ
b3dlck9mVHdvICk7CisJCQkJc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFBy
b3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQsIF9nbC5DT0xPUl9BVFRB
Q0hNRU5UMCwgX2dsLlRFWFRVUkVfMkQgKTsKKworCQkJCWlmICggdGV4dHVyZU5lZWRzR2VuZXJh
dGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSBf
Z2wuZ2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFXzJEICk7CisJCQkJc3RhdGUuYmluZFRleHR1
cmUoIF9nbC5URVhUVVJFXzJELCBudWxsICk7CisKKwkJCX0KKworCQkJLy8gU2V0dXAgZGVwdGgg
YW5kIHN0ZW5jaWwgYnVmZmVycworCisJCQlpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAp
IHsKKworCQkJCXNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldCApOworCisJCQl9
CisKKwkJfQorCisJCWZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFy
Z2V0ICkgeworCisJCQl2YXIgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlOworCQkJdmFy
IGlzVGFyZ2V0UG93ZXJPZlR3byA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICk7CisKKwkJ
CWlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1RhcmdldFBvd2Vy
T2ZUd28gKSApIHsKKworCQkJCXZhciB0YXJnZXQgPSByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRl
clRhcmdldEN1YmUgPyBfZ2wuVEVYVFVSRV9DVUJFX01BUCA6IF9nbC5URVhUVVJFXzJEOworCQkJ
CXZhciB3ZWJnbFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fd2ViZ2xUZXh0
dXJlOworCisJCQkJc3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgd2ViZ2xUZXh0dXJlICk7CisJ
CQkJX2dsLmdlbmVyYXRlTWlwbWFwKCB0YXJnZXQgKTsKKwkJCQlzdGF0ZS5iaW5kVGV4dHVyZSgg
dGFyZ2V0LCBudWxsICk7CisKKwkJCX0KKworCQl9CisKKwkJdGhpcy5zZXRUZXh0dXJlMkQgPSBz
ZXRUZXh0dXJlMkQ7CisJCXRoaXMuc2V0VGV4dHVyZUN1YmUgPSBzZXRUZXh0dXJlQ3ViZTsKKwkJ
dGhpcy5zZXRUZXh0dXJlQ3ViZUR5bmFtaWMgPSBzZXRUZXh0dXJlQ3ViZUR5bmFtaWM7CisJCXRo
aXMuc2V0dXBSZW5kZXJUYXJnZXQgPSBzZXR1cFJlbmRlclRhcmdldDsKKwkJdGhpcy51cGRhdGVS
ZW5kZXJUYXJnZXRNaXBtYXAgPSB1cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA7CisKKwl9CisKKwkv
KioKKwkgKiBAYXV0aG9yIGZvcmRhY2lvdXMgLyBmb3JkYWNpb3VzLmdpdGh1Yi5pbworCSAqLwor
CisJZnVuY3Rpb24gV2ViR0xQcm9wZXJ0aWVzKCkgeworCisJCXZhciBwcm9wZXJ0aWVzID0ge307
CisKKwkJZnVuY3Rpb24gZ2V0KCBvYmplY3QgKSB7CisKKwkJCXZhciB1dWlkID0gb2JqZWN0LnV1
aWQ7CisJCQl2YXIgbWFwID0gcHJvcGVydGllc1sgdXVpZCBdOworCisJCQlpZiAoIG1hcCA9PT0g
dW5kZWZpbmVkICkgeworCisJCQkJbWFwID0ge307CisJCQkJcHJvcGVydGllc1sgdXVpZCBdID0g
bWFwOworCisJCQl9CisKKwkJCXJldHVybiBtYXA7CisKKwkJfQorCisJCWZ1bmN0aW9uIHJlbW92
ZSggb2JqZWN0ICkgeworCisJCQlkZWxldGUgcHJvcGVydGllc1sgb2JqZWN0LnV1aWQgXTsKKwor
CQl9CisKKwkJZnVuY3Rpb24gY2xlYXIoKSB7CisKKwkJCXByb3BlcnRpZXMgPSB7fTsKKworCQl9
CisKKwkJcmV0dXJuIHsKKwkJCWdldDogZ2V0LAorCQkJcmVtb3ZlOiByZW1vdmUsCisJCQljbGVh
cjogY2xlYXIKKwkJfTsKKworCX0KKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDov
L21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBXZWJHTFN0YXRlKCBnbCwgZXh0ZW5zaW9u
cywgcGFyYW1UaHJlZVRvR0wgKSB7CisKKwkJZnVuY3Rpb24gQ29sb3JCdWZmZXIoKSB7CisKKwkJ
CXZhciBsb2NrZWQgPSBmYWxzZTsKKworCQkJdmFyIGNvbG9yID0gbmV3IFZlY3RvcjQoKTsKKwkJ
CXZhciBjdXJyZW50Q29sb3JNYXNrID0gbnVsbDsKKwkJCXZhciBjdXJyZW50Q29sb3JDbGVhciA9
IG5ldyBWZWN0b3I0KCk7CisKKwkJCXJldHVybiB7CisKKwkJCQlzZXRNYXNrOiBmdW5jdGlvbiAo
IGNvbG9yTWFzayApIHsKKworCQkJCQlpZiAoIGN1cnJlbnRDb2xvck1hc2sgIT09IGNvbG9yTWFz
ayAmJiAhIGxvY2tlZCApIHsKKworCQkJCQkJZ2wuY29sb3JNYXNrKCBjb2xvck1hc2ssIGNvbG9y
TWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2sgKTsKKwkJCQkJCWN1cnJlbnRDb2xvck1hc2sgPSBj
b2xvck1hc2s7CisKKwkJCQkJfQorCisJCQkJfSwKKworCQkJCXNldExvY2tlZDogZnVuY3Rpb24g
KCBsb2NrICkgeworCisJCQkJCWxvY2tlZCA9IGxvY2s7CisKKwkJCQl9LAorCisJCQkJc2V0Q2xl
YXI6IGZ1bmN0aW9uICggciwgZywgYiwgYSwgcHJlbXVsdGlwbGllZEFscGhhICkgeworCisJCQkJ
CWlmICggcHJlbXVsdGlwbGllZEFscGhhID09PSB0cnVlICkgeworCisJCQkJCQlyICo9IGE7IGcg
Kj0gYTsgYiAqPSBhOworCisJCQkJCX0KKworCQkJCQljb2xvci5zZXQoIHIsIGcsIGIsIGEgKTsK
KworCQkJCQlpZiAoIGN1cnJlbnRDb2xvckNsZWFyLmVxdWFscyggY29sb3IgKSA9PT0gZmFsc2Ug
KSB7CisKKwkJCQkJCWdsLmNsZWFyQ29sb3IoIHIsIGcsIGIsIGEgKTsKKwkJCQkJCWN1cnJlbnRD
b2xvckNsZWFyLmNvcHkoIGNvbG9yICk7CisKKwkJCQkJfQorCisJCQkJfSwKKworCQkJCXJlc2V0
OiBmdW5jdGlvbiAoKSB7CisKKwkJCQkJbG9ja2VkID0gZmFsc2U7CisKKwkJCQkJY3VycmVudENv
bG9yTWFzayA9IG51bGw7CisJCQkJCWN1cnJlbnRDb2xvckNsZWFyLnNldCggMCwgMCwgMCwgMSAp
OworCisJCQkJfQorCisJCQl9OworCisJCX0KKworCQlmdW5jdGlvbiBEZXB0aEJ1ZmZlcigpIHsK
KworCQkJdmFyIGxvY2tlZCA9IGZhbHNlOworCisJCQl2YXIgY3VycmVudERlcHRoTWFzayA9IG51
bGw7CisJCQl2YXIgY3VycmVudERlcHRoRnVuYyA9IG51bGw7CisJCQl2YXIgY3VycmVudERlcHRo
Q2xlYXIgPSBudWxsOworCisJCQlyZXR1cm4geworCisJCQkJc2V0VGVzdDogZnVuY3Rpb24gKCBk
ZXB0aFRlc3QgKSB7CisKKwkJCQkJaWYgKCBkZXB0aFRlc3QgKSB7CisKKwkJCQkJCWVuYWJsZSgg
Z2wuREVQVEhfVEVTVCApOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWRpc2FibGUoIGdsLkRF
UFRIX1RFU1QgKTsKKworCQkJCQl9CisKKwkJCQl9LAorCisJCQkJc2V0TWFzazogZnVuY3Rpb24g
KCBkZXB0aE1hc2sgKSB7CisKKwkJCQkJaWYgKCBjdXJyZW50RGVwdGhNYXNrICE9PSBkZXB0aE1h
c2sgJiYgISBsb2NrZWQgKSB7CisKKwkJCQkJCWdsLmRlcHRoTWFzayggZGVwdGhNYXNrICk7CisJ
CQkJCQljdXJyZW50RGVwdGhNYXNrID0gZGVwdGhNYXNrOworCisJCQkJCX0KKworCQkJCX0sCisK
KwkJCQlzZXRGdW5jOiBmdW5jdGlvbiAoIGRlcHRoRnVuYyApIHsKKworCQkJCQlpZiAoIGN1cnJl
bnREZXB0aEZ1bmMgIT09IGRlcHRoRnVuYyApIHsKKworCQkJCQkJaWYgKCBkZXB0aEZ1bmMgKSB7
CisKKwkJCQkJCQlzd2l0Y2ggKCBkZXB0aEZ1bmMgKSB7CisKKwkJCQkJCQkJY2FzZSBOZXZlckRl
cHRoOgorCisJCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIGdsLk5FVkVSICk7CisJCQkJCQkJCQlicmVh
azsKKworCQkJCQkJCQljYXNlIEFsd2F5c0RlcHRoOgorCisJCQkJCQkJCQlnbC5kZXB0aEZ1bmMo
IGdsLkFMV0FZUyApOworCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJY2FzZSBMZXNzRGVwdGg6
CisKKwkJCQkJCQkJCWdsLmRlcHRoRnVuYyggZ2wuTEVTUyApOworCQkJCQkJCQkJYnJlYWs7CisK
KwkJCQkJCQkJY2FzZSBMZXNzRXF1YWxEZXB0aDoKKworCQkJCQkJCQkJZ2wuZGVwdGhGdW5jKCBn
bC5MRVFVQUwgKTsKKwkJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJCWNhc2UgRXF1YWxEZXB0aDoK
KworCQkJCQkJCQkJZ2wuZGVwdGhGdW5jKCBnbC5FUVVBTCApOworCQkJCQkJCQkJYnJlYWs7CisK
KwkJCQkJCQkJY2FzZSBHcmVhdGVyRXF1YWxEZXB0aDoKKworCQkJCQkJCQkJZ2wuZGVwdGhGdW5j
KCBnbC5HRVFVQUwgKTsKKwkJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJCWNhc2UgR3JlYXRlckRl
cHRoOgorCisJCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIGdsLkdSRUFURVIgKTsKKwkJCQkJCQkJCWJy
ZWFrOworCisJCQkJCQkJCWNhc2UgTm90RXF1YWxEZXB0aDoKKworCQkJCQkJCQkJZ2wuZGVwdGhG
dW5jKCBnbC5OT1RFUVVBTCApOworCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJZGVmYXVsdDoK
KworCQkJCQkJCQkJZ2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTsKKworCQkJCQkJCX0KKworCQkJ
CQkJfSBlbHNlIHsKKworCQkJCQkJCWdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7CisKKwkJCQkJ
CX0KKworCQkJCQkJY3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYzsKKworCQkJCQl9CisKKwkJ
CQl9LAorCisJCQkJc2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7CisKKwkJCQkJbG9ja2Vk
ID0gbG9jazsKKworCQkJCX0sCisKKwkJCQlzZXRDbGVhcjogZnVuY3Rpb24gKCBkZXB0aCApIHsK
KworCQkJCQlpZiAoIGN1cnJlbnREZXB0aENsZWFyICE9PSBkZXB0aCApIHsKKworCQkJCQkJZ2wu
Y2xlYXJEZXB0aCggZGVwdGggKTsKKwkJCQkJCWN1cnJlbnREZXB0aENsZWFyID0gZGVwdGg7CisK
KwkJCQkJfQorCisJCQkJfSwKKworCQkJCXJlc2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQkJbG9j
a2VkID0gZmFsc2U7CisKKwkJCQkJY3VycmVudERlcHRoTWFzayA9IG51bGw7CisJCQkJCWN1cnJl
bnREZXB0aEZ1bmMgPSBudWxsOworCQkJCQljdXJyZW50RGVwdGhDbGVhciA9IG51bGw7CisKKwkJ
CQl9CisKKwkJCX07CisKKwkJfQorCisJCWZ1bmN0aW9uIFN0ZW5jaWxCdWZmZXIoKSB7CisKKwkJ
CXZhciBsb2NrZWQgPSBmYWxzZTsKKworCQkJdmFyIGN1cnJlbnRTdGVuY2lsTWFzayA9IG51bGw7
CisJCQl2YXIgY3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDsKKwkJCXZhciBjdXJyZW50U3RlbmNp
bFJlZiA9IG51bGw7CisJCQl2YXIgY3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7CisJCQl2
YXIgY3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDsKKwkJCXZhciBjdXJyZW50U3RlbmNpbFpGYWls
ID0gbnVsbDsKKwkJCXZhciBjdXJyZW50U3RlbmNpbFpQYXNzID0gbnVsbDsKKwkJCXZhciBjdXJy
ZW50U3RlbmNpbENsZWFyID0gbnVsbDsKKworCQkJcmV0dXJuIHsKKworCQkJCXNldFRlc3Q6IGZ1
bmN0aW9uICggc3RlbmNpbFRlc3QgKSB7CisKKwkJCQkJaWYgKCBzdGVuY2lsVGVzdCApIHsKKwor
CQkJCQkJZW5hYmxlKCBnbC5TVEVOQ0lMX1RFU1QgKTsKKworCQkJCQl9IGVsc2UgeworCisJCQkJ
CQlkaXNhYmxlKCBnbC5TVEVOQ0lMX1RFU1QgKTsKKworCQkJCQl9CisKKwkJCQl9LAorCisJCQkJ
c2V0TWFzazogZnVuY3Rpb24gKCBzdGVuY2lsTWFzayApIHsKKworCQkJCQlpZiAoIGN1cnJlbnRT
dGVuY2lsTWFzayAhPT0gc3RlbmNpbE1hc2sgJiYgISBsb2NrZWQgKSB7CisKKwkJCQkJCWdsLnN0
ZW5jaWxNYXNrKCBzdGVuY2lsTWFzayApOworCQkJCQkJY3VycmVudFN0ZW5jaWxNYXNrID0gc3Rl
bmNpbE1hc2s7CisKKwkJCQkJfQorCisJCQkJfSwKKworCQkJCXNldEZ1bmM6IGZ1bmN0aW9uICgg
c3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICkgeworCisJCQkJCWlmICggY3Vy
cmVudFN0ZW5jaWxGdW5jICE9PSBzdGVuY2lsRnVuYyB8fAorCQkJCQkgICAgIGN1cnJlbnRTdGVu
Y2lsUmVmIAkhPT0gc3RlbmNpbFJlZiAJfHwKKwkJCQkJICAgICBjdXJyZW50U3RlbmNpbEZ1bmNN
YXNrICE9PSBzdGVuY2lsTWFzayApIHsKKworCQkJCQkJZ2wuc3RlbmNpbEZ1bmMoIHN0ZW5jaWxG
dW5jLCBzdGVuY2lsUmVmLCBzdGVuY2lsTWFzayApOworCisJCQkJCQljdXJyZW50U3RlbmNpbEZ1
bmMgPSBzdGVuY2lsRnVuYzsKKwkJCQkJCWN1cnJlbnRTdGVuY2lsUmVmID0gc3RlbmNpbFJlZjsK
KwkJCQkJCWN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBzdGVuY2lsTWFzazsKKworCQkJCQl9CisK
KwkJCQl9LAorCisJCQkJc2V0T3A6IGZ1bmN0aW9uICggc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFp
bCwgc3RlbmNpbFpQYXNzICkgeworCisJCQkJCWlmICggY3VycmVudFN0ZW5jaWxGYWlsCSAhPT0g
c3RlbmNpbEZhaWwgCXx8CisJCQkJCSAgICAgY3VycmVudFN0ZW5jaWxaRmFpbCAhPT0gc3RlbmNp
bFpGYWlsIHx8CisJCQkJCSAgICAgY3VycmVudFN0ZW5jaWxaUGFzcyAhPT0gc3RlbmNpbFpQYXNz
ICkgeworCisJCQkJCQlnbC5zdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0
ZW5jaWxaUGFzcyApOworCisJCQkJCQljdXJyZW50U3RlbmNpbEZhaWwgPSBzdGVuY2lsRmFpbDsK
KwkJCQkJCWN1cnJlbnRTdGVuY2lsWkZhaWwgPSBzdGVuY2lsWkZhaWw7CisJCQkJCQljdXJyZW50
U3RlbmNpbFpQYXNzID0gc3RlbmNpbFpQYXNzOworCisJCQkJCX0KKworCQkJCX0sCisKKwkJCQlz
ZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHsKKworCQkJCQlsb2NrZWQgPSBsb2NrOworCisJ
CQkJfSwKKworCQkJCXNldENsZWFyOiBmdW5jdGlvbiAoIHN0ZW5jaWwgKSB7CisKKwkJCQkJaWYg
KCBjdXJyZW50U3RlbmNpbENsZWFyICE9PSBzdGVuY2lsICkgeworCisJCQkJCQlnbC5jbGVhclN0
ZW5jaWwoIHN0ZW5jaWwgKTsKKwkJCQkJCWN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBzdGVuY2lsOwor
CisJCQkJCX0KKworCQkJCX0sCisKKwkJCQlyZXNldDogZnVuY3Rpb24gKCkgeworCisJCQkJCWxv
Y2tlZCA9IGZhbHNlOworCisJCQkJCWN1cnJlbnRTdGVuY2lsTWFzayA9IG51bGw7CisJCQkJCWN1
cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7CisJCQkJCWN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDsK
KwkJCQkJY3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7CisJCQkJCWN1cnJlbnRTdGVuY2ls
RmFpbCA9IG51bGw7CisJCQkJCWN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsOworCQkJCQljdXJy
ZW50U3RlbmNpbFpQYXNzID0gbnVsbDsKKwkJCQkJY3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7
CisKKwkJCQl9CisKKwkJCX07CisKKwkJfQorCisJCS8vCisKKwkJdmFyIGNvbG9yQnVmZmVyID0g
bmV3IENvbG9yQnVmZmVyKCk7CisJCXZhciBkZXB0aEJ1ZmZlciA9IG5ldyBEZXB0aEJ1ZmZlcigp
OworCQl2YXIgc3RlbmNpbEJ1ZmZlciA9IG5ldyBTdGVuY2lsQnVmZmVyKCk7CisKKwkJdmFyIG1h
eFZlcnRleEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfQVRUUklC
UyApOworCQl2YXIgbmV3QXR0cmlidXRlcyA9IG5ldyBVaW50OEFycmF5KCBtYXhWZXJ0ZXhBdHRy
aWJ1dGVzICk7CisJCXZhciBlbmFibGVkQXR0cmlidXRlcyA9IG5ldyBVaW50OEFycmF5KCBtYXhW
ZXJ0ZXhBdHRyaWJ1dGVzICk7CisJCXZhciBhdHRyaWJ1dGVEaXZpc29ycyA9IG5ldyBVaW50OEFy
cmF5KCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzICk7CisKKwkJdmFyIGNhcGFiaWxpdGllcyA9IHt9Owor
CisJCXZhciBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSBudWxsOworCisJCXZhciBjdXJyZW50
QmxlbmRpbmcgPSBudWxsOworCQl2YXIgY3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsOworCQl2
YXIgY3VycmVudEJsZW5kU3JjID0gbnVsbDsKKwkJdmFyIGN1cnJlbnRCbGVuZERzdCA9IG51bGw7
CisJCXZhciBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDsKKwkJdmFyIGN1cnJlbnRC
bGVuZFNyY0FscGhhID0gbnVsbDsKKwkJdmFyIGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDsK
KwkJdmFyIGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlOworCisJCXZhciBjdXJyZW50
RmxpcFNpZGVkID0gbnVsbDsKKwkJdmFyIGN1cnJlbnRDdWxsRmFjZSA9IG51bGw7CisKKwkJdmFy
IGN1cnJlbnRMaW5lV2lkdGggPSBudWxsOworCisJCXZhciBjdXJyZW50UG9seWdvbk9mZnNldEZh
Y3RvciA9IG51bGw7CisJCXZhciBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gbnVsbDsKKwor
CQl2YXIgY3VycmVudFNjaXNzb3JUZXN0ID0gbnVsbDsKKworCQl2YXIgbWF4VGV4dHVyZXMgPSBn
bC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTICk7CisK
KwkJdmFyIHZlcnNpb24gPSBwYXJzZUZsb2F0KCAvXldlYkdMXCAoWzAtOV0pLy5leGVjKCBnbC5n
ZXRQYXJhbWV0ZXIoIGdsLlZFUlNJT04gKSApWyAxIF0gKTsKKwkJdmFyIGxpbmVXaWR0aEF2YWls
YWJsZSA9IHBhcnNlRmxvYXQoIHZlcnNpb24gKSA+PSAxLjA7CisKKwkJdmFyIGN1cnJlbnRUZXh0
dXJlU2xvdCA9IG51bGw7CisJCXZhciBjdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9OworCisJCXZh
ciBjdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCk7CisJCXZhciBjdXJyZW50Vmlld3BvcnQg
PSBuZXcgVmVjdG9yNCgpOworCisJCWZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoIHR5cGUsIHRhcmdl
dCwgY291bnQgKSB7CisKKwkJCXZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoIDQgKTsgLy8gNCBp
cyByZXF1aXJlZCB0byBtYXRjaCBkZWZhdWx0IHVucGFjayBhbGlnbm1lbnQgb2YgNC4KKwkJCXZh
ciB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOworCisJCQlnbC5iaW5kVGV4dHVyZSggdHlw
ZSwgdGV4dHVyZSApOworCQkJZ2wudGV4UGFyYW1ldGVyaSggdHlwZSwgZ2wuVEVYVFVSRV9NSU5f
RklMVEVSLCBnbC5ORUFSRVNUICk7CisJCQlnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCBnbC5URVhU
VVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QgKTsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwg
Y291bnQ7IGkgKysgKSB7CisKKwkJCQlnbC50ZXhJbWFnZTJEKCB0YXJnZXQgKyBpLCAwLCBnbC5S
R0JBLCAxLCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBkYXRhICk7CisKKwkJCX0K
KworCQkJcmV0dXJuIHRleHR1cmU7CisKKwkJfQorCisJCXZhciBlbXB0eVRleHR1cmVzID0ge307
CisJCWVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfMkQgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRF
WFRVUkVfMkQsIGdsLlRFWFRVUkVfMkQsIDEgKTsKKwkJZW1wdHlUZXh0dXJlc1sgZ2wuVEVYVFVS
RV9DVUJFX01BUCBdID0gY3JlYXRlVGV4dHVyZSggZ2wuVEVYVFVSRV9DVUJFX01BUCwgZ2wuVEVY
VFVSRV9DVUJFX01BUF9QT1NJVElWRV9YLCA2ICk7CisKKwkJLy8KKworCQlmdW5jdGlvbiBpbml0
KCkgeworCisJCQljb2xvckJ1ZmZlci5zZXRDbGVhciggMCwgMCwgMCwgMSApOworCQkJZGVwdGhC
dWZmZXIuc2V0Q2xlYXIoIDEgKTsKKwkJCXN0ZW5jaWxCdWZmZXIuc2V0Q2xlYXIoIDAgKTsKKwor
CQkJZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7CisJCQlkZXB0aEJ1ZmZlci5zZXRGdW5jKCBMZXNz
RXF1YWxEZXB0aCApOworCisJCQlzZXRGbGlwU2lkZWQoIGZhbHNlICk7CisJCQlzZXRDdWxsRmFj
ZSggQ3VsbEZhY2VCYWNrICk7CisJCQllbmFibGUoIGdsLkNVTExfRkFDRSApOworCisJCQllbmFi
bGUoIGdsLkJMRU5EICk7CisJCQlzZXRCbGVuZGluZyggTm9ybWFsQmxlbmRpbmcgKTsKKworCQl9
CisKKwkJZnVuY3Rpb24gaW5pdEF0dHJpYnV0ZXMoKSB7CisKKwkJCWZvciAoIHZhciBpID0gMCwg
bCA9IG5ld0F0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCW5ld0F0dHJp
YnV0ZXNbIGkgXSA9IDA7CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gZW5hYmxlQXR0cmli
dXRlKCBhdHRyaWJ1dGUgKSB7CisKKwkJCW5ld0F0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTsK
KworCQkJaWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7CisKKwkJ
CQlnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7CisJCQkJZW5hYmxlZEF0
dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTsKKworCQkJfQorCisJCQlpZiAoIGF0dHJpYnV0ZURp
dmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gMCApIHsKKworCQkJCXZhciBleHRlbnNpb24gPSBleHRl
bnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7CisKKwkJCQlleHRlbnNpb24u
dmVydGV4QXR0cmliRGl2aXNvckFOR0xFKCBhdHRyaWJ1dGUsIDAgKTsKKwkJCQlhdHRyaWJ1dGVE
aXZpc29yc1sgYXR0cmlidXRlIF0gPSAwOworCisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIGVu
YWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIGF0dHJpYnV0ZSwgbWVzaFBlckF0dHJpYnV0ZSApIHsK
KworCQkJbmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxOworCisJCQlpZiAoIGVuYWJsZWRB
dHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9PT0gMCApIHsKKworCQkJCWdsLmVuYWJsZVZlcnRleEF0
dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTsKKwkJCQllbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRl
IF0gPSAxOworCisJCQl9CisKKwkJCWlmICggYXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBd
ICE9PSBtZXNoUGVyQXR0cmlidXRlICkgeworCisJCQkJdmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lv
bnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTsKKworCQkJCWV4dGVuc2lvbi52ZXJ0
ZXhBdHRyaWJEaXZpc29yQU5HTEUoIGF0dHJpYnV0ZSwgbWVzaFBlckF0dHJpYnV0ZSApOworCQkJ
CWF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSA9IG1lc2hQZXJBdHRyaWJ1dGU7CisKKwkJ
CX0KKworCQl9CisKKwkJZnVuY3Rpb24gZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKSB7CisKKwkJ
CWZvciAoIHZhciBpID0gMCwgbCA9IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSAhPT0gbDsg
KysgaSApIHsKKworCQkJCWlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSAhPT0gbmV3QXR0cmli
dXRlc1sgaSBdICkgeworCisJCQkJCWdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSggaSApOwor
CQkJCQllbmFibGVkQXR0cmlidXRlc1sgaSBdID0gMDsKKworCQkJCX0KKworCQkJfQorCisJCX0K
KworCQlmdW5jdGlvbiBlbmFibGUoIGlkICkgeworCisJCQlpZiAoIGNhcGFiaWxpdGllc1sgaWQg
XSAhPT0gdHJ1ZSApIHsKKworCQkJCWdsLmVuYWJsZSggaWQgKTsKKwkJCQljYXBhYmlsaXRpZXNb
IGlkIF0gPSB0cnVlOworCisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIGRpc2FibGUoIGlkICkg
eworCisJCQlpZiAoIGNhcGFiaWxpdGllc1sgaWQgXSAhPT0gZmFsc2UgKSB7CisKKwkJCQlnbC5k
aXNhYmxlKCBpZCApOworCQkJCWNhcGFiaWxpdGllc1sgaWQgXSA9IGZhbHNlOworCisJCQl9CisK
KwkJfQorCisJCWZ1bmN0aW9uIGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpIHsKKworCQkJ
aWYgKCBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPT09IG51bGwgKSB7CisKKwkJCQljb21wcmVz
c2VkVGV4dHVyZUZvcm1hdHMgPSBbXTsKKworCQkJCWlmICggZXh0ZW5zaW9ucy5nZXQoICdXRUJH
TF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkgfHwKKwkJCQkgICAgIGV4dGVuc2lvbnMuZ2V0
KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwKKwkJCQkgICAgIGV4dGVuc2lv
bnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnICkgKSB7CisKKwkJCQkJdmFy
IGZvcm1hdHMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLkNPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRT
ICk7CisKKwkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgZm9ybWF0cy5sZW5ndGg7IGkgKysgKSB7
CisKKwkJCQkJCWNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cy5wdXNoKCBmb3JtYXRzWyBpIF0gKTsK
KworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuIGNvbXByZXNzZWRUZXh0dXJl
Rm9ybWF0czsKKworCQl9CisKKwkJZnVuY3Rpb24gc2V0QmxlbmRpbmcoIGJsZW5kaW5nLCBibGVu
ZEVxdWF0aW9uLCBibGVuZFNyYywgYmxlbmREc3QsIGJsZW5kRXF1YXRpb25BbHBoYSwgYmxlbmRT
cmNBbHBoYSwgYmxlbmREc3RBbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICkgeworCisJCQlpZiAo
IGJsZW5kaW5nICE9PSBOb0JsZW5kaW5nICkgeworCisJCQkJZW5hYmxlKCBnbC5CTEVORCApOwor
CisJCQl9IGVsc2UgeworCisJCQkJZGlzYWJsZSggZ2wuQkxFTkQgKTsKKworCQkJfQorCisJCQlp
ZiAoICggYmxlbmRpbmcgIT09IEN1c3RvbUJsZW5kaW5nICkgJiYgKCBibGVuZGluZyAhPT0gY3Vy
cmVudEJsZW5kaW5nIHx8IHByZW11bHRpcGxpZWRBbHBoYSAhPT0gY3VycmVudFByZW11bHRpcGxl
ZEFscGhhICkgKSB7CisKKwkJCQlpZiAoIGJsZW5kaW5nID09PSBBZGRpdGl2ZUJsZW5kaW5nICkg
eworCisJCQkJCWlmICggcHJlbXVsdGlwbGllZEFscGhhICkgeworCisJCQkJCQlnbC5ibGVuZEVx
dWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApOworCQkJCQkJZ2wuYmxl
bmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUsIGdsLk9ORSApOworCisJCQkJ
CX0gZWxzZSB7CisKKwkJCQkJCWdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7CisJCQkJ
CQlnbC5ibGVuZEZ1bmMoIGdsLlNSQ19BTFBIQSwgZ2wuT05FICk7CisKKwkJCQkJfQorCisJCQkJ
fSBlbHNlIGlmICggYmxlbmRpbmcgPT09IFN1YnRyYWN0aXZlQmxlbmRpbmcgKSB7CisKKwkJCQkJ
aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7CisKKwkJCQkJCWdsLmJsZW5kRXF1YXRpb25TZXBh
cmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7CisJCQkJCQlnbC5ibGVuZEZ1bmNTZXBh
cmF0ZSggZ2wuWkVSTywgZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiwgZ2wuT05FX01J
TlVTX1NSQ19BTFBIQSApOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWdsLmJsZW5kRXF1YXRp
b24oIGdsLkZVTkNfQUREICk7CisJCQkJCQlnbC5ibGVuZEZ1bmMoIGdsLlpFUk8sIGdsLk9ORV9N
SU5VU19TUkNfQ09MT1IgKTsKKworCQkJCQl9CisKKwkJCQl9IGVsc2UgaWYgKCBibGVuZGluZyA9
PT0gTXVsdGlwbHlCbGVuZGluZyApIHsKKworCQkJCQlpZiAoIHByZW11bHRpcGxpZWRBbHBoYSAp
IHsKKworCQkJCQkJZ2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVO
Q19BREQgKTsKKwkJCQkJCWdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5aRVJPLCBnbC5TUkNfQ09M
T1IsIGdsLlpFUk8sIGdsLlNSQ19BTFBIQSApOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWds
LmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7CisJCQkJCQlnbC5ibGVuZEZ1bmMoIGdsLlpF
Uk8sIGdsLlNSQ19DT0xPUiApOworCisJCQkJCX0KKworCQkJCX0gZWxzZSB7CisKKwkJCQkJaWYg
KCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7CisKKwkJCQkJCWdsLmJsZW5kRXF1YXRpb25TZXBhcmF0
ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7CisJCQkJCQlnbC5ibGVuZEZ1bmNTZXBhcmF0
ZSggZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19T
UkNfQUxQSEEgKTsKKworCQkJCQl9IGVsc2UgeworCisJCQkJCQlnbC5ibGVuZEVxdWF0aW9uU2Vw
YXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApOworCQkJCQkJZ2wuYmxlbmRGdW5jU2Vw
YXJhdGUoIGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05FLCBnbC5P
TkVfTUlOVVNfU1JDX0FMUEhBICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJY3VycmVudEJs
ZW5kaW5nID0gYmxlbmRpbmc7CisJCQkJY3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVs
dGlwbGllZEFscGhhOworCisJCQl9CisKKwkJCWlmICggYmxlbmRpbmcgPT09IEN1c3RvbUJsZW5k
aW5nICkgeworCisJCQkJYmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhIHx8
IGJsZW5kRXF1YXRpb247CisJCQkJYmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGEgfHwgYmxl
bmRTcmM7CisJCQkJYmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGEgfHwgYmxlbmREc3Q7CisK
KwkJCQlpZiAoIGJsZW5kRXF1YXRpb24gIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5k
RXF1YXRpb25BbHBoYSAhPT0gY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSApIHsKKworCQkJCQln
bC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIHBhcmFtVGhyZWVUb0dMKCBibGVuZEVxdWF0aW9uICks
IHBhcmFtVGhyZWVUb0dMKCBibGVuZEVxdWF0aW9uQWxwaGEgKSApOworCisJCQkJCWN1cnJlbnRC
bGVuZEVxdWF0aW9uID0gYmxlbmRFcXVhdGlvbjsKKwkJCQkJY3VycmVudEJsZW5kRXF1YXRpb25B
bHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYTsKKworCQkJCX0KKworCQkJCWlmICggYmxlbmRTcmMg
IT09IGN1cnJlbnRCbGVuZFNyYyB8fCBibGVuZERzdCAhPT0gY3VycmVudEJsZW5kRHN0IHx8IGJs
ZW5kU3JjQWxwaGEgIT09IGN1cnJlbnRCbGVuZFNyY0FscGhhIHx8IGJsZW5kRHN0QWxwaGEgIT09
IGN1cnJlbnRCbGVuZERzdEFscGhhICkgeworCisJCQkJCWdsLmJsZW5kRnVuY1NlcGFyYXRlKCBw
YXJhbVRocmVlVG9HTCggYmxlbmRTcmMgKSwgcGFyYW1UaHJlZVRvR0woIGJsZW5kRHN0ICksIHBh
cmFtVGhyZWVUb0dMKCBibGVuZFNyY0FscGhhICksIHBhcmFtVGhyZWVUb0dMKCBibGVuZERzdEFs
cGhhICkgKTsKKworCQkJCQljdXJyZW50QmxlbmRTcmMgPSBibGVuZFNyYzsKKwkJCQkJY3VycmVu
dEJsZW5kRHN0ID0gYmxlbmREc3Q7CisJCQkJCWN1cnJlbnRCbGVuZFNyY0FscGhhID0gYmxlbmRT
cmNBbHBoYTsKKwkJCQkJY3VycmVudEJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhOworCisJ
CQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJY3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsOwor
CQkJCWN1cnJlbnRCbGVuZFNyYyA9IG51bGw7CisJCQkJY3VycmVudEJsZW5kRHN0ID0gbnVsbDsK
KwkJCQljdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDsKKwkJCQljdXJyZW50QmxlbmRT
cmNBbHBoYSA9IG51bGw7CisJCQkJY3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsOworCisJCQl9
CisKKwkJfQorCisJCWZ1bmN0aW9uIHNldE1hdGVyaWFsKCBtYXRlcmlhbCApIHsKKworCQkJbWF0
ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZQorCQkJCT8gZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICkK
KwkJCQk6IGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7CisKKwkJCXNldEZsaXBTaWRlZCggbWF0ZXJp
YWwuc2lkZSA9PT0gQmFja1NpZGUgKTsKKworCQkJbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRy
dWUKKwkJCQk/IHNldEJsZW5kaW5nKCBtYXRlcmlhbC5ibGVuZGluZywgbWF0ZXJpYWwuYmxlbmRF
cXVhdGlvbiwgbWF0ZXJpYWwuYmxlbmRTcmMsIG1hdGVyaWFsLmJsZW5kRHN0LCBtYXRlcmlhbC5i
bGVuZEVxdWF0aW9uQWxwaGEsIG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEsIG1hdGVyaWFsLmJsZW5k
RHN0QWxwaGEsIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSApCisJCQkJOiBzZXRCbGVuZGlu
ZyggTm9CbGVuZGluZyApOworCisJCQlkZXB0aEJ1ZmZlci5zZXRGdW5jKCBtYXRlcmlhbC5kZXB0
aEZ1bmMgKTsKKwkJCWRlcHRoQnVmZmVyLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApOwor
CQkJZGVwdGhCdWZmZXIuc2V0TWFzayggbWF0ZXJpYWwuZGVwdGhXcml0ZSApOworCQkJY29sb3JC
dWZmZXIuc2V0TWFzayggbWF0ZXJpYWwuY29sb3JXcml0ZSApOworCisJCQlzZXRQb2x5Z29uT2Zm
c2V0KCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0LCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9y
LCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgKTsKKworCQl9CisKKwkJLy8KKworCQlmdW5j
dGlvbiBzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApIHsKKworCQkJaWYgKCBjdXJyZW50RmxpcFNp
ZGVkICE9PSBmbGlwU2lkZWQgKSB7CisKKwkJCQlpZiAoIGZsaXBTaWRlZCApIHsKKworCQkJCQln
bC5mcm9udEZhY2UoIGdsLkNXICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCWdsLmZyb250RmFj
ZSggZ2wuQ0NXICk7CisKKwkJCQl9CisKKwkJCQljdXJyZW50RmxpcFNpZGVkID0gZmxpcFNpZGVk
OworCisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIHNldEN1bGxGYWNlKCBjdWxsRmFjZSApIHsK
KworCQkJaWYgKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VOb25lICkgeworCisJCQkJZW5hYmxlKCBn
bC5DVUxMX0ZBQ0UgKTsKKworCQkJCWlmICggY3VsbEZhY2UgIT09IGN1cnJlbnRDdWxsRmFjZSAp
IHsKKworCQkJCQlpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUJhY2sgKSB7CisKKwkJCQkJCWds
LmN1bGxGYWNlKCBnbC5CQUNLICk7CisKKwkJCQkJfSBlbHNlIGlmICggY3VsbEZhY2UgPT09IEN1
bGxGYWNlRnJvbnQgKSB7CisKKwkJCQkJCWdsLmN1bGxGYWNlKCBnbC5GUk9OVCApOworCisJCQkJ
CX0gZWxzZSB7CisKKwkJCQkJCWdsLmN1bGxGYWNlKCBnbC5GUk9OVF9BTkRfQkFDSyApOworCisJ
CQkJCX0KKworCQkJCX0KKworCQkJfSBlbHNlIHsKKworCQkJCWRpc2FibGUoIGdsLkNVTExfRkFD
RSApOworCisJCQl9CisKKwkJCWN1cnJlbnRDdWxsRmFjZSA9IGN1bGxGYWNlOworCisJCX0KKwor
CQlmdW5jdGlvbiBzZXRMaW5lV2lkdGgoIHdpZHRoICkgeworCisJCQlpZiAoIHdpZHRoICE9PSBj
dXJyZW50TGluZVdpZHRoICkgeworCisJCQkJaWYgKCBsaW5lV2lkdGhBdmFpbGFibGUgKSBnbC5s
aW5lV2lkdGgoIHdpZHRoICk7CisKKwkJCQljdXJyZW50TGluZVdpZHRoID0gd2lkdGg7CisKKwkJ
CX0KKworCQl9CisKKwkJZnVuY3Rpb24gc2V0UG9seWdvbk9mZnNldCggcG9seWdvbk9mZnNldCwg
ZmFjdG9yLCB1bml0cyApIHsKKworCQkJaWYgKCBwb2x5Z29uT2Zmc2V0ICkgeworCisJCQkJZW5h
YmxlKCBnbC5QT0xZR09OX09GRlNFVF9GSUxMICk7CisKKwkJCQlpZiAoIGN1cnJlbnRQb2x5Z29u
T2Zmc2V0RmFjdG9yICE9PSBmYWN0b3IgfHwgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyAhPT0g
dW5pdHMgKSB7CisKKwkJCQkJZ2wucG9seWdvbk9mZnNldCggZmFjdG9yLCB1bml0cyApOworCisJ
CQkJCWN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yOworCQkJCQljdXJyZW50UG9s
eWdvbk9mZnNldFVuaXRzID0gdW5pdHM7CisKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisKKwkJCQlk
aXNhYmxlKCBnbC5QT0xZR09OX09GRlNFVF9GSUxMICk7CisKKwkJCX0KKworCQl9CisKKwkJZnVu
Y3Rpb24gZ2V0U2Npc3NvclRlc3QoKSB7CisKKwkJCXJldHVybiBjdXJyZW50U2Npc3NvclRlc3Q7
CisKKwkJfQorCisJCWZ1bmN0aW9uIHNldFNjaXNzb3JUZXN0KCBzY2lzc29yVGVzdCApIHsKKwor
CQkJY3VycmVudFNjaXNzb3JUZXN0ID0gc2Npc3NvclRlc3Q7CisKKwkJCWlmICggc2Npc3NvclRl
c3QgKSB7CisKKwkJCQllbmFibGUoIGdsLlNDSVNTT1JfVEVTVCApOworCisJCQl9IGVsc2Ugewor
CisJCQkJZGlzYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7CisKKwkJCX0KKworCQl9CisKKwkJLy8g
dGV4dHVyZQorCisJCWZ1bmN0aW9uIGFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApIHsKKworCQkJ
aWYgKCB3ZWJnbFNsb3QgPT09IHVuZGVmaW5lZCApIHdlYmdsU2xvdCA9IGdsLlRFWFRVUkUwICsg
bWF4VGV4dHVyZXMgLSAxOworCisJCQlpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCAhPT0gd2ViZ2xT
bG90ICkgeworCisJCQkJZ2wuYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICk7CisJCQkJY3VycmVu
dFRleHR1cmVTbG90ID0gd2ViZ2xTbG90OworCisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIGJp
bmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSApIHsKKworCQkJaWYgKCBjdXJyZW50
VGV4dHVyZVNsb3QgPT09IG51bGwgKSB7CisKKwkJCQlhY3RpdmVUZXh0dXJlKCk7CisKKwkJCX0K
KworCQkJdmFyIGJvdW5kVGV4dHVyZSA9IGN1cnJlbnRCb3VuZFRleHR1cmVzWyBjdXJyZW50VGV4
dHVyZVNsb3QgXTsKKworCQkJaWYgKCBib3VuZFRleHR1cmUgPT09IHVuZGVmaW5lZCApIHsKKwor
CQkJCWJvdW5kVGV4dHVyZSA9IHsgdHlwZTogdW5kZWZpbmVkLCB0ZXh0dXJlOiB1bmRlZmluZWQg
fTsKKwkJCQljdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF0gPSBib3Vu
ZFRleHR1cmU7CisKKwkJCX0KKworCQkJaWYgKCBib3VuZFRleHR1cmUudHlwZSAhPT0gd2ViZ2xU
eXBlIHx8IGJvdW5kVGV4dHVyZS50ZXh0dXJlICE9PSB3ZWJnbFRleHR1cmUgKSB7CisKKwkJCQln
bC5iaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUgfHwgZW1wdHlUZXh0dXJlc1sg
d2ViZ2xUeXBlIF0gKTsKKworCQkJCWJvdW5kVGV4dHVyZS50eXBlID0gd2ViZ2xUeXBlOworCQkJ
CWJvdW5kVGV4dHVyZS50ZXh0dXJlID0gd2ViZ2xUZXh0dXJlOworCisJCQl9CisKKwkJfQorCisJ
CWZ1bmN0aW9uIGNvbXByZXNzZWRUZXhJbWFnZTJEKCkgeworCisJCQl0cnkgeworCisJCQkJZ2wu
Y29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkoIGdsLCBhcmd1bWVudHMgKTsKKworCQkJfSBjYXRj
aCAoIGVycm9yICkgeworCisJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6Jywg
ZXJyb3IgKTsKKworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiB0ZXhJbWFnZTJEKCkgeworCisJ
CQl0cnkgeworCisJCQkJZ2wudGV4SW1hZ2UyRC5hcHBseSggZ2wsIGFyZ3VtZW50cyApOworCisJ
CQl9IGNhdGNoICggZXJyb3IgKSB7CisKKwkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xT
dGF0ZTonLCBlcnJvciApOworCisJCQl9CisKKwkJfQorCisJCS8vCisKKwkJZnVuY3Rpb24gc2Np
c3Nvciggc2Npc3NvciApIHsKKworCQkJaWYgKCBjdXJyZW50U2Npc3Nvci5lcXVhbHMoIHNjaXNz
b3IgKSA9PT0gZmFsc2UgKSB7CisKKwkJCQlnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3Iu
eSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTsKKwkJCQljdXJyZW50U2Npc3Nvci5jb3B5KCBzY2lz
c29yICk7CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gdmlld3BvcnQoIHZpZXdwb3J0ICkg
eworCisJCQlpZiAoIGN1cnJlbnRWaWV3cG9ydC5lcXVhbHMoIHZpZXdwb3J0ICkgPT09IGZhbHNl
ICkgeworCisJCQkJZ2wudmlld3BvcnQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0
LnosIHZpZXdwb3J0LncgKTsKKwkJCQljdXJyZW50Vmlld3BvcnQuY29weSggdmlld3BvcnQgKTsK
KworCQkJfQorCisJCX0KKworCQkvLworCisJCWZ1bmN0aW9uIHJlc2V0KCkgeworCisJCQlmb3Ig
KCB2YXIgaSA9IDA7IGkgPCBlbmFibGVkQXR0cmlidXRlcy5sZW5ndGg7IGkgKysgKSB7CisKKwkJ
CQlpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPT09IDEgKSB7CisKKwkJCQkJZ2wuZGlzYWJs
ZVZlcnRleEF0dHJpYkFycmF5KCBpICk7CisJCQkJCWVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAw
OworCisJCQkJfQorCisJCQl9CisKKwkJCWNhcGFiaWxpdGllcyA9IHt9OworCisJCQljb21wcmVz
c2VkVGV4dHVyZUZvcm1hdHMgPSBudWxsOworCisJCQljdXJyZW50VGV4dHVyZVNsb3QgPSBudWxs
OworCQkJY3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTsKKworCQkJY3VycmVudEJsZW5kaW5nID0g
bnVsbDsKKworCQkJY3VycmVudEZsaXBTaWRlZCA9IG51bGw7CisJCQljdXJyZW50Q3VsbEZhY2Ug
PSBudWxsOworCisJCQljb2xvckJ1ZmZlci5yZXNldCgpOworCQkJZGVwdGhCdWZmZXIucmVzZXQo
KTsKKwkJCXN0ZW5jaWxCdWZmZXIucmVzZXQoKTsKKworCQl9CisKKwkJcmV0dXJuIHsKKworCQkJ
YnVmZmVyczogeworCQkJCWNvbG9yOiBjb2xvckJ1ZmZlciwKKwkJCQlkZXB0aDogZGVwdGhCdWZm
ZXIsCisJCQkJc3RlbmNpbDogc3RlbmNpbEJ1ZmZlcgorCQkJfSwKKworCQkJaW5pdDogaW5pdCwK
KwkJCWluaXRBdHRyaWJ1dGVzOiBpbml0QXR0cmlidXRlcywKKwkJCWVuYWJsZUF0dHJpYnV0ZTog
ZW5hYmxlQXR0cmlidXRlLAorCQkJZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjogZW5hYmxlQXR0
cmlidXRlQW5kRGl2aXNvciwKKwkJCWRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOiBkaXNhYmxlVW51
c2VkQXR0cmlidXRlcywKKwkJCWVuYWJsZTogZW5hYmxlLAorCQkJZGlzYWJsZTogZGlzYWJsZSwK
KwkJCWdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czogZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3Jt
YXRzLAorCisJCQlzZXRCbGVuZGluZzogc2V0QmxlbmRpbmcsCisJCQlzZXRNYXRlcmlhbDogc2V0
TWF0ZXJpYWwsCisKKwkJCXNldEZsaXBTaWRlZDogc2V0RmxpcFNpZGVkLAorCQkJc2V0Q3VsbEZh
Y2U6IHNldEN1bGxGYWNlLAorCisJCQlzZXRMaW5lV2lkdGg6IHNldExpbmVXaWR0aCwKKwkJCXNl
dFBvbHlnb25PZmZzZXQ6IHNldFBvbHlnb25PZmZzZXQsCisKKwkJCWdldFNjaXNzb3JUZXN0OiBn
ZXRTY2lzc29yVGVzdCwKKwkJCXNldFNjaXNzb3JUZXN0OiBzZXRTY2lzc29yVGVzdCwKKworCQkJ
YWN0aXZlVGV4dHVyZTogYWN0aXZlVGV4dHVyZSwKKwkJCWJpbmRUZXh0dXJlOiBiaW5kVGV4dHVy
ZSwKKwkJCWNvbXByZXNzZWRUZXhJbWFnZTJEOiBjb21wcmVzc2VkVGV4SW1hZ2UyRCwKKwkJCXRl
eEltYWdlMkQ6IHRleEltYWdlMkQsCisKKwkJCXNjaXNzb3I6IHNjaXNzb3IsCisJCQl2aWV3cG9y
dDogdmlld3BvcnQsCisKKwkJCXJlc2V0OiByZXNldAorCisJCX07CisKKwl9CisKKwkvKioKKwkg
KiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24g
V2ViR0xDYXBhYmlsaXRpZXMoIGdsLCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzICkgeworCisJCXZh
ciBtYXhBbmlzb3Ryb3B5OworCisJCWZ1bmN0aW9uIGdldE1heEFuaXNvdHJvcHkoKSB7CisKKwkJ
CWlmICggbWF4QW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIG1heEFuaXNvdHJvcHk7
CisKKwkJCXZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRl
cl9hbmlzb3Ryb3BpYycgKTsKKworCQkJaWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7CisKKwkJ
CQltYXhBbmlzb3Ryb3B5ID0gZ2wuZ2V0UGFyYW1ldGVyKCBleHRlbnNpb24uTUFYX1RFWFRVUkVf
TUFYX0FOSVNPVFJPUFlfRVhUICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQltYXhBbmlzb3Ryb3B5
ID0gMDsKKworCQkJfQorCisJCQlyZXR1cm4gbWF4QW5pc290cm9weTsKKworCQl9CisKKwkJZnVu
Y3Rpb24gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKSB7CisKKwkJCWlmICggcHJlY2lzaW9u
ID09PSAnaGlnaHAnICkgeworCisJCQkJaWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQo
IGdsLlZFUlRFWF9TSEFERVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmCisJCQkJ
ICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wu
SElHSF9GTE9BVCApLnByZWNpc2lvbiA+IDAgKSB7CisKKwkJCQkJcmV0dXJuICdoaWdocCc7CisK
KwkJCQl9CisKKwkJCQlwcmVjaXNpb24gPSAnbWVkaXVtcCc7CisKKwkJCX0KKworCQkJaWYgKCBw
cmVjaXNpb24gPT09ICdtZWRpdW1wJyApIHsKKworCQkJCWlmICggZ2wuZ2V0U2hhZGVyUHJlY2lz
aW9uRm9ybWF0KCBnbC5WRVJURVhfU0hBREVSLCBnbC5NRURJVU1fRkxPQVQgKS5wcmVjaXNpb24g
PiAwICYmCisJCQkJICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5U
X1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHsKKworCQkJCQlyZXR1
cm4gJ21lZGl1bXAnOworCisJCQkJfQorCisJCQl9CisKKwkJCXJldHVybiAnbG93cCc7CisKKwkJ
fQorCisJCXZhciBwcmVjaXNpb24gPSBwYXJhbWV0ZXJzLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVk
ID8gcGFyYW1ldGVycy5wcmVjaXNpb24gOiAnaGlnaHAnOworCQl2YXIgbWF4UHJlY2lzaW9uID0g
Z2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKTsKKworCQlpZiAoIG1heFByZWNpc2lvbiAhPT0g
cHJlY2lzaW9uICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOics
IHByZWNpc2lvbiwgJ25vdCBzdXBwb3J0ZWQsIHVzaW5nJywgbWF4UHJlY2lzaW9uLCAnaW5zdGVh
ZC4nICk7CisJCQlwcmVjaXNpb24gPSBtYXhQcmVjaXNpb247CisKKwkJfQorCisJCXZhciBsb2dh
cml0aG1pY0RlcHRoQnVmZmVyID0gcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID09
PSB0cnVlICYmICEhIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICk7CisKKwkJdmFy
IG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklU
UyApOworCQl2YXIgbWF4VmVydGV4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9W
RVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyApOworCQl2YXIgbWF4VGV4dHVyZVNpemUgPSBnbC5n
ZXRQYXJhbWV0ZXIoIGdsLk1BWF9URVhUVVJFX1NJWkUgKTsKKwkJdmFyIG1heEN1YmVtYXBTaXpl
ID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICk7CisKKwkJ
dmFyIG1heEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfQVRUUklC
UyApOworCQl2YXIgbWF4VmVydGV4VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9W
RVJURVhfVU5JRk9STV9WRUNUT1JTICk7CisJCXZhciBtYXhWYXJ5aW5ncyA9IGdsLmdldFBhcmFt
ZXRlciggZ2wuTUFYX1ZBUllJTkdfVkVDVE9SUyApOworCQl2YXIgbWF4RnJhZ21lbnRVbmlmb3Jt
cyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyApOwor
CisJCXZhciB2ZXJ0ZXhUZXh0dXJlcyA9IG1heFZlcnRleFRleHR1cmVzID4gMDsKKwkJdmFyIGZs
b2F0RnJhZ21lbnRUZXh0dXJlcyA9ICEhIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxv
YXQnICk7CisJCXZhciBmbG9hdFZlcnRleFRleHR1cmVzID0gdmVydGV4VGV4dHVyZXMgJiYgZmxv
YXRGcmFnbWVudFRleHR1cmVzOworCisJCXJldHVybiB7CisKKwkJCWdldE1heEFuaXNvdHJvcHk6
IGdldE1heEFuaXNvdHJvcHksCisJCQlnZXRNYXhQcmVjaXNpb246IGdldE1heFByZWNpc2lvbiwK
KworCQkJcHJlY2lzaW9uOiBwcmVjaXNpb24sCisJCQlsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiBs
b2dhcml0aG1pY0RlcHRoQnVmZmVyLAorCisJCQltYXhUZXh0dXJlczogbWF4VGV4dHVyZXMsCisJ
CQltYXhWZXJ0ZXhUZXh0dXJlczogbWF4VmVydGV4VGV4dHVyZXMsCisJCQltYXhUZXh0dXJlU2l6
ZTogbWF4VGV4dHVyZVNpemUsCisJCQltYXhDdWJlbWFwU2l6ZTogbWF4Q3ViZW1hcFNpemUsCisK
KwkJCW1heEF0dHJpYnV0ZXM6IG1heEF0dHJpYnV0ZXMsCisJCQltYXhWZXJ0ZXhVbmlmb3Jtczog
bWF4VmVydGV4VW5pZm9ybXMsCisJCQltYXhWYXJ5aW5nczogbWF4VmFyeWluZ3MsCisJCQltYXhG
cmFnbWVudFVuaWZvcm1zOiBtYXhGcmFnbWVudFVuaWZvcm1zLAorCisJCQl2ZXJ0ZXhUZXh0dXJl
czogdmVydGV4VGV4dHVyZXMsCisJCQlmbG9hdEZyYWdtZW50VGV4dHVyZXM6IGZsb2F0RnJhZ21l
bnRUZXh0dXJlcywKKwkJCWZsb2F0VmVydGV4VGV4dHVyZXM6IGZsb2F0VmVydGV4VGV4dHVyZXMK
KworCQl9OworCisJfQorCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29i
LmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEFycmF5Q2FtZXJhKCBhcnJheSApIHsKKworCQlQZXJz
cGVjdGl2ZUNhbWVyYS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy5jYW1lcmFzID0gYXJyYXkgfHwg
W107CisKKwl9CisKKwlBcnJheUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmpl
Y3QuY3JlYXRlKCBQZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVj
dG9yOiBBcnJheUNhbWVyYSwKKworCQlpc0FycmF5Q2FtZXJhOiB0cnVlCisKKwl9ICk7CisKKwkv
KioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVu
Y3Rpb24gV2ViVlJNYW5hZ2VyKCByZW5kZXJlciApIHsKKworCQl2YXIgc2NvcGUgPSB0aGlzOwor
CisJCXZhciBkZXZpY2UgPSBudWxsOworCQl2YXIgZnJhbWVEYXRhID0gbnVsbDsKKworCQlpZiAo
ICdWUkZyYW1lRGF0YScgaW4gd2luZG93ICkgeworCisJCQlmcmFtZURhdGEgPSBuZXcgd2luZG93
LlZSRnJhbWVEYXRhKCk7CisKKwkJfQorCisJCXZhciBtYXRyaXhXb3JsZEludmVyc2UgPSBuZXcg
TWF0cml4NCgpOworCisJCXZhciBzdGFuZGluZ01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CisJCXZh
ciBzdGFuZGluZ01hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpOworCisJCXZhciBjYW1lcmFM
ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7CisJCWNhbWVyYUwuYm91bmRzID0gbmV3IFZlY3Rv
cjQoIDAuMCwgMC4wLCAwLjUsIDEuMCApOworCQljYW1lcmFMLmxheWVycy5lbmFibGUoIDEgKTsK
KworCQl2YXIgY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpOworCQljYW1lcmFSLmJv
dW5kcyA9IG5ldyBWZWN0b3I0KCAwLjUsIDAuMCwgMC41LCAxLjAgKTsKKwkJY2FtZXJhUi5sYXll
cnMuZW5hYmxlKCAyICk7CisKKwkJdmFyIGNhbWVyYVZSID0gbmV3IEFycmF5Q2FtZXJhKCBbIGNh
bWVyYUwsIGNhbWVyYVIgXSApOworCQljYW1lcmFWUi5sYXllcnMuZW5hYmxlKCAxICk7CisJCWNh
bWVyYVZSLmxheWVycy5lbmFibGUoIDIgKTsKKworCQkvLworCisJCXZhciBjdXJyZW50U2l6ZSwg
Y3VycmVudFBpeGVsUmF0aW87CisKKwkJZnVuY3Rpb24gb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdl
KCkgeworCisJCQlpZiAoIGRldmljZS5pc1ByZXNlbnRpbmcgKSB7CisKKwkJCQl2YXIgZXllUGFy
YW1ldGVycyA9IGRldmljZS5nZXRFeWVQYXJhbWV0ZXJzKCAnbGVmdCcgKTsKKwkJCQl2YXIgcmVu
ZGVyV2lkdGggPSBleWVQYXJhbWV0ZXJzLnJlbmRlcldpZHRoOworCQkJCXZhciByZW5kZXJIZWln
aHQgPSBleWVQYXJhbWV0ZXJzLnJlbmRlckhlaWdodDsKKworCQkJCWN1cnJlbnRQaXhlbFJhdGlv
ID0gcmVuZGVyZXIuZ2V0UGl4ZWxSYXRpbygpOworCQkJCWN1cnJlbnRTaXplID0gcmVuZGVyZXIu
Z2V0U2l6ZSgpOworCisJCQkJcmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIHJlbmRlcldp
ZHRoICogMiwgcmVuZGVySGVpZ2h0LCAxICk7CisKKwkJCX0gZWxzZSBpZiAoIHNjb3BlLmVuYWJs
ZWQgKSB7CisKKwkJCQlyZW5kZXJlci5zZXREcmF3aW5nQnVmZmVyU2l6ZSggY3VycmVudFNpemUu
d2lkdGgsIGN1cnJlbnRTaXplLmhlaWdodCwgY3VycmVudFBpeGVsUmF0aW8gKTsKKworCQkJfQor
CisJCX0KKworCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3ZyZGlzcGxheXByZXNlbnRjaGFu
Z2UnLCBvblZSRGlzcGxheVByZXNlbnRDaGFuZ2UsIGZhbHNlICk7CisKKwkJLy8KKworCQl0aGlz
LmVuYWJsZWQgPSBmYWxzZTsKKwkJdGhpcy5zdGFuZGluZyA9IGZhbHNlOworCisJCXRoaXMuZ2V0
RGV2aWNlID0gZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gZGV2aWNlOworCisJCX07CisKKwkJ
dGhpcy5zZXREZXZpY2UgPSBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQlpZiAoIHZhbHVlICE9
PSB1bmRlZmluZWQgKSBkZXZpY2UgPSB2YWx1ZTsKKworCQl9OworCisJCXRoaXMuZ2V0Q2FtZXJh
ID0gZnVuY3Rpb24gKCBjYW1lcmEgKSB7CisKKwkJCWlmICggZGV2aWNlID09PSBudWxsICkgcmV0
dXJuIGNhbWVyYTsKKworCQkJZGV2aWNlLmRlcHRoTmVhciA9IGNhbWVyYS5uZWFyOworCQkJZGV2
aWNlLmRlcHRoRmFyID0gY2FtZXJhLmZhcjsKKworCQkJZGV2aWNlLmdldEZyYW1lRGF0YSggZnJh
bWVEYXRhICk7CisKKwkJCS8vCisKKwkJCXZhciBwb3NlID0gZnJhbWVEYXRhLnBvc2U7CisKKwkJ
CWlmICggcG9zZS5wb3NpdGlvbiAhPT0gbnVsbCApIHsKKworCQkJCWNhbWVyYS5wb3NpdGlvbi5m
cm9tQXJyYXkoIHBvc2UucG9zaXRpb24gKTsKKworCQkJfSBlbHNlIHsKKworCQkJCWNhbWVyYS5w
b3NpdGlvbi5zZXQoIDAsIDAsIDAgKTsKKworCQkJfQorCisJCQlpZiAoIHBvc2Uub3JpZW50YXRp
b24gIT09IG51bGwgKSB7CisKKwkJCQljYW1lcmEucXVhdGVybmlvbi5mcm9tQXJyYXkoIHBvc2Uu
b3JpZW50YXRpb24gKTsKKworCQkJfQorCisJCQljYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTsK
KworCQkJdmFyIHN0YWdlUGFyYW1ldGVycyA9IGRldmljZS5zdGFnZVBhcmFtZXRlcnM7CisKKwkJ
CWlmICggdGhpcy5zdGFuZGluZyAmJiBzdGFnZVBhcmFtZXRlcnMgKSB7CisKKwkJCQlzdGFuZGlu
Z01hdHJpeC5mcm9tQXJyYXkoIHN0YWdlUGFyYW1ldGVycy5zaXR0aW5nVG9TdGFuZGluZ1RyYW5z
Zm9ybSApOworCQkJCXN0YW5kaW5nTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBzdGFuZGluZ01h
dHJpeCApOworCisJCQkJY2FtZXJhLm1hdHJpeFdvcmxkLm11bHRpcGx5KCBzdGFuZGluZ01hdHJp
eCApOworCQkJCWNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIHN0YW5kaW5nTWF0
cml4SW52ZXJzZSApOworCisJCQl9CisKKwkJCWlmICggZGV2aWNlLmlzUHJlc2VudGluZyA9PT0g
ZmFsc2UgKSByZXR1cm4gY2FtZXJhOworCisJCQkvLworCisJCQljYW1lcmFWUi5tYXRyaXhXb3Js
ZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKTsKKwkJCWNhbWVyYVZSLm1hdHJpeFdvcmxkSW52
ZXJzZS5jb3B5KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7CisKKwkJCWNhbWVyYUwubWF0
cml4V29ybGRJbnZlcnNlLmZyb21BcnJheSggZnJhbWVEYXRhLmxlZnRWaWV3TWF0cml4ICk7CisJ
CQljYW1lcmFSLm1hdHJpeFdvcmxkSW52ZXJzZS5mcm9tQXJyYXkoIGZyYW1lRGF0YS5yaWdodFZp
ZXdNYXRyaXggKTsKKworCQkJaWYgKCB0aGlzLnN0YW5kaW5nICYmIHN0YWdlUGFyYW1ldGVycyAp
IHsKKworCQkJCWNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBzdGFuZGluZ01h
dHJpeEludmVyc2UgKTsKKwkJCQljYW1lcmFSLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseSgg
c3RhbmRpbmdNYXRyaXhJbnZlcnNlICk7CisKKwkJCX0KKworCQkJdmFyIHBhcmVudCA9IGNhbWVy
YS5wYXJlbnQ7CisKKwkJCWlmICggcGFyZW50ICE9PSBudWxsICkgeworCisJCQkJbWF0cml4V29y
bGRJbnZlcnNlLmdldEludmVyc2UoIHBhcmVudC5tYXRyaXhXb3JsZCApOworCisJCQkJY2FtZXJh
TC5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIG1hdHJpeFdvcmxkSW52ZXJzZSApOworCQkJ
CWNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2Ug
KTsKKworCQkJfQorCisJCQkvLyBlbnZNYXAgYW5kIE1pcnJvciBuZWVkcyBjYW1lcmEubWF0cml4
V29ybGQKKworCQkJY2FtZXJhTC5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCBjYW1lcmFMLm1hdHJp
eFdvcmxkSW52ZXJzZSApOworCQkJY2FtZXJhUi5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCBjYW1l
cmFSLm1hdHJpeFdvcmxkSW52ZXJzZSApOworCisJCQljYW1lcmFMLnByb2plY3Rpb25NYXRyaXgu
ZnJvbUFycmF5KCBmcmFtZURhdGEubGVmdFByb2plY3Rpb25NYXRyaXggKTsKKwkJCWNhbWVyYVIu
cHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5yaWdodFByb2plY3Rpb25NYXRy
aXggKTsKKworCQkJLy8gSEFDSyBAbXJkb29iCisJCQkvLyBodHRwczovL2dpdGh1Yi5jb20vdzNj
L3dlYnZyL2lzc3Vlcy8yMDMKKworCQkJY2FtZXJhVlIucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBj
YW1lcmFMLnByb2plY3Rpb25NYXRyaXggKTsKKworCQkJLy8KKworCQkJdmFyIGxheWVycyA9IGRl
dmljZS5nZXRMYXllcnMoKTsKKworCQkJaWYgKCBsYXllcnMubGVuZ3RoICkgeworCisJCQkJdmFy
IGxheWVyID0gbGF5ZXJzWyAwIF07CisKKwkJCQlpZiAoIGxheWVyLmxlZnRCb3VuZHMgIT09IG51
bGwgJiYgbGF5ZXIubGVmdEJvdW5kcy5sZW5ndGggPT09IDQgKSB7CisKKwkJCQkJY2FtZXJhTC5i
b3VuZHMuZnJvbUFycmF5KCBsYXllci5sZWZ0Qm91bmRzICk7CisKKwkJCQl9CisKKwkJCQlpZiAo
IGxheWVyLnJpZ2h0Qm91bmRzICE9PSBudWxsICYmIGxheWVyLnJpZ2h0Qm91bmRzLmxlbmd0aCA9
PT0gNCApIHsKKworCQkJCQljYW1lcmFSLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLnJpZ2h0Qm91
bmRzICk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuIGNhbWVyYVZSOworCisJCX07CisK
KwkJdGhpcy5nZXRTdGFuZGluZ01hdHJpeCA9IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHN0
YW5kaW5nTWF0cml4OworCisJCX07CisKKwkJdGhpcy5zdWJtaXRGcmFtZSA9IGZ1bmN0aW9uICgp
IHsKKworCQkJaWYgKCBkZXZpY2UgJiYgZGV2aWNlLmlzUHJlc2VudGluZyApIGRldmljZS5zdWJt
aXRGcmFtZSgpOworCisJCX07CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0
dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gV2ViR0xFeHRlbnNpb25zKCBnbCAp
IHsKKworCQl2YXIgZXh0ZW5zaW9ucyA9IHt9OworCisJCXJldHVybiB7CisKKwkJCWdldDogZnVu
Y3Rpb24gKCBuYW1lICkgeworCisJCQkJaWYgKCBleHRlbnNpb25zWyBuYW1lIF0gIT09IHVuZGVm
aW5lZCApIHsKKworCQkJCQlyZXR1cm4gZXh0ZW5zaW9uc1sgbmFtZSBdOworCisJCQkJfQorCisJ
CQkJdmFyIGV4dGVuc2lvbjsKKworCQkJCXN3aXRjaCAoIG5hbWUgKSB7CisKKwkJCQkJY2FzZSAn
V0VCR0xfZGVwdGhfdGV4dHVyZSc6CisJCQkJCQlleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24o
ICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9k
ZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9kZXB0aF90
ZXh0dXJlJyApOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAnRVhUX3RleHR1cmVfZmlsdGVy
X2FuaXNvdHJvcGljJzoKKwkJCQkJCWV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ0VYVF90
ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfRVhU
X3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJ
VF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7CisJCQkJCQlicmVhazsKKworCQkJ
CQljYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Yyc6CisJCQkJCQlleHRlbnNpb24g
PSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fCBn
bC5nZXRFeHRlbnNpb24oICdNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwg
Z2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyAp
OworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2
cnRjJzoKKwkJCQkJCWV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNz
ZWRfdGV4dHVyZV9wdnJ0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29t
cHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAnV0VC
R0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnOgorCQkJCQkJZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0
ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnICk7CisJCQkJCQlicmVhazsK
KworCQkJCQlkZWZhdWx0OgorCQkJCQkJZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCBuYW1l
ICk7CisKKwkJCQl9CisKKwkJCQlpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHsKKworCQkJCQlj
b25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAnICsgbmFtZSArICcgZXh0ZW5zaW9u
IG5vdCBzdXBwb3J0ZWQuJyApOworCisJCQkJfQorCisJCQkJZXh0ZW5zaW9uc1sgbmFtZSBdID0g
ZXh0ZW5zaW9uOworCisJCQkJcmV0dXJuIGV4dGVuc2lvbjsKKworCQkJfQorCisJCX07CisKKwl9
CisKKwkvKioKKwkgKiBAYXV0aG9yIHRzY2h3CisJICovCisKKwlmdW5jdGlvbiBXZWJHTENsaXBw
aW5nKCkgeworCisJCXZhciBzY29wZSA9IHRoaXMsCisKKwkJCWdsb2JhbFN0YXRlID0gbnVsbCwK
KwkJCW51bUdsb2JhbFBsYW5lcyA9IDAsCisJCQlsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNl
LAorCQkJcmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlLAorCisJCQlwbGFuZSA9IG5ldyBQbGFuZSgp
LAorCQkJdmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksCisKKwkJCXVuaWZvcm0gPSB7
IHZhbHVlOiBudWxsLCBuZWVkc1VwZGF0ZTogZmFsc2UgfTsKKworCQl0aGlzLnVuaWZvcm0gPSB1
bmlmb3JtOworCQl0aGlzLm51bVBsYW5lcyA9IDA7CisJCXRoaXMubnVtSW50ZXJzZWN0aW9uID0g
MDsKKworCQl0aGlzLmluaXQgPSBmdW5jdGlvbiggcGxhbmVzLCBlbmFibGVMb2NhbENsaXBwaW5n
LCBjYW1lcmEgKSB7CisKKwkJCXZhciBlbmFibGVkID0KKwkJCQlwbGFuZXMubGVuZ3RoICE9PSAw
IHx8CisJCQkJZW5hYmxlTG9jYWxDbGlwcGluZyB8fAorCQkJCS8vIGVuYWJsZSBzdGF0ZSBvZiBw
cmV2aW91cyBmcmFtZSAtIHRoZSBjbGlwcGluZyBjb2RlIGhhcyB0bworCQkJCS8vIHJ1biBhbm90
aGVyIGZyYW1lIGluIG9yZGVyIHRvIHJlc2V0IHRoZSBzdGF0ZToKKwkJCQludW1HbG9iYWxQbGFu
ZXMgIT09IDAgfHwKKwkJCQlsb2NhbENsaXBwaW5nRW5hYmxlZDsKKworCQkJbG9jYWxDbGlwcGlu
Z0VuYWJsZWQgPSBlbmFibGVMb2NhbENsaXBwaW5nOworCisJCQlnbG9iYWxTdGF0ZSA9IHByb2pl
Y3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCAwICk7CisJCQludW1HbG9iYWxQbGFuZXMgPSBwbGFu
ZXMubGVuZ3RoOworCisJCQlyZXR1cm4gZW5hYmxlZDsKKworCQl9OworCisJCXRoaXMuYmVnaW5T
aGFkb3dzID0gZnVuY3Rpb24oKSB7CisKKwkJCXJlbmRlcmluZ1NoYWRvd3MgPSB0cnVlOworCQkJ
cHJvamVjdFBsYW5lcyggbnVsbCApOworCisJCX07CisKKwkJdGhpcy5lbmRTaGFkb3dzID0gZnVu
Y3Rpb24oKSB7CisKKwkJCXJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTsKKwkJCXJlc2V0R2xvYmFs
U3RhdGUoKTsKKworCQl9OworCisJCXRoaXMuc2V0U3RhdGUgPSBmdW5jdGlvbiggcGxhbmVzLCBj
bGlwSW50ZXJzZWN0aW9uLCBjbGlwU2hhZG93cywgY2FtZXJhLCBjYWNoZSwgZnJvbUNhY2hlICkg
eworCisJCQlpZiAoICEgbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwKKwkJCQkJcGxhbmVzID09PSBu
dWxsIHx8IHBsYW5lcy5sZW5ndGggPT09IDAgfHwKKwkJCQkJcmVuZGVyaW5nU2hhZG93cyAmJiAh
IGNsaXBTaGFkb3dzICkgeworCQkJCS8vIHRoZXJlJ3Mgbm8gbG9jYWwgY2xpcHBpbmcKKworCQkJ
CWlmICggcmVuZGVyaW5nU2hhZG93cyApIHsKKwkJCQkJLy8gdGhlcmUncyBubyBnbG9iYWwgY2xp
cHBpbmcKKworCQkJCQlwcm9qZWN0UGxhbmVzKCBudWxsICk7CisKKwkJCQl9IGVsc2UgeworCisJ
CQkJCXJlc2V0R2xvYmFsU3RhdGUoKTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisKKwkJCQl2YXIg
bkdsb2JhbCA9IHJlbmRlcmluZ1NoYWRvd3MgPyAwIDogbnVtR2xvYmFsUGxhbmVzLAorCQkJCQls
R2xvYmFsID0gbkdsb2JhbCAqIDQsCisKKwkJCQkJZHN0QXJyYXkgPSBjYWNoZS5jbGlwcGluZ1N0
YXRlIHx8IG51bGw7CisKKwkJCQl1bmlmb3JtLnZhbHVlID0gZHN0QXJyYXk7IC8vIGVuc3VyZSB1
bmlxdWUgc3RhdGUKKworCQkJCWRzdEFycmF5ID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1l
cmEsIGxHbG9iYWwsIGZyb21DYWNoZSApOworCisJCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBs
R2xvYmFsOyArKyBpICkgeworCisJCQkJCWRzdEFycmF5WyBpIF0gPSBnbG9iYWxTdGF0ZVsgaSBd
OworCisJCQkJfQorCisJCQkJY2FjaGUuY2xpcHBpbmdTdGF0ZSA9IGRzdEFycmF5OworCQkJCXRo
aXMubnVtSW50ZXJzZWN0aW9uID0gY2xpcEludGVyc2VjdGlvbiA/IHRoaXMubnVtUGxhbmVzIDog
MDsKKwkJCQl0aGlzLm51bVBsYW5lcyArPSBuR2xvYmFsOworCisJCQl9CisKKworCQl9OworCisJ
CWZ1bmN0aW9uIHJlc2V0R2xvYmFsU3RhdGUoKSB7CisKKwkJCWlmICggdW5pZm9ybS52YWx1ZSAh
PT0gZ2xvYmFsU3RhdGUgKSB7CisKKwkJCQl1bmlmb3JtLnZhbHVlID0gZ2xvYmFsU3RhdGU7CisJ
CQkJdW5pZm9ybS5uZWVkc1VwZGF0ZSA9IG51bUdsb2JhbFBsYW5lcyA+IDA7CisKKwkJCX0KKwor
CQkJc2NvcGUubnVtUGxhbmVzID0gbnVtR2xvYmFsUGxhbmVzOworCQkJc2NvcGUubnVtSW50ZXJz
ZWN0aW9uID0gMDsKKworCQl9CisKKwkJZnVuY3Rpb24gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBj
YW1lcmEsIGRzdE9mZnNldCwgc2tpcFRyYW5zZm9ybSApIHsKKworCQkJdmFyIG5QbGFuZXMgPSBw
bGFuZXMgIT09IG51bGwgPyBwbGFuZXMubGVuZ3RoIDogMCwKKwkJCQlkc3RBcnJheSA9IG51bGw7
CisKKwkJCWlmICggblBsYW5lcyAhPT0gMCApIHsKKworCQkJCWRzdEFycmF5ID0gdW5pZm9ybS52
YWx1ZTsKKworCQkJCWlmICggc2tpcFRyYW5zZm9ybSAhPT0gdHJ1ZSB8fCBkc3RBcnJheSA9PT0g
bnVsbCApIHsKKworCQkJCQl2YXIgZmxhdFNpemUgPSBkc3RPZmZzZXQgKyBuUGxhbmVzICogNCwK
KwkJCQkJCXZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlOworCisJCQkJCXZp
ZXdOb3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB2aWV3TWF0cml4ICk7CisKKwkJCQkJaWYg
KCBkc3RBcnJheSA9PT0gbnVsbCB8fCBkc3RBcnJheS5sZW5ndGggPCBmbGF0U2l6ZSApIHsKKwor
CQkJCQkJZHN0QXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBmbGF0U2l6ZSApOworCisJCQkJCX0K
KworCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGk0ID0gZHN0T2Zmc2V0OworCQkJCQkJCQkJCWkgIT09
IG5QbGFuZXM7ICsrIGksIGk0ICs9IDQgKSB7CisKKwkJCQkJCXBsYW5lLmNvcHkoIHBsYW5lc1sg
aSBdICkuCisJCQkJCQkJCWFwcGx5TWF0cml4NCggdmlld01hdHJpeCwgdmlld05vcm1hbE1hdHJp
eCApOworCisJCQkJCQlwbGFuZS5ub3JtYWwudG9BcnJheSggZHN0QXJyYXksIGk0ICk7CisJCQkJ
CQlkc3RBcnJheVsgaTQgKyAzIF0gPSBwbGFuZS5jb25zdGFudDsKKworCQkJCQl9CisKKwkJCQl9
CisKKwkJCQl1bmlmb3JtLnZhbHVlID0gZHN0QXJyYXk7CisJCQkJdW5pZm9ybS5uZWVkc1VwZGF0
ZSA9IHRydWU7CisKKwkJCX0KKworCQkJc2NvcGUubnVtUGxhbmVzID0gblBsYW5lczsKKwkJCQor
CQkJcmV0dXJuIGRzdEFycmF5OworCisJCX0KKworCX0KKworCS8vIGltcG9ydCB7IFNwaGVyZSB9
IGZyb20gJy4uL21hdGgvU3BoZXJlJzsKKwkvKioKKwkgKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAv
IGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrLworCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDov
L21yZG9vYi5jb20vCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlh
LmNvbS8KKwkgKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvCisJ
ICogQGF1dGhvciB0c2NodworCSAqLworCisJZnVuY3Rpb24gV2ViR0xSZW5kZXJlciggcGFyYW1l
dGVycyApIHsKKworCQljb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXInLCBSRVZJU0lP
TiApOworCisJCXBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9OworCisJCXZhciBfY2FudmFz
ID0gcGFyYW1ldGVycy5jYW52YXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuY2FudmFzIDog
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcs
ICdjYW52YXMnICksCisJCQlfY29udGV4dCA9IHBhcmFtZXRlcnMuY29udGV4dCAhPT0gdW5kZWZp
bmVkID8gcGFyYW1ldGVycy5jb250ZXh0IDogbnVsbCwKKworCQkJX2FscGhhID0gcGFyYW1ldGVy
cy5hbHBoYSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5hbHBoYSA6IGZhbHNlLAorCQkJX2Rl
cHRoID0gcGFyYW1ldGVycy5kZXB0aCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5kZXB0aCA6
IHRydWUsCisJCQlfc3RlbmNpbCA9IHBhcmFtZXRlcnMuc3RlbmNpbCAhPT0gdW5kZWZpbmVkID8g
cGFyYW1ldGVycy5zdGVuY2lsIDogdHJ1ZSwKKwkJCV9hbnRpYWxpYXMgPSBwYXJhbWV0ZXJzLmFu
dGlhbGlhcyAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5hbnRpYWxpYXMgOiBmYWxzZSwKKwkJ
CV9wcmVtdWx0aXBsaWVkQWxwaGEgPSBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSAhPT0g
dW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgOiB0cnVlLAorCQkJX3By
ZXNlcnZlRHJhd2luZ0J1ZmZlciA9IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyICE9
PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciA6IGZhbHNlOwor
CisJCXZhciBsaWdodHMgPSBbXTsKKworCQl2YXIgY3VycmVudFJlbmRlckxpc3QgPSBudWxsOwor
CisJCXZhciBtb3JwaEluZmx1ZW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KCA4ICk7CisKKwkJdmFy
IHNwcml0ZXMgPSBbXTsKKwkJdmFyIGxlbnNGbGFyZXMgPSBbXTsKKworCQkvLyBwdWJsaWMgcHJv
cGVydGllcworCisJCXRoaXMuZG9tRWxlbWVudCA9IF9jYW52YXM7CisJCXRoaXMuY29udGV4dCA9
IG51bGw7CisKKwkJLy8gY2xlYXJpbmcKKworCQl0aGlzLmF1dG9DbGVhciA9IHRydWU7CisJCXRo
aXMuYXV0b0NsZWFyQ29sb3IgPSB0cnVlOworCQl0aGlzLmF1dG9DbGVhckRlcHRoID0gdHJ1ZTsK
KwkJdGhpcy5hdXRvQ2xlYXJTdGVuY2lsID0gdHJ1ZTsKKworCQkvLyBzY2VuZSBncmFwaAorCisJ
CXRoaXMuc29ydE9iamVjdHMgPSB0cnVlOworCisJCS8vIHVzZXItZGVmaW5lZCBjbGlwcGluZwor
CisJCXRoaXMuY2xpcHBpbmdQbGFuZXMgPSBbXTsKKwkJdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxl
ZCA9IGZhbHNlOworCisJCS8vIHBoeXNpY2FsbHkgYmFzZWQgc2hhZGluZworCisJCXRoaXMuZ2Ft
bWFGYWN0b3IgPSAyLjA7CS8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorCQl0aGlzLmdh
bW1hSW5wdXQgPSBmYWxzZTsKKwkJdGhpcy5nYW1tYU91dHB1dCA9IGZhbHNlOworCisJCS8vIHBo
eXNpY2FsIGxpZ2h0cworCisJCXRoaXMucGh5c2ljYWxseUNvcnJlY3RMaWdodHMgPSBmYWxzZTsK
KworCQkvLyB0b25lIG1hcHBpbmcKKworCQl0aGlzLnRvbmVNYXBwaW5nID0gTGluZWFyVG9uZU1h
cHBpbmc7CisJCXRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZSA9IDEuMDsKKwkJdGhpcy50b25lTWFw
cGluZ1doaXRlUG9pbnQgPSAxLjA7CisKKwkJLy8gbW9ycGhzCisKKwkJdGhpcy5tYXhNb3JwaFRh
cmdldHMgPSA4OworCQl0aGlzLm1heE1vcnBoTm9ybWFscyA9IDQ7CisKKwkJLy8gaW50ZXJuYWwg
cHJvcGVydGllcworCisJCXZhciBfdGhpcyA9IHRoaXMsCisKKwkJCS8vIGludGVybmFsIHN0YXRl
IGNhY2hlCisKKwkJCV9jdXJyZW50UHJvZ3JhbSA9IG51bGwsCisJCQlfY3VycmVudFJlbmRlclRh
cmdldCA9IG51bGwsCisJCQlfY3VycmVudEZyYW1lYnVmZmVyID0gbnVsbCwKKwkJCV9jdXJyZW50
TWF0ZXJpYWxJZCA9IC0gMSwKKwkJCV9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gJycsCisKKwkJ
CV9jdXJyZW50Q2FtZXJhID0gbnVsbCwKKwkJCV9jdXJyZW50QXJyYXlDYW1lcmEgPSBudWxsLAor
CisJCQlfY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCgpLAorCQkJX2N1cnJlbnRTY2lzc29y
VGVzdCA9IG51bGwsCisKKwkJCV9jdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpLAorCisJ
CQkvLworCisJCQlfdXNlZFRleHR1cmVVbml0cyA9IDAsCisKKwkJCS8vCisKKwkJCV93aWR0aCA9
IF9jYW52YXMud2lkdGgsCisJCQlfaGVpZ2h0ID0gX2NhbnZhcy5oZWlnaHQsCisKKwkJCV9waXhl
bFJhdGlvID0gMSwKKworCQkJX3NjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBf
aGVpZ2h0ICksCisJCQlfc2Npc3NvclRlc3QgPSBmYWxzZSwKKworCQkJX3ZpZXdwb3J0ID0gbmV3
IFZlY3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApLAorCisJCQkvLyBmcnVzdHVtCisKKwkJ
CV9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSwKKworCQkJLy8gY2xpcHBpbmcKKworCQkJX2NsaXBw
aW5nID0gbmV3IFdlYkdMQ2xpcHBpbmcoKSwKKwkJCV9jbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSwK
KwkJCV9sb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLAorCisJCQkvLyBjYW1lcmEgbWF0cmlj
ZXMgY2FjaGUKKworCQkJX3Byb2pTY3JlZW5NYXRyaXggPSBuZXcgTWF0cml4NCgpLAorCisJCQlf
dmVjdG9yMyA9IG5ldyBWZWN0b3IzKCksCisJCQlfbWF0cml4NCA9IG5ldyBNYXRyaXg0KCksCisJ
CQlfbWF0cml4NDIgPSBuZXcgTWF0cml4NCgpLAorCisJCQkvLyBsaWdodCBhcnJheXMgY2FjaGUK
KworCQkJX2xpZ2h0cyA9IHsKKworCQkJCWhhc2g6ICcnLAorCisJCQkJYW1iaWVudDogWyAwLCAw
LCAwIF0sCisJCQkJZGlyZWN0aW9uYWw6IFtdLAorCQkJCWRpcmVjdGlvbmFsU2hhZG93TWFwOiBb
XSwKKwkJCQlkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDogW10sCisJCQkJc3BvdDogW10sCisJCQkJ
c3BvdFNoYWRvd01hcDogW10sCisJCQkJc3BvdFNoYWRvd01hdHJpeDogW10sCisJCQkJcmVjdEFy
ZWE6IFtdLAorCQkJCXBvaW50OiBbXSwKKwkJCQlwb2ludFNoYWRvd01hcDogW10sCisJCQkJcG9p
bnRTaGFkb3dNYXRyaXg6IFtdLAorCQkJCWhlbWk6IFtdLAorCisJCQkJc2hhZG93czogW10KKwor
CQkJfSwKKworCQkJLy8gaW5mbworCisJCQlfaW5mb01lbW9yeSA9IHsKKwkJCQlnZW9tZXRyaWVz
OiAwLAorCQkJCXRleHR1cmVzOiAwCisJCQl9LAorCisJCQlfaW5mb1JlbmRlciA9IHsKKworCQkJ
CWZyYW1lOiAwLAorCQkJCWNhbGxzOiAwLAorCQkJCXZlcnRpY2VzOiAwLAorCQkJCWZhY2VzOiAw
LAorCQkJCXBvaW50czogMAorCisJCQl9OworCisJCXRoaXMuaW5mbyA9IHsKKworCQkJcmVuZGVy
OiBfaW5mb1JlbmRlciwKKwkJCW1lbW9yeTogX2luZm9NZW1vcnksCisJCQlwcm9ncmFtczogbnVs
bAorCisJCX07CisKKworCQkvLyBpbml0aWFsaXplCisKKwkJdmFyIF9nbDsKKworCQl0cnkgewor
CisJCQl2YXIgY29udGV4dEF0dHJpYnV0ZXMgPSB7CisJCQkJYWxwaGE6IF9hbHBoYSwKKwkJCQlk
ZXB0aDogX2RlcHRoLAorCQkJCXN0ZW5jaWw6IF9zdGVuY2lsLAorCQkJCWFudGlhbGlhczogX2Fu
dGlhbGlhcywKKwkJCQlwcmVtdWx0aXBsaWVkQWxwaGE6IF9wcmVtdWx0aXBsaWVkQWxwaGEsCisJ
CQkJcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBfcHJlc2VydmVEcmF3aW5nQnVmZmVyCisJCQl9Owor
CisJCQlfZ2wgPSBfY29udGV4dCB8fCBfY2FudmFzLmdldENvbnRleHQoICd3ZWJnbCcsIGNvbnRl
eHRBdHRyaWJ1dGVzICkgfHwgX2NhbnZhcy5nZXRDb250ZXh0KCAnZXhwZXJpbWVudGFsLXdlYmds
JywgY29udGV4dEF0dHJpYnV0ZXMgKTsKKworCQkJaWYgKCBfZ2wgPT09IG51bGwgKSB7CisKKwkJ
CQlpZiAoIF9jYW52YXMuZ2V0Q29udGV4dCggJ3dlYmdsJyApICE9PSBudWxsICkgeworCisJCQkJ
CXRocm93ICdFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBh
dHRyaWJ1dGVzLic7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXRocm93ICdFcnJvciBjcmVhdGlu
ZyBXZWJHTCBjb250ZXh0Lic7CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gU29tZSBleHBlcmlt
ZW50YWwtd2ViZ2wgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBoYXZlIGdldFNoYWRlclByZWNpc2lv
bkZvcm1hdAorCisJCQlpZiAoIF9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPT09IHVuZGVm
aW5lZCApIHsKKworCQkJCV9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPSBmdW5jdGlvbiAo
KSB7CisKKwkJCQkJcmV0dXJuIHsgJ3JhbmdlTWluJzogMSwgJ3JhbmdlTWF4JzogMSwgJ3ByZWNp
c2lvbic6IDEgfTsKKworCQkJCX07CisKKwkJCX0KKworCQkJX2NhbnZhcy5hZGRFdmVudExpc3Rl
bmVyKCAnd2ViZ2xjb250ZXh0bG9zdCcsIG9uQ29udGV4dExvc3QsIGZhbHNlICk7CisKKwkJfSBj
YXRjaCAoIGVycm9yICkgeworCisJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJl
cjogJyArIGVycm9yICk7CisKKwkJfQorCisJCXZhciBleHRlbnNpb25zID0gbmV3IFdlYkdMRXh0
ZW5zaW9ucyggX2dsICk7CisKKwkJZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJl
JyApOworCQlleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApOworCQlleHRlbnNp
b25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKTsKKwkJZXh0ZW5zaW9ucy5nZXQo
ICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApOworCQlleHRlbnNpb25zLmdldCggJ09FU190ZXh0
dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApOworCQlleHRlbnNpb25zLmdldCggJ09FU19zdGFuZGFy
ZF9kZXJpdmF0aXZlcycgKTsKKwkJZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJy
YXlzJyApOworCisJCWlmICggZXh0ZW5zaW9ucy5nZXQoICdPRVNfZWxlbWVudF9pbmRleF91aW50
JyApICkgeworCisJCQlCdWZmZXJHZW9tZXRyeS5NYXhJbmRleCA9IDQyOTQ5NjcyOTY7CisKKwkJ
fQorCisJCXZhciBjYXBhYmlsaXRpZXMgPSBuZXcgV2ViR0xDYXBhYmlsaXRpZXMoIF9nbCwgZXh0
ZW5zaW9ucywgcGFyYW1ldGVycyApOworCisJCXZhciBzdGF0ZSA9IG5ldyBXZWJHTFN0YXRlKCBf
Z2wsIGV4dGVuc2lvbnMsIHBhcmFtVGhyZWVUb0dMICk7CisKKwkJdmFyIHByb3BlcnRpZXMgPSBu
ZXcgV2ViR0xQcm9wZXJ0aWVzKCk7CisJCXZhciB0ZXh0dXJlcyA9IG5ldyBXZWJHTFRleHR1cmVz
KCBfZ2wsIGV4dGVuc2lvbnMsIHN0YXRlLCBwcm9wZXJ0aWVzLCBjYXBhYmlsaXRpZXMsIHBhcmFt
VGhyZWVUb0dMLCBfaW5mb01lbW9yeSApOworCQl2YXIgYXR0cmlidXRlcyA9IG5ldyBXZWJHTEF0
dHJpYnV0ZXMoIF9nbCApOworCQl2YXIgZ2VvbWV0cmllcyA9IG5ldyBXZWJHTEdlb21ldHJpZXMo
IF9nbCwgYXR0cmlidXRlcywgX2luZm9NZW1vcnkgKTsKKwkJdmFyIG9iamVjdHMgPSBuZXcgV2Vi
R0xPYmplY3RzKCBfZ2wsIGdlb21ldHJpZXMsIF9pbmZvUmVuZGVyICk7CisJCXZhciBwcm9ncmFt
Q2FjaGUgPSBuZXcgV2ViR0xQcm9ncmFtcyggdGhpcywgY2FwYWJpbGl0aWVzICk7CisJCXZhciBs
aWdodENhY2hlID0gbmV3IFdlYkdMTGlnaHRzKCk7CisJCXZhciByZW5kZXJMaXN0cyA9IG5ldyBX
ZWJHTFJlbmRlckxpc3RzKCk7CisKKwkJdmFyIGJhY2tncm91bmQgPSBuZXcgV2ViR0xCYWNrZ3Jv
dW5kKCB0aGlzLCBzdGF0ZSwgb2JqZWN0cywgX3ByZW11bHRpcGxpZWRBbHBoYSApOworCQl2YXIg
dnIgPSBuZXcgV2ViVlJNYW5hZ2VyKCB0aGlzICk7CisKKwkJdGhpcy5pbmZvLnByb2dyYW1zID0g
cHJvZ3JhbUNhY2hlLnByb2dyYW1zOworCisJCXZhciBidWZmZXJSZW5kZXJlciA9IG5ldyBXZWJH
TEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIF9pbmZvUmVuZGVyICk7CisJCXZhciBp
bmRleGVkQnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIoIF9n
bCwgZXh0ZW5zaW9ucywgX2luZm9SZW5kZXIgKTsKKworCQkvLworCisJCWZ1bmN0aW9uIGdldFRh
cmdldFBpeGVsUmF0aW8oKSB7CisKKwkJCXJldHVybiBfY3VycmVudFJlbmRlclRhcmdldCA9PT0g
bnVsbCA/IF9waXhlbFJhdGlvIDogMTsKKworCQl9CisKKwkJZnVuY3Rpb24gc2V0RGVmYXVsdEdM
U3RhdGUoKSB7CisKKwkJCXN0YXRlLmluaXQoKTsKKworCQkJc3RhdGUuc2Npc3NvciggX2N1cnJl
bnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkg
KTsKKwkJCXN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCAp
Lm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7CisKKwkJfQorCisJCWZ1bmN0aW9uIHJl
c2V0R0xTdGF0ZSgpIHsKKworCQkJX2N1cnJlbnRQcm9ncmFtID0gbnVsbDsKKwkJCV9jdXJyZW50
Q2FtZXJhID0gbnVsbDsKKworCQkJX2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJzsKKwkJCV9j
dXJyZW50TWF0ZXJpYWxJZCA9IC0gMTsKKworCQkJc3RhdGUucmVzZXQoKTsKKworCQl9CisKKwkJ
c2V0RGVmYXVsdEdMU3RhdGUoKTsKKworCQl0aGlzLmNvbnRleHQgPSBfZ2w7CisJCXRoaXMuY2Fw
YWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOworCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25z
OworCQl0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworCQl0aGlzLnJlbmRlckxpc3RzID0g
cmVuZGVyTGlzdHM7CisJCXRoaXMuc3RhdGUgPSBzdGF0ZTsKKwkJdGhpcy52ciA9IHZyOworCisJ
CS8vIHNoYWRvdyBtYXAKKworCQl2YXIgc2hhZG93TWFwID0gbmV3IFdlYkdMU2hhZG93TWFwKCB0
aGlzLCBfbGlnaHRzLCBvYmplY3RzLCBjYXBhYmlsaXRpZXMgKTsKKworCQl0aGlzLnNoYWRvd01h
cCA9IHNoYWRvd01hcDsKKworCisJCS8vIFBsdWdpbnMKKworCQl2YXIgc3ByaXRlUGx1Z2luID0g
bmV3IFNwcml0ZVBsdWdpbiggdGhpcywgc3ByaXRlcyApOworCQl2YXIgbGVuc0ZsYXJlUGx1Z2lu
ID0gbmV3IExlbnNGbGFyZVBsdWdpbiggdGhpcywgbGVuc0ZsYXJlcyApOworCisJCS8vIEFQSQor
CisJCXRoaXMuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIF9nbDsKKwor
CQl9OworCisJCXRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7CisKKwkJ
CXJldHVybiBfZ2wuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTsKKworCQl9OworCisJCXRoaXMuZm9y
Y2VDb250ZXh0TG9zcyA9IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGV4dGVuc2lvbiA9IGV4dGVu
c2lvbnMuZ2V0KCAnV0VCR0xfbG9zZV9jb250ZXh0JyApOworCQkJaWYgKCBleHRlbnNpb24gKSBl
eHRlbnNpb24ubG9zZUNvbnRleHQoKTsKKworCQl9OworCisJCXRoaXMuZ2V0TWF4QW5pc290cm9w
eSA9IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIGNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ry
b3B5KCk7CisKKwkJfTsKKworCQl0aGlzLmdldFByZWNpc2lvbiA9IGZ1bmN0aW9uICgpIHsKKwor
CQkJcmV0dXJuIGNhcGFiaWxpdGllcy5wcmVjaXNpb247CisKKwkJfTsKKworCQl0aGlzLmdldFBp
eGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiBfcGl4ZWxSYXRpbzsKKworCQl9
OworCisJCXRoaXMuc2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCWlm
ICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjsKKworCQkJX3BpeGVsUmF0aW8gPSB2YWx1
ZTsKKworCQkJdGhpcy5zZXRTaXplKCBfd2lkdGgsIF9oZWlnaHQsIGZhbHNlICk7CisKKwkJfTsK
KworCQl0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB7CisJCQkJd2lk
dGg6IF93aWR0aCwKKwkJCQloZWlnaHQ6IF9oZWlnaHQKKwkJCX07CisKKwkJfTsKKworCQl0aGlz
LnNldFNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHVwZGF0ZVN0eWxlICkgeworCisJ
CQl2YXIgZGV2aWNlID0gdnIuZ2V0RGV2aWNlKCk7CisKKwkJCWlmICggZGV2aWNlICYmIGRldmlj
ZS5pc1ByZXNlbnRpbmcgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRl
cmVyOiBDYW5cJ3QgY2hhbmdlIHNpemUgd2hpbGUgVlIgZGV2aWNlIGlzIHByZXNlbnRpbmcuJyAp
OworCQkJCXJldHVybjsKKworCQkJfQorCisJCQlfd2lkdGggPSB3aWR0aDsKKwkJCV9oZWlnaHQg
PSBoZWlnaHQ7CisKKwkJCV9jYW52YXMud2lkdGggPSB3aWR0aCAqIF9waXhlbFJhdGlvOworCQkJ
X2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBfcGl4ZWxSYXRpbzsKKworCQkJaWYgKCB1cGRhdGVT
dHlsZSAhPT0gZmFsc2UgKSB7CisKKwkJCQlfY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAn
cHgnOworCQkJCV9jYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JzsKKworCQkJfQor
CisJCQl0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7CisKKwkJfTsKKwor
CQl0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4g
eworCQkJCXdpZHRoOiBfd2lkdGggKiBfcGl4ZWxSYXRpbywKKwkJCQloZWlnaHQ6IF9oZWlnaHQg
KiBfcGl4ZWxSYXRpbworCQkJfTsKKworCQl9OworCisJCXRoaXMuc2V0RHJhd2luZ0J1ZmZlclNp
emUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHBpeGVsUmF0aW8gKSB7CisKKwkJCV93aWR0
aCA9IHdpZHRoOworCQkJX2hlaWdodCA9IGhlaWdodDsKKworCQkJX3BpeGVsUmF0aW8gPSBwaXhl
bFJhdGlvOworCisJCQlfY2FudmFzLndpZHRoID0gd2lkdGggKiBwaXhlbFJhdGlvOworCQkJX2Nh
bnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBwaXhlbFJhdGlvOworCisJCQl0aGlzLnNldFZpZXdwb3J0
KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7CisKKwkJfTsKKworCQl0aGlzLnNldFZpZXdwb3J0ID0g
ZnVuY3Rpb24gKCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkgeworCisJCQlfdmlld3BvcnQuc2V0KCB4
LCBfaGVpZ2h0IC0geSAtIGhlaWdodCwgd2lkdGgsIGhlaWdodCApOworCQkJc3RhdGUudmlld3Bv
cnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9w
aXhlbFJhdGlvICkgKTsKKworCQl9OworCisJCXRoaXMuc2V0U2Npc3NvciA9IGZ1bmN0aW9uICgg
eCwgeSwgd2lkdGgsIGhlaWdodCApIHsKKworCQkJX3NjaXNzb3Iuc2V0KCB4LCBfaGVpZ2h0IC0g
eSAtIGhlaWdodCwgd2lkdGgsIGhlaWdodCApOworCQkJc3RhdGUuc2Npc3NvciggX2N1cnJlbnRT
Y2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTsK
KworCQl9OworCisJCXRoaXMuc2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7
CisKKwkJCXN0YXRlLnNldFNjaXNzb3JUZXN0KCBfc2Npc3NvclRlc3QgPSBib29sZWFuICk7CisK
KwkJfTsKKworCQkvLyBDbGVhcmluZworCisJCXRoaXMuZ2V0Q2xlYXJDb2xvciA9IGJhY2tncm91
bmQuZ2V0Q2xlYXJDb2xvcjsKKwkJdGhpcy5zZXRDbGVhckNvbG9yID0gYmFja2dyb3VuZC5zZXRD
bGVhckNvbG9yOworCQl0aGlzLmdldENsZWFyQWxwaGEgPSBiYWNrZ3JvdW5kLmdldENsZWFyQWxw
aGE7CisJCXRoaXMuc2V0Q2xlYXJBbHBoYSA9IGJhY2tncm91bmQuc2V0Q2xlYXJBbHBoYTsKKwor
CQl0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7CisKKwkJ
CXZhciBiaXRzID0gMDsKKworCQkJaWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkIHx8IGNvbG9yICkg
Yml0cyB8PSBfZ2wuQ09MT1JfQlVGRkVSX0JJVDsKKwkJCWlmICggZGVwdGggPT09IHVuZGVmaW5l
ZCB8fCBkZXB0aCApIGJpdHMgfD0gX2dsLkRFUFRIX0JVRkZFUl9CSVQ7CisJCQlpZiAoIHN0ZW5j
aWwgPT09IHVuZGVmaW5lZCB8fCBzdGVuY2lsICkgYml0cyB8PSBfZ2wuU1RFTkNJTF9CVUZGRVJf
QklUOworCisJCQlfZ2wuY2xlYXIoIGJpdHMgKTsKKworCQl9OworCisJCXRoaXMuY2xlYXJDb2xv
ciA9IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5jbGVhciggdHJ1ZSwgZmFsc2UsIGZhbHNlICk7
CisKKwkJfTsKKworCQl0aGlzLmNsZWFyRGVwdGggPSBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMu
Y2xlYXIoIGZhbHNlLCB0cnVlLCBmYWxzZSApOworCisJCX07CisKKwkJdGhpcy5jbGVhclN0ZW5j
aWwgPSBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMuY2xlYXIoIGZhbHNlLCBmYWxzZSwgdHJ1ZSAp
OworCisJCX07CisKKwkJdGhpcy5jbGVhclRhcmdldCA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0
LCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7CisKKwkJCXRoaXMuc2V0UmVuZGVyVGFyZ2V0KCBy
ZW5kZXJUYXJnZXQgKTsKKwkJCXRoaXMuY2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApOwor
CisJCX07CisKKwkJLy8gUmVzZXQKKworCQl0aGlzLnJlc2V0R0xTdGF0ZSA9IHJlc2V0R0xTdGF0
ZTsKKworCQl0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7CisKKwkJCV9jYW52YXMucmVtb3Zl
RXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSAp
OworCisJCQlyZW5kZXJMaXN0cy5kaXNwb3NlKCk7CisKKwkJfTsKKworCQkvLyBFdmVudHMKKwor
CQlmdW5jdGlvbiBvbkNvbnRleHRMb3N0KCBldmVudCApIHsKKworCQkJZXZlbnQucHJldmVudERl
ZmF1bHQoKTsKKworCQkJcmVzZXRHTFN0YXRlKCk7CisJCQlzZXREZWZhdWx0R0xTdGF0ZSgpOwor
CisJCQlwcm9wZXJ0aWVzLmNsZWFyKCk7CisJCQlvYmplY3RzLmNsZWFyKCk7CisKKwkJfQorCisJ
CWZ1bmN0aW9uIG9uTWF0ZXJpYWxEaXNwb3NlKCBldmVudCApIHsKKworCQkJdmFyIG1hdGVyaWFs
ID0gZXZlbnQudGFyZ2V0OworCisJCQltYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlz
cG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7CisKKwkJCWRlYWxsb2NhdGVNYXRlcmlhbCggbWF0
ZXJpYWwgKTsKKworCQl9CisKKwkJLy8gQnVmZmVyIGRlYWxsb2NhdGlvbgorCisJCWZ1bmN0aW9u
IGRlYWxsb2NhdGVNYXRlcmlhbCggbWF0ZXJpYWwgKSB7CisKKwkJCXJlbGVhc2VNYXRlcmlhbFBy
b2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7CisKKwkJCXByb3BlcnRpZXMucmVtb3ZlKCBtYXRl
cmlhbCApOworCisJCX0KKworCisJCWZ1bmN0aW9uIHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZl
cmVuY2UoIG1hdGVyaWFsICkgeworCisJCQl2YXIgcHJvZ3JhbUluZm8gPSBwcm9wZXJ0aWVzLmdl
dCggbWF0ZXJpYWwgKS5wcm9ncmFtOworCisJCQltYXRlcmlhbC5wcm9ncmFtID0gdW5kZWZpbmVk
OworCisJCQlpZiAoIHByb2dyYW1JbmZvICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQlwcm9ncmFt
Q2FjaGUucmVsZWFzZVByb2dyYW0oIHByb2dyYW1JbmZvICk7CisKKwkJCX0KKworCQl9CisKKwkJ
Ly8gQnVmZmVyIHJlbmRlcmluZworCisJCWZ1bmN0aW9uIHJlbmRlck9iamVjdEltbWVkaWF0ZSgg
b2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApIHsKKworCQkJb2JqZWN0LnJlbmRlciggZnVuY3Rp
b24gKCBvYmplY3QgKSB7CisKKwkJCQlfdGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGUoIG9iamVj
dCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKTsKKworCQkJfSApOworCisJCX0KKworCQl0aGlzLnJlbmRl
ckJ1ZmZlckltbWVkaWF0ZSA9IGZ1bmN0aW9uICggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCAp
IHsKKworCQkJc3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTsKKworCQkJdmFyIGJ1ZmZlcnMgPSBwcm9w
ZXJ0aWVzLmdldCggb2JqZWN0ICk7CisKKwkJCWlmICggb2JqZWN0Lmhhc1Bvc2l0aW9ucyAmJiAh
IGJ1ZmZlcnMucG9zaXRpb24gKSBidWZmZXJzLnBvc2l0aW9uID0gX2dsLmNyZWF0ZUJ1ZmZlcigp
OworCQkJaWYgKCBvYmplY3QuaGFzTm9ybWFscyAmJiAhIGJ1ZmZlcnMubm9ybWFsICkgYnVmZmVy
cy5ub3JtYWwgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7CisJCQlpZiAoIG9iamVjdC5oYXNVdnMgJiYg
ISBidWZmZXJzLnV2ICkgYnVmZmVycy51diA9IF9nbC5jcmVhdGVCdWZmZXIoKTsKKwkJCWlmICgg
b2JqZWN0Lmhhc0NvbG9ycyAmJiAhIGJ1ZmZlcnMuY29sb3IgKSBidWZmZXJzLmNvbG9yID0gX2ds
LmNyZWF0ZUJ1ZmZlcigpOworCisJCQl2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdl
dEF0dHJpYnV0ZXMoKTsKKworCQkJaWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICkgeworCisJCQkJ
X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMucG9zaXRpb24gKTsKKwkJ
CQlfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LnBvc2l0aW9uQXJyYXks
IF9nbC5EWU5BTUlDX0RSQVcgKTsKKworCQkJCXN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3Jh
bUF0dHJpYnV0ZXMucG9zaXRpb24gKTsKKwkJCQlfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJv
Z3JhbUF0dHJpYnV0ZXMucG9zaXRpb24sIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTsKKwor
CQkJfQorCisJCQlpZiAoIG9iamVjdC5oYXNOb3JtYWxzICkgeworCisJCQkJX2dsLmJpbmRCdWZm
ZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMubm9ybWFsICk7CisKKwkJCQlpZiAoICEgbWF0
ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCAmJgorCQkJCQkhIG1hdGVyaWFsLmlzTWVzaFN0YW5k
YXJkTWF0ZXJpYWwgJiYKKwkJCQkJISBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCAmJgor
CQkJCQltYXRlcmlhbC5zaGFkaW5nID09PSBGbGF0U2hhZGluZyApIHsKKworCQkJCQlmb3IgKCB2
YXIgaSA9IDAsIGwgPSBvYmplY3QuY291bnQgKiAzOyBpIDwgbDsgaSArPSA5ICkgeworCisJCQkJ
CQl2YXIgYXJyYXkgPSBvYmplY3Qubm9ybWFsQXJyYXk7CisKKwkJCQkJCXZhciBueCA9ICggYXJy
YXlbIGkgKyAwIF0gKyBhcnJheVsgaSArIDMgXSArIGFycmF5WyBpICsgNiBdICkgLyAzOworCQkJ
CQkJdmFyIG55ID0gKCBhcnJheVsgaSArIDEgXSArIGFycmF5WyBpICsgNCBdICsgYXJyYXlbIGkg
KyA3IF0gKSAvIDM7CisJCQkJCQl2YXIgbnogPSAoIGFycmF5WyBpICsgMiBdICsgYXJyYXlbIGkg
KyA1IF0gKyBhcnJheVsgaSArIDggXSApIC8gMzsKKworCQkJCQkJYXJyYXlbIGkgKyAwIF0gPSBu
eDsKKwkJCQkJCWFycmF5WyBpICsgMSBdID0gbnk7CisJCQkJCQlhcnJheVsgaSArIDIgXSA9IG56
OworCisJCQkJCQlhcnJheVsgaSArIDMgXSA9IG54OworCQkJCQkJYXJyYXlbIGkgKyA0IF0gPSBu
eTsKKwkJCQkJCWFycmF5WyBpICsgNSBdID0gbno7CisKKwkJCQkJCWFycmF5WyBpICsgNiBdID0g
bng7CisJCQkJCQlhcnJheVsgaSArIDcgXSA9IG55OworCQkJCQkJYXJyYXlbIGkgKyA4IF0gPSBu
ejsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JV
RkZFUiwgb2JqZWN0Lm5vcm1hbEFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7CisKKwkJCQlzdGF0
ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCApOworCisJCQkJX2ds
LnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCwgMywgX2dsLkZM
T0FULCBmYWxzZSwgMCwgMCApOworCisJCQl9CisKKwkJCWlmICggb2JqZWN0Lmhhc1V2cyAmJiBt
YXRlcmlhbC5tYXAgKSB7CisKKwkJCQlfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwg
YnVmZmVycy51diApOworCQkJCV9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmpl
Y3QudXZBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApOworCisJCQkJc3RhdGUuZW5hYmxlQXR0cmli
dXRlKCBwcm9ncmFtQXR0cmlidXRlcy51diApOworCisJCQkJX2dsLnZlcnRleEF0dHJpYlBvaW50
ZXIoIGF0dHJpYnV0ZXMudXYsIDIsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTsKKworCQkJfQor
CisJCQlpZiAoIG9iamVjdC5oYXNDb2xvcnMgJiYgbWF0ZXJpYWwudmVydGV4Q29sb3JzICE9PSBO
b0NvbG9ycyApIHsKKworCQkJCV9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZm
ZXJzLmNvbG9yICk7CisJCQkJX2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVj
dC5jb2xvckFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7CisKKwkJCQlzdGF0ZS5lbmFibGVBdHRy
aWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLmNvbG9yICk7CisKKwkJCQlfZ2wudmVydGV4QXR0cmli
UG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IsIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAs
IDAgKTsKKworCQkJfQorCisJCQlzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpOworCisJ
CQlfZ2wuZHJhd0FycmF5cyggX2dsLlRSSUFOR0xFUywgMCwgb2JqZWN0LmNvdW50ICk7CisKKwkJ
CW9iamVjdC5jb3VudCA9IDA7CisKKwkJfTsKKworCQlmdW5jdGlvbiBhYnNOdW1lcmljYWxTb3J0
KCBhLCBiICkgeworCisJCQlyZXR1cm4gTWF0aC5hYnMoIGJbIDAgXSApIC0gTWF0aC5hYnMoIGFb
IDAgXSApOworCisJCX0KKworCQl0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCA9IGZ1bmN0aW9uICgg
Y2FtZXJhLCBmb2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApIHsKKworCQkJ
c3RhdGUuc2V0TWF0ZXJpYWwoIG1hdGVyaWFsICk7CisKKwkJCXZhciBwcm9ncmFtID0gc2V0UHJv
Z3JhbSggY2FtZXJhLCBmb2csIG1hdGVyaWFsLCBvYmplY3QgKTsKKwkJCXZhciBnZW9tZXRyeVBy
b2dyYW0gPSBnZW9tZXRyeS5pZCArICdfJyArIHByb2dyYW0uaWQgKyAnXycgKyAoIG1hdGVyaWFs
LndpcmVmcmFtZSA9PT0gdHJ1ZSApOworCisJCQl2YXIgdXBkYXRlQnVmZmVycyA9IGZhbHNlOwor
CisJCQlpZiAoIGdlb21ldHJ5UHJvZ3JhbSAhPT0gX2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gKSB7
CisKKwkJCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5UHJvZ3JhbTsKKwkJCQl1
cGRhdGVCdWZmZXJzID0gdHJ1ZTsKKworCQkJfQorCisJCQkvLyBtb3JwaCB0YXJnZXRzCisKKwkJ
CXZhciBtb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2Vz
OworCisJCQlpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyAhPT0gdW5kZWZpbmVkICkgeworCisJ
CQkJLy8gVE9ETyBSZW1vdmUgYWxsb2NhdGlvbnMKKworCQkJCXZhciBhY3RpdmVJbmZsdWVuY2Vz
ID0gW107CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBtb3JwaFRhcmdldEluZmx1ZW5jZXMu
bGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCQl2YXIgaW5mbHVlbmNlID0gbW9ycGhUYXJn
ZXRJbmZsdWVuY2VzWyBpIF07CisJCQkJCWFjdGl2ZUluZmx1ZW5jZXMucHVzaCggWyBpbmZsdWVu
Y2UsIGkgXSApOworCisJCQkJfQorCisJCQkJYWN0aXZlSW5mbHVlbmNlcy5zb3J0KCBhYnNOdW1l
cmljYWxTb3J0ICk7CisKKwkJCQlpZiAoIGFjdGl2ZUluZmx1ZW5jZXMubGVuZ3RoID4gOCApIHsK
KworCQkJCQlhY3RpdmVJbmZsdWVuY2VzLmxlbmd0aCA9IDg7CisKKwkJCQl9CisKKwkJCQl2YXIg
bW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzOworCisJCQkJZm9yICgg
dmFyIGkgPSAwLCBsID0gYWN0aXZlSW5mbHVlbmNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewor
CisJCQkJCXZhciBpbmZsdWVuY2UgPSBhY3RpdmVJbmZsdWVuY2VzWyBpIF07CisJCQkJCW1vcnBo
SW5mbHVlbmNlc1sgaSBdID0gaW5mbHVlbmNlWyAwIF07CisKKwkJCQkJaWYgKCBpbmZsdWVuY2Vb
IDAgXSAhPT0gMCApIHsKKworCQkJCQkJdmFyIGluZGV4ID0gaW5mbHVlbmNlWyAxIF07CisKKwkJ
CQkJCWlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzID09PSB0cnVlICYmIG1vcnBoQXR0cmlidXRl
cy5wb3NpdGlvbiApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGksIG1v
cnBoQXR0cmlidXRlcy5wb3NpdGlvblsgaW5kZXggXSApOworCQkJCQkJaWYgKCBtYXRlcmlhbC5t
b3JwaE5vcm1hbHMgPT09IHRydWUgJiYgbW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCApIGdlb21ldHJ5
LmFkZEF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGksIG1vcnBoQXR0cmlidXRlcy5ub3JtYWxb
IGluZGV4IF0gKTsKKworCQkJCQl9IGVsc2UgeworCisJCQkJCQlpZiAoIG1hdGVyaWFsLm1vcnBo
VGFyZ2V0cyA9PT0gdHJ1ZSApIGdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0
JyArIGkgKTsKKwkJCQkJCWlmICggbWF0ZXJpYWwubW9ycGhOb3JtYWxzID09PSB0cnVlICkgZ2Vv
bWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApOworCisJCQkJCX0KKwor
CQkJCX0KKworCQkJCWZvciAoIHZhciBpID0gYWN0aXZlSW5mbHVlbmNlcy5sZW5ndGgsIGlsID0g
bW9ycGhJbmZsdWVuY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJCW1vcnBoSW5m
bHVlbmNlc1sgaSBdID0gMC4wOworCisJCQkJfQorCisJCQkJcHJvZ3JhbS5nZXRVbmlmb3Jtcygp
LnNldFZhbHVlKCBfZ2wsICdtb3JwaFRhcmdldEluZmx1ZW5jZXMnLCBtb3JwaEluZmx1ZW5jZXMg
KTsKKworCQkJCXVwZGF0ZUJ1ZmZlcnMgPSB0cnVlOworCisJCQl9CisKKwkJCS8vCisKKwkJCXZh
ciBpbmRleCA9IGdlb21ldHJ5LmluZGV4OworCQkJdmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0
cmlidXRlcy5wb3NpdGlvbjsKKwkJCXZhciByYW5nZUZhY3RvciA9IDE7CisKKwkJCWlmICggbWF0
ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkgeworCisJCQkJaW5kZXggPSBnZW9tZXRyaWVzLmdl
dFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKTsKKwkJCQlyYW5nZUZhY3RvciA9IDI7CisK
KwkJCX0KKworCQkJdmFyIGF0dHJpYnV0ZTsKKwkJCXZhciByZW5kZXJlciA9IGJ1ZmZlclJlbmRl
cmVyOworCisJCQlpZiAoIGluZGV4ICE9PSBudWxsICkgeworCisJCQkJYXR0cmlidXRlID0gYXR0
cmlidXRlcy5nZXQoIGluZGV4ICk7CisKKwkJCQlyZW5kZXJlciA9IGluZGV4ZWRCdWZmZXJSZW5k
ZXJlcjsKKwkJCQlyZW5kZXJlci5zZXRJbmRleCggYXR0cmlidXRlICk7CisKKwkJCX0KKworCQkJ
aWYgKCB1cGRhdGVCdWZmZXJzICkgeworCisJCQkJc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRl
cmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnkgKTsKKworCQkJCWlmICggaW5kZXggIT09IG51bGwgKSB7
CisKKwkJCQkJX2dsLmJpbmRCdWZmZXIoIF9nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYXR0cmli
dXRlLmJ1ZmZlciApOworCisJCQkJfQorCisJCQl9CisKKwkJCS8vCisKKwkJCXZhciBkYXRhQ291
bnQgPSAwOworCisJCQlpZiAoIGluZGV4ICE9PSBudWxsICkgeworCisJCQkJZGF0YUNvdW50ID0g
aW5kZXguY291bnQ7CisKKwkJCX0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7
CisKKwkJCQlkYXRhQ291bnQgPSBwb3NpdGlvbi5jb3VudDsKKworCQkJfQorCisJCQl2YXIgcmFu
Z2VTdGFydCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5zdGFydCAqIHJhbmdlRmFjdG9yOworCQkJdmFy
IHJhbmdlQ291bnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2UuY291bnQgKiByYW5nZUZhY3RvcjsKKwor
CQkJdmFyIGdyb3VwU3RhcnQgPSBncm91cCAhPT0gbnVsbCA/IGdyb3VwLnN0YXJ0ICogcmFuZ2VG
YWN0b3IgOiAwOworCQkJdmFyIGdyb3VwQ291bnQgPSBncm91cCAhPT0gbnVsbCA/IGdyb3VwLmNv
dW50ICogcmFuZ2VGYWN0b3IgOiBJbmZpbml0eTsKKworCQkJdmFyIGRyYXdTdGFydCA9IE1hdGgu
bWF4KCByYW5nZVN0YXJ0LCBncm91cFN0YXJ0ICk7CisJCQl2YXIgZHJhd0VuZCA9IE1hdGgubWlu
KCBkYXRhQ291bnQsIHJhbmdlU3RhcnQgKyByYW5nZUNvdW50LCBncm91cFN0YXJ0ICsgZ3JvdXBD
b3VudCApIC0gMTsKKworCQkJdmFyIGRyYXdDb3VudCA9IE1hdGgubWF4KCAwLCBkcmF3RW5kIC0g
ZHJhd1N0YXJ0ICsgMSApOworCisJCQlpZiAoIGRyYXdDb3VudCA9PT0gMCApIHJldHVybjsKKwor
CQkJLy8KKworCQkJaWYgKCBvYmplY3QuaXNNZXNoICkgeworCisJCQkJaWYgKCBtYXRlcmlhbC53
aXJlZnJhbWUgPT09IHRydWUgKSB7CisKKwkJCQkJc3RhdGUuc2V0TGluZVdpZHRoKCBtYXRlcmlh
bC53aXJlZnJhbWVMaW5ld2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTsKKwkJCQkJcmVu
ZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCXN3aXRj
aCAoIG9iamVjdC5kcmF3TW9kZSApIHsKKworCQkJCQkJY2FzZSBUcmlhbmdsZXNEcmF3TW9kZToK
KwkJCQkJCQlyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVTICk7CisJCQkJCQkJYnJlYWs7
CisKKwkJCQkJCWNhc2UgVHJpYW5nbGVTdHJpcERyYXdNb2RlOgorCQkJCQkJCXJlbmRlcmVyLnNl
dE1vZGUoIF9nbC5UUklBTkdMRV9TVFJJUCApOworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNl
IFRyaWFuZ2xlRmFuRHJhd01vZGU6CisJCQkJCQkJcmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFO
R0xFX0ZBTiApOworCQkJCQkJCWJyZWFrOworCisJCQkJCX0KKworCQkJCX0KKworCisJCQl9IGVs
c2UgaWYgKCBvYmplY3QuaXNMaW5lICkgeworCisJCQkJdmFyIGxpbmVXaWR0aCA9IG1hdGVyaWFs
LmxpbmV3aWR0aDsKKworCQkJCWlmICggbGluZVdpZHRoID09PSB1bmRlZmluZWQgKSBsaW5lV2lk
dGggPSAxOyAvLyBOb3QgdXNpbmcgTGluZSpNYXRlcmlhbAorCisJCQkJc3RhdGUuc2V0TGluZVdp
ZHRoKCBsaW5lV2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTsKKworCQkJCWlmICggb2Jq
ZWN0LmlzTGluZVNlZ21lbnRzICkgeworCisJCQkJCXJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5F
UyApOworCisJCQkJfSBlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSB7CisKKwkJCQkJcmVu
ZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVfTE9PUCApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQly
ZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORV9TVFJJUCApOworCisJCQkJfQorCisJCQl9IGVsc2Ug
aWYgKCBvYmplY3QuaXNQb2ludHMgKSB7CisKKwkJCQlyZW5kZXJlci5zZXRNb2RlKCBfZ2wuUE9J
TlRTICk7CisKKwkJCX0KKworCQkJaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0luc3RhbmNl
ZEJ1ZmZlckdlb21ldHJ5ICkgeworCisJCQkJaWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3Vu
dCA+IDAgKSB7CisKKwkJCQkJcmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgZHJh
d1N0YXJ0LCBkcmF3Q291bnQgKTsKKworCQkJCX0KKworCQkJfSBlbHNlIHsKKworCQkJCXJlbmRl
cmVyLnJlbmRlciggZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTsKKworCQkJfQorCisJCX07CisKKwkJ
ZnVuY3Rpb24gc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0
cnksIHN0YXJ0SW5kZXggKSB7CisKKwkJCWlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNJbnN0
YW5jZWRCdWZmZXJHZW9tZXRyeSApIHsKKworCQkJCWlmICggZXh0ZW5zaW9ucy5nZXQoICdBTkdM
RV9pbnN0YW5jZWRfYXJyYXlzJyApID09PSBudWxsICkgeworCisJCQkJCWNvbnNvbGUuZXJyb3Io
ICdUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUu
SW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0
ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApOworCQkJCQlyZXR1cm47CisKKwkJCQl9
CisKKwkJCX0KKworCQkJaWYgKCBzdGFydEluZGV4ID09PSB1bmRlZmluZWQgKSBzdGFydEluZGV4
ID0gMDsKKworCQkJc3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTsKKworCQkJdmFyIGdlb21ldHJ5QXR0
cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CisKKwkJCXZhciBwcm9ncmFtQXR0cmlidXRl
cyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpOworCisJCQl2YXIgbWF0ZXJpYWxEZWZhdWx0QXR0
cmlidXRlVmFsdWVzID0gbWF0ZXJpYWwuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlczsKKworCQkJZm9y
ICggdmFyIG5hbWUgaW4gcHJvZ3JhbUF0dHJpYnV0ZXMgKSB7CisKKwkJCQl2YXIgcHJvZ3JhbUF0
dHJpYnV0ZSA9IHByb2dyYW1BdHRyaWJ1dGVzWyBuYW1lIF07CisKKwkJCQlpZiAoIHByb2dyYW1B
dHRyaWJ1dGUgPj0gMCApIHsKKworCQkJCQl2YXIgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBnZW9tZXRy
eUF0dHJpYnV0ZXNbIG5hbWUgXTsKKworCQkJCQlpZiAoIGdlb21ldHJ5QXR0cmlidXRlICE9PSB1
bmRlZmluZWQgKSB7CisKKwkJCQkJCXZhciBub3JtYWxpemVkID0gZ2VvbWV0cnlBdHRyaWJ1dGUu
bm9ybWFsaXplZDsKKwkJCQkJCXZhciBzaXplID0gZ2VvbWV0cnlBdHRyaWJ1dGUuaXRlbVNpemU7
CisKKwkJCQkJCXZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnlBdHRyaWJ1
dGUgKTsKKworCQkJCQkJdmFyIGJ1ZmZlciA9IGF0dHJpYnV0ZS5idWZmZXI7CisJCQkJCQl2YXIg
dHlwZSA9IGF0dHJpYnV0ZS50eXBlOworCQkJCQkJdmFyIGJ5dGVzUGVyRWxlbWVudCA9IGF0dHJp
YnV0ZS5ieXRlc1BlckVsZW1lbnQ7CisKKwkJCQkJCWlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJ
bnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHsKKworCQkJCQkJCXZhciBkYXRhID0gZ2VvbWV0
cnlBdHRyaWJ1dGUuZGF0YTsKKwkJCQkJCQl2YXIgc3RyaWRlID0gZGF0YS5zdHJpZGU7CisJCQkJ
CQkJdmFyIG9mZnNldCA9IGdlb21ldHJ5QXR0cmlidXRlLm9mZnNldDsKKworCQkJCQkJCWlmICgg
ZGF0YSAmJiBkYXRhLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgKSB7CisKKwkJCQkJCQkJ
c3RhdGUuZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSwgZGF0YS5t
ZXNoUGVyQXR0cmlidXRlICk7CisKKwkJCQkJCQkJaWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRD
b3VudCA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCQkJCQlnZW9tZXRyeS5tYXhJbnN0YW5jZWRD
b3VudCA9IGRhdGEubWVzaFBlckF0dHJpYnV0ZSAqIGRhdGEuY291bnQ7CisKKwkJCQkJCQkJfQor
CisJCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCQlzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dy
YW1BdHRyaWJ1dGUgKTsKKworCQkJCQkJCX0KKworCQkJCQkJCV9nbC5iaW5kQnVmZmVyKCBfZ2wu
QVJSQVlfQlVGRkVSLCBidWZmZXIgKTsKKwkJCQkJCQlfZ2wudmVydGV4QXR0cmliUG9pbnRlcigg
cHJvZ3JhbUF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlICogYnl0ZXNQ
ZXJFbGVtZW50LCAoIHN0YXJ0SW5kZXggKiBzdHJpZGUgKyBvZmZzZXQgKSAqIGJ5dGVzUGVyRWxl
bWVudCApOworCisJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJaWYgKCBnZW9tZXRyeUF0dHJpYnV0
ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSApIHsKKworCQkJCQkJCQlzdGF0ZS5lbmFibGVB
dHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBnZW9tZXRyeUF0dHJpYnV0ZS5t
ZXNoUGVyQXR0cmlidXRlICk7CisKKwkJCQkJCQkJaWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRD
b3VudCA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCQkJCQlnZW9tZXRyeS5tYXhJbnN0YW5jZWRD
b3VudCA9IGdlb21ldHJ5QXR0cmlidXRlLm1lc2hQZXJBdHRyaWJ1dGUgKiBnZW9tZXRyeUF0dHJp
YnV0ZS5jb3VudDsKKworCQkJCQkJCQl9CisKKwkJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJCXN0
YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApOworCisJCQkJCQkJfQorCisJ
CQkJCQkJX2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlciApOworCQkJCQkJ
CV9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBu
b3JtYWxpemVkLCAwLCBzdGFydEluZGV4ICogc2l6ZSAqIGJ5dGVzUGVyRWxlbWVudCApOworCisJ
CQkJCQl9CisKKwkJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVz
ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCXZhciB2YWx1ZSA9IG1hdGVyaWFsRGVmYXVsdEF0
dHJpYnV0ZVZhbHVlc1sgbmFtZSBdOworCisJCQkJCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQg
KSB7CisKKwkJCQkJCQlzd2l0Y2ggKCB2YWx1ZS5sZW5ndGggKSB7CisKKwkJCQkJCQkJY2FzZSAy
OgorCQkJCQkJCQkJX2dsLnZlcnRleEF0dHJpYjJmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUg
KTsKKwkJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJCWNhc2UgMzoKKwkJCQkJCQkJCV9nbC52ZXJ0
ZXhBdHRyaWIzZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7CisJCQkJCQkJCQlicmVhazsK
KworCQkJCQkJCQljYXNlIDQ6CisJCQkJCQkJCQlfZ2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFt
QXR0cmlidXRlLCB2YWx1ZSApOworCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJZGVmYXVsdDoK
KwkJCQkJCQkJCV9nbC52ZXJ0ZXhBdHRyaWIxZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7
CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQkJ
c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTsKKworCQl9CisKKwkJLy8gQ29tcGlsZQor
CisJCXRoaXMuY29tcGlsZSA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHsKKworCQkJbGln
aHRzID0gW107CisKKwkJCXNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHsKKwor
CQkJCWlmICggb2JqZWN0LmlzTGlnaHQgKSB7CisKKwkJCQkJbGlnaHRzLnB1c2goIG9iamVjdCAp
OworCisJCQkJfQorCisJCQl9ICk7CisKKwkJCXNldHVwTGlnaHRzKCBsaWdodHMsIGNhbWVyYSAp
OworCisJCQlzY2VuZS50cmF2ZXJzZSggZnVuY3Rpb24gKCBvYmplY3QgKSB7CisKKwkJCQlpZiAo
IG9iamVjdC5tYXRlcmlhbCApIHsKKworCQkJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdC5t
YXRlcmlhbCApICkgeworCisJCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBvYmplY3QubWF0ZXJp
YWwubGVuZ3RoOyBpICsrICkgeworCisJCQkJCQkJaW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJp
YWxbIGkgXSwgc2NlbmUuZm9nLCBvYmplY3QgKTsKKworCQkJCQkJfQorCisJCQkJCX0gZWxzZSB7
CisKKwkJCQkJCWluaXRNYXRlcmlhbCggb2JqZWN0Lm1hdGVyaWFsLCBzY2VuZS5mb2csIG9iamVj
dCApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJfSApOworCisJCX07CisKKwkJLy8gUmVuZGVy
aW5nCisKKwkJdGhpcy5hbmltYXRlID0gZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKKworCQkJZnVu
Y3Rpb24gb25GcmFtZSgpIHsKKworCQkJCWNhbGxiYWNrKCk7CisKKwkJCQkoIHZyLmdldERldmlj
ZSgpIHx8IHdpbmRvdyApLnJlcXVlc3RBbmltYXRpb25GcmFtZSggb25GcmFtZSApOworCisJCQl9
CisKKwkJCSggdnIuZ2V0RGV2aWNlKCkgfHwgd2luZG93ICkucmVxdWVzdEFuaW1hdGlvbkZyYW1l
KCBvbkZyYW1lICk7CisKKwkJfTsKKworCQl0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc2NlbmUs
IGNhbWVyYSwgcmVuZGVyVGFyZ2V0LCBmb3JjZUNsZWFyICkgeworCisJCQlpZiAoICEgKCBjYW1l
cmEgJiYgY2FtZXJhLmlzQ2FtZXJhICkgKSB7CisKKwkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUu
V2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUu
Q2FtZXJhLicgKTsKKwkJCQlyZXR1cm47CisKKwkJCX0KKworCQkJLy8gcmVzZXQgY2FjaGluZyBm
b3IgdGhpcyBmcmFtZQorCisJCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnOworCQkJX2N1
cnJlbnRNYXRlcmlhbElkID0gLSAxOworCQkJX2N1cnJlbnRDYW1lcmEgPSBudWxsOworCisJCQkv
LyB1cGRhdGUgc2NlbmUgZ3JhcGgKKworCQkJaWYgKCBzY2VuZS5hdXRvVXBkYXRlID09PSB0cnVl
ICkgc2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTsKKworCQkJLy8gdXBkYXRlIGNhbWVyYSBtYXRy
aWNlcyBhbmQgZnJ1c3R1bQorCisJCQlpZiAoIGNhbWVyYS5wYXJlbnQgPT09IG51bGwgKSBjYW1l
cmEudXBkYXRlTWF0cml4V29ybGQoKTsKKworCQkJaWYgKCB2ci5lbmFibGVkICkgeworCisJCQkJ
Y2FtZXJhID0gdnIuZ2V0Q2FtZXJhKCBjYW1lcmEgKTsKKworCQkJfQorCisJCQlfcHJvalNjcmVl
bk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJh
Lm1hdHJpeFdvcmxkSW52ZXJzZSApOworCQkJX2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggX3Byb2pT
Y3JlZW5NYXRyaXggKTsKKworCQkJbGlnaHRzLmxlbmd0aCA9IDA7CisJCQlzcHJpdGVzLmxlbmd0
aCA9IDA7CisJCQlsZW5zRmxhcmVzLmxlbmd0aCA9IDA7CisKKwkJCV9sb2NhbENsaXBwaW5nRW5h
YmxlZCA9IHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQ7CisJCQlfY2xpcHBpbmdFbmFibGVkID0g
X2NsaXBwaW5nLmluaXQoIHRoaXMuY2xpcHBpbmdQbGFuZXMsIF9sb2NhbENsaXBwaW5nRW5hYmxl
ZCwgY2FtZXJhICk7CisKKwkJCWN1cnJlbnRSZW5kZXJMaXN0ID0gcmVuZGVyTGlzdHMuZ2V0KCBz
Y2VuZSwgY2FtZXJhICk7CisJCQljdXJyZW50UmVuZGVyTGlzdC5pbml0KCk7CisKKwkJCXByb2pl
Y3RPYmplY3QoIHNjZW5lLCBjYW1lcmEsIF90aGlzLnNvcnRPYmplY3RzICk7CisKKwkJCWN1cnJl
bnRSZW5kZXJMaXN0LmZpbmlzaCgpOworCisJCQlpZiAoIF90aGlzLnNvcnRPYmplY3RzID09PSB0
cnVlICkgeworCisJCQkJY3VycmVudFJlbmRlckxpc3Quc29ydCgpOworCisJCQl9CisKKwkJCS8v
CisKKwkJCWlmICggX2NsaXBwaW5nRW5hYmxlZCApIF9jbGlwcGluZy5iZWdpblNoYWRvd3MoKTsK
KworCQkJc2V0dXBTaGFkb3dzKCBsaWdodHMgKTsKKworCQkJc2hhZG93TWFwLnJlbmRlciggc2Nl
bmUsIGNhbWVyYSApOworCisJCQlzZXR1cExpZ2h0cyggbGlnaHRzLCBjYW1lcmEgKTsKKworCQkJ
aWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmVuZFNoYWRvd3MoKTsKKworCQkJLy8K
KworCQkJX2luZm9SZW5kZXIuZnJhbWUgKys7CisJCQlfaW5mb1JlbmRlci5jYWxscyA9IDA7CisJ
CQlfaW5mb1JlbmRlci52ZXJ0aWNlcyA9IDA7CisJCQlfaW5mb1JlbmRlci5mYWNlcyA9IDA7CisJ
CQlfaW5mb1JlbmRlci5wb2ludHMgPSAwOworCisJCQlpZiAoIHJlbmRlclRhcmdldCA9PT0gdW5k
ZWZpbmVkICkgeworCisJCQkJcmVuZGVyVGFyZ2V0ID0gbnVsbDsKKworCQkJfQorCisJCQl0aGlz
LnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7CisKKwkJCS8vCisKKwkJCWJhY2tncm91
bmQucmVuZGVyKCBzY2VuZSwgY2FtZXJhLCBmb3JjZUNsZWFyICk7CisKKwkJCS8vIHJlbmRlciBz
Y2VuZQorCisJCQl2YXIgb3BhcXVlT2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0Lm9wYXF1ZTsK
KwkJCXZhciB0cmFuc3BhcmVudE9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC50cmFuc3BhcmVu
dDsKKworCQkJaWYgKCBzY2VuZS5vdmVycmlkZU1hdGVyaWFsICkgeworCisJCQkJdmFyIG92ZXJy
aWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsOworCisJCQkJaWYgKCBvcGFxdWVP
YmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1l
cmEsIG92ZXJyaWRlTWF0ZXJpYWwgKTsKKwkJCQlpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5n
dGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEsIG92
ZXJyaWRlTWF0ZXJpYWwgKTsKKworCQkJfSBlbHNlIHsKKworCQkJCS8vIG9wYXF1ZSBwYXNzIChm
cm9udC10by1iYWNrIG9yZGVyKQorCisJCQkJaWYgKCBvcGFxdWVPYmplY3RzLmxlbmd0aCApIHJl
bmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTsKKworCQkJCS8vIHRy
YW5zcGFyZW50IHBhc3MgKGJhY2stdG8tZnJvbnQgb3JkZXIpCisKKwkJCQlpZiAoIHRyYW5zcGFy
ZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNj
ZW5lLCBjYW1lcmEgKTsKKworCQkJfQorCisJCQkvLyBjdXN0b20gcmVuZGVyIHBsdWdpbnMgKHBv
c3QgcGFzcykKKworCQkJc3ByaXRlUGx1Z2luLnJlbmRlciggc2NlbmUsIGNhbWVyYSApOworCQkJ
bGVuc0ZsYXJlUGx1Z2luLnJlbmRlciggc2NlbmUsIGNhbWVyYSwgX2N1cnJlbnRWaWV3cG9ydCAp
OworCisJCQkvLyBHZW5lcmF0ZSBtaXBtYXAgaWYgd2UncmUgdXNpbmcgYW55IGtpbmQgb2YgbWlw
bWFwIGZpbHRlcmluZworCisJCQlpZiAoIHJlbmRlclRhcmdldCApIHsKKworCQkJCXRleHR1cmVz
LnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICk7CisKKwkJCX0KKworCQkJ
Ly8gRW5zdXJlIGRlcHRoIGJ1ZmZlciB3cml0aW5nIGlzIGVuYWJsZWQgc28gaXQgY2FuIGJlIGNs
ZWFyZWQgb24gbmV4dCByZW5kZXIKKworCQkJc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0
cnVlICk7CisJCQlzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTsKKwkJCXN0YXRl
LmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayggdHJ1ZSApOworCisJCQlpZiAoIGNhbWVyYS5pc0FycmF5
Q2FtZXJhICkgeworCisJCQkJX3RoaXMuc2V0U2Npc3NvclRlc3QoIGZhbHNlICk7CisKKwkJCX0K
KworCQkJaWYgKCB2ci5lbmFibGVkICkgeworCisJCQkJdnIuc3VibWl0RnJhbWUoKTsKKworCQkJ
fQorCisJCQkvLyBfZ2wuZmluaXNoKCk7CisKKwkJfTsKKworCQkvKgorCQkvLyBUT0RPIER1cGxp
Y2F0ZWQgY29kZSAoRnJ1c3R1bSkKKworCQl2YXIgX3NwaGVyZSA9IG5ldyBTcGhlcmUoKTsKKwor
CQlmdW5jdGlvbiBpc09iamVjdFZpZXdhYmxlKCBvYmplY3QgKSB7CisKKwkJCXZhciBnZW9tZXRy
eSA9IG9iamVjdC5nZW9tZXRyeTsKKworCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9
PT0gbnVsbCApCisJCQkJZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CisKKwkJCV9z
cGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKS4KKwkJCWFwcGx5TWF0cml4NCgg
b2JqZWN0Lm1hdHJpeFdvcmxkICk7CisKKwkJCXJldHVybiBpc1NwaGVyZVZpZXdhYmxlKCBfc3Bo
ZXJlICk7CisKKwkJfQorCisJCWZ1bmN0aW9uIGlzU3ByaXRlVmlld2FibGUoIHNwcml0ZSApIHsK
KworCQkJX3NwaGVyZS5jZW50ZXIuc2V0KCAwLCAwLCAwICk7CisJCQlfc3BoZXJlLnJhZGl1cyA9
IDAuNzA3MTA2NzgxMTg2NTQ3NjsKKwkJCV9zcGhlcmUuYXBwbHlNYXRyaXg0KCBzcHJpdGUubWF0
cml4V29ybGQgKTsKKworCQkJcmV0dXJuIGlzU3BoZXJlVmlld2FibGUoIF9zcGhlcmUgKTsKKwor
CQl9CisKKwkJZnVuY3Rpb24gaXNTcGhlcmVWaWV3YWJsZSggc3BoZXJlICkgeworCisJCQlpZiAo
ICEgX2ZydXN0dW0uaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgKSByZXR1cm4gZmFsc2U7CisK
KwkJCXZhciBudW1QbGFuZXMgPSBfY2xpcHBpbmcubnVtUGxhbmVzOworCisJCQlpZiAoIG51bVBs
YW5lcyA9PT0gMCApIHJldHVybiB0cnVlOworCisJCQl2YXIgcGxhbmVzID0gX3RoaXMuY2xpcHBp
bmdQbGFuZXMsCisKKwkJCQljZW50ZXIgPSBzcGhlcmUuY2VudGVyLAorCQkJCW5lZ1JhZCA9IC0g
c3BoZXJlLnJhZGl1cywKKwkJCQlpID0gMDsKKworCQkJZG8geworCisJCQkJLy8gb3V0IHdoZW4g
ZGVlcGVyIHRoYW4gcmFkaXVzIGluIHRoZSBuZWdhdGl2ZSBoYWxmc3BhY2UKKwkJCQlpZiAoIHBs
YW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggY2VudGVyICkgPCBuZWdSYWQgKSByZXR1cm4gZmFs
c2U7CisKKwkJCX0gd2hpbGUgKCArKyBpICE9PSBudW1QbGFuZXMgKTsKKworCQkJcmV0dXJuIHRy
dWU7CisKKwkJfQorCQkqLworCisJCWZ1bmN0aW9uIHByb2plY3RPYmplY3QoIG9iamVjdCwgY2Ft
ZXJhLCBzb3J0T2JqZWN0cyApIHsKKworCQkJaWYgKCAhIG9iamVjdC52aXNpYmxlICkgcmV0dXJu
OworCisJCQl2YXIgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyAp
OworCisJCQlpZiAoIHZpc2libGUgKSB7CisKKwkJCQlpZiAoIG9iamVjdC5pc0xpZ2h0ICkgewor
CisJCQkJCWxpZ2h0cy5wdXNoKCBvYmplY3QgKTsKKworCQkJCX0gZWxzZSBpZiAoIG9iamVjdC5p
c1Nwcml0ZSApIHsKKworCQkJCQlpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0
dW0uaW50ZXJzZWN0c1Nwcml0ZSggb2JqZWN0ICkgKSB7CisKKwkJCQkJCXNwcml0ZXMucHVzaCgg
b2JqZWN0ICk7CisKKwkJCQkJfQorCisJCQkJfSBlbHNlIGlmICggb2JqZWN0LmlzTGVuc0ZsYXJl
ICkgeworCisJCQkJCWxlbnNGbGFyZXMucHVzaCggb2JqZWN0ICk7CisKKwkJCQl9IGVsc2UgaWYg
KCBvYmplY3QuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgKSB7CisKKwkJCQkJaWYgKCBzb3J0T2Jq
ZWN0cyApIHsKKworCQkJCQkJX3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3Qu
bWF0cml4V29ybGQgKQorCQkJCQkJCS5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7
CisKKwkJCQkJfQorCisJCQkJCWN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgbnVsbCwg
b2JqZWN0Lm1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7CisKKwkJCQl9IGVsc2UgaWYgKCBv
YmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzICkgeworCisJ
CQkJCWlmICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggKSB7CisKKwkJCQkJCW9iamVjdC5za2VsZXRv
bi51cGRhdGUoKTsKKworCQkJCQl9CisKKwkJCQkJaWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVk
IHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkgeworCisJCQkJCQlpZiAo
IHNvcnRPYmplY3RzICkgeworCisJCQkJCQkJX3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9u
KCBvYmplY3QubWF0cml4V29ybGQgKQorCQkJCQkJCQkuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVl
bk1hdHJpeCApOworCisJCQkJCQl9CisKKwkJCQkJCXZhciBnZW9tZXRyeSA9IG9iamVjdHMudXBk
YXRlKCBvYmplY3QgKTsKKwkJCQkJCXZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDsKKwor
CQkJCQkJaWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkgeworCisJCQkJCQkJdmFyIGdy
b3VwcyA9IGdlb21ldHJ5Lmdyb3VwczsKKworCQkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGdy
b3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJCQkJCXZhciBncm91cCA9IGdyb3Vw
c1sgaSBdOworCQkJCQkJCQl2YXIgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRl
cmlhbEluZGV4IF07CisKKwkJCQkJCQkJaWYgKCBncm91cE1hdGVyaWFsICYmIGdyb3VwTWF0ZXJp
YWwudmlzaWJsZSApIHsKKworCQkJCQkJCQkJY3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0
LCBnZW9tZXRyeSwgZ3JvdXBNYXRlcmlhbCwgX3ZlY3RvcjMueiwgZ3JvdXAgKTsKKworCQkJCQkJ
CQl9CisKKwkJCQkJCQl9CisKKwkJCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7
CisKKwkJCQkJCQljdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRl
cmlhbCwgX3ZlY3RvcjMueiwgbnVsbCApOworCisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJfQor
CisJCQl9CisKKwkJCXZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjsKKworCQkJZm9yICgg
dmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCXBy
b2plY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgc29ydE9iamVjdHMgKTsKKworCQkJ
fQorCisJCX0KKworCQlmdW5jdGlvbiByZW5kZXJPYmplY3RzKCByZW5kZXJMaXN0LCBzY2VuZSwg
Y2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICkgeworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBy
ZW5kZXJMaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQl2YXIgcmVuZGVySXRlbSA9
IHJlbmRlckxpc3RbIGkgXTsKKworCQkJCXZhciBvYmplY3QgPSByZW5kZXJJdGVtLm9iamVjdDsK
KwkJCQl2YXIgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5OworCQkJCXZhciBtYXRlcmlh
bCA9IG92ZXJyaWRlTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCA/IHJlbmRlckl0ZW0ubWF0ZXJpYWwg
OiBvdmVycmlkZU1hdGVyaWFsOworCQkJCXZhciBncm91cCA9IHJlbmRlckl0ZW0uZ3JvdXA7CisK
KwkJCQlpZiAoIGNhbWVyYS5pc0FycmF5Q2FtZXJhICkgeworCisJCQkJCV9jdXJyZW50QXJyYXlD
YW1lcmEgPSBjYW1lcmE7CisKKwkJCQkJdmFyIGNhbWVyYXMgPSBjYW1lcmEuY2FtZXJhczsKKwor
CQkJCQlmb3IgKCB2YXIgaiA9IDAsIGpsID0gY2FtZXJhcy5sZW5ndGg7IGogPCBqbDsgaiArKyAp
IHsKKworCQkJCQkJdmFyIGNhbWVyYTIgPSBjYW1lcmFzWyBqIF07CisKKwkJCQkJCWlmICggb2Jq
ZWN0LmxheWVycy50ZXN0KCBjYW1lcmEyLmxheWVycyApICkgeworCisJCQkJCQkJdmFyIGJvdW5k
cyA9IGNhbWVyYTIuYm91bmRzOworCisJCQkJCQkJdmFyIHggPSBib3VuZHMueCAqIF93aWR0aDsK
KwkJCQkJCQl2YXIgeSA9IGJvdW5kcy55ICogX2hlaWdodDsKKwkJCQkJCQl2YXIgd2lkdGggPSBi
b3VuZHMueiAqIF93aWR0aDsKKwkJCQkJCQl2YXIgaGVpZ2h0ID0gYm91bmRzLncgKiBfaGVpZ2h0
OworCisJCQkJCQkJX3RoaXMuc2V0Vmlld3BvcnQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTsKKwkJ
CQkJCQlfdGhpcy5zZXRTY2lzc29yKCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7CisJCQkJCQkJX3Ro
aXMuc2V0U2Npc3NvclRlc3QoIHRydWUgKTsKKworCQkJCQkJCXJlbmRlck9iamVjdCggb2JqZWN0
LCBzY2VuZSwgY2FtZXJhMiwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApOworCisJCQkJCQl9
CisKKwkJCQkJfQorCisJCQkJfSBlbHNlIHsKKworCQkJCQlfY3VycmVudEFycmF5Q2FtZXJhID0g
bnVsbDsKKworCQkJCQlyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0
cnksIG1hdGVyaWFsLCBncm91cCApOworCisJCQkJfQorCisJCQl9CisKKwkJfQorCisJCWZ1bmN0
aW9uIHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJp
YWwsIGdyb3VwICkgeworCisJCQlvYmplY3QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmlj
ZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG9iamVjdC5tYXRyaXhXb3JsZCApOworCQkJ
b2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRy
aXggKTsKKworCQkJb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwg
Z2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApOworCisJCQlpZiAoIG9iamVjdC5pc0ltbWVkaWF0
ZVJlbmRlck9iamVjdCApIHsKKworCQkJCXN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCApOwor
CisJCQkJdmFyIHByb2dyYW0gPSBzZXRQcm9ncmFtKCBjYW1lcmEsIHNjZW5lLmZvZywgbWF0ZXJp
YWwsIG9iamVjdCApOworCisJCQkJX2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJzsKKworCQkJ
CXJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApOworCisJ
CQl9IGVsc2UgeworCisJCQkJX3RoaXMucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIHNjZW5l
LmZvZywgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICk7CisKKwkJCX0KKworCQkJ
b2JqZWN0Lm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0
ZXJpYWwsIGdyb3VwICk7CisKKwkJfQorCisJCWZ1bmN0aW9uIGluaXRNYXRlcmlhbCggbWF0ZXJp
YWwsIGZvZywgb2JqZWN0ICkgeworCisJCQl2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVy
dGllcy5nZXQoIG1hdGVyaWFsICk7CisKKwkJCXZhciBwYXJhbWV0ZXJzID0gcHJvZ3JhbUNhY2hl
LmdldFBhcmFtZXRlcnMoCisJCQkJbWF0ZXJpYWwsIF9saWdodHMsIGZvZywgX2NsaXBwaW5nLm51
bVBsYW5lcywgX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbiwgb2JqZWN0ICk7CisKKwkJCXZhciBj
b2RlID0gcHJvZ3JhbUNhY2hlLmdldFByb2dyYW1Db2RlKCBtYXRlcmlhbCwgcGFyYW1ldGVycyAp
OworCisJCQl2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtOworCQkJdmFy
IHByb2dyYW1DaGFuZ2UgPSB0cnVlOworCisJCQlpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCAp
IHsKKworCQkJCS8vIG5ldyBtYXRlcmlhbAorCQkJCW1hdGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIo
ICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTsKKworCQkJfSBlbHNlIGlmICggcHJvZ3Jh
bS5jb2RlICE9PSBjb2RlICkgeworCisJCQkJLy8gY2hhbmdlZCBnbHNsIG9yIHBhcmFtZXRlcnMK
KwkJCQlyZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApOworCisJCQl9
IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkv
LyBzYW1lIGdsc2wgYW5kIHVuaWZvcm0gbGlzdAorCQkJCXJldHVybjsKKworCQkJfSBlbHNlIHsK
KworCQkJCS8vIG9ubHkgcmVidWlsZCB1bmlmb3JtIGxpc3QKKwkJCQlwcm9ncmFtQ2hhbmdlID0g
ZmFsc2U7CisKKwkJCX0KKworCQkJaWYgKCBwcm9ncmFtQ2hhbmdlICkgeworCisJCQkJaWYgKCBw
YXJhbWV0ZXJzLnNoYWRlcklEICkgeworCisJCQkJCXZhciBzaGFkZXIgPSBTaGFkZXJMaWJbIHBh
cmFtZXRlcnMuc2hhZGVySUQgXTsKKworCQkJCQltYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyID0g
eworCQkJCQkJbmFtZTogbWF0ZXJpYWwudHlwZSwKKwkJCQkJCXVuaWZvcm1zOiBVbmlmb3Jtc1V0
aWxzLmNsb25lKCBzaGFkZXIudW5pZm9ybXMgKSwKKwkJCQkJCXZlcnRleFNoYWRlcjogc2hhZGVy
LnZlcnRleFNoYWRlciwKKwkJCQkJCWZyYWdtZW50U2hhZGVyOiBzaGFkZXIuZnJhZ21lbnRTaGFk
ZXIKKwkJCQkJfTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLnNo
YWRlciA9IHsKKwkJCQkJCW5hbWU6IG1hdGVyaWFsLnR5cGUsCisJCQkJCQl1bmlmb3JtczogbWF0
ZXJpYWwudW5pZm9ybXMsCisJCQkJCQl2ZXJ0ZXhTaGFkZXI6IG1hdGVyaWFsLnZlcnRleFNoYWRl
ciwKKwkJCQkJCWZyYWdtZW50U2hhZGVyOiBtYXRlcmlhbC5mcmFnbWVudFNoYWRlcgorCQkJCQl9
OworCisJCQkJfQorCisJCQkJbWF0ZXJpYWwub25CZWZvcmVDb21waWxlKCBtYXRlcmlhbFByb3Bl
cnRpZXMuc2hhZGVyICk7CisKKwkJCQlwcm9ncmFtID0gcHJvZ3JhbUNhY2hlLmFjcXVpcmVQcm9n
cmFtKCBtYXRlcmlhbCwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciwgcGFyYW1ldGVycywgY29k
ZSApOworCisJCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0gPSBwcm9ncmFtOworCQkJCW1h
dGVyaWFsLnByb2dyYW0gPSBwcm9ncmFtOworCisJCQl9CisKKwkJCXZhciBwcm9ncmFtQXR0cmli
dXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpOworCisJCQlpZiAoIG1hdGVyaWFsLm1vcnBo
VGFyZ2V0cyApIHsKKworCQkJCW1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyA9IDA7
CisKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBfdGhpcy5tYXhNb3JwaFRhcmdldHM7IGkgKysg
KSB7CisKKwkJCQkJaWYgKCBwcm9ncmFtQXR0cmlidXRlc1sgJ21vcnBoVGFyZ2V0JyArIGkgXSA+
PSAwICkgeworCisJCQkJCQltYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMgKys7CisK
KwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJCWlmICggbWF0ZXJpYWwubW9ycGhOb3JtYWxz
ICkgeworCisJCQkJbWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzID0gMDsKKworCQkJ
CWZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoTm9ybWFsczsgaSArKyApIHsKKwor
CQkJCQlpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhOb3JtYWwnICsgaSBdID49IDAgKSB7
CisKKwkJCQkJCW1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyArKzsKKworCQkJCQl9
CisKKwkJCQl9CisKKwkJCX0KKworCQkJdmFyIHVuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVz
LnNoYWRlci51bmlmb3JtczsKKworCQkJaWYgKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwg
JiYKKwkJCQkhIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgfHwKKwkJCQltYXRlcmlhbC5j
bGlwcGluZyA9PT0gdHJ1ZSApIHsKKworCQkJCW1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGlu
Z1BsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7CisJCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLm51
bUludGVyc2VjdGlvbiA9IF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb247CisJCQkJdW5pZm9ybXMu
Y2xpcHBpbmdQbGFuZXMgPSBfY2xpcHBpbmcudW5pZm9ybTsKKworCQkJfQorCisJCQltYXRlcmlh
bFByb3BlcnRpZXMuZm9nID0gZm9nOworCisJCQkvLyBzdG9yZSB0aGUgbGlnaHQgc2V0dXAgaXQg
d2FzIGNyZWF0ZWQgZm9yCisKKwkJCW1hdGVyaWFsUHJvcGVydGllcy5saWdodHNIYXNoID0gX2xp
Z2h0cy5oYXNoOworCisJCQlpZiAoIG1hdGVyaWFsLmxpZ2h0cyApIHsKKworCQkJCS8vIHdpcmUg
dXAgdGhlIG1hdGVyaWFsIHRvIHRoaXMgcmVuZGVyZXIncyBsaWdodGluZyBzdGF0ZQorCisJCQkJ
dW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IudmFsdWUgPSBfbGlnaHRzLmFtYmllbnQ7CisJCQkJ
dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMudmFsdWUgPSBfbGlnaHRzLmRpcmVjdGlvbmFsOwor
CQkJCXVuaWZvcm1zLnNwb3RMaWdodHMudmFsdWUgPSBfbGlnaHRzLnNwb3Q7CisJCQkJdW5pZm9y
bXMucmVjdEFyZWFMaWdodHMudmFsdWUgPSBfbGlnaHRzLnJlY3RBcmVhOworCQkJCXVuaWZvcm1z
LnBvaW50TGlnaHRzLnZhbHVlID0gX2xpZ2h0cy5wb2ludDsKKwkJCQl1bmlmb3Jtcy5oZW1pc3Bo
ZXJlTGlnaHRzLnZhbHVlID0gX2xpZ2h0cy5oZW1pOworCisJCQkJdW5pZm9ybXMuZGlyZWN0aW9u
YWxTaGFkb3dNYXAudmFsdWUgPSBfbGlnaHRzLmRpcmVjdGlvbmFsU2hhZG93TWFwOworCQkJCXVu
aWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlID0gX2xpZ2h0cy5kaXJlY3Rpb25h
bFNoYWRvd01hdHJpeDsKKwkJCQl1bmlmb3Jtcy5zcG90U2hhZG93TWFwLnZhbHVlID0gX2xpZ2h0
cy5zcG90U2hhZG93TWFwOworCQkJCXVuaWZvcm1zLnNwb3RTaGFkb3dNYXRyaXgudmFsdWUgPSBf
bGlnaHRzLnNwb3RTaGFkb3dNYXRyaXg7CisJCQkJdW5pZm9ybXMucG9pbnRTaGFkb3dNYXAudmFs
dWUgPSBfbGlnaHRzLnBvaW50U2hhZG93TWFwOworCQkJCXVuaWZvcm1zLnBvaW50U2hhZG93TWF0
cml4LnZhbHVlID0gX2xpZ2h0cy5wb2ludFNoYWRvd01hdHJpeDsKKwkJCQkvLyBUT0RPIChhYmVs
bmF0aW9uKTogYWRkIGFyZWEgbGlnaHRzIHNoYWRvdyBpbmZvIHRvIHVuaWZvcm1zCisKKwkJCX0K
KworCQkJdmFyIHByb2dVbmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtLmdldFVu
aWZvcm1zKCksCisJCQkJdW5pZm9ybXNMaXN0ID0KKwkJCQkJV2ViR0xVbmlmb3Jtcy5zZXFXaXRo
VmFsdWUoIHByb2dVbmlmb3Jtcy5zZXEsIHVuaWZvcm1zICk7CisKKwkJCW1hdGVyaWFsUHJvcGVy
dGllcy51bmlmb3Jtc0xpc3QgPSB1bmlmb3Jtc0xpc3Q7CisKKwkJfQorCisJCWZ1bmN0aW9uIHNl
dFByb2dyYW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICkgeworCisJCQlfdXNlZFRl
eHR1cmVVbml0cyA9IDA7CisKKwkJCXZhciBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVz
LmdldCggbWF0ZXJpYWwgKTsKKworCQkJaWYgKCBfY2xpcHBpbmdFbmFibGVkICkgeworCisJCQkJ
aWYgKCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgY2FtZXJhICE9PSBfY3VycmVudENhbWVyYSAp
IHsKKworCQkJCQl2YXIgdXNlQ2FjaGUgPQorCQkJCQkJY2FtZXJhID09PSBfY3VycmVudENhbWVy
YSAmJgorCQkJCQkJbWF0ZXJpYWwuaWQgPT09IF9jdXJyZW50TWF0ZXJpYWxJZDsKKworCQkJCQkv
LyB3ZSBtaWdodCB3YW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHNvbWUgQ2xpcHBpbmdH
cm91cAorCQkJCQkvLyBvYmplY3QgaW5zdGVhZCBvZiB0aGUgbWF0ZXJpYWwsIG9uY2UgaXQgYmVj
b21lcyBmZWFzaWJsZQorCQkJCQkvLyAoIzg0NjUsICM4Mzc5KQorCQkJCQlfY2xpcHBpbmcuc2V0
U3RhdGUoCisJCQkJCQltYXRlcmlhbC5jbGlwcGluZ1BsYW5lcywgbWF0ZXJpYWwuY2xpcEludGVy
c2VjdGlvbiwgbWF0ZXJpYWwuY2xpcFNoYWRvd3MsCisJCQkJCQljYW1lcmEsIG1hdGVyaWFsUHJv
cGVydGllcywgdXNlQ2FjaGUgKTsKKworCQkJCX0KKworCQkJfQorCisJCQlpZiAoIG1hdGVyaWFs
Lm5lZWRzVXBkYXRlID09PSBmYWxzZSApIHsKKworCQkJCWlmICggbWF0ZXJpYWxQcm9wZXJ0aWVz
LnByb2dyYW0gPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQltYXRlcmlhbC5uZWVkc1VwZGF0ZSA9
IHRydWU7CisKKwkJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5mb2cgJiYgbWF0ZXJpYWxQcm9wZXJ0
aWVzLmZvZyAhPT0gZm9nICkgeworCisJCQkJCW1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsK
KworCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmxpZ2h0cyAmJiBtYXRlcmlhbFByb3BlcnRpZXMu
bGlnaHRzSGFzaCAhPT0gX2xpZ2h0cy5oYXNoICkgeworCisJCQkJCW1hdGVyaWFsLm5lZWRzVXBk
YXRlID0gdHJ1ZTsKKworCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlw
cGluZ1BsYW5lcyAhPT0gdW5kZWZpbmVkICYmCisJCQkJCSggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51
bUNsaXBwaW5nUGxhbmVzICE9PSBfY2xpcHBpbmcubnVtUGxhbmVzIHx8CisJCQkJCW1hdGVyaWFs
UHJvcGVydGllcy5udW1JbnRlcnNlY3Rpb24gIT09IF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb24g
KSApIHsKKworCQkJCQltYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCQl9CisKKwkJ
CX0KKworCQkJaWYgKCBtYXRlcmlhbC5uZWVkc1VwZGF0ZSApIHsKKworCQkJCWluaXRNYXRlcmlh
bCggbWF0ZXJpYWwsIGZvZywgb2JqZWN0ICk7CisJCQkJbWF0ZXJpYWwubmVlZHNVcGRhdGUgPSBm
YWxzZTsKKworCQkJfQorCisJCQl2YXIgcmVmcmVzaFByb2dyYW0gPSBmYWxzZTsKKwkJCXZhciBy
ZWZyZXNoTWF0ZXJpYWwgPSBmYWxzZTsKKwkJCXZhciByZWZyZXNoTGlnaHRzID0gZmFsc2U7CisK
KwkJCXZhciBwcm9ncmFtID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0sCisJCQkJcF91bmlm
b3JtcyA9IHByb2dyYW0uZ2V0VW5pZm9ybXMoKSwKKwkJCQltX3VuaWZvcm1zID0gbWF0ZXJpYWxQ
cm9wZXJ0aWVzLnNoYWRlci51bmlmb3JtczsKKworCQkJaWYgKCBwcm9ncmFtLmlkICE9PSBfY3Vy
cmVudFByb2dyYW0gKSB7CisKKwkJCQlfZ2wudXNlUHJvZ3JhbSggcHJvZ3JhbS5wcm9ncmFtICk7
CisJCQkJX2N1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbS5pZDsKKworCQkJCXJlZnJlc2hQcm9ncmFt
ID0gdHJ1ZTsKKwkJCQlyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlOworCQkJCXJlZnJlc2hMaWdodHMg
PSB0cnVlOworCisJCQl9CisKKwkJCWlmICggbWF0ZXJpYWwuaWQgIT09IF9jdXJyZW50TWF0ZXJp
YWxJZCApIHsKKworCQkJCV9jdXJyZW50TWF0ZXJpYWxJZCA9IG1hdGVyaWFsLmlkOworCisJCQkJ
cmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTsKKworCQkJfQorCisJCQlpZiAoIHJlZnJlc2hQcm9ncmFt
IHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7CisKKwkJCQlwX3VuaWZvcm1zLnNldFZh
bHVlKCBfZ2wsICdwcm9qZWN0aW9uTWF0cml4JywgY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTsK
KworCQkJCWlmICggY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSB7CisKKwkJ
CQkJcF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbG9nRGVwdGhCdWZGQycsCisJCQkJCQkyLjAg
LyAoIE1hdGgubG9nKCBjYW1lcmEuZmFyICsgMS4wICkgLyBNYXRoLkxOMiApICk7CisKKwkJCQl9
CisKKwkJCQkvLyBBdm9pZCB1bm5lZWRlZCB1bmlmb3JtIHVwZGF0ZXMgcGVyIEFycmF5Q2FtZXJh
J3Mgc3ViLWNhbWVyYQorCisJCQkJaWYgKCBfY3VycmVudENhbWVyYSAhPT0gKCBfY3VycmVudEFy
cmF5Q2FtZXJhIHx8IGNhbWVyYSApICkgeworCisJCQkJCV9jdXJyZW50Q2FtZXJhID0gKCBfY3Vy
cmVudEFycmF5Q2FtZXJhIHx8IGNhbWVyYSApOworCisJCQkJCS8vIGxpZ2h0aW5nIHVuaWZvcm1z
IGRlcGVuZCBvbiB0aGUgY2FtZXJhIHNvIGVuZm9yY2UgYW4gdXBkYXRlCisJCQkJCS8vIG5vdywg
aW4gY2FzZSB0aGlzIG1hdGVyaWFsIHN1cHBvcnRzIGxpZ2h0cyAtIG9yIGxhdGVyLCB3aGVuCisJ
CQkJCS8vIHRoZSBuZXh0IG1hdGVyaWFsIHRoYXQgZG9lcyBnZXRzIGFjdGl2YXRlZDoKKworCQkJ
CQlyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlOwkJLy8gc2V0IHRvIHRydWUgb24gbWF0ZXJpYWwgY2hh
bmdlCisJCQkJCXJlZnJlc2hMaWdodHMgPSB0cnVlOwkJLy8gcmVtYWlucyBzZXQgdW50aWwgdXBk
YXRlIGRvbmUKKworCQkJCX0KKworCQkJCS8vIGxvYWQgbWF0ZXJpYWwgc3BlY2lmaWMgdW5pZm9y
bXMKKwkJCQkvLyAoc2hhZGVyIG1hdGVyaWFsIGFsc28gZ2V0cyB0aGVtIGZvciB0aGUgc2FrZSBv
ZiBnZW5lcmljaXR5KQorCisJCQkJaWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8CisJ
CQkJCW1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHwKKwkJCQkJbWF0ZXJpYWwuaXNNZXNo
U3RhbmRhcmRNYXRlcmlhbCB8fAorCQkJCQltYXRlcmlhbC5lbnZNYXAgKSB7CisKKwkJCQkJdmFy
IHVDYW1Qb3MgPSBwX3VuaWZvcm1zLm1hcC5jYW1lcmFQb3NpdGlvbjsKKworCQkJCQlpZiAoIHVD
YW1Qb3MgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJdUNhbVBvcy5zZXRWYWx1ZSggX2dsLAor
CQkJCQkJCV92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxk
ICkgKTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25n
TWF0ZXJpYWwgfHwKKwkJCQkJbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8CisJCQkJ
CW1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHwKKwkJCQkJbWF0ZXJpYWwuaXNNZXNoU3Rh
bmRhcmRNYXRlcmlhbCB8fAorCQkJCQltYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8CisJCQkJ
CW1hdGVyaWFsLnNraW5uaW5nICkgeworCisJCQkJCXBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwg
J3ZpZXdNYXRyaXgnLCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7CisKKwkJCQl9CisKKwkJ
CX0KKworCQkJLy8gc2tpbm5pbmcgdW5pZm9ybXMgbXVzdCBiZSBzZXQgZXZlbiBpZiBtYXRlcmlh
bCBkaWRuJ3QgY2hhbmdlCisJCQkvLyBhdXRvLXNldHRpbmcgb2YgdGV4dHVyZSB1bml0IGZvciBi
b25lIHRleHR1cmUgbXVzdCBnbyBiZWZvcmUgb3RoZXIgdGV4dHVyZXMKKwkJCS8vIG5vdCBzdXJl
IHdoeSwgYnV0IG90aGVyd2lzZSB3ZWlyZCB0aGluZ3MgaGFwcGVuCisKKwkJCWlmICggbWF0ZXJp
YWwuc2tpbm5pbmcgKSB7CisKKwkJCQlwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVj
dCwgJ2JpbmRNYXRyaXgnICk7CisJCQkJcF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBvYmpl
Y3QsICdiaW5kTWF0cml4SW52ZXJzZScgKTsKKworCQkJCXZhciBza2VsZXRvbiA9IG9iamVjdC5z
a2VsZXRvbjsKKworCQkJCWlmICggc2tlbGV0b24gKSB7CisKKwkJCQkJdmFyIGJvbmVzID0gc2tl
bGV0b24uYm9uZXM7CisKKwkJCQkJaWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJl
cyApIHsKKworCQkJCQkJaWYgKCBza2VsZXRvbi5ib25lVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkg
eworCisJCQkJCQkJLy8gbGF5b3V0ICgxIG1hdHJpeCA9IDQgcGl4ZWxzKQorCQkJCQkJCS8vICAg
ICAgUkdCQSBSR0JBIFJHQkEgUkdCQSAoPT4gY29sdW1uMSwgY29sdW1uMiwgY29sdW1uMywgY29s
dW1uNCkKKwkJCQkJCQkvLyAgd2l0aCAgOHg4ICBwaXhlbCB0ZXh0dXJlIG1heCAgIDE2IGJvbmVz
ICogNCBwaXhlbHMgPSAgKDggKiA4KQorCQkJCQkJCS8vICAgICAgIDE2eDE2IHBpeGVsIHRleHR1
cmUgbWF4ICAgNjQgYm9uZXMgKiA0IHBpeGVscyA9ICgxNiAqIDE2KQorCQkJCQkJCS8vICAgICAg
IDMyeDMyIHBpeGVsIHRleHR1cmUgbWF4ICAyNTYgYm9uZXMgKiA0IHBpeGVscyA9ICgzMiAqIDMy
KQorCQkJCQkJCS8vICAgICAgIDY0eDY0IHBpeGVsIHRleHR1cmUgbWF4IDEwMjQgYm9uZXMgKiA0
IHBpeGVscyA9ICg2NCAqIDY0KQorCisKKwkJCQkJCQl2YXIgc2l6ZSA9IE1hdGguc3FydCggYm9u
ZXMubGVuZ3RoICogNCApOyAvLyA0IHBpeGVscyBuZWVkZWQgZm9yIDEgbWF0cml4CisJCQkJCQkJ
c2l6ZSA9IF9NYXRoLm5leHRQb3dlck9mVHdvKCBNYXRoLmNlaWwoIHNpemUgKSApOworCQkJCQkJ
CXNpemUgPSBNYXRoLm1heCggc2l6ZSwgNCApOworCisJCQkJCQkJdmFyIGJvbmVNYXRyaWNlcyA9
IG5ldyBGbG9hdDMyQXJyYXkoIHNpemUgKiBzaXplICogNCApOyAvLyA0IGZsb2F0cyBwZXIgUkdC
QSBwaXhlbAorCQkJCQkJCWJvbmVNYXRyaWNlcy5zZXQoIHNrZWxldG9uLmJvbmVNYXRyaWNlcyAp
OyAvLyBjb3B5IGN1cnJlbnQgdmFsdWVzCisKKwkJCQkJCQl2YXIgYm9uZVRleHR1cmUgPSBuZXcg
RGF0YVRleHR1cmUoIGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRU
eXBlICk7CisKKwkJCQkJCQlza2VsZXRvbi5ib25lTWF0cmljZXMgPSBib25lTWF0cmljZXM7CisJ
CQkJCQkJc2tlbGV0b24uYm9uZVRleHR1cmUgPSBib25lVGV4dHVyZTsKKwkJCQkJCQlza2VsZXRv
bi5ib25lVGV4dHVyZVNpemUgPSBzaXplOworCisJCQkJCQl9CisKKwkJCQkJCXBfdW5pZm9ybXMu
c2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlJywgc2tlbGV0b24uYm9uZVRleHR1cmUgKTsKKwkJ
CQkJCXBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlU2l6ZScsIHNrZWxldG9u
LmJvbmVUZXh0dXJlU2l6ZSApOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCXBfdW5pZm9ybXMu
c2V0T3B0aW9uYWwoIF9nbCwgc2tlbGV0b24sICdib25lTWF0cmljZXMnICk7CisKKwkJCQkJfQor
CisJCQkJfQorCisJCQl9CisKKwkJCWlmICggcmVmcmVzaE1hdGVyaWFsICkgeworCisJCQkJcF91
bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndG9uZU1hcHBpbmdFeHBvc3VyZScsIF90aGlzLnRvbmVN
YXBwaW5nRXhwb3N1cmUgKTsKKwkJCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFw
cGluZ1doaXRlUG9pbnQnLCBfdGhpcy50b25lTWFwcGluZ1doaXRlUG9pbnQgKTsKKworCQkJCWlm
ICggbWF0ZXJpYWwubGlnaHRzICkgeworCisJCQkJCS8vIHRoZSBjdXJyZW50IG1hdGVyaWFsIHJl
cXVpcmVzIGxpZ2h0aW5nIGluZm8KKworCQkJCQkvLyBub3RlOiBhbGwgbGlnaHRpbmcgdW5pZm9y
bXMgYXJlIGFsd2F5cyBzZXQgY29ycmVjdGx5CisJCQkJCS8vIHRoZXkgc2ltcGx5IHJlZmVyZW5j
ZSB0aGUgcmVuZGVyZXIncyBzdGF0ZSBmb3IgdGhlaXIKKwkJCQkJLy8gdmFsdWVzCisJCQkJCS8v
CisJCQkJCS8vIHVzZSB0aGUgY3VycmVudCBtYXRlcmlhbCdzIC5uZWVkc1VwZGF0ZSBmbGFncyB0
byBzZXQKKwkJCQkJLy8gdGhlIEdMIHN0YXRlIHdoZW4gcmVxdWlyZWQKKworCQkJCQltYXJrVW5p
Zm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggbV91bmlmb3JtcywgcmVmcmVzaExpZ2h0cyApOworCisJ
CQkJfQorCisJCQkJLy8gcmVmcmVzaCB1bmlmb3JtcyBjb21tb24gdG8gc2V2ZXJhbCBtYXRlcmlh
bHMKKworCQkJCWlmICggZm9nICYmIG1hdGVyaWFsLmZvZyApIHsKKworCQkJCQlyZWZyZXNoVW5p
Zm9ybXNGb2coIG1fdW5pZm9ybXMsIGZvZyApOworCisJCQkJfQorCisJCQkJaWYgKCBtYXRlcmlh
bC5pc01lc2hCYXNpY01hdGVyaWFsIHx8CisJCQkJCW1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRl
cmlhbCB8fAorCQkJCQltYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8CisJCQkJCW1hdGVy
aWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHwKKwkJCQkJbWF0ZXJpYWwuaXNNZXNoTm9ybWFs
TWF0ZXJpYWwgfHwKKwkJCQkJbWF0ZXJpYWwuaXNNZXNoRGVwdGhNYXRlcmlhbCApIHsKKworCQkJ
CQlyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CisKKwkJCQl9
CisKKwkJCQkvLyByZWZyZXNoIHNpbmdsZSBtYXRlcmlhbCBzcGVjaWZpYyB1bmlmb3JtcworCisJ
CQkJaWYgKCBtYXRlcmlhbC5pc0xpbmVCYXNpY01hdGVyaWFsICkgeworCisJCQkJCXJlZnJlc2hV
bmlmb3Jtc0xpbmUoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CisKKwkJCQl9IGVsc2UgaWYgKCBt
YXRlcmlhbC5pc0xpbmVEYXNoZWRNYXRlcmlhbCApIHsKKworCQkJCQlyZWZyZXNoVW5pZm9ybXNM
aW5lKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOworCQkJCQlyZWZyZXNoVW5pZm9ybXNEYXNoKCBt
X3VuaWZvcm1zLCBtYXRlcmlhbCApOworCisJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNQb2lu
dHNNYXRlcmlhbCApIHsKKworCQkJCQlyZWZyZXNoVW5pZm9ybXNQb2ludHMoIG1fdW5pZm9ybXMs
IG1hdGVyaWFsICk7CisKKwkJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0
ZXJpYWwgKSB7CisKKwkJCQkJcmVmcmVzaFVuaWZvcm1zTGFtYmVydCggbV91bmlmb3JtcywgbWF0
ZXJpYWwgKTsKKworCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCAp
IHsKKworCQkJCQlyZWZyZXNoVW5pZm9ybXNUb29uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOwor
CisJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCApIHsKKworCQkJ
CQlyZWZyZXNoVW5pZm9ybXNQaG9uZyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKKworCQkJCX0g
ZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgKSB7CisKKwkJCQkJcmVm
cmVzaFVuaWZvcm1zUGh5c2ljYWwoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CisKKwkJCQl9IGVs
c2UgaWYgKCBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsICkgeworCisJCQkJCXJlZnJl
c2hVbmlmb3Jtc1N0YW5kYXJkKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOworCisJCQkJfSBlbHNl
IGlmICggbWF0ZXJpYWwuaXNNZXNoRGVwdGhNYXRlcmlhbCApIHsKKworCQkJCQlpZiAoIG1hdGVy
aWFsLmRpc3BsYWNlbWVudE1hcCApIHsKKworCQkJCQkJbV91bmlmb3Jtcy5kaXNwbGFjZW1lbnRN
YXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7CisJCQkJCQltX3VuaWZvcm1zLmRp
c3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7CisJCQkJ
CQltX3VuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1l
bnRCaWFzOworCisJCQkJCX0KKworCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaE5vcm1h
bE1hdGVyaWFsICkgeworCisJCQkJCXJlZnJlc2hVbmlmb3Jtc05vcm1hbCggbV91bmlmb3Jtcywg
bWF0ZXJpYWwgKTsKKworCQkJCX0KKworCQkJCS8vIFJlY3RBcmVhTGlnaHQgVGV4dHVyZQorCQkJ
CS8vIFRPRE8gKG1yZG9vYik6IEZpbmQgYSBuaWNlciBpbXBsZW1lbnRhdGlvbgorCisJCQkJaWYg
KCBtX3VuaWZvcm1zLmx0Y01hdCAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNNYXQudmFs
dWUgPSBVbmlmb3Jtc0xpYi5MVENfTUFUX1RFWFRVUkU7CisJCQkJaWYgKCBtX3VuaWZvcm1zLmx0
Y01hZyAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNNYWcudmFsdWUgPSBVbmlmb3Jtc0xp
Yi5MVENfTUFHX1RFWFRVUkU7CisKKwkJCQlXZWJHTFVuaWZvcm1zLnVwbG9hZCgKKwkJCQkJX2ds
LCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCBfdGhpcyApOwor
CisJCQl9CisKKworCQkJLy8gY29tbW9uIG1hdHJpY2VzCisKKwkJCXBfdW5pZm9ybXMuc2V0VmFs
dWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTsKKwkJ
CXBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ25vcm1hbE1hdHJpeCcsIG9iamVjdC5ub3JtYWxN
YXRyaXggKTsKKwkJCXBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsTWF0cml4Jywgb2Jq
ZWN0Lm1hdHJpeFdvcmxkICk7CisKKwkJCXJldHVybiBwcm9ncmFtOworCisJCX0KKworCQkvLyBV
bmlmb3JtcyAocmVmcmVzaCB1bmlmb3JtcyBvYmplY3RzKQorCisJCWZ1bmN0aW9uIHJlZnJlc2hV
bmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkgeworCisJCQl1bmlmb3Jtcy5vcGFj
aXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTsKKworCQkJdW5pZm9ybXMuZGlmZnVzZS52YWx1
ZSA9IG1hdGVyaWFsLmNvbG9yOworCisJCQlpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkgeworCisJ
CQkJdW5pZm9ybXMuZW1pc3NpdmUudmFsdWUuY29weSggbWF0ZXJpYWwuZW1pc3NpdmUgKS5tdWx0
aXBseVNjYWxhciggbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgKTsKKworCQkJfQorCisJCQl1
bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7CisJCQl1bmlmb3Jtcy5zcGVjdWxhck1h
cC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwOworCQkJdW5pZm9ybXMuYWxwaGFNYXAudmFs
dWUgPSBtYXRlcmlhbC5hbHBoYU1hcDsKKworCQkJaWYgKCBtYXRlcmlhbC5saWdodE1hcCApIHsK
KworCQkJCXVuaWZvcm1zLmxpZ2h0TWFwLnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXA7CisJCQkJ
dW5pZm9ybXMubGlnaHRNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5saWdodE1hcEludGVu
c2l0eTsKKworCQkJfQorCisJCQlpZiAoIG1hdGVyaWFsLmFvTWFwICkgeworCisJCQkJdW5pZm9y
bXMuYW9NYXAudmFsdWUgPSBtYXRlcmlhbC5hb01hcDsKKwkJCQl1bmlmb3Jtcy5hb01hcEludGVu
c2l0eS52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5OworCisJCQl9CisKKwkJCS8vIHV2
IHJlcGVhdCBhbmQgb2Zmc2V0IHNldHRpbmcgcHJpb3JpdGllcworCQkJLy8gMS4gY29sb3IgbWFw
CisJCQkvLyAyLiBzcGVjdWxhciBtYXAKKwkJCS8vIDMuIG5vcm1hbCBtYXAKKwkJCS8vIDQuIGJ1
bXAgbWFwCisJCQkvLyA1LiBhbHBoYSBtYXAKKwkJCS8vIDYuIGVtaXNzaXZlIG1hcAorCisJCQl2
YXIgdXZTY2FsZU1hcDsKKworCQkJaWYgKCBtYXRlcmlhbC5tYXAgKSB7CisKKwkJCQl1dlNjYWxl
TWFwID0gbWF0ZXJpYWwubWFwOworCisJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5zcGVjdWxhck1h
cCApIHsKKworCQkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDsKKworCQkJfSBl
bHNlIGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkgeworCisJCQkJdXZTY2FsZU1hcCA9
IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDsKKworCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwubm9y
bWFsTWFwICkgeworCisJCQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFsLm5vcm1hbE1hcDsKKworCQkJ
fSBlbHNlIGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHsKKworCQkJCXV2U2NhbGVNYXAgPSBtYXRl
cmlhbC5idW1wTWFwOworCisJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgKSB7
CisKKwkJCQl1dlNjYWxlTWFwID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwOworCisJCQl9IGVsc2Ug
aWYgKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgKSB7CisKKwkJCQl1dlNjYWxlTWFwID0gbWF0ZXJp
YWwubWV0YWxuZXNzTWFwOworCisJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHsK
KworCQkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDsKKworCQkJfSBlbHNlIGlmICgg
bWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7CisKKwkJCQl1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZW1p
c3NpdmVNYXA7CisKKwkJCX0KKworCQkJaWYgKCB1dlNjYWxlTWFwICE9PSB1bmRlZmluZWQgKSB7
CisKKwkJCQkvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorCQkJCWlmICggdXZTY2FsZU1hcC5p
c1dlYkdMUmVuZGVyVGFyZ2V0ICkgeworCisJCQkJCXV2U2NhbGVNYXAgPSB1dlNjYWxlTWFwLnRl
eHR1cmU7CisKKwkJCQl9CisKKwkJCQl2YXIgb2Zmc2V0ID0gdXZTY2FsZU1hcC5vZmZzZXQ7CisJ
CQkJdmFyIHJlcGVhdCA9IHV2U2NhbGVNYXAucmVwZWF0OworCisJCQkJdW5pZm9ybXMub2Zmc2V0
UmVwZWF0LnZhbHVlLnNldCggb2Zmc2V0LngsIG9mZnNldC55LCByZXBlYXQueCwgcmVwZWF0Lnkg
KTsKKworCQkJfQorCisJCQl1bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXA7
CisKKwkJCS8vIGRvbid0IGZsaXAgQ3ViZVRleHR1cmUgZW52TWFwcywgZmxpcCBldmVyeXRoaW5n
IGVsc2U6CisJCQkvLyAgV2ViR0xSZW5kZXJUYXJnZXRDdWJlIHdpbGwgYmUgZmxpcHBlZCBmb3Ig
YmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKwkJCS8vICBXZWJHTFJlbmRlclRhcmdldEN1YmUudGV4
dHVyZSB3aWxsIGJlIGZsaXBwZWQgYmVjYXVzZSBpdCdzIGEgVGV4dHVyZSBhbmQgTk9UIGEgQ3Vi
ZVRleHR1cmUKKwkJCS8vIHRoaXMgY2hlY2sgbXVzdCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBv
ciByZW1vdmVkIGVudGlyZWx5LCBpZiBXZWJHTFJlbmRlclRhcmdldEN1YmUgdXNlcyBhIEN1YmVU
ZXh0dXJlIGluIHRoZSBmdXR1cmUKKwkJCXVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSAoICEg
KCBtYXRlcmlhbC5lbnZNYXAgJiYgbWF0ZXJpYWwuZW52TWFwLmlzQ3ViZVRleHR1cmUgKSApID8g
MSA6IC0gMTsKKworCQkJdW5pZm9ybXMucmVmbGVjdGl2aXR5LnZhbHVlID0gbWF0ZXJpYWwucmVm
bGVjdGl2aXR5OworCQkJdW5pZm9ybXMucmVmcmFjdGlvblJhdGlvLnZhbHVlID0gbWF0ZXJpYWwu
cmVmcmFjdGlvblJhdGlvOworCisJCX0KKworCQlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMaW5l
KCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7CisKKwkJCXVuaWZvcm1zLmRpZmZ1c2UudmFsdWUgPSBt
YXRlcmlhbC5jb2xvcjsKKwkJCXVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFj
aXR5OworCisJCX0KKworCQlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEYXNoKCB1bmlmb3Jtcywg
bWF0ZXJpYWwgKSB7CisKKwkJCXVuaWZvcm1zLmRhc2hTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFz
aFNpemU7CisJCQl1bmlmb3Jtcy50b3RhbFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZSAr
IG1hdGVyaWFsLmdhcFNpemU7CisJCQl1bmlmb3Jtcy5zY2FsZS52YWx1ZSA9IG1hdGVyaWFsLnNj
YWxlOworCisJCX0KKworCQlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQb2ludHMoIHVuaWZvcm1z
LCBtYXRlcmlhbCApIHsKKworCQkJdW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNv
bG9yOworCQkJdW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7CisJCQl1
bmlmb3Jtcy5zaXplLnZhbHVlID0gbWF0ZXJpYWwuc2l6ZSAqIF9waXhlbFJhdGlvOworCQkJdW5p
Zm9ybXMuc2NhbGUudmFsdWUgPSBfaGVpZ2h0ICogMC41OworCisJCQl1bmlmb3Jtcy5tYXAudmFs
dWUgPSBtYXRlcmlhbC5tYXA7CisKKwkJCWlmICggbWF0ZXJpYWwubWFwICE9PSBudWxsICkgewor
CisJCQkJdmFyIG9mZnNldCA9IG1hdGVyaWFsLm1hcC5vZmZzZXQ7CisJCQkJdmFyIHJlcGVhdCA9
IG1hdGVyaWFsLm1hcC5yZXBlYXQ7CisKKwkJCQl1bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUu
c2V0KCBvZmZzZXQueCwgb2Zmc2V0LnksIHJlcGVhdC54LCByZXBlYXQueSApOworCisJCQl9CisK
KwkJfQorCisJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0ZvZyggdW5pZm9ybXMsIGZvZyApIHsK
KworCQkJdW5pZm9ybXMuZm9nQ29sb3IudmFsdWUgPSBmb2cuY29sb3I7CisKKwkJCWlmICggZm9n
LmlzRm9nICkgeworCisJCQkJdW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyOworCQkJ
CXVuaWZvcm1zLmZvZ0Zhci52YWx1ZSA9IGZvZy5mYXI7CisKKwkJCX0gZWxzZSBpZiAoIGZvZy5p
c0ZvZ0V4cDIgKSB7CisKKwkJCQl1bmlmb3Jtcy5mb2dEZW5zaXR5LnZhbHVlID0gZm9nLmRlbnNp
dHk7CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGFtYmVydCgg
dW5pZm9ybXMsIG1hdGVyaWFsICkgeworCisJCQlpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkg
eworCisJCQkJdW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1h
cDsKKworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5p
Zm9ybXMsIG1hdGVyaWFsICkgeworCisJCQl1bmlmb3Jtcy5zcGVjdWxhci52YWx1ZSA9IG1hdGVy
aWFsLnNwZWN1bGFyOworCQkJdW5pZm9ybXMuc2hpbmluZXNzLnZhbHVlID0gTWF0aC5tYXgoIG1h
dGVyaWFsLnNoaW5pbmVzcywgMWUtNCApOyAvLyB0byBwcmV2ZW50IHBvdyggMC4wLCAwLjAgKQor
CisJCQlpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkgeworCisJCQkJdW5pZm9ybXMuZW1pc3Np
dmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDsKKworCQkJfQorCisJCQlpZiAoIG1h
dGVyaWFsLmJ1bXBNYXAgKSB7CisKKwkJCQl1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJp
YWwuYnVtcE1hcDsKKwkJCQl1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1w
U2NhbGU7CisKKwkJCX0KKworCQkJaWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7CisKKwkJCQl1
bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7CisJCQkJdW5pZm9y
bXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTsKKworCQkJ
fQorCisJCQlpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHsKKworCQkJCXVuaWZvcm1z
LmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDsKKwkJCQl1
bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNj
YWxlOworCQkJCXVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNw
bGFjZW1lbnRCaWFzOworCisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jt
c1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKKworCQkJcmVmcmVzaFVuaWZvcm1zUGhvbmco
IHVuaWZvcm1zLCBtYXRlcmlhbCApOworCisJCQlpZiAoIG1hdGVyaWFsLmdyYWRpZW50TWFwICkg
eworCisJCQkJdW5pZm9ybXMuZ3JhZGllbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5ncmFkaWVudE1h
cDsKKworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCgg
dW5pZm9ybXMsIG1hdGVyaWFsICkgeworCisJCQl1bmlmb3Jtcy5yb3VnaG5lc3MudmFsdWUgPSBt
YXRlcmlhbC5yb3VnaG5lc3M7CisJCQl1bmlmb3Jtcy5tZXRhbG5lc3MudmFsdWUgPSBtYXRlcmlh
bC5tZXRhbG5lc3M7CisKKwkJCWlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkgeworCisJCQkJ
dW5pZm9ybXMucm91Z2huZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwOworCisJ
CQl9CisKKwkJCWlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkgeworCisJCQkJdW5pZm9ybXMu
bWV0YWxuZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwOworCisJCQl9CisKKwkJ
CWlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7CisKKwkJCQl1bmlmb3Jtcy5lbWlzc2l2ZU1h
cC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwOworCisJCQl9CisKKwkJCWlmICggbWF0ZXJp
YWwuYnVtcE1hcCApIHsKKworCQkJCXVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5i
dW1wTWFwOworCQkJCXVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2Fs
ZTsKKworCQkJfQorCisJCQlpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHsKKworCQkJCXVuaWZv
cm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDsKKwkJCQl1bmlmb3Jtcy5u
b3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApOworCisJCQl9CisK
KwkJCWlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkgeworCisJCQkJdW5pZm9ybXMuZGlz
cGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwOworCQkJCXVuaWZv
cm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7
CisJCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNl
bWVudEJpYXM7CisKKwkJCX0KKworCQkJaWYgKCBtYXRlcmlhbC5lbnZNYXAgKSB7CisKKwkJCQkv
L3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDsgLy8gcGFydCBvZiB1bmlm
b3JtcyBjb21tb24KKwkJCQl1bmlmb3Jtcy5lbnZNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlh
bC5lbnZNYXBJbnRlbnNpdHk7CisKKwkJCX0KKworCQl9CisKKwkJZnVuY3Rpb24gcmVmcmVzaFVu
aWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKKworCQkJdW5pZm9ybXMuY2xl
YXJDb2F0LnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJDb2F0OworCQkJdW5pZm9ybXMuY2xlYXJDb2F0
Um91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzOworCisJCQlyZWZy
ZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICk7CisKKwkJfQorCisJCWZ1
bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggdW5pZm9ybXMsIG1hdGVyaWFsICkgeworCisJ
CQlpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7CisKKwkJCQl1bmlmb3Jtcy5idW1wTWFwLnZhbHVl
ID0gbWF0ZXJpYWwuYnVtcE1hcDsKKwkJCQl1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRl
cmlhbC5idW1wU2NhbGU7CisKKwkJCX0KKworCQkJaWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7
CisKKwkJCQl1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7CisJ
CQkJdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUg
KTsKKworCQkJfQorCisJCQlpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHsKKworCQkJ
CXVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1h
cDsKKwkJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3Bs
YWNlbWVudFNjYWxlOworCQkJCXVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRl
cmlhbC5kaXNwbGFjZW1lbnRCaWFzOworCisJCQl9CisKKwkJfQorCisJCS8vIElmIHVuaWZvcm1z
IGFyZSBtYXJrZWQgYXMgY2xlYW4sIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBsb2FkZWQgdG8gdGhl
IEdQVS4KKworCQlmdW5jdGlvbiBtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggdW5pZm9y
bXMsIHZhbHVlICkgeworCisJCQl1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0
ZSA9IHZhbHVlOworCisJCQl1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZSA9
IHZhbHVlOworCQkJdW5pZm9ybXMucG9pbnRMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTsKKwkJ
CXVuaWZvcm1zLnNwb3RMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTsKKwkJCXVuaWZvcm1zLnJl
Y3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7CisJCQl1bmlmb3Jtcy5oZW1pc3BoZXJl
TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7CisKKwkJfQorCisJCS8vIExpZ2h0aW5nCisKKwkJ
ZnVuY3Rpb24gc2V0dXBTaGFkb3dzKCBsaWdodHMgKSB7CisKKwkJCXZhciBsaWdodFNoYWRvd3NM
ZW5ndGggPSAwOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBsaWdodHMubGVuZ3RoOyBpIDwg
bDsgaSArKyApIHsKKworCQkJCXZhciBsaWdodCA9IGxpZ2h0c1sgaSBdOworCisJCQkJaWYgKCBs
aWdodC5jYXN0U2hhZG93ICkgeworCisJCQkJCV9saWdodHMuc2hhZG93c1sgbGlnaHRTaGFkb3dz
TGVuZ3RoIF0gPSBsaWdodDsKKwkJCQkJbGlnaHRTaGFkb3dzTGVuZ3RoICsrOworCisJCQkJfQor
CisJCQl9CisKKwkJCV9saWdodHMuc2hhZG93cy5sZW5ndGggPSBsaWdodFNoYWRvd3NMZW5ndGg7
CisKKwkJfQorCisJCWZ1bmN0aW9uIHNldHVwTGlnaHRzKCBsaWdodHMsIGNhbWVyYSApIHsKKwor
CQkJdmFyIGwsIGxsLCBsaWdodCwgc2hhZG93LAorCQkJCXIgPSAwLCBnID0gMCwgYiA9IDAsCisJ
CQkJY29sb3IsCisJCQkJaW50ZW5zaXR5LAorCQkJCWRpc3RhbmNlLAorCQkJCXNoYWRvd01hcCwK
KworCQkJCXZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLAorCisJCQkJZGly
ZWN0aW9uYWxMZW5ndGggPSAwLAorCQkJCXBvaW50TGVuZ3RoID0gMCwKKwkJCQlzcG90TGVuZ3Ro
ID0gMCwKKwkJCQlyZWN0QXJlYUxlbmd0aCA9IDAsCisJCQkJaGVtaUxlbmd0aCA9IDA7CisKKwkJ
CWZvciAoIGwgPSAwLCBsbCA9IGxpZ2h0cy5sZW5ndGg7IGwgPCBsbDsgbCArKyApIHsKKworCQkJ
CWxpZ2h0ID0gbGlnaHRzWyBsIF07CisKKwkJCQljb2xvciA9IGxpZ2h0LmNvbG9yOworCQkJCWlu
dGVuc2l0eSA9IGxpZ2h0LmludGVuc2l0eTsKKwkJCQlkaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNl
OworCisJCQkJc2hhZG93TWFwID0gKCBsaWdodC5zaGFkb3cgJiYgbGlnaHQuc2hhZG93Lm1hcCAp
ID8gbGlnaHQuc2hhZG93Lm1hcC50ZXh0dXJlIDogbnVsbDsKKworCQkJCWlmICggbGlnaHQuaXNB
bWJpZW50TGlnaHQgKSB7CisKKwkJCQkJciArPSBjb2xvci5yICogaW50ZW5zaXR5OworCQkJCQln
ICs9IGNvbG9yLmcgKiBpbnRlbnNpdHk7CisJCQkJCWIgKz0gY29sb3IuYiAqIGludGVuc2l0eTsK
KworCQkJCX0gZWxzZSBpZiAoIGxpZ2h0LmlzRGlyZWN0aW9uYWxMaWdodCApIHsKKworCQkJCQl2
YXIgdW5pZm9ybXMgPSBsaWdodENhY2hlLmdldCggbGlnaHQgKTsKKworCQkJCQl1bmlmb3Jtcy5j
b2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBsaWdodC5pbnRlbnNpdHkg
KTsKKwkJCQkJdW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQu
bWF0cml4V29ybGQgKTsKKwkJCQkJX3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdo
dC50YXJnZXQubWF0cml4V29ybGQgKTsKKwkJCQkJdW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggX3Zl
Y3RvcjMgKTsKKwkJCQkJdW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmll
d01hdHJpeCApOworCisJCQkJCXVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7CisK
KwkJCQkJaWYgKCBsaWdodC5jYXN0U2hhZG93ICkgeworCisJCQkJCQlzaGFkb3cgPSBsaWdodC5z
aGFkb3c7CisKKwkJCQkJCXVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhczsKKwkJCQkJ
CXVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7CisJCQkJCQl1bmlmb3Jtcy5z
aGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7CisKKwkJCQkJfQorCisJCQkJCV9saWdodHMu
ZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBzaGFkb3dNYXA7CisJ
CQkJCV9saWdodHMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGRpcmVjdGlvbmFsTGVuZ3RoIF0g
PSBsaWdodC5zaGFkb3cubWF0cml4OworCQkJCQlfbGlnaHRzLmRpcmVjdGlvbmFsWyBkaXJlY3Rp
b25hbExlbmd0aCBdID0gdW5pZm9ybXM7CisKKwkJCQkJZGlyZWN0aW9uYWxMZW5ndGggKys7CisK
KwkJCQl9IGVsc2UgaWYgKCBsaWdodC5pc1Nwb3RMaWdodCApIHsKKworCQkJCQl2YXIgdW5pZm9y
bXMgPSBsaWdodENhY2hlLmdldCggbGlnaHQgKTsKKworCQkJCQl1bmlmb3Jtcy5wb3NpdGlvbi5z
ZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CisJCQkJCXVuaWZvcm1z
LnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApOworCisJCQkJCXVuaWZvcm1zLmNv
bG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApOworCQkJCQl1bmlm
b3Jtcy5kaXN0YW5jZSA9IGRpc3RhbmNlOworCisJCQkJCXVuaWZvcm1zLmRpcmVjdGlvbi5zZXRG
cm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CisJCQkJCV92ZWN0b3IzLnNl
dEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7CisJCQkJCXVu
aWZvcm1zLmRpcmVjdGlvbi5zdWIoIF92ZWN0b3IzICk7CisJCQkJCXVuaWZvcm1zLmRpcmVjdGlv
bi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTsKKworCQkJCQl1bmlmb3Jtcy5jb25l
Q29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICk7CisJCQkJCXVuaWZvcm1zLnBlbnVtYnJhQ29z
ID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICogKCAxIC0gbGlnaHQucGVudW1icmEgKSApOworCQkJ
CQl1bmlmb3Jtcy5kZWNheSA9ICggbGlnaHQuZGlzdGFuY2UgPT09IDAgKSA/IDAuMCA6IGxpZ2h0
LmRlY2F5OworCisJCQkJCXVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7CisKKwkJ
CQkJaWYgKCBsaWdodC5jYXN0U2hhZG93ICkgeworCisJCQkJCQlzaGFkb3cgPSBsaWdodC5zaGFk
b3c7CisKKwkJCQkJCXVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhczsKKwkJCQkJCXVu
aWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7CisJCQkJCQl1bmlmb3Jtcy5zaGFk
b3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7CisKKwkJCQkJfQorCisJCQkJCV9saWdodHMuc3Bv
dFNoYWRvd01hcFsgc3BvdExlbmd0aCBdID0gc2hhZG93TWFwOworCQkJCQlfbGlnaHRzLnNwb3RT
aGFkb3dNYXRyaXhbIHNwb3RMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7CisJCQkJCV9s
aWdodHMuc3BvdFsgc3BvdExlbmd0aCBdID0gdW5pZm9ybXM7CisKKwkJCQkJc3BvdExlbmd0aCAr
KzsKKworCQkJCX0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHsKKworCQkJCQl2
YXIgdW5pZm9ybXMgPSBsaWdodENhY2hlLmdldCggbGlnaHQgKTsKKworCQkJCQkvLyAoYSkgaW50
ZW5zaXR5IGNvbnRyb2xzIGlycmFkaWFuY2Ugb2YgZW50aXJlIGxpZ2h0CisJCQkJCXVuaWZvcm1z
LmNvbG9yCisJCQkJCQkuY29weSggY29sb3IgKQorCQkJCQkJLm11bHRpcGx5U2NhbGFyKCBpbnRl
bnNpdHkgLyAoIGxpZ2h0LndpZHRoICogbGlnaHQuaGVpZ2h0ICkgKTsKKworCQkJCQkvLyAoYikg
aW50ZW5zaXR5IGNvbnRyb2xzIHRoZSByYWRpYW5jZSBwZXIgbGlnaHQgYXJlYQorCQkJCQkvLyB1
bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTsK
KworCQkJCQl1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1h
dHJpeFdvcmxkICk7CisJCQkJCXVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01h
dHJpeCApOworCisJCQkJCS8vIGV4dHJhY3QgbG9jYWwgcm90YXRpb24gb2YgbGlnaHQgdG8gZGVy
aXZlIHdpZHRoL2hlaWdodCBoYWxmIHZlY3RvcnMKKwkJCQkJX21hdHJpeDQyLmlkZW50aXR5KCk7
CisJCQkJCV9tYXRyaXg0LmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CisJCQkJCV9tYXRyaXg0
LnByZW11bHRpcGx5KCB2aWV3TWF0cml4ICk7CisJCQkJCV9tYXRyaXg0Mi5leHRyYWN0Um90YXRp
b24oIF9tYXRyaXg0ICk7CisKKwkJCQkJdW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lk
dGggKiAwLjUsICAgICAgICAgICAgICAgIDAuMCwgMC4wICk7CisJCQkJCXVuaWZvcm1zLmhhbGZI
ZWlnaHQuc2V0KCAgICAgICAgICAgICAgMC4wLCBsaWdodC5oZWlnaHQgKiAwLjUsIDAuMCApOwor
CisJCQkJCXVuaWZvcm1zLmhhbGZXaWR0aC5hcHBseU1hdHJpeDQoIF9tYXRyaXg0MiApOworCQkJ
CQl1bmlmb3Jtcy5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NCggX21hdHJpeDQyICk7CisKKwkJCQkJ
Ly8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgZGlzdGFuY2U/CisJCQkJCS8vIHVu
aWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7CisKKwkJCQkJX2xpZ2h0cy5yZWN0QXJlYVsgcmVj
dEFyZWFMZW5ndGggXSA9IHVuaWZvcm1zOworCisJCQkJCXJlY3RBcmVhTGVuZ3RoICsrOworCisJ
CQkJfSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkgeworCisJCQkJCXZhciB1bmlmb3Jt
cyA9IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApOworCisJCQkJCXVuaWZvcm1zLnBvc2l0aW9uLnNl
dEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKKwkJCQkJdW5pZm9ybXMu
cG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7CisKKwkJCQkJdW5pZm9ybXMuY29s
b3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7
CisJCQkJCXVuaWZvcm1zLmRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7CisJCQkJCXVuaWZvcm1z
LmRlY2F5ID0gKCBsaWdodC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVjYXk7CisK
KwkJCQkJdW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdzsKKworCQkJCQlpZiAoIGxp
Z2h0LmNhc3RTaGFkb3cgKSB7CisKKwkJCQkJCXNoYWRvdyA9IGxpZ2h0LnNoYWRvdzsKKworCQkJ
CQkJdW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzOworCQkJCQkJdW5pZm9ybXMuc2hh
ZG93UmFkaXVzID0gc2hhZG93LnJhZGl1czsKKwkJCQkJCXVuaWZvcm1zLnNoYWRvd01hcFNpemUg
PSBzaGFkb3cubWFwU2l6ZTsKKworCQkJCQl9CisKKwkJCQkJX2xpZ2h0cy5wb2ludFNoYWRvd01h
cFsgcG9pbnRMZW5ndGggXSA9IHNoYWRvd01hcDsKKwkJCQkJX2xpZ2h0cy5wb2ludFNoYWRvd01h
dHJpeFsgcG9pbnRMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7CisJCQkJCV9saWdodHMu
cG9pbnRbIHBvaW50TGVuZ3RoIF0gPSB1bmlmb3JtczsKKworCQkJCQlwb2ludExlbmd0aCArKzsK
KworCQkJCX0gZWxzZSBpZiAoIGxpZ2h0LmlzSGVtaXNwaGVyZUxpZ2h0ICkgeworCisJCQkJCXZh
ciB1bmlmb3JtcyA9IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApOworCisJCQkJCXVuaWZvcm1zLmRp
cmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CisJCQkJ
CXVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTsKKwkJ
CQkJdW5pZm9ybXMuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpOworCisJCQkJCXVuaWZvcm1zLnNreUNv
bG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApOworCQkJ
CQl1bmlmb3Jtcy5ncm91bmRDb2xvci5jb3B5KCBsaWdodC5ncm91bmRDb2xvciApLm11bHRpcGx5
U2NhbGFyKCBpbnRlbnNpdHkgKTsKKworCQkJCQlfbGlnaHRzLmhlbWlbIGhlbWlMZW5ndGggXSA9
IHVuaWZvcm1zOworCisJCQkJCWhlbWlMZW5ndGggKys7CisKKwkJCQl9CisKKwkJCX0KKworCQkJ
X2xpZ2h0cy5hbWJpZW50WyAwIF0gPSByOworCQkJX2xpZ2h0cy5hbWJpZW50WyAxIF0gPSBnOwor
CQkJX2xpZ2h0cy5hbWJpZW50WyAyIF0gPSBiOworCisJCQlfbGlnaHRzLmRpcmVjdGlvbmFsLmxl
bmd0aCA9IGRpcmVjdGlvbmFsTGVuZ3RoOworCQkJX2xpZ2h0cy5zcG90Lmxlbmd0aCA9IHNwb3RM
ZW5ndGg7CisJCQlfbGlnaHRzLnJlY3RBcmVhLmxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoOworCQkJ
X2xpZ2h0cy5wb2ludC5sZW5ndGggPSBwb2ludExlbmd0aDsKKwkJCV9saWdodHMuaGVtaS5sZW5n
dGggPSBoZW1pTGVuZ3RoOworCisJCQkvLyBUT0RPIChzYW0tZy1zdGVlbCkgd2h5IGFyZW4ndCB3
ZSB1c2luZyBqb2luCisJCQlfbGlnaHRzLmhhc2ggPSBkaXJlY3Rpb25hbExlbmd0aCArICcsJyAr
IHBvaW50TGVuZ3RoICsgJywnICsgc3BvdExlbmd0aCArICcsJyArIHJlY3RBcmVhTGVuZ3RoICsg
JywnICsgaGVtaUxlbmd0aCArICcsJyArIF9saWdodHMuc2hhZG93cy5sZW5ndGg7CisKKwkJfQor
CisJCS8vIEdMIHN0YXRlIHNldHRpbmcKKworCQl0aGlzLnNldEZhY2VDdWxsaW5nID0gZnVuY3Rp
b24gKCBjdWxsRmFjZSwgZnJvbnRGYWNlRGlyZWN0aW9uICkgeworCisJCQlzdGF0ZS5zZXRDdWxs
RmFjZSggY3VsbEZhY2UgKTsKKwkJCXN0YXRlLnNldEZsaXBTaWRlZCggZnJvbnRGYWNlRGlyZWN0
aW9uID09PSBGcm9udEZhY2VEaXJlY3Rpb25DVyApOworCisJCX07CisKKwkJLy8gVGV4dHVyZXMK
KworCQlmdW5jdGlvbiBhbGxvY1RleHR1cmVVbml0KCkgeworCisJCQl2YXIgdGV4dHVyZVVuaXQg
PSBfdXNlZFRleHR1cmVVbml0czsKKworCQkJaWYgKCB0ZXh0dXJlVW5pdCA+PSBjYXBhYmlsaXRp
ZXMubWF4VGV4dHVyZXMgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRl
cmVyOiBUcnlpbmcgdG8gdXNlICcgKyB0ZXh0dXJlVW5pdCArICcgdGV4dHVyZSB1bml0cyB3aGls
ZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICcgKyBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKTsK
KworCQkJfQorCisJCQlfdXNlZFRleHR1cmVVbml0cyArPSAxOworCisJCQlyZXR1cm4gdGV4dHVy
ZVVuaXQ7CisKKwkJfQorCisJCXRoaXMuYWxsb2NUZXh0dXJlVW5pdCA9IGFsbG9jVGV4dHVyZVVu
aXQ7CisKKwkJLy8gdGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRUZXh0dXJlMkQ7CisJCXRoaXMuc2V0
VGV4dHVyZTJEID0gKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB3YXJuZWQgPSBmYWxzZTsKKwor
CQkJLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlCisJCQly
ZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkgeworCisJCQkJaWYg
KCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldCApIHsKKworCQkJCQlpZiAo
ICEgd2FybmVkICkgeworCisJCQkJCQljb25zb2xlLndhcm4oICJUSFJFRS5XZWJHTFJlbmRlcmVy
LnNldFRleHR1cmUyRDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2Ug
dGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC4iICk7CisJCQkJCQl3YXJuZWQgPSB0cnVl
OworCisJCQkJCX0KKworCQkJCQl0ZXh0dXJlID0gdGV4dHVyZS50ZXh0dXJlOworCisJCQkJfQor
CisJCQkJdGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7CisKKwkJCX07CisK
KwkJfSgpICk7CisKKwkJdGhpcy5zZXRUZXh0dXJlID0gKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZh
ciB3YXJuZWQgPSBmYWxzZTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUoIHRleHR1
cmUsIHNsb3QgKSB7CisKKwkJCQlpZiAoICEgd2FybmVkICkgeworCisJCQkJCWNvbnNvbGUud2Fy
biggIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlIGlzIGRlcHJlY2F0ZWQsIHVzZSBz
ZXRUZXh0dXJlMkQgaW5zdGVhZC4iICk7CisJCQkJCXdhcm5lZCA9IHRydWU7CisKKwkJCQl9CisK
KwkJCQl0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTsKKworCQkJfTsKKwor
CQl9KCkgKTsKKworCQl0aGlzLnNldFRleHR1cmVDdWJlID0gKCBmdW5jdGlvbiAoKSB7CisKKwkJ
CXZhciB3YXJuZWQgPSBmYWxzZTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmVDdWJl
KCB0ZXh0dXJlLCBzbG90ICkgeworCisJCQkJLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBl
ZWwgdGV4dHVyZS50ZXh0dXJlCisJCQkJaWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJl
bmRlclRhcmdldEN1YmUgKSB7CisKKwkJCQkJaWYgKCAhIHdhcm5lZCApIHsKKworCQkJCQkJY29u
c29sZS53YXJuKCAiVEhSRUUuV2ViR0xSZW5kZXJlci5zZXRUZXh0dXJlQ3ViZTogZG9uJ3QgdXNl
IGN1YmUgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9w
ZXJ0eSBpbnN0ZWFkLiIgKTsKKwkJCQkJCXdhcm5lZCA9IHRydWU7CisKKwkJCQkJfQorCisJCQkJ
CXRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7CisKKwkJCQl9CisKKwkJCQkvLyBjdXJyZW50bHkg
cmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJlIGlz
IGEgVGV4dHVyZSBhbmQgTk9UIGEgQ3ViZVRleHR1cmUKKwkJCQkvLyBUT0RPOiB1bmlmeSB0aGVz
ZSBjb2RlIHBhdGhzCisJCQkJaWYgKCAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc0N1YmVUZXh0dXJl
ICkgfHwKKwkJCQkJKCBBcnJheS5pc0FycmF5KCB0ZXh0dXJlLmltYWdlICkgJiYgdGV4dHVyZS5p
bWFnZS5sZW5ndGggPT09IDYgKSApIHsKKworCQkJCQkvLyBDb21wcmVzc2VkVGV4dHVyZSBjYW4g
aGF2ZSBBcnJheSBpbiBpbWFnZSA6LworCisJCQkJCS8vIHRoaXMgZnVuY3Rpb24gYWxvbmUgc2hv
dWxkIHRha2UgY2FyZSBvZiBjdWJlIHRleHR1cmVzCisJCQkJCXRleHR1cmVzLnNldFRleHR1cmVD
dWJlKCB0ZXh0dXJlLCBzbG90ICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCS8vIGFzc3VtZWQ6
IHRleHR1cmUgcHJvcGVydHkgb2YgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlCisKKwkJCQkJ
dGV4dHVyZXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljKCB0ZXh0dXJlLCBzbG90ICk7CisKKwkJCQl9
CisKKwkJCX07CisKKwkJfSgpICk7CisKKwkJdGhpcy5nZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlv
biAoKSB7CisKKwkJCXJldHVybiBfY3VycmVudFJlbmRlclRhcmdldDsKKworCQl9OworCisJCXRo
aXMuc2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQgKSB7CisKKwkJCV9j
dXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0OworCisJCQlpZiAoIHJlbmRlclRhcmdl
dCAmJiBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyID09
PSB1bmRlZmluZWQgKSB7CisKKwkJCQl0ZXh0dXJlcy5zZXR1cFJlbmRlclRhcmdldCggcmVuZGVy
VGFyZ2V0ICk7CisKKwkJCX0KKworCQkJdmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0ICYmIHJl
bmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApOworCQkJdmFyIGZyYW1lYnVmZmVy
OworCisJCQlpZiAoIHJlbmRlclRhcmdldCApIHsKKworCQkJCXZhciByZW5kZXJUYXJnZXRQcm9w
ZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApOworCisJCQkJaWYgKCBpc0N1
YmUgKSB7CisKKwkJCQkJZnJhbWVidWZmZXIgPSByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2Vi
Z2xGcmFtZWJ1ZmZlclsgcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlIF07CisKKwkJCQl9IGVs
c2UgeworCisJCQkJCWZyYW1lYnVmZmVyID0gcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmds
RnJhbWVidWZmZXI7CisKKwkJCQl9CisKKwkJCQlfY3VycmVudFNjaXNzb3IuY29weSggcmVuZGVy
VGFyZ2V0LnNjaXNzb3IgKTsKKwkJCQlfY3VycmVudFNjaXNzb3JUZXN0ID0gcmVuZGVyVGFyZ2V0
LnNjaXNzb3JUZXN0OworCisJCQkJX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCByZW5kZXJUYXJnZXQu
dmlld3BvcnQgKTsKKworCQkJfSBlbHNlIHsKKworCQkJCWZyYW1lYnVmZmVyID0gbnVsbDsKKwor
CQkJCV9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4
ZWxSYXRpbyApOworCQkJCV9jdXJyZW50U2Npc3NvclRlc3QgPSBfc2Npc3NvclRlc3Q7CisKKwkJ
CQlfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4
ZWxSYXRpbyApOworCisJCQl9CisKKwkJCWlmICggX2N1cnJlbnRGcmFtZWJ1ZmZlciAhPT0gZnJh
bWVidWZmZXIgKSB7CisKKwkJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIs
IGZyYW1lYnVmZmVyICk7CisJCQkJX2N1cnJlbnRGcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyOwor
CisJCQl9CisKKwkJCXN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3NvciApOworCQkJc3RhdGUu
c2V0U2Npc3NvclRlc3QoIF9jdXJyZW50U2Npc3NvclRlc3QgKTsKKworCQkJc3RhdGUudmlld3Bv
cnQoIF9jdXJyZW50Vmlld3BvcnQgKTsKKworCQkJaWYgKCBpc0N1YmUgKSB7CisKKwkJCQl2YXIg
dGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUg
KTsKKwkJCQlfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkNP
TE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgcmVuZGVy
VGFyZ2V0LmFjdGl2ZUN1YmVGYWNlLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwg
cmVuZGVyVGFyZ2V0LmFjdGl2ZU1pcE1hcExldmVsICk7CisKKwkJCX0KKworCQl9OworCisJCXRo
aXMucmVhZFJlbmRlclRhcmdldFBpeGVscyA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCB4LCB5
LCB3aWR0aCwgaGVpZ2h0LCBidWZmZXIgKSB7CisKKwkJCWlmICggISAoIHJlbmRlclRhcmdldCAm
JiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldCApICkgeworCisJCQkJY29uc29sZS5l
cnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVy
VGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4nICk7CisJCQkJcmV0dXJuOwor
CisJCQl9CisKKwkJCXZhciBmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJn
ZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7CisKKwkJCWlmICggZnJhbWVidWZmZXIgKSB7CisKKwkJ
CQl2YXIgcmVzdG9yZSA9IGZhbHNlOworCisJCQkJaWYgKCBmcmFtZWJ1ZmZlciAhPT0gX2N1cnJl
bnRGcmFtZWJ1ZmZlciApIHsKKworCQkJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVC
VUZGRVIsIGZyYW1lYnVmZmVyICk7CisKKwkJCQkJcmVzdG9yZSA9IHRydWU7CisKKwkJCQl9CisK
KwkJCQl0cnkgeworCisJCQkJCXZhciB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7CisJ
CQkJCXZhciB0ZXh0dXJlRm9ybWF0ID0gdGV4dHVyZS5mb3JtYXQ7CisJCQkJCXZhciB0ZXh0dXJl
VHlwZSA9IHRleHR1cmUudHlwZTsKKworCQkJCQlpZiAoIHRleHR1cmVGb3JtYXQgIT09IFJHQkFG
b3JtYXQgJiYgcGFyYW1UaHJlZVRvR0woIHRleHR1cmVGb3JtYXQgKSAhPT0gX2dsLmdldFBhcmFt
ZXRlciggX2dsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUICkgKSB7CisKKwkJCQkJ
CWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhl
bHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVk
IGZvcm1hdC4nICk7CisJCQkJCQlyZXR1cm47CisKKwkJCQkJfQorCisJCQkJCWlmICggdGV4dHVy
ZVR5cGUgIT09IFVuc2lnbmVkQnl0ZVR5cGUgJiYgcGFyYW1UaHJlZVRvR0woIHRleHR1cmVUeXBl
ICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZ
UEUgKSAmJiAvLyBJRTExLCBFZGdlIGFuZCBDaHJvbWUgTWFjIDwgNTIgKCM5NTEzKQorCQkJCQkJ
ISAoIHRleHR1cmVUeXBlID09PSBGbG9hdFR5cGUgJiYgKCBleHRlbnNpb25zLmdldCggJ09FU190
ZXh0dXJlX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29sb3JfYnVmZmVyX2Zs
b2F0JyApICkgKSAmJiAvLyBDaHJvbWUgTWFjID49IDUyIGFuZCBGaXJlZm94CisJCQkJCQkhICgg
dGV4dHVyZVR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdFWFRfY29s
b3JfYnVmZmVyX2hhbGZfZmxvYXQnICkgKSApIHsKKworCQkJCQkJY29uc29sZS5lcnJvciggJ1RI
UkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlz
IG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4n
ICk7CisJCQkJCQlyZXR1cm47CisKKwkJCQkJfQorCisJCQkJCWlmICggX2dsLmNoZWNrRnJhbWVi
dWZmZXJTdGF0dXMoIF9nbC5GUkFNRUJVRkZFUiApID09PSBfZ2wuRlJBTUVCVUZGRVJfQ09NUExF
VEUgKSB7CisKKwkJCQkJCS8vIHRoZSBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IGVuc3VyZXMgdmFs
aWQgcmVhZCByZXF1ZXN0cyAobm8gb3V0LW9mLWJvdW5kcyBwaXhlbHMsIHNlZSAjODYwNCkKKwor
CQkJCQkJaWYgKCAoIHggPj0gMCAmJiB4IDw9ICggcmVuZGVyVGFyZ2V0LndpZHRoIC0gd2lkdGgg
KSApICYmICggeSA+PSAwICYmIHkgPD0gKCByZW5kZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0ICkg
KSApIHsKKworCQkJCQkJCV9nbC5yZWFkUGl4ZWxzKCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwYXJh
bVRocmVlVG9HTCggdGV4dHVyZUZvcm1hdCApLCBwYXJhbVRocmVlVG9HTCggdGV4dHVyZVR5cGUg
KSwgYnVmZmVyICk7CisKKwkJCQkJCX0KKworCQkJCQl9IGVsc2UgeworCisJCQkJCQljb25zb2xl
LmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFk
UGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRl
LicgKTsKKworCQkJCQl9CisKKwkJCQl9IGZpbmFsbHkgeworCisJCQkJCWlmICggcmVzdG9yZSAp
IHsKKworCQkJCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfY3VycmVu
dEZyYW1lYnVmZmVyICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJfTsKKworCQkv
LyBNYXAgdGhyZWUuanMgY29uc3RhbnRzIHRvIFdlYkdMIGNvbnN0YW50cworCisJCWZ1bmN0aW9u
IHBhcmFtVGhyZWVUb0dMKCBwICkgeworCisJCQl2YXIgZXh0ZW5zaW9uOworCisJCQlpZiAoIHAg
PT09IFJlcGVhdFdyYXBwaW5nICkgcmV0dXJuIF9nbC5SRVBFQVQ7CisJCQlpZiAoIHAgPT09IENs
YW1wVG9FZGdlV3JhcHBpbmcgKSByZXR1cm4gX2dsLkNMQU1QX1RPX0VER0U7CisJCQlpZiAoIHAg
PT09IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gX2dsLk1JUlJPUkVEX1JFUEVBVDsK
KworCQkJaWYgKCBwID09PSBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIF9nbC5ORUFSRVNUOworCQkJ
aWYgKCBwID09PSBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciApIHJldHVybiBfZ2wuTkVBUkVT
VF9NSVBNQVBfTkVBUkVTVDsKKwkJCWlmICggcCA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRl
ciApIHJldHVybiBfZ2wuTkVBUkVTVF9NSVBNQVBfTElORUFSOworCisJCQlpZiAoIHAgPT09IExp
bmVhckZpbHRlciApIHJldHVybiBfZ2wuTElORUFSOworCQkJaWYgKCBwID09PSBMaW5lYXJNaXBN
YXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIF9nbC5MSU5FQVJfTUlQTUFQX05FQVJFU1Q7CisJCQlp
ZiAoIHAgPT09IExpbmVhck1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBfZ2wuTElORUFSX01J
UE1BUF9MSU5FQVI7CisKKwkJCWlmICggcCA9PT0gVW5zaWduZWRCeXRlVHlwZSApIHJldHVybiBf
Z2wuVU5TSUdORURfQllURTsKKwkJCWlmICggcCA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlICkg
cmV0dXJuIF9nbC5VTlNJR05FRF9TSE9SVF80XzRfNF80OworCQkJaWYgKCBwID09PSBVbnNpZ25l
ZFNob3J0NTU1MVR5cGUgKSByZXR1cm4gX2dsLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE7CisJCQlp
ZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NjVUeXBlICkgcmV0dXJuIF9nbC5VTlNJR05FRF9TSE9S
VF81XzZfNTsKKworCQkJaWYgKCBwID09PSBCeXRlVHlwZSApIHJldHVybiBfZ2wuQllURTsKKwkJ
CWlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIF9nbC5TSE9SVDsKKwkJCWlmICggcCA9PT0g
VW5zaWduZWRTaG9ydFR5cGUgKSByZXR1cm4gX2dsLlVOU0lHTkVEX1NIT1JUOworCQkJaWYgKCBw
ID09PSBJbnRUeXBlICkgcmV0dXJuIF9nbC5JTlQ7CisJCQlpZiAoIHAgPT09IFVuc2lnbmVkSW50
VHlwZSApIHJldHVybiBfZ2wuVU5TSUdORURfSU5UOworCQkJaWYgKCBwID09PSBGbG9hdFR5cGUg
KSByZXR1cm4gX2dsLkZMT0FUOworCisJCQlpZiAoIHAgPT09IEhhbGZGbG9hdFR5cGUgKSB7CisK
KwkJCQlleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQn
ICk7CisKKwkJCQlpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uSEFM
Rl9GTE9BVF9PRVM7CisKKwkJCX0KKworCQkJaWYgKCBwID09PSBBbHBoYUZvcm1hdCApIHJldHVy
biBfZ2wuQUxQSEE7CisJCQlpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiBfZ2wuUkdCOwor
CQkJaWYgKCBwID09PSBSR0JBRm9ybWF0ICkgcmV0dXJuIF9nbC5SR0JBOworCQkJaWYgKCBwID09
PSBMdW1pbmFuY2VGb3JtYXQgKSByZXR1cm4gX2dsLkxVTUlOQU5DRTsKKwkJCWlmICggcCA9PT0g
THVtaW5hbmNlQWxwaGFGb3JtYXQgKSByZXR1cm4gX2dsLkxVTUlOQU5DRV9BTFBIQTsKKwkJCWlm
ICggcCA9PT0gRGVwdGhGb3JtYXQgKSByZXR1cm4gX2dsLkRFUFRIX0NPTVBPTkVOVDsKKwkJCWlm
ICggcCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgcmV0dXJuIF9nbC5ERVBUSF9TVEVOQ0lMOwor
CisJCQlpZiAoIHAgPT09IEFkZEVxdWF0aW9uICkgcmV0dXJuIF9nbC5GVU5DX0FERDsKKwkJCWlm
ICggcCA9PT0gU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBfZ2wuRlVOQ19TVUJUUkFDVDsKKwkJ
CWlmICggcCA9PT0gUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gKSByZXR1cm4gX2dsLkZVTkNfUkVW
RVJTRV9TVUJUUkFDVDsKKworCQkJaWYgKCBwID09PSBaZXJvRmFjdG9yICkgcmV0dXJuIF9nbC5a
RVJPOworCQkJaWYgKCBwID09PSBPbmVGYWN0b3IgKSByZXR1cm4gX2dsLk9ORTsKKwkJCWlmICgg
cCA9PT0gU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gX2dsLlNSQ19DT0xPUjsKKwkJCWlmICggcCA9
PT0gT25lTWludXNTcmNDb2xvckZhY3RvciApIHJldHVybiBfZ2wuT05FX01JTlVTX1NSQ19DT0xP
UjsKKwkJCWlmICggcCA9PT0gU3JjQWxwaGFGYWN0b3IgKSByZXR1cm4gX2dsLlNSQ19BTFBIQTsK
KwkJCWlmICggcCA9PT0gT25lTWludXNTcmNBbHBoYUZhY3RvciApIHJldHVybiBfZ2wuT05FX01J
TlVTX1NSQ19BTFBIQTsKKwkJCWlmICggcCA9PT0gRHN0QWxwaGFGYWN0b3IgKSByZXR1cm4gX2ds
LkRTVF9BTFBIQTsKKwkJCWlmICggcCA9PT0gT25lTWludXNEc3RBbHBoYUZhY3RvciApIHJldHVy
biBfZ2wuT05FX01JTlVTX0RTVF9BTFBIQTsKKworCQkJaWYgKCBwID09PSBEc3RDb2xvckZhY3Rv
ciApIHJldHVybiBfZ2wuRFNUX0NPTE9SOworCQkJaWYgKCBwID09PSBPbmVNaW51c0RzdENvbG9y
RmFjdG9yICkgcmV0dXJuIF9nbC5PTkVfTUlOVVNfRFNUX0NPTE9SOworCQkJaWYgKCBwID09PSBT
cmNBbHBoYVNhdHVyYXRlRmFjdG9yICkgcmV0dXJuIF9nbC5TUkNfQUxQSEFfU0FUVVJBVEU7CisK
KwkJCWlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RY
VDFfRm9ybWF0IHx8CisJCQkJcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0IHx8IHAgPT09IFJH
QkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHsKKworCQkJCWV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0
KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7CisKKwkJCQlpZiAoIGV4dGVuc2lv
biAhPT0gbnVsbCApIHsKKworCQkJCQlpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkg
cmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUOworCQkJCQlpZiAo
IHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NF
RF9SR0JBX1MzVENfRFhUMV9FWFQ7CisJCQkJCWlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9y
bWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDsKKwkJ
CQkJaWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNP
TVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUOworCisJCQkJfQorCisJCQl9CisKKwkJCWlmICgg
cCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCX1BWUlRDXzJCUFBWMV9G
b3JtYXQgfHwKKwkJCQlwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdC
QV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgeworCisJCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5n
ZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7CisKKwkJCQlpZiAoIGV4dGVu
c2lvbiAhPT0gbnVsbCApIHsKKworCQkJCQlpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9y
bWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HOwor
CQkJCQlpZiAoIHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lv
bi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HOworCQkJCQlpZiAoIHAgPT09IFJHQkFf
UFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BW
UlRDXzRCUFBWMV9JTUc7CisJCQkJCWlmICggcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0
ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRzsKKwor
CQkJCX0KKworCQkJfQorCisJCQlpZiAoIHAgPT09IFJHQl9FVEMxX0Zvcm1hdCApIHsKKworCQkJ
CWV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0
YzEnICk7CisKKwkJCQlpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24u
Q09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDsKKworCQkJfQorCisJCQlpZiAoIHAgPT09IE1pbkVx
dWF0aW9uIHx8IHAgPT09IE1heEVxdWF0aW9uICkgeworCisJCQkJZXh0ZW5zaW9uID0gZXh0ZW5z
aW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApOworCisJCQkJaWYgKCBleHRlbnNpb24gIT09
IG51bGwgKSB7CisKKwkJCQkJaWYgKCBwID09PSBNaW5FcXVhdGlvbiApIHJldHVybiBleHRlbnNp
b24uTUlOX0VYVDsKKwkJCQkJaWYgKCBwID09PSBNYXhFcXVhdGlvbiApIHJldHVybiBleHRlbnNp
b24uTUFYX0VYVDsKKworCQkJCX0KKworCQkJfQorCisJCQlpZiAoIHAgPT09IFVuc2lnbmVkSW50
MjQ4VHlwZSApIHsKKworCQkJCWV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVw
dGhfdGV4dHVyZScgKTsKKworCQkJCWlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgcmV0dXJuIGV4
dGVuc2lvbi5VTlNJR05FRF9JTlRfMjRfOF9XRUJHTDsKKworCQkJfQorCisJCQlyZXR1cm4gMDsK
KworCQl9CisKKwl9CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2Iu
Y29tLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJ
ICovCisKKwlmdW5jdGlvbiBGb2dFeHAyICggY29sb3IsIGRlbnNpdHkgKSB7CisKKwkJdGhpcy5u
YW1lID0gJyc7CisKKwkJdGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTsKKwkJdGhpcy5k
ZW5zaXR5ID0gKCBkZW5zaXR5ICE9PSB1bmRlZmluZWQgKSA/IGRlbnNpdHkgOiAwLjAwMDI1Owor
CisJfQorCisJRm9nRXhwMi5wcm90b3R5cGUuaXNGb2dFeHAyID0gdHJ1ZTsKKworCUZvZ0V4cDIu
cHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkgeworCisJCXJldHVybiBuZXcgRm9nRXhwMigg
dGhpcy5jb2xvci5nZXRIZXgoKSwgdGhpcy5kZW5zaXR5ICk7CisKKwl9OworCisJRm9nRXhwMi5w
cm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCBtZXRhICkgeworCisJCXJldHVybiB7CisJCQl0
eXBlOiAnRm9nRXhwMicsCisJCQljb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSwKKwkJCWRlbnNp
dHk6IHRoaXMuZGVuc2l0eQorCQl9OworCisJfTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29i
IC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRl
cmVkcXVhbGlhLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEZvZyAoIGNvbG9yLCBuZWFyLCBmYXIg
KSB7CisKKwkJdGhpcy5uYW1lID0gJyc7CisKKwkJdGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29s
b3IgKTsKKworCQl0aGlzLm5lYXIgPSAoIG5lYXIgIT09IHVuZGVmaW5lZCApID8gbmVhciA6IDE7
CisJCXRoaXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMTAwMDsKKworCX0K
KworCUZvZy5wcm90b3R5cGUuaXNGb2cgPSB0cnVlOworCisJRm9nLnByb3RvdHlwZS5jbG9uZSA9
IGZ1bmN0aW9uICgpIHsKKworCQlyZXR1cm4gbmV3IEZvZyggdGhpcy5jb2xvci5nZXRIZXgoKSwg
dGhpcy5uZWFyLCB0aGlzLmZhciApOworCisJfTsKKworCUZvZy5wcm90b3R5cGUudG9KU09OID0g
ZnVuY3Rpb24gKCBtZXRhICkgeworCisJCXJldHVybiB7CisJCQl0eXBlOiAnRm9nJywKKwkJCWNv
bG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLAorCQkJbmVhcjogdGhpcy5uZWFyLAorCQkJZmFyOiB0
aGlzLmZhcgorCQl9OworCisJfTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDov
L21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBTY2VuZSAoKSB7CisKKwkJT2JqZWN0M0Qu
Y2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdTY2VuZSc7CisKKwkJdGhpcy5iYWNrZ3Jv
dW5kID0gbnVsbDsKKwkJdGhpcy5mb2cgPSBudWxsOworCQl0aGlzLm92ZXJyaWRlTWF0ZXJpYWwg
PSBudWxsOworCisJCXRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7IC8vIGNoZWNrZWQgYnkgdGhlIHJl
bmRlcmVyCisKKwl9CisKKwlTY2VuZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3Qu
Y3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBTY2VuZSwK
KworCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkgeworCisJCQlPYmplY3Qz
RC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApOworCisJCQlp
ZiAoIHNvdXJjZS5iYWNrZ3JvdW5kICE9PSBudWxsICkgdGhpcy5iYWNrZ3JvdW5kID0gc291cmNl
LmJhY2tncm91bmQuY2xvbmUoKTsKKwkJCWlmICggc291cmNlLmZvZyAhPT0gbnVsbCApIHRoaXMu
Zm9nID0gc291cmNlLmZvZy5jbG9uZSgpOworCQkJaWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlh
bCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVy
aWFsLmNsb25lKCk7CisKKwkJCXRoaXMuYXV0b1VwZGF0ZSA9IHNvdXJjZS5hdXRvVXBkYXRlOwor
CQkJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7CisKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CisK
KwkJCXZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRh
ICk7CisKKwkJCWlmICggdGhpcy5iYWNrZ3JvdW5kICE9PSBudWxsICkgZGF0YS5vYmplY3QuYmFj
a2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZC50b0pTT04oIG1ldGEgKTsKKwkJCWlmICggdGhpcy5m
b2cgIT09IG51bGwgKSBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pTT04oKTsKKworCQkJ
cmV0dXJuIGRhdGE7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtaWthZWwg
ZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDov
L2FsdGVyZWRxdWFsaWEuY29tLworCSAqLworCisJZnVuY3Rpb24gTGVuc0ZsYXJlKCB0ZXh0dXJl
LCBzaXplLCBkaXN0YW5jZSwgYmxlbmRpbmcsIGNvbG9yICkgeworCisJCU9iamVjdDNELmNhbGwo
IHRoaXMgKTsKKworCQl0aGlzLmxlbnNGbGFyZXMgPSBbXTsKKworCQl0aGlzLnBvc2l0aW9uU2Ny
ZWVuID0gbmV3IFZlY3RvcjMoKTsKKwkJdGhpcy5jdXN0b21VcGRhdGVDYWxsYmFjayA9IHVuZGVm
aW5lZDsKKworCQlpZiAoIHRleHR1cmUgIT09IHVuZGVmaW5lZCApIHsKKworCQkJdGhpcy5hZGQo
IHRleHR1cmUsIHNpemUsIGRpc3RhbmNlLCBibGVuZGluZywgY29sb3IgKTsKKworCQl9CisKKwl9
CisKKwlMZW5zRmxhcmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSgg
T2JqZWN0M0QucHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogTGVuc0ZsYXJlLAorCisJ
CWlzTGVuc0ZsYXJlOiB0cnVlLAorCisJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisJ
CQlPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworCQkJdGhp
cy5wb3NpdGlvblNjcmVlbi5jb3B5KCBzb3VyY2UucG9zaXRpb25TY3JlZW4gKTsKKwkJCXRoaXMu
Y3VzdG9tVXBkYXRlQ2FsbGJhY2sgPSBzb3VyY2UuY3VzdG9tVXBkYXRlQ2FsbGJhY2s7CisKKwkJ
CWZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5sZW5zRmxhcmVzLmxlbmd0aDsgaSA8IGw7IGkg
KysgKSB7CisKKwkJCQl0aGlzLmxlbnNGbGFyZXMucHVzaCggc291cmNlLmxlbnNGbGFyZXNbIGkg
XSApOworCisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJYWRkOiBmdW5jdGlv
biAoIHRleHR1cmUsIHNpemUsIGRpc3RhbmNlLCBibGVuZGluZywgY29sb3IsIG9wYWNpdHkgKSB7
CisKKwkJCWlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IC0gMTsKKwkJCWlmICggZGlz
dGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3RhbmNlID0gMDsKKwkJCWlmICggb3BhY2l0eSA9PT0g
dW5kZWZpbmVkICkgb3BhY2l0eSA9IDE7CisJCQlpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSBj
b2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsKKwkJCWlmICggYmxlbmRpbmcgPT09IHVuZGVm
aW5lZCApIGJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7CisKKwkJCWRpc3RhbmNlID0gTWF0aC5t
aW4oIGRpc3RhbmNlLCBNYXRoLm1heCggMCwgZGlzdGFuY2UgKSApOworCisJCQl0aGlzLmxlbnNG
bGFyZXMucHVzaCggeworCQkJCXRleHR1cmU6IHRleHR1cmUsCS8vIFRIUkVFLlRleHR1cmUKKwkJ
CQlzaXplOiBzaXplLCAJCS8vIHNpemUgaW4gcGl4ZWxzICgtMSA9IHVzZSB0ZXh0dXJlLndpZHRo
KQorCQkJCWRpc3RhbmNlOiBkaXN0YW5jZSwgCS8vIGRpc3RhbmNlICgwLTEpIGZyb20gbGlnaHQg
c291cmNlICgwPWF0IGxpZ2h0IHNvdXJjZSkKKwkJCQl4OiAwLCB5OiAwLCB6OiAwLAkvLyBzY3Jl
ZW4gcG9zaXRpb24gKC0xID0+IDEpIHogPSAwIGlzIGluIGZyb250IHogPSAxIGlzIGJhY2sKKwkJ
CQlzY2FsZTogMSwgCQkvLyBzY2FsZQorCQkJCXJvdGF0aW9uOiAwLCAJCS8vIHJvdGF0aW9uCisJ
CQkJb3BhY2l0eTogb3BhY2l0eSwJLy8gb3BhY2l0eQorCQkJCWNvbG9yOiBjb2xvciwJCS8vIGNv
bG9yCisJCQkJYmxlbmRpbmc6IGJsZW5kaW5nCS8vIGJsZW5kaW5nCisJCQl9ICk7CisKKwkJfSwK
KworCQkvKgorCQkgKiBVcGRhdGUgbGVucyBmbGFyZXMgdXBkYXRlIHBvc2l0aW9ucyBvbiBhbGwg
ZmxhcmVzIGJhc2VkIG9uIHRoZSBzY3JlZW4gcG9zaXRpb24KKwkJICogU2V0IG15TGVuc0ZsYXJl
LmN1c3RvbVVwZGF0ZUNhbGxiYWNrIHRvIGFsdGVyIHRoZSBmbGFyZXMgaW4geW91ciBwcm9qZWN0
IHNwZWNpZmljIHdheS4KKwkJICovCisKKwkJdXBkYXRlTGVuc0ZsYXJlczogZnVuY3Rpb24gKCkg
eworCisJCQl2YXIgZiwgZmwgPSB0aGlzLmxlbnNGbGFyZXMubGVuZ3RoOworCQkJdmFyIGZsYXJl
OworCQkJdmFyIHZlY1ggPSAtIHRoaXMucG9zaXRpb25TY3JlZW4ueCAqIDI7CisJCQl2YXIgdmVj
WSA9IC0gdGhpcy5wb3NpdGlvblNjcmVlbi55ICogMjsKKworCQkJZm9yICggZiA9IDA7IGYgPCBm
bDsgZiArKyApIHsKKworCQkJCWZsYXJlID0gdGhpcy5sZW5zRmxhcmVzWyBmIF07CisKKwkJCQlm
bGFyZS54ID0gdGhpcy5wb3NpdGlvblNjcmVlbi54ICsgdmVjWCAqIGZsYXJlLmRpc3RhbmNlOwor
CQkJCWZsYXJlLnkgPSB0aGlzLnBvc2l0aW9uU2NyZWVuLnkgKyB2ZWNZICogZmxhcmUuZGlzdGFu
Y2U7CisKKwkJCQlmbGFyZS53YW50ZWRSb3RhdGlvbiA9IGZsYXJlLnggKiBNYXRoLlBJICogMC4y
NTsKKwkJCQlmbGFyZS5yb3RhdGlvbiArPSAoIGZsYXJlLndhbnRlZFJvdGF0aW9uIC0gZmxhcmUu
cm90YXRpb24gKSAqIDAuMjU7CisKKwkJCX0KKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBA
YXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworCSAqCisJICogcGFy
YW1ldGVycyA9IHsKKwkgKiAgY29sb3I6IDxoZXg+LAorCSAqICBvcGFjaXR5OiA8ZmxvYXQ+LAor
CSAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICoKKwkgKgl1dk9mZnNl
dDogbmV3IFRIUkVFLlZlY3RvcjIoKSwKKwkgKgl1dlNjYWxlOiBuZXcgVEhSRUUuVmVjdG9yMigp
CisJICogfQorCSAqLworCisJZnVuY3Rpb24gU3ByaXRlTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7
CisKKwkJTWF0ZXJpYWwuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdTcHJpdGVNYXRl
cmlhbCc7CisKKwkJdGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsKKwkJdGhpcy5t
YXAgPSBudWxsOworCisJCXRoaXMucm90YXRpb24gPSAwOworCisJCXRoaXMuZm9nID0gZmFsc2U7
CisJCXRoaXMubGlnaHRzID0gZmFsc2U7CisKKwkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMg
KTsKKworCX0KKworCVNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1h
dGVyaWFsLnByb3RvdHlwZSApOworCVNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rv
ciA9IFNwcml0ZU1hdGVyaWFsOworCVNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5pc1Nwcml0ZU1h
dGVyaWFsID0gdHJ1ZTsKKworCVNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rp
b24gKCBzb3VyY2UgKSB7CisKKwkJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywg
c291cmNlICk7CisKKwkJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKKwkJdGhpcy5t
YXAgPSBzb3VyY2UubWFwOworCisJCXRoaXMucm90YXRpb24gPSBzb3VyY2Uucm90YXRpb247CisK
KwkJcmV0dXJuIHRoaXM7CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBtaWthZWwgZW10aW5n
ZXIgLyBodHRwOi8vZ29tby5zZS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVy
ZWRxdWFsaWEuY29tLworCSAqLworCisJZnVuY3Rpb24gU3ByaXRlKCBtYXRlcmlhbCApIHsKKwor
CQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1Nwcml0ZSc7CisKKwkJ
dGhpcy5tYXRlcmlhbCA9ICggbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwgOiBu
ZXcgU3ByaXRlTWF0ZXJpYWwoKTsKKworCX0KKworCVNwcml0ZS5wcm90b3R5cGUgPSBPYmplY3Qu
YXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0
cnVjdG9yOiBTcHJpdGUsCisKKwkJaXNTcHJpdGU6IHRydWUsCisKKwkJcmF5Y2FzdDogKCBmdW5j
dGlvbiAoKSB7CisKKwkJCXZhciBpbnRlcnNlY3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7CisJCQl2
YXIgd29ybGRQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CisJCQl2YXIgd29ybGRTY2FsZSA9IG5l
dyBWZWN0b3IzKCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGlu
dGVyc2VjdHMgKSB7CisKKwkJCQl3b3JsZFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbigg
dGhpcy5tYXRyaXhXb3JsZCApOworCQkJCXJheWNhc3Rlci5yYXkuY2xvc2VzdFBvaW50VG9Qb2lu
dCggd29ybGRQb3NpdGlvbiwgaW50ZXJzZWN0UG9pbnQgKTsKKworCQkJCXdvcmxkU2NhbGUuc2V0
RnJvbU1hdHJpeFNjYWxlKCB0aGlzLm1hdHJpeFdvcmxkICk7CisJCQkJdmFyIGd1ZXNzU2l6ZVNx
ID0gd29ybGRTY2FsZS54ICogd29ybGRTY2FsZS55IC8gNDsKKworCQkJCWlmICggd29ybGRQb3Np
dGlvbi5kaXN0YW5jZVRvU3F1YXJlZCggaW50ZXJzZWN0UG9pbnQgKSA+IGd1ZXNzU2l6ZVNxICkg
cmV0dXJuOworCisJCQkJdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFu
Y2VUbyggaW50ZXJzZWN0UG9pbnQgKTsKKworCQkJCWlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIu
bmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47CisKKwkJCQlpbnRlcnNl
Y3RzLnB1c2goIHsKKworCQkJCQlkaXN0YW5jZTogZGlzdGFuY2UsCisJCQkJCXBvaW50OiBpbnRl
cnNlY3RQb2ludC5jbG9uZSgpLAorCQkJCQlmYWNlOiBudWxsLAorCQkJCQlvYmplY3Q6IHRoaXMK
KworCQkJCX0gKTsKKworCQkJfTsKKworCQl9KCkgKSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkg
eworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMubWF0ZXJpYWwgKS5jb3B5
KCB0aGlzICk7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtaWthZWwgZW10
aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2Fs
dGVyZWRxdWFsaWEuY29tLworCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20v
CisJICovCisKKwlmdW5jdGlvbiBMT0QoKSB7CisKKwkJT2JqZWN0M0QuY2FsbCggdGhpcyApOwor
CisJCXRoaXMudHlwZSA9ICdMT0QnOworCisJCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlz
LCB7CisJCQlsZXZlbHM6IHsKKwkJCQllbnVtZXJhYmxlOiB0cnVlLAorCQkJCXZhbHVlOiBbXQor
CQkJfQorCQl9ICk7CisKKwl9CisKKwlMT0QucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2Jq
ZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogTE9E
LAorCisJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisJCQlPYmplY3QzRC5wcm90b3R5
cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIGZhbHNlICk7CisKKwkJCXZhciBsZXZlbHMgPSBz
b3VyY2UubGV2ZWxzOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBsZXZlbHMubGVuZ3RoOyBp
IDwgbDsgaSArKyApIHsKKworCQkJCXZhciBsZXZlbCA9IGxldmVsc1sgaSBdOworCisJCQkJdGhp
cy5hZGRMZXZlbCggbGV2ZWwub2JqZWN0LmNsb25lKCksIGxldmVsLmRpc3RhbmNlICk7CisKKwkJ
CX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlhZGRMZXZlbDogZnVuY3Rpb24gKCBv
YmplY3QsIGRpc3RhbmNlICkgeworCisJCQlpZiAoIGRpc3RhbmNlID09PSB1bmRlZmluZWQgKSBk
aXN0YW5jZSA9IDA7CisKKwkJCWRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7CisKKwkJ
CXZhciBsZXZlbHMgPSB0aGlzLmxldmVsczsKKworCQkJZm9yICggdmFyIGwgPSAwOyBsIDwgbGV2
ZWxzLmxlbmd0aDsgbCArKyApIHsKKworCQkJCWlmICggZGlzdGFuY2UgPCBsZXZlbHNbIGwgXS5k
aXN0YW5jZSApIHsKKworCQkJCQlicmVhazsKKworCQkJCX0KKworCQkJfQorCisJCQlsZXZlbHMu
c3BsaWNlKCBsLCAwLCB7IGRpc3RhbmNlOiBkaXN0YW5jZSwgb2JqZWN0OiBvYmplY3QgfSApOwor
CisJCQl0aGlzLmFkZCggb2JqZWN0ICk7CisKKwkJfSwKKworCQlnZXRPYmplY3RGb3JEaXN0YW5j
ZTogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHsKKworCQkJdmFyIGxldmVscyA9IHRoaXMubGV2ZWxz
OworCisJCQlmb3IgKCB2YXIgaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyAp
IHsKKworCQkJCWlmICggZGlzdGFuY2UgPCBsZXZlbHNbIGkgXS5kaXN0YW5jZSApIHsKKworCQkJ
CQlicmVhazsKKworCQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gbGV2ZWxzWyBpIC0gMSBdLm9i
amVjdDsKKworCQl9LAorCisJCXJheWNhc3Q6ICggZnVuY3Rpb24gKCkgeworCisJCQl2YXIgbWF0
cml4UG9zaXRpb24gPSBuZXcgVmVjdG9yMygpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gcmF5Y2Fz
dCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkgeworCisJCQkJbWF0cml4UG9zaXRpb24uc2V0RnJv
bU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7CisKKwkJCQl2YXIgZGlzdGFuY2Ug
PSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBtYXRyaXhQb3NpdGlvbiApOworCisJ
CQkJdGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZSggZGlzdGFuY2UgKS5yYXljYXN0KCByYXljYXN0
ZXIsIGludGVyc2VjdHMgKTsKKworCQkJfTsKKworCQl9KCkgKSwKKworCQl1cGRhdGU6IGZ1bmN0
aW9uICgpIHsKKworCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKwkJCXZhciB2MiA9IG5ldyBW
ZWN0b3IzKCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiB1cGRhdGUoIGNhbWVyYSApIHsKKworCQkJ
CXZhciBsZXZlbHMgPSB0aGlzLmxldmVsczsKKworCQkJCWlmICggbGV2ZWxzLmxlbmd0aCA+IDEg
KSB7CisKKwkJCQkJdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQg
KTsKKwkJCQkJdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7CisK
KwkJCQkJdmFyIGRpc3RhbmNlID0gdjEuZGlzdGFuY2VUbyggdjIgKTsKKworCQkJCQlsZXZlbHNb
IDAgXS5vYmplY3QudmlzaWJsZSA9IHRydWU7CisKKwkJCQkJZm9yICggdmFyIGkgPSAxLCBsID0g
bGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJCWlmICggZGlzdGFuY2UgPj0g
bGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7CisKKwkJCQkJCQlsZXZlbHNbIGkgLSAxIF0ub2JqZWN0
LnZpc2libGUgPSBmYWxzZTsKKwkJCQkJCQlsZXZlbHNbIGkgXS5vYmplY3QudmlzaWJsZSA9IHRy
dWU7CisKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQlicmVhazsKKworCQkJCQkJfQorCisJCQkJ
CX0KKworCQkJCQlmb3IgKCA7IGkgPCBsOyBpICsrICkgeworCisJCQkJCQlsZXZlbHNbIGkgXS5v
YmplY3QudmlzaWJsZSA9IGZhbHNlOworCisJCQkJCX0KKworCQkJCX0KKworCQkJfTsKKworCQl9
KCksCisKKwkJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CisKKwkJCXZhciBkYXRhID0gT2Jq
ZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CisKKwkJCWRhdGEub2Jq
ZWN0LmxldmVscyA9IFtdOworCisJCQl2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7CisKKwkJCWZv
ciAoIHZhciBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJ
dmFyIGxldmVsID0gbGV2ZWxzWyBpIF07CisKKwkJCQlkYXRhLm9iamVjdC5sZXZlbHMucHVzaCgg
eworCQkJCQlvYmplY3Q6IGxldmVsLm9iamVjdC51dWlkLAorCQkJCQlkaXN0YW5jZTogbGV2ZWwu
ZGlzdGFuY2UKKwkJCQl9ICk7CisKKwkJCX0KKworCQkJcmV0dXJuIGRhdGE7CisKKwkJfQorCisJ
fSApOworCisJLyoqCisJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5z
ZS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworCSAq
IEBhdXRob3IgbWljaGFlbCBndWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tCisJ
ICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tCisJICovCisKKwlmdW5jdGlvbiBT
a2VsZXRvbiggYm9uZXMsIGJvbmVJbnZlcnNlcyApIHsKKworCQkvLyBjb3B5IHRoZSBib25lIGFy
cmF5CisKKwkJYm9uZXMgPSBib25lcyB8fCBbXTsKKworCQl0aGlzLmJvbmVzID0gYm9uZXMuc2xp
Y2UoIDAgKTsKKwkJdGhpcy5ib25lTWF0cmljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCB0aGlzLmJv
bmVzLmxlbmd0aCAqIDE2ICk7CisKKwkJLy8gdXNlIHRoZSBzdXBwbGllZCBib25lIGludmVyc2Vz
IG9yIGNhbGN1bGF0ZSB0aGUgaW52ZXJzZXMKKworCQlpZiAoIGJvbmVJbnZlcnNlcyA9PT0gdW5k
ZWZpbmVkICkgeworCisJCQl0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7CisKKwkJfSBlbHNlIHsK
KworCQkJaWYgKCB0aGlzLmJvbmVzLmxlbmd0aCA9PT0gYm9uZUludmVyc2VzLmxlbmd0aCApIHsK
KworCQkJCXRoaXMuYm9uZUludmVyc2VzID0gYm9uZUludmVyc2VzLnNsaWNlKCAwICk7CisKKwkJ
CX0gZWxzZSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJz
ZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4nICk7CisKKwkJCQl0aGlzLmJvbmVJbnZlcnNlcyA9IFtd
OworCisJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7
IGkgKysgKSB7CisKKwkJCQkJdGhpcy5ib25lSW52ZXJzZXMucHVzaCggbmV3IE1hdHJpeDQoKSAp
OworCisJCQkJfQorCisJCQl9CisKKwkJfQorCisJfQorCisJT2JqZWN0LmFzc2lnbiggU2tlbGV0
b24ucHJvdG90eXBlLCB7CisKKwkJY2FsY3VsYXRlSW52ZXJzZXM6IGZ1bmN0aW9uICgpIHsKKwor
CQkJdGhpcy5ib25lSW52ZXJzZXMgPSBbXTsKKworCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHRo
aXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQl2YXIgaW52ZXJzZSA9IG5l
dyBNYXRyaXg0KCk7CisKKwkJCQlpZiAoIHRoaXMuYm9uZXNbIGkgXSApIHsKKworCQkJCQlpbnZl
cnNlLmdldEludmVyc2UoIHRoaXMuYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCApOworCisJCQkJfQor
CisJCQkJdGhpcy5ib25lSW52ZXJzZXMucHVzaCggaW52ZXJzZSApOworCisJCQl9CisKKwkJfSwK
KworCQlwb3NlOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBib25lLCBpLCBpbDsKKworCQkJLy8g
cmVjb3ZlciB0aGUgYmluZC10aW1lIHdvcmxkIG1hdHJpY2VzCisKKwkJCWZvciAoIGkgPSAwLCBp
bCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQlib25lID0gdGhp
cy5ib25lc1sgaSBdOworCisJCQkJaWYgKCBib25lICkgeworCisJCQkJCWJvbmUubWF0cml4V29y
bGQuZ2V0SW52ZXJzZSggdGhpcy5ib25lSW52ZXJzZXNbIGkgXSApOworCisJCQkJfQorCisJCQl9
CisKKwkJCS8vIGNvbXB1dGUgdGhlIGxvY2FsIG1hdHJpY2VzLCBwb3NpdGlvbnMsIHJvdGF0aW9u
cyBhbmQgc2NhbGVzCisKKwkJCWZvciAoIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBp
IDwgaWw7IGkgKysgKSB7CisKKwkJCQlib25lID0gdGhpcy5ib25lc1sgaSBdOworCisJCQkJaWYg
KCBib25lICkgeworCisJCQkJCWlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25l
ICkgeworCisJCQkJCQlib25lLm1hdHJpeC5nZXRJbnZlcnNlKCBib25lLnBhcmVudC5tYXRyaXhX
b3JsZCApOworCQkJCQkJYm9uZS5tYXRyaXgubXVsdGlwbHkoIGJvbmUubWF0cml4V29ybGQgKTsK
KworCQkJCQl9IGVsc2UgeworCisJCQkJCQlib25lLm1hdHJpeC5jb3B5KCBib25lLm1hdHJpeFdv
cmxkICk7CisKKwkJCQkJfQorCisJCQkJCWJvbmUubWF0cml4LmRlY29tcG9zZSggYm9uZS5wb3Np
dGlvbiwgYm9uZS5xdWF0ZXJuaW9uLCBib25lLnNjYWxlICk7CisKKwkJCQl9CisKKwkJCX0KKwor
CQl9LAorCisJCXVwZGF0ZTogKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBvZmZzZXRNYXRyaXgg
PSBuZXcgTWF0cml4NCgpOworCQkJdmFyIGlkZW50aXR5TWF0cml4ID0gbmV3IE1hdHJpeDQoKTsK
KworCQkJcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHsKKworCQkJCXZhciBib25lcyA9IHRoaXMu
Ym9uZXM7CisJCQkJdmFyIGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzOworCQkJCXZh
ciBib25lTWF0cmljZXMgPSB0aGlzLmJvbmVNYXRyaWNlczsKKwkJCQl2YXIgYm9uZVRleHR1cmUg
PSB0aGlzLmJvbmVUZXh0dXJlOworCisJCQkJLy8gZmxhdHRlbiBib25lIG1hdHJpY2VzIHRvIGFy
cmF5CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkg
KysgKSB7CisKKwkJCQkJLy8gY29tcHV0ZSB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGN1cnJlbnQg
YW5kIHRoZSBvcmlnaW5hbCB0cmFuc2Zvcm0KKworCQkJCQl2YXIgbWF0cml4ID0gYm9uZXNbIGkg
XSA/IGJvbmVzWyBpIF0ubWF0cml4V29ybGQgOiBpZGVudGl0eU1hdHJpeDsKKworCQkJCQlvZmZz
ZXRNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4LCBib25lSW52ZXJzZXNbIGkgXSApOwor
CQkJCQlvZmZzZXRNYXRyaXgudG9BcnJheSggYm9uZU1hdHJpY2VzLCBpICogMTYgKTsKKworCQkJ
CX0KKworCQkJCWlmICggYm9uZVRleHR1cmUgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQlib25l
VGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCQl9CisKKwkJCX07CisKKwkJfSApKCks
CisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5ldyBTa2VsZXRvbiggdGhp
cy5ib25lcywgdGhpcy5ib25lSW52ZXJzZXMgKTsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkg
KiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLworCSAqIEBhdXRob3Ig
YWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICogQGF1dGhvciBpa2VyciAv
IGh0dHA6Ly92ZXJvbGQuY29tCisJICovCisKKwlmdW5jdGlvbiBCb25lKCkgeworCisJCU9iamVj
dDNELmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnQm9uZSc7CisKKwl9CisKKwlCb25l
LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3Rv
dHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IEJvbmUsCisKKwkJaXNCb25lOiB0cnVlCisKKwl9
ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNl
LworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICog
QGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tCisJICovCisKKwlmdW5jdGlvbiBTa2lu
bmVkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkgeworCisJCU1lc2guY2FsbCggdGhpcywgZ2Vv
bWV0cnksIG1hdGVyaWFsICk7CisKKwkJdGhpcy50eXBlID0gJ1NraW5uZWRNZXNoJzsKKworCQl0
aGlzLmJpbmRNb2RlID0gJ2F0dGFjaGVkJzsKKwkJdGhpcy5iaW5kTWF0cml4ID0gbmV3IE1hdHJp
eDQoKTsKKwkJdGhpcy5iaW5kTWF0cml4SW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7CisKKwkJdmFy
IGJvbmVzID0gdGhpcy5pbml0Qm9uZXMoKTsKKwkJdmFyIHNrZWxldG9uID0gbmV3IFNrZWxldG9u
KCBib25lcyApOworCisJCXRoaXMuYmluZCggc2tlbGV0b24sIHRoaXMubWF0cml4V29ybGQgKTsK
KworCQl0aGlzLm5vcm1hbGl6ZVNraW5XZWlnaHRzKCk7CisKKwl9CisKKwlTa2lubmVkTWVzaC5w
cm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSAp
LCB7CisKKwkJY29uc3RydWN0b3I6IFNraW5uZWRNZXNoLAorCisJCWlzU2tpbm5lZE1lc2g6IHRy
dWUsCisKKwkJaW5pdEJvbmVzOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBib25lcyA9IFtdLCBi
b25lLCBnYm9uZTsKKwkJCXZhciBpLCBpbDsKKworCQkJaWYgKCB0aGlzLmdlb21ldHJ5ICYmIHRo
aXMuZ2VvbWV0cnkuYm9uZXMgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCS8vIGZpcnN0LCBjcmVh
dGUgYXJyYXkgb2YgJ0JvbmUnIG9iamVjdHMgZnJvbSBnZW9tZXRyeSBkYXRhCisKKwkJCQlmb3Ig
KCBpID0gMCwgaWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkg
eworCisJCQkJCWdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdOworCisJCQkJCS8vIGNy
ZWF0ZSBuZXcgJ0JvbmUnIG9iamVjdAorCisJCQkJCWJvbmUgPSBuZXcgQm9uZSgpOworCQkJCQli
b25lcy5wdXNoKCBib25lICk7CisKKwkJCQkJLy8gYXBwbHkgdmFsdWVzCisKKwkJCQkJYm9uZS5u
YW1lID0gZ2JvbmUubmFtZTsKKwkJCQkJYm9uZS5wb3NpdGlvbi5mcm9tQXJyYXkoIGdib25lLnBv
cyApOworCQkJCQlib25lLnF1YXRlcm5pb24uZnJvbUFycmF5KCBnYm9uZS5yb3RxICk7CisJCQkJ
CWlmICggZ2JvbmUuc2NsICE9PSB1bmRlZmluZWQgKSBib25lLnNjYWxlLmZyb21BcnJheSggZ2Jv
bmUuc2NsICk7CisKKwkJCQl9CisKKwkJCQkvLyBzZWNvbmQsIGNyZWF0ZSBib25lIGhpZXJhcmNo
eQorCisJCQkJZm9yICggaSA9IDAsIGlsID0gdGhpcy5nZW9tZXRyeS5ib25lcy5sZW5ndGg7IGkg
PCBpbDsgaSArKyApIHsKKworCQkJCQlnYm9uZSA9IHRoaXMuZ2VvbWV0cnkuYm9uZXNbIGkgXTsK
KworCQkJCQlpZiAoICggZ2JvbmUucGFyZW50ICE9PSAtIDEgKSAmJiAoIGdib25lLnBhcmVudCAh
PT0gbnVsbCApICYmICggYm9uZXNbIGdib25lLnBhcmVudCBdICE9PSB1bmRlZmluZWQgKSApIHsK
KworCQkJCQkJLy8gc3Vic2VxdWVudCBib25lcyBpbiB0aGUgaGllcmFyY2h5CisKKwkJCQkJCWJv
bmVzWyBnYm9uZS5wYXJlbnQgXS5hZGQoIGJvbmVzWyBpIF0gKTsKKworCQkJCQl9IGVsc2Ugewor
CisJCQkJCQkvLyB0b3Btb3N0IGJvbmUsIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgc2tpbm5lZCBt
ZXNoCisKKwkJCQkJCXRoaXMuYWRkKCBib25lc1sgaSBdICk7CisKKwkJCQkJfQorCisJCQkJfQor
CisJCQl9CisKKwkJCS8vIG5vdyB0aGUgYm9uZXMgYXJlIHBhcnQgb2YgdGhlIHNjZW5lIGdyYXBo
IGFuZCBjaGlsZHJlbiBvZiB0aGUgc2tpbm5lZCBtZXNoLgorCQkJLy8gbGV0J3MgdXBkYXRlIHRo
ZSBjb3JyZXNwb25kaW5nIG1hdHJpY2VzCisKKwkJCXRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRy
dWUgKTsKKworCQkJcmV0dXJuIGJvbmVzOworCisJCX0sCisKKwkJYmluZDogZnVuY3Rpb24gKCBz
a2VsZXRvbiwgYmluZE1hdHJpeCApIHsKKworCQkJdGhpcy5za2VsZXRvbiA9IHNrZWxldG9uOwor
CisJCQlpZiAoIGJpbmRNYXRyaXggPT09IHVuZGVmaW5lZCApIHsKKworCQkJCXRoaXMudXBkYXRl
TWF0cml4V29ybGQoIHRydWUgKTsKKworCQkJCXRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJz
ZXMoKTsKKworCQkJCWJpbmRNYXRyaXggPSB0aGlzLm1hdHJpeFdvcmxkOworCisJCQl9CisKKwkJ
CXRoaXMuYmluZE1hdHJpeC5jb3B5KCBiaW5kTWF0cml4ICk7CisJCQl0aGlzLmJpbmRNYXRyaXhJ
bnZlcnNlLmdldEludmVyc2UoIGJpbmRNYXRyaXggKTsKKworCQl9LAorCisJCXBvc2U6IGZ1bmN0
aW9uICgpIHsKKworCQkJdGhpcy5za2VsZXRvbi5wb3NlKCk7CisKKwkJfSwKKworCQlub3JtYWxp
emVTa2luV2VpZ2h0czogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgc2NhbGUsIGk7CisKKwkJCWlm
ICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7CisKKwkJCQlm
b3IgKCBpID0gMDsgaSA8IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoOyBpICsrICkg
eworCisJCQkJCXZhciBzdyA9IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHNbIGkgXTsKKworCQkJ
CQlzY2FsZSA9IDEuMCAvIHN3Lmxlbmd0aE1hbmhhdHRhbigpOworCisJCQkJCWlmICggc2NhbGUg
IT09IEluZmluaXR5ICkgeworCisJCQkJCQlzdy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTsKKwor
CQkJCQl9IGVsc2UgeworCisJCQkJCQlzdy5zZXQoIDEsIDAsIDAsIDAgKTsgLy8gZG8gc29tZXRo
aW5nIHJlYXNvbmFibGUKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoIHRoaXMu
Z2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgeworCisJCQkJdmFy
IHZlYyA9IG5ldyBWZWN0b3I0KCk7CisKKwkJCQl2YXIgc2tpbldlaWdodCA9IHRoaXMuZ2VvbWV0
cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0OworCisJCQkJZm9yICggaSA9IDA7IGkgPCBza2luV2Vp
Z2h0LmNvdW50OyBpICsrICkgeworCisJCQkJCXZlYy54ID0gc2tpbldlaWdodC5nZXRYKCBpICk7
CisJCQkJCXZlYy55ID0gc2tpbldlaWdodC5nZXRZKCBpICk7CisJCQkJCXZlYy56ID0gc2tpbldl
aWdodC5nZXRaKCBpICk7CisJCQkJCXZlYy53ID0gc2tpbldlaWdodC5nZXRXKCBpICk7CisKKwkJ
CQkJc2NhbGUgPSAxLjAgLyB2ZWMubGVuZ3RoTWFuaGF0dGFuKCk7CisKKwkJCQkJaWYgKCBzY2Fs
ZSAhPT0gSW5maW5pdHkgKSB7CisKKwkJCQkJCXZlYy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTsK
KworCQkJCQl9IGVsc2UgeworCisJCQkJCQl2ZWMuc2V0KCAxLCAwLCAwLCAwICk7IC8vIGRvIHNv
bWV0aGluZyByZWFzb25hYmxlCisKKwkJCQkJfQorCisJCQkJCXNraW5XZWlnaHQuc2V0WFlaVygg
aSwgdmVjLngsIHZlYy55LCB2ZWMueiwgdmVjLncgKTsKKworCQkJCX0KKworCQkJfQorCisJCX0s
CisKKwkJdXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7CisKKwkJCU1lc2gu
cHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CisKKwkJCWlm
ICggdGhpcy5iaW5kTW9kZSA9PT0gJ2F0dGFjaGVkJyApIHsKKworCQkJCXRoaXMuYmluZE1hdHJp
eEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApOworCisJCQl9IGVsc2UgaWYg
KCB0aGlzLmJpbmRNb2RlID09PSAnZGV0YWNoZWQnICkgeworCisJCQkJdGhpcy5iaW5kTWF0cml4
SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLmJpbmRNYXRyaXggKTsKKworCQkJfSBlbHNlIHsKKwor
CQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1v
ZGU6ICcgKyB0aGlzLmJpbmRNb2RlICk7CisKKwkJCX0KKworCQl9LAorCisJCWNsb25lOiBmdW5j
dGlvbiAoKSB7CisKKwkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRy
eSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTsKKworCQl9CisKKwl9ICk7CisKKwkvKioK
KwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgYWx0
ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICoKKwkgKiBwYXJhbWV0ZXJzID0g
eworCSAqICBjb2xvcjogPGhleD4sCisJICogIG9wYWNpdHk6IDxmbG9hdD4sCisJICoKKwkgKiAg
bGluZXdpZHRoOiA8ZmxvYXQ+LAorCSAqICBsaW5lY2FwOiAicm91bmQiLAorCSAqICBsaW5lam9p
bjogInJvdW5kIgorCSAqIH0KKwkgKi8KKworCWZ1bmN0aW9uIExpbmVCYXNpY01hdGVyaWFsKCBw
YXJhbWV0ZXJzICkgeworCisJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUg
PSAnTGluZUJhc2ljTWF0ZXJpYWwnOworCisJCXRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZm
ZmZmICk7CisKKwkJdGhpcy5saW5ld2lkdGggPSAxOworCQl0aGlzLmxpbmVjYXAgPSAncm91bmQn
OworCQl0aGlzLmxpbmVqb2luID0gJ3JvdW5kJzsKKworCQl0aGlzLmxpZ2h0cyA9IGZhbHNlOwor
CisJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CisKKwl9CisKKwlMaW5lQmFzaWNNYXRl
cmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKKwlM
aW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQmFzaWNNYXRlcmlh
bDsKKworCUxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc0xpbmVCYXNpY01hdGVyaWFsID0g
dHJ1ZTsKKworCUxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBz
b3VyY2UgKSB7CisKKwkJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNl
ICk7CisKKwkJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKKworCQl0aGlzLmxpbmV3
aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7CisJCXRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2Fw
OworCQl0aGlzLmxpbmVqb2luID0gc291cmNlLmxpbmVqb2luOworCisJCXJldHVybiB0aGlzOwor
CisJfTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJ
ICovCisKKwlmdW5jdGlvbiBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG1vZGUgKSB7CisKKwkJ
aWYgKCBtb2RlID09PSAxICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaW5lOiBwYXJh
bWV0ZXIgVEhSRUUuTGluZVBpZWNlcyBubyBsb25nZXIgc3VwcG9ydGVkLiBDcmVhdGVkIFRIUkVF
LkxpbmVTZWdtZW50cyBpbnN0ZWFkLicgKTsKKwkJCXJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBn
ZW9tZXRyeSwgbWF0ZXJpYWwgKTsKKworCQl9CisKKwkJT2JqZWN0M0QuY2FsbCggdGhpcyApOwor
CisJCXRoaXMudHlwZSA9ICdMaW5lJzsKKworCQl0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09
IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisJCXRoaXMubWF0
ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgTGluZUJhc2lj
TWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7CisKKwl9CisK
KwlMaW5lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNE
LnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IExpbmUsCisKKwkJaXNMaW5lOiB0cnVl
LAorCisJCXJheWNhc3Q6ICggZnVuY3Rpb24gKCkgeworCisJCQl2YXIgaW52ZXJzZU1hdHJpeCA9
IG5ldyBNYXRyaXg0KCk7CisJCQl2YXIgcmF5ID0gbmV3IFJheSgpOworCQkJdmFyIHNwaGVyZSA9
IG5ldyBTcGhlcmUoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3Rlciwg
aW50ZXJzZWN0cyApIHsKKworCQkJCXZhciBwcmVjaXNpb24gPSByYXljYXN0ZXIubGluZVByZWNp
c2lvbjsKKwkJCQl2YXIgcHJlY2lzaW9uU3EgPSBwcmVjaXNpb24gKiBwcmVjaXNpb247CisKKwkJ
CQl2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OworCQkJCXZhciBtYXRyaXhXb3JsZCA9IHRo
aXMubWF0cml4V29ybGQ7CisKKwkJCQkvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5j
ZSB0byByYXkKKworCQkJCWlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBn
ZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKKworCQkJCXNwaGVyZS5jb3B5KCBnZW9t
ZXRyeS5ib3VuZGluZ1NwaGVyZSApOworCQkJCXNwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdv
cmxkICk7CisKKwkJCQlpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJl
ICkgPT09IGZhbHNlICkgcmV0dXJuOworCisJCQkJLy8KKworCQkJCWludmVyc2VNYXRyaXguZ2V0
SW52ZXJzZSggbWF0cml4V29ybGQgKTsKKwkJCQlyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFw
cGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApOworCisJCQkJdmFyIHZTdGFydCA9IG5ldyBWZWN0
b3IzKCk7CisJCQkJdmFyIHZFbmQgPSBuZXcgVmVjdG9yMygpOworCQkJCXZhciBpbnRlclNlZ21l
bnQgPSBuZXcgVmVjdG9yMygpOworCQkJCXZhciBpbnRlclJheSA9IG5ldyBWZWN0b3IzKCk7CisJ
CQkJdmFyIHN0ZXAgPSAodGhpcyAmJiB0aGlzLmlzTGluZVNlZ21lbnRzKSA/IDIgOiAxOworCisJ
CQkJaWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgeworCisJCQkJCXZhciBpbmRleCA9
IGdlb21ldHJ5LmluZGV4OworCQkJCQl2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0
ZXM7CisJCQkJCXZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5OworCisJ
CQkJCWlmICggaW5kZXggIT09IG51bGwgKSB7CisKKwkJCQkJCXZhciBpbmRpY2VzID0gaW5kZXgu
YXJyYXk7CisKKwkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoIC0gMTsg
aSA8IGw7IGkgKz0gc3RlcCApIHsKKworCQkJCQkJCXZhciBhID0gaW5kaWNlc1sgaSBdOworCQkJ
CQkJCXZhciBiID0gaW5kaWNlc1sgaSArIDEgXTsKKworCQkJCQkJCXZTdGFydC5mcm9tQXJyYXko
IHBvc2l0aW9ucywgYSAqIDMgKTsKKwkJCQkJCQl2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCBi
ICogMyApOworCisJCQkJCQkJdmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2
U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTsKKworCQkJCQkJCWlmICggZGlz
dFNxID4gcHJlY2lzaW9uU3EgKSBjb250aW51ZTsKKworCQkJCQkJCWludGVyUmF5LmFwcGx5TWF0
cml4NCggdGhpcy5tYXRyaXhXb3JsZCApOyAvL01vdmUgYmFjayB0byB3b3JsZCBzcGFjZSBmb3Ig
ZGlzdGFuY2UgY2FsY3VsYXRpb24KKworCQkJCQkJCXZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5y
YXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7CisKKwkJCQkJCQlpZiAoIGRpc3RhbmNl
IDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgY29udGludWU7
CisKKwkJCQkJCQlpbnRlcnNlY3RzLnB1c2goIHsKKworCQkJCQkJCQlkaXN0YW5jZTogZGlzdGFu
Y2UsCisJCQkJCQkJCS8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRo
ZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/PworCQkJCQkJCQkvLyBwb2ludDogcmF5Y2FzdGVyLnJh
eS5hdCggZGlzdGFuY2UgKSwKKwkJCQkJCQkJcG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFw
cGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLAorCQkJCQkJCQlpbmRleDogaSwKKwkJCQkJ
CQkJZmFjZTogbnVsbCwKKwkJCQkJCQkJZmFjZUluZGV4OiBudWxsLAorCQkJCQkJCQlvYmplY3Q6
IHRoaXMKKworCQkJCQkJCX0gKTsKKworCQkJCQkJfQorCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJ
CWZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9ucy5sZW5ndGggLyAzIC0gMTsgaSA8IGw7IGkg
Kz0gc3RlcCApIHsKKworCQkJCQkJCXZTdGFydC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgMyAqIGkg
KTsKKwkJCQkJCQl2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSArIDMgKTsKKworCQkJ
CQkJCXZhciBkaXN0U3EgPSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggdlN0YXJ0LCB2RW5kLCBp
bnRlclJheSwgaW50ZXJTZWdtZW50ICk7CisKKwkJCQkJCQlpZiAoIGRpc3RTcSA+IHByZWNpc2lv
blNxICkgY29udGludWU7CisKKwkJCQkJCQlpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0
cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1
bGF0aW9uCisKKwkJCQkJCQl2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0
YW5jZVRvKCBpbnRlclJheSApOworCisJCQkJCQkJaWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5u
ZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlOworCisJCQkJCQkJaW50
ZXJzZWN0cy5wdXNoKCB7CisKKwkJCQkJCQkJZGlzdGFuY2U6IGRpc3RhbmNlLAorCQkJCQkJCQkv
LyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRo
ZSBzZWdtZW50Pz8KKwkJCQkJCQkJLy8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNl
ICksCisJCQkJCQkJCXBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRo
aXMubWF0cml4V29ybGQgKSwKKwkJCQkJCQkJaW5kZXg6IGksCisJCQkJCQkJCWZhY2U6IG51bGws
CisJCQkJCQkJCWZhY2VJbmRleDogbnVsbCwKKwkJCQkJCQkJb2JqZWN0OiB0aGlzCisKKwkJCQkJ
CQl9ICk7CisKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9IGVsc2UgaWYgKCBnZW9tZXRyeS5p
c0dlb21ldHJ5ICkgeworCisJCQkJCXZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOwor
CQkJCQl2YXIgbmJWZXJ0aWNlcyA9IHZlcnRpY2VzLmxlbmd0aDsKKworCQkJCQlmb3IgKCB2YXIg
aSA9IDA7IGkgPCBuYlZlcnRpY2VzIC0gMTsgaSArPSBzdGVwICkgeworCisJCQkJCQl2YXIgZGlz
dFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzWyBp
ICsgMSBdLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7CisKKwkJCQkJCWlmICggZGlzdFNxID4g
cHJlY2lzaW9uU3EgKSBjb250aW51ZTsKKworCQkJCQkJaW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0
aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5j
ZSBjYWxjdWxhdGlvbgorCisJCQkJCQl2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdp
bi5kaXN0YW5jZVRvKCBpbnRlclJheSApOworCisJCQkJCQlpZiAoIGRpc3RhbmNlIDwgcmF5Y2Fz
dGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgY29udGludWU7CisKKwkJCQkJ
CWludGVyc2VjdHMucHVzaCggeworCisJCQkJCQkJZGlzdGFuY2U6IGRpc3RhbmNlLAorCQkJCQkJ
CS8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24g
dGhlIHNlZ21lbnQ/PworCQkJCQkJCS8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5j
ZSApLAorCQkJCQkJCXBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRo
aXMubWF0cml4V29ybGQgKSwKKwkJCQkJCQlpbmRleDogaSwKKwkJCQkJCQlmYWNlOiBudWxsLAor
CQkJCQkJCWZhY2VJbmRleDogbnVsbCwKKwkJCQkJCQlvYmplY3Q6IHRoaXMKKworCQkJCQkJfSAp
OworCisJCQkJCX0KKworCQkJCX0KKworCQkJfTsKKworCQl9KCkgKSwKKworCQljbG9uZTogZnVu
Y3Rpb24gKCkgeworCisJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0
cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7CisKKwkJfQorCisJfSApOworCisJLyoq
CisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0
aW9uIExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkgeworCisJCUxpbmUuY2FsbCgg
dGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7CisKKwkJdGhpcy50eXBlID0gJ0xpbmVTZWdtZW50
cyc7CisKKwl9CisKKwlMaW5lU2VnbWVudHMucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2Jq
ZWN0LmNyZWF0ZSggTGluZS5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBMaW5lU2Vn
bWVudHMsCisKKwkJaXNMaW5lU2VnbWVudHM6IHRydWUKKworCX0gKTsKKworCS8qKgorCSAqIEBh
dXRob3IgbWdyZXRlciAvIGh0dHA6Ly9naXRodWIuY29tL21ncmV0ZXIKKwkgKi8KKworCWZ1bmN0
aW9uIExpbmVMb29wKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7CisKKwkJTGluZS5jYWxsKCB0aGlz
LCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKKworCQl0aGlzLnR5cGUgPSAnTGluZUxvb3AnOworCisJ
fQorCisJTGluZUxvb3AucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSgg
TGluZS5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBMaW5lTG9vcCwKKworCQlpc0xp
bmVMb29wOiB0cnVlLAorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRw
Oi8vbXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFs
aWEuY29tLworCSAqCisJICogcGFyYW1ldGVycyA9IHsKKwkgKiAgY29sb3I6IDxoZXg+LAorCSAq
ICBvcGFjaXR5OiA8ZmxvYXQ+LAorCSAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+
ICksCisJICoKKwkgKiAgc2l6ZTogPGZsb2F0PiwKKwkgKiAgc2l6ZUF0dGVudWF0aW9uOiA8Ym9v
bD4KKwkgKiB9CisJICovCisKKwlmdW5jdGlvbiBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyAp
IHsKKworCQlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1BvaW50c01h
dGVyaWFsJzsKKworCQl0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOworCisJCXRo
aXMubWFwID0gbnVsbDsKKworCQl0aGlzLnNpemUgPSAxOworCQl0aGlzLnNpemVBdHRlbnVhdGlv
biA9IHRydWU7CisKKwkJdGhpcy5saWdodHMgPSBmYWxzZTsKKworCQl0aGlzLnNldFZhbHVlcygg
cGFyYW1ldGVycyApOworCisJfQorCisJUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0
LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CisJUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBl
LmNvbnN0cnVjdG9yID0gUG9pbnRzTWF0ZXJpYWw7CisKKwlQb2ludHNNYXRlcmlhbC5wcm90b3R5
cGUuaXNQb2ludHNNYXRlcmlhbCA9IHRydWU7CisKKwlQb2ludHNNYXRlcmlhbC5wcm90b3R5cGUu
Y29weSA9IGZ1bmN0aW9uICggc291cmNlICkgeworCisJCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5
LmNhbGwoIHRoaXMsIHNvdXJjZSApOworCisJCXRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9y
ICk7CisKKwkJdGhpcy5tYXAgPSBzb3VyY2UubWFwOworCisJCXRoaXMuc2l6ZSA9IHNvdXJjZS5z
aXplOworCQl0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHNvdXJjZS5zaXplQXR0ZW51YXRpb247CisK
KwkJcmV0dXJuIHRoaXM7CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0
dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFBvaW50cyggZ2VvbWV0
cnksIG1hdGVyaWFsICkgeworCisJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5
cGUgPSAnUG9pbnRzJzsKKworCQl0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5l
ZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisJCXRoaXMubWF0ZXJpYWwgPSBt
YXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHsg
Y29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7CisKKwl9CisKKwlQb2ludHMucHJv
dG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBl
ICksIHsKKworCQljb25zdHJ1Y3RvcjogUG9pbnRzLAorCisJCWlzUG9pbnRzOiB0cnVlLAorCisJ
CXJheWNhc3Q6ICggZnVuY3Rpb24gKCkgeworCisJCQl2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBN
YXRyaXg0KCk7CisJCQl2YXIgcmF5ID0gbmV3IFJheSgpOworCQkJdmFyIHNwaGVyZSA9IG5ldyBT
cGhlcmUoKTsKKworCQkJcmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJz
ZWN0cyApIHsKKworCQkJCXZhciBvYmplY3QgPSB0aGlzOworCQkJCXZhciBnZW9tZXRyeSA9IHRo
aXMuZ2VvbWV0cnk7CisJCQkJdmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDsKKwkJ
CQl2YXIgdGhyZXNob2xkID0gcmF5Y2FzdGVyLnBhcmFtcy5Qb2ludHMudGhyZXNob2xkOworCisJ
CQkJLy8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5CisKKwkJCQlpZiAo
IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5k
aW5nU3BoZXJlKCk7CisKKwkJCQlzcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUg
KTsKKwkJCQlzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApOworCQkJCXNwaGVyZS5y
YWRpdXMgKz0gdGhyZXNob2xkOworCisJCQkJaWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNT
cGhlcmUoIHNwaGVyZSApID09PSBmYWxzZSApIHJldHVybjsKKworCQkJCS8vCisKKwkJCQlpbnZl
cnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7CisJCQkJcmF5LmNvcHkoIHJheWNh
c3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTsKKworCQkJCXZhciBsb2Nh
bFRocmVzaG9sZCA9IHRocmVzaG9sZCAvICggKCB0aGlzLnNjYWxlLnggKyB0aGlzLnNjYWxlLnkg
KyB0aGlzLnNjYWxlLnogKSAvIDMgKTsKKwkJCQl2YXIgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2Fs
VGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7CisJCQkJdmFyIHBvc2l0aW9uID0gbmV3IFZlY3Rv
cjMoKTsKKworCQkJCWZ1bmN0aW9uIHRlc3RQb2ludCggcG9pbnQsIGluZGV4ICkgeworCisJCQkJ
CXZhciByYXlQb2ludERpc3RhbmNlU3EgPSByYXkuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICk7
CisKKwkJCQkJaWYgKCByYXlQb2ludERpc3RhbmNlU3EgPCBsb2NhbFRocmVzaG9sZFNxICkgewor
CisJCQkJCQl2YXIgaW50ZXJzZWN0UG9pbnQgPSByYXkuY2xvc2VzdFBvaW50VG9Qb2ludCggcG9p
bnQgKTsKKwkJCQkJCWludGVyc2VjdFBvaW50LmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsK
KworCQkJCQkJdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbygg
aW50ZXJzZWN0UG9pbnQgKTsKKworCQkJCQkJaWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFy
IHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjsKKworCQkJCQkJaW50ZXJzZWN0
cy5wdXNoKCB7CisKKwkJCQkJCQlkaXN0YW5jZTogZGlzdGFuY2UsCisJCQkJCQkJZGlzdGFuY2VU
b1JheTogTWF0aC5zcXJ0KCByYXlQb2ludERpc3RhbmNlU3EgKSwKKwkJCQkJCQlwb2ludDogaW50
ZXJzZWN0UG9pbnQuY2xvbmUoKSwKKwkJCQkJCQlpbmRleDogaW5kZXgsCisJCQkJCQkJZmFjZTog
bnVsbCwKKwkJCQkJCQlvYmplY3Q6IG9iamVjdAorCisJCQkJCQl9ICk7CisKKwkJCQkJfQorCisJ
CQkJfQorCisJCQkJaWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgeworCisJCQkJCXZh
ciBpbmRleCA9IGdlb21ldHJ5LmluZGV4OworCQkJCQl2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5
LmF0dHJpYnV0ZXM7CisJCQkJCXZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFy
cmF5OworCisJCQkJCWlmICggaW5kZXggIT09IG51bGwgKSB7CisKKwkJCQkJCXZhciBpbmRpY2Vz
ID0gaW5kZXguYXJyYXk7CisKKwkJCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBpbmRpY2VzLmxl
bmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJCQkJdmFyIGEgPSBpbmRpY2VzWyBpIF07CisK
KwkJCQkJCQlwb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYSAqIDMgKTsKKworCQkJCQkJ
CXRlc3RQb2ludCggcG9zaXRpb24sIGEgKTsKKworCQkJCQkJfQorCisJCQkJCX0gZWxzZSB7CisK
KwkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9ucy5sZW5ndGggLyAzOyBpIDwgbDsg
aSArKyApIHsKKworCQkJCQkJCXBvc2l0aW9uLmZyb21BcnJheSggcG9zaXRpb25zLCBpICogMyAp
OworCisJCQkJCQkJdGVzdFBvaW50KCBwb3NpdGlvbiwgaSApOworCisJCQkJCQl9CisKKwkJCQkJ
fQorCisJCQkJfSBlbHNlIHsKKworCQkJCQl2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNl
czsKKworCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBp
ICsrICkgeworCisJCQkJCQl0ZXN0UG9pbnQoIHZlcnRpY2VzWyBpIF0sIGkgKTsKKworCQkJCQl9
CisKKwkJCQl9CisKKwkJCX07CisKKwkJfSgpICksCisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsK
KworCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1h
dGVyaWFsICkuY29weSggdGhpcyApOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRo
b3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBHcm91cCgp
IHsKKworCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ0dyb3VwJzsK
KworCX0KKworCUdyb3VwLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUo
IE9iamVjdDNELnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IEdyb3VwCisKKwl9ICk7
CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLwor
CisJZnVuY3Rpb24gVmlkZW9UZXh0dXJlKCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBt
YWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkgeworCisJCVRl
eHR1cmUuY2FsbCggdGhpcywgdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVy
LCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApOworCisJCXRoaXMuZ2VuZXJh
dGVNaXBtYXBzID0gZmFsc2U7CisKKwkJdmFyIHNjb3BlID0gdGhpczsKKworCQlmdW5jdGlvbiB1
cGRhdGUoKSB7CisKKwkJCXJlcXVlc3RBbmltYXRpb25GcmFtZSggdXBkYXRlICk7CisKKwkJCWlm
ICggdmlkZW8ucmVhZHlTdGF0ZSA+PSB2aWRlby5IQVZFX0NVUlJFTlRfREFUQSApIHsKKworCQkJ
CXNjb3BlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQkJfQorCisJCX0KKworCQl1cGRhdGUoKTsK
KworCX0KKworCVZpZGVvVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJl
LnByb3RvdHlwZSApOworCVZpZGVvVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBWaWRl
b1RleHR1cmU7CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRx
dWFsaWEuY29tLworCSAqLworCisJZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmUoIG1pcG1hcHMs
IHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdG
aWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7CisKKwkJVGV4dHVyZS5j
YWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmls
dGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7CisKKwkJdGhpcy5pbWFn
ZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9OworCQl0aGlzLm1pcG1hcHMgPSBt
aXBtYXBzOworCisJCS8vIG5vIGZsaXBwaW5nIGZvciBjdWJlIHRleHR1cmVzCisJCS8vIChhbHNv
IGZsaXBwaW5nIGRvZXNuJ3Qgd29yayBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlcyApCisKKwkJdGhp
cy5mbGlwWSA9IGZhbHNlOworCisJCS8vIGNhbid0IGdlbmVyYXRlIG1pcG1hcHMgZm9yIGNvbXBy
ZXNzZWQgdGV4dHVyZXMKKwkJLy8gbWlwcyBtdXN0IGJlIGVtYmVkZGVkIGluIEREUyBmaWxlcwor
CisJCXRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CisKKwl9CisKKwlDb21wcmVzc2VkVGV4
dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApOworCUNv
bXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbXByZXNzZWRUZXh0dXJl
OworCisJQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlLmlzQ29tcHJlc3NlZFRleHR1cmUgPSB0
cnVlOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkg
Ki8KKworCWZ1bmN0aW9uIENhbnZhc1RleHR1cmUoIGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdy
YXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkgewor
CisJCVRleHR1cmUuY2FsbCggdGhpcywgY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1h
Z0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTsKKworCQl0aGlz
Lm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCX0KKworCUNhbnZhc1RleHR1cmUucHJvdG90eXBlID0g
T2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTsKKwlDYW52YXNUZXh0dXJlLnByb3Rv
dHlwZS5jb25zdHJ1Y3RvciA9IENhbnZhc1RleHR1cmU7CisKKwkvKioKKwkgKiBAYXV0aG9yIE1h
dHQgRGVzTGF1cmllcnMgLyBAbWF0dGRlc2wKKwkgKiBAYXV0aG9yIGF0aXggLyBhcnRodXJzaWxi
ZXIuZGUKKwkgKi8KKworCWZ1bmN0aW9uIERlcHRoVGV4dHVyZSggd2lkdGgsIGhlaWdodCwgdHlw
ZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9w
eSwgZm9ybWF0ICkgeworCisJCWZvcm1hdCA9IGZvcm1hdCAhPT0gdW5kZWZpbmVkID8gZm9ybWF0
IDogRGVwdGhGb3JtYXQ7CisKKwkJaWYgKCBmb3JtYXQgIT09IERlcHRoRm9ybWF0ICYmIGZvcm1h
dCAhPT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgeworCisJCQl0aHJvdyBuZXcgRXJyb3IoICdEZXB0
aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVF
LkRlcHRoU3RlbmNpbEZvcm1hdCcgKQorCisJCX0KKworCQlpZiAoIHR5cGUgPT09IHVuZGVmaW5l
ZCAmJiBmb3JtYXQgPT09IERlcHRoRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlOwor
CQlpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1h
dCApIHR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7CisKKwkJVGV4dHVyZS5jYWxsKCB0aGlzLCBu
dWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQs
IHR5cGUsIGFuaXNvdHJvcHkgKTsKKworCQl0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhl
aWdodDogaGVpZ2h0IH07CisKKwkJdGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVm
aW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7CisJCXRoaXMubWluRmlsdGVyID0gbWlu
RmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBOZWFyZXN0RmlsdGVyOworCisJCXRo
aXMuZmxpcFkgPSBmYWxzZTsKKwkJdGhpcy5nZW5lcmF0ZU1pcG1hcHMJPSBmYWxzZTsKKworCX0K
KworCURlcHRoVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3Rv
dHlwZSApOworCURlcHRoVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEZXB0aFRleHR1
cmU7CisJRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZSA9IHRydWU7CisKKwkv
KioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3Ig
TXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisJICovCisKKwlmdW5jdGlvbiBX
aXJlZnJhbWVHZW9tZXRyeSggZ2VvbWV0cnkgKSB7CisKKwkJQnVmZmVyR2VvbWV0cnkuY2FsbCgg
dGhpcyApOworCisJCXRoaXMudHlwZSA9ICdXaXJlZnJhbWVHZW9tZXRyeSc7CisKKwkJLy8gYnVm
ZmVyCisKKwkJdmFyIHZlcnRpY2VzID0gW107CisKKwkJLy8gaGVscGVyIHZhcmlhYmxlcworCisJ
CXZhciBpLCBqLCBsLCBvLCBvbDsKKwkJdmFyIGVkZ2UgPSBbIDAsIDAgXSwgZWRnZXMgPSB7fSwg
ZSwgZWRnZTEsIGVkZ2UyOworCQl2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07CisJ
CXZhciB2ZXJ0ZXg7CisKKwkJLy8gZGlmZmVyZW50IGxvZ2ljIGZvciBHZW9tZXRyeSBhbmQgQnVm
ZmVyR2VvbWV0cnkKKworCQlpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7
CisKKwkJCS8vIGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYWxsIGVkZ2Vz
IHdpdGhvdXQgZHVwbGljYXRlcworCisJCQl2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlczsKKwor
CQkJZm9yICggaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJ
dmFyIGZhY2UgPSBmYWNlc1sgaSBdOworCisJCQkJZm9yICggaiA9IDA7IGogPCAzOyBqICsrICkg
eworCisJCQkJCWVkZ2UxID0gZmFjZVsga2V5c1sgaiBdIF07CisJCQkJCWVkZ2UyID0gZmFjZVsg
a2V5c1sgKCBqICsgMSApICUgMyBdIF07CisJCQkJCWVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdl
MSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzCisJCQkJCWVkZ2VbIDEg
XSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTsKKworCQkJCQlrZXkgPSBlZGdlWyAwIF0gKyAn
LCcgKyBlZGdlWyAxIF07CisKKwkJCQkJaWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCAp
IHsKKworCQkJCQkJZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBl
ZGdlWyAxIF0gfTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gZ2VuZXJhdGUg
dmVydGljZXMKKworCQkJZm9yICgga2V5IGluIGVkZ2VzICkgeworCisJCQkJZSA9IGVkZ2VzWyBr
ZXkgXTsKKworCQkJCXZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MSBdOworCQkJ
CXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworCQkJCXZl
cnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MiBdOworCQkJCXZlcnRpY2VzLnB1c2go
IHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworCQkJfQorCisJCX0gZWxzZSBpZiAo
IGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisKKwkJCXZhciBwb3Np
dGlvbiwgaW5kaWNlcywgZ3JvdXBzOworCQkJdmFyIGdyb3VwLCBzdGFydCwgY291bnQ7CisJCQl2
YXIgaW5kZXgxLCBpbmRleDI7CisKKwkJCXZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCWlm
ICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7CisKKwkJCQkvLyBpbmRleGVkIEJ1ZmZlckdl
b21ldHJ5CisKKwkJCQlwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CisJ
CQkJaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4OworCQkJCWdyb3VwcyA9IGdlb21ldHJ5Lmdyb3Vw
czsKKworCQkJCWlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHsKKworCQkJCQlncm91cHMgPSBb
IHsgc3RhcnQ6IDAsIGNvdW50OiBpbmRpY2VzLmNvdW50LCBtYXRlcmlhbEluZGV4OiAwIH0gXTsK
KworCQkJCX0KKworCQkJCS8vIGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMg
YWxsIGVnZXMgd2l0aG91dCBkdXBsaWNhdGVzCisKKwkJCQlmb3IgKCBvID0gMCwgb2wgPSBncm91
cHMubGVuZ3RoOyBvIDwgb2w7ICsrIG8gKSB7CisKKwkJCQkJZ3JvdXAgPSBncm91cHNbIG8gXTsK
KworCQkJCQlzdGFydCA9IGdyb3VwLnN0YXJ0OworCQkJCQljb3VudCA9IGdyb3VwLmNvdW50Owor
CisJCQkJCWZvciAoIGkgPSBzdGFydCwgbCA9ICggc3RhcnQgKyBjb3VudCApOyBpIDwgbDsgaSAr
PSAzICkgeworCisJCQkJCQlmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7CisKKwkJCQkJCQll
ZGdlMSA9IGluZGljZXMuZ2V0WCggaSArIGogKTsKKwkJCQkJCQllZGdlMiA9IGluZGljZXMuZ2V0
WCggaSArICggaiArIDEgKSAlIDMgKTsKKwkJCQkJCQllZGdlWyAwIF0gPSBNYXRoLm1pbiggZWRn
ZTEsIGVkZ2UyICk7IC8vIHNvcnRpbmcgcHJldmVudHMgZHVwbGljYXRlcworCQkJCQkJCWVkZ2Vb
IDEgXSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTsKKworCQkJCQkJCWtleSA9IGVkZ2VbIDAg
XSArICcsJyArIGVkZ2VbIDEgXTsKKworCQkJCQkJCWlmICggZWRnZXNbIGtleSBdID09PSB1bmRl
ZmluZWQgKSB7CisKKwkJCQkJCQkJZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwg
aW5kZXgyOiBlZGdlWyAxIF0gfTsKKworCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJCX0KKwor
CQkJCX0KKworCQkJCS8vIGdlbmVyYXRlIHZlcnRpY2VzCisKKwkJCQlmb3IgKCBrZXkgaW4gZWRn
ZXMgKSB7CisKKwkJCQkJZSA9IGVkZ2VzWyBrZXkgXTsKKworCQkJCQl2ZXJ0ZXguZnJvbUJ1ZmZl
ckF0dHJpYnV0ZSggcG9zaXRpb24sIGUuaW5kZXgxICk7CisJCQkJCXZlcnRpY2VzLnB1c2goIHZl
cnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworCQkJCQl2ZXJ0ZXguZnJvbUJ1ZmZlckF0
dHJpYnV0ZSggcG9zaXRpb24sIGUuaW5kZXgyICk7CisJCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRl
eC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworCQkJCX0KKworCQkJfSBlbHNlIHsKKworCQkJ
CS8vIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5CisKKwkJCQlwb3NpdGlvbiA9IGdlb21ldHJ5
LmF0dHJpYnV0ZXMucG9zaXRpb247CisKKwkJCQlmb3IgKCBpID0gMCwgbCA9ICggcG9zaXRpb24u
Y291bnQgLyAzICk7IGkgPCBsOyBpICsrICkgeworCisJCQkJCWZvciAoIGogPSAwOyBqIDwgMzsg
aiArKyApIHsKKworCQkJCQkJLy8gdGhyZWUgZWRnZXMgcGVyIHRyaWFuZ2xlLCBhbiBlZGdlIGlz
IHJlcHJlc2VudGVkIGFzIChpbmRleDEsIGluZGV4MikKKwkJCQkJCS8vIGUuZy4gdGhlIGZpcnN0
IHRyaWFuZ2xlIGhhcyB0aGUgZm9sbG93aW5nIGVkZ2VzOiAoMCwxKSwoMSwyKSwoMiwwKQorCisJ
CQkJCQlpbmRleDEgPSAzICogaSArIGo7CisJCQkJCQl2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0
ZSggcG9zaXRpb24sIGluZGV4MSApOworCQkJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZl
cnRleC55LCB2ZXJ0ZXgueiApOworCisJCQkJCQlpbmRleDIgPSAzICogaSArICggKCBqICsgMSAp
ICUgMyApOworCQkJCQkJdmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRl
eDIgKTsKKwkJCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4Lnog
KTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQl9CisKKwkJLy8gYnVpbGQgZ2VvbWV0
cnkKKworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJB
dHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKworCX0KKworCVdpcmVmcmFtZUdlb21ldHJ5LnBy
b3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOworCVdp
cmVmcmFtZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdpcmVmcmFtZUdlb21ldHJ5
OworCisJLyoqCisJICogQGF1dGhvciB6ejg1IC8gaHR0cHM6Ly9naXRodWIuY29tL3p6ODUKKwkg
KiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NworCSAqCisJICog
UGFyYW1ldHJpYyBTdXJmYWNlcyBHZW9tZXRyeQorCSAqIGJhc2VkIG9uIHRoZSBicmlsbGlhbnQg
YXJ0aWNsZSBieSBAcHJpZGVvdXQgaHR0cDovL3ByaWRlb3V0Lm5ldC9ibG9nLz9wPTQ0CisJICov
CisKKwkvLyBQYXJhbWV0cmljR2VvbWV0cnkKKworCWZ1bmN0aW9uIFBhcmFtZXRyaWNHZW9tZXRy
eSggZnVuYywgc2xpY2VzLCBzdGFja3MgKSB7CisKKwkJR2VvbWV0cnkuY2FsbCggdGhpcyApOwor
CisJCXRoaXMudHlwZSA9ICdQYXJhbWV0cmljR2VvbWV0cnknOworCisJCXRoaXMucGFyYW1ldGVy
cyA9IHsKKwkJCWZ1bmM6IGZ1bmMsCisJCQlzbGljZXM6IHNsaWNlcywKKwkJCXN0YWNrczogc3Rh
Y2tzCisJCX07CisKKwkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBQYXJhbWV0cmljQnVm
ZmVyR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkgKTsKKwkJdGhpcy5tZXJnZVZlcnRp
Y2VzKCk7CisKKwl9CisKKwlQYXJhbWV0cmljR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNy
ZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisJUGFyYW1ldHJpY0dlb21ldHJ5LnByb3RvdHlw
ZS5jb25zdHJ1Y3RvciA9IFBhcmFtZXRyaWNHZW9tZXRyeTsKKworCS8vIFBhcmFtZXRyaWNCdWZm
ZXJHZW9tZXRyeQorCisJZnVuY3Rpb24gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBz
bGljZXMsIHN0YWNrcyApIHsKKworCQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJ
dGhpcy50eXBlID0gJ1BhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0
ZXJzID0geworCQkJZnVuYzogZnVuYywKKwkJCXNsaWNlczogc2xpY2VzLAorCQkJc3RhY2tzOiBz
dGFja3MKKwkJfTsKKworCQkvLyBidWZmZXJzCisKKwkJdmFyIGluZGljZXMgPSBbXTsKKwkJdmFy
IHZlcnRpY2VzID0gW107CisJCXZhciBub3JtYWxzID0gW107CisJCXZhciB1dnMgPSBbXTsKKwor
CQl2YXIgRVBTID0gMC4wMDAwMTsKKworCQl2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTsKKwor
CQl2YXIgcDAgPSBuZXcgVmVjdG9yMygpLCBwMSA9IG5ldyBWZWN0b3IzKCk7CisJCXZhciBwdSA9
IG5ldyBWZWN0b3IzKCksIHB2ID0gbmV3IFZlY3RvcjMoKTsKKworCQl2YXIgaSwgajsKKworCQkv
LyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzCisKKwkJdmFyIHNsaWNlQ291bnQg
PSBzbGljZXMgKyAxOworCisJCWZvciAoIGkgPSAwOyBpIDw9IHN0YWNrczsgaSArKyApIHsKKwor
CQkJdmFyIHYgPSBpIC8gc3RhY2tzOworCisJCQlmb3IgKCBqID0gMDsgaiA8PSBzbGljZXM7IGog
KysgKSB7CisKKwkJCQl2YXIgdSA9IGogLyBzbGljZXM7CisKKwkJCQkvLyB2ZXJ0ZXgKKworCQkJ
CXAwID0gZnVuYyggdSwgdiwgcDAgKTsKKwkJCQl2ZXJ0aWNlcy5wdXNoKCBwMC54LCBwMC55LCBw
MC56ICk7CisKKwkJCQkvLyBub3JtYWwKKworCQkJCS8vIGFwcHJveGltYXRlIHRhbmdlbnQgdmVj
dG9ycyB2aWEgZmluaXRlIGRpZmZlcmVuY2VzCisKKwkJCQlpZiAoIHUgLSBFUFMgPj0gMCApIHsK
KworCQkJCQlwMSA9IGZ1bmMoIHUgLSBFUFMsIHYsIHAxICk7CisJCQkJCXB1LnN1YlZlY3RvcnMo
IHAwLCBwMSApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQlwMSA9IGZ1bmMoIHUgKyBFUFMsIHYs
IHAxICk7CisJCQkJCXB1LnN1YlZlY3RvcnMoIHAxLCBwMCApOworCisJCQkJfQorCisJCQkJaWYg
KCB2IC0gRVBTID49IDAgKSB7CisKKwkJCQkJcDEgPSBmdW5jKCB1LCB2IC0gRVBTLCBwMSApOwor
CQkJCQlwdi5zdWJWZWN0b3JzKCBwMCwgcDEgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJcDEg
PSBmdW5jKCB1LCB2ICsgRVBTLCBwMSApOworCQkJCQlwdi5zdWJWZWN0b3JzKCBwMSwgcDAgKTsK
KworCQkJCX0KKworCQkJCS8vIGNyb3NzIHByb2R1Y3Qgb2YgdGFuZ2VudCB2ZWN0b3JzIHJldHVy
bnMgc3VyZmFjZSBub3JtYWwKKworCQkJCW5vcm1hbC5jcm9zc1ZlY3RvcnMoIHB1LCBwdiApLm5v
cm1hbGl6ZSgpOworCQkJCW5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwu
eiApOworCisJCQkJLy8gdXYKKworCQkJCXV2cy5wdXNoKCB1LCB2ICk7CisKKwkJCX0KKworCQl9
CisKKwkJLy8gZ2VuZXJhdGUgaW5kaWNlcworCisJCWZvciAoIGkgPSAwOyBpIDwgc3RhY2tzOyBp
ICsrICkgeworCisJCQlmb3IgKCBqID0gMDsgaiA8IHNsaWNlczsgaiArKyApIHsKKworCQkJCXZh
ciBhID0gaSAqIHNsaWNlQ291bnQgKyBqOworCQkJCXZhciBiID0gaSAqIHNsaWNlQ291bnQgKyBq
ICsgMTsKKwkJCQl2YXIgYyA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqICsgMTsKKwkJCQl2
YXIgZCA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqOworCisJCQkJLy8gZmFjZXMgb25lIGFu
ZCB0d28KKworCQkJCWluZGljZXMucHVzaCggYSwgYiwgZCApOworCQkJCWluZGljZXMucHVzaCgg
YiwgYywgZCApOworCisJCQl9CisKKwkJfQorCisJCS8vIGJ1aWxkIGdlb21ldHJ5CisKKwkJdGhp
cy5zZXRJbmRleCggaW5kaWNlcyApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywg
bmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKwkJdGhpcy5hZGRB
dHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywg
MyApICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJp
YnV0ZSggdXZzLCAyICkgKTsKKworCX0KKworCVBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeS5wcm90
b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlQYXJh
bWV0cmljQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyYW1ldHJpY0J1
ZmZlckdlb21ldHJ5OworCisJLyoqCisJICogQGF1dGhvciBjbG9ja3dvcmtnZWVrIC8gaHR0cHM6
Ly9naXRodWIuY29tL2Nsb2Nrd29ya2dlZWsKKwkgKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8g
aHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5CisJICogQGF1dGhvciBXZXN0TGFuZ2xl
eSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisJICogQGF1dGhvciBNdWdlbjg3IC8g
aHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKwkgKi8KKworCS8vIFBvbHloZWRyb25HZW9tZXRy
eQorCisJZnVuY3Rpb24gUG9seWhlZHJvbkdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFk
aXVzLCBkZXRhaWwgKSB7CisKKwkJR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlw
ZSA9ICdQb2x5aGVkcm9uR2VvbWV0cnknOworCisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXZl
cnRpY2VzOiB2ZXJ0aWNlcywKKwkJCWluZGljZXM6IGluZGljZXMsCisJCQlyYWRpdXM6IHJhZGl1
cywKKwkJCWRldGFpbDogZGV0YWlsCisJCX07CisKKwkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnko
IG5ldyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMs
IGRldGFpbCApICk7CisJCXRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisJfQorCisJUG9seWhlZHJv
bkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSAp
OworCVBvbHloZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2x5aGVkcm9u
R2VvbWV0cnk7CisKKwkvLyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkKKworCWZ1bmN0aW9uIFBv
bHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWls
ICkgeworCisJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAn
UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQl2
ZXJ0aWNlczogdmVydGljZXMsCisJCQlpbmRpY2VzOiBpbmRpY2VzLAorCQkJcmFkaXVzOiByYWRp
dXMsCisJCQlkZXRhaWw6IGRldGFpbAorCQl9OworCisJCXJhZGl1cyA9IHJhZGl1cyB8fCAxOwor
CQlkZXRhaWwgPSBkZXRhaWwgfHwgMDsKKworCQkvLyBkZWZhdWx0IGJ1ZmZlciBkYXRhCisKKwkJ
dmFyIHZlcnRleEJ1ZmZlciA9IFtdOworCQl2YXIgdXZCdWZmZXIgPSBbXTsKKworCQkvLyB0aGUg
c3ViZGl2aXNpb24gY3JlYXRlcyB0aGUgdmVydGV4IGJ1ZmZlciBkYXRhCisKKwkJc3ViZGl2aWRl
KCBkZXRhaWwgKTsKKworCQkvLyBhbGwgdmVydGljZXMgc2hvdWxkIGxpZSBvbiBhIGNvbmNlcHR1
YWwgc3BoZXJlIHdpdGggYSBnaXZlbiByYWRpdXMKKworCQlhcHBwbHlSYWRpdXMoIHJhZGl1cyAp
OworCisJCS8vIGZpbmFsbHksIGNyZWF0ZSB0aGUgdXYgZGF0YQorCisJCWdlbmVyYXRlVVZzKCk7
CisKKwkJLy8gYnVpbGQgbm9uLWluZGV4ZWQgZ2VvbWV0cnkKKworCQl0aGlzLmFkZEF0dHJpYnV0
ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlciwg
MyApICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJB
dHRyaWJ1dGUoIHZlcnRleEJ1ZmZlci5zbGljZSgpLCAzICkgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1
dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dkJ1ZmZlciwgMiApICk7CisK
KwkJaWYgKCBkZXRhaWwgPT09IDAgKSB7CisKKwkJCXRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMo
KTsgLy8gZmxhdCBub3JtYWxzCisKKwkJfSBlbHNlIHsKKworCQkJdGhpcy5ub3JtYWxpemVOb3Jt
YWxzKCk7IC8vIHNtb290aCBub3JtYWxzCisKKwkJfQorCisJCS8vIGhlbHBlciBmdW5jdGlvbnMK
KworCQlmdW5jdGlvbiBzdWJkaXZpZGUoIGRldGFpbCApIHsKKworCQkJdmFyIGEgPSBuZXcgVmVj
dG9yMygpOworCQkJdmFyIGIgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIGMgPSBuZXcgVmVjdG9y
MygpOworCisJCQkvLyBpdGVyYXRlIG92ZXIgYWxsIGZhY2VzIGFuZCBhcHBseSBhIHN1YmRpdmlz
b24gd2l0aCB0aGUgZ2l2ZW4gZGV0YWlsIHZhbHVlCisKKwkJCWZvciAoIHZhciBpID0gMDsgaSA8
IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7CisKKwkJCQkvLyBnZXQgdGhlIHZlcnRpY2VzIG9m
IHRoZSBmYWNlCisKKwkJCQlnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMCBdLCBhICk7
CisJCQkJZ2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDEgXSwgYiApOworCQkJCWdldFZl
cnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAyIF0sIGMgKTsKKworCQkJCS8vIHBlcmZvcm0gc3Vi
ZGl2aXNpb24KKworCQkJCXN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApOworCisJCQl9
CisKKwkJfQorCisJCWZ1bmN0aW9uIHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApIHsK
KworCQkJdmFyIGNvbHMgPSBNYXRoLnBvdyggMiwgZGV0YWlsICk7CisKKwkJCS8vIHdlIHVzZSB0
aGlzIG11bHRpZGltZW5zaW9uYWwgYXJyYXkgYXMgYSBkYXRhIHN0cnVjdHVyZSBmb3IgY3JlYXRp
bmcgdGhlIHN1YmRpdmlzaW9uCisKKwkJCXZhciB2ID0gW107CisKKwkJCXZhciBpLCBqOworCisJ
CQkvLyBjb25zdHJ1Y3QgYWxsIG9mIHRoZSB2ZXJ0aWNlcyBmb3IgdGhpcyBzdWJkaXZpc2lvbgor
CisJCQlmb3IgKCBpID0gMDsgaSA8PSBjb2xzOyBpICsrICkgeworCisJCQkJdlsgaSBdID0gW107
CisKKwkJCQl2YXIgYWogPSBhLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTsKKwkJCQl2YXIg
YmogPSBiLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTsKKworCQkJCXZhciByb3dzID0gY29s
cyAtIGk7CisKKwkJCQlmb3IgKCBqID0gMDsgaiA8PSByb3dzOyBqICsrICkgeworCisJCQkJCWlm
ICggaiA9PT0gMCAmJiBpID09PSBjb2xzICkgeworCisJCQkJCQl2WyBpIF1bIGogXSA9IGFqOwor
CisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCXZbIGkgXVsgaiBdID0gYWouY2xvbmUoKS5sZXJwKCBi
aiwgaiAvIHJvd3MgKTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gY29uc3Ry
dWN0IGFsbCBvZiB0aGUgZmFjZXMKKworCQkJZm9yICggaSA9IDA7IGkgPCBjb2xzOyBpICsrICkg
eworCisJCQkJZm9yICggaiA9IDA7IGogPCAyICogKCBjb2xzIC0gaSApIC0gMTsgaiArKyApIHsK
KworCQkJCQl2YXIgayA9IE1hdGguZmxvb3IoIGogLyAyICk7CisKKwkJCQkJaWYgKCBqICUgMiA9
PT0gMCApIHsKKworCQkJCQkJcHVzaFZlcnRleCggdlsgaSBdWyBrICsgMSBdICk7CisJCQkJCQlw
dXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTsKKwkJCQkJCXB1c2hWZXJ0ZXgoIHZbIGkgXVsg
ayBdICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJcHVzaFZlcnRleCggdlsgaSBdWyBrICsg
MSBdICk7CisJCQkJCQlwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrICsgMSBdICk7CisJCQkJCQlw
dXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0K
KworCQl9CisKKwkJZnVuY3Rpb24gYXBwcGx5UmFkaXVzKCByYWRpdXMgKSB7CisKKwkJCXZhciB2
ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOworCisJCQkvLyBpdGVyYXRlIG92ZXIgdGhlIGVudGlyZSBi
dWZmZXIgYW5kIGFwcGx5IHRoZSByYWRpdXMgdG8gZWFjaCB2ZXJ0ZXgKKworCQkJZm9yICggdmFy
IGkgPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSAzICkgeworCisJCQkJdmVydGV4
LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07CisJCQkJdmVydGV4LnkgPSB2ZXJ0ZXhCdWZmZXJb
IGkgKyAxIF07CisJCQkJdmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF07CisKKwkJCQl2
ZXJ0ZXgubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHJhZGl1cyApOworCisJCQkJdmVydGV4
QnVmZmVyWyBpICsgMCBdID0gdmVydGV4Lng7CisJCQkJdmVydGV4QnVmZmVyWyBpICsgMSBdID0g
dmVydGV4Lnk7CisJCQkJdmVydGV4QnVmZmVyWyBpICsgMiBdID0gdmVydGV4Lno7CisKKwkJCX0K
KworCQl9CisKKwkJZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7CisKKwkJCXZhciB2ZXJ0ZXggPSBu
ZXcgVmVjdG9yMygpOworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVu
Z3RoOyBpICs9IDMgKSB7CisKKwkJCQl2ZXJ0ZXgueCA9IHZlcnRleEJ1ZmZlclsgaSArIDAgXTsK
KwkJCQl2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTsKKwkJCQl2ZXJ0ZXgueiA9IHZl
cnRleEJ1ZmZlclsgaSArIDIgXTsKKworCQkJCXZhciB1ID0gYXppbXV0aCggdmVydGV4ICkgLyAy
IC8gTWF0aC5QSSArIDAuNTsKKwkJCQl2YXIgdiA9IGluY2xpbmF0aW9uKCB2ZXJ0ZXggKSAvIE1h
dGguUEkgKyAwLjU7CisJCQkJdXZCdWZmZXIucHVzaCggdSwgMSAtIHYgKTsKKworCQkJfQorCisJ
CQljb3JyZWN0VVZzKCk7CisKKwkJCWNvcnJlY3RTZWFtKCk7CisKKwkJfQorCisJCWZ1bmN0aW9u
IGNvcnJlY3RTZWFtKCkgeworCisJCQkvLyBoYW5kbGUgY2FzZSB3aGVuIGZhY2Ugc3RyYWRkbGVz
IHRoZSBzZWFtLCBzZWUgIzMyNjkKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdXZCdWZmZXIu
bGVuZ3RoOyBpICs9IDYgKSB7CisKKwkJCQkvLyB1diBkYXRhIG9mIGEgc2luZ2xlIGZhY2UKKwor
CQkJCXZhciB4MCA9IHV2QnVmZmVyWyBpICsgMCBdOworCQkJCXZhciB4MSA9IHV2QnVmZmVyWyBp
ICsgMiBdOworCQkJCXZhciB4MiA9IHV2QnVmZmVyWyBpICsgNCBdOworCisJCQkJdmFyIG1heCA9
IE1hdGgubWF4KCB4MCwgeDEsIHgyICk7CisJCQkJdmFyIG1pbiA9IE1hdGgubWluKCB4MCwgeDEs
IHgyICk7CisKKwkJCQkvLyAwLjkgaXMgc29tZXdoYXQgYXJiaXRyYXJ5CisKKwkJCQlpZiAoIG1h
eCA+IDAuOSAmJiBtaW4gPCAwLjEgKSB7CisKKwkJCQkJaWYgKCB4MCA8IDAuMiApIHV2QnVmZmVy
WyBpICsgMCBdICs9IDE7CisJCQkJCWlmICggeDEgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDIgXSAr
PSAxOworCQkJCQlpZiAoIHgyIDwgMC4yICkgdXZCdWZmZXJbIGkgKyA0IF0gKz0gMTsKKworCQkJ
CX0KKworCQkJfQorCisJCX0KKworCQlmdW5jdGlvbiBwdXNoVmVydGV4KCB2ZXJ0ZXggKSB7CisK
KwkJCXZlcnRleEJ1ZmZlci5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CisK
KwkJfQorCisJCWZ1bmN0aW9uIGdldFZlcnRleEJ5SW5kZXgoIGluZGV4LCB2ZXJ0ZXggKSB7CisK
KwkJCXZhciBzdHJpZGUgPSBpbmRleCAqIDM7CisKKwkJCXZlcnRleC54ID0gdmVydGljZXNbIHN0
cmlkZSArIDAgXTsKKwkJCXZlcnRleC55ID0gdmVydGljZXNbIHN0cmlkZSArIDEgXTsKKwkJCXZl
cnRleC56ID0gdmVydGljZXNbIHN0cmlkZSArIDIgXTsKKworCQl9CisKKwkJZnVuY3Rpb24gY29y
cmVjdFVWcygpIHsKKworCQkJdmFyIGEgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIGIgPSBuZXcg
VmVjdG9yMygpOworCQkJdmFyIGMgPSBuZXcgVmVjdG9yMygpOworCisJCQl2YXIgY2VudHJvaWQg
PSBuZXcgVmVjdG9yMygpOworCisJCQl2YXIgdXZBID0gbmV3IFZlY3RvcjIoKTsKKwkJCXZhciB1
dkIgPSBuZXcgVmVjdG9yMigpOworCQkJdmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7CisKKwkJCWZv
ciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDksIGog
Kz0gNiApIHsKKworCQkJCWEuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0sIHZlcnRleEJ1ZmZl
clsgaSArIDEgXSwgdmVydGV4QnVmZmVyWyBpICsgMiBdICk7CisJCQkJYi5zZXQoIHZlcnRleEJ1
ZmZlclsgaSArIDMgXSwgdmVydGV4QnVmZmVyWyBpICsgNCBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA1
IF0gKTsKKwkJCQljLnNldCggdmVydGV4QnVmZmVyWyBpICsgNiBdLCB2ZXJ0ZXhCdWZmZXJbIGkg
KyA3IF0sIHZlcnRleEJ1ZmZlclsgaSArIDggXSApOworCisJCQkJdXZBLnNldCggdXZCdWZmZXJb
IGogKyAwIF0sIHV2QnVmZmVyWyBqICsgMSBdICk7CisJCQkJdXZCLnNldCggdXZCdWZmZXJbIGog
KyAyIF0sIHV2QnVmZmVyWyBqICsgMyBdICk7CisJCQkJdXZDLnNldCggdXZCdWZmZXJbIGogKyA0
IF0sIHV2QnVmZmVyWyBqICsgNSBdICk7CisKKwkJCQljZW50cm9pZC5jb3B5KCBhICkuYWRkKCBi
ICkuYWRkKCBjICkuZGl2aWRlU2NhbGFyKCAzICk7CisKKwkJCQl2YXIgYXppID0gYXppbXV0aCgg
Y2VudHJvaWQgKTsKKworCQkJCWNvcnJlY3RVViggdXZBLCBqICsgMCwgYSwgYXppICk7CisJCQkJ
Y29ycmVjdFVWKCB1dkIsIGogKyAyLCBiLCBhemkgKTsKKwkJCQljb3JyZWN0VVYoIHV2QywgaiAr
IDQsIGMsIGF6aSApOworCisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIGNvcnJlY3RVViggdXYs
IHN0cmlkZSwgdmVjdG9yLCBhemltdXRoICkgeworCisJCQlpZiAoICggYXppbXV0aCA8IDAgKSAm
JiAoIHV2LnggPT09IDEgKSApIHsKKworCQkJCXV2QnVmZmVyWyBzdHJpZGUgXSA9IHV2LnggLSAx
OworCisJCQl9CisKKwkJCWlmICggKCB2ZWN0b3IueCA9PT0gMCApICYmICggdmVjdG9yLnogPT09
IDAgKSApIHsKKworCQkJCXV2QnVmZmVyWyBzdHJpZGUgXSA9IGF6aW11dGggLyAyIC8gTWF0aC5Q
SSArIDAuNTsKKworCQkJfQorCisJCX0KKworCQkvLyBBbmdsZSBhcm91bmQgdGhlIFkgYXhpcywg
Y291bnRlci1jbG9ja3dpc2Ugd2hlbiBsb29raW5nIGZyb20gYWJvdmUuCisKKwkJZnVuY3Rpb24g
YXppbXV0aCggdmVjdG9yICkgeworCisJCQlyZXR1cm4gTWF0aC5hdGFuMiggdmVjdG9yLnosIC0g
dmVjdG9yLnggKTsKKworCQl9CisKKworCQkvLyBBbmdsZSBhYm92ZSB0aGUgWFogcGxhbmUuCisK
KwkJZnVuY3Rpb24gaW5jbGluYXRpb24oIHZlY3RvciApIHsKKworCQkJcmV0dXJuIE1hdGguYXRh
bjIoIC0gdmVjdG9yLnksIE1hdGguc3FydCggKCB2ZWN0b3IueCAqIHZlY3Rvci54ICkgKyAoIHZl
Y3Rvci56ICogdmVjdG9yLnogKSApICk7CisKKwkJfQorCisJfQorCisJUG9seWhlZHJvbkJ1ZmZl
ckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3Rv
dHlwZSApOworCVBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3Ig
PSBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk7CisKKwkvKioKKwkgKiBAYXV0aG9yIHRpbW90aHlw
cmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5CisJICogQGF1dGhvciBN
dWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKwkgKi8KKworCS8vIFRldHJhaGVk
cm9uR2VvbWV0cnkKKworCWZ1bmN0aW9uIFRldHJhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0
YWlsICkgeworCisJCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnVGV0
cmFoZWRyb25HZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJcmFkaXVzOiBy
YWRpdXMsCisJCQlkZXRhaWw6IGRldGFpbAorCQl9OworCisJCXRoaXMuZnJvbUJ1ZmZlckdlb21l
dHJ5KCBuZXcgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApOwor
CQl0aGlzLm1lcmdlVmVydGljZXMoKTsKKworCX0KKworCVRldHJhaGVkcm9uR2VvbWV0cnkucHJv
dG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisJVGV0cmFoZWRy
b25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkdlb21ldHJ5Owor
CisJLy8gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeQorCisJZnVuY3Rpb24gVGV0cmFoZWRyb25C
dWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7CisKKwkJdmFyIHZlcnRpY2VzID0gWwor
CQkJMSwgIDEsICAxLCAgIC0gMSwgLSAxLCAgMSwgICAtIDEsICAxLCAtIDEsICAgIDEsIC0gMSwg
LSAxCisJCV07CisKKwkJdmFyIGluZGljZXMgPSBbCisJCQkyLCAgMSwgIDAsICAgIDAsICAzLCAg
MiwgICAgMSwgIDMsICAwLCAgICAyLCAgMywgIDEKKwkJXTsKKworCQlQb2x5aGVkcm9uQnVmZmVy
R2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7
CisKKwkJdGhpcy50eXBlID0gJ1RldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnknOworCisJCXRoaXMu
cGFyYW1ldGVycyA9IHsKKwkJCXJhZGl1czogcmFkaXVzLAorCQkJZGV0YWlsOiBkZXRhaWwKKwkJ
fTsKKworCX0KKworCVRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0
LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOworCVRldHJhaGVk
cm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV0cmFoZWRyb25CdWZm
ZXJHZW9tZXRyeTsKKworCS8qKgorCSAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczov
L2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXkKKwkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczov
L2dpdGh1Yi5jb20vTXVnZW44NworCSAqLworCisJLy8gT2N0YWhlZHJvbkdlb21ldHJ5CisKKwlm
dW5jdGlvbiBPY3RhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgeworCisJCUdlb21l
dHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnT2N0YWhlZHJvbkdlb21ldHJ5JzsK
KworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXM6IHJhZGl1cywKKwkJCWRldGFpbDog
ZGV0YWlsCisJCX07CisKKwkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBPY3RhaGVkcm9u
QnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTsKKwkJdGhpcy5tZXJnZVZlcnRpY2Vz
KCk7CisKKwl9CisKKwlPY3RhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0
ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisJT2N0YWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IE9jdGFoZWRyb25HZW9tZXRyeTsKKworCS8vIE9jdGFoZWRyb25CdWZmZXJH
ZW9tZXRyeQorCisJZnVuY3Rpb24gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRl
dGFpbCApIHsKKworCQl2YXIgdmVydGljZXMgPSBbCisJCQkxLCAwLCAwLCAgIC0gMSwgMCwgMCwg
ICAgMCwgMSwgMCwgICAgMCwgLSAxLCAwLCAgICAwLCAwLCAxLCAgICAwLCAwLCAtIDEKKwkJXTsK
KworCQl2YXIgaW5kaWNlcyA9IFsKKwkJCTAsIDIsIDQsICAgIDAsIDQsIDMsICAgIDAsIDMsIDUs
ICAgIDAsIDUsIDIsICAgIDEsIDIsIDUsICAgIDEsIDUsIDMsICAgIDEsIDMsIDQsICAgIDEsIDQs
IDIKKwkJXTsKKworCQlQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGlj
ZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7CisKKwkJdGhpcy50eXBlID0gJ09jdGFoZWRy
b25CdWZmZXJHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJcmFkaXVzOiBy
YWRpdXMsCisJCQlkZXRhaWw6IGRldGFpbAorCQl9OworCisJfQorCisJT2N0YWhlZHJvbkJ1ZmZl
ckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9t
ZXRyeS5wcm90b3R5cGUgKTsKKwlPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNv
bnN0cnVjdG9yID0gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OworCisJLyoqCisJICogQGF1dGhv
ciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleQorCSAq
IEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisJICovCisKKwkv
LyBJY29zYWhlZHJvbkdlb21ldHJ5CisKKwlmdW5jdGlvbiBJY29zYWhlZHJvbkdlb21ldHJ5KCBy
YWRpdXMsIGRldGFpbCApIHsKKworCSAJR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMu
dHlwZSA9ICdJY29zYWhlZHJvbkdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJ
CQlyYWRpdXM6IHJhZGl1cywKKwkJCWRldGFpbDogZGV0YWlsCisJCX07CisKKwkJdGhpcy5mcm9t
QnVmZmVyR2VvbWV0cnkoIG5ldyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRl
dGFpbCApICk7CisJCXRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisJfQorCisJSWNvc2FoZWRyb25H
ZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsK
KwlJY29zYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEljb3NhaGVkcm9u
R2VvbWV0cnk7CisKKwkvLyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5CisKKwlmdW5jdGlvbiBJ
Y29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKKworCQl2YXIgdCA9
ICggMSArIE1hdGguc3FydCggNSApICkgLyAyOworCisJCXZhciB2ZXJ0aWNlcyA9IFsKKwkJCS0g
MSwgIHQsICAwLCAgICAxLCAgdCwgIDAsICAgLSAxLCAtIHQsICAwLCAgICAxLCAtIHQsICAwLAor
CQkJIDAsIC0gMSwgIHQsICAgIDAsICAxLCAgdCwgICAgMCwgLSAxLCAtIHQsICAgIDAsICAxLCAt
IHQsCisJCQkgdCwgIDAsIC0gMSwgICAgdCwgIDAsICAxLCAgIC0gdCwgIDAsIC0gMSwgICAtIHQs
ICAwLCAgMQorCQldOworCisJCXZhciBpbmRpY2VzID0gWworCQkJIDAsIDExLCAgNSwgICAgMCwg
IDUsICAxLCAgICAwLCAgMSwgIDcsICAgIDAsICA3LCAxMCwgICAgMCwgMTAsIDExLAorCQkJIDEs
ICA1LCAgOSwgICAgNSwgMTEsICA0LCAgIDExLCAxMCwgIDIsICAgMTAsICA3LCAgNiwgICAgNywg
IDEsICA4LAorCQkJIDMsICA5LCAgNCwgICAgMywgIDQsICAyLCAgICAzLCAgMiwgIDYsICAgIDMs
ICA2LCAgOCwgICAgMywgIDgsICA5LAorCQkJIDQsICA5LCAgNSwgICAgMiwgIDQsIDExLCAgICA2
LCAgMiwgMTAsICAgIDgsICA2LCAgNywgICAgOSwgIDgsICAxCisJCV07CisKKwkJUG9seWhlZHJv
bkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRl
dGFpbCApOworCisJCXRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzsKKwor
CQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXM6IHJhZGl1cywKKwkJCWRldGFpbDogZGV0
YWlsCisJCX07CisKKwl9CisKKwlJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9
IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlJ
Y29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEljb3NhaGVk
cm9uQnVmZmVyR2VvbWV0cnk7CisKKwkvKioKKwkgKiBAYXV0aG9yIEFiZSBQYXpvcyAvIGh0dHBz
Oi8vaGFtb2lkLmNvbQorCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9N
dWdlbjg3CisJICovCisKKwkvLyBEb2RlY2FoZWRyb25HZW9tZXRyeQorCisJZnVuY3Rpb24gRG9k
ZWNhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgeworCisJCUdlb21ldHJ5LmNhbGwo
IHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknOworCisJCXRo
aXMucGFyYW1ldGVycyA9IHsKKwkJCXJhZGl1czogcmFkaXVzLAorCQkJZGV0YWlsOiBkZXRhaWwK
KwkJfTsKKworCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IERvZGVjYWhlZHJvbkJ1ZmZl
ckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7CisJCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwor
CisJfQorCisJRG9kZWNhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSgg
R2VvbWV0cnkucHJvdG90eXBlICk7CisJRG9kZWNhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNv
bnN0cnVjdG9yID0gRG9kZWNhaGVkcm9uR2VvbWV0cnk7CisKKwkvLyBEb2RlY2FoZWRyb25CdWZm
ZXJHZW9tZXRyeQorCisJZnVuY3Rpb24gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1
cywgZGV0YWlsICkgeworCisJCXZhciB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7CisJ
CXZhciByID0gMSAvIHQ7CisKKwkJdmFyIHZlcnRpY2VzID0gWworCisJCQkvLyAowrExLCDCsTEs
IMKxMSkKKwkJCS0gMSwgLSAxLCAtIDEsICAgIC0gMSwgLSAxLCAgMSwKKwkJCS0gMSwgIDEsIC0g
MSwgICAgLSAxLCAgMSwgIDEsCisJCQkgIDEsIC0gMSwgLSAxLCAgICAgMSwgLSAxLCAgMSwKKwkJ
CSAgMSwgIDEsIC0gMSwgICAgIDEsICAxLCAgMSwKKworCQkJLy8gKDAsIMKxMS/PhiwgwrHPhikK
KwkJCSAwLCAtIHIsIC0gdCwgICAgIDAsIC0gciwgIHQsCisJCQkgMCwgIHIsIC0gdCwgICAgIDAs
ICByLCAgdCwKKworCQkJLy8gKMKxMS/PhiwgwrHPhiwgMCkKKwkJCS0gciwgLSB0LCAgMCwgICAg
LSByLCAgdCwgIDAsCisJCQkgciwgLSB0LCAgMCwgICAgIHIsICB0LCAgMCwKKworCQkJLy8gKMKx
z4YsIDAsIMKxMS/PhikKKwkJCS0gdCwgIDAsIC0gciwgICAgIHQsICAwLCAtIHIsCisJCQktIHQs
ICAwLCAgciwgICAgIHQsICAwLCAgcgorCQldOworCisJCXZhciBpbmRpY2VzID0gWworCQkJIDMs
IDExLCAgNywgICAgICAzLCAgNywgMTUsICAgICAgMywgMTUsIDEzLAorCQkJIDcsIDE5LCAxNywg
ICAgICA3LCAxNywgIDYsICAgICAgNywgIDYsIDE1LAorCQkJMTcsICA0LCAgOCwgICAgIDE3LCAg
OCwgMTAsICAgICAxNywgMTAsICA2LAorCQkJIDgsICAwLCAxNiwgICAgICA4LCAxNiwgIDIsICAg
ICAgOCwgIDIsIDEwLAorCQkJIDAsIDEyLCAgMSwgICAgICAwLCAgMSwgMTgsICAgICAgMCwgMTgs
IDE2LAorCQkJIDYsIDEwLCAgMiwgICAgICA2LCAgMiwgMTMsICAgICAgNiwgMTMsIDE1LAorCQkJ
IDIsIDE2LCAxOCwgICAgICAyLCAxOCwgIDMsICAgICAgMiwgIDMsIDEzLAorCQkJMTgsICAxLCAg
OSwgICAgIDE4LCAgOSwgMTEsICAgICAxOCwgMTEsICAzLAorCQkJIDQsIDE0LCAxMiwgICAgICA0
LCAxMiwgIDAsICAgICAgNCwgIDAsICA4LAorCQkJMTEsICA5LCAgNSwgICAgIDExLCAgNSwgMTks
ICAgICAxMSwgMTksICA3LAorCQkJMTksICA1LCAxNCwgICAgIDE5LCAxNCwgIDQsICAgICAxOSwg
IDQsIDE3LAorCQkJIDEsIDEyLCAxNCwgICAgICAxLCAxNCwgIDUsICAgICAgMSwgIDUsICA5CisJ
CV07CisKKwkJUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBp
bmRpY2VzLCByYWRpdXMsIGRldGFpbCApOworCisJCXRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25C
dWZmZXJHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJcmFkaXVzOiByYWRp
dXMsCisJCQlkZXRhaWw6IGRldGFpbAorCQl9OworCisJfQorCisJRG9kZWNhaGVkcm9uQnVmZmVy
R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21l
dHJ5LnByb3RvdHlwZSApOworCURvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OworCisJLyoqCisJICogQGF1
dGhvciBvb3Ntb3hpZWNvZGUgLyBodHRwczovL2dpdGh1Yi5jb20vb29zbW94aWVjb2RlCisJICog
QGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorCSAq
IEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1CisJICogQGF1dGhvciBtaW5p
bmdvbGQgLyBodHRwczovL2dpdGh1Yi5jb20vbWluaW5nb2xkCisJICogQGF1dGhvciBqb25vYnIx
IC8gaHR0cHM6Ly9naXRodWIuY29tL2pvbm9icjEKKwkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRw
czovL2dpdGh1Yi5jb20vTXVnZW44NworCSAqCisJICovCisKKwkvLyBUdWJlR2VvbWV0cnkKKwor
CWZ1bmN0aW9uIFR1YmVHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJh
ZGlhbFNlZ21lbnRzLCBjbG9zZWQsIHRhcGVyICkgeworCisJCUdlb21ldHJ5LmNhbGwoIHRoaXMg
KTsKKworCQl0aGlzLnR5cGUgPSAnVHViZUdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMg
PSB7CisJCQlwYXRoOiBwYXRoLAorCQkJdHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMs
CisJCQlyYWRpdXM6IHJhZGl1cywKKwkJCXJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywK
KwkJCWNsb3NlZDogY2xvc2VkCisJCX07CisKKwkJaWYgKCB0YXBlciAhPT0gdW5kZWZpbmVkICkg
Y29uc29sZS53YXJuKCAnVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVk
LicgKTsKKworCQl2YXIgYnVmZmVyR2VvbWV0cnkgPSBuZXcgVHViZUJ1ZmZlckdlb21ldHJ5KCBw
YXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCApOwor
CisJCS8vIGV4cG9zZSBpbnRlcm5hbHMKKworCQl0aGlzLnRhbmdlbnRzID0gYnVmZmVyR2VvbWV0
cnkudGFuZ2VudHM7CisJCXRoaXMubm9ybWFscyA9IGJ1ZmZlckdlb21ldHJ5Lm5vcm1hbHM7CisJ
CXRoaXMuYmlub3JtYWxzID0gYnVmZmVyR2VvbWV0cnkuYmlub3JtYWxzOworCisJCS8vIGNyZWF0
ZSBnZW9tZXRyeQorCisJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBidWZmZXJHZW9tZXRyeSAp
OworCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKKworCX0KKworCVR1YmVHZW9tZXRyeS5wcm90b3R5
cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlUdWJlR2VvbWV0cnku
cHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHViZUdlb21ldHJ5OworCisJLy8gVHViZUJ1ZmZlckdl
b21ldHJ5CisKKwlmdW5jdGlvbiBUdWJlQnVmZmVyR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdt
ZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkICkgeworCisJCUJ1ZmZlckdlb21l
dHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnVHViZUJ1ZmZlckdlb21ldHJ5JzsK
KworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlwYXRoOiBwYXRoLAorCQkJdHVidWxhclNlZ21l
bnRzOiB0dWJ1bGFyU2VnbWVudHMsCisJCQlyYWRpdXM6IHJhZGl1cywKKwkJCXJhZGlhbFNlZ21l
bnRzOiByYWRpYWxTZWdtZW50cywKKwkJCWNsb3NlZDogY2xvc2VkCisJCX07CisKKwkJdHVidWxh
clNlZ21lbnRzID0gdHVidWxhclNlZ21lbnRzIHx8IDY0OworCQlyYWRpdXMgPSByYWRpdXMgfHwg
MTsKKwkJcmFkaWFsU2VnbWVudHMgPSByYWRpYWxTZWdtZW50cyB8fCA4OworCQljbG9zZWQgPSBj
bG9zZWQgfHwgZmFsc2U7CisKKwkJdmFyIGZyYW1lcyA9IHBhdGguY29tcHV0ZUZyZW5ldEZyYW1l
cyggdHVidWxhclNlZ21lbnRzLCBjbG9zZWQgKTsKKworCQkvLyBleHBvc2UgaW50ZXJuYWxzCisK
KwkJdGhpcy50YW5nZW50cyA9IGZyYW1lcy50YW5nZW50czsKKwkJdGhpcy5ub3JtYWxzID0gZnJh
bWVzLm5vcm1hbHM7CisJCXRoaXMuYmlub3JtYWxzID0gZnJhbWVzLmJpbm9ybWFsczsKKworCQkv
LyBoZWxwZXIgdmFyaWFibGVzCisKKwkJdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CisJCXZh
ciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOworCQl2YXIgdXYgPSBuZXcgVmVjdG9yMigpOworCisJ
CXZhciBpLCBqOworCisJCS8vIGJ1ZmZlcgorCisJCXZhciB2ZXJ0aWNlcyA9IFtdOworCQl2YXIg
bm9ybWFscyA9IFtdOworCQl2YXIgdXZzID0gW107CisJCXZhciBpbmRpY2VzID0gW107CisKKwkJ
Ly8gY3JlYXRlIGJ1ZmZlciBkYXRhCisKKwkJZ2VuZXJhdGVCdWZmZXJEYXRhKCk7CisKKwkJLy8g
YnVpbGQgZ2VvbWV0cnkKKworCQl0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7CisJCXRoaXMuYWRk
QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGlj
ZXMsIDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVm
ZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dics
IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApOworCisJCS8vIGZ1bmN0aW9u
cworCisJCWZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVyRGF0YSgpIHsKKworCQkJZm9yICggaSA9IDA7
IGkgPCB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7CisKKwkJCQlnZW5lcmF0ZVNlZ21lbnQoIGkg
KTsKKworCQkJfQorCisJCQkvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgbm90IGNsb3NlZCwgZ2VuZXJh
dGUgdGhlIGxhc3Qgcm93IG9mIHZlcnRpY2VzIGFuZCBub3JtYWxzCisJCQkvLyBhdCB0aGUgcmVn
dWxhciBwb3NpdGlvbiBvbiB0aGUgZ2l2ZW4gcGF0aAorCQkJLy8KKwkJCS8vIGlmIHRoZSBnZW9t
ZXRyeSBpcyBjbG9zZWQsIGR1cGxpY2F0ZSB0aGUgZmlyc3Qgcm93IG9mIHZlcnRpY2VzIGFuZCBu
b3JtYWxzICh1dnMgd2lsbCBkaWZmZXIpCisKKwkJCWdlbmVyYXRlU2VnbWVudCggKCBjbG9zZWQg
PT09IGZhbHNlICkgPyB0dWJ1bGFyU2VnbWVudHMgOiAwICk7CisKKwkJCS8vIHV2cyBhcmUgZ2Vu
ZXJhdGVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24uCisJCQkvLyB0aGlzIG1ha2VzIGl0IGVhc3kg
Y29tcHV0ZSBjb3JyZWN0IHZhbHVlcyBmb3IgY2xvc2VkIGdlb21ldHJpZXMKKworCQkJZ2VuZXJh
dGVVVnMoKTsKKworCQkJLy8gZmluYWxseSBjcmVhdGUgZmFjZXMKKworCQkJZ2VuZXJhdGVJbmRp
Y2VzKCk7CisKKwkJfQorCisJCWZ1bmN0aW9uIGdlbmVyYXRlU2VnbWVudCggaSApIHsKKworCQkJ
Ly8gd2UgdXNlIGdldFBvaW50QXQgdG8gc2FtcGxlIGV2ZW5seSBkaXN0cmlidXRlZCBwb2ludHMg
ZnJvbSB0aGUgZ2l2ZW4gcGF0aAorCisJCQl2YXIgUCA9IHBhdGguZ2V0UG9pbnRBdCggaSAvIHR1
YnVsYXJTZWdtZW50cyApOworCisJCQkvLyByZXRyaWV2ZSBjb3JyZXNwb25kaW5nIG5vcm1hbCBh
bmQgYmlub3JtYWwKKworCQkJdmFyIE4gPSBmcmFtZXMubm9ybWFsc1sgaSBdOworCQkJdmFyIEIg
PSBmcmFtZXMuYmlub3JtYWxzWyBpIF07CisKKwkJCS8vIGdlbmVyYXRlIG5vcm1hbHMgYW5kIHZl
cnRpY2VzIGZvciB0aGUgY3VycmVudCBzZWdtZW50CisKKwkJCWZvciAoIGogPSAwOyBqIDw9IHJh
ZGlhbFNlZ21lbnRzOyBqICsrICkgeworCisJCQkJdmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMg
KiBNYXRoLlBJICogMjsKKworCQkJCXZhciBzaW4gPSAgIE1hdGguc2luKCB2ICk7CisJCQkJdmFy
IGNvcyA9IC0gTWF0aC5jb3MoIHYgKTsKKworCQkJCS8vIG5vcm1hbAorCisJCQkJbm9ybWFsLngg
PSAoIGNvcyAqIE4ueCArIHNpbiAqIEIueCApOworCQkJCW5vcm1hbC55ID0gKCBjb3MgKiBOLnkg
KyBzaW4gKiBCLnkgKTsKKwkJCQlub3JtYWwueiA9ICggY29zICogTi56ICsgc2luICogQi56ICk7
CisJCQkJbm9ybWFsLm5vcm1hbGl6ZSgpOworCisJCQkJbm9ybWFscy5wdXNoKCBub3JtYWwueCwg
bm9ybWFsLnksIG5vcm1hbC56ICk7CisKKwkJCQkvLyB2ZXJ0ZXgKKworCQkJCXZlcnRleC54ID0g
UC54ICsgcmFkaXVzICogbm9ybWFsLng7CisJCQkJdmVydGV4LnkgPSBQLnkgKyByYWRpdXMgKiBu
b3JtYWwueTsKKwkJCQl2ZXJ0ZXgueiA9IFAueiArIHJhZGl1cyAqIG5vcm1hbC56OworCisJCQkJ
dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJCQl9CisK
KwkJfQorCisJCWZ1bmN0aW9uIGdlbmVyYXRlSW5kaWNlcygpIHsKKworCQkJZm9yICggaiA9IDE7
IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkgeworCisJCQkJZm9yICggaSA9IDE7IGkgPD0g
cmFkaWFsU2VnbWVudHM7IGkgKysgKSB7CisKKwkJCQkJdmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRz
ICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApOworCQkJCQl2YXIgYiA9ICggcmFkaWFsU2Vn
bWVudHMgKyAxICkgKiBqICsgKCBpIC0gMSApOworCQkJCQl2YXIgYyA9ICggcmFkaWFsU2VnbWVu
dHMgKyAxICkgKiBqICsgaTsKKwkJCQkJdmFyIGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICog
KCBqIC0gMSApICsgaTsKKworCQkJCQkvLyBmYWNlcworCisJCQkJCWluZGljZXMucHVzaCggYSwg
YiwgZCApOworCQkJCQlpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTsKKworCQkJCX0KKworCQkJfQor
CisJCX0KKworCQlmdW5jdGlvbiBnZW5lcmF0ZVVWcygpIHsKKworCQkJZm9yICggaSA9IDA7IGkg
PD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkgeworCisJCQkJZm9yICggaiA9IDA7IGogPD0gcmFk
aWFsU2VnbWVudHM7IGogKysgKSB7CisKKwkJCQkJdXYueCA9IGkgLyB0dWJ1bGFyU2VnbWVudHM7
CisJCQkJCXV2LnkgPSBqIC8gcmFkaWFsU2VnbWVudHM7CisKKwkJCQkJdXZzLnB1c2goIHV2Lngs
IHV2LnkgKTsKKworCQkJCX0KKworCQkJfQorCisJCX0KKworCX0KKworCVR1YmVCdWZmZXJHZW9t
ZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUg
KTsKKwlUdWJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHViZUJ1ZmZl
ckdlb21ldHJ5OworCisJLyoqCisJICogQGF1dGhvciBvb3Ntb3hpZWNvZGUKKwkgKiBAYXV0aG9y
IE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NworCSAqCisJICogYmFzZWQgb24g
aHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BxdG9ydXMvCisJICovCisKKwkvLyBUb3J1
c0tub3RHZW9tZXRyeQorCisJZnVuY3Rpb24gVG9ydXNLbm90R2VvbWV0cnkoIHJhZGl1cywgdHVi
ZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSwgaGVpZ2h0U2NhbGUgKSB7
CisKKwkJR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdUb3J1c0tub3RH
ZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJcmFkaXVzOiByYWRpdXMsCisJ
CQl0dWJlOiB0dWJlLAorCQkJdHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsCisJCQly
YWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsCisJCQlwOiBwLAorCQkJcTogcQorCQl9Owor
CisJCWlmICggaGVpZ2h0U2NhbGUgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVF
LlRvcnVzS25vdEdlb21ldHJ5OiBoZWlnaHRTY2FsZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2Ug
LnNjYWxlKCB4LCB5LCB6ICkgaW5zdGVhZC4nICk7CisKKwkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0
cnkoIG5ldyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2Vn
bWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkgKTsKKwkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7
CisKKwl9CisKKwlUb3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBH
ZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlUb3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUuY29uc3Ry
dWN0b3IgPSBUb3J1c0tub3RHZW9tZXRyeTsKKworCS8vIFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5
CisKKwlmdW5jdGlvbiBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1
bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkgeworCisJCUJ1ZmZlckdlb21ldHJ5
LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkn
OworCisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXJhZGl1czogcmFkaXVzLAorCQkJdHViZTog
dHViZSwKKwkJCXR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLAorCQkJcmFkaWFsU2Vn
bWVudHM6IHJhZGlhbFNlZ21lbnRzLAorCQkJcDogcCwKKwkJCXE6IHEKKwkJfTsKKworCQlyYWRp
dXMgPSByYWRpdXMgfHwgMTAwOworCQl0dWJlID0gdHViZSB8fCA0MDsKKwkJdHVidWxhclNlZ21l
bnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICkgfHwgNjQ7CisJCXJhZGlhbFNlZ21l
bnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4OworCQlwID0gcCB8fCAyOwor
CQlxID0gcSB8fCAzOworCisJCS8vIGJ1ZmZlcnMKKworCQl2YXIgaW5kaWNlcyA9IFtdOworCQl2
YXIgdmVydGljZXMgPSBbXTsKKwkJdmFyIG5vcm1hbHMgPSBbXTsKKwkJdmFyIHV2cyA9IFtdOwor
CisJCS8vIGhlbHBlciB2YXJpYWJsZXMKKworCQl2YXIgaSwgajsKKworCQl2YXIgdmVydGV4ID0g
bmV3IFZlY3RvcjMoKTsKKwkJdmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CisKKwkJdmFyIFAx
ID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIFAyID0gbmV3IFZlY3RvcjMoKTsKKworCQl2YXIgQiA9
IG5ldyBWZWN0b3IzKCk7CisJCXZhciBUID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIE4gPSBuZXcg
VmVjdG9yMygpOworCisJCS8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKKwor
CQlmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7ICsrIGkgKSB7CisKKwkJCS8vIHRo
ZSByYWRpYW4gInUiIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdG9y
dXMgY3VydmUgb2YgdGhlIGN1cnJlbnQgdHVidWxhciBzZWdlbWVudAorCisJCQl2YXIgdSA9IGkg
LyB0dWJ1bGFyU2VnbWVudHMgKiBwICogTWF0aC5QSSAqIDI7CisKKwkJCS8vIG5vdyB3ZSBjYWxj
dWxhdGUgdHdvIHBvaW50cy4gUDEgaXMgb3VyIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZl
LCBQMiBpcyBhIGxpdHRsZSBmYXJ0aGVyIGFoZWFkLgorCQkJLy8gdGhlc2UgcG9pbnRzIGFyZSB1
c2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgImNvb3JkaW5hdGUgc3BhY2UiLCB3aGljaCBpcyBuZWNl
c3NhcnkgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZlcnRleCBwb3NpdGlvbnMKKworCQkJY2Fs
Y3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIFAxICk7CisJCQljYWxjdWxh
dGVQb3NpdGlvbk9uQ3VydmUoIHUgKyAwLjAxLCBwLCBxLCByYWRpdXMsIFAyICk7CisKKwkJCS8v
IGNhbGN1bGF0ZSBvcnRob25vcm1hbCBiYXNpcworCisJCQlULnN1YlZlY3RvcnMoIFAyLCBQMSAp
OworCQkJTi5hZGRWZWN0b3JzKCBQMiwgUDEgKTsKKwkJCUIuY3Jvc3NWZWN0b3JzKCBULCBOICk7
CisJCQlOLmNyb3NzVmVjdG9ycyggQiwgVCApOworCisJCQkvLyBub3JtYWxpemUgQiwgTi4gVCBj
YW4gYmUgaWdub3JlZCwgd2UgZG9uJ3QgdXNlIGl0CisKKwkJCUIubm9ybWFsaXplKCk7CisJCQlO
Lm5vcm1hbGl6ZSgpOworCisJCQlmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgKysg
aiApIHsKKworCQkJCS8vIG5vdyBjYWxjdWxhdGUgdGhlIHZlcnRpY2VzLiB0aGV5IGFyZSBub3Ro
aW5nIG1vcmUgdGhhbiBhbiBleHRydXNpb24gb2YgdGhlIHRvcnVzIGN1cnZlLgorCQkJCS8vIGJl
Y2F1c2Ugd2UgZXh0cnVkZSBhIHNoYXBlIGluIHRoZSB4eS1wbGFuZSwgdGhlcmUgaXMgbm8gbmVl
ZCB0byBjYWxjdWxhdGUgYSB6LXZhbHVlLgorCisJCQkJdmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVu
dHMgKiBNYXRoLlBJICogMjsKKwkJCQl2YXIgY3ggPSAtIHR1YmUgKiBNYXRoLmNvcyggdiApOwor
CQkJCXZhciBjeSA9IHR1YmUgKiBNYXRoLnNpbiggdiApOworCisJCQkJLy8gbm93IGNhbGN1bGF0
ZSB0aGUgZmluYWwgdmVydGV4IHBvc2l0aW9uLgorCQkJCS8vIGZpcnN0IHdlIG9yaWVudCB0aGUg
ZXh0cnVzaW9uIHdpdGggb3VyIGJhc2lzIHZlY3RvcywgdGhlbiB3ZSBhZGQgaXQgdG8gdGhlIGN1
cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlCisKKwkJCQl2ZXJ0ZXgueCA9IFAxLnggKyAoIGN4
ICogTi54ICsgY3kgKiBCLnggKTsKKwkJCQl2ZXJ0ZXgueSA9IFAxLnkgKyAoIGN4ICogTi55ICsg
Y3kgKiBCLnkgKTsKKwkJCQl2ZXJ0ZXgueiA9IFAxLnogKyAoIGN4ICogTi56ICsgY3kgKiBCLnog
KTsKKworCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsK
KworCQkJCS8vIG5vcm1hbCAoUDEgaXMgYWx3YXlzIHRoZSBjZW50ZXIvb3JpZ2luIG9mIHRoZSBl
eHRydXNpb24sIHRodXMgd2UgY2FuIHVzZSBpdCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbCkKKwor
CQkJCW5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIFAxICkubm9ybWFsaXplKCk7CisKKwkJCQlu
b3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTsKKworCQkJCS8vIHV2
CisKKwkJCQl1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApOworCQkJCXV2cy5wdXNoKCBq
IC8gcmFkaWFsU2VnbWVudHMgKTsKKworCQkJfQorCisJCX0KKworCQkvLyBnZW5lcmF0ZSBpbmRp
Y2VzCisKKwkJZm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkgeworCisJ
CQlmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHsKKworCQkJCS8vIGlu
ZGljZXMKKworCQkJCXZhciBhID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSAr
ICggaSAtIDEgKTsKKwkJCQl2YXIgYiA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgKCBp
IC0gMSApOworCQkJCXZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpOworCQkJ
CXZhciBkID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7CisKKwkJCQkv
LyBmYWNlcworCisJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CisJCQkJaW5kaWNlcy5wdXNo
KCBiLCBjLCBkICk7CisKKwkJCX0KKworCQl9CisKKwkJLy8gYnVpbGQgZ2VvbWV0cnkKKworCQl0
aGlzLnNldEluZGV4KCBpbmRpY2VzICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24n
LCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworCQl0aGlzLmFk
ZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxz
LCAzICkgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0
cmlidXRlKCB1dnMsIDIgKSApOworCisJCS8vIHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUg
Y3VycmVudCBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmUKKworCQlmdW5jdGlvbiBjYWxjdWxh
dGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgcG9zaXRpb24gKSB7CisKKwkJCXZh
ciBjdSA9IE1hdGguY29zKCB1ICk7CisJCQl2YXIgc3UgPSBNYXRoLnNpbiggdSApOworCQkJdmFy
IHF1T3ZlclAgPSBxIC8gcCAqIHU7CisJCQl2YXIgY3MgPSBNYXRoLmNvcyggcXVPdmVyUCApOwor
CisJCQlwb3NpdGlvbi54ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIDAuNSAqIGN1OworCQkJcG9z
aXRpb24ueSA9IHJhZGl1cyAqICggMiArIGNzICkgKiBzdSAqIDAuNTsKKwkJCXBvc2l0aW9uLnog
PSByYWRpdXMgKiBNYXRoLnNpbiggcXVPdmVyUCApICogMC41OworCisJCX0KKworCX0KKworCVRv
cnVzS25vdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdl
b21ldHJ5LnByb3RvdHlwZSApOworCVRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OworCisJLyoqCisJICogQGF1dGhv
ciBvb3Ntb3hpZWNvZGUKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwor
CSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisJICovCisK
KwkvLyBUb3J1c0dlb21ldHJ5CisKKwlmdW5jdGlvbiBUb3J1c0dlb21ldHJ5KCByYWRpdXMsIHR1
YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApIHsKKworCQlHZW9tZXRy
eS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1RvcnVzR2VvbWV0cnknOworCisJCXRo
aXMucGFyYW1ldGVycyA9IHsKKwkJCXJhZGl1czogcmFkaXVzLAorCQkJdHViZTogdHViZSwKKwkJ
CXJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKKwkJCXR1YnVsYXJTZWdtZW50czogdHVi
dWxhclNlZ21lbnRzLAorCQkJYXJjOiBhcmMKKwkJfTsKKworCQl0aGlzLmZyb21CdWZmZXJHZW9t
ZXRyeSggbmV3IFRvcnVzQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVu
dHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkgKTsKKwkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CisK
Kwl9CisKKwlUb3J1c0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5
LnByb3RvdHlwZSApOworCVRvcnVzR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9y
dXNHZW9tZXRyeTsKKworCS8vIFRvcnVzQnVmZmVyR2VvbWV0cnkKKworCWZ1bmN0aW9uIFRvcnVz
QnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdt
ZW50cywgYXJjICkgeworCisJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlz
LnR5cGUgPSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0gewor
CQkJcmFkaXVzOiByYWRpdXMsCisJCQl0dWJlOiB0dWJlLAorCQkJcmFkaWFsU2VnbWVudHM6IHJh
ZGlhbFNlZ21lbnRzLAorCQkJdHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsCisJCQlh
cmM6IGFyYworCQl9OworCisJCXJhZGl1cyA9IHJhZGl1cyB8fCAxMDA7CisJCXR1YmUgPSB0dWJl
IHx8IDQwOworCQlyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkg
fHwgODsKKwkJdHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICkg
fHwgNjsKKwkJYXJjID0gYXJjIHx8IE1hdGguUEkgKiAyOworCisJCS8vIGJ1ZmZlcnMKKworCQl2
YXIgaW5kaWNlcyA9IFtdOworCQl2YXIgdmVydGljZXMgPSBbXTsKKwkJdmFyIG5vcm1hbHMgPSBb
XTsKKwkJdmFyIHV2cyA9IFtdOworCisJCS8vIGhlbHBlciB2YXJpYWJsZXMKKworCQl2YXIgY2Vu
dGVyID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CisJCXZh
ciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOworCisJCXZhciBqLCBpOworCisJCS8vIGdlbmVyYXRl
IHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKKworCQlmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxT
ZWdtZW50czsgaiArKyApIHsKKworCQkJZm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRz
OyBpICsrICkgeworCisJCQkJdmFyIHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogYXJjOworCQkJ
CXZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7CisKKwkJCQkvLyB2ZXJ0
ZXgKKworCQkJCXZlcnRleC54ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICog
TWF0aC5jb3MoIHUgKTsKKwkJCQl2ZXJ0ZXgueSA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29z
KCB2ICkgKSAqIE1hdGguc2luKCB1ICk7CisJCQkJdmVydGV4LnogPSB0dWJlICogTWF0aC5zaW4o
IHYgKTsKKworCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4Lnog
KTsKKworCQkJCS8vIG5vcm1hbAorCisJCQkJY2VudGVyLnggPSByYWRpdXMgKiBNYXRoLmNvcygg
dSApOworCQkJCWNlbnRlci55ID0gcmFkaXVzICogTWF0aC5zaW4oIHUgKTsKKwkJCQlub3JtYWwu
c3ViVmVjdG9ycyggdmVydGV4LCBjZW50ZXIgKS5ub3JtYWxpemUoKTsKKworCQkJCW5vcm1hbHMu
cHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApOworCisJCQkJLy8gdXYKKworCQkJ
CXV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7CisJCQkJdXZzLnB1c2goIGogLyByYWRp
YWxTZWdtZW50cyApOworCisJCQl9CisKKwkJfQorCisJCS8vIGdlbmVyYXRlIGluZGljZXMKKwor
CQlmb3IgKCBqID0gMTsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHsKKworCQkJZm9yICgg
aSA9IDE7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkgeworCisJCQkJLy8gaW5kaWNlcwor
CisJCQkJdmFyIGEgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpIC0gMTsKKwkJCQl2
YXIgYiA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaSAtIDE7CisJCQkJ
dmFyIGMgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7CisJCQkJdmFy
IGQgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpOworCisJCQkJLy8gZmFjZXMKKwor
CQkJCWluZGljZXMucHVzaCggYSwgYiwgZCApOworCQkJCWluZGljZXMucHVzaCggYiwgYywgZCAp
OworCisJCQl9CisKKwkJfQorCisJCS8vIGJ1aWxkIGdlb21ldHJ5CisKKwkJdGhpcy5zZXRJbmRl
eCggaW5kaWNlcyApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0
MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUo
ICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CisJ
CXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZz
LCAyICkgKTsKKworCX0KKworCVRvcnVzQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0
LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisJVG9ydXNCdWZmZXJHZW9tZXRy
eS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0J1ZmZlckdlb21ldHJ5OworCisJLyoqCisJ
ICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZworCSAq
LworCisJdmFyIFNoYXBlVXRpbHMgPSB7CisKKwkJLy8gY2FsY3VsYXRlIGFyZWEgb2YgdGhlIGNv
bnRvdXIgcG9seWdvbgorCisJCWFyZWE6IGZ1bmN0aW9uICggY29udG91ciApIHsKKworCQkJdmFy
IG4gPSBjb250b3VyLmxlbmd0aDsKKwkJCXZhciBhID0gMC4wOworCisJCQlmb3IgKCB2YXIgcCA9
IG4gLSAxLCBxID0gMDsgcSA8IG47IHAgPSBxICsrICkgeworCisJCQkJYSArPSBjb250b3VyWyBw
IF0ueCAqIGNvbnRvdXJbIHEgXS55IC0gY29udG91clsgcSBdLnggKiBjb250b3VyWyBwIF0ueTsK
KworCQkJfQorCisJCQlyZXR1cm4gYSAqIDAuNTsKKworCQl9LAorCisJCXRyaWFuZ3VsYXRlOiAo
IGZ1bmN0aW9uICgpIHsKKworCQkJLyoqCisJCQkgKiBUaGlzIGNvZGUgaXMgYSBxdWljayBwb3J0
IG9mIGNvZGUgd3JpdHRlbiBpbiBDKysgd2hpY2ggd2FzIHN1Ym1pdHRlZCB0bworCQkJICogZmxp
cGNvZGUuY29tIGJ5IEpvaG4gVy4gUmF0Y2xpZmYgIC8vIEp1bHkgMjIsIDIwMDAKKwkJCSAqIFNl
ZSBvcmlnaW5hbCBjb2RlIGFuZCBtb3JlIGluZm9ybWF0aW9uIGhlcmU6CisJCQkgKiBodHRwOi8v
d3d3LmZsaXBjb2RlLmNvbS9hcmNoaXZlcy9FZmZpY2llbnRfUG9seWdvbl9Ucmlhbmd1bGF0aW9u
LnNodG1sCisJCQkgKgorCQkJICogcG9ydGVkIHRvIGFjdGlvbnNjcmlwdCBieSBaZXZhbiBSb3Nz
ZXIKKwkJCSAqIHd3dy5hY3Rpb25zbmlwcGV0LmNvbQorCQkJICoKKwkJCSAqIHBvcnRlZCB0byBq
YXZhc2NyaXB0IGJ5IEpvc2h1YSBLb28KKwkJCSAqIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96
ejg1L2Jsb2cKKwkJCSAqCisJCQkgKi8KKworCQkJZnVuY3Rpb24gc25pcCggY29udG91ciwgdSwg
diwgdywgbiwgdmVydHMgKSB7CisKKwkJCQl2YXIgcDsKKwkJCQl2YXIgYXgsIGF5LCBieCwgYnk7
CisJCQkJdmFyIGN4LCBjeSwgcHgsIHB5OworCisJCQkJYXggPSBjb250b3VyWyB2ZXJ0c1sgdSBd
IF0ueDsKKwkJCQlheSA9IGNvbnRvdXJbIHZlcnRzWyB1IF0gXS55OworCisJCQkJYnggPSBjb250
b3VyWyB2ZXJ0c1sgdiBdIF0ueDsKKwkJCQlieSA9IGNvbnRvdXJbIHZlcnRzWyB2IF0gXS55Owor
CisJCQkJY3ggPSBjb250b3VyWyB2ZXJ0c1sgdyBdIF0ueDsKKwkJCQljeSA9IGNvbnRvdXJbIHZl
cnRzWyB3IF0gXS55OworCisJCQkJaWYgKCAoIGJ4IC0gYXggKSAqICggY3kgLSBheSApIC0gKCBi
eSAtIGF5ICkgKiAoIGN4IC0gYXggKSA8PSAwICkgcmV0dXJuIGZhbHNlOworCisJCQkJdmFyIGFY
LCBhWSwgYlgsIGJZLCBjWCwgY1k7CisJCQkJdmFyIGFweCwgYXB5LCBicHgsIGJweSwgY3B4LCBj
cHk7CisJCQkJdmFyIGNDUk9TU2FwLCBiQ1JPU1NjcCwgYUNST1NTYnA7CisKKwkJCQlhWCA9IGN4
IC0gYng7ICBhWSA9IGN5IC0gYnk7CisJCQkJYlggPSBheCAtIGN4OyAgYlkgPSBheSAtIGN5Owor
CQkJCWNYID0gYnggLSBheDsgIGNZID0gYnkgLSBheTsKKworCQkJCWZvciAoIHAgPSAwOyBwIDwg
bjsgcCArKyApIHsKKworCQkJCQlweCA9IGNvbnRvdXJbIHZlcnRzWyBwIF0gXS54OworCQkJCQlw
eSA9IGNvbnRvdXJbIHZlcnRzWyBwIF0gXS55OworCisJCQkJCWlmICggKCAoIHB4ID09PSBheCAp
ICYmICggcHkgPT09IGF5ICkgKSB8fAorCQkJCQkJICggKCBweCA9PT0gYnggKSAmJiAoIHB5ID09
PSBieSApICkgfHwKKwkJCQkJCSAoICggcHggPT09IGN4ICkgJiYgKCBweSA9PT0gY3kgKSApICkJ
Y29udGludWU7CisKKwkJCQkJYXB4ID0gcHggLSBheDsgIGFweSA9IHB5IC0gYXk7CisJCQkJCWJw
eCA9IHB4IC0gYng7ICBicHkgPSBweSAtIGJ5OworCQkJCQljcHggPSBweCAtIGN4OyAgY3B5ID0g
cHkgLSBjeTsKKworCQkJCQkvLyBzZWUgaWYgcCBpcyBpbnNpZGUgdHJpYW5nbGUgYWJjCisKKwkJ
CQkJYUNST1NTYnAgPSBhWCAqIGJweSAtIGFZICogYnB4OworCQkJCQljQ1JPU1NhcCA9IGNYICog
YXB5IC0gY1kgKiBhcHg7CisJCQkJCWJDUk9TU2NwID0gYlggKiBjcHkgLSBiWSAqIGNweDsKKwor
CQkJCQlpZiAoICggYUNST1NTYnAgPj0gLSBOdW1iZXIuRVBTSUxPTiApICYmICggYkNST1NTY3Ag
Pj0gLSBOdW1iZXIuRVBTSUxPTiApICYmICggY0NST1NTYXAgPj0gLSBOdW1iZXIuRVBTSUxPTiAp
ICkgcmV0dXJuIGZhbHNlOworCisJCQkJfQorCisJCQkJcmV0dXJuIHRydWU7CisKKwkJCX0KKwor
CQkJLy8gdGFrZXMgaW4gYW4gY29udG91ciBhcnJheSBhbmQgcmV0dXJucworCisJCQlyZXR1cm4g
ZnVuY3Rpb24gdHJpYW5ndWxhdGUoIGNvbnRvdXIsIGluZGljZXMgKSB7CisKKwkJCQl2YXIgbiA9
IGNvbnRvdXIubGVuZ3RoOworCisJCQkJaWYgKCBuIDwgMyApIHJldHVybiBudWxsOworCisJCQkJ
dmFyIHJlc3VsdCA9IFtdLAorCQkJCQl2ZXJ0cyA9IFtdLAorCQkJCQl2ZXJ0SW5kaWNlcyA9IFtd
OworCisJCQkJLyogd2Ugd2FudCBhIGNvdW50ZXItY2xvY2t3aXNlIHBvbHlnb24gaW4gdmVydHMg
Ki8KKworCQkJCXZhciB1LCB2LCB3OworCisJCQkJaWYgKCBTaGFwZVV0aWxzLmFyZWEoIGNvbnRv
dXIgKSA+IDAuMCApIHsKKworCQkJCQlmb3IgKCB2ID0gMDsgdiA8IG47IHYgKysgKSB2ZXJ0c1sg
diBdID0gdjsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJZm9yICggdiA9IDA7IHYgPCBuOyB2ICsr
ICkgdmVydHNbIHYgXSA9ICggbiAtIDEgKSAtIHY7CisKKwkJCQl9CisKKwkJCQl2YXIgbnYgPSBu
OworCisJCQkJLyogIHJlbW92ZSBudiAtIDIgdmVydGljZXMsIGNyZWF0aW5nIDEgdHJpYW5nbGUg
ZXZlcnkgdGltZSAqLworCisJCQkJdmFyIGNvdW50ID0gMiAqIG52OyAgIC8qIGVycm9yIGRldGVj
dGlvbiAqLworCisJCQkJZm9yICggdiA9IG52IC0gMTsgbnYgPiAyOyApIHsKKworCQkJCQkvKiBp
ZiB3ZSBsb29wLCBpdCBpcyBwcm9iYWJseSBhIG5vbi1zaW1wbGUgcG9seWdvbiAqLworCisJCQkJ
CWlmICggKCBjb3VudCAtLSApIDw9IDAgKSB7CisKKwkJCQkJCS8vKiogVHJpYW5ndWxhdGU6IEVS
Uk9SIC0gcHJvYmFibGUgYmFkIHBvbHlnb24hCisKKwkJCQkJCS8vdGhyb3cgKCAiV2FybmluZywg
dW5hYmxlIHRvIHRyaWFuZ3VsYXRlIHBvbHlnb24hIiApOworCQkJCQkJLy9yZXR1cm4gbnVsbDsK
KwkJCQkJCS8vIFNvbWV0aW1lcyB3YXJuaW5nIGlzIGZpbmUsIGVzcGVjaWFsbHkgcG9seWdvbnMg
YXJlIHRyaWFuZ3VsYXRlZCBpbiByZXZlcnNlLgorCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUu
U2hhcGVVdGlsczogVW5hYmxlIHRvIHRyaWFuZ3VsYXRlIHBvbHlnb24hIGluIHRyaWFuZ3VsYXRl
KCknICk7CisKKwkJCQkJCWlmICggaW5kaWNlcyApIHJldHVybiB2ZXJ0SW5kaWNlczsKKwkJCQkJ
CXJldHVybiByZXN1bHQ7CisKKwkJCQkJfQorCisJCQkJCS8qIHRocmVlIGNvbnNlY3V0aXZlIHZl
cnRpY2VzIGluIGN1cnJlbnQgcG9seWdvbiwgPHUsdix3PiAqLworCisJCQkJCXUgPSB2OyAJIAlp
ZiAoIG52IDw9IHUgKSB1ID0gMDsgICAgIC8qIHByZXZpb3VzICovCisJCQkJCXYgPSB1ICsgMTsg
IGlmICggbnYgPD0gdiApIHYgPSAwOyAgICAgLyogbmV3IHYgICAgKi8KKwkJCQkJdyA9IHYgKyAx
OyAgaWYgKCBudiA8PSB3ICkgdyA9IDA7ICAgICAvKiBuZXh0ICAgICAqLworCisJCQkJCWlmICgg
c25pcCggY29udG91ciwgdSwgdiwgdywgbnYsIHZlcnRzICkgKSB7CisKKwkJCQkJCXZhciBhLCBi
LCBjLCBzLCB0OworCisJCQkJCQkvKiB0cnVlIG5hbWVzIG9mIHRoZSB2ZXJ0aWNlcyAqLworCisJ
CQkJCQlhID0gdmVydHNbIHUgXTsKKwkJCQkJCWIgPSB2ZXJ0c1sgdiBdOworCQkJCQkJYyA9IHZl
cnRzWyB3IF07CisKKwkJCQkJCS8qIG91dHB1dCBUcmlhbmdsZSAqLworCisJCQkJCQlyZXN1bHQu
cHVzaCggWyBjb250b3VyWyBhIF0sCisJCQkJCQkJY29udG91clsgYiBdLAorCQkJCQkJCWNvbnRv
dXJbIGMgXSBdICk7CisKKworCQkJCQkJdmVydEluZGljZXMucHVzaCggWyB2ZXJ0c1sgdSBdLCB2
ZXJ0c1sgdiBdLCB2ZXJ0c1sgdyBdIF0gKTsKKworCQkJCQkJLyogcmVtb3ZlIHYgZnJvbSB0aGUg
cmVtYWluaW5nIHBvbHlnb24gKi8KKworCQkJCQkJZm9yICggcyA9IHYsIHQgPSB2ICsgMTsgdCA8
IG52OyBzICsrLCB0ICsrICkgeworCisJCQkJCQkJdmVydHNbIHMgXSA9IHZlcnRzWyB0IF07CisK
KwkJCQkJCX0KKworCQkJCQkJbnYgLS07CisKKwkJCQkJCS8qIHJlc2V0IGVycm9yIGRldGVjdGlv
biBjb3VudGVyICovCisKKwkJCQkJCWNvdW50ID0gMiAqIG52OworCisJCQkJCX0KKworCQkJCX0K
KworCQkJCWlmICggaW5kaWNlcyApIHJldHVybiB2ZXJ0SW5kaWNlczsKKwkJCQlyZXR1cm4gcmVz
dWx0OworCisJCQl9CisKKwkJfSApKCksCisKKwkJdHJpYW5ndWxhdGVTaGFwZTogZnVuY3Rpb24g
KCBjb250b3VyLCBob2xlcyApIHsKKworCQkJZnVuY3Rpb24gcmVtb3ZlRHVwRW5kUHRzKHBvaW50
cykgeworCisJCQkJdmFyIGwgPSBwb2ludHMubGVuZ3RoOworCisJCQkJaWYgKCBsID4gMiAmJiBw
b2ludHNbIGwgLSAxIF0uZXF1YWxzKCBwb2ludHNbIDAgXSApICkgeworCisJCQkJCXBvaW50cy5w
b3AoKTsKKworCQkJCX0KKworCQkJfQorCisJCQlyZW1vdmVEdXBFbmRQdHMoIGNvbnRvdXIgKTsK
KwkJCWhvbGVzLmZvckVhY2goIHJlbW92ZUR1cEVuZFB0cyApOworCisJCQlmdW5jdGlvbiBwb2lu
dF9pbl9zZWdtZW50XzJEX2NvbGluKCBpblNlZ1B0MSwgaW5TZWdQdDIsIGluT3RoZXJQdCApIHsK
KworCQkJCS8vIGluT3RoZXJQdCBuZWVkcyB0byBiZSBjb2xsaW5lYXIgdG8gdGhlIGluU2VnbWVu
dAorCQkJCWlmICggaW5TZWdQdDEueCAhPT0gaW5TZWdQdDIueCApIHsKKworCQkJCQlpZiAoIGlu
U2VnUHQxLnggPCBpblNlZ1B0Mi54ICkgeworCisJCQkJCQlyZXR1cm4JKCAoIGluU2VnUHQxLngg
PD0gaW5PdGhlclB0LnggKSAmJiAoIGluT3RoZXJQdC54IDw9IGluU2VnUHQyLnggKSApOworCisJ
CQkJCX0gZWxzZSB7CisKKwkJCQkJCXJldHVybgkoICggaW5TZWdQdDIueCA8PSBpbk90aGVyUHQu
eCApICYmICggaW5PdGhlclB0LnggPD0gaW5TZWdQdDEueCApICk7CisKKwkJCQkJfQorCisJCQkJ
fSBlbHNlIHsKKworCQkJCQlpZiAoIGluU2VnUHQxLnkgPCBpblNlZ1B0Mi55ICkgeworCisJCQkJ
CQlyZXR1cm4JKCAoIGluU2VnUHQxLnkgPD0gaW5PdGhlclB0LnkgKSAmJiAoIGluT3RoZXJQdC55
IDw9IGluU2VnUHQyLnkgKSApOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCXJldHVybgkoICgg
aW5TZWdQdDIueSA8PSBpbk90aGVyUHQueSApICYmICggaW5PdGhlclB0LnkgPD0gaW5TZWdQdDEu
eSApICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisKKwkJCWZ1bmN0aW9uIGludGVyc2Vj
dF9zZWdtZW50c18yRCggaW5TZWcxUHQxLCBpblNlZzFQdDIsIGluU2VnMlB0MSwgaW5TZWcyUHQy
LCBpbkV4Y2x1ZGVBZGphY2VudFNlZ3MgKSB7CisKKwkJCQl2YXIgc2VnMWR4ID0gaW5TZWcxUHQy
LnggLSBpblNlZzFQdDEueCwgICBzZWcxZHkgPSBpblNlZzFQdDIueSAtIGluU2VnMVB0MS55Owor
CQkJCXZhciBzZWcyZHggPSBpblNlZzJQdDIueCAtIGluU2VnMlB0MS54LCAgIHNlZzJkeSA9IGlu
U2VnMlB0Mi55IC0gaW5TZWcyUHQxLnk7CisKKwkJCQl2YXIgc2VnMXNlZzJkeCA9IGluU2VnMVB0
MS54IC0gaW5TZWcyUHQxLng7CisJCQkJdmFyIHNlZzFzZWcyZHkgPSBpblNlZzFQdDEueSAtIGlu
U2VnMlB0MS55OworCisJCQkJdmFyIGxpbWl0CQk9IHNlZzFkeSAqIHNlZzJkeCAtIHNlZzFkeCAq
IHNlZzJkeTsKKwkJCQl2YXIgcGVycFNlZzEJPSBzZWcxZHkgKiBzZWcxc2VnMmR4IC0gc2VnMWR4
ICogc2VnMXNlZzJkeTsKKworCQkJCWlmICggTWF0aC5hYnMoIGxpbWl0ICkgPiBOdW1iZXIuRVBT
SUxPTiApIHsKKworCQkJCQkvLyBub3QgcGFyYWxsZWwKKworCQkJCQl2YXIgcGVycFNlZzI7CisJ
CQkJCWlmICggbGltaXQgPiAwICkgeworCisJCQkJCQlpZiAoICggcGVycFNlZzEgPCAwICkgfHwg
KCBwZXJwU2VnMSA+IGxpbWl0ICkgKSAJCXJldHVybiBbXTsKKwkJCQkJCXBlcnBTZWcyID0gc2Vn
MmR5ICogc2VnMXNlZzJkeCAtIHNlZzJkeCAqIHNlZzFzZWcyZHk7CisJCQkJCQlpZiAoICggcGVy
cFNlZzIgPCAwICkgfHwgKCBwZXJwU2VnMiA+IGxpbWl0ICkgKSAJCXJldHVybiBbXTsKKworCQkJ
CQl9IGVsc2UgeworCisJCQkJCQlpZiAoICggcGVycFNlZzEgPiAwICkgfHwgKCBwZXJwU2VnMSA8
IGxpbWl0ICkgKSAJCXJldHVybiBbXTsKKwkJCQkJCXBlcnBTZWcyID0gc2VnMmR5ICogc2VnMXNl
ZzJkeCAtIHNlZzJkeCAqIHNlZzFzZWcyZHk7CisJCQkJCQlpZiAoICggcGVycFNlZzIgPiAwICkg
fHwgKCBwZXJwU2VnMiA8IGxpbWl0ICkgKSAJCXJldHVybiBbXTsKKworCQkJCQl9CisKKwkJCQkJ
Ly8gaS5lLiB0byByZWR1Y2Ugcm91bmRpbmcgZXJyb3JzCisJCQkJCS8vIGludGVyc2VjdGlvbiBh
dCBlbmRwb2ludCBvZiBzZWdtZW50IzE/CisJCQkJCWlmICggcGVycFNlZzIgPT09IDAgKSB7CisK
KwkJCQkJCWlmICggKCBpbkV4Y2x1ZGVBZGphY2VudFNlZ3MgKSAmJgorCQkJCQkJCSAoICggcGVy
cFNlZzEgPT09IDAgKSB8fCAoIHBlcnBTZWcxID09PSBsaW1pdCApICkgKQkJcmV0dXJuIFtdOwor
CQkJCQkJcmV0dXJuIFsgaW5TZWcxUHQxIF07CisKKwkJCQkJfQorCQkJCQlpZiAoIHBlcnBTZWcy
ID09PSBsaW1pdCApIHsKKworCQkJCQkJaWYgKCAoIGluRXhjbHVkZUFkamFjZW50U2VncyApICYm
CisJCQkJCQkJICggKCBwZXJwU2VnMSA9PT0gMCApIHx8ICggcGVycFNlZzEgPT09IGxpbWl0ICkg
KSApCQlyZXR1cm4gW107CisJCQkJCQlyZXR1cm4gWyBpblNlZzFQdDIgXTsKKworCQkJCQl9CisJ
CQkJCS8vIGludGVyc2VjdGlvbiBhdCBlbmRwb2ludCBvZiBzZWdtZW50IzI/CisJCQkJCWlmICgg
cGVycFNlZzEgPT09IDAgKQkJcmV0dXJuIFsgaW5TZWcyUHQxIF07CisJCQkJCWlmICggcGVycFNl
ZzEgPT09IGxpbWl0ICkJcmV0dXJuIFsgaW5TZWcyUHQyIF07CisKKwkJCQkJLy8gcmV0dXJuIHJl
YWwgaW50ZXJzZWN0aW9uIHBvaW50CisJCQkJCXZhciBmYWN0b3JTZWcxID0gcGVycFNlZzIgLyBs
aW1pdDsKKwkJCQkJcmV0dXJuCVsgeyB4OiBpblNlZzFQdDEueCArIGZhY3RvclNlZzEgKiBzZWcx
ZHgsCisJCQkJCQkJCXk6IGluU2VnMVB0MS55ICsgZmFjdG9yU2VnMSAqIHNlZzFkeSB9IF07CisK
KwkJCQl9IGVsc2UgeworCisJCQkJCS8vIHBhcmFsbGVsIG9yIGNvbGxpbmVhcgorCQkJCQlpZiAo
ICggcGVycFNlZzEgIT09IDAgKSB8fAorCQkJCQkJICggc2VnMmR5ICogc2VnMXNlZzJkeCAhPT0g
c2VnMmR4ICogc2VnMXNlZzJkeSApICkgCQkJcmV0dXJuIFtdOworCisJCQkJCS8vIHRoZXkgYXJl
IGNvbGxpbmVhciBvciBkZWdlbmVyYXRlCisJCQkJCXZhciBzZWcxUHQgPSAoICggc2VnMWR4ID09
PSAwICkgJiYgKCBzZWcxZHkgPT09IDAgKSApOwkvLyBzZWdtZW50MSBpcyBqdXN0IGEgcG9pbnQ/
CisJCQkJCXZhciBzZWcyUHQgPSAoICggc2VnMmR4ID09PSAwICkgJiYgKCBzZWcyZHkgPT09IDAg
KSApOwkvLyBzZWdtZW50MiBpcyBqdXN0IGEgcG9pbnQ/CisJCQkJCS8vIGJvdGggc2VnbWVudHMg
YXJlIHBvaW50cworCQkJCQlpZiAoIHNlZzFQdCAmJiBzZWcyUHQgKSB7CisKKwkJCQkJCWlmICgg
KCBpblNlZzFQdDEueCAhPT0gaW5TZWcyUHQxLnggKSB8fAorCQkJCQkJCSAoIGluU2VnMVB0MS55
ICE9PSBpblNlZzJQdDEueSApICkJCXJldHVybiBbXTsJLy8gdGhleSBhcmUgZGlzdGluY3QgIHBv
aW50cworCQkJCQkJcmV0dXJuIFsgaW5TZWcxUHQxIF07ICAgICAgICAgICAgICAgICAJCQkJCQkv
LyB0aGV5IGFyZSB0aGUgc2FtZSBwb2ludAorCisJCQkJCX0KKwkJCQkJLy8gc2VnbWVudCMxICBp
cyBhIHNpbmdsZSBwb2ludAorCQkJCQlpZiAoIHNlZzFQdCApIHsKKworCQkJCQkJaWYgKCAhIHBv
aW50X2luX3NlZ21lbnRfMkRfY29saW4oIGluU2VnMlB0MSwgaW5TZWcyUHQyLCBpblNlZzFQdDEg
KSApCQlyZXR1cm4gW107CQkvLyBidXQgbm90IGluIHNlZ21lbnQjMgorCQkJCQkJcmV0dXJuIFsg
aW5TZWcxUHQxIF07CisKKwkJCQkJfQorCQkJCQkvLyBzZWdtZW50IzIgIGlzIGEgc2luZ2xlIHBv
aW50CisJCQkJCWlmICggc2VnMlB0ICkgeworCisJCQkJCQlpZiAoICEgcG9pbnRfaW5fc2VnbWVu
dF8yRF9jb2xpbiggaW5TZWcxUHQxLCBpblNlZzFQdDIsIGluU2VnMlB0MSApICkJCXJldHVybiBb
XTsJCS8vIGJ1dCBub3QgaW4gc2VnbWVudCMxCisJCQkJCQlyZXR1cm4gWyBpblNlZzJQdDEgXTsK
KworCQkJCQl9CisKKwkJCQkJLy8gdGhleSBhcmUgY29sbGluZWFyIHNlZ21lbnRzLCB3aGljaCBt
aWdodCBvdmVybGFwCisJCQkJCXZhciBzZWcxbWluLCBzZWcxbWF4LCBzZWcxbWluVmFsLCBzZWcx
bWF4VmFsOworCQkJCQl2YXIgc2VnMm1pbiwgc2VnMm1heCwgc2VnMm1pblZhbCwgc2VnMm1heFZh
bDsKKwkJCQkJaWYgKCBzZWcxZHggIT09IDAgKSB7CisKKwkJCQkJCS8vIHRoZSBzZWdtZW50cyBh
cmUgTk9UIG9uIGEgdmVydGljYWwgbGluZQorCQkJCQkJaWYgKCBpblNlZzFQdDEueCA8IGluU2Vn
MVB0Mi54ICkgeworCisJCQkJCQkJc2VnMW1pbiA9IGluU2VnMVB0MTsgc2VnMW1pblZhbCA9IGlu
U2VnMVB0MS54OworCQkJCQkJCXNlZzFtYXggPSBpblNlZzFQdDI7IHNlZzFtYXhWYWwgPSBpblNl
ZzFQdDIueDsKKworCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCXNlZzFtaW4gPSBpblNlZzFQdDI7
IHNlZzFtaW5WYWwgPSBpblNlZzFQdDIueDsKKwkJCQkJCQlzZWcxbWF4ID0gaW5TZWcxUHQxOyBz
ZWcxbWF4VmFsID0gaW5TZWcxUHQxLng7CisKKwkJCQkJCX0KKwkJCQkJCWlmICggaW5TZWcyUHQx
LnggPCBpblNlZzJQdDIueCApIHsKKworCQkJCQkJCXNlZzJtaW4gPSBpblNlZzJQdDE7IHNlZzJt
aW5WYWwgPSBpblNlZzJQdDEueDsKKwkJCQkJCQlzZWcybWF4ID0gaW5TZWcyUHQyOyBzZWcybWF4
VmFsID0gaW5TZWcyUHQyLng7CisKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQlzZWcybWluID0g
aW5TZWcyUHQyOyBzZWcybWluVmFsID0gaW5TZWcyUHQyLng7CisJCQkJCQkJc2VnMm1heCA9IGlu
U2VnMlB0MTsgc2VnMm1heFZhbCA9IGluU2VnMlB0MS54OworCisJCQkJCQl9CisKKwkJCQkJfSBl
bHNlIHsKKworCQkJCQkJLy8gdGhlIHNlZ21lbnRzIGFyZSBvbiBhIHZlcnRpY2FsIGxpbmUKKwkJ
CQkJCWlmICggaW5TZWcxUHQxLnkgPCBpblNlZzFQdDIueSApIHsKKworCQkJCQkJCXNlZzFtaW4g
PSBpblNlZzFQdDE7IHNlZzFtaW5WYWwgPSBpblNlZzFQdDEueTsKKwkJCQkJCQlzZWcxbWF4ID0g
aW5TZWcxUHQyOyBzZWcxbWF4VmFsID0gaW5TZWcxUHQyLnk7CisKKwkJCQkJCX0gZWxzZSB7CisK
KwkJCQkJCQlzZWcxbWluID0gaW5TZWcxUHQyOyBzZWcxbWluVmFsID0gaW5TZWcxUHQyLnk7CisJ
CQkJCQkJc2VnMW1heCA9IGluU2VnMVB0MTsgc2VnMW1heFZhbCA9IGluU2VnMVB0MS55OworCisJ
CQkJCQl9CisJCQkJCQlpZiAoIGluU2VnMlB0MS55IDwgaW5TZWcyUHQyLnkgKSB7CisKKwkJCQkJ
CQlzZWcybWluID0gaW5TZWcyUHQxOyBzZWcybWluVmFsID0gaW5TZWcyUHQxLnk7CisJCQkJCQkJ
c2VnMm1heCA9IGluU2VnMlB0Mjsgc2VnMm1heFZhbCA9IGluU2VnMlB0Mi55OworCisJCQkJCQl9
IGVsc2UgeworCisJCQkJCQkJc2VnMm1pbiA9IGluU2VnMlB0Mjsgc2VnMm1pblZhbCA9IGluU2Vn
MlB0Mi55OworCQkJCQkJCXNlZzJtYXggPSBpblNlZzJQdDE7IHNlZzJtYXhWYWwgPSBpblNlZzJQ
dDEueTsKKworCQkJCQkJfQorCisJCQkJCX0KKwkJCQkJaWYgKCBzZWcxbWluVmFsIDw9IHNlZzJt
aW5WYWwgKSB7CisKKwkJCQkJCWlmICggc2VnMW1heFZhbCA8ICBzZWcybWluVmFsICkJcmV0dXJu
IFtdOworCQkJCQkJaWYgKCBzZWcxbWF4VmFsID09PSBzZWcybWluVmFsICkJeworCisJCQkJCQkJ
aWYgKCBpbkV4Y2x1ZGVBZGphY2VudFNlZ3MgKQkJcmV0dXJuIFtdOworCQkJCQkJCXJldHVybiBb
IHNlZzJtaW4gXTsKKworCQkJCQkJfQorCQkJCQkJaWYgKCBzZWcxbWF4VmFsIDw9IHNlZzJtYXhW
YWwgKQlyZXR1cm4gWyBzZWcybWluLCBzZWcxbWF4IF07CisJCQkJCQlyZXR1cm4JWyBzZWcybWlu
LCBzZWcybWF4IF07CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJaWYgKCBzZWcxbWluVmFsID4g
IHNlZzJtYXhWYWwgKQlyZXR1cm4gW107CisJCQkJCQlpZiAoIHNlZzFtaW5WYWwgPT09IHNlZzJt
YXhWYWwgKQl7CisKKwkJCQkJCQlpZiAoIGluRXhjbHVkZUFkamFjZW50U2VncyApCQlyZXR1cm4g
W107CisJCQkJCQkJcmV0dXJuIFsgc2VnMW1pbiBdOworCisJCQkJCQl9CisJCQkJCQlpZiAoIHNl
ZzFtYXhWYWwgPD0gc2VnMm1heFZhbCApCXJldHVybiBbIHNlZzFtaW4sIHNlZzFtYXggXTsKKwkJ
CQkJCXJldHVybglbIHNlZzFtaW4sIHNlZzJtYXggXTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJ
CX0KKworCQkJZnVuY3Rpb24gaXNQb2ludEluc2lkZUFuZ2xlKCBpblZlcnRleCwgaW5MZWdGcm9t
UHQsIGluTGVnVG9QdCwgaW5PdGhlclB0ICkgeworCisJCQkJLy8gVGhlIG9yZGVyIG9mIGxlZ3Mg
aXMgaW1wb3J0YW50CisKKwkJCQkvLyB0cmFuc2xhdGlvbiBvZiBhbGwgcG9pbnRzLCBzbyB0aGF0
IFZlcnRleCBpcyBhdCAoMCwwKQorCQkJCXZhciBsZWdGcm9tUHRYCT0gaW5MZWdGcm9tUHQueCAt
IGluVmVydGV4LngsICBsZWdGcm9tUHRZCT0gaW5MZWdGcm9tUHQueSAtIGluVmVydGV4Lnk7CisJ
CQkJdmFyIGxlZ1RvUHRYCT0gaW5MZWdUb1B0LngJLSBpblZlcnRleC54LCAgbGVnVG9QdFkJCT0g
aW5MZWdUb1B0LnkJLSBpblZlcnRleC55OworCQkJCXZhciBvdGhlclB0WAk9IGluT3RoZXJQdC54
CS0gaW5WZXJ0ZXgueCwgIG90aGVyUHRZCQk9IGluT3RoZXJQdC55CS0gaW5WZXJ0ZXgueTsKKwor
CQkJCS8vIG1haW4gYW5nbGUgPjA6IDwgMTgwIGRlZy47IDA6IDE4MCBkZWcuOyA8MDogPiAxODAg
ZGVnLgorCQkJCXZhciBmcm9tMnRvQW5nbGUJPSBsZWdGcm9tUHRYICogbGVnVG9QdFkgLSBsZWdG
cm9tUHRZICogbGVnVG9QdFg7CisJCQkJdmFyIGZyb20yb3RoZXJBbmdsZQk9IGxlZ0Zyb21QdFgg
KiBvdGhlclB0WSAtIGxlZ0Zyb21QdFkgKiBvdGhlclB0WDsKKworCQkJCWlmICggTWF0aC5hYnMo
IGZyb20ydG9BbmdsZSApID4gTnVtYmVyLkVQU0lMT04gKSB7CisKKwkJCQkJLy8gYW5nbGUgIT0g
MTgwIGRlZy4KKworCQkJCQl2YXIgb3RoZXIydG9BbmdsZQkJPSBvdGhlclB0WCAqIGxlZ1RvUHRZ
IC0gb3RoZXJQdFkgKiBsZWdUb1B0WDsKKwkJCQkJLy8gY29uc29sZS5sb2coICJmcm9tMnRvOiAi
ICsgZnJvbTJ0b0FuZ2xlICsgIiwgZnJvbTJvdGhlcjogIiArIGZyb20yb3RoZXJBbmdsZSArICIs
IG90aGVyMnRvOiAiICsgb3RoZXIydG9BbmdsZSApOworCisJCQkJCWlmICggZnJvbTJ0b0FuZ2xl
ID4gMCApIHsKKworCQkJCQkJLy8gbWFpbiBhbmdsZSA8IDE4MCBkZWcuCisJCQkJCQlyZXR1cm4J
KCAoIGZyb20yb3RoZXJBbmdsZSA+PSAwICkgJiYgKCBvdGhlcjJ0b0FuZ2xlID49IDAgKSApOwor
CisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCS8vIG1haW4gYW5nbGUgPiAxODAgZGVnLgorCQkJCQkJ
cmV0dXJuCSggKCBmcm9tMm90aGVyQW5nbGUgPj0gMCApIHx8ICggb3RoZXIydG9BbmdsZSA+PSAw
ICkgKTsKKworCQkJCQl9CisKKwkJCQl9IGVsc2UgeworCisJCQkJCS8vIGFuZ2xlID09IDE4MCBk
ZWcuCisJCQkJCS8vIGNvbnNvbGUubG9nKCAiZnJvbTJ0bzogMTgwIGRlZy4sIGZyb20yb3RoZXI6
ICIgKyBmcm9tMm90aGVyQW5nbGUgICk7CisJCQkJCXJldHVybgkoIGZyb20yb3RoZXJBbmdsZSA+
IDAgKTsKKworCQkJCX0KKworCQkJfQorCisKKwkJCWZ1bmN0aW9uIHJlbW92ZUhvbGVzKCBjb250
b3VyLCBob2xlcyApIHsKKworCQkJCXZhciBzaGFwZSA9IGNvbnRvdXIuY29uY2F0KCk7IC8vIHdv
cmsgb24gdGhpcyBzaGFwZQorCQkJCXZhciBob2xlOworCisJCQkJZnVuY3Rpb24gaXNDdXRMaW5l
SW5zaWRlQW5nbGVzKCBpblNoYXBlSWR4LCBpbkhvbGVJZHggKSB7CisKKwkJCQkJLy8gQ2hlY2sg
aWYgaG9sZSBwb2ludCBsaWVzIHdpdGhpbiBhbmdsZSBhcm91bmQgc2hhcGUgcG9pbnQKKwkJCQkJ
dmFyIGxhc3RTaGFwZUlkeCA9IHNoYXBlLmxlbmd0aCAtIDE7CisKKwkJCQkJdmFyIHByZXZTaGFw
ZUlkeCA9IGluU2hhcGVJZHggLSAxOworCQkJCQlpZiAoIHByZXZTaGFwZUlkeCA8IDAgKQkJCXBy
ZXZTaGFwZUlkeCA9IGxhc3RTaGFwZUlkeDsKKworCQkJCQl2YXIgbmV4dFNoYXBlSWR4ID0gaW5T
aGFwZUlkeCArIDE7CisJCQkJCWlmICggbmV4dFNoYXBlSWR4ID4gbGFzdFNoYXBlSWR4ICkJbmV4
dFNoYXBlSWR4ID0gMDsKKworCQkJCQl2YXIgaW5zaWRlQW5nbGUgPSBpc1BvaW50SW5zaWRlQW5n
bGUoIHNoYXBlWyBpblNoYXBlSWR4IF0sIHNoYXBlWyBwcmV2U2hhcGVJZHggXSwgc2hhcGVbIG5l
eHRTaGFwZUlkeCBdLCBob2xlWyBpbkhvbGVJZHggXSApOworCQkJCQlpZiAoICEgaW5zaWRlQW5n
bGUgKSB7CisKKwkJCQkJCS8vIGNvbnNvbGUubG9nKCAiVmVydGV4IChTaGFwZSk6ICIgKyBpblNo
YXBlSWR4ICsgIiwgUG9pbnQ6ICIgKyBob2xlW2luSG9sZUlkeF0ueCArICIvIiArIGhvbGVbaW5I
b2xlSWR4XS55ICk7CisJCQkJCQlyZXR1cm4JZmFsc2U7CisKKwkJCQkJfQorCisJCQkJCS8vIENo
ZWNrIGlmIHNoYXBlIHBvaW50IGxpZXMgd2l0aGluIGFuZ2xlIGFyb3VuZCBob2xlIHBvaW50CisJ
CQkJCXZhciBsYXN0SG9sZUlkeCA9IGhvbGUubGVuZ3RoIC0gMTsKKworCQkJCQl2YXIgcHJldkhv
bGVJZHggPSBpbkhvbGVJZHggLSAxOworCQkJCQlpZiAoIHByZXZIb2xlSWR4IDwgMCApCQkJcHJl
dkhvbGVJZHggPSBsYXN0SG9sZUlkeDsKKworCQkJCQl2YXIgbmV4dEhvbGVJZHggPSBpbkhvbGVJ
ZHggKyAxOworCQkJCQlpZiAoIG5leHRIb2xlSWR4ID4gbGFzdEhvbGVJZHggKQluZXh0SG9sZUlk
eCA9IDA7CisKKwkJCQkJaW5zaWRlQW5nbGUgPSBpc1BvaW50SW5zaWRlQW5nbGUoIGhvbGVbIGlu
SG9sZUlkeCBdLCBob2xlWyBwcmV2SG9sZUlkeCBdLCBob2xlWyBuZXh0SG9sZUlkeCBdLCBzaGFw
ZVsgaW5TaGFwZUlkeCBdICk7CisJCQkJCWlmICggISBpbnNpZGVBbmdsZSApIHsKKworCQkJCQkJ
Ly8gY29uc29sZS5sb2coICJWZXJ0ZXggKEhvbGUpOiAiICsgaW5Ib2xlSWR4ICsgIiwgUG9pbnQ6
ICIgKyBzaGFwZVtpblNoYXBlSWR4XS54ICsgIi8iICsgc2hhcGVbaW5TaGFwZUlkeF0ueSApOwor
CQkJCQkJcmV0dXJuCWZhbHNlOworCisJCQkJCX0KKworCQkJCQlyZXR1cm4JdHJ1ZTsKKworCQkJ
CX0KKworCQkJCWZ1bmN0aW9uIGludGVyc2VjdHNTaGFwZUVkZ2UoIGluU2hhcGVQdCwgaW5Ib2xl
UHQgKSB7CisKKwkJCQkJLy8gY2hlY2tzIGZvciBpbnRlcnNlY3Rpb25zIHdpdGggc2hhcGUgZWRn
ZXMKKwkJCQkJdmFyIHNJZHgsIG5leHRJZHgsIGludGVyc2VjdGlvbjsKKwkJCQkJZm9yICggc0lk
eCA9IDA7IHNJZHggPCBzaGFwZS5sZW5ndGg7IHNJZHggKysgKSB7CisKKwkJCQkJCW5leHRJZHgg
PSBzSWR4ICsgMTsgbmV4dElkeCAlPSBzaGFwZS5sZW5ndGg7CisJCQkJCQlpbnRlcnNlY3Rpb24g
PSBpbnRlcnNlY3Rfc2VnbWVudHNfMkQoIGluU2hhcGVQdCwgaW5Ib2xlUHQsIHNoYXBlWyBzSWR4
IF0sIHNoYXBlWyBuZXh0SWR4IF0sIHRydWUgKTsKKwkJCQkJCWlmICggaW50ZXJzZWN0aW9uLmxl
bmd0aCA+IDAgKQkJcmV0dXJuCXRydWU7CisKKwkJCQkJfQorCisJCQkJCXJldHVybglmYWxzZTsK
KworCQkJCX0KKworCQkJCXZhciBpbmRlcEhvbGVzID0gW107CisKKwkJCQlmdW5jdGlvbiBpbnRl
cnNlY3RzSG9sZUVkZ2UoIGluU2hhcGVQdCwgaW5Ib2xlUHQgKSB7CisKKwkJCQkJLy8gY2hlY2tz
IGZvciBpbnRlcnNlY3Rpb25zIHdpdGggaG9sZSBlZGdlcworCQkJCQl2YXIgaWhJZHgsIGNoa0hv
bGUsCisJCQkJCQloSWR4LCBuZXh0SWR4LCBpbnRlcnNlY3Rpb247CisJCQkJCWZvciAoIGloSWR4
ID0gMDsgaWhJZHggPCBpbmRlcEhvbGVzLmxlbmd0aDsgaWhJZHggKysgKSB7CisKKwkJCQkJCWNo
a0hvbGUgPSBob2xlc1sgaW5kZXBIb2xlc1sgaWhJZHggXV07CisJCQkJCQlmb3IgKCBoSWR4ID0g
MDsgaElkeCA8IGNoa0hvbGUubGVuZ3RoOyBoSWR4ICsrICkgeworCisJCQkJCQkJbmV4dElkeCA9
IGhJZHggKyAxOyBuZXh0SWR4ICU9IGNoa0hvbGUubGVuZ3RoOworCQkJCQkJCWludGVyc2VjdGlv
biA9IGludGVyc2VjdF9zZWdtZW50c18yRCggaW5TaGFwZVB0LCBpbkhvbGVQdCwgY2hrSG9sZVsg
aElkeCBdLCBjaGtIb2xlWyBuZXh0SWR4IF0sIHRydWUgKTsKKwkJCQkJCQlpZiAoIGludGVyc2Vj
dGlvbi5sZW5ndGggPiAwICkJCXJldHVybgl0cnVlOworCisJCQkJCQl9CisKKwkJCQkJfQorCQkJ
CQlyZXR1cm4JZmFsc2U7CisKKwkJCQl9CisKKwkJCQl2YXIgaG9sZUluZGV4LCBzaGFwZUluZGV4
LAorCQkJCQlzaGFwZVB0LCBob2xlUHQsCisJCQkJCWhvbGVJZHgsIGN1dEtleSwgZmFpbGVkQ3V0
cyA9IFtdLAorCQkJCQl0bXBTaGFwZTEsIHRtcFNoYXBlMiwKKwkJCQkJdG1wSG9sZTEsIHRtcEhv
bGUyOworCisJCQkJZm9yICggdmFyIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBo
ICsrICkgeworCisJCQkJCWluZGVwSG9sZXMucHVzaCggaCApOworCisJCQkJfQorCisJCQkJdmFy
IG1pblNoYXBlSW5kZXggPSAwOworCQkJCXZhciBjb3VudGVyID0gaW5kZXBIb2xlcy5sZW5ndGgg
KiAyOworCQkJCXdoaWxlICggaW5kZXBIb2xlcy5sZW5ndGggPiAwICkgeworCisJCQkJCWNvdW50
ZXIgLS07CisJCQkJCWlmICggY291bnRlciA8IDAgKSB7CisKKwkJCQkJCWNvbnNvbGUubG9nKCAi
SW5maW5pdGUgTG9vcCEgSG9sZXMgbGVmdDoiICsgaW5kZXBIb2xlcy5sZW5ndGggKyAiLCBQcm9i
YWJseSBIb2xlIG91dHNpZGUgU2hhcGUhIiApOworCQkJCQkJYnJlYWs7CisKKwkJCQkJfQorCisJ
CQkJCS8vIHNlYXJjaCBmb3Igc2hhcGUtdmVydGV4IGFuZCBob2xlLXZlcnRleCwKKwkJCQkJLy8g
d2hpY2ggY2FuIGJlIGNvbm5lY3RlZCB3aXRob3V0IGludGVyc2VjdGlvbnMKKwkJCQkJZm9yICgg
c2hhcGVJbmRleCA9IG1pblNoYXBlSW5kZXg7IHNoYXBlSW5kZXggPCBzaGFwZS5sZW5ndGg7IHNo
YXBlSW5kZXggKysgKSB7CisKKwkJCQkJCXNoYXBlUHQgPSBzaGFwZVsgc2hhcGVJbmRleCBdOwor
CQkJCQkJaG9sZUluZGV4CT0gLSAxOworCisJCQkJCQkvLyBzZWFyY2ggZm9yIGhvbGUgd2hpY2gg
Y2FuIGJlIHJlYWNoZWQgd2l0aG91dCBpbnRlcnNlY3Rpb25zCisJCQkJCQlmb3IgKCB2YXIgaCA9
IDA7IGggPCBpbmRlcEhvbGVzLmxlbmd0aDsgaCArKyApIHsKKworCQkJCQkJCWhvbGVJZHggPSBp
bmRlcEhvbGVzWyBoIF07CisKKwkJCQkJCQkvLyBwcmV2ZW50IG11bHRpcGxlIGNoZWNrcworCQkJ
CQkJCWN1dEtleSA9IHNoYXBlUHQueCArICI6IiArIHNoYXBlUHQueSArICI6IiArIGhvbGVJZHg7
CisJCQkJCQkJaWYgKCBmYWlsZWRDdXRzWyBjdXRLZXkgXSAhPT0gdW5kZWZpbmVkICkJCQljb250
aW51ZTsKKworCQkJCQkJCWhvbGUgPSBob2xlc1sgaG9sZUlkeCBdOworCQkJCQkJCWZvciAoIHZh
ciBoMiA9IDA7IGgyIDwgaG9sZS5sZW5ndGg7IGgyICsrICkgeworCisJCQkJCQkJCWhvbGVQdCA9
IGhvbGVbIGgyIF07CisJCQkJCQkJCWlmICggISBpc0N1dExpbmVJbnNpZGVBbmdsZXMoIHNoYXBl
SW5kZXgsIGgyICkgKQkJY29udGludWU7CisJCQkJCQkJCWlmICggaW50ZXJzZWN0c1NoYXBlRWRn
ZSggc2hhcGVQdCwgaG9sZVB0ICkgKQkJY29udGludWU7CisJCQkJCQkJCWlmICggaW50ZXJzZWN0
c0hvbGVFZGdlKCBzaGFwZVB0LCBob2xlUHQgKSApCQljb250aW51ZTsKKworCQkJCQkJCQlob2xl
SW5kZXggPSBoMjsKKwkJCQkJCQkJaW5kZXBIb2xlcy5zcGxpY2UoIGgsIDEgKTsKKworCQkJCQkJ
CQl0bXBTaGFwZTEgPSBzaGFwZS5zbGljZSggMCwgc2hhcGVJbmRleCArIDEgKTsKKwkJCQkJCQkJ
dG1wU2hhcGUyID0gc2hhcGUuc2xpY2UoIHNoYXBlSW5kZXggKTsKKwkJCQkJCQkJdG1wSG9sZTEg
PSBob2xlLnNsaWNlKCBob2xlSW5kZXggKTsKKwkJCQkJCQkJdG1wSG9sZTIgPSBob2xlLnNsaWNl
KCAwLCBob2xlSW5kZXggKyAxICk7CisKKwkJCQkJCQkJc2hhcGUgPSB0bXBTaGFwZTEuY29uY2F0
KCB0bXBIb2xlMSApLmNvbmNhdCggdG1wSG9sZTIgKS5jb25jYXQoIHRtcFNoYXBlMiApOworCisJ
CQkJCQkJCW1pblNoYXBlSW5kZXggPSBzaGFwZUluZGV4OworCisJCQkJCQkJCS8vIERlYnVnIG9u
bHksIHRvIHNob3cgdGhlIHNlbGVjdGVkIGN1dHMKKwkJCQkJCQkJLy8gZ2xvYl9DdXRMaW5lcy5w
dXNoKCBbIHNoYXBlUHQsIGhvbGVQdCBdICk7CisKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQl9
CisJCQkJCQkJaWYgKCBob2xlSW5kZXggPj0gMCApCWJyZWFrOwkJLy8gaG9sZS12ZXJ0ZXggZm91
bmQKKworCQkJCQkJCWZhaWxlZEN1dHNbIGN1dEtleSBdID0gdHJ1ZTsJCQkvLyByZW1lbWJlciBm
YWlsdXJlCisKKwkJCQkJCX0KKwkJCQkJCWlmICggaG9sZUluZGV4ID49IDAgKQlicmVhazsJCS8v
IGhvbGUtdmVydGV4IGZvdW5kCisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJcmV0dXJuIHNoYXBl
OyAJCQkvKiBzaGFwZSB3aXRoIG5vIGhvbGVzICovCisKKwkJCX0KKworCisJCQl2YXIgaSwgaWws
IGYsIGZhY2UsCisJCQkJa2V5LCBpbmRleCwKKwkJCQlhbGxQb2ludHNNYXAgPSB7fTsKKworCQkJ
Ly8gVG8gbWFpbnRhaW4gcmVmZXJlbmNlIHRvIG9sZCBzaGFwZSwgb25lIG11c3QgbWF0Y2ggY29v
cmRpbmF0ZXMsIG9yIG9mZnNldCB0aGUgaW5kaWNlcyBmcm9tIG9yaWdpbmFsIGFycmF5cy4gSXQn
cyBwcm9iYWJseSBlYXNpZXIgdG8gZG8gdGhlIGZpcnN0LgorCisJCQl2YXIgYWxscG9pbnRzID0g
Y29udG91ci5jb25jYXQoKTsKKworCQkJZm9yICggdmFyIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0
aDsgaCA8IGhsOyBoICsrICkgeworCisJCQkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIGFs
bHBvaW50cywgaG9sZXNbIGggXSApOworCisJCQl9CisKKwkJCS8vY29uc29sZS5sb2coICJhbGxw
b2ludHMiLGFsbHBvaW50cywgYWxscG9pbnRzLmxlbmd0aCApOworCisJCQkvLyBwcmVwYXJlIGFs
bCBwb2ludHMgbWFwCisKKwkJCWZvciAoIGkgPSAwLCBpbCA9IGFsbHBvaW50cy5sZW5ndGg7IGkg
PCBpbDsgaSArKyApIHsKKworCQkJCWtleSA9IGFsbHBvaW50c1sgaSBdLnggKyAiOiIgKyBhbGxw
b2ludHNbIGkgXS55OworCisJCQkJaWYgKCBhbGxQb2ludHNNYXBbIGtleSBdICE9PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCQkJY29uc29sZS53YXJuKCAiVEhSRUUuU2hhcGVVdGlsczogRHVwbGljYXRl
IHBvaW50Iiwga2V5LCBpICk7CisKKwkJCQl9CisKKwkJCQlhbGxQb2ludHNNYXBbIGtleSBdID0g
aTsKKworCQkJfQorCisJCQkvLyByZW1vdmUgaG9sZXMgYnkgY3V0dGluZyBwYXRocyB0byBob2xl
cyBhbmQgYWRkaW5nIHRoZW0gdG8gdGhlIHNoYXBlCisJCQl2YXIgc2hhcGVXaXRob3V0SG9sZXMg
PSByZW1vdmVIb2xlcyggY29udG91ciwgaG9sZXMgKTsKKworCQkJdmFyIHRyaWFuZ2xlcyA9IFNo
YXBlVXRpbHMudHJpYW5ndWxhdGUoIHNoYXBlV2l0aG91dEhvbGVzLCBmYWxzZSApOyAvLyBUcnVl
IHJldHVybnMgaW5kaWNlcyBmb3IgcG9pbnRzIG9mIHNwb29sZWQgc2hhcGUKKwkJCS8vY29uc29s
ZS5sb2coICJ0cmlhbmdsZXMiLHRyaWFuZ2xlcywgdHJpYW5nbGVzLmxlbmd0aCApOworCisJCQkv
LyBjaGVjayBhbGwgZmFjZSB2ZXJ0aWNlcyBhZ2FpbnN0IGFsbCBwb2ludHMgbWFwCisKKwkJCWZv
ciAoIGkgPSAwLCBpbCA9IHRyaWFuZ2xlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworCQkJ
CWZhY2UgPSB0cmlhbmdsZXNbIGkgXTsKKworCQkJCWZvciAoIGYgPSAwOyBmIDwgMzsgZiArKyAp
IHsKKworCQkJCQlrZXkgPSBmYWNlWyBmIF0ueCArICI6IiArIGZhY2VbIGYgXS55OworCisJCQkJ
CWluZGV4ID0gYWxsUG9pbnRzTWFwWyBrZXkgXTsKKworCQkJCQlpZiAoIGluZGV4ICE9PSB1bmRl
ZmluZWQgKSB7CisKKwkJCQkJCWZhY2VbIGYgXSA9IGluZGV4OworCisJCQkJCX0KKworCQkJCX0K
KworCQkJfQorCisJCQlyZXR1cm4gdHJpYW5nbGVzLmNvbmNhdCgpOworCisJCX0sCisKKwkJaXND
bG9ja1dpc2U6IGZ1bmN0aW9uICggcHRzICkgeworCisJCQlyZXR1cm4gU2hhcGVVdGlscy5hcmVh
KCBwdHMgKSA8IDA7CisKKwkJfQorCisJfTsKKworCS8qKgorCSAqIEBhdXRob3Igeno4NSAvIGh0
dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKKwkgKgorCSAqIENyZWF0ZXMgZXh0cnVk
ZWQgZ2VvbWV0cnkgZnJvbSBhIHBhdGggc2hhcGUuCisJICoKKwkgKiBwYXJhbWV0ZXJzID0gewor
CSAqCisJICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRo
ZSBjdXJ2ZXMKKwkgKiAgc3RlcHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIGZvciB6LXNp
ZGUgZXh0cnVzaW9ucyAvIHVzZWQgZm9yIHN1YmRpdmlkaW5nIHNlZ21lbnRzIG9mIGV4dHJ1ZGUg
c3BsaW5lIHRvbworCSAqICBhbW91bnQ6IDxpbnQ+LCAvLyBEZXB0aCB0byBleHRydWRlIHRoZSBz
aGFwZQorCSAqCisJICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsCisJ
ICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRoZSBvcmlnaW5h
bCBzaGFwZSBiZXZlbCBnb2VzCisJICogIGJldmVsU2l6ZTogPGZsb2F0PiwgLy8gaG93IGZhciBm
cm9tIHNoYXBlIG91dGxpbmUgaXMgYmV2ZWwKKwkgKiAgYmV2ZWxTZWdtZW50czogPGludD4sIC8v
IG51bWJlciBvZiBiZXZlbCBsYXllcnMKKwkgKgorCSAqICBleHRydWRlUGF0aDogPFRIUkVFLkN1
cnZlPiAvLyBjdXJ2ZSB0byBleHRydWRlIHNoYXBlIGFsb25nCisJICogIGZyYW1lczogPE9iamVj
dD4gLy8gY29udGFpbmluZyBhcnJheXMgb2YgdGFuZ2VudHMsIG5vcm1hbHMsIGJpbm9ybWFscwor
CSAqCisJICogIFVWR2VuZXJhdG9yOiA8T2JqZWN0PiAvLyBvYmplY3QgdGhhdCBwcm92aWRlcyBV
ViBnZW5lcmF0b3IgZnVuY3Rpb25zCisJICoKKwkgKiB9CisJICovCisKKwkvLyBFeHRydWRlR2Vv
bWV0cnkKKworCWZ1bmN0aW9uIEV4dHJ1ZGVHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkgewor
CisJCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnRXh0cnVkZUdlb21l
dHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlzaGFwZXM6IHNoYXBlcywKKwkJCW9w
dGlvbnM6IG9wdGlvbnMKKwkJfTsKKworCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEV4
dHJ1ZGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkgKTsKKwkJdGhpcy5tZXJnZVZl
cnRpY2VzKCk7CisKKwl9CisKKwlFeHRydWRlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNy
ZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisJRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IEV4dHJ1ZGVHZW9tZXRyeTsKKworCS8vIEV4dHJ1ZGVCdWZmZXJHZW9tZXRy
eQorCisJZnVuY3Rpb24gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7
CisKKwkJaWYgKCB0eXBlb2YgKCBzaGFwZXMgKSA9PT0gInVuZGVmaW5lZCIgKSB7CisKKwkJCXJl
dHVybjsKKworCQl9CisKKwkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMu
dHlwZSA9ICdFeHRydWRlQnVmZmVyR2VvbWV0cnknOworCisJCXNoYXBlcyA9IEFycmF5LmlzQXJy
YXkoIHNoYXBlcyApID8gc2hhcGVzIDogWyBzaGFwZXMgXTsKKworCQl0aGlzLmFkZFNoYXBlTGlz
dCggc2hhcGVzLCBvcHRpb25zICk7CisKKwkJdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOwor
CisJCS8vIGNhbid0IHJlYWxseSB1c2UgYXV0b21hdGljIHZlcnRleCBub3JtYWxzCisJCS8vIGFz
IHRoZW4gZnJvbnQgYW5kIGJhY2sgc2lkZXMgZ2V0IHNtb290aGVkIHRvbworCQkvLyBzaG91bGQg
ZG8gc2VwYXJhdGUgc21vb3RoaW5nIGp1c3QgZm9yIHNpZGVzCisKKwkJLy90aGlzLmNvbXB1dGVW
ZXJ0ZXhOb3JtYWxzKCk7CisKKwkJLy9jb25zb2xlLmxvZyggInRvb2siLCAoIERhdGUubm93KCkg
LSBzdGFydFRpbWUgKSApOworCisJfQorCisJRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlw
ZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOworCUV4dHJ1ZGVC
dWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFeHRydWRlQnVmZmVyR2VvbWV0
cnk7CisKKwlFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmdldEFycmF5cyA9IGZ1bmN0
aW9uICgpIHsKKworCQl2YXIgcG9zaXRpb25BdHRyaWJ1dGUgPSB0aGlzLmdldEF0dHJpYnV0ZSgg
InBvc2l0aW9uIiApOworCQl2YXIgdmVydGljZXNBcnJheSA9IHBvc2l0aW9uQXR0cmlidXRlID8g
QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIHBvc2l0aW9uQXR0cmlidXRlLmFycmF5ICkgOiBb
XTsKKworCQl2YXIgdXZBdHRyaWJ1dGUgPSB0aGlzLmdldEF0dHJpYnV0ZSggInV2IiApOworCQl2
YXIgdXZBcnJheSA9IHV2QXR0cmlidXRlID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIHV2
QXR0cmlidXRlLmFycmF5ICkgOiBbXTsKKworCQl2YXIgSW5kZXhBdHRyaWJ1dGUgPSB0aGlzLmlu
ZGV4OworCQl2YXIgaW5kaWNlc0FycmF5ID0gSW5kZXhBdHRyaWJ1dGUgPyBBcnJheS5wcm90b3R5
cGUuc2xpY2UuY2FsbCggSW5kZXhBdHRyaWJ1dGUuYXJyYXkgKSA6IFtdOworCisJCXJldHVybiB7
CisJCQlwb3NpdGlvbjogdmVydGljZXNBcnJheSwKKwkJCXV2OiB1dkFycmF5LAorCQkJaW5kZXg6
IGluZGljZXNBcnJheQorCQl9OworCisJfTsKKworCUV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90
b3R5cGUuYWRkU2hhcGVMaXN0ID0gZnVuY3Rpb24gKCBzaGFwZXMsIG9wdGlvbnMgKSB7CisKKwkJ
dmFyIHNsID0gc2hhcGVzLmxlbmd0aDsKKwkJb3B0aW9ucy5hcnJheXMgPSB0aGlzLmdldEFycmF5
cygpOworCisJCWZvciAoIHZhciBzID0gMDsgcyA8IHNsOyBzICsrICkgeworCisJCQl2YXIgc2hh
cGUgPSBzaGFwZXNbIHMgXTsKKwkJCXRoaXMuYWRkU2hhcGUoIHNoYXBlLCBvcHRpb25zICk7CisK
KwkJfQorCisJCXRoaXMuc2V0SW5kZXgoIG9wdGlvbnMuYXJyYXlzLmluZGV4ICk7CisJCXRoaXMu
YWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggb3B0
aW9ucy5hcnJheXMucG9zaXRpb24sIDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2Jywg
bmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG9wdGlvbnMuYXJyYXlzLnV2LCAyICkgKTsKKwor
CX07CisKKwlFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmFkZFNoYXBlID0gZnVuY3Rp
b24gKCBzaGFwZSwgb3B0aW9ucyApIHsKKworCQl2YXIgYXJyYXlzID0gb3B0aW9ucy5hcnJheXMg
PyBvcHRpb25zLmFycmF5cyA6IHRoaXMuZ2V0QXJyYXlzKCk7CisJCXZhciB2ZXJ0aWNlc0FycmF5
ID0gYXJyYXlzLnBvc2l0aW9uOworCQl2YXIgaW5kaWNlc0FycmF5ID0gYXJyYXlzLmluZGV4Owor
CQl2YXIgdXZBcnJheSA9IGFycmF5cy51djsKKworCQl2YXIgcGxhY2Vob2xkZXIgPSBbXTsKKwor
CisJCXZhciBhbW91bnQgPSBvcHRpb25zLmFtb3VudCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5h
bW91bnQgOiAxMDA7CisKKwkJdmFyIGJldmVsVGhpY2tuZXNzID0gb3B0aW9ucy5iZXZlbFRoaWNr
bmVzcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyA6IDY7IC8vIDEwCisJ
CXZhciBiZXZlbFNpemUgPSBvcHRpb25zLmJldmVsU2l6ZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9u
cy5iZXZlbFNpemUgOiBiZXZlbFRoaWNrbmVzcyAtIDI7IC8vIDgKKwkJdmFyIGJldmVsU2VnbWVu
dHMgPSBvcHRpb25zLmJldmVsU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxT
ZWdtZW50cyA6IDM7CisKKwkJdmFyIGJldmVsRW5hYmxlZCA9IG9wdGlvbnMuYmV2ZWxFbmFibGVk
ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsRW5hYmxlZCA6IHRydWU7IC8vIGZhbHNlCisK
KwkJdmFyIGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMgIT09IHVuZGVmaW5l
ZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyOworCisJCXZhciBzdGVwcyA9IG9wdGlvbnMu
c3RlcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlcHMgOiAxOworCisJCXZhciBleHRydWRl
UGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGg7CisJCXZhciBleHRydWRlUHRzLCBleHRydWRlQnlQ
YXRoID0gZmFsc2U7CisKKwkJLy8gVXNlIGRlZmF1bHQgV29ybGRVVkdlbmVyYXRvciBpZiBubyBV
ViBnZW5lcmF0b3JzIGFyZSBzcGVjaWZpZWQuCisJCXZhciB1dmdlbiA9IG9wdGlvbnMuVVZHZW5l
cmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuVVZHZW5lcmF0b3IgOiBFeHRydWRlR2VvbWV0
cnkuV29ybGRVVkdlbmVyYXRvcjsKKworCQl2YXIgc3BsaW5lVHViZSwgYmlub3JtYWwsIG5vcm1h
bCwgcG9zaXRpb24yOworCQlpZiAoIGV4dHJ1ZGVQYXRoICkgeworCisJCQlleHRydWRlUHRzID0g
ZXh0cnVkZVBhdGguZ2V0U3BhY2VkUG9pbnRzKCBzdGVwcyApOworCisJCQlleHRydWRlQnlQYXRo
ID0gdHJ1ZTsKKwkJCWJldmVsRW5hYmxlZCA9IGZhbHNlOyAvLyBiZXZlbHMgbm90IHN1cHBvcnRl
ZCBmb3IgcGF0aCBleHRydXNpb24KKworCQkJLy8gU0VUVVAgVE5CIHZhcmlhYmxlcworCisJCQkv
LyBUT0RPMSAtIGhhdmUgYSAuaXNDbG9zZWQgaW4gc3BsaW5lPworCisJCQlzcGxpbmVUdWJlID0g
b3B0aW9ucy5mcmFtZXMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZnJhbWVzIDogZXh0cnVkZVBh
dGguY29tcHV0ZUZyZW5ldEZyYW1lcyggc3RlcHMsIGZhbHNlICk7CisKKwkJCS8vIGNvbnNvbGUu
bG9nKHNwbGluZVR1YmUsICdzcGxpbmVUdWJlJywgc3BsaW5lVHViZS5ub3JtYWxzLmxlbmd0aCwg
J3N0ZXBzJywgc3RlcHMsICdleHRydWRlUHRzJywgZXh0cnVkZVB0cy5sZW5ndGgpOworCisJCQli
aW5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CisJCQlub3JtYWwgPSBuZXcgVmVjdG9yMygpOworCQkJ
cG9zaXRpb24yID0gbmV3IFZlY3RvcjMoKTsKKworCQl9CisKKwkJLy8gU2FmZWd1YXJkcyBpZiBi
ZXZlbHMgYXJlIG5vdCBlbmFibGVkCisKKwkJaWYgKCAhIGJldmVsRW5hYmxlZCApIHsKKworCQkJ
YmV2ZWxTZWdtZW50cyA9IDA7CisJCQliZXZlbFRoaWNrbmVzcyA9IDA7CisJCQliZXZlbFNpemUg
PSAwOworCisJCX0KKworCQkvLyBWYXJpYWJsZXMgaW5pdGlhbGl6YXRpb24KKworCQl2YXIgYWhv
bGUsIGgsIGhsOyAvLyBsb29waW5nIG9mIGhvbGVzCisJCXZhciBzY29wZSA9IHRoaXM7CisKKwkJ
dmFyIHNoYXBlUG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApOwor
CisJCXZhciB2ZXJ0aWNlcyA9IHNoYXBlUG9pbnRzLnNoYXBlOworCQl2YXIgaG9sZXMgPSBzaGFw
ZVBvaW50cy5ob2xlczsKKworCQl2YXIgcmV2ZXJzZSA9ICEgU2hhcGVVdGlscy5pc0Nsb2NrV2lz
ZSggdmVydGljZXMgKTsKKworCQlpZiAoIHJldmVyc2UgKSB7CisKKwkJCXZlcnRpY2VzID0gdmVy
dGljZXMucmV2ZXJzZSgpOworCisJCQkvLyBNYXliZSB3ZSBzaG91bGQgYWxzbyBjaGVjayBpZiBo
b2xlcyBhcmUgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiwganVzdCB0byBiZSBzYWZlIC4uLgor
CisJCQlmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHsKKwor
CQkJCWFob2xlID0gaG9sZXNbIGggXTsKKworCQkJCWlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lz
ZSggYWhvbGUgKSApIHsKKworCQkJCQlob2xlc1sgaCBdID0gYWhvbGUucmV2ZXJzZSgpOworCisJ
CQkJfQorCisJCQl9CisKKwkJfQorCisKKwkJdmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1
bGF0ZVNoYXBlKCB2ZXJ0aWNlcywgaG9sZXMgKTsKKworCQkvKiBWZXJ0aWNlcyAqLworCisJCXZh
ciBjb250b3VyID0gdmVydGljZXM7IC8vIHZlcnRpY2VzIGhhcyBhbGwgcG9pbnRzIGJ1dCBjb250
b3VyIGhhcyBvbmx5IHBvaW50cyBvZiBjaXJjdW1mZXJlbmNlCisKKwkJZm9yICggaCA9IDAsIGhs
ID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7CisKKwkJCWFob2xlID0gaG9sZXNbIGgg
XTsKKworCQkJdmVydGljZXMgPSB2ZXJ0aWNlcy5jb25jYXQoIGFob2xlICk7CisKKwkJfQorCisK
KwkJZnVuY3Rpb24gc2NhbGVQdDIoIHB0LCB2ZWMsIHNpemUgKSB7CisKKwkJCWlmICggISB2ZWMg
KSBjb25zb2xlLmVycm9yKCAiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhp
c3QiICk7CisKKwkJCXJldHVybiB2ZWMuY2xvbmUoKS5tdWx0aXBseVNjYWxhciggc2l6ZSApLmFk
ZCggcHQgKTsKKworCQl9CisKKwkJdmFyIGIsIGJzLCB0LCB6LAorCQkJdmVydCwgdmxlbiA9IHZl
cnRpY2VzLmxlbmd0aCwKKwkJCWZhY2UsIGZsZW4gPSBmYWNlcy5sZW5ndGg7CisKKworCQkvLyBG
aW5kIGRpcmVjdGlvbnMgZm9yIHBvaW50IG1vdmVtZW50CisKKworCQlmdW5jdGlvbiBnZXRCZXZl
bFZlYyggaW5QdCwgaW5QcmV2LCBpbk5leHQgKSB7CisKKwkJCS8vIGNvbXB1dGVzIGZvciBpblB0
IHRoZSBjb3JyZXNwb25kaW5nIHBvaW50IGluUHQnIG9uIGEgbmV3IGNvbnRvdXIKKwkJCS8vICAg
c2hpZnRlZCBieSAxIHVuaXQgKGxlbmd0aCBvZiBub3JtYWxpemVkIHZlY3RvcikgdG8gdGhlIGxl
ZnQKKwkJCS8vIGlmIHdlIHdhbGsgYWxvbmcgY29udG91ciBjbG9ja3dpc2UsIHRoaXMgbmV3IGNv
bnRvdXIgaXMgb3V0c2lkZSB0aGUgb2xkIG9uZQorCQkJLy8KKwkJCS8vIGluUHQnIGlzIHRoZSBp
bnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaW5lcyBwYXJhbGxlbCB0byB0aGUgdHdvCisJCQkvLyAg
YWRqYWNlbnQgZWRnZXMgb2YgaW5QdCBhdCBhIGRpc3RhbmNlIG9mIDEgdW5pdCBvbiB0aGUgbGVm
dCBzaWRlLgorCisJCQl2YXIgdl90cmFuc194LCB2X3RyYW5zX3ksIHNocmlua19ieTsgLy8gcmVz
dWx0aW5nIHRyYW5zbGF0aW9uIHZlY3RvciBmb3IgaW5QdAorCisJCQkvLyBnb29kIHJlYWRpbmcg
Zm9yIGdlb21ldHJ5IGFsZ29yaXRobXMgKGhlcmU6IGxpbmUtbGluZSBpbnRlcnNlY3Rpb24pCisJ
CQkvLyBodHRwOi8vZ2VvbWFsZ29yaXRobXMuY29tL2EwNS1faW50ZXJzZWN0LTEuaHRtbAorCisJ
CQl2YXIgdl9wcmV2X3ggPSBpblB0LnggLSBpblByZXYueCwKKwkJCQl2X3ByZXZfeSA9IGluUHQu
eSAtIGluUHJldi55OworCQkJdmFyIHZfbmV4dF94ID0gaW5OZXh0LnggLSBpblB0LngsCisJCQkJ
dl9uZXh0X3kgPSBpbk5leHQueSAtIGluUHQueTsKKworCQkJdmFyIHZfcHJldl9sZW5zcSA9ICgg
dl9wcmV2X3ggKiB2X3ByZXZfeCArIHZfcHJldl95ICogdl9wcmV2X3kgKTsKKworCQkJLy8gY2hl
Y2sgZm9yIGNvbGxpbmVhciBlZGdlcworCQkJdmFyIGNvbGxpbmVhcjAgPSAoIHZfcHJldl94ICog
dl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7CisKKwkJCWlmICggTWF0aC5hYnMoIGNv
bGxpbmVhcjAgKSA+IE51bWJlci5FUFNJTE9OICkgeworCisJCQkJLy8gbm90IGNvbGxpbmVhcgor
CisJCQkJLy8gbGVuZ3RoIG9mIHZlY3RvcnMgZm9yIG5vcm1hbGl6aW5nCisKKwkJCQl2YXIgdl9w
cmV2X2xlbiA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxICk7CisJCQkJdmFyIHZfbmV4dF9sZW4g
PSBNYXRoLnNxcnQoIHZfbmV4dF94ICogdl9uZXh0X3ggKyB2X25leHRfeSAqIHZfbmV4dF95ICk7
CisKKwkJCQkvLyBzaGlmdCBhZGphY2VudCBwb2ludHMgYnkgdW5pdCB2ZWN0b3JzIHRvIHRoZSBs
ZWZ0CisKKwkJCQl2YXIgcHRQcmV2U2hpZnRfeCA9ICggaW5QcmV2LnggLSB2X3ByZXZfeSAvIHZf
cHJldl9sZW4gKTsKKwkJCQl2YXIgcHRQcmV2U2hpZnRfeSA9ICggaW5QcmV2LnkgKyB2X3ByZXZf
eCAvIHZfcHJldl9sZW4gKTsKKworCQkJCXZhciBwdE5leHRTaGlmdF94ID0gKCBpbk5leHQueCAt
IHZfbmV4dF95IC8gdl9uZXh0X2xlbiApOworCQkJCXZhciBwdE5leHRTaGlmdF95ID0gKCBpbk5l
eHQueSArIHZfbmV4dF94IC8gdl9uZXh0X2xlbiApOworCisJCQkJLy8gc2NhbGluZyBmYWN0b3Ig
Zm9yIHZfcHJldiB0byBpbnRlcnNlY3Rpb24gcG9pbnQKKworCQkJCXZhciBzZiA9ICggKCBwdE5l
eHRTaGlmdF94IC0gcHRQcmV2U2hpZnRfeCApICogdl9uZXh0X3kgLQorCQkJCQkJKCBwdE5leHRT
aGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAvCisJCQkJCSggdl9wcmV2X3gg
KiB2X25leHRfeSAtIHZfcHJldl95ICogdl9uZXh0X3ggKTsKKworCQkJCS8vIHZlY3RvciBmcm9t
IGluUHQgdG8gaW50ZXJzZWN0aW9uIHBvaW50CisKKwkJCQl2X3RyYW5zX3ggPSAoIHB0UHJldlNo
aWZ0X3ggKyB2X3ByZXZfeCAqIHNmIC0gaW5QdC54ICk7CisJCQkJdl90cmFuc195ID0gKCBwdFBy
ZXZTaGlmdF95ICsgdl9wcmV2X3kgKiBzZiAtIGluUHQueSApOworCisJCQkJLy8gRG9uJ3Qgbm9y
bWFsaXplISwgb3RoZXJ3aXNlIHNoYXJwIGNvcm5lcnMgYmVjb21lIHVnbHkKKwkJCQkvLyAgYnV0
IHByZXZlbnQgY3Jhenkgc3Bpa2VzCisJCQkJdmFyIHZfdHJhbnNfbGVuc3EgPSAoIHZfdHJhbnNf
eCAqIHZfdHJhbnNfeCArIHZfdHJhbnNfeSAqIHZfdHJhbnNfeSApOworCQkJCWlmICggdl90cmFu
c19sZW5zcSA8PSAyICkgeworCisJCQkJCXJldHVybiBuZXcgVmVjdG9yMiggdl90cmFuc194LCB2
X3RyYW5zX3kgKTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJc2hyaW5rX2J5ID0gTWF0aC5zcXJ0
KCB2X3RyYW5zX2xlbnNxIC8gMiApOworCisJCQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJLy8g
aGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBjb2xsaW5lYXIgZWRnZXMKKworCQkJCXZhciBkaXJlY3Rp
b25fZXEgPSBmYWxzZTsgLy8gYXNzdW1lczogb3Bwb3NpdGUKKwkJCQlpZiAoIHZfcHJldl94ID4g
TnVtYmVyLkVQU0lMT04gKSB7CisKKwkJCQkJaWYgKCB2X25leHRfeCA+IE51bWJlci5FUFNJTE9O
ICkgeworCisJCQkJCQlkaXJlY3Rpb25fZXEgPSB0cnVlOworCisJCQkJCX0KKworCQkJCX0gZWxz
ZSB7CisKKwkJCQkJaWYgKCB2X3ByZXZfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7CisKKwkJCQkJ
CWlmICggdl9uZXh0X3ggPCAtIE51bWJlci5FUFNJTE9OICkgeworCisJCQkJCQkJZGlyZWN0aW9u
X2VxID0gdHJ1ZTsKKworCQkJCQkJfQorCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWlmICggTWF0
aC5zaWduKCB2X3ByZXZfeSApID09PSBNYXRoLnNpZ24oIHZfbmV4dF95ICkgKSB7CisKKwkJCQkJ
CQlkaXJlY3Rpb25fZXEgPSB0cnVlOworCisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJfQorCisJ
CQkJaWYgKCBkaXJlY3Rpb25fZXEgKSB7CisKKwkJCQkJLy8gY29uc29sZS5sb2coIldhcm5pbmc6
IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNlcXVlbmNlIik7CisJCQkJCXZfdHJhbnNfeCA9IC0gdl9w
cmV2X3k7CisJCQkJCXZfdHJhbnNfeSA9IHZfcHJldl94OworCQkJCQlzaHJpbmtfYnkgPSBNYXRo
LnNxcnQoIHZfcHJldl9sZW5zcSApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQkvLyBjb25zb2xl
LmxvZygiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc3Bpa2UiKTsKKwkJCQkJdl90cmFu
c194ID0gdl9wcmV2X3g7CisJCQkJCXZfdHJhbnNfeSA9IHZfcHJldl95OworCQkJCQlzaHJpbmtf
YnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSAvIDIgKTsKKworCQkJCX0KKworCQkJfQorCisJ
CQlyZXR1cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCAvIHNocmlua19ieSwgdl90cmFuc195IC8g
c2hyaW5rX2J5ICk7CisKKwkJfQorCisKKwkJdmFyIGNvbnRvdXJNb3ZlbWVudHMgPSBbXTsKKwor
CQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBp
ICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkgeworCisJCQlpZiAoIGogPT09IGlsICkg
aiA9IDA7CisJCQlpZiAoIGsgPT09IGlsICkgayA9IDA7CisKKwkJCS8vICAoaiktLS0oaSktLS0o
aykKKwkJCS8vIGNvbnNvbGUubG9nKCdpLGosaycsIGksIGogLCBrKQorCisJCQljb250b3VyTW92
ZW1lbnRzWyBpIF0gPSBnZXRCZXZlbFZlYyggY29udG91clsgaSBdLCBjb250b3VyWyBqIF0sIGNv
bnRvdXJbIGsgXSApOworCisJCX0KKworCQl2YXIgaG9sZXNNb3ZlbWVudHMgPSBbXSwKKwkJCW9u
ZUhvbGVNb3ZlbWVudHMsIHZlcnRpY2VzTW92ZW1lbnRzID0gY29udG91ck1vdmVtZW50cy5jb25j
YXQoKTsKKworCQlmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyAp
IHsKKworCQkJYWhvbGUgPSBob2xlc1sgaCBdOworCisJCQlvbmVIb2xlTW92ZW1lbnRzID0gW107
CisKKwkJCWZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkg
KyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7CisKKwkJCQlpZiAoIGogPT09IGlsICkg
aiA9IDA7CisJCQkJaWYgKCBrID09PSBpbCApIGsgPSAwOworCisJCQkJLy8gIChqKS0tLShpKS0t
LShrKQorCQkJCW9uZUhvbGVNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBhaG9sZVsgaSBd
LCBhaG9sZVsgaiBdLCBhaG9sZVsgayBdICk7CisKKwkJCX0KKworCQkJaG9sZXNNb3ZlbWVudHMu
cHVzaCggb25lSG9sZU1vdmVtZW50cyApOworCQkJdmVydGljZXNNb3ZlbWVudHMgPSB2ZXJ0aWNl
c01vdmVtZW50cy5jb25jYXQoIG9uZUhvbGVNb3ZlbWVudHMgKTsKKworCQl9CisKKworCQkvLyBM
b29wIGJldmVsU2VnbWVudHMsIDEgZm9yIHRoZSBmcm9udCwgMSBmb3IgdGhlIGJhY2sKKworCQlm
b3IgKCBiID0gMDsgYiA8IGJldmVsU2VnbWVudHM7IGIgKysgKSB7CisKKwkJCS8vZm9yICggYiA9
IGJldmVsU2VnbWVudHM7IGIgPiAwOyBiIC0tICkgeworCisJCQl0ID0gYiAvIGJldmVsU2VnbWVu
dHM7CisJCQl6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7
CisJCQlicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKTsKKworCQkJ
Ly8gY29udHJhY3Qgc2hhcGUKKworCQkJZm9yICggaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7
IGkgPCBpbDsgaSArKyApIHsKKworCQkJCXZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBj
b250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7CisKKwkJCQl2KCB2ZXJ0LngsIHZlcnQueSwgLSB6
ICk7CisKKwkJCX0KKworCQkJLy8gZXhwYW5kIGhvbGVzCisKKwkJCWZvciAoIGggPSAwLCBobCA9
IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkgeworCisJCQkJYWhvbGUgPSBob2xlc1sgaCBd
OworCQkJCW9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdOworCisJCQkJZm9y
ICggaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQkJdmVy
dCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7CisK
KwkJCQkJdiggdmVydC54LCB2ZXJ0LnksIC0geiApOworCisJCQkJfQorCisJCQl9CisKKwkJfQor
CisJCWJzID0gYmV2ZWxTaXplOworCisJCS8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzCisKKwkJZm9y
ICggaSA9IDA7IGkgPCB2bGVuOyBpICsrICkgeworCisJCQl2ZXJ0ID0gYmV2ZWxFbmFibGVkID8g
c2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJzICkgOiB2
ZXJ0aWNlc1sgaSBdOworCisJCQlpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHsKKworCQkJCXYoIHZl
cnQueCwgdmVydC55LCAwICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQkvLyB2KCB2ZXJ0LngsIHZl
cnQueSArIGV4dHJ1ZGVQdHNbIDAgXS55LCBleHRydWRlUHRzWyAwIF0ueCApOworCisJCQkJbm9y
bWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgMCBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQu
eCApOworCQkJCWJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyAwIF0gKS5tdWx0
aXBseVNjYWxhciggdmVydC55ICk7CisKKwkJCQlwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sg
MCBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7CisKKwkJCQl2KCBwb3NpdGlvbjIu
eCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7CisKKwkJCX0KKworCQl9CisKKwkJLy8gQWRk
IHN0ZXBwZWQgdmVydGljZXMuLi4KKwkJLy8gSW5jbHVkaW5nIGZyb250IGZhY2luZyB2ZXJ0aWNl
cworCisJCXZhciBzOworCisJCWZvciAoIHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkgeworCisJ
CQlmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7CisKKwkJCQl2ZXJ0ID0gYmV2ZWxFbmFi
bGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJz
ICkgOiB2ZXJ0aWNlc1sgaSBdOworCisJCQkJaWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7CisKKwkJ
CQkJdiggdmVydC54LCB2ZXJ0LnksIGFtb3VudCAvIHN0ZXBzICogcyApOworCisJCQkJfSBlbHNl
IHsKKworCQkJCQkvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueSwg
ZXh0cnVkZVB0c1sgcyAtIDEgXS54ICk7CisKKwkJCQkJbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUu
bm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApOworCQkJCQliaW5vcm1hbC5j
b3B5KCBzcGxpbmVUdWJlLmJpbm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSAp
OworCisJCQkJCXBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyBzIF0gKS5hZGQoIG5vcm1hbCAp
LmFkZCggYmlub3JtYWwgKTsKKworCQkJCQl2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBv
c2l0aW9uMi56ICk7CisKKwkJCQl9CisKKwkJCX0KKworCQl9CisKKworCQkvLyBBZGQgYmV2ZWwg
c2VnbWVudHMgcGxhbmVzCisKKwkJLy9mb3IgKCBiID0gMTsgYiA8PSBiZXZlbFNlZ21lbnRzOyBi
ICsrICkgeworCQlmb3IgKCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHsK
KworCQkJdCA9IGIgLyBiZXZlbFNlZ21lbnRzOworCQkJeiA9IGJldmVsVGhpY2tuZXNzICogTWF0
aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApOworCQkJYnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbigg
dCAqIE1hdGguUEkgLyAyICk7CisKKwkJCS8vIGNvbnRyYWN0IHNoYXBlCisKKwkJCWZvciAoIGkg
PSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQl2ZXJ0ID0g
c2NhbGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApOworCQkJ
CXYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7CisKKwkJCX0KKworCQkJLy8gZXhwYW5k
IGhvbGVzCisKKwkJCWZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsr
ICkgeworCisJCQkJYWhvbGUgPSBob2xlc1sgaCBdOworCQkJCW9uZUhvbGVNb3ZlbWVudHMgPSBo
b2xlc01vdmVtZW50c1sgaCBdOworCisJCQkJZm9yICggaSA9IDAsIGlsID0gYWhvbGUubGVuZ3Ro
OyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQkJdmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBv
bmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7CisKKwkJCQkJaWYgKCAhIGV4dHJ1ZGVCeVBhdGgg
KSB7CisKKwkJCQkJCXYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7CisKKwkJCQkJfSBl
bHNlIHsKKworCQkJCQkJdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzdGVwcyAtIDEg
XS55LCBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS54ICsgeiApOworCisJCQkJCX0KKworCQkJCX0K
KworCQkJfQorCisJCX0KKworCQkvKiBGYWNlcyAqLworCisJCS8vIFRvcCBhbmQgYm90dG9tIGZh
Y2VzCisKKwkJYnVpbGRMaWRGYWNlcygpOworCisJCS8vIFNpZGVzIGZhY2VzCisKKwkJYnVpbGRT
aWRlRmFjZXMoKTsKKworCisJCS8vLy8vICBJbnRlcm5hbCBmdW5jdGlvbnMKKworCQlmdW5jdGlv
biBidWlsZExpZEZhY2VzKCkgeworCisJCQl2YXIgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0
aC8zOworCisJCQlpZiAoIGJldmVsRW5hYmxlZCApIHsKKworCQkJCXZhciBsYXllciA9IDA7IC8v
IHN0ZXBzICsgMQorCQkJCXZhciBvZmZzZXQgPSB2bGVuICogbGF5ZXI7CisKKwkJCQkvLyBCb3R0
b20gZmFjZXMKKworCQkJCWZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHsKKworCQkJCQlm
YWNlID0gZmFjZXNbIGkgXTsKKwkJCQkJZjMoIGZhY2VbIDIgXSArIG9mZnNldCwgZmFjZVsgMSBd
ICsgb2Zmc2V0LCBmYWNlWyAwIF0gKyBvZmZzZXQgKTsKKworCQkJCX0KKworCQkJCWxheWVyID0g
c3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjsKKwkJCQlvZmZzZXQgPSB2bGVuICogbGF5ZXI7CisK
KwkJCQkvLyBUb3AgZmFjZXMKKworCQkJCWZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHsK
KworCQkJCQlmYWNlID0gZmFjZXNbIGkgXTsKKwkJCQkJZjMoIGZhY2VbIDAgXSArIG9mZnNldCwg
ZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAyIF0gKyBvZmZzZXQgKTsKKworCQkJCX0KKworCQkJ
fSBlbHNlIHsKKworCQkJCS8vIEJvdHRvbSBmYWNlcworCisJCQkJZm9yICggaSA9IDA7IGkgPCBm
bGVuOyBpICsrICkgeworCisJCQkJCWZhY2UgPSBmYWNlc1sgaSBdOworCQkJCQlmMyggZmFjZVsg
MiBdLCBmYWNlWyAxIF0sIGZhY2VbIDAgXSApOworCisJCQkJfQorCisJCQkJLy8gVG9wIGZhY2Vz
CisKKwkJCQlmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7CisKKwkJCQkJZmFjZSA9IGZh
Y2VzWyBpIF07CisJCQkJCWYzKCBmYWNlWyAwIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDEgXSAr
IHZsZW4gKiBzdGVwcywgZmFjZVsgMiBdICsgdmxlbiAqIHN0ZXBzICk7CisKKwkJCQl9CisKKwkJ
CX0KKworCQkJc2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aC8zIC1z
dGFydCwgb3B0aW9ucy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tYXRlcmlhbCA6
IDApOworCisJCX0KKworCQkvLyBDcmVhdGUgZmFjZXMgZm9yIHRoZSB6LXNpZGVzIG9mIHRoZSBz
aGFwZQorCisJCWZ1bmN0aW9uIGJ1aWxkU2lkZUZhY2VzKCkgeworCisJCQl2YXIgc3RhcnQgPSB2
ZXJ0aWNlc0FycmF5Lmxlbmd0aC8zOworCQkJdmFyIGxheWVyb2Zmc2V0ID0gMDsKKwkJCXNpZGV3
YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKTsKKwkJCWxheWVyb2Zmc2V0ICs9IGNvbnRvdXIu
bGVuZ3RoOworCisJCQlmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCAr
KyApIHsKKworCQkJCWFob2xlID0gaG9sZXNbIGggXTsKKwkJCQlzaWRld2FsbHMoIGFob2xlLCBs
YXllcm9mZnNldCApOworCisJCQkJLy8sIHRydWUKKwkJCQlsYXllcm9mZnNldCArPSBhaG9sZS5s
ZW5ndGg7CisKKwkJCX0KKworCisJCQlzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJy
YXkubGVuZ3RoLzMgLXN0YXJ0LCBvcHRpb25zLmV4dHJ1ZGVNYXRlcmlhbCAhPT0gdW5kZWZpbmVk
ID8gb3B0aW9ucy5leHRydWRlTWF0ZXJpYWwgOiAxKTsKKworCisJCX0KKworCQlmdW5jdGlvbiBz
aWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICkgeworCisJCQl2YXIgaiwgazsKKwkJCWkg
PSBjb250b3VyLmxlbmd0aDsKKworCQkJd2hpbGUgKCAtLSBpID49IDAgKSB7CisKKwkJCQlqID0g
aTsKKwkJCQlrID0gaSAtIDE7CisJCQkJaWYgKCBrIDwgMCApIGsgPSBjb250b3VyLmxlbmd0aCAt
IDE7CisKKwkJCQkvL2NvbnNvbGUubG9nKCdiJywgaSxqLCBpLTEsIGssdmVydGljZXMubGVuZ3Ro
KTsKKworCQkJCXZhciBzID0gMCwKKwkJCQkJc2wgPSBzdGVwcyArIGJldmVsU2VnbWVudHMgKiAy
OworCisJCQkJZm9yICggcyA9IDA7IHMgPCBzbDsgcyArKyApIHsKKworCQkJCQl2YXIgc2xlbjEg
PSB2bGVuICogczsKKwkJCQkJdmFyIHNsZW4yID0gdmxlbiAqICggcyArIDEgKTsKKworCQkJCQl2
YXIgYSA9IGxheWVyb2Zmc2V0ICsgaiArIHNsZW4xLAorCQkJCQkJYiA9IGxheWVyb2Zmc2V0ICsg
ayArIHNsZW4xLAorCQkJCQkJYyA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4yLAorCQkJCQkJZCA9
IGxheWVyb2Zmc2V0ICsgaiArIHNsZW4yOworCisJCQkJCWY0KCBhLCBiLCBjLCBkLCBjb250b3Vy
LCBzLCBzbCwgaiwgayApOworCisJCQkJfQorCisJCQl9CisKKwkJfQorCisJCWZ1bmN0aW9uIHYo
IHgsIHksIHogKSB7CisKKwkJCXBsYWNlaG9sZGVyLnB1c2goIHggKTsKKwkJCXBsYWNlaG9sZGVy
LnB1c2goIHkgKTsKKwkJCXBsYWNlaG9sZGVyLnB1c2goIHogKTsKKworCQl9CisKKworCQlmdW5j
dGlvbiBmMyggYSwgYiwgYyApIHsKKworCQkJYWRkVmVydGV4KCBhICk7CisJCQlhZGRWZXJ0ZXgo
IGIgKTsKKwkJCWFkZFZlcnRleCggYyApOworCisJCQl2YXIgbmV4dEluZGV4ID0gdmVydGljZXNB
cnJheS5sZW5ndGggLyAzOworCQkJdmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlVG9wVVYoIHNjb3Bl
LCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXgg
LSAxICk7CisKKwkJCWFkZFVWKCB1dnNbIDAgXSApOworCQkJYWRkVVYoIHV2c1sgMSBdICk7CisJ
CQlhZGRVViggdXZzWyAyIF0gKTsKKworCQl9CisKKwkJZnVuY3Rpb24gZjQoIGEsIGIsIGMsIGQs
IHdhbGxDb250b3VyLCBzdGVwSW5kZXgsIHN0ZXBzTGVuZ3RoLCBjb250b3VySW5kZXgxLCBjb250
b3VySW5kZXgyICkgeworCisJCQlhZGRWZXJ0ZXgoIGEgKTsKKwkJCWFkZFZlcnRleCggYiApOwor
CQkJYWRkVmVydGV4KCBkICk7CisKKwkJCWFkZFZlcnRleCggYiApOworCQkJYWRkVmVydGV4KCBj
ICk7CisJCQlhZGRWZXJ0ZXgoIGQgKTsKKworCisJCQl2YXIgbmV4dEluZGV4ID0gdmVydGljZXNB
cnJheS5sZW5ndGggLyAzOworCQkJdmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlU2lkZVdhbGxVVigg
c2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDYsIG5leHRJbmRleCAtIDMsIG5leHRJ
bmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTsKKworCQkJYWRkVVYoIHV2c1sgMCBdICk7CisJCQlh
ZGRVViggdXZzWyAxIF0gKTsKKwkJCWFkZFVWKCB1dnNbIDMgXSApOworCisJCQlhZGRVViggdXZz
WyAxIF0gKTsKKwkJCWFkZFVWKCB1dnNbIDIgXSApOworCQkJYWRkVVYoIHV2c1sgMyBdICk7CisK
KwkJfQorCisJCWZ1bmN0aW9uIGFkZFZlcnRleCggaW5kZXggKSB7CisKKwkJCWluZGljZXNBcnJh
eS5wdXNoKCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgKTsKKwkJCXZlcnRpY2VzQXJyYXkucHVz
aCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDAgXSApOworCQkJdmVydGljZXNBcnJheS5wdXNo
KCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMSBdICk7CisJCQl2ZXJ0aWNlc0FycmF5LnB1c2go
IHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAyIF0gKTsKKworCQl9CisKKworCQlmdW5jdGlvbiBh
ZGRVViggdmVjdG9yMiApIHsKKworCQkJdXZBcnJheS5wdXNoKCB2ZWN0b3IyLnggKTsKKwkJCXV2
QXJyYXkucHVzaCggdmVjdG9yMi55ICk7CisKKwkJfQorCisJCWlmICggISBvcHRpb25zLmFycmF5
cyApIHsKKworCQkJdGhpcy5zZXRJbmRleCggaW5kaWNlc0FycmF5ICk7CisJCQl0aGlzLmFkZEF0
dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2Vz
QXJyYXksIDMgKSApOworCQkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVm
ZmVyQXR0cmlidXRlKCBvcHRpb25zLmFycmF5cy51diwgMiApICk7CisKKwkJfQorCisJfTsKKwor
CUV4dHJ1ZGVHZW9tZXRyeS5Xb3JsZFVWR2VuZXJhdG9yID0geworCisJCWdlbmVyYXRlVG9wVVY6
IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDICkg
eworCisJCQl2YXIgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTsKKwkJCXZhciBhX3kgPSB2
ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTsKKwkJCXZhciBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhC
ICogMyBdOworCQkJdmFyIGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdOworCQkJdmFy
IGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07CisJCQl2YXIgY195ID0gdmVydGljZXNbIGlu
ZGV4QyAqIDMgKyAxIF07CisKKwkJCXJldHVybiBbCisJCQkJbmV3IFZlY3RvcjIoIGFfeCwgYV95
ICksCisJCQkJbmV3IFZlY3RvcjIoIGJfeCwgYl95ICksCisJCQkJbmV3IFZlY3RvcjIoIGNfeCwg
Y195ICkKKwkJCV07CisKKwkJfSwKKworCQlnZW5lcmF0ZVNpZGVXYWxsVVY6IGZ1bmN0aW9uICgg
Z2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDLCBpbmRleEQgKSB7CisK
KwkJCXZhciBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdOworCQkJdmFyIGFfeSA9IHZlcnRp
Y2VzWyBpbmRleEEgKiAzICsgMSBdOworCQkJdmFyIGFfeiA9IHZlcnRpY2VzWyBpbmRleEEgKiAz
ICsgMiBdOworCQkJdmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07CisJCQl2YXIgYl95
ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07CisJCQl2YXIgYl96ID0gdmVydGljZXNbIGlu
ZGV4QiAqIDMgKyAyIF07CisJCQl2YXIgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTsKKwkJ
CXZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTsKKwkJCXZhciBjX3ogPSB2ZXJ0
aWNlc1sgaW5kZXhDICogMyArIDIgXTsKKwkJCXZhciBkX3ggPSB2ZXJ0aWNlc1sgaW5kZXhEICog
MyBdOworCQkJdmFyIGRfeSA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMSBdOworCQkJdmFyIGRf
eiA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMiBdOworCisJCQlpZiAoIE1hdGguYWJzKCBhX3kg
LSBiX3kgKSA8IDAuMDEgKSB7CisKKwkJCQlyZXR1cm4gWworCQkJCQluZXcgVmVjdG9yMiggYV94
LCAxIC0gYV96ICksCisJCQkJCW5ldyBWZWN0b3IyKCBiX3gsIDEgLSBiX3ogKSwKKwkJCQkJbmV3
IFZlY3RvcjIoIGNfeCwgMSAtIGNfeiApLAorCQkJCQluZXcgVmVjdG9yMiggZF94LCAxIC0gZF96
ICkKKwkJCQldOworCisJCQl9IGVsc2UgeworCisJCQkJcmV0dXJuIFsKKwkJCQkJbmV3IFZlY3Rv
cjIoIGFfeSwgMSAtIGFfeiApLAorCQkJCQluZXcgVmVjdG9yMiggYl95LCAxIC0gYl96ICksCisJ
CQkJCW5ldyBWZWN0b3IyKCBjX3ksIDEgLSBjX3ogKSwKKwkJCQkJbmV3IFZlY3RvcjIoIGRfeSwg
MSAtIGRfeiApCisJCQkJXTsKKworCQkJfQorCisJCX0KKwl9OworCisJLyoqCisJICogQGF1dGhv
ciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZworCSAqIEBhdXRob3Ig
YWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICoKKwkgKiBUZXh0ID0gM0Qg
VGV4dAorCSAqCisJICogcGFyYW1ldGVycyA9IHsKKwkgKiAgZm9udDogPFRIUkVFLkZvbnQ+LCAv
LyBmb250CisJICoKKwkgKiAgc2l6ZTogPGZsb2F0PiwgLy8gc2l6ZSBvZiB0aGUgdGV4dAorCSAq
ICBoZWlnaHQ6IDxmbG9hdD4sIC8vIHRoaWNrbmVzcyB0byBleHRydWRlIHRleHQKKwkgKiAgY3Vy
dmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlcworCSAq
CisJICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsCisJICogIGJldmVs
VGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRleHQgYmV2ZWwgZ29lcworCSAq
ICBiZXZlbFNpemU6IDxmbG9hdD4gLy8gaG93IGZhciBmcm9tIHRleHQgb3V0bGluZSBpcyBiZXZl
bAorCSAqIH0KKwkgKi8KKworCS8vIFRleHRHZW9tZXRyeQorCisJZnVuY3Rpb24gVGV4dEdlb21l
dHJ5KCAgdGV4dCwgcGFyYW1ldGVycyApIHsKKworCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisK
KwkJdGhpcy50eXBlID0gJ1RleHRHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0gewor
CQkJdGV4dDogdGV4dCwKKwkJCXBhcmFtZXRlcnM6IHBhcmFtZXRlcnMKKwkJfTsKKworCQl0aGlz
LmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRleHRCdWZmZXJHZW9tZXRyeSggdGV4dCwgcGFyYW1l
dGVycyApICk7CisJCXRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisJfQorCisJVGV4dEdlb21ldHJ5
LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOworCVRleHRH
ZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0R2VvbWV0cnk7CisKKwkvLyBUZXh0
QnVmZmVyR2VvbWV0cnkKKworCWZ1bmN0aW9uIFRleHRCdWZmZXJHZW9tZXRyeSggdGV4dCwgcGFy
YW1ldGVycyApIHsKKworCQlwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTsKKworCQl2YXIg
Zm9udCA9IHBhcmFtZXRlcnMuZm9udDsKKworCQlpZiAoICEgKCBmb250ICYmIGZvbnQuaXNGb250
ICkgKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFy
YW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LicgKTsKKwkJCXJldHVybiBu
ZXcgR2VvbWV0cnkoKTsKKworCQl9CisKKwkJdmFyIHNoYXBlcyA9IGZvbnQuZ2VuZXJhdGVTaGFw
ZXMoIHRleHQsIHBhcmFtZXRlcnMuc2l6ZSwgcGFyYW1ldGVycy5jdXJ2ZVNlZ21lbnRzICk7CisK
KwkJLy8gdHJhbnNsYXRlIHBhcmFtZXRlcnMgdG8gRXh0cnVkZUdlb21ldHJ5IEFQSQorCisJCXBh
cmFtZXRlcnMuYW1vdW50ID0gcGFyYW1ldGVycy5oZWlnaHQgIT09IHVuZGVmaW5lZCA/IHBhcmFt
ZXRlcnMuaGVpZ2h0IDogNTA7CisKKwkJLy8gZGVmYXVsdHMKKworCQlpZiAoIHBhcmFtZXRlcnMu
YmV2ZWxUaGlja25lc3MgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxUaGlja25lc3Mg
PSAxMDsKKwkJaWYgKCBwYXJhbWV0ZXJzLmJldmVsU2l6ZSA9PT0gdW5kZWZpbmVkICkgcGFyYW1l
dGVycy5iZXZlbFNpemUgPSA4OworCQlpZiAoIHBhcmFtZXRlcnMuYmV2ZWxFbmFibGVkID09PSB1
bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9IGZhbHNlOworCisJCUV4dHJ1ZGVC
dWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCBzaGFwZXMsIHBhcmFtZXRlcnMgKTsKKworCQl0aGlz
LnR5cGUgPSAnVGV4dEJ1ZmZlckdlb21ldHJ5JzsKKworCX0KKworCVRleHRCdWZmZXJHZW9tZXRy
eS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90
eXBlICk7CisJVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRleHRC
dWZmZXJHZW9tZXRyeTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9v
Yi5jb20vCisJICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9h
X2FkYW1zCisJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcK
KwkgKi8KKworCS8vIFNwaGVyZUdlb21ldHJ5CisKKwlmdW5jdGlvbiBTcGhlcmVHZW9tZXRyeSgg
cmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0
aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CisKKwkJR2VvbWV0cnkuY2FsbCggdGhpcyAp
OworCisJCXRoaXMudHlwZSA9ICdTcGhlcmVHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJz
ID0geworCQkJcmFkaXVzOiByYWRpdXMsCisJCQl3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRz
LAorCQkJaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAorCQkJcGhpU3RhcnQ6IHBoaVN0
YXJ0LAorCQkJcGhpTGVuZ3RoOiBwaGlMZW5ndGgsCisJCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0
LAorCQkJdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoCisJCX07CisKKwkJdGhpcy5mcm9tQnVmZmVy
R2VvbWV0cnkoIG5ldyBTcGhlcmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRz
LCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFM
ZW5ndGggKSApOworCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKKworCX0KKworCVNwaGVyZUdlb21l
dHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOworCVNw
aGVyZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwaGVyZUdlb21ldHJ5OworCisJ
Ly8gU3BoZXJlQnVmZmVyR2VvbWV0cnkKKworCWZ1bmN0aW9uIFNwaGVyZUJ1ZmZlckdlb21ldHJ5
KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVu
Z3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKKworCQlCdWZmZXJHZW9tZXRyeS5jYWxs
KCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1NwaGVyZUJ1ZmZlckdlb21ldHJ5JzsKKworCQl0
aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXM6IHJhZGl1cywKKwkJCXdpZHRoU2VnbWVudHM6
IHdpZHRoU2VnbWVudHMsCisJCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCisJCQlw
aGlTdGFydDogcGhpU3RhcnQsCisJCQlwaGlMZW5ndGg6IHBoaUxlbmd0aCwKKwkJCXRoZXRhU3Rh
cnQ6IHRoZXRhU3RhcnQsCisJCQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKKwkJfTsKKworCQly
YWRpdXMgPSByYWRpdXMgfHwgNTA7CisKKwkJd2lkdGhTZWdtZW50cyA9IE1hdGgubWF4KCAzLCBN
YXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgOCApOworCQloZWlnaHRTZWdtZW50cyA9IE1h
dGgubWF4KCAyLCBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDYgKTsKKworCQlwaGlT
dGFydCA9IHBoaVN0YXJ0ICE9PSB1bmRlZmluZWQgPyBwaGlTdGFydCA6IDA7CisJCXBoaUxlbmd0
aCA9IHBoaUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gcGhpTGVuZ3RoIDogTWF0aC5QSSAqIDI7CisK
KwkJdGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAw
OworCQl0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0
aCA6IE1hdGguUEk7CisKKwkJdmFyIHRoZXRhRW5kID0gdGhldGFTdGFydCArIHRoZXRhTGVuZ3Ro
OworCisJCXZhciBpeCwgaXk7CisKKwkJdmFyIGluZGV4ID0gMDsKKwkJdmFyIGdyaWQgPSBbXTsK
KworCQl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIG5vcm1hbCA9IG5ldyBWZWN0
b3IzKCk7CisKKwkJLy8gYnVmZmVycworCisJCXZhciBpbmRpY2VzID0gW107CisJCXZhciB2ZXJ0
aWNlcyA9IFtdOworCQl2YXIgbm9ybWFscyA9IFtdOworCQl2YXIgdXZzID0gW107CisKKwkJLy8g
Z2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2cworCisJCWZvciAoIGl5ID0gMDsgaXkg
PD0gaGVpZ2h0U2VnbWVudHM7IGl5ICsrICkgeworCisJCQl2YXIgdmVydGljZXNSb3cgPSBbXTsK
KworCQkJdmFyIHYgPSBpeSAvIGhlaWdodFNlZ21lbnRzOworCisJCQlmb3IgKCBpeCA9IDA7IGl4
IDw9IHdpZHRoU2VnbWVudHM7IGl4ICsrICkgeworCisJCQkJdmFyIHUgPSBpeCAvIHdpZHRoU2Vn
bWVudHM7CisKKwkJCQkvLyB2ZXJ0ZXgKKworCQkJCXZlcnRleC54ID0gLSByYWRpdXMgKiBNYXRo
LmNvcyggcGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoICkgKiBNYXRoLnNpbiggdGhldGFTdGFydCAr
IHYgKiB0aGV0YUxlbmd0aCApOworCQkJCXZlcnRleC55ID0gcmFkaXVzICogTWF0aC5jb3MoIHRo
ZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTsKKwkJCQl2ZXJ0ZXgueiA9IHJhZGl1cyAqIE1h
dGguc2luKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0
ICsgdiAqIHRoZXRhTGVuZ3RoICk7CisKKwkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVy
dGV4LnksIHZlcnRleC56ICk7CisKKwkJCQkvLyBub3JtYWwKKworCQkJCW5vcm1hbC5zZXQoIHZl
cnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKS5ub3JtYWxpemUoKTsKKwkJCQlub3JtYWxzLnB1
c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTsKKworCQkJCS8vIHV2CisKKwkJCQl1
dnMucHVzaCggdSwgMSAtIHYgKTsKKworCQkJCXZlcnRpY2VzUm93LnB1c2goIGluZGV4ICsrICk7
CisKKwkJCX0KKworCQkJZ3JpZC5wdXNoKCB2ZXJ0aWNlc1JvdyApOworCisJCX0KKworCQkvLyBp
bmRpY2VzCisKKwkJZm9yICggaXkgPSAwOyBpeSA8IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHsK
KworCQkJZm9yICggaXggPSAwOyBpeCA8IHdpZHRoU2VnbWVudHM7IGl4ICsrICkgeworCisJCQkJ
dmFyIGEgPSBncmlkWyBpeSBdWyBpeCArIDEgXTsKKwkJCQl2YXIgYiA9IGdyaWRbIGl5IF1bIGl4
IF07CisJCQkJdmFyIGMgPSBncmlkWyBpeSArIDEgXVsgaXggXTsKKwkJCQl2YXIgZCA9IGdyaWRb
IGl5ICsgMSBdWyBpeCArIDEgXTsKKworCQkJCWlmICggaXkgIT09IDAgfHwgdGhldGFTdGFydCA+
IDAgKSBpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKKwkJCQlpZiAoIGl5ICE9PSBoZWlnaHRTZWdt
ZW50cyAtIDEgfHwgdGhldGFFbmQgPCBNYXRoLlBJICkgaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7
CisKKwkJCX0KKworCQl9CisKKwkJLy8gYnVpbGQgZ2VvbWV0cnkKKworCQl0aGlzLnNldEluZGV4
KCBpbmRpY2VzICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQz
MkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSgg
J25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKKwkJ
dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMs
IDIgKSApOworCisJfQorCisJU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0
LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisJU3BoZXJlQnVmZmVyR2VvbWV0
cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BoZXJlQnVmZmVyR2VvbWV0cnk7CisKKwkvKioK
KwkgKiBAYXV0aG9yIEthbGViIE11cnBoeQorCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8v
Z2l0aHViLmNvbS9NdWdlbjg3CisJICovCisKKwkvLyBSaW5nR2VvbWV0cnkKKworCWZ1bmN0aW9u
IFJpbmdHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBw
aGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CisKKwkJR2VvbWV0cnkuY2Fs
bCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdSaW5nR2VvbWV0cnknOworCisJCXRoaXMucGFy
YW1ldGVycyA9IHsKKwkJCWlubmVyUmFkaXVzOiBpbm5lclJhZGl1cywKKwkJCW91dGVyUmFkaXVz
OiBvdXRlclJhZGl1cywKKwkJCXRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsCisJCQlwaGlT
ZWdtZW50czogcGhpU2VnbWVudHMsCisJCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAorCQkJdGhl
dGFMZW5ndGg6IHRoZXRhTGVuZ3RoCisJCX07CisKKwkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnko
IG5ldyBSaW5nQnVmZmVyR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFT
ZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTsKKwkJdGhp
cy5tZXJnZVZlcnRpY2VzKCk7CisKKwl9CisKKwlSaW5nR2VvbWV0cnkucHJvdG90eXBlID0gT2Jq
ZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisJUmluZ0dlb21ldHJ5LnByb3RvdHlw
ZS5jb25zdHJ1Y3RvciA9IFJpbmdHZW9tZXRyeTsKKworCS8vIFJpbmdCdWZmZXJHZW9tZXRyeQor
CisJZnVuY3Rpb24gUmluZ0J1ZmZlckdlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMs
IHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsK
KworCQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1JpbmdC
dWZmZXJHZW9tZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJaW5uZXJSYWRpdXM6
IGlubmVyUmFkaXVzLAorCQkJb3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLAorCQkJdGhldGFTZWdt
ZW50czogdGhldGFTZWdtZW50cywKKwkJCXBoaVNlZ21lbnRzOiBwaGlTZWdtZW50cywKKwkJCXRo
ZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCisJCQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKKwkJfTsK
KworCQlpbm5lclJhZGl1cyA9IGlubmVyUmFkaXVzIHx8IDIwOworCQlvdXRlclJhZGl1cyA9IG91
dGVyUmFkaXVzIHx8IDUwOworCisJCXRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmlu
ZWQgPyB0aGV0YVN0YXJ0IDogMDsKKwkJdGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5k
ZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjsKKworCQl0aGV0YVNlZ21lbnRzID0g
dGhldGFTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDMsIHRoZXRhU2VnbWVudHMg
KSA6IDg7CisJCXBoaVNlZ21lbnRzID0gcGhpU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgu
bWF4KCAxLCBwaGlTZWdtZW50cyApIDogMTsKKworCQkvLyBidWZmZXJzCisKKwkJdmFyIGluZGlj
ZXMgPSBbXTsKKwkJdmFyIHZlcnRpY2VzID0gW107CisJCXZhciBub3JtYWxzID0gW107CisJCXZh
ciB1dnMgPSBbXTsKKworCQkvLyBzb21lIGhlbHBlciB2YXJpYWJsZXMKKworCQl2YXIgc2VnbWVu
dDsKKwkJdmFyIHJhZGl1cyA9IGlubmVyUmFkaXVzOworCQl2YXIgcmFkaXVzU3RlcCA9ICggKCBv
dXRlclJhZGl1cyAtIGlubmVyUmFkaXVzICkgLyBwaGlTZWdtZW50cyApOworCQl2YXIgdmVydGV4
ID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIHV2ID0gbmV3IFZlY3RvcjIoKTsKKwkJdmFyIGosIGk7
CisKKwkJLy8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2cworCisJCWZvciAoIGog
PSAwOyBqIDw9IHBoaVNlZ21lbnRzOyBqICsrICkgeworCisJCQlmb3IgKCBpID0gMDsgaSA8PSB0
aGV0YVNlZ21lbnRzOyBpICsrICkgeworCisJCQkJLy8gdmFsdWVzIGFyZSBnZW5lcmF0ZSBmcm9t
IHRoZSBpbnNpZGUgb2YgdGhlIHJpbmcgdG8gdGhlIG91dHNpZGUKKworCQkJCXNlZ21lbnQgPSB0
aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDsKKworCQkJCS8vIHZl
cnRleAorCisJCQkJdmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApOworCQkJ
CXZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTsKKworCQkJCXZlcnRpY2Vz
LnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworCQkJCS8vIG5vcm1hbAor
CisJCQkJbm9ybWFscy5wdXNoKCAwLCAwLCAxICk7CisKKwkJCQkvLyB1dgorCisJCQkJdXYueCA9
ICggdmVydGV4LnggLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7CisJCQkJdXYueSA9ICggdmVydGV4
LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7CisKKwkJCQl1dnMucHVzaCggdXYueCwgdXYueSAp
OworCisJCQl9CisKKwkJCS8vIGluY3JlYXNlIHRoZSByYWRpdXMgZm9yIG5leHQgcm93IG9mIHZl
cnRpY2VzCisKKwkJCXJhZGl1cyArPSByYWRpdXNTdGVwOworCisJCX0KKworCQkvLyBpbmRpY2Vz
CisKKwkJZm9yICggaiA9IDA7IGogPCBwaGlTZWdtZW50czsgaiArKyApIHsKKworCQkJdmFyIHRo
ZXRhU2VnbWVudExldmVsID0gaiAqICggdGhldGFTZWdtZW50cyArIDEgKTsKKworCQkJZm9yICgg
aSA9IDA7IGkgPCB0aGV0YVNlZ21lbnRzOyBpICsrICkgeworCisJCQkJc2VnbWVudCA9IGkgKyB0
aGV0YVNlZ21lbnRMZXZlbDsKKworCQkJCXZhciBhID0gc2VnbWVudDsKKwkJCQl2YXIgYiA9IHNl
Z21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMTsKKwkJCQl2YXIgYyA9IHNlZ21lbnQgKyB0aGV0YVNl
Z21lbnRzICsgMjsKKwkJCQl2YXIgZCA9IHNlZ21lbnQgKyAxOworCisJCQkJLy8gZmFjZXMKKwor
CQkJCWluZGljZXMucHVzaCggYSwgYiwgZCApOworCQkJCWluZGljZXMucHVzaCggYiwgYywgZCAp
OworCisJCQl9CisKKwkJfQorCisJCS8vIGJ1aWxkIGdlb21ldHJ5CisKKwkJdGhpcy5zZXRJbmRl
eCggaW5kaWNlcyApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0
MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKwkJdGhpcy5hZGRBdHRyaWJ1dGUo
ICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CisJ
CXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZz
LCAyICkgKTsKKworCX0KKworCVJpbmdCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3Qu
Y3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlSaW5nQnVmZmVyR2VvbWV0cnku
cHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0J1ZmZlckdlb21ldHJ5OworCisJLyoqCisJICog
QGF1dGhvciBhc3Ryb2R1ZCAvIGh0dHA6Ly9hc3Ryb2R1ZC5pc2dyZWF0Lm9yZy8KKwkgKiBAYXV0
aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NQorCSAqIEBhdXRob3IgYmhvdXN0b24g
LyBodHRwOi8vY2xhcmEuaW8KKwkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5j
b20vTXVnZW44NworCSAqLworCisJLy8gTGF0aGVHZW9tZXRyeQorCisJZnVuY3Rpb24gTGF0aGVH
ZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApIHsKKworCQlH
ZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ0xhdGhlR2VvbWV0cnknOwor
CisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXBvaW50czogcG9pbnRzLAorCQkJc2VnbWVudHM6
IHNlZ21lbnRzLAorCQkJcGhpU3RhcnQ6IHBoaVN0YXJ0LAorCQkJcGhpTGVuZ3RoOiBwaGlMZW5n
dGgKKwkJfTsKKworCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IExhdGhlQnVmZmVyR2Vv
bWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSApOworCQl0aGlz
Lm1lcmdlVmVydGljZXMoKTsKKworCX0KKworCUxhdGhlR2VvbWV0cnkucHJvdG90eXBlID0gT2Jq
ZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisJTGF0aGVHZW9tZXRyeS5wcm90b3R5
cGUuY29uc3RydWN0b3IgPSBMYXRoZUdlb21ldHJ5OworCisJLy8gTGF0aGVCdWZmZXJHZW9tZXRy
eQorCisJZnVuY3Rpb24gTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhp
U3RhcnQsIHBoaUxlbmd0aCApIHsKKworCQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisK
KwkJdGhpcy50eXBlID0gJ0xhdGhlQnVmZmVyR2VvbWV0cnknOworCisJCXRoaXMucGFyYW1ldGVy
cyA9IHsKKwkJCXBvaW50czogcG9pbnRzLAorCQkJc2VnbWVudHM6IHNlZ21lbnRzLAorCQkJcGhp
U3RhcnQ6IHBoaVN0YXJ0LAorCQkJcGhpTGVuZ3RoOiBwaGlMZW5ndGgKKwkJfTsKKworCQlzZWdt
ZW50cyA9IE1hdGguZmxvb3IoIHNlZ21lbnRzICkgfHwgMTI7CisJCXBoaVN0YXJ0ID0gcGhpU3Rh
cnQgfHwgMDsKKwkJcGhpTGVuZ3RoID0gcGhpTGVuZ3RoIHx8IE1hdGguUEkgKiAyOworCisJCS8v
IGNsYW1wIHBoaUxlbmd0aCBzbyBpdCdzIGluIHJhbmdlIG9mIFsgMCwgMlBJIF0KKworCQlwaGlM
ZW5ndGggPSBfTWF0aC5jbGFtcCggcGhpTGVuZ3RoLCAwLCBNYXRoLlBJICogMiApOworCisKKwkJ
Ly8gYnVmZmVycworCisJCXZhciBpbmRpY2VzID0gW107CisJCXZhciB2ZXJ0aWNlcyA9IFtdOwor
CQl2YXIgdXZzID0gW107CisKKwkJLy8gaGVscGVyIHZhcmlhYmxlcworCisJCXZhciBiYXNlOwor
CQl2YXIgaW52ZXJzZVNlZ21lbnRzID0gMS4wIC8gc2VnbWVudHM7CisJCXZhciB2ZXJ0ZXggPSBu
ZXcgVmVjdG9yMygpOworCQl2YXIgdXYgPSBuZXcgVmVjdG9yMigpOworCQl2YXIgaSwgajsKKwor
CQkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBhbmQgdXZzCisKKwkJZm9yICggaSA9IDA7IGkgPD0gc2Vn
bWVudHM7IGkgKysgKSB7CisKKwkJCXZhciBwaGkgPSBwaGlTdGFydCArIGkgKiBpbnZlcnNlU2Vn
bWVudHMgKiBwaGlMZW5ndGg7CisKKwkJCXZhciBzaW4gPSBNYXRoLnNpbiggcGhpICk7CisJCQl2
YXIgY29zID0gTWF0aC5jb3MoIHBoaSApOworCisJCQlmb3IgKCBqID0gMDsgaiA8PSAoIHBvaW50
cy5sZW5ndGggLSAxICk7IGogKysgKSB7CisKKwkJCQkvLyB2ZXJ0ZXgKKworCQkJCXZlcnRleC54
ID0gcG9pbnRzWyBqIF0ueCAqIHNpbjsKKwkJCQl2ZXJ0ZXgueSA9IHBvaW50c1sgaiBdLnk7CisJ
CQkJdmVydGV4LnogPSBwb2ludHNbIGogXS54ICogY29zOworCisJCQkJdmVydGljZXMucHVzaCgg
dmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisJCQkJLy8gdXYKKworCQkJCXV2Lngg
PSBpIC8gc2VnbWVudHM7CisJCQkJdXYueSA9IGogLyAoIHBvaW50cy5sZW5ndGggLSAxICk7CisK
KwkJCQl1dnMucHVzaCggdXYueCwgdXYueSApOworCisKKwkJCX0KKworCQl9CisKKwkJLy8gaW5k
aWNlcworCisJCWZvciAoIGkgPSAwOyBpIDwgc2VnbWVudHM7IGkgKysgKSB7CisKKwkJCWZvciAo
IGogPSAwOyBqIDwgKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkgeworCisJCQkJYmFzZSA9
IGogKyBpICogcG9pbnRzLmxlbmd0aDsKKworCQkJCXZhciBhID0gYmFzZTsKKwkJCQl2YXIgYiA9
IGJhc2UgKyBwb2ludHMubGVuZ3RoOworCQkJCXZhciBjID0gYmFzZSArIHBvaW50cy5sZW5ndGgg
KyAxOworCQkJCXZhciBkID0gYmFzZSArIDE7CisKKwkJCQkvLyBmYWNlcworCisJCQkJaW5kaWNl
cy5wdXNoKCBhLCBiLCBkICk7CisJCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CisKKwkJCX0K
KworCQl9CisKKwkJLy8gYnVpbGQgZ2VvbWV0cnkKKworCQl0aGlzLnNldEluZGV4KCBpbmRpY2Vz
ICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0
dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3
IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CisKKwkJLy8gZ2VuZXJhdGUgbm9y
bWFscworCisJCXRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsKKworCQkvLyBpZiB0aGUgZ2Vv
bWV0cnkgaXMgY2xvc2VkLCB3ZSBuZWVkIHRvIGF2ZXJhZ2UgdGhlIG5vcm1hbHMgYWxvbmcgdGhl
IHNlYW0uCisJCS8vIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGljZXMgYXJlIGlkZW50
aWNhbCAoYnV0IHN0aWxsIGhhdmUgZGlmZmVyZW50IFVWcykuCisKKwkJaWYgKCBwaGlMZW5ndGgg
PT09IE1hdGguUEkgKiAyICkgeworCisJCQl2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5u
b3JtYWwuYXJyYXk7CisJCQl2YXIgbjEgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIG4yID0gbmV3
IFZlY3RvcjMoKTsKKwkJCXZhciBuID0gbmV3IFZlY3RvcjMoKTsKKworCQkJLy8gdGhpcyBpcyB0
aGUgYnVmZmVyIG9mZnNldCBmb3IgdGhlIGxhc3QgbGluZSBvZiB2ZXJ0aWNlcworCisJCQliYXNl
ID0gc2VnbWVudHMgKiBwb2ludHMubGVuZ3RoICogMzsKKworCQkJZm9yICggaSA9IDAsIGogPSAw
OyBpIDwgcG9pbnRzLmxlbmd0aDsgaSArKywgaiArPSAzICkgeworCisJCQkJLy8gc2VsZWN0IHRo
ZSBub3JtYWwgb2YgdGhlIHZlcnRleCBpbiB0aGUgZmlyc3QgbGluZQorCisJCQkJbjEueCA9IG5v
cm1hbHNbIGogKyAwIF07CisJCQkJbjEueSA9IG5vcm1hbHNbIGogKyAxIF07CisJCQkJbjEueiA9
IG5vcm1hbHNbIGogKyAyIF07CisKKwkJCQkvLyBzZWxlY3QgdGhlIG5vcm1hbCBvZiB0aGUgdmVy
dGV4IGluIHRoZSBsYXN0IGxpbmUKKworCQkJCW4yLnggPSBub3JtYWxzWyBiYXNlICsgaiArIDAg
XTsKKwkJCQluMi55ID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF07CisJCQkJbjIueiA9IG5vcm1h
bHNbIGJhc2UgKyBqICsgMiBdOworCisJCQkJLy8gYXZlcmFnZSBub3JtYWxzCisKKwkJCQluLmFk
ZFZlY3RvcnMoIG4xLCBuMiApLm5vcm1hbGl6ZSgpOworCisJCQkJLy8gYXNzaWduIHRoZSBuZXcg
dmFsdWVzIHRvIGJvdGggbm9ybWFscworCisJCQkJbm9ybWFsc1sgaiArIDAgXSA9IG5vcm1hbHNb
IGJhc2UgKyBqICsgMCBdID0gbi54OworCQkJCW5vcm1hbHNbIGogKyAxIF0gPSBub3JtYWxzWyBi
YXNlICsgaiArIDEgXSA9IG4ueTsKKwkJCQlub3JtYWxzWyBqICsgMiBdID0gbm9ybWFsc1sgYmFz
ZSArIGogKyAyIF0gPSBuLno7CisKKwkJCX0KKworCQl9CisKKwl9CisKKwlMYXRoZUJ1ZmZlckdl
b21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlw
ZSApOworCUxhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVC
dWZmZXJHZW9tZXRyeTsKKworCS8qKgorCSAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25v
YnIxLmNvbQorCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3
CisJICovCisKKwkvLyBTaGFwZUdlb21ldHJ5CisKKwlmdW5jdGlvbiBTaGFwZUdlb21ldHJ5KCBz
aGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7CisKKwkJR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJ
CXRoaXMudHlwZSA9ICdTaGFwZUdlb21ldHJ5JzsKKworCQlpZiAoIHR5cGVvZiBjdXJ2ZVNlZ21l
bnRzID09PSAnb2JqZWN0JyApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGVHZW9t
ZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKwkJCWN1cnZl
U2VnbWVudHMgPSBjdXJ2ZVNlZ21lbnRzLmN1cnZlU2VnbWVudHM7CisKKwkJfQorCisJCXRoaXMu
cGFyYW1ldGVycyA9IHsKKwkJCXNoYXBlczogc2hhcGVzLAorCQkJY3VydmVTZWdtZW50czogY3Vy
dmVTZWdtZW50cworCQl9OworCisJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU2hhcGVC
dWZmZXJHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkgKTsKKwkJdGhpcy5tZXJnZVZl
cnRpY2VzKCk7CisKKwl9CisKKwlTaGFwZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVh
dGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOworCVNoYXBlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0
cnVjdG9yID0gU2hhcGVHZW9tZXRyeTsKKworCS8vIFNoYXBlQnVmZmVyR2VvbWV0cnkKKworCWZ1
bmN0aW9uIFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApIHsKKwor
CQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ1NoYXBlQnVm
ZmVyR2VvbWV0cnknOworCisJCXRoaXMucGFyYW1ldGVycyA9IHsKKwkJCXNoYXBlczogc2hhcGVz
LAorCQkJY3VydmVTZWdtZW50czogY3VydmVTZWdtZW50cworCQl9OworCisJCWN1cnZlU2VnbWVu
dHMgPSBjdXJ2ZVNlZ21lbnRzIHx8IDEyOworCisJCS8vIGJ1ZmZlcnMKKworCQl2YXIgaW5kaWNl
cyA9IFtdOworCQl2YXIgdmVydGljZXMgPSBbXTsKKwkJdmFyIG5vcm1hbHMgPSBbXTsKKwkJdmFy
IHV2cyA9IFtdOworCisJCS8vIGhlbHBlciB2YXJpYWJsZXMKKworCQl2YXIgZ3JvdXBTdGFydCA9
IDA7CisJCXZhciBncm91cENvdW50ID0gMDsKKworCQkvLyBhbGxvdyBzaW5nbGUgYW5kIGFycmF5
IHZhbHVlcyBmb3IgInNoYXBlcyIgcGFyYW1ldGVyCisKKwkJaWYgKCBBcnJheS5pc0FycmF5KCBz
aGFwZXMgKSA9PT0gZmFsc2UgKSB7CisKKwkJCWFkZFNoYXBlKCBzaGFwZXMgKTsKKworCQl9IGVs
c2UgeworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpICsrICkgewor
CisJCQkJYWRkU2hhcGUoIHNoYXBlc1sgaSBdICk7CisKKwkJCQl0aGlzLmFkZEdyb3VwKCBncm91
cFN0YXJ0LCBncm91cENvdW50LCBpICk7IC8vIGVuYWJsZXMgTXVsdGlNYXRlcmlhbCBzdXBwb3J0
CisKKwkJCQlncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7CisJCQkJZ3JvdXBDb3VudCA9IDA7CisK
KwkJCX0KKworCQl9CisKKwkJLy8gYnVpbGQgZ2VvbWV0cnkKKworCQl0aGlzLnNldEluZGV4KCBp
bmRpY2VzICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1
ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ25v
cm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKKwkJdGhp
cy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIg
KSApOworCisKKwkJLy8gaGVscGVyIGZ1bmN0aW9ucworCisJCWZ1bmN0aW9uIGFkZFNoYXBlKCBz
aGFwZSApIHsKKworCQkJdmFyIGksIGwsIHNoYXBlSG9sZTsKKworCQkJdmFyIGluZGV4T2Zmc2V0
ID0gdmVydGljZXMubGVuZ3RoIC8gMzsKKwkJCXZhciBwb2ludHMgPSBzaGFwZS5leHRyYWN0UG9p
bnRzKCBjdXJ2ZVNlZ21lbnRzICk7CisKKwkJCXZhciBzaGFwZVZlcnRpY2VzID0gcG9pbnRzLnNo
YXBlOworCQkJdmFyIHNoYXBlSG9sZXMgPSBwb2ludHMuaG9sZXM7CisKKwkJCS8vIGNoZWNrIGRp
cmVjdGlvbiBvZiB2ZXJ0aWNlcworCisJCQlpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNo
YXBlVmVydGljZXMgKSA9PT0gZmFsc2UgKSB7CisKKwkJCQlzaGFwZVZlcnRpY2VzID0gc2hhcGVW
ZXJ0aWNlcy5yZXZlcnNlKCk7CisKKwkJCQkvLyBhbHNvIGNoZWNrIGlmIGhvbGVzIGFyZSBpbiB0
aGUgb3Bwb3NpdGUgZGlyZWN0aW9uCisKKwkJCQlmb3IgKCBpID0gMCwgbCA9IHNoYXBlSG9sZXMu
bGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCQlzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBp
IF07CisKKwkJCQkJaWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZUhvbGUgKSA9PT0g
dHJ1ZSApIHsKKworCQkJCQkJc2hhcGVIb2xlc1sgaSBdID0gc2hhcGVIb2xlLnJldmVyc2UoKTsK
KworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQkJdmFyIGZhY2VzID0gU2hhcGVVdGlscy50
cmlhbmd1bGF0ZVNoYXBlKCBzaGFwZVZlcnRpY2VzLCBzaGFwZUhvbGVzICk7CisKKwkJCS8vIGpv
aW4gdmVydGljZXMgb2YgaW5uZXIgYW5kIG91dGVyIHBhdGhzIHRvIGEgc2luZ2xlIGFycmF5CisK
KwkJCWZvciAoIGkgPSAwLCBsID0gc2hhcGVIb2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewor
CisJCQkJc2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdOworCQkJCXNoYXBlVmVydGljZXMgPSBz
aGFwZVZlcnRpY2VzLmNvbmNhdCggc2hhcGVIb2xlICk7CisKKwkJCX0KKworCQkJLy8gdmVydGlj
ZXMsIG5vcm1hbHMsIHV2cworCisJCQlmb3IgKCBpID0gMCwgbCA9IHNoYXBlVmVydGljZXMubGVu
Z3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCXZhciB2ZXJ0ZXggPSBzaGFwZVZlcnRpY2VzWyBp
IF07CisKKwkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIDAgKTsKKwkJCQlu
b3JtYWxzLnB1c2goIDAsIDAsIDEgKTsKKwkJCQl1dnMucHVzaCggdmVydGV4LngsIHZlcnRleC55
ICk7IC8vIHdvcmxkIHV2cworCisJCQl9CisKKwkJCS8vIGluY2lkZXMKKworCQkJZm9yICggaSA9
IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJdmFyIGZhY2UgPSBm
YWNlc1sgaSBdOworCisJCQkJdmFyIGEgPSBmYWNlWyAwIF0gKyBpbmRleE9mZnNldDsKKwkJCQl2
YXIgYiA9IGZhY2VbIDEgXSArIGluZGV4T2Zmc2V0OworCQkJCXZhciBjID0gZmFjZVsgMiBdICsg
aW5kZXhPZmZzZXQ7CisKKwkJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGMgKTsKKwkJCQlncm91cENv
dW50ICs9IDM7CisKKwkJCX0KKworCQl9CisKKwl9CisKKwlTaGFwZUJ1ZmZlckdlb21ldHJ5LnBy
b3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOworCVNo
YXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVCdWZmZXJHZW9t
ZXRyeTsKKworCS8qKgorCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNv
bS9XZXN0TGFuZ2xleQorCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9N
dWdlbjg3CisJICovCisKKwlmdW5jdGlvbiBFZGdlc0dlb21ldHJ5KCBnZW9tZXRyeSwgdGhyZXNo
b2xkQW5nbGUgKSB7CisKKwkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMu
dHlwZSA9ICdFZGdlc0dlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQl0aHJl
c2hvbGRBbmdsZTogdGhyZXNob2xkQW5nbGUKKwkJfTsKKworCQl0aHJlc2hvbGRBbmdsZSA9ICgg
dGhyZXNob2xkQW5nbGUgIT09IHVuZGVmaW5lZCApID8gdGhyZXNob2xkQW5nbGUgOiAxOworCisJ
CS8vIGJ1ZmZlcgorCisJCXZhciB2ZXJ0aWNlcyA9IFtdOworCisJCS8vIGhlbHBlciB2YXJpYWJs
ZXMKKworCQl2YXIgdGhyZXNob2xkRG90ID0gTWF0aC5jb3MoIF9NYXRoLkRFRzJSQUQgKiB0aHJl
c2hvbGRBbmdsZSApOworCQl2YXIgZWRnZSA9IFsgMCwgMCBdLCBlZGdlcyA9IHt9LCBlZGdlMSwg
ZWRnZTI7CisJCXZhciBrZXksIGtleXMgPSBbICdhJywgJ2InLCAnYycgXTsKKworCQkvLyBwcmVw
YXJlIHNvdXJjZSBnZW9tZXRyeQorCisJCXZhciBnZW9tZXRyeTI7CisKKwkJaWYgKCBnZW9tZXRy
eS5pc0J1ZmZlckdlb21ldHJ5ICkgeworCisJCQlnZW9tZXRyeTIgPSBuZXcgR2VvbWV0cnkoKTsK
KwkJCWdlb21ldHJ5Mi5mcm9tQnVmZmVyR2VvbWV0cnkoIGdlb21ldHJ5ICk7CisKKwkJfSBlbHNl
IHsKKworCQkJZ2VvbWV0cnkyID0gZ2VvbWV0cnkuY2xvbmUoKTsKKworCQl9CisKKwkJZ2VvbWV0
cnkyLm1lcmdlVmVydGljZXMoKTsKKwkJZ2VvbWV0cnkyLmNvbXB1dGVGYWNlTm9ybWFscygpOwor
CisJCXZhciBzb3VyY2VWZXJ0aWNlcyA9IGdlb21ldHJ5Mi52ZXJ0aWNlczsKKwkJdmFyIGZhY2Vz
ID0gZ2VvbWV0cnkyLmZhY2VzOworCisJCS8vIG5vdyBjcmVhdGUgYSBkYXRhIHN0cnVjdHVyZSB3
aGVyZSBlYWNoIGVudHJ5IHJlcHJlc2VudHMgYW4gZWRnZSB3aXRoIGl0cyBhZGpvaW5pbmcgZmFj
ZXMKKworCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkg
eworCisJCQl2YXIgZmFjZSA9IGZhY2VzWyBpIF07CisKKwkJCWZvciAoIHZhciBqID0gMDsgaiA8
IDM7IGogKysgKSB7CisKKwkJCQllZGdlMSA9IGZhY2VbIGtleXNbIGogXSBdOworCQkJCWVkZ2Uy
ID0gZmFjZVsga2V5c1sgKCBqICsgMSApICUgMyBdIF07CisJCQkJZWRnZVsgMCBdID0gTWF0aC5t
aW4oIGVkZ2UxLCBlZGdlMiApOworCQkJCWVkZ2VbIDEgXSA9IE1hdGgubWF4KCBlZGdlMSwgZWRn
ZTIgKTsKKworCQkJCWtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTsKKworCQkJCWlm
ICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJZWRnZXNbIGtleSBdID0g
eyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0sIGZhY2UxOiBpLCBmYWNlMjog
dW5kZWZpbmVkIH07CisKKwkJCQl9IGVsc2UgeworCisJCQkJCWVkZ2VzWyBrZXkgXS5mYWNlMiA9
IGk7CisKKwkJCQl9CisKKwkJCX0KKworCQl9CisKKwkJLy8gZ2VuZXJhdGUgdmVydGljZXMKKwor
CQlmb3IgKCBrZXkgaW4gZWRnZXMgKSB7CisKKwkJCXZhciBlID0gZWRnZXNbIGtleSBdOworCisJ
CQkvLyBhbiBlZGdlIGlzIG9ubHkgcmVuZGVyZWQgaWYgdGhlIGFuZ2xlIChpbiBkZWdyZWVzKSBi
ZXR3ZWVuIHRoZSBmYWNlIG5vcm1hbHMgb2YgdGhlIGFkam9pbmluZyBmYWNlcyBleGNlZWRzIHRo
aXMgdmFsdWUuIGRlZmF1bHQgPSAxIGRlZ3JlZS4KKworCQkJaWYgKCBlLmZhY2UyID09PSB1bmRl
ZmluZWQgfHwgZmFjZXNbIGUuZmFjZTEgXS5ub3JtYWwuZG90KCBmYWNlc1sgZS5mYWNlMiBdLm5v
cm1hbCApIDw9IHRocmVzaG9sZERvdCApIHsKKworCQkJCXZhciB2ZXJ0ZXggPSBzb3VyY2VWZXJ0
aWNlc1sgZS5pbmRleDEgXTsKKwkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4Lnks
IHZlcnRleC56ICk7CisKKwkJCQl2ZXJ0ZXggPSBzb3VyY2VWZXJ0aWNlc1sgZS5pbmRleDIgXTsK
KwkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CisKKwkJ
CX0KKworCQl9CisKKwkJLy8gYnVpbGQgZ2VvbWV0cnkKKworCQl0aGlzLmFkZEF0dHJpYnV0ZSgg
J3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsK
KworCX0KKworCUVkZ2VzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVy
R2VvbWV0cnkucHJvdG90eXBlICk7CisJRWRnZXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0
b3IgPSBFZGdlc0dlb21ldHJ5OworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8v
bXJkb29iLmNvbS8KKwkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVn
ZW44NworCSAqLworCisJLy8gQ3lsaW5kZXJHZW9tZXRyeQorCisJZnVuY3Rpb24gQ3lsaW5kZXJH
ZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMs
IGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgewor
CisJCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnQ3lsaW5kZXJHZW9t
ZXRyeSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJcmFkaXVzVG9wOiByYWRpdXNUb3As
CisJCQlyYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSwKKwkJCWhlaWdodDogaGVpZ2h0LAorCQkJ
cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLAorCQkJaGVpZ2h0U2VnbWVudHM6IGhlaWdo
dFNlZ21lbnRzLAorCQkJb3BlbkVuZGVkOiBvcGVuRW5kZWQsCisJCQl0aGV0YVN0YXJ0OiB0aGV0
YVN0YXJ0LAorCQkJdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoCisJCX07CisKKwkJdGhpcy5mcm9t
QnVmZmVyR2VvbWV0cnkoIG5ldyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJh
ZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5F
bmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApOworCQl0aGlzLm1lcmdlVmVydGljZXMo
KTsKKworCX0KKworCUN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSgg
R2VvbWV0cnkucHJvdG90eXBlICk7CisJQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3Ry
dWN0b3IgPSBDeWxpbmRlckdlb21ldHJ5OworCisJLy8gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeQor
CisJZnVuY3Rpb24gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0
b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRo
ZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgeworCisJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMg
KTsKKworCQl0aGlzLnR5cGUgPSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc7CisKKwkJdGhpcy5w
YXJhbWV0ZXJzID0geworCQkJcmFkaXVzVG9wOiByYWRpdXNUb3AsCisJCQlyYWRpdXNCb3R0b206
IHJhZGl1c0JvdHRvbSwKKwkJCWhlaWdodDogaGVpZ2h0LAorCQkJcmFkaWFsU2VnbWVudHM6IHJh
ZGlhbFNlZ21lbnRzLAorCQkJaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAorCQkJb3Bl
bkVuZGVkOiBvcGVuRW5kZWQsCisJCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAorCQkJdGhldGFM
ZW5ndGg6IHRoZXRhTGVuZ3RoCisJCX07CisKKwkJdmFyIHNjb3BlID0gdGhpczsKKworCQlyYWRp
dXNUb3AgPSByYWRpdXNUb3AgIT09IHVuZGVmaW5lZCA/IHJhZGl1c1RvcCA6IDIwOworCQlyYWRp
dXNCb3R0b20gPSByYWRpdXNCb3R0b20gIT09IHVuZGVmaW5lZCA/IHJhZGl1c0JvdHRvbSA6IDIw
OworCQloZWlnaHQgPSBoZWlnaHQgIT09IHVuZGVmaW5lZCA/IGhlaWdodCA6IDEwMDsKKworCQly
YWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODsKKwkJaGVp
Z2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7CisKKwkJb3Bl
bkVuZGVkID0gb3BlbkVuZGVkICE9PSB1bmRlZmluZWQgPyBvcGVuRW5kZWQgOiBmYWxzZTsKKwkJ
dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwLjA7
CisJCXRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3Ro
IDogMi4wICogTWF0aC5QSTsKKworCQkvLyBidWZmZXJzCisKKwkJdmFyIGluZGljZXMgPSBbXTsK
KwkJdmFyIHZlcnRpY2VzID0gW107CisJCXZhciBub3JtYWxzID0gW107CisJCXZhciB1dnMgPSBb
XTsKKworCQkvLyBoZWxwZXIgdmFyaWFibGVzCisKKwkJdmFyIGluZGV4ID0gMDsKKwkJdmFyIGlu
ZGV4QXJyYXkgPSBbXTsKKwkJdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyOworCQl2YXIgZ3Jv
dXBTdGFydCA9IDA7CisKKwkJLy8gZ2VuZXJhdGUgZ2VvbWV0cnkKKworCQlnZW5lcmF0ZVRvcnNv
KCk7CisKKwkJaWYgKCBvcGVuRW5kZWQgPT09IGZhbHNlICkgeworCisJCQlpZiAoIHJhZGl1c1Rv
cCA+IDAgKSBnZW5lcmF0ZUNhcCggdHJ1ZSApOworCQkJaWYgKCByYWRpdXNCb3R0b20gPiAwICkg
Z2VuZXJhdGVDYXAoIGZhbHNlICk7CisKKwkJfQorCisJCS8vIGJ1aWxkIGdlb21ldHJ5CisKKwkJ
dGhpcy5zZXRJbmRleCggaW5kaWNlcyApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9u
JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKwkJdGhpcy5h
ZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFs
cywgMyApICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0
dHJpYnV0ZSggdXZzLCAyICkgKTsKKworCQlmdW5jdGlvbiBnZW5lcmF0ZVRvcnNvKCkgeworCisJ
CQl2YXIgeCwgeTsKKwkJCXZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIHZlcnRl
eCA9IG5ldyBWZWN0b3IzKCk7CisKKwkJCXZhciBncm91cENvdW50ID0gMDsKKworCQkJLy8gdGhp
cyB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWwKKwkJCXZhciBzbG9wZSA9ICgg
cmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgLyBoZWlnaHQ7CisKKwkJCS8vIGdlbmVyYXRlIHZl
cnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKKworCQkJZm9yICggeSA9IDA7IHkgPD0gaGVpZ2h0U2Vn
bWVudHM7IHkgKysgKSB7CisKKwkJCQl2YXIgaW5kZXhSb3cgPSBbXTsKKworCQkJCXZhciB2ID0g
eSAvIGhlaWdodFNlZ21lbnRzOworCisJCQkJLy8gY2FsY3VsYXRlIHRoZSByYWRpdXMgb2YgdGhl
IGN1cnJlbnQgcm93CisKKwkJCQl2YXIgcmFkaXVzID0gdiAqICggcmFkaXVzQm90dG9tIC0gcmFk
aXVzVG9wICkgKyByYWRpdXNUb3A7CisKKwkJCQlmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdt
ZW50czsgeCArKyApIHsKKworCQkJCQl2YXIgdSA9IHggLyByYWRpYWxTZWdtZW50czsKKworCQkJ
CQl2YXIgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0OworCisJCQkJCXZhciBz
aW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApOworCQkJCQl2YXIgY29zVGhldGEgPSBNYXRoLmNv
cyggdGhldGEgKTsKKworCQkJCQkvLyB2ZXJ0ZXgKKworCQkJCQl2ZXJ0ZXgueCA9IHJhZGl1cyAq
IHNpblRoZXRhOworCQkJCQl2ZXJ0ZXgueSA9IC0gdiAqIGhlaWdodCArIGhhbGZIZWlnaHQ7CisJ
CQkJCXZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7CisJCQkJCXZlcnRpY2VzLnB1c2goIHZl
cnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworCQkJCQkvLyBub3JtYWwKKworCQkJCQlu
b3JtYWwuc2V0KCBzaW5UaGV0YSwgc2xvcGUsIGNvc1RoZXRhICkubm9ybWFsaXplKCk7CisJCQkJ
CW5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApOworCisJCQkJCS8v
IHV2CisKKwkJCQkJdXZzLnB1c2goIHUsIDEgLSB2ICk7CisKKwkJCQkJLy8gc2F2ZSBpbmRleCBv
ZiB2ZXJ0ZXggaW4gcmVzcGVjdGl2ZSByb3cKKworCQkJCQlpbmRleFJvdy5wdXNoKCBpbmRleCAr
KyApOworCisJCQkJfQorCisJCQkJLy8gbm93IHNhdmUgdmVydGljZXMgb2YgdGhlIHJvdyBpbiBv
dXIgaW5kZXggYXJyYXkKKworCQkJCWluZGV4QXJyYXkucHVzaCggaW5kZXhSb3cgKTsKKworCQkJ
fQorCisJCQkvLyBnZW5lcmF0ZSBpbmRpY2VzCisKKwkJCWZvciAoIHggPSAwOyB4IDwgcmFkaWFs
U2VnbWVudHM7IHggKysgKSB7CisKKwkJCQlmb3IgKCB5ID0gMDsgeSA8IGhlaWdodFNlZ21lbnRz
OyB5ICsrICkgeworCisJCQkJCS8vIHdlIHVzZSB0aGUgaW5kZXggYXJyYXkgdG8gYWNjZXNzIHRo
ZSBjb3JyZWN0IGluZGljZXMKKworCQkJCQl2YXIgYSA9IGluZGV4QXJyYXlbIHkgXVsgeCBdOwor
CQkJCQl2YXIgYiA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHggXTsKKwkJCQkJdmFyIGMgPSBpbmRl
eEFycmF5WyB5ICsgMSBdWyB4ICsgMSBdOworCQkJCQl2YXIgZCA9IGluZGV4QXJyYXlbIHkgXVsg
eCArIDEgXTsKKworCQkJCQkvLyBmYWNlcworCisJCQkJCWluZGljZXMucHVzaCggYSwgYiwgZCAp
OworCQkJCQlpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTsKKworCQkJCQkvLyB1cGRhdGUgZ3JvdXAg
Y291bnRlcgorCisJCQkJCWdyb3VwQ291bnQgKz0gNjsKKworCQkJCX0KKworCQkJfQorCisJCQkv
LyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0
ZXJpYWwgc3VwcG9ydAorCisJCQlzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3Vu
dCwgMCApOworCisJCQkvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHMKKwor
CQkJZ3JvdXBTdGFydCArPSBncm91cENvdW50OworCisJCX0KKworCQlmdW5jdGlvbiBnZW5lcmF0
ZUNhcCggdG9wICkgeworCisJCQl2YXIgeCwgY2VudGVySW5kZXhTdGFydCwgY2VudGVySW5kZXhF
bmQ7CisKKwkJCXZhciB1diA9IG5ldyBWZWN0b3IyKCk7CisJCQl2YXIgdmVydGV4ID0gbmV3IFZl
Y3RvcjMoKTsKKworCQkJdmFyIGdyb3VwQ291bnQgPSAwOworCisJCQl2YXIgcmFkaXVzID0gKCB0
b3AgPT09IHRydWUgKSA/IHJhZGl1c1RvcCA6IHJhZGl1c0JvdHRvbTsKKwkJCXZhciBzaWduID0g
KCB0b3AgPT09IHRydWUgKSA/IDEgOiAtIDE7CisKKwkJCS8vIHNhdmUgdGhlIGluZGV4IG9mIHRo
ZSBmaXJzdCBjZW50ZXIgdmVydGV4CisJCQljZW50ZXJJbmRleFN0YXJ0ID0gaW5kZXg7CisKKwkJ
CS8vIGZpcnN0IHdlIGdlbmVyYXRlIHRoZSBjZW50ZXIgdmVydGV4IGRhdGEgb2YgdGhlIGNhcC4K
KwkJCS8vIGJlY2F1c2UgdGhlIGdlb21ldHJ5IG5lZWRzIG9uZSBzZXQgb2YgdXZzIHBlciBmYWNl
LAorCQkJLy8gd2UgbXVzdCBnZW5lcmF0ZSBhIGNlbnRlciB2ZXJ0ZXggcGVyIGZhY2Uvc2VnbWVu
dAorCisJCQlmb3IgKCB4ID0gMTsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHsKKworCQkJ
CS8vIHZlcnRleAorCisJCQkJdmVydGljZXMucHVzaCggMCwgaGFsZkhlaWdodCAqIHNpZ24sIDAg
KTsKKworCQkJCS8vIG5vcm1hbAorCisJCQkJbm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7CisK
KwkJCQkvLyB1dgorCisJCQkJdXZzLnB1c2goIDAuNSwgMC41ICk7CisKKwkJCQkvLyBpbmNyZWFz
ZSBpbmRleAorCisJCQkJaW5kZXggKys7CisKKwkJCX0KKworCQkJLy8gc2F2ZSB0aGUgaW5kZXgg
b2YgdGhlIGxhc3QgY2VudGVyIHZlcnRleAorCisJCQljZW50ZXJJbmRleEVuZCA9IGluZGV4Owor
CisJCQkvLyBub3cgd2UgZ2VuZXJhdGUgdGhlIHN1cnJvdW5kaW5nIHZlcnRpY2VzLCBub3JtYWxz
IGFuZCB1dnMKKworCQkJZm9yICggeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7
CisKKwkJCQl2YXIgdSA9IHggLyByYWRpYWxTZWdtZW50czsKKwkJCQl2YXIgdGhldGEgPSB1ICog
dGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0OworCisJCQkJdmFyIGNvc1RoZXRhID0gTWF0aC5jb3Mo
IHRoZXRhICk7CisJCQkJdmFyIHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7CisKKwkJCQkv
LyB2ZXJ0ZXgKKworCQkJCXZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7CisJCQkJdmVydGV4
LnkgPSBoYWxmSGVpZ2h0ICogc2lnbjsKKwkJCQl2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRh
OworCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKwor
CQkJCS8vIG5vcm1hbAorCisJCQkJbm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7CisKKwkJCQkv
LyB1dgorCisJCQkJdXYueCA9ICggY29zVGhldGEgKiAwLjUgKSArIDAuNTsKKwkJCQl1di55ID0g
KCBzaW5UaGV0YSAqIDAuNSAqIHNpZ24gKSArIDAuNTsKKwkJCQl1dnMucHVzaCggdXYueCwgdXYu
eSApOworCisJCQkJLy8gaW5jcmVhc2UgaW5kZXgKKworCQkJCWluZGV4ICsrOworCisJCQl9CisK
KwkJCS8vIGdlbmVyYXRlIGluZGljZXMKKworCQkJZm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdt
ZW50czsgeCArKyApIHsKKworCQkJCXZhciBjID0gY2VudGVySW5kZXhTdGFydCArIHg7CisJCQkJ
dmFyIGkgPSBjZW50ZXJJbmRleEVuZCArIHg7CisKKwkJCQlpZiAoIHRvcCA9PT0gdHJ1ZSApIHsK
KworCQkJCQkvLyBmYWNlIHRvcAorCisJCQkJCWluZGljZXMucHVzaCggaSwgaSArIDEsIGMgKTsK
KworCQkJCX0gZWxzZSB7CisKKwkJCQkJLy8gZmFjZSBib3R0b20KKworCQkJCQlpbmRpY2VzLnB1
c2goIGkgKyAxLCBpLCBjICk7CisKKwkJCQl9CisKKwkJCQlncm91cENvdW50ICs9IDM7CisKKwkJ
CX0KKworCQkJLy8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJl
IG11bHRpIG1hdGVyaWFsIHN1cHBvcnQKKworCQkJc2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQs
IGdyb3VwQ291bnQsIHRvcCA9PT0gdHJ1ZSA/IDEgOiAyICk7CisKKwkJCS8vIGNhbGN1bGF0ZSBu
ZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3VwcworCisJCQlncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7
CisKKwkJfQorCisJfQorCisJQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmpl
Y3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlDeWxpbmRlckJ1ZmZlckdl
b21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN5bGluZGVyQnVmZmVyR2VvbWV0cnk7CisK
KwkvKioKKwkgKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0
aW9uCisJICovCisKKwkvLyBDb25lR2VvbWV0cnkKKworCWZ1bmN0aW9uIENvbmVHZW9tZXRyeSgg
cmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVk
LCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKKworCQlDeWxpbmRlckdlb21ldHJ5LmNhbGwo
IHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMs
IG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTsKKworCQl0aGlzLnR5cGUgPSAn
Q29uZUdlb21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXM6IHJhZGl1
cywKKwkJCWhlaWdodDogaGVpZ2h0LAorCQkJcmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRz
LAorCQkJaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAorCQkJb3BlbkVuZGVkOiBvcGVu
RW5kZWQsCisJCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAorCQkJdGhldGFMZW5ndGg6IHRoZXRh
TGVuZ3RoCisJCX07CisKKwl9CisKKwlDb25lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNy
ZWF0ZSggQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKwlDb25lR2VvbWV0cnkucHJvdG90
eXBlLmNvbnN0cnVjdG9yID0gQ29uZUdlb21ldHJ5OworCisJLy8gQ29uZUJ1ZmZlckdlb21ldHJ5
CisKKwlmdW5jdGlvbiBDb25lQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxT
ZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5n
dGggKSB7CisKKwkJQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCAwLCByYWRpdXMs
IGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRh
U3RhcnQsIHRoZXRhTGVuZ3RoICk7CisKKwkJdGhpcy50eXBlID0gJ0NvbmVCdWZmZXJHZW9tZXRy
eSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJcmFkaXVzOiByYWRpdXMsCisJCQloZWln
aHQ6IGhlaWdodCwKKwkJCXJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKKwkJCWhlaWdo
dFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cywKKwkJCW9wZW5FbmRlZDogb3BlbkVuZGVkLAorCQkJ
dGhldGFTdGFydDogdGhldGFTdGFydCwKKwkJCXRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAorCQl9
OworCisJfQorCisJQ29uZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUo
IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisJQ29uZUJ1ZmZlckdlb21ldHJ5
LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVCdWZmZXJHZW9tZXRyeTsKKworCS8qKgorCSAq
IEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtcworCSAq
IEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisJICogQGF1dGhv
ciBodWdoZXMKKwkgKi8KKworCS8vIENpcmNsZUdlb21ldHJ5CisKKwlmdW5jdGlvbiBDaXJjbGVH
ZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CisK
KwkJR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdDaXJjbGVHZW9tZXRy
eSc7CisKKwkJdGhpcy5wYXJhbWV0ZXJzID0geworCQkJcmFkaXVzOiByYWRpdXMsCisJCQlzZWdt
ZW50czogc2VnbWVudHMsCisJCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAorCQkJdGhldGFMZW5n
dGg6IHRoZXRhTGVuZ3RoCisJCX07CisKKwkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBD
aXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFM
ZW5ndGggKSApOworCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKKworCX0KKworCUNpcmNsZUdlb21l
dHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOworCUNp
cmNsZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZUdlb21ldHJ5OworCisJ
Ly8gQ2lyY2xlQnVmZmVyR2VvbWV0cnkKKworCWZ1bmN0aW9uIENpcmNsZUJ1ZmZlckdlb21ldHJ5
KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKKworCQlCdWZm
ZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ0NpcmNsZUJ1ZmZlckdl
b21ldHJ5JzsKKworCQl0aGlzLnBhcmFtZXRlcnMgPSB7CisJCQlyYWRpdXM6IHJhZGl1cywKKwkJ
CXNlZ21lbnRzOiBzZWdtZW50cywKKwkJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCisJCQl0aGV0
YUxlbmd0aDogdGhldGFMZW5ndGgKKwkJfTsKKworCQlyYWRpdXMgPSByYWRpdXMgfHwgNTA7CisJ
CXNlZ21lbnRzID0gc2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCBzZWdtZW50
cyApIDogODsKKworCQl0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhl
dGFTdGFydCA6IDA7CisJCXRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/
IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7CisKKwkJLy8gYnVmZmVycworCisJCXZhciBpbmRp
Y2VzID0gW107CisJCXZhciB2ZXJ0aWNlcyA9IFtdOworCQl2YXIgbm9ybWFscyA9IFtdOworCQl2
YXIgdXZzID0gW107CisKKwkJLy8gaGVscGVyIHZhcmlhYmxlcworCisJCXZhciBpLCBzOworCQl2
YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIHV2ID0gbmV3IFZlY3RvcjIoKTsKKwor
CQkvLyBjZW50ZXIgcG9pbnQKKworCQl2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7CisJCW5vcm1h
bHMucHVzaCggMCwgMCwgMSApOworCQl1dnMucHVzaCggMC41LCAwLjUgKTsKKworCQlmb3IgKCBz
ID0gMCwgaSA9IDM7IHMgPD0gc2VnbWVudHM7IHMgKyssIGkgKz0gMyApIHsKKworCQkJdmFyIHNl
Z21lbnQgPSB0aGV0YVN0YXJ0ICsgcyAvIHNlZ21lbnRzICogdGhldGFMZW5ndGg7CisKKwkJCS8v
IHZlcnRleAorCisJCQl2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7CisJ
CQl2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7CisKKwkJCXZlcnRpY2Vz
LnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworCQkJLy8gbm9ybWFsCisK
KwkJCW5vcm1hbHMucHVzaCggMCwgMCwgMSApOworCisJCQkvLyB1dnMKKworCQkJdXYueCA9ICgg
dmVydGljZXNbIGkgXSAvIHJhZGl1cyArIDEgKSAvIDI7CisJCQl1di55ID0gKCB2ZXJ0aWNlc1sg
aSArIDEgXSAvIHJhZGl1cyArIDEgKSAvIDI7CisKKwkJCXV2cy5wdXNoKCB1di54LCB1di55ICk7
CisKKwkJfQorCisJCS8vIGluZGljZXMKKworCQlmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsg
aSArKyApIHsKKworCQkJaW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgMCApOworCisJCX0KKworCQkv
LyBidWlsZCBnZW9tZXRyeQorCisJCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKKwkJdGhpcy5h
ZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0
aWNlcywgMyApICk7CisJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJC
dWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOworCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2
JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CisKKwl9CisKKwlDaXJj
bGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRy
eS5wcm90b3R5cGUgKTsKKwlDaXJjbGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0
b3IgPSBDaXJjbGVCdWZmZXJHZW9tZXRyeTsKKworCisKKwl2YXIgR2VvbWV0cmllcyA9IE9iamVj
dC5mcmVlemUoeworCQlXaXJlZnJhbWVHZW9tZXRyeTogV2lyZWZyYW1lR2VvbWV0cnksCisJCVBh
cmFtZXRyaWNHZW9tZXRyeTogUGFyYW1ldHJpY0dlb21ldHJ5LAorCQlQYXJhbWV0cmljQnVmZmVy
R2VvbWV0cnk6IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSwKKwkJVGV0cmFoZWRyb25HZW9tZXRy
eTogVGV0cmFoZWRyb25HZW9tZXRyeSwKKwkJVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTogVGV0
cmFoZWRyb25CdWZmZXJHZW9tZXRyeSwKKwkJT2N0YWhlZHJvbkdlb21ldHJ5OiBPY3RhaGVkcm9u
R2VvbWV0cnksCisJCU9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTogT2N0YWhlZHJvbkJ1ZmZlckdl
b21ldHJ5LAorCQlJY29zYWhlZHJvbkdlb21ldHJ5OiBJY29zYWhlZHJvbkdlb21ldHJ5LAorCQlJ
Y29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LAorCQlE
b2RlY2FoZWRyb25HZW9tZXRyeTogRG9kZWNhaGVkcm9uR2VvbWV0cnksCisJCURvZGVjYWhlZHJv
bkJ1ZmZlckdlb21ldHJ5OiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSwKKwkJUG9seWhlZHJv
bkdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksCisJCVBvbHloZWRyb25CdWZmZXJHZW9tZXRy
eTogUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LAorCQlUdWJlR2VvbWV0cnk6IFR1YmVHZW9tZXRy
eSwKKwkJVHViZUJ1ZmZlckdlb21ldHJ5OiBUdWJlQnVmZmVyR2VvbWV0cnksCisJCVRvcnVzS25v
dEdlb21ldHJ5OiBUb3J1c0tub3RHZW9tZXRyeSwKKwkJVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk6
IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LAorCQlUb3J1c0dlb21ldHJ5OiBUb3J1c0dlb21ldHJ5
LAorCQlUb3J1c0J1ZmZlckdlb21ldHJ5OiBUb3J1c0J1ZmZlckdlb21ldHJ5LAorCQlUZXh0R2Vv
bWV0cnk6IFRleHRHZW9tZXRyeSwKKwkJVGV4dEJ1ZmZlckdlb21ldHJ5OiBUZXh0QnVmZmVyR2Vv
bWV0cnksCisJCVNwaGVyZUdlb21ldHJ5OiBTcGhlcmVHZW9tZXRyeSwKKwkJU3BoZXJlQnVmZmVy
R2VvbWV0cnk6IFNwaGVyZUJ1ZmZlckdlb21ldHJ5LAorCQlSaW5nR2VvbWV0cnk6IFJpbmdHZW9t
ZXRyeSwKKwkJUmluZ0J1ZmZlckdlb21ldHJ5OiBSaW5nQnVmZmVyR2VvbWV0cnksCisJCVBsYW5l
R2VvbWV0cnk6IFBsYW5lR2VvbWV0cnksCisJCVBsYW5lQnVmZmVyR2VvbWV0cnk6IFBsYW5lQnVm
ZmVyR2VvbWV0cnksCisJCUxhdGhlR2VvbWV0cnk6IExhdGhlR2VvbWV0cnksCisJCUxhdGhlQnVm
ZmVyR2VvbWV0cnk6IExhdGhlQnVmZmVyR2VvbWV0cnksCisJCVNoYXBlR2VvbWV0cnk6IFNoYXBl
R2VvbWV0cnksCisJCVNoYXBlQnVmZmVyR2VvbWV0cnk6IFNoYXBlQnVmZmVyR2VvbWV0cnksCisJ
CUV4dHJ1ZGVHZW9tZXRyeTogRXh0cnVkZUdlb21ldHJ5LAorCQlFeHRydWRlQnVmZmVyR2VvbWV0
cnk6IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSwKKwkJRWRnZXNHZW9tZXRyeTogRWRnZXNHZW9tZXRy
eSwKKwkJQ29uZUdlb21ldHJ5OiBDb25lR2VvbWV0cnksCisJCUNvbmVCdWZmZXJHZW9tZXRyeTog
Q29uZUJ1ZmZlckdlb21ldHJ5LAorCQlDeWxpbmRlckdlb21ldHJ5OiBDeWxpbmRlckdlb21ldHJ5
LAorCQlDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LAorCQlD
aXJjbGVHZW9tZXRyeTogQ2lyY2xlR2VvbWV0cnksCisJCUNpcmNsZUJ1ZmZlckdlb21ldHJ5OiBD
aXJjbGVCdWZmZXJHZW9tZXRyeSwKKwkJQm94R2VvbWV0cnk6IEJveEdlb21ldHJ5LAorCQlCb3hC
dWZmZXJHZW9tZXRyeTogQm94QnVmZmVyR2VvbWV0cnkKKwl9KTsKKworCS8qKgorCSAqIEBhdXRo
b3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICoKKwkgKiBwYXJhbWV0ZXJzID0gewor
CSAqICBvcGFjaXR5OiA8ZmxvYXQ+CisJICogfQorCSAqLworCisJZnVuY3Rpb24gU2hhZG93TWF0
ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CisKKwkJU2hhZGVyTWF0ZXJpYWwuY2FsbCggdGhpcywgewor
CQkJdW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFsKKwkJCQlVbmlmb3Jtc0xpYi5saWdo
dHMsCisJCQkJeworCQkJCQlvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfQorCQkJCX0KKwkJCV0gKSwK
KwkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmtbICdzaGFkb3dfdmVydCcgXSwKKwkJCWZyYWdt
ZW50U2hhZGVyOiBTaGFkZXJDaHVua1sgJ3NoYWRvd19mcmFnJyBdCisJCX0gKTsKKworCQl0aGlz
LmxpZ2h0cyA9IHRydWU7CisJCXRoaXMudHJhbnNwYXJlbnQgPSB0cnVlOworCisJCU9iamVjdC5k
ZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7CisJCQlvcGFjaXR5OiB7CisJCQkJZW51bWVyYWJsZTog
dHJ1ZSwKKwkJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKwkJCQkJcmV0dXJuIHRoaXMudW5pZm9ybXMu
b3BhY2l0eS52YWx1ZTsKKwkJCQl9LAorCQkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKwkJ
CQkJdGhpcy51bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gdmFsdWU7CisJCQkJfQorCQkJfQorCQl9
ICk7CisKKwkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKKworCX0KKworCVNoYWRvd01h
dGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlw
ZSApOworCVNoYWRvd01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYWRvd01hdGVy
aWFsOworCisJU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWwgPSB0cnVl
OworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8K
KworCWZ1bmN0aW9uIFJhd1NoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisJCVNoYWRl
ck1hdGVyaWFsLmNhbGwoIHRoaXMsIHBhcmFtZXRlcnMgKTsKKworCQl0aGlzLnR5cGUgPSAnUmF3
U2hhZGVyTWF0ZXJpYWwnOworCisJfQorCisJUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlID0g
T2JqZWN0LmNyZWF0ZSggU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlICk7CisJUmF3U2hhZGVyTWF0
ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmF3U2hhZGVyTWF0ZXJpYWw7CisKKwlSYXdT
aGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbCA9IHRydWU7CisKKwkv
KioKKwkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmds
ZXkKKwkgKgorCSAqIHBhcmFtZXRlcnMgPSB7CisJICogIGNvbG9yOiA8aGV4PiwKKwkgKiAgcm91
Z2huZXNzOiA8ZmxvYXQ+LAorCSAqICBtZXRhbG5lc3M6IDxmbG9hdD4sCisJICogIG9wYWNpdHk6
IDxmbG9hdD4sCisJICoKKwkgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAor
CSAqCisJICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqICBs
aWdodE1hcEludGVuc2l0eTogPGZsb2F0PgorCSAqCisJICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4
dHVyZSggPEltYWdlPiApLAorCSAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PgorCSAqCisJICog
IGVtaXNzaXZlOiA8aGV4PiwKKwkgKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD4KKwkgKiAg
ZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICoKKwkgKiAgYnVt
cE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKiAgYnVtcFNjYWxlOiA8Zmxv
YXQ+LAorCSAqCisJICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwK
KwkgKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPiwKKwkgKgorCSAqICBkaXNwbGFjZW1lbnRNYXA6
IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICogIGRpc3BsYWNlbWVudFNjYWxlOiA8
ZmxvYXQ+LAorCSAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LAorCSAqCisJICogIHJvdWdo
bmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKgorCSAqICBtZXRhbG5l
c3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICoKKwkgKiAgYWxwaGFNYXA6
IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICoKKwkgKiAgZW52TWFwOiBuZXcgVEhS
RUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLAor
CSAqICBlbnZNYXBJbnRlbnNpdHk6IDxmbG9hdD4KKwkgKgorCSAqICByZWZyYWN0aW9uUmF0aW86
IDxmbG9hdD4sCisJICoKKwkgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCisJICogIHdpcmVmcmFt
ZUxpbmV3aWR0aDogPGZsb2F0PiwKKwkgKgorCSAqICBza2lubmluZzogPGJvb2w+LAorCSAqICBt
b3JwaFRhcmdldHM6IDxib29sPiwKKwkgKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD4KKwkgKiB9CisJ
ICovCisKKwlmdW5jdGlvbiBNZXNoU3RhbmRhcmRNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKKwor
CQlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQn
OiAnJyB9OworCisJCXRoaXMudHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7CisKKwkJdGhp
cy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZQorCQl0aGlzLnJvdWdo
bmVzcyA9IDAuNTsKKwkJdGhpcy5tZXRhbG5lc3MgPSAwLjU7CisKKwkJdGhpcy5tYXAgPSBudWxs
OworCisJCXRoaXMubGlnaHRNYXAgPSBudWxsOworCQl0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0g
MS4wOworCisJCXRoaXMuYW9NYXAgPSBudWxsOworCQl0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4w
OworCisJCXRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7CisJCXRoaXMuZW1p
c3NpdmVJbnRlbnNpdHkgPSAxLjA7CisJCXRoaXMuZW1pc3NpdmVNYXAgPSBudWxsOworCisJCXRo
aXMuYnVtcE1hcCA9IG51bGw7CisJCXRoaXMuYnVtcFNjYWxlID0gMTsKKworCQl0aGlzLm5vcm1h
bE1hcCA9IG51bGw7CisJCXRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApOwor
CisJCXRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDsKKwkJdGhpcy5kaXNwbGFjZW1lbnRTY2Fs
ZSA9IDE7CisJCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7CisKKwkJdGhpcy5yb3VnaG5lc3NN
YXAgPSBudWxsOworCisJCXRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDsKKworCQl0aGlzLmFscGhh
TWFwID0gbnVsbDsKKworCQl0aGlzLmVudk1hcCA9IG51bGw7CisJCXRoaXMuZW52TWFwSW50ZW5z
aXR5ID0gMS4wOworCisJCXRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODsKKworCQl0aGlzLndp
cmVmcmFtZSA9IGZhbHNlOworCQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7CisJCXRoaXMu
d2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7CisJCXRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAn
cm91bmQnOworCisJCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKKwkJdGhpcy5tb3JwaFRhcmdldHMg
PSBmYWxzZTsKKwkJdGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsKKworCQl0aGlzLnNldFZhbHVl
cyggcGFyYW1ldGVycyApOworCisJfQorCisJTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBl
ID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CisJTWVzaFN0YW5kYXJkTWF0
ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFN0YW5kYXJkTWF0ZXJpYWw7CisKKwlN
ZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA9IHRy
dWU7CisKKwlNZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICgg
c291cmNlICkgeworCisJCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJj
ZSApOworCisJCXRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTsKKworCQl0aGlzLmNv
bG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworCQl0aGlzLnJvdWdobmVzcyA9IHNvdXJjZS5yb3Vn
aG5lc3M7CisJCXRoaXMubWV0YWxuZXNzID0gc291cmNlLm1ldGFsbmVzczsKKworCQl0aGlzLm1h
cCA9IHNvdXJjZS5tYXA7CisKKwkJdGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDsKKwkJ
dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTsKKworCQl0
aGlzLmFvTWFwID0gc291cmNlLmFvTWFwOworCQl0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNl
LmFvTWFwSW50ZW5zaXR5OworCisJCXRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZl
ICk7CisJCXRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7CisJCXRoaXMuZW1p
c3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7CisKKwkJdGhpcy5idW1w
TWFwID0gc291cmNlLmJ1bXBNYXA7CisJCXRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2Fs
ZTsKKworCQl0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7CisJCXRoaXMubm9ybWFs
U2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7CisKKwkJdGhpcy5kaXNwbGFjZW1lbnRN
YXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwOworCQl0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0g
c291cmNlLmRpc3BsYWNlbWVudFNjYWxlOworCQl0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3Vy
Y2UuZGlzcGxhY2VtZW50QmlhczsKKworCQl0aGlzLnJvdWdobmVzc01hcCA9IHNvdXJjZS5yb3Vn
aG5lc3NNYXA7CisKKwkJdGhpcy5tZXRhbG5lc3NNYXAgPSBzb3VyY2UubWV0YWxuZXNzTWFwOwor
CisJCXRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7CisKKwkJdGhpcy5lbnZNYXAgPSBz
b3VyY2UuZW52TWFwOworCQl0aGlzLmVudk1hcEludGVuc2l0eSA9IHNvdXJjZS5lbnZNYXBJbnRl
bnNpdHk7CisKKwkJdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlv
OworCisJCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKKwkJdGhpcy53aXJlZnJh
bWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoOworCQl0aGlzLndpcmVmcmFt
ZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDsKKwkJdGhpcy53aXJlZnJhbWVMaW5l
am9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKKworCQl0aGlzLnNraW5uaW5nID0gc291
cmNlLnNraW5uaW5nOworCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7
CisJCXRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFsczsKKworCQlyZXR1cm4g
dGhpczsKKworCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dp
dGh1Yi5jb20vV2VzdExhbmdsZXkKKwkgKgorCSAqIHBhcmFtZXRlcnMgPSB7CisJICogIHJlZmxl
Y3Rpdml0eTogPGZsb2F0PgorCSAqIH0KKwkgKi8KKworCWZ1bmN0aW9uIE1lc2hQaHlzaWNhbE1h
dGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisJCU1lc2hTdGFuZGFyZE1hdGVyaWFsLmNhbGwoIHRo
aXMgKTsKKworCQl0aGlzLmRlZmluZXMgPSB7ICdQSFlTSUNBTCc6ICcnIH07CisKKwkJdGhpcy50
eXBlID0gJ01lc2hQaHlzaWNhbE1hdGVyaWFsJzsKKworCQl0aGlzLnJlZmxlY3Rpdml0eSA9IDAu
NTsgLy8gbWFwcyB0byBGMCA9IDAuMDQKKworCQl0aGlzLmNsZWFyQ29hdCA9IDAuMDsKKwkJdGhp
cy5jbGVhckNvYXRSb3VnaG5lc3MgPSAwLjA7CisKKwkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRl
cnMgKTsKKworCX0KKworCU1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5j
cmVhdGUoIE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSApOworCU1lc2hQaHlzaWNhbE1h
dGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hQaHlzaWNhbE1hdGVyaWFsOworCisJ
TWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgPSB0
cnVlOworCisJTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAo
IHNvdXJjZSApIHsKKworCQlNZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxs
KCB0aGlzLCBzb3VyY2UgKTsKKworCQl0aGlzLmRlZmluZXMgPSB7ICdQSFlTSUNBTCc6ICcnIH07
CisKKwkJdGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5OworCisJCXRoaXMu
Y2xlYXJDb2F0ID0gc291cmNlLmNsZWFyQ29hdDsKKwkJdGhpcy5jbGVhckNvYXRSb3VnaG5lc3Mg
PSBzb3VyY2UuY2xlYXJDb2F0Um91Z2huZXNzOworCisJCXJldHVybiB0aGlzOworCisJfTsKKwor
CS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhv
ciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKgorCSAqIHBhcmFtZXRl
cnMgPSB7CisJICogIGNvbG9yOiA8aGV4PiwKKwkgKiAgc3BlY3VsYXI6IDxoZXg+LAorCSAqICBz
aGluaW5lc3M6IDxmbG9hdD4sCisJICogIG9wYWNpdHk6IDxmbG9hdD4sCisJICoKKwkgKiAgbWFw
OiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqCisJICogIGxpZ2h0TWFwOiBuZXcg
VEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0
PgorCSAqCisJICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqICBh
b01hcEludGVuc2l0eTogPGZsb2F0PgorCSAqCisJICogIGVtaXNzaXZlOiA8aGV4PiwKKwkgKiAg
ZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD4KKwkgKiAgZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5U
ZXh0dXJlKCA8SW1hZ2U+ICksCisJICoKKwkgKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUo
IDxJbWFnZT4gKSwKKwkgKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LAorCSAqCisJICogIG5vcm1hbE1h
cDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKwkgKiAgbm9ybWFsU2NhbGU6IDxWZWN0
b3IyPiwKKwkgKgorCSAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1h
Z2U+ICksCisJICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LAorCSAqICBkaXNwbGFjZW1l
bnRCaWFzOiA8ZmxvYXQ+LAorCSAqCisJICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVy
ZSggPEltYWdlPiApLAorCSAqCisJICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPElt
YWdlPiApLAorCSAqCisJICogIGVudk1hcDogbmV3IFRIUkVFLlRleHR1cmVDdWJlKCBbcG9zeCwg
bmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSwKKwkgKiAgY29tYmluZTogVEhSRUUuTXVs
dGlwbHksCisJICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PiwKKwkgKiAgcmVmcmFjdGlvblJhdGlv
OiA8ZmxvYXQ+LAorCSAqCisJICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LAorCSAqICB3aXJlZnJh
bWVMaW5ld2lkdGg6IDxmbG9hdD4sCisJICoKKwkgKiAgc2tpbm5pbmc6IDxib29sPiwKKwkgKiAg
bW9ycGhUYXJnZXRzOiA8Ym9vbD4sCisJICogIG1vcnBoTm9ybWFsczogPGJvb2w+CisJICogfQor
CSAqLworCisJZnVuY3Rpb24gTWVzaFBob25nTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CisKKwkJ
TWF0ZXJpYWwuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdNZXNoUGhvbmdNYXRlcmlh
bCc7CisKKwkJdGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZQor
CQl0aGlzLnNwZWN1bGFyID0gbmV3IENvbG9yKCAweDExMTExMSApOworCQl0aGlzLnNoaW5pbmVz
cyA9IDMwOworCisJCXRoaXMubWFwID0gbnVsbDsKKworCQl0aGlzLmxpZ2h0TWFwID0gbnVsbDsK
KwkJdGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDsKKworCQl0aGlzLmFvTWFwID0gbnVsbDsK
KwkJdGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDsKKworCQl0aGlzLmVtaXNzaXZlID0gbmV3IENv
bG9yKCAweDAwMDAwMCApOworCQl0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wOworCQl0aGlz
LmVtaXNzaXZlTWFwID0gbnVsbDsKKworCQl0aGlzLmJ1bXBNYXAgPSBudWxsOworCQl0aGlzLmJ1
bXBTY2FsZSA9IDE7CisKKwkJdGhpcy5ub3JtYWxNYXAgPSBudWxsOworCQl0aGlzLm5vcm1hbFNj
YWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTsKKworCQl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51
bGw7CisJCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOworCQl0aGlzLmRpc3BsYWNlbWVudEJp
YXMgPSAwOworCisJCXRoaXMuc3BlY3VsYXJNYXAgPSBudWxsOworCisJCXRoaXMuYWxwaGFNYXAg
PSBudWxsOworCisJCXRoaXMuZW52TWFwID0gbnVsbDsKKwkJdGhpcy5jb21iaW5lID0gTXVsdGlw
bHlPcGVyYXRpb247CisJCXRoaXMucmVmbGVjdGl2aXR5ID0gMTsKKwkJdGhpcy5yZWZyYWN0aW9u
UmF0aW8gPSAwLjk4OworCisJCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CisJCXRoaXMud2lyZWZy
YW1lTGluZXdpZHRoID0gMTsKKwkJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJzsKKwkJ
dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CisKKwkJdGhpcy5za2lubmluZyA9IGZh
bHNlOworCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOworCQl0aGlzLm1vcnBoTm9ybWFscyA9
IGZhbHNlOworCisJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CisKKwl9CisKKwlNZXNo
UGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5
cGUgKTsKKwlNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGhv
bmdNYXRlcmlhbDsKKworCU1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hQaG9uZ01h
dGVyaWFsID0gdHJ1ZTsKKworCU1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVu
Y3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhp
cywgc291cmNlICk7CisKKwkJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKKwkJdGhp
cy5zcGVjdWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTsKKwkJdGhpcy5zaGluaW5lc3MgPSBz
b3VyY2Uuc2hpbmluZXNzOworCisJCXRoaXMubWFwID0gc291cmNlLm1hcDsKKworCQl0aGlzLmxp
Z2h0TWFwID0gc291cmNlLmxpZ2h0TWFwOworCQl0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291
cmNlLmxpZ2h0TWFwSW50ZW5zaXR5OworCisJCXRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7CisJ
CXRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7CisKKwkJdGhpcy5l
bWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTsKKwkJdGhpcy5lbWlzc2l2ZU1hcCA9IHNv
dXJjZS5lbWlzc2l2ZU1hcDsKKwkJdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlz
c2l2ZUludGVuc2l0eTsKKworCQl0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDsKKwkJdGhp
cy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlOworCisJCXRoaXMubm9ybWFsTWFwID0gc291
cmNlLm5vcm1hbE1hcDsKKwkJdGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2Nh
bGUgKTsKKworCQl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7
CisJCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7CisJ
CXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzOworCisJCXRo
aXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7CisKKwkJdGhpcy5hbHBoYU1hcCA9
IHNvdXJjZS5hbHBoYU1hcDsKKworCQl0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7CisJCXRo
aXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lOworCQl0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJj
ZS5yZWZsZWN0aXZpdHk7CisJCXRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rp
b25SYXRpbzsKKworCQl0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7CisJCXRoaXMu
d2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDsKKwkJdGhpcy53
aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7CisJCXRoaXMud2lyZWZy
YW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47CisKKwkJdGhpcy5za2lubmlu
ZyA9IHNvdXJjZS5za2lubmluZzsKKwkJdGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhU
YXJnZXRzOworCQl0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7CisKKwkJ
cmV0dXJuIHRoaXM7CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciB0YWthaGlyb3ggLyBodHRw
Oi8vZ2l0aHViLmNvbS90YWthaGlyb3gKKwkgKgorCSAqIHBhcmFtZXRlcnMgPSB7CisJICogIGdy
YWRpZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApCisJICogfQorCSAqLworCisJ
ZnVuY3Rpb24gTWVzaFRvb25NYXRlcmlhbCggcGFyYW1ldGVycyApIHsKKworCQlNZXNoUGhvbmdN
YXRlcmlhbC5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy5kZWZpbmVzID0geyAnVE9PTic6ICcnIH07
CisKKwkJdGhpcy50eXBlID0gJ01lc2hUb29uTWF0ZXJpYWwnOworCisJCXRoaXMuZ3JhZGllbnRN
YXAgPSBudWxsOworCisJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CisKKwl9CisKKwlN
ZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2hQaG9uZ01hdGVy
aWFsLnByb3RvdHlwZSApOworCU1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9y
ID0gTWVzaFRvb25NYXRlcmlhbDsKKworCU1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVz
aFRvb25NYXRlcmlhbCA9IHRydWU7CisKKwlNZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZS5jb3B5
ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBl
LmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CisKKwkJdGhpcy5ncmFkaWVudE1hcCA9IHNvdXJj
ZS5ncmFkaWVudE1hcDsKKworCQlyZXR1cm4gdGhpczsKKworCX07CisKKwkvKioKKwkgKiBAYXV0
aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgV2VzdExhbmdsZXkg
LyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorCSAqCisJICogcGFyYW1ldGVycyA9IHsK
KwkgKiAgb3BhY2l0eTogPGZsb2F0PiwKKwkgKgorCSAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4
dHVyZSggPEltYWdlPiApLAorCSAqICBidW1wU2NhbGU6IDxmbG9hdD4sCisJICoKKwkgKiAgbm9y
bWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorCSAqICBub3JtYWxTY2FsZTog
PFZlY3RvcjI+LAorCSAqCisJICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUo
IDxJbWFnZT4gKSwKKwkgKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sCisJICogIGRpc3Bs
YWNlbWVudEJpYXM6IDxmbG9hdD4sCisJICoKKwkgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCisJ
ICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PgorCSAqCisJICogIHNraW5uaW5nOiA8Ym9v
bD4sCisJICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LAorCSAqICBtb3JwaE5vcm1hbHM6IDxib29s
PgorCSAqIH0KKwkgKi8KKworCWZ1bmN0aW9uIE1lc2hOb3JtYWxNYXRlcmlhbCggcGFyYW1ldGVy
cyApIHsKKworCQlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0gJ01lc2hO
b3JtYWxNYXRlcmlhbCc7CisKKwkJdGhpcy5idW1wTWFwID0gbnVsbDsKKwkJdGhpcy5idW1wU2Nh
bGUgPSAxOworCisJCXRoaXMubm9ybWFsTWFwID0gbnVsbDsKKwkJdGhpcy5ub3JtYWxTY2FsZSA9
IG5ldyBWZWN0b3IyKCAxLCAxICk7CisKKwkJdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsOwor
CQl0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTsKKwkJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0g
MDsKKworCQl0aGlzLndpcmVmcmFtZSA9IGZhbHNlOworCQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0
aCA9IDE7CisKKwkJdGhpcy5mb2cgPSBmYWxzZTsKKwkJdGhpcy5saWdodHMgPSBmYWxzZTsKKwor
CQl0aGlzLnNraW5uaW5nID0gZmFsc2U7CisJCXRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7CisJ
CXRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7CisKKwkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRl
cnMgKTsKKworCX0KKworCU1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3Jl
YXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKKwlNZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBl
LmNvbnN0cnVjdG9yID0gTWVzaE5vcm1hbE1hdGVyaWFsOworCisJTWVzaE5vcm1hbE1hdGVyaWFs
LnByb3RvdHlwZS5pc01lc2hOb3JtYWxNYXRlcmlhbCA9IHRydWU7CisKKwlNZXNoTm9ybWFsTWF0
ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworCQlNYXRlcmlh
bC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworCQl0aGlzLmJ1bXBNYXAg
PSBzb3VyY2UuYnVtcE1hcDsKKwkJdGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlOwor
CisJCXRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDsKKwkJdGhpcy5ub3JtYWxTY2Fs
ZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTsKKworCQl0aGlzLmRpc3BsYWNlbWVudE1hcCA9
IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7CisJCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3Vy
Y2UuZGlzcGxhY2VtZW50U2NhbGU7CisJCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5k
aXNwbGFjZW1lbnRCaWFzOworCisJCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsK
KwkJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoOwor
CisJCXRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7CisJCXRoaXMubW9ycGhUYXJnZXRz
ID0gc291cmNlLm1vcnBoVGFyZ2V0czsKKwkJdGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9y
cGhOb3JtYWxzOworCisJCXJldHVybiB0aGlzOworCisJfTsKKworCS8qKgorCSAqIEBhdXRob3Ig
bXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6
Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKgorCSAqIHBhcmFtZXRlcnMgPSB7CisJICogIGNvbG9y
OiA8aGV4PiwKKwkgKiAgb3BhY2l0eTogPGZsb2F0PiwKKwkgKgorCSAqICBtYXA6IG5ldyBUSFJF
RS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICoKKwkgKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0
dXJlKCA8SW1hZ2U+ICksCisJICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CisJICoKKwkg
KiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisJICogIGFvTWFwSW50ZW5z
aXR5OiA8ZmxvYXQ+CisJICoKKwkgKiAgZW1pc3NpdmU6IDxoZXg+LAorCSAqICBlbWlzc2l2ZUlu
dGVuc2l0eTogPGZsb2F0PgorCSAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJ
bWFnZT4gKSwKKwkgKgorCSAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFn
ZT4gKSwKKwkgKgorCSAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwK
KwkgKgorCSAqICBlbnZNYXA6IG5ldyBUSFJFRS5UZXh0dXJlQ3ViZSggW3Bvc3gsIG5lZ3gsIHBv
c3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksCisJICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LAor
CSAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sCisJICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0
PiwKKwkgKgorCSAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKKwkgKiAgd2lyZWZyYW1lTGluZXdp
ZHRoOiA8ZmxvYXQ+LAorCSAqCisJICogIHNraW5uaW5nOiA8Ym9vbD4sCisJICogIG1vcnBoVGFy
Z2V0czogPGJvb2w+LAorCSAqICBtb3JwaE5vcm1hbHM6IDxib29sPgorCSAqIH0KKwkgKi8KKwor
CWZ1bmN0aW9uIE1lc2hMYW1iZXJ0TWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CisKKwkJTWF0ZXJp
YWwuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdNZXNoTGFtYmVydE1hdGVyaWFsJzsK
KworCQl0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlCisKKwkJ
dGhpcy5tYXAgPSBudWxsOworCisJCXRoaXMubGlnaHRNYXAgPSBudWxsOworCQl0aGlzLmxpZ2h0
TWFwSW50ZW5zaXR5ID0gMS4wOworCisJCXRoaXMuYW9NYXAgPSBudWxsOworCQl0aGlzLmFvTWFw
SW50ZW5zaXR5ID0gMS4wOworCisJCXRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAw
ICk7CisJCXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7CisJCXRoaXMuZW1pc3NpdmVNYXAg
PSBudWxsOworCisJCXRoaXMuc3BlY3VsYXJNYXAgPSBudWxsOworCisJCXRoaXMuYWxwaGFNYXAg
PSBudWxsOworCisJCXRoaXMuZW52TWFwID0gbnVsbDsKKwkJdGhpcy5jb21iaW5lID0gTXVsdGlw
bHlPcGVyYXRpb247CisJCXRoaXMucmVmbGVjdGl2aXR5ID0gMTsKKwkJdGhpcy5yZWZyYWN0aW9u
UmF0aW8gPSAwLjk4OworCisJCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CisJCXRoaXMud2lyZWZy
YW1lTGluZXdpZHRoID0gMTsKKwkJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJzsKKwkJ
dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CisKKwkJdGhpcy5za2lubmluZyA9IGZh
bHNlOworCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOworCQl0aGlzLm1vcnBoTm9ybWFscyA9
IGZhbHNlOworCisJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CisKKwl9CisKKwlNZXNo
TGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3Rv
dHlwZSApOworCU1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVz
aExhbWJlcnRNYXRlcmlhbDsKKworCU1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlLmlzTWVz
aExhbWJlcnRNYXRlcmlhbCA9IHRydWU7CisKKwlNZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlw
ZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJTWF0ZXJpYWwucHJvdG90eXBlLmNv
cHkuY2FsbCggdGhpcywgc291cmNlICk7CisKKwkJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29s
b3IgKTsKKworCQl0aGlzLm1hcCA9IHNvdXJjZS5tYXA7CisKKwkJdGhpcy5saWdodE1hcCA9IHNv
dXJjZS5saWdodE1hcDsKKwkJdGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1h
cEludGVuc2l0eTsKKworCQl0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwOworCQl0aGlzLmFvTWFw
SW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5OworCisJCXRoaXMuZW1pc3NpdmUuY29w
eSggc291cmNlLmVtaXNzaXZlICk7CisJCXRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3Np
dmVNYXA7CisJCXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNp
dHk7CisKKwkJdGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKKworCQl0aGlz
LmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwOworCisJCXRoaXMuZW52TWFwID0gc291cmNlLmVu
dk1hcDsKKwkJdGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7CisJCXRoaXMucmVmbGVjdGl2
aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTsKKwkJdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3Vy
Y2UucmVmcmFjdGlvblJhdGlvOworCisJCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFt
ZTsKKwkJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRo
OworCQl0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDsKKwkJ
dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKKworCQl0
aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nOworCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNv
dXJjZS5tb3JwaFRhcmdldHM7CisJCXRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9y
bWFsczsKKworCQlyZXR1cm4gdGhpczsKKworCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVy
ZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworCSAqCisJICogcGFyYW1ldGVycyA9IHsK
KwkgKiAgY29sb3I6IDxoZXg+LAorCSAqICBvcGFjaXR5OiA8ZmxvYXQ+LAorCSAqCisJICogIGxp
bmV3aWR0aDogPGZsb2F0PiwKKwkgKgorCSAqICBzY2FsZTogPGZsb2F0PiwKKwkgKiAgZGFzaFNp
emU6IDxmbG9hdD4sCisJICogIGdhcFNpemU6IDxmbG9hdD4KKwkgKiB9CisJICovCisKKwlmdW5j
dGlvbiBMaW5lRGFzaGVkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CisKKwkJTWF0ZXJpYWwuY2Fs
bCggdGhpcyApOworCisJCXRoaXMudHlwZSA9ICdMaW5lRGFzaGVkTWF0ZXJpYWwnOworCisJCXRo
aXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7CisKKwkJdGhpcy5saW5ld2lkdGggPSAx
OworCisJCXRoaXMuc2NhbGUgPSAxOworCQl0aGlzLmRhc2hTaXplID0gMzsKKwkJdGhpcy5nYXBT
aXplID0gMTsKKworCQl0aGlzLmxpZ2h0cyA9IGZhbHNlOworCisJCXRoaXMuc2V0VmFsdWVzKCBw
YXJhbWV0ZXJzICk7CisKKwl9CisKKwlMaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlID0gT2Jq
ZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CisJTGluZURhc2hlZE1hdGVyaWFsLnBy
b3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVEYXNoZWRNYXRlcmlhbDsKKworCUxpbmVEYXNoZWRN
YXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgPSB0cnVlOworCisJTGluZURh
c2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJ
TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CisKKwkJdGhpcy5j
b2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKKworCQl0aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5s
aW5ld2lkdGg7CisKKwkJdGhpcy5zY2FsZSA9IHNvdXJjZS5zY2FsZTsKKwkJdGhpcy5kYXNoU2l6
ZSA9IHNvdXJjZS5kYXNoU2l6ZTsKKwkJdGhpcy5nYXBTaXplID0gc291cmNlLmdhcFNpemU7CisK
KwkJcmV0dXJuIHRoaXM7CisKKwl9OworCisKKworCXZhciBNYXRlcmlhbHMgPSBPYmplY3QuZnJl
ZXplKHsKKwkJU2hhZG93TWF0ZXJpYWw6IFNoYWRvd01hdGVyaWFsLAorCQlTcHJpdGVNYXRlcmlh
bDogU3ByaXRlTWF0ZXJpYWwsCisJCVJhd1NoYWRlck1hdGVyaWFsOiBSYXdTaGFkZXJNYXRlcmlh
bCwKKwkJU2hhZGVyTWF0ZXJpYWw6IFNoYWRlck1hdGVyaWFsLAorCQlQb2ludHNNYXRlcmlhbDog
UG9pbnRzTWF0ZXJpYWwsCisJCU1lc2hQaHlzaWNhbE1hdGVyaWFsOiBNZXNoUGh5c2ljYWxNYXRl
cmlhbCwKKwkJTWVzaFN0YW5kYXJkTWF0ZXJpYWw6IE1lc2hTdGFuZGFyZE1hdGVyaWFsLAorCQlN
ZXNoUGhvbmdNYXRlcmlhbDogTWVzaFBob25nTWF0ZXJpYWwsCisJCU1lc2hUb29uTWF0ZXJpYWw6
IE1lc2hUb29uTWF0ZXJpYWwsCisJCU1lc2hOb3JtYWxNYXRlcmlhbDogTWVzaE5vcm1hbE1hdGVy
aWFsLAorCQlNZXNoTGFtYmVydE1hdGVyaWFsOiBNZXNoTGFtYmVydE1hdGVyaWFsLAorCQlNZXNo
RGVwdGhNYXRlcmlhbDogTWVzaERlcHRoTWF0ZXJpYWwsCisJCU1lc2hCYXNpY01hdGVyaWFsOiBN
ZXNoQmFzaWNNYXRlcmlhbCwKKwkJTGluZURhc2hlZE1hdGVyaWFsOiBMaW5lRGFzaGVkTWF0ZXJp
YWwsCisJCUxpbmVCYXNpY01hdGVyaWFsOiBMaW5lQmFzaWNNYXRlcmlhbCwKKwkJTWF0ZXJpYWw6
IE1hdGVyaWFsCisJfSk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRv
b2IuY29tLworCSAqLworCisJdmFyIENhY2hlID0geworCisJCWVuYWJsZWQ6IGZhbHNlLAorCisJ
CWZpbGVzOiB7fSwKKworCQlhZGQ6IGZ1bmN0aW9uICgga2V5LCBmaWxlICkgeworCisJCQlpZiAo
IHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47CisKKwkJCS8vIGNvbnNvbGUubG9nKCAn
VEhSRUUuQ2FjaGUnLCAnQWRkaW5nIGtleTonLCBrZXkgKTsKKworCQkJdGhpcy5maWxlc1sga2V5
IF0gPSBmaWxlOworCisJCX0sCisKKwkJZ2V0OiBmdW5jdGlvbiAoIGtleSApIHsKKworCQkJaWYg
KCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuOworCisJCQkvLyBjb25zb2xlLmxvZygg
J1RIUkVFLkNhY2hlJywgJ0NoZWNraW5nIGtleTonLCBrZXkgKTsKKworCQkJcmV0dXJuIHRoaXMu
ZmlsZXNbIGtleSBdOworCisJCX0sCisKKwkJcmVtb3ZlOiBmdW5jdGlvbiAoIGtleSApIHsKKwor
CQkJZGVsZXRlIHRoaXMuZmlsZXNbIGtleSBdOworCisJCX0sCisKKwkJY2xlYXI6IGZ1bmN0aW9u
ICgpIHsKKworCQkJdGhpcy5maWxlcyA9IHt9OworCisJCX0KKworCX07CisKKwkvKioKKwkgKiBA
YXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gTG9h
ZGluZ01hbmFnZXIoIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKKworCQl2YXIgc2Nv
cGUgPSB0aGlzOworCisJCXZhciBpc0xvYWRpbmcgPSBmYWxzZSwgaXRlbXNMb2FkZWQgPSAwLCBp
dGVtc1RvdGFsID0gMDsKKworCQl0aGlzLm9uU3RhcnQgPSB1bmRlZmluZWQ7CisJCXRoaXMub25M
b2FkID0gb25Mb2FkOworCQl0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzOworCQl0aGlzLm9u
RXJyb3IgPSBvbkVycm9yOworCisJCXRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24gKCB1cmwgKSB7
CisKKwkJCWl0ZW1zVG90YWwgKys7CisKKwkJCWlmICggaXNMb2FkaW5nID09PSBmYWxzZSApIHsK
KworCQkJCWlmICggc2NvcGUub25TdGFydCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCXNjb3Bl
Lm9uU3RhcnQoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTsKKworCQkJCX0KKworCQkJ
fQorCisJCQlpc0xvYWRpbmcgPSB0cnVlOworCisJCX07CisKKwkJdGhpcy5pdGVtRW5kID0gZnVu
Y3Rpb24gKCB1cmwgKSB7CisKKwkJCWl0ZW1zTG9hZGVkICsrOworCisJCQlpZiAoIHNjb3BlLm9u
UHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCXNjb3BlLm9uUHJvZ3Jlc3MoIHVybCwg
aXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTsKKworCQkJfQorCisJCQlpZiAoIGl0ZW1zTG9hZGVk
ID09PSBpdGVtc1RvdGFsICkgeworCisJCQkJaXNMb2FkaW5nID0gZmFsc2U7CisKKwkJCQlpZiAo
IHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCXNjb3BlLm9uTG9hZCgpOwor
CisJCQkJfQorCisJCQl9CisKKwkJfTsKKworCQl0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICgg
dXJsICkgeworCisJCQlpZiAoIHNjb3BlLm9uRXJyb3IgIT09IHVuZGVmaW5lZCApIHsKKworCQkJ
CXNjb3BlLm9uRXJyb3IoIHVybCApOworCisJCQl9CisKKwkJfTsKKworCX0KKworCXZhciBEZWZh
dWx0TG9hZGluZ01hbmFnZXIgPSBuZXcgTG9hZGluZ01hbmFnZXIoKTsKKworCS8qKgorCSAqIEBh
dXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBGaWxl
TG9hZGVyKCBtYW5hZ2VyICkgeworCisJCXRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5k
ZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyOworCisJfQorCisJT2Jq
ZWN0LmFzc2lnbiggRmlsZUxvYWRlci5wcm90b3R5cGUsIHsKKworCQlsb2FkOiBmdW5jdGlvbiAo
IHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgeworCisJCQlpZiAoIHVybCA9PT0g
dW5kZWZpbmVkICkgdXJsID0gJyc7CisKKwkJCWlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQg
KSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7CisKKwkJCXZhciBzY29wZSA9IHRoaXM7CisKKwkJCXZh
ciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApOworCisJCQlpZiAoIGNhY2hlZCAhPT0gdW5kZWZp
bmVkICkgeworCisJCQkJc2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApOworCisJCQkJc2V0
VGltZW91dCggZnVuY3Rpb24gKCkgeworCisJCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNo
ZWQgKTsKKworCQkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOworCisJCQkJfSwgMCAp
OworCisJCQkJcmV0dXJuIGNhY2hlZDsKKworCQkJfQorCisJCQkvLyBDaGVjayBmb3IgZGF0YTog
VVJJCisJCQl2YXIgZGF0YVVyaVJlZ2V4ID0gL15kYXRhOiguKj8pKDtiYXNlNjQpPywoLiopJC87
CisJCQl2YXIgZGF0YVVyaVJlZ2V4UmVzdWx0ID0gdXJsLm1hdGNoKCBkYXRhVXJpUmVnZXggKTsK
KworCQkJLy8gU2FmYXJpIGNhbiBub3QgaGFuZGxlIERhdGEgVVJJcyB0aHJvdWdoIFhNTEh0dHBS
ZXF1ZXN0IHNvIHByb2Nlc3MgbWFudWFsbHkKKwkJCWlmICggZGF0YVVyaVJlZ2V4UmVzdWx0ICkg
eworCisJCQkJdmFyIG1pbWVUeXBlID0gZGF0YVVyaVJlZ2V4UmVzdWx0WyAxIF07CisJCQkJdmFy
IGlzQmFzZTY0ID0gISEgZGF0YVVyaVJlZ2V4UmVzdWx0WyAyIF07CisJCQkJdmFyIGRhdGEgPSBk
YXRhVXJpUmVnZXhSZXN1bHRbIDMgXTsKKworCQkJCWRhdGEgPSB3aW5kb3cuZGVjb2RlVVJJQ29t
cG9uZW50KCBkYXRhICk7CisKKwkJCQlpZiAoIGlzQmFzZTY0ICkgZGF0YSA9IHdpbmRvdy5hdG9i
KCBkYXRhICk7CisKKwkJCQl0cnkgeworCisJCQkJCXZhciByZXNwb25zZTsKKwkJCQkJdmFyIHJl
c3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpOwor
CisJCQkJCXN3aXRjaCAoIHJlc3BvbnNlVHlwZSApIHsKKworCQkJCQkJY2FzZSAnYXJyYXlidWZm
ZXInOgorCQkJCQkJY2FzZSAnYmxvYic6CisKKwkJCQkJCSAJcmVzcG9uc2UgPSBuZXcgQXJyYXlC
dWZmZXIoIGRhdGEubGVuZ3RoICk7CisKKwkJCQkJCQl2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5
KCByZXNwb25zZSApOworCisJCQkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7
IGkgKysgKSB7CisKKwkJCQkJCQkJdmlld1sgaSBdID0gZGF0YS5jaGFyQ29kZUF0KCBpICk7CisK
KwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoIHJlc3BvbnNlVHlwZSA9PT0gJ2Jsb2InICkgeworCisJ
CQkJCQkJCXJlc3BvbnNlID0gbmV3IEJsb2IoIFsgcmVzcG9uc2UgXSwgeyB0eXBlOiBtaW1lVHlw
ZSB9ICk7CisKKwkJCQkJCQl9CisKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAnZG9jdW1l
bnQnOgorCisJCQkJCQkJdmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKKwkJCQkJCQlyZXNw
b25zZSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIG1pbWVUeXBlICk7CisKKwkJCQkJ
CQlicmVhazsKKworCQkJCQkJY2FzZSAnanNvbic6CisKKwkJCQkJCQlyZXNwb25zZSA9IEpTT04u
cGFyc2UoIGRhdGEgKTsKKworCQkJCQkJCWJyZWFrOworCisJCQkJCQlkZWZhdWx0OiAvLyAndGV4
dCcgb3Igb3RoZXIKKworCQkJCQkJCXJlc3BvbnNlID0gZGF0YTsKKworCQkJCQkJCWJyZWFrOwor
CisJCQkJCX0KKworCQkJCQkvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljaworCQkJCQl3aW5k
b3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkgeworCisJCQkJCQlpZiAoIG9uTG9hZCApIG9uTG9h
ZCggcmVzcG9uc2UgKTsKKworCQkJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKKwor
CQkJCQl9LCAwICk7CisKKwkJCQl9IGNhdGNoICggZXJyb3IgKSB7CisKKwkJCQkJLy8gV2FpdCBm
b3IgbmV4dCBicm93c2VyIHRpY2sKKwkJCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgp
IHsKKworCQkJCQkJaWYgKCBvbkVycm9yICkgb25FcnJvciggZXJyb3IgKTsKKworCQkJCQkJc2Nv
cGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKKwkJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVycm9y
KCB1cmwgKTsKKworCQkJCQl9LCAwICk7CisKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisKKwkJCQl2
YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworCQkJCXJlcXVlc3Qub3BlbiggJ0dF
VCcsIHVybCwgdHJ1ZSApOworCisJCQkJcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcs
IGZ1bmN0aW9uICggZXZlbnQgKSB7CisKKwkJCQkJdmFyIHJlc3BvbnNlID0gZXZlbnQudGFyZ2V0
LnJlc3BvbnNlOworCisJCQkJCUNhY2hlLmFkZCggdXJsLCByZXNwb25zZSApOworCisJCQkJCWlm
ICggdGhpcy5zdGF0dXMgPT09IDIwMCApIHsKKworCQkJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQo
IHJlc3BvbnNlICk7CisKKwkJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CisKKwkJ
CQkJfSBlbHNlIGlmICggdGhpcy5zdGF0dXMgPT09IDAgKSB7CisKKwkJCQkJCS8vIFNvbWUgYnJv
d3NlcnMgcmV0dXJuIEhUVFAgU3RhdHVzIDAgd2hlbiB1c2luZyBub24taHR0cCBwcm90b2NvbAor
CQkJCQkJLy8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy4K
KworCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCBy
ZWNlaXZlZC4nICk7CisKKwkJCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCByZXNwb25zZSApOwor
CisJCQkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOworCisJCQkJCX0gZWxzZSB7CisK
KwkJCQkJCWlmICggb25FcnJvciApIG9uRXJyb3IoIGV2ZW50ICk7CisKKwkJCQkJCXNjb3BlLm1h
bmFnZXIuaXRlbUVuZCggdXJsICk7CisJCQkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJs
ICk7CisKKwkJCQkJfQorCisJCQkJfSwgZmFsc2UgKTsKKworCQkJCWlmICggb25Qcm9ncmVzcyAh
PT0gdW5kZWZpbmVkICkgeworCisJCQkJCXJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ3Byb2dy
ZXNzJywgZnVuY3Rpb24gKCBldmVudCApIHsKKworCQkJCQkJb25Qcm9ncmVzcyggZXZlbnQgKTsK
KworCQkJCQl9LCBmYWxzZSApOworCisJCQkJfQorCisJCQkJcmVxdWVzdC5hZGRFdmVudExpc3Rl
bmVyKCAnZXJyb3InLCBmdW5jdGlvbiAoIGV2ZW50ICkgeworCisJCQkJCWlmICggb25FcnJvciAp
IG9uRXJyb3IoIGV2ZW50ICk7CisKKwkJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsK
KwkJCQkJc2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApOworCisJCQkJfSwgZmFsc2UgKTsK
KworCQkJCWlmICggdGhpcy5yZXNwb25zZVR5cGUgIT09IHVuZGVmaW5lZCApIHJlcXVlc3QucmVz
cG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGU7CisJCQkJaWYgKCB0aGlzLndpdGhDcmVkZW50
aWFscyAhPT0gdW5kZWZpbmVkICkgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLndpdGhD
cmVkZW50aWFsczsKKworCQkJCWlmICggcmVxdWVzdC5vdmVycmlkZU1pbWVUeXBlICkgcmVxdWVz
dC5vdmVycmlkZU1pbWVUeXBlKCB0aGlzLm1pbWVUeXBlICE9PSB1bmRlZmluZWQgPyB0aGlzLm1p
bWVUeXBlIDogJ3RleHQvcGxhaW4nICk7CisKKwkJCQlmb3IgKCB2YXIgaGVhZGVyIGluIHRoaXMu
cmVxdWVzdEhlYWRlciApIHsKKworCQkJCQlyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoIGhlYWRl
ciwgdGhpcy5yZXF1ZXN0SGVhZGVyWyBoZWFkZXIgXSApOworCisJCQkJfQorCisJCQkJcmVxdWVz
dC5zZW5kKCBudWxsICk7CisKKwkJCX0KKworCQkJc2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVy
bCApOworCisJCQlyZXR1cm4gcmVxdWVzdDsKKworCQl9LAorCisJCXNldFBhdGg6IGZ1bmN0aW9u
ICggdmFsdWUgKSB7CisKKwkJCXRoaXMucGF0aCA9IHZhbHVlOworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQlzZXRSZXNwb25zZVR5cGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCXRo
aXMucmVzcG9uc2VUeXBlID0gdmFsdWU7CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNl
dFdpdGhDcmVkZW50aWFsczogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJdGhpcy53aXRoQ3Jl
ZGVudGlhbHMgPSB2YWx1ZTsKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0TWltZVR5
cGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCXRoaXMubWltZVR5cGUgPSB2YWx1ZTsKKwkJ
CXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24gKCB2
YWx1ZSApIHsKKworCQkJdGhpcy5yZXF1ZXN0SGVhZGVyID0gdmFsdWU7CisJCQlyZXR1cm4gdGhp
czsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9t
cmRvb2IuY29tLworCSAqCisJICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBibG9jayBiYXNlZCB0
ZXh0dXJlcyBsb2FkZXIgKGRkcywgcHZyLCAuLi4pCisJICovCisKKwlmdW5jdGlvbiBDb21wcmVz
c2VkVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHsKKworCQl0aGlzLm1hbmFnZXIgPSAoIG1hbmFn
ZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKKwor
CQkvLyBvdmVycmlkZSBpbiBzdWIgY2xhc3NlcworCQl0aGlzLl9wYXJzZXIgPSBudWxsOworCisJ
fQorCisJT2JqZWN0LmFzc2lnbiggQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7
CisKKwkJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciAp
IHsKKworCQkJdmFyIHNjb3BlID0gdGhpczsKKworCQkJdmFyIGltYWdlcyA9IFtdOworCisJCQl2
YXIgdGV4dHVyZSA9IG5ldyBDb21wcmVzc2VkVGV4dHVyZSgpOworCQkJdGV4dHVyZS5pbWFnZSA9
IGltYWdlczsKKworCQkJdmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIg
KTsKKwkJCWxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTsKKwkJCWxvYWRlci5zZXRSZXNwb25z
ZVR5cGUoICdhcnJheWJ1ZmZlcicgKTsKKworCQkJZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7
CisKKwkJCQlsb2FkZXIubG9hZCggdXJsWyBpIF0sIGZ1bmN0aW9uICggYnVmZmVyICkgeworCisJ
CQkJCXZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApOworCisJCQkJ
CWltYWdlc1sgaSBdID0geworCQkJCQkJd2lkdGg6IHRleERhdGFzLndpZHRoLAorCQkJCQkJaGVp
Z2h0OiB0ZXhEYXRhcy5oZWlnaHQsCisJCQkJCQlmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCwKKwkJ
CQkJCW1pcG1hcHM6IHRleERhdGFzLm1pcG1hcHMKKwkJCQkJfTsKKworCQkJCQlsb2FkZWQgKz0g
MTsKKworCQkJCQlpZiAoIGxvYWRlZCA9PT0gNiApIHsKKworCQkJCQkJaWYgKCB0ZXhEYXRhcy5t
aXBtYXBDb3VudCA9PT0gMSApCisJCQkJCQkJdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0
ZXI7CisKKwkJCQkJCXRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0OworCQkJCQkJdGV4
dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCB0
ZXh0dXJlICk7CisKKwkJCQkJfQorCisJCQkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOworCisJ
CQl9CisKKwkJCWlmICggQXJyYXkuaXNBcnJheSggdXJsICkgKSB7CisKKwkJCQl2YXIgbG9hZGVk
ID0gMDsKKworCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSB1cmwubGVuZ3RoOyBpIDwgaWw7ICsr
IGkgKSB7CisKKwkJCQkJbG9hZFRleHR1cmUoIGkgKTsKKworCQkJCX0KKworCQkJfSBlbHNlIHsK
KworCQkJCS8vIGNvbXByZXNzZWQgY3ViZW1hcCB0ZXh0dXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBE
RFMgZmlsZQorCisJCQkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7CisK
KwkJCQkJdmFyIHRleERhdGFzID0gc2NvcGUuX3BhcnNlciggYnVmZmVyLCB0cnVlICk7CisKKwkJ
CQkJaWYgKCB0ZXhEYXRhcy5pc0N1YmVtYXAgKSB7CisKKwkJCQkJCXZhciBmYWNlcyA9IHRleERh
dGFzLm1pcG1hcHMubGVuZ3RoIC8gdGV4RGF0YXMubWlwbWFwQ291bnQ7CisKKwkJCQkJCWZvciAo
IHZhciBmID0gMDsgZiA8IGZhY2VzOyBmICsrICkgeworCisJCQkJCQkJaW1hZ2VzWyBmIF0gPSB7
IG1pcG1hcHMgOiBbXSB9OworCisJCQkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGV4RGF0YXMu
bWlwbWFwQ291bnQ7IGkgKysgKSB7CisKKwkJCQkJCQkJaW1hZ2VzWyBmIF0ubWlwbWFwcy5wdXNo
KCB0ZXhEYXRhcy5taXBtYXBzWyBmICogdGV4RGF0YXMubWlwbWFwQ291bnQgKyBpIF0gKTsKKwkJ
CQkJCQkJaW1hZ2VzWyBmIF0uZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0OworCQkJCQkJCQlpbWFn
ZXNbIGYgXS53aWR0aCA9IHRleERhdGFzLndpZHRoOworCQkJCQkJCQlpbWFnZXNbIGYgXS5oZWln
aHQgPSB0ZXhEYXRhcy5oZWlnaHQ7CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQl9IGVs
c2UgeworCisJCQkJCQl0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YXMud2lkdGg7CisJCQkJ
CQl0ZXh0dXJlLmltYWdlLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDsKKwkJCQkJCXRleHR1cmUu
bWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7CisKKwkJCQkJfQorCisJCQkJCWlmICggdGV4RGF0
YXMubWlwbWFwQ291bnQgPT09IDEgKSB7CisKKwkJCQkJCXRleHR1cmUubWluRmlsdGVyID0gTGlu
ZWFyRmlsdGVyOworCisJCQkJCX0KKworCQkJCQl0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGFzLmZv
cm1hdDsKKwkJCQkJdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCQkJaWYgKCBvbkxv
YWQgKSBvbkxvYWQoIHRleHR1cmUgKTsKKworCQkJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsK
KworCQkJfQorCisJCQlyZXR1cm4gdGV4dHVyZTsKKworCQl9LAorCisJCXNldFBhdGg6IGZ1bmN0
aW9uICggdmFsdWUgKSB7CisKKwkJCXRoaXMucGF0aCA9IHZhbHVlOworCQkJcmV0dXJuIHRoaXM7
CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBOaWtvcyBNLiAvIGh0dHBzOi8v
Z2l0aHViLmNvbS9mb28xMjMvCisJICoKKwkgKiBBYnN0cmFjdCBCYXNlIGNsYXNzIHRvIGxvYWQg
Z2VuZXJpYyBiaW5hcnkgdGV4dHVyZXMgZm9ybWF0cyAocmdiZSwgaGRyLCAuLi4pCisJICovCisK
KwlmdW5jdGlvbiBEYXRhVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHsKKworCQl0aGlzLm1hbmFn
ZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5n
TWFuYWdlcjsKKworCQkvLyBvdmVycmlkZSBpbiBzdWIgY2xhc3NlcworCQl0aGlzLl9wYXJzZXIg
PSBudWxsOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggRGF0YVRleHR1cmVMb2FkZXIucHJvdG90
eXBlLCB7CisKKwkJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25F
cnJvciApIHsKKworCQkJdmFyIHNjb3BlID0gdGhpczsKKworCQkJdmFyIHRleHR1cmUgPSBuZXcg
RGF0YVRleHR1cmUoKTsKKworCQkJdmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1h
bmFnZXIgKTsKKwkJCWxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTsKKwor
CQkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7CisKKwkJCQl2YXIgdGV4
RGF0YSA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciApOworCisJCQkJaWYgKCAhIHRleERhdGEgKSBy
ZXR1cm47CisKKwkJCQlpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5pbWFnZSApIHsKKworCQkJ
CQl0ZXh0dXJlLmltYWdlID0gdGV4RGF0YS5pbWFnZTsKKworCQkJCX0gZWxzZSBpZiAoIHVuZGVm
aW5lZCAhPT0gdGV4RGF0YS5kYXRhICkgeworCisJCQkJCXRleHR1cmUuaW1hZ2Uud2lkdGggPSB0
ZXhEYXRhLndpZHRoOworCQkJCQl0ZXh0dXJlLmltYWdlLmhlaWdodCA9IHRleERhdGEuaGVpZ2h0
OworCQkJCQl0ZXh0dXJlLmltYWdlLmRhdGEgPSB0ZXhEYXRhLmRhdGE7CisKKwkJCQl9CisKKwkJ
CQl0ZXh0dXJlLndyYXBTID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBTID8gdGV4RGF0YS53
cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7CisJCQkJdGV4dHVyZS53cmFwVCA9IHVuZGVmaW5l
ZCAhPT0gdGV4RGF0YS53cmFwVCA/IHRleERhdGEud3JhcFQgOiBDbGFtcFRvRWRnZVdyYXBwaW5n
OworCisJCQkJdGV4dHVyZS5tYWdGaWx0ZXIgPSB1bmRlZmluZWQgIT09IHRleERhdGEubWFnRmls
dGVyID8gdGV4RGF0YS5tYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7CisJCQkJdGV4dHVyZS5taW5G
aWx0ZXIgPSB1bmRlZmluZWQgIT09IHRleERhdGEubWluRmlsdGVyID8gdGV4RGF0YS5taW5GaWx0
ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7CisKKwkJCQl0ZXh0dXJlLmFuaXNvdHJvcHkg
PSB1bmRlZmluZWQgIT09IHRleERhdGEuYW5pc290cm9weSA/IHRleERhdGEuYW5pc290cm9weSA6
IDE7CisKKwkJCQlpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5mb3JtYXQgKSB7CisKKwkJCQkJ
dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhLmZvcm1hdDsKKworCQkJCX0KKwkJCQlpZiAoIHVuZGVm
aW5lZCAhPT0gdGV4RGF0YS50eXBlICkgeworCisJCQkJCXRleHR1cmUudHlwZSA9IHRleERhdGEu
dHlwZTsKKworCQkJCX0KKworCQkJCWlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1pcG1hcHMg
KSB7CisKKwkJCQkJdGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YS5taXBtYXBzOworCisJCQkJfQor
CisJCQkJaWYgKCAxID09PSB0ZXhEYXRhLm1pcG1hcENvdW50ICkgeworCisJCQkJCXRleHR1cmUu
bWluRmlsdGVyID0gTGluZWFyRmlsdGVyOworCisJCQkJfQorCisJCQkJdGV4dHVyZS5uZWVkc1Vw
ZGF0ZSA9IHRydWU7CisKKwkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSwgdGV4RGF0
YSApOworCisJCQl9LCBvblByb2dyZXNzLCBvbkVycm9yICk7CisKKworCQkJcmV0dXJuIHRleHR1
cmU7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8v
bXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEltYWdlTG9hZGVyKCBtYW5hZ2VyICkgewor
CisJCXRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDog
RGVmYXVsdExvYWRpbmdNYW5hZ2VyOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggSW1hZ2VMb2Fk
ZXIucHJvdG90eXBlLCB7CisKKwkJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9n
cmVzcywgb25FcnJvciApIHsKKworCQkJaWYgKCB1cmwgPT09IHVuZGVmaW5lZCApIHVybCA9ICcn
OworCisJCQlpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsg
dXJsOworCisJCQl2YXIgc2NvcGUgPSB0aGlzOworCisJCQl2YXIgY2FjaGVkID0gQ2FjaGUuZ2V0
KCB1cmwgKTsKKworCQkJaWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCXNjb3Bl
Lm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTsKKworCQkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uICgp
IHsKKworCQkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7CisKKwkJCQkJc2NvcGUu
bWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKKworCQkJCX0sIDAgKTsKKworCQkJCXJldHVybiBjYWNo
ZWQ7CisKKwkJCX0KKworCQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAn
aHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdpbWcnICk7CisKKwkJCWltYWdlLmFkZEV2
ZW50TGlzdGVuZXIoICdsb2FkJywgZnVuY3Rpb24gKCkgeworCisJCQkJQ2FjaGUuYWRkKCB1cmws
IHRoaXMgKTsKKworCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCB0aGlzICk7CisKKwkJCQlzY29w
ZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOworCisJCQl9LCBmYWxzZSApOworCisJCQkvKgorCQkJ
aW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ3Byb2dyZXNzJywgZnVuY3Rpb24gKCBldmVudCApIHsK
KworCQkJCWlmICggb25Qcm9ncmVzcyApIG9uUHJvZ3Jlc3MoIGV2ZW50ICk7CisKKwkJCX0sIGZh
bHNlICk7CisJCQkqLworCisJCQlpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBmdW5j
dGlvbiAoIGV2ZW50ICkgeworCisJCQkJaWYgKCBvbkVycm9yICkgb25FcnJvciggZXZlbnQgKTsK
KworCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CisJCQkJc2NvcGUubWFuYWdlci5p
dGVtRXJyb3IoIHVybCApOworCisJCQl9LCBmYWxzZSApOworCisJCQlpZiAoIHVybC5zdWJzdHIo
IDAsIDUgKSAhPT0gJ2RhdGE6JyApIHsKKworCQkJCWlmICggdGhpcy5jcm9zc09yaWdpbiAhPT0g
dW5kZWZpbmVkICkgaW1hZ2UuY3Jvc3NPcmlnaW4gPSB0aGlzLmNyb3NzT3JpZ2luOworCisJCQl9
CisKKwkJCXNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTsKKworCQkJaW1hZ2Uuc3JjID0g
dXJsOworCisJCQlyZXR1cm4gaW1hZ2U7CisKKwkJfSwKKworCQlzZXRDcm9zc09yaWdpbjogZnVu
Y3Rpb24gKCB2YWx1ZSApIHsKKworCQkJdGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlOworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfSwKKworCQlzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJ
CQl0aGlzLnBhdGggPSB2YWx1ZTsKKwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0gKTsKKwor
CS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlm
dW5jdGlvbiBDdWJlVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHsKKworCQl0aGlzLm1hbmFnZXIg
PSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFu
YWdlcjsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIEN1YmVUZXh0dXJlTG9hZGVyLnByb3RvdHlw
ZSwgeworCisJCWxvYWQ6IGZ1bmN0aW9uICggdXJscywgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVy
cm9yICkgeworCisJCQl2YXIgdGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpOworCisJCQl2YXIg
bG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTsKKwkJCWxvYWRlci5zZXRD
cm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApOworCQkJbG9hZGVyLnNldFBhdGgoIHRoaXMu
cGF0aCApOworCisJCQl2YXIgbG9hZGVkID0gMDsKKworCQkJZnVuY3Rpb24gbG9hZFRleHR1cmUo
IGkgKSB7CisKKwkJCQlsb2FkZXIubG9hZCggdXJsc1sgaSBdLCBmdW5jdGlvbiAoIGltYWdlICkg
eworCisJCQkJCXRleHR1cmUuaW1hZ2VzWyBpIF0gPSBpbWFnZTsKKworCQkJCQlsb2FkZWQgKys7
CisKKwkJCQkJaWYgKCBsb2FkZWQgPT09IDYgKSB7CisKKwkJCQkJCXRleHR1cmUubmVlZHNVcGRh
dGUgPSB0cnVlOworCisJCQkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApOworCisJ
CQkJCX0KKworCQkJCX0sIHVuZGVmaW5lZCwgb25FcnJvciApOworCisJCQl9CisKKwkJCWZvciAo
IHZhciBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyArKyBpICkgeworCisJCQkJbG9hZFRleHR1cmUo
IGkgKTsKKworCQkJfQorCisJCQlyZXR1cm4gdGV4dHVyZTsKKworCQl9LAorCisJCXNldENyb3Nz
T3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQl0aGlzLmNyb3NzT3JpZ2luID0gdmFs
dWU7CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldFBhdGg6IGZ1bmN0aW9uICggdmFs
dWUgKSB7CisKKwkJCXRoaXMucGF0aCA9IHZhbHVlOworCQkJcmV0dXJuIHRoaXM7CisKKwkJfQor
CisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8K
KwkgKi8KKworCWZ1bmN0aW9uIFRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7CisKKwkJdGhpcy5t
YW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9h
ZGluZ01hbmFnZXI7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBUZXh0dXJlTG9hZGVyLnByb3Rv
dHlwZSwgeworCisJCWxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9u
RXJyb3IgKSB7CisKKwkJCXZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdl
ciApOworCQkJbG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7CisJCQls
b2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7CisKKwkJCXZhciB0ZXh0dXJlID0gbmV3IFRleHR1
cmUoKTsKKwkJCXRleHR1cmUuaW1hZ2UgPSBsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoKSB7
CisKKwkJCQkvLyBKUEVHcyBjYW4ndCBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIHNvIG1lbW9yeSBj
YW4gYmUgc2F2ZWQgYnkgc3RvcmluZyB0aGVtIGFzIFJHQi4KKwkJCQl2YXIgaXNKUEVHID0gdXJs
LnNlYXJjaCggL1wuKGpwZ3xqcGVnKSQvICkgPiAwIHx8IHVybC5zZWFyY2goIC9eZGF0YVw6aW1h
Z2VcL2pwZWcvICkgPT09IDA7CisKKwkJCQl0ZXh0dXJlLmZvcm1hdCA9IGlzSlBFRyA/IFJHQkZv
cm1hdCA6IFJHQkFGb3JtYXQ7CisJCQkJdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJ
CQlpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCW9uTG9hZCggdGV4dHVyZSAp
OworCisJCQkJfQorCisJCQl9LCBvblByb2dyZXNzLCBvbkVycm9yICk7CisKKwkJCXJldHVybiB0
ZXh0dXJlOworCisJCX0sCisKKwkJc2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7
CisKKwkJCXRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTsKKwkJCXJldHVybiB0aGlzOworCisJCX0s
CisKKwkJc2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJdGhpcy5wYXRoID0gdmFs
dWU7CisJCQlyZXR1cm4gdGhpczsKKworCQl9CisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9y
IG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRw
Oi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICovCisKKwlmdW5jdGlvbiBMaWdodCggY29sb3IsIGlu
dGVuc2l0eSApIHsKKworCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy50eXBlID0g
J0xpZ2h0JzsKKworCQl0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApOworCQl0aGlzLmlu
dGVuc2l0eSA9IGludGVuc2l0eSAhPT0gdW5kZWZpbmVkID8gaW50ZW5zaXR5IDogMTsKKworCQl0
aGlzLnJlY2VpdmVTaGFkb3cgPSB1bmRlZmluZWQ7CisKKwl9CisKKwlMaWdodC5wcm90b3R5cGUg
PSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgewor
CisJCWNvbnN0cnVjdG9yOiBMaWdodCwKKworCQlpc0xpZ2h0OiB0cnVlLAorCisJCWNvcHk6IGZ1
bmN0aW9uICggc291cmNlICkgeworCisJCQlPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0
aGlzLCBzb3VyY2UgKTsKKworCQkJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKKwkJ
CXRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKKworCQkJdmFyIGRhdGEgPSBP
YmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTsKKworCQkJZGF0YS5v
YmplY3QuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpOworCQkJZGF0YS5vYmplY3QuaW50ZW5z
aXR5ID0gdGhpcy5pbnRlbnNpdHk7CisKKwkJCWlmICggdGhpcy5ncm91bmRDb2xvciAhPT0gdW5k
ZWZpbmVkICkgZGF0YS5vYmplY3QuZ3JvdW5kQ29sb3IgPSB0aGlzLmdyb3VuZENvbG9yLmdldEhl
eCgpOworCisJCQlpZiAoIHRoaXMuZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0
LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTsKKwkJCWlmICggdGhpcy5hbmdsZSAhPT0gdW5kZWZp
bmVkICkgZGF0YS5vYmplY3QuYW5nbGUgPSB0aGlzLmFuZ2xlOworCQkJaWYgKCB0aGlzLmRlY2F5
ICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5kZWNheSA9IHRoaXMuZGVjYXk7CisJCQlpZiAo
IHRoaXMucGVudW1icmEgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhp
cy5wZW51bWJyYTsKKworCQkJaWYgKCB0aGlzLnNoYWRvdyAhPT0gdW5kZWZpbmVkICkgZGF0YS5v
YmplY3Quc2hhZG93ID0gdGhpcy5zaGFkb3cudG9KU09OKCk7CisKKwkJCXJldHVybiBkYXRhOwor
CisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0
ZXJlZHF1YWxpYS5jb20vCisJICovCisKKwlmdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHQoIHNreUNv
bG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ICkgeworCisJCUxpZ2h0LmNhbGwoIHRoaXMsIHNr
eUNvbG9yLCBpbnRlbnNpdHkgKTsKKworCQl0aGlzLnR5cGUgPSAnSGVtaXNwaGVyZUxpZ2h0JzsK
KworCQl0aGlzLmNhc3RTaGFkb3cgPSB1bmRlZmluZWQ7CisKKwkJdGhpcy5wb3NpdGlvbi5jb3B5
KCBPYmplY3QzRC5EZWZhdWx0VXAgKTsKKwkJdGhpcy51cGRhdGVNYXRyaXgoKTsKKworCQl0aGlz
Lmdyb3VuZENvbG9yID0gbmV3IENvbG9yKCBncm91bmRDb2xvciApOworCisJfQorCisJSGVtaXNw
aGVyZUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0
LnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IEhlbWlzcGhlcmVMaWdodCwKKworCQlp
c0hlbWlzcGhlcmVMaWdodDogdHJ1ZSwKKworCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsK
KworCQkJTGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CisKKwkJCXRo
aXMuZ3JvdW5kQ29sb3IuY29weSggc291cmNlLmdyb3VuZENvbG9yICk7CisKKwkJCXJldHVybiB0
aGlzOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDov
L21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBMaWdodFNoYWRvdyggY2FtZXJhICkgewor
CisJCXRoaXMuY2FtZXJhID0gY2FtZXJhOworCisJCXRoaXMuYmlhcyA9IDA7CisJCXRoaXMucmFk
aXVzID0gMTsKKworCQl0aGlzLm1hcFNpemUgPSBuZXcgVmVjdG9yMiggNTEyLCA1MTIgKTsKKwor
CQl0aGlzLm1hcCA9IG51bGw7CisJCXRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKKworCX0K
KworCU9iamVjdC5hc3NpZ24oIExpZ2h0U2hhZG93LnByb3RvdHlwZSwgeworCisJCWNvcHk6IGZ1
bmN0aW9uICggc291cmNlICkgeworCisJCQl0aGlzLmNhbWVyYSA9IHNvdXJjZS5jYW1lcmEuY2xv
bmUoKTsKKworCQkJdGhpcy5iaWFzID0gc291cmNlLmJpYXM7CisJCQl0aGlzLnJhZGl1cyA9IHNv
dXJjZS5yYWRpdXM7CisKKwkJCXRoaXMubWFwU2l6ZS5jb3B5KCBzb3VyY2UubWFwU2l6ZSApOwor
CisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7CisKKwkJ
CXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKworCQl9LAorCisJ
CXRvSlNPTjogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgb2JqZWN0ID0ge307CisKKwkJCWlmICgg
dGhpcy5iaWFzICE9PSAwICkgb2JqZWN0LmJpYXMgPSB0aGlzLmJpYXM7CisJCQlpZiAoIHRoaXMu
cmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzOworCQkJaWYgKCB0aGlz
Lm1hcFNpemUueCAhPT0gNTEyIHx8IHRoaXMubWFwU2l6ZS55ICE9PSA1MTIgKSBvYmplY3QubWFw
U2l6ZSA9IHRoaXMubWFwU2l6ZS50b0FycmF5KCk7CisKKwkJCW9iamVjdC5jYW1lcmEgPSB0aGlz
LmNhbWVyYS50b0pTT04oIGZhbHNlICkub2JqZWN0OworCQkJZGVsZXRlIG9iamVjdC5jYW1lcmEu
bWF0cml4OworCisJCQlyZXR1cm4gb2JqZWN0OworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAq
IEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBT
cG90TGlnaHRTaGFkb3coKSB7CisKKwkJTGlnaHRTaGFkb3cuY2FsbCggdGhpcywgbmV3IFBlcnNw
ZWN0aXZlQ2FtZXJhKCA1MCwgMSwgMC41LCA1MDAgKSApOworCisJfQorCisJU3BvdExpZ2h0U2hh
ZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93
LnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IFNwb3RMaWdodFNoYWRvdywKKworCQlp
c1Nwb3RMaWdodFNoYWRvdzogdHJ1ZSwKKworCQl1cGRhdGU6IGZ1bmN0aW9uICggbGlnaHQgKSB7
CisKKwkJCXZhciBjYW1lcmEgPSB0aGlzLmNhbWVyYTsKKworCQkJdmFyIGZvdiA9IF9NYXRoLlJB
RDJERUcgKiAyICogbGlnaHQuYW5nbGU7CisJCQl2YXIgYXNwZWN0ID0gdGhpcy5tYXBTaXplLndp
ZHRoIC8gdGhpcy5tYXBTaXplLmhlaWdodDsKKwkJCXZhciBmYXIgPSBsaWdodC5kaXN0YW5jZSB8
fCBjYW1lcmEuZmFyOworCisJCQlpZiAoIGZvdiAhPT0gY2FtZXJhLmZvdiB8fCBhc3BlY3QgIT09
IGNhbWVyYS5hc3BlY3QgfHwgZmFyICE9PSBjYW1lcmEuZmFyICkgeworCisJCQkJY2FtZXJhLmZv
diA9IGZvdjsKKwkJCQljYW1lcmEuYXNwZWN0ID0gYXNwZWN0OworCQkJCWNhbWVyYS5mYXIgPSBm
YXI7CisJCQkJY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKKworCQkJfQorCisJCX0K
KworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1
YWxpYS5jb20vCisJICovCisKKwlmdW5jdGlvbiBTcG90TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHks
IGRpc3RhbmNlLCBhbmdsZSwgcGVudW1icmEsIGRlY2F5ICkgeworCisJCUxpZ2h0LmNhbGwoIHRo
aXMsIGNvbG9yLCBpbnRlbnNpdHkgKTsKKworCQl0aGlzLnR5cGUgPSAnU3BvdExpZ2h0JzsKKwor
CQl0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApOworCQl0aGlzLnVwZGF0
ZU1hdHJpeCgpOworCisJCXRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7CisKKwkJT2JqZWN0
LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncG93ZXInLCB7CisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsK
KwkJCQkvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuCisJCQkJLy8gcmVmOiBl
cXVhdGlvbiAoMTcpIGZyb20gaHR0cDovL3d3dy5mcm9zdGJpdGUuY29tL3dwLWNvbnRlbnQvdXBs
b2Fkcy8yMDE0LzExL2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bici5wZGYKKwkJ
CQlyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiBNYXRoLlBJOworCQkJfSwKKwkJCXNldDogZnVuY3Rp
b24gKCBwb3dlciApIHsKKwkJCQkvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUu
CisJCQkJLy8gcmVmOiBlcXVhdGlvbiAoMTcpIGZyb20gaHR0cDovL3d3dy5mcm9zdGJpdGUuY29t
L3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE0LzExL2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRl
X3RvX3Bici5wZGYKKwkJCQl0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gTWF0aC5QSTsKKwkJCX0K
KwkJfSApOworCisJCXRoaXMuZGlzdGFuY2UgPSAoIGRpc3RhbmNlICE9PSB1bmRlZmluZWQgKSA/
IGRpc3RhbmNlIDogMDsKKwkJdGhpcy5hbmdsZSA9ICggYW5nbGUgIT09IHVuZGVmaW5lZCApID8g
YW5nbGUgOiBNYXRoLlBJIC8gMzsKKwkJdGhpcy5wZW51bWJyYSA9ICggcGVudW1icmEgIT09IHVu
ZGVmaW5lZCApID8gcGVudW1icmEgOiAwOworCQl0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5k
ZWZpbmVkICkgPyBkZWNheSA6IDE7CS8vIGZvciBwaHlzaWNhbGx5IGNvcnJlY3QgbGlnaHRzLCBz
aG91bGQgYmUgMi4KKworCQl0aGlzLnNoYWRvdyA9IG5ldyBTcG90TGlnaHRTaGFkb3coKTsKKwor
CX0KKworCVNwb3RMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRl
KCBMaWdodC5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBTcG90TGlnaHQsCisKKwkJ
aXNTcG90TGlnaHQ6IHRydWUsCisKKwkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJ
CUxpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOworCisJCQl0aGlzLmRp
c3RhbmNlID0gc291cmNlLmRpc3RhbmNlOworCQkJdGhpcy5hbmdsZSA9IHNvdXJjZS5hbmdsZTsK
KwkJCXRoaXMucGVudW1icmEgPSBzb3VyY2UucGVudW1icmE7CisJCQl0aGlzLmRlY2F5ID0gc291
cmNlLmRlY2F5OworCisJCQl0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTsKKwor
CQkJdGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21y
ZG9vYi5jb20vCisJICovCisKKworCWZ1bmN0aW9uIFBvaW50TGlnaHQoIGNvbG9yLCBpbnRlbnNp
dHksIGRpc3RhbmNlLCBkZWNheSApIHsKKworCQlMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50
ZW5zaXR5ICk7CisKKwkJdGhpcy50eXBlID0gJ1BvaW50TGlnaHQnOworCisJCU9iamVjdC5kZWZp
bmVQcm9wZXJ0eSggdGhpcywgJ3Bvd2VyJywgeworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CisJCQkJ
Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLgorCQkJCS8vIHJlZjogZXF1YXRp
b24gKDE1KSBmcm9tIGh0dHA6Ly93d3cuZnJvc3RiaXRlLmNvbS93cC1jb250ZW50L3VwbG9hZHMv
MjAxNC8xMS9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnIucGRmCisJCQkJcmV0
dXJuIHRoaXMuaW50ZW5zaXR5ICogNCAqIE1hdGguUEk7CisKKwkJCX0sCisJCQlzZXQ6IGZ1bmN0
aW9uICggcG93ZXIgKSB7CisJCQkJLy8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xl
LgorCQkJCS8vIHJlZjogZXF1YXRpb24gKDE1KSBmcm9tIGh0dHA6Ly93d3cuZnJvc3RiaXRlLmNv
bS93cC1jb250ZW50L3VwbG9hZHMvMjAxNC8xMS9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0
ZV90b19wYnIucGRmCisJCQkJdGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvICggNCAqIE1hdGguUEkg
KTsKKwkJCX0KKwkJfSApOworCisJCXRoaXMuZGlzdGFuY2UgPSAoIGRpc3RhbmNlICE9PSB1bmRl
ZmluZWQgKSA/IGRpc3RhbmNlIDogMDsKKwkJdGhpcy5kZWNheSA9ICggZGVjYXkgIT09IHVuZGVm
aW5lZCApID8gZGVjYXkgOiAxOwkvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hv
dWxkIGJlIDIuCisKKwkJdGhpcy5zaGFkb3cgPSBuZXcgTGlnaHRTaGFkb3coIG5ldyBQZXJzcGVj
dGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwgNTAwICkgKTsKKworCX0KKworCVBvaW50TGlnaHQucHJv
dG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICks
IHsKKworCQljb25zdHJ1Y3RvcjogUG9pbnRMaWdodCwKKworCQlpc1BvaW50TGlnaHQ6IHRydWUs
CisKKwkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJCUxpZ2h0LnByb3RvdHlwZS5j
b3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOworCisJCQl0aGlzLmRpc3RhbmNlID0gc291cmNlLmRp
c3RhbmNlOworCQkJdGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTsKKworCQkJdGhpcy5zaGFkb3cg
PSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0g
KTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICov
CisKKwlmdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0U2hhZG93KCApIHsKKworCQlMaWdodFNoYWRv
dy5jYWxsKCB0aGlzLCBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCAtIDUsIDUsIDUsIC0gNSwgMC41
LCA1MDAgKSApOworCisJfQorCisJRGlyZWN0aW9uYWxMaWdodFNoYWRvdy5wcm90b3R5cGUgPSBP
YmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFNoYWRvdy5wcm90b3R5cGUgKSwgewor
CisJCWNvbnN0cnVjdG9yOiBEaXJlY3Rpb25hbExpZ2h0U2hhZG93CisKKwl9ICk7CisKKwkvKioK
KwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgYWx0
ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJICovCisKKwlmdW5jdGlvbiBEaXJl
Y3Rpb25hbExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkgeworCisJCUxpZ2h0LmNhbGwoIHRoaXMs
IGNvbG9yLCBpbnRlbnNpdHkgKTsKKworCQl0aGlzLnR5cGUgPSAnRGlyZWN0aW9uYWxMaWdodCc7
CisKKwkJdGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTsKKwkJdGhpcy51
cGRhdGVNYXRyaXgoKTsKKworCQl0aGlzLnRhcmdldCA9IG5ldyBPYmplY3QzRCgpOworCisJCXRo
aXMuc2hhZG93ID0gbmV3IERpcmVjdGlvbmFsTGlnaHRTaGFkb3coKTsKKworCX0KKworCURpcmVj
dGlvbmFsTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGln
aHQucHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodCwKKwor
CQlpc0RpcmVjdGlvbmFsTGlnaHQ6IHRydWUsCisKKwkJY29weTogZnVuY3Rpb24gKCBzb3VyY2Ug
KSB7CisKKwkJCUxpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOworCisJ
CQl0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTsKKworCQkJdGhpcy5zaGFkb3cg
PSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0g
KTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICov
CisKKwlmdW5jdGlvbiBBbWJpZW50TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7CisKKwkJTGln
aHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApOworCisJCXRoaXMudHlwZSA9ICdBbWJp
ZW50TGlnaHQnOworCisJCXRoaXMuY2FzdFNoYWRvdyA9IHVuZGVmaW5lZDsKKworCX0KKworCUFt
YmllbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdo
dC5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBBbWJpZW50TGlnaHQsCisKKwkJaXNB
bWJpZW50TGlnaHQ6IHRydWUKKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgYWJlbG5hdGlv
biAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb24KKwkgKi8KKworCWZ1bmN0aW9uIFJlY3RB
cmVhTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIHdpZHRoLCBoZWlnaHQgKSB7CisKKwkJTGlnaHQu
Y2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApOworCisJCXRoaXMudHlwZSA9ICdSZWN0QXJl
YUxpZ2h0JzsKKworCQl0aGlzLnBvc2l0aW9uLnNldCggMCwgMSwgMCApOworCQl0aGlzLnVwZGF0
ZU1hdHJpeCgpOworCisJCXRoaXMud2lkdGggPSAoIHdpZHRoICE9PSB1bmRlZmluZWQgKSA/IHdp
ZHRoIDogMTA7CisJCXRoaXMuaGVpZ2h0ID0gKCBoZWlnaHQgIT09IHVuZGVmaW5lZCApID8gaGVp
Z2h0IDogMTA7CisKKwkJLy8gVE9ETyAoYWJlbG5hdGlvbik6IGRpc3RhbmNlL2RlY2F5CisKKwkJ
Ly8gVE9ETyAoYWJlbG5hdGlvbik6IHVwZGF0ZSBtZXRob2QgZm9yIFJlY3RBcmVhTGlnaHQgdG8g
dXBkYXRlIHRyYW5zZm9ybSB0byBsb29rYXQgdGFyZ2V0CisKKwkJLy8gVE9ETyAoYWJlbG5hdGlv
bik6IHNoYWRvd3MKKworCX0KKworCS8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0
IHVwZGF0ZSB3aGVuIGxpZ2h0IHNoYXBlIGlzIGNoYW5nZWQKKwlSZWN0QXJlYUxpZ2h0LnByb3Rv
dHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7
CisKKwkJY29uc3RydWN0b3I6IFJlY3RBcmVhTGlnaHQsCisKKwkJaXNSZWN0QXJlYUxpZ2h0OiB0
cnVlLAorCisJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisJCQlMaWdodC5wcm90b3R5
cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworCQkJdGhpcy53aWR0aCA9IHNvdXJjZS53
aWR0aDsKKwkJCXRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDsKKworCQkJcmV0dXJuIHRoaXM7
CisKKwkJfSwKKworCQl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKKworCQkJdmFyIGRhdGEg
PSBMaWdodC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTsKKworCQkJZGF0YS5v
YmplY3Qud2lkdGggPSB0aGlzLndpZHRoOworCQkJZGF0YS5vYmplY3QuaGVpZ2h0ID0gdGhpcy5o
ZWlnaHQ7CisKKwkJCXJldHVybiBkYXRhOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBh
dXRob3IgdHNjaHcKKwkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwor
CSAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworCSAqLworCisJ
dmFyIEFuaW1hdGlvblV0aWxzID0geworCisJCS8vIHNhbWUgYXMgQXJyYXkucHJvdG90eXBlLnNs
aWNlLCBidXQgYWxzbyB3b3JrcyBvbiB0eXBlZCBhcnJheXMKKwkJYXJyYXlTbGljZTogZnVuY3Rp
b24gKCBhcnJheSwgZnJvbSwgdG8gKSB7CisKKwkJCWlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBl
ZEFycmF5KCBhcnJheSApICkgeworCisJCQkJLy8gaW4gaW9zOSBhcnJheS5zdWJhcnJheShmcm9t
LCB1bmRlZmluZWQpIHdpbGwgcmV0dXJuIGVtcHR5IGFycmF5CisJCQkJLy8gYnV0IGFycmF5LnN1
YmFycmF5KGZyb20pIG9yIGFycmF5LnN1YmFycmF5KGZyb20sIGxlbikgaXMgY29ycmVjdAorCQkJ
CXJldHVybiBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGFycmF5LnN1YmFycmF5KCBmcm9tLCB0byAh
PT0gdW5kZWZpbmVkID8gdG8gOiBhcnJheS5sZW5ndGggKSApOworCisJCQl9CisKKwkJCXJldHVy
biBhcnJheS5zbGljZSggZnJvbSwgdG8gKTsKKworCQl9LAorCisJCS8vIGNvbnZlcnRzIGFuIGFy
cmF5IHRvIGEgc3BlY2lmaWMgdHlwZQorCQljb252ZXJ0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXks
IHR5cGUsIGZvcmNlQ2xvbmUgKSB7CisKKwkJCWlmICggISBhcnJheSB8fCAvLyBsZXQgJ3VuZGVm
aW5lZCcgYW5kICdudWxsJyBwYXNzCisJCQkJCSEgZm9yY2VDbG9uZSAmJiBhcnJheS5jb25zdHJ1
Y3RvciA9PT0gdHlwZSApIHJldHVybiBhcnJheTsKKworCQkJaWYgKCB0eXBlb2YgdHlwZS5CWVRF
U19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7CisKKwkJCQlyZXR1cm4gbmV3IHR5cGUoIGFy
cmF5ICk7IC8vIGNyZWF0ZSB0eXBlZCBhcnJheQorCisJCQl9CisKKwkJCXJldHVybiBBcnJheS5w
cm90b3R5cGUuc2xpY2UuY2FsbCggYXJyYXkgKTsgLy8gY3JlYXRlIEFycmF5CisKKwkJfSwKKwor
CQlpc1R5cGVkQXJyYXk6IGZ1bmN0aW9uICggb2JqZWN0ICkgeworCisJCQlyZXR1cm4gQXJyYXlC
dWZmZXIuaXNWaWV3KCBvYmplY3QgKSAmJgorCQkJCQkhICggb2JqZWN0IGluc3RhbmNlb2YgRGF0
YVZpZXcgKTsKKworCQl9LAorCisJCS8vIHJldHVybnMgYW4gYXJyYXkgYnkgd2hpY2ggdGltZXMg
YW5kIHZhbHVlcyBjYW4gYmUgc29ydGVkCisJCWdldEtleWZyYW1lT3JkZXI6IGZ1bmN0aW9uICgg
dGltZXMgKSB7CisKKwkJCWZ1bmN0aW9uIGNvbXBhcmVUaW1lKCBpLCBqICkgeworCisJCQkJcmV0
dXJuIHRpbWVzWyBpIF0gLSB0aW1lc1sgaiBdOworCisJCQl9CisKKwkJCXZhciBuID0gdGltZXMu
bGVuZ3RoOworCQkJdmFyIHJlc3VsdCA9IG5ldyBBcnJheSggbiApOworCQkJZm9yICggdmFyIGkg
PSAwOyBpICE9PSBuOyArKyBpICkgcmVzdWx0WyBpIF0gPSBpOworCisJCQlyZXN1bHQuc29ydCgg
Y29tcGFyZVRpbWUgKTsKKworCQkJcmV0dXJuIHJlc3VsdDsKKworCQl9LAorCisJCS8vIHVzZXMg
dGhlIGFycmF5IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgJ2dldEtleWZyYW1lT3JkZXInIHRvIHNv
cnQgZGF0YQorCQlzb3J0ZWRBcnJheTogZnVuY3Rpb24gKCB2YWx1ZXMsIHN0cmlkZSwgb3JkZXIg
KSB7CisKKwkJCXZhciBuVmFsdWVzID0gdmFsdWVzLmxlbmd0aDsKKwkJCXZhciByZXN1bHQgPSBu
ZXcgdmFsdWVzLmNvbnN0cnVjdG9yKCBuVmFsdWVzICk7CisKKwkJCWZvciAoIHZhciBpID0gMCwg
ZHN0T2Zmc2V0ID0gMDsgZHN0T2Zmc2V0ICE9PSBuVmFsdWVzOyArKyBpICkgeworCisJCQkJdmFy
IHNyY09mZnNldCA9IG9yZGVyWyBpIF0gKiBzdHJpZGU7CisKKwkJCQlmb3IgKCB2YXIgaiA9IDA7
IGogIT09IHN0cmlkZTsgKysgaiApIHsKKworCQkJCQlyZXN1bHRbIGRzdE9mZnNldCArKyBdID0g
dmFsdWVzWyBzcmNPZmZzZXQgKyBqIF07CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuIHJl
c3VsdDsKKworCQl9LAorCisJCS8vIGZ1bmN0aW9uIGZvciBwYXJzaW5nIEFPUyBrZXlmcmFtZSBm
b3JtYXRzCisJCWZsYXR0ZW5KU09OOiBmdW5jdGlvbiAoIGpzb25LZXlzLCB0aW1lcywgdmFsdWVz
LCB2YWx1ZVByb3BlcnR5TmFtZSApIHsKKworCQkJdmFyIGkgPSAxLCBrZXkgPSBqc29uS2V5c1sg
MCBdOworCisJCQl3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleVsgdmFsdWVQcm9wZXJ0
eU5hbWUgXSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJa2V5ID0ganNvbktleXNbIGkgKysgXTsK
KworCQkJfQorCisJCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRh
CisKKwkJCXZhciB2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTsKKwkJCWlmICggdmFs
dWUgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YQorCisJCQlpZiAoIEFycmF5Lmlz
QXJyYXkoIHZhbHVlICkgKSB7CisKKwkJCQlkbyB7CisKKwkJCQkJdmFsdWUgPSBrZXlbIHZhbHVl
UHJvcGVydHlOYW1lIF07CisKKwkJCQkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworCisJ
CQkJCQl0aW1lcy5wdXNoKCBrZXkudGltZSApOworCQkJCQkJdmFsdWVzLnB1c2guYXBwbHkoIHZh
bHVlcywgdmFsdWUgKTsgLy8gcHVzaCBhbGwgZWxlbWVudHMKKworCQkJCQl9CisKKwkJCQkJa2V5
ID0ganNvbktleXNbIGkgKysgXTsKKworCQkJCX0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCAp
OworCisJCQl9IGVsc2UgaWYgKCB2YWx1ZS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJ
CQkvLyAuLi5hc3N1bWUgVEhSRUUuTWF0aC1pc2gKKworCQkJCWRvIHsKKworCQkJCQl2YWx1ZSA9
IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTsKKworCQkJCQlpZiAoIHZhbHVlICE9PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCQkJCXRpbWVzLnB1c2goIGtleS50aW1lICk7CisJCQkJCQl2YWx1ZS50b0Fy
cmF5KCB2YWx1ZXMsIHZhbHVlcy5sZW5ndGggKTsKKworCQkJCQl9CisKKwkJCQkJa2V5ID0ganNv
bktleXNbIGkgKysgXTsKKworCQkJCX0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApOworCisJ
CQl9IGVsc2UgeworCisJCQkJLy8gb3RoZXJ3aXNlIHB1c2ggYXMtaXMKKworCQkJCWRvIHsKKwor
CQkJCQl2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTsKKworCQkJCQlpZiAoIHZhbHVl
ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCXRpbWVzLnB1c2goIGtleS50aW1lICk7CisJCQkJ
CQl2YWx1ZXMucHVzaCggdmFsdWUgKTsKKworCQkJCQl9CisKKwkJCQkJa2V5ID0ganNvbktleXNb
IGkgKysgXTsKKworCQkJCX0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApOworCisJCQl9CisK
KwkJfQorCisJfTsKKworCS8qKgorCSAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgaW50ZXJwb2xh
bnRzIG92ZXIgcGFyYW1ldHJpYyBzYW1wbGVzLgorCSAqCisJICogVGhlIHBhcmFtZXRlciBkb21h
aW4gaXMgb25lIGRpbWVuc2lvbmFsLCB0eXBpY2FsbHkgdGhlIHRpbWUgb3IgYSBwYXRoCisJICog
YWxvbmcgYSBjdXJ2ZSBkZWZpbmVkIGJ5IHRoZSBkYXRhLgorCSAqCisJICogVGhlIHNhbXBsZSB2
YWx1ZXMgY2FuIGhhdmUgYW55IGRpbWVuc2lvbmFsaXR5IGFuZCBkZXJpdmVkIGNsYXNzZXMgbWF5
CisJICogYXBwbHkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbnMgdG8gdGhlIGRhdGEuCisJICoKKwkg
KiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBpbnRlcnZhbCBzZWVrIGluIGEgVGVtcGxhdGUgTWV0
aG9kLCBkZWZlcnJpbmcKKwkgKiB0aGUgYWN0dWFsIGludGVycG9sYXRpb24gdG8gZGVyaXZlZCBj
bGFzc2VzLgorCSAqCisJICogVGltZSBjb21wbGV4aXR5IGlzIE8oMSkgZm9yIGxpbmVhciBhY2Nl
c3MgY3Jvc3NpbmcgYXQgbW9zdCB0d28gcG9pbnRzCisJICogYW5kIE8obG9nIE4pIGZvciByYW5k
b20gYWNjZXNzLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25zLgorCSAqCisJICog
UmVmZXJlbmNlczoKKwkgKgorCSAqIAkJaHR0cDovL3d3dy5vb2Rlc2lnbi5jb20vdGVtcGxhdGUt
bWV0aG9kLXBhdHRlcm4uaHRtbAorCSAqCisJICogQGF1dGhvciB0c2NodworCSAqLworCisJZnVu
Y3Rpb24gSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1w
bGVTaXplLCByZXN1bHRCdWZmZXIgKSB7CisKKwkJdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMgPSBw
YXJhbWV0ZXJQb3NpdGlvbnM7CisJCXRoaXMuX2NhY2hlZEluZGV4ID0gMDsKKworCQl0aGlzLnJl
c3VsdEJ1ZmZlciA9IHJlc3VsdEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8KKwkJCQlyZXN1bHRCdWZm
ZXIgOiBuZXcgc2FtcGxlVmFsdWVzLmNvbnN0cnVjdG9yKCBzYW1wbGVTaXplICk7CisJCXRoaXMu
c2FtcGxlVmFsdWVzID0gc2FtcGxlVmFsdWVzOworCQl0aGlzLnZhbHVlU2l6ZSA9IHNhbXBsZVNp
emU7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHsKKwor
CQlldmFsdWF0ZTogZnVuY3Rpb24oIHQgKSB7CisKKwkJCXZhciBwcCA9IHRoaXMucGFyYW1ldGVy
UG9zaXRpb25zLAorCQkJCWkxID0gdGhpcy5fY2FjaGVkSW5kZXgsCisKKwkJCQl0MSA9IHBwWyAg
IGkxICAgXSwKKwkJCQl0MCA9IHBwWyBpMSAtIDEgXTsKKworCQkJdmFsaWRhdGVfaW50ZXJ2YWw6
IHsKKworCQkJCXNlZWs6IHsKKworCQkJCQl2YXIgcmlnaHQ7CisKKwkJCQkJbGluZWFyX3NjYW46
IHsKKwkJCQkJCS8vLSBTZWUgaHR0cDovL2pzcGVyZi5jb20vY29tcGFyaXNvbi10by11bmRlZmlu
ZWQvMworCQkJCQkJLy8tIHNsb3dlciBjb2RlOgorCQkJCQkJLy8tCisJCQkJCQkvLy0gCQkJCWlm
ICggdCA+PSB0MSB8fCB0MSA9PT0gdW5kZWZpbmVkICkgeworCQkJCQkJZm9yd2FyZF9zY2FuOiBp
ZiAoICEgKCB0IDwgdDEgKSApIHsKKworCQkJCQkJCWZvciAoIHZhciBnaXZlVXBBdCA9IGkxICsg
MjsgOykgeworCisJCQkJCQkJCWlmICggdDEgPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJCQkJ
aWYgKCB0IDwgdDAgKSBicmVhayBmb3J3YXJkX3NjYW47CisKKwkJCQkJCQkJCS8vIGFmdGVyIGVu
ZAorCisJCQkJCQkJCQlpMSA9IHBwLmxlbmd0aDsKKwkJCQkJCQkJCXRoaXMuX2NhY2hlZEluZGV4
ID0gaTE7CisJCQkJCQkJCQlyZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdCwgdDAgKTsK
KworCQkJCQkJCQl9CisKKwkJCQkJCQkJaWYgKCBpMSA9PT0gZ2l2ZVVwQXQgKSBicmVhazsgLy8g
dGhpcyBsb29wCisKKwkJCQkJCQkJdDAgPSB0MTsKKwkJCQkJCQkJdDEgPSBwcFsgKysgaTEgXTsK
KworCQkJCQkJCQlpZiAoIHQgPCB0MSApIHsKKworCQkJCQkJCQkJLy8gd2UgaGF2ZSBhcnJpdmVk
IGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWwKKwkJCQkJCQkJCWJyZWFrIHNlZWs7CisKKwkJCQkJCQkJ
fQorCisJCQkJCQkJfQorCisJCQkJCQkJLy8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9uIHRoZSBy
aWdodCBzaWRlIG9mIHRoZSBpbmRleAorCQkJCQkJCXJpZ2h0ID0gcHAubGVuZ3RoOworCQkJCQkJ
CWJyZWFrIGxpbmVhcl9zY2FuOworCisJCQkJCQl9CisKKwkJCQkJCS8vLSBzbG93ZXIgY29kZToK
KwkJCQkJCS8vLQkJCQkJaWYgKCB0IDwgdDAgfHwgdDAgPT09IHVuZGVmaW5lZCApIHsKKwkJCQkJ
CWlmICggISAoIHQgPj0gdDAgKSApIHsKKworCQkJCQkJCS8vIGxvb3Bpbmc/CisKKwkJCQkJCQl2
YXIgdDFnbG9iYWwgPSBwcFsgMSBdOworCisJCQkJCQkJaWYgKCB0IDwgdDFnbG9iYWwgKSB7CisK
KwkJCQkJCQkJaTEgPSAyOyAvLyArIDEsIHVzaW5nIHRoZSBzY2FuIGZvciB0aGUgZGV0YWlscwor
CQkJCQkJCQl0MCA9IHQxZ2xvYmFsOworCisJCQkJCQkJfQorCisJCQkJCQkJLy8gbGluZWFyIHJl
dmVyc2Ugc2NhbgorCisJCQkJCQkJZm9yICggdmFyIGdpdmVVcEF0ID0gaTEgLSAyOyA7KSB7CisK
KwkJCQkJCQkJaWYgKCB0MCA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCQkJCQkvLyBiZWZvcmUg
c3RhcnQKKworCQkJCQkJCQkJdGhpcy5fY2FjaGVkSW5kZXggPSAwOworCQkJCQkJCQkJcmV0dXJu
IHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApOworCisJCQkJCQkJCX0KKworCQkJCQkJCQlp
ZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3AKKworCQkJCQkJCQl0MSA9
IHQwOworCQkJCQkJCQl0MCA9IHBwWyAtLSBpMSAtIDEgXTsKKworCQkJCQkJCQlpZiAoIHQgPj0g
dDAgKSB7CisKKwkJCQkJCQkJCS8vIHdlIGhhdmUgYXJyaXZlZCBhdCB0aGUgc291Z2h0IGludGVy
dmFsCisJCQkJCQkJCQlicmVhayBzZWVrOworCisJCQkJCQkJCX0KKworCQkJCQkJCX0KKworCQkJ
CQkJCS8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbmRl
eAorCQkJCQkJCXJpZ2h0ID0gaTE7CisJCQkJCQkJaTEgPSAwOworCQkJCQkJCWJyZWFrIGxpbmVh
cl9zY2FuOworCisJCQkJCQl9CisKKwkJCQkJCS8vIHRoZSBpbnRlcnZhbCBpcyB2YWxpZAorCisJ
CQkJCQlicmVhayB2YWxpZGF0ZV9pbnRlcnZhbDsKKworCQkJCQl9IC8vIGxpbmVhciBzY2FuCisK
KwkJCQkJLy8gYmluYXJ5IHNlYXJjaAorCisJCQkJCXdoaWxlICggaTEgPCByaWdodCApIHsKKwor
CQkJCQkJdmFyIG1pZCA9ICggaTEgKyByaWdodCApID4+PiAxOworCisJCQkJCQlpZiAoIHQgPCBw
cFsgbWlkIF0gKSB7CisKKwkJCQkJCQlyaWdodCA9IG1pZDsKKworCQkJCQkJfSBlbHNlIHsKKwor
CQkJCQkJCWkxID0gbWlkICsgMTsKKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCQl0MSA9IHBw
WyAgIGkxICAgXTsKKwkJCQkJdDAgPSBwcFsgaTEgLSAxIF07CisKKwkJCQkJLy8gY2hlY2sgYm91
bmRhcnkgY2FzZXMsIGFnYWluCisKKwkJCQkJaWYgKCB0MCA9PT0gdW5kZWZpbmVkICkgeworCisJ
CQkJCQl0aGlzLl9jYWNoZWRJbmRleCA9IDA7CisJCQkJCQlyZXR1cm4gdGhpcy5iZWZvcmVTdGFy
dF8oIDAsIHQsIHQxICk7CisKKwkJCQkJfQorCisJCQkJCWlmICggdDEgPT09IHVuZGVmaW5lZCAp
IHsKKworCQkJCQkJaTEgPSBwcC5sZW5ndGg7CisJCQkJCQl0aGlzLl9jYWNoZWRJbmRleCA9IGkx
OworCQkJCQkJcmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQwLCB0ICk7CisKKwkJCQkJ
fQorCisJCQkJfSAvLyBzZWVrCisKKwkJCQl0aGlzLl9jYWNoZWRJbmRleCA9IGkxOworCisJCQkJ
dGhpcy5pbnRlcnZhbENoYW5nZWRfKCBpMSwgdDAsIHQxICk7CisKKwkJCX0gLy8gdmFsaWRhdGVf
aW50ZXJ2YWwKKworCQkJcmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKCBpMSwgdDAsIHQsIHQxICk7
CisKKwkJfSwKKworCQlzZXR0aW5nczogbnVsbCwgLy8gb3B0aW9uYWwsIHN1YmNsYXNzLXNwZWNp
ZmljIHNldHRpbmdzIHN0cnVjdHVyZQorCQkvLyBOb3RlOiBUaGUgaW5kaXJlY3Rpb24gYWxsb3dz
IGNlbnRyYWwgY29udHJvbCBvZiBtYW55IGludGVycG9sYW50cy4KKworCQkvLyAtLS0gUHJvdGVj
dGVkIGludGVyZmFjZQorCisJCURlZmF1bHRTZXR0aW5nc186IHt9LAorCisJCWdldFNldHRpbmdz
XzogZnVuY3Rpb24oKSB7CisKKwkJCXJldHVybiB0aGlzLnNldHRpbmdzIHx8IHRoaXMuRGVmYXVs
dFNldHRpbmdzXzsKKworCQl9LAorCisJCWNvcHlTYW1wbGVWYWx1ZV86IGZ1bmN0aW9uKCBpbmRl
eCApIHsKKworCQkJLy8gY29waWVzIGEgc2FtcGxlIHZhbHVlIHRvIHRoZSByZXN1bHQgYnVmZmVy
CisKKwkJCXZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlciwKKwkJCQl2YWx1ZXMgPSB0aGlz
LnNhbXBsZVZhbHVlcywKKwkJCQlzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKKwkJCQlvZmZzZXQg
PSBpbmRleCAqIHN0cmlkZTsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsr
IGkgKSB7CisKKwkJCQlyZXN1bHRbIGkgXSA9IHZhbHVlc1sgb2Zmc2V0ICsgaSBdOworCisJCQl9
CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfSwKKworCQkvLyBUZW1wbGF0ZSBtZXRob2RzIGZv
ciBkZXJpdmVkIGNsYXNzZXM6CisKKwkJaW50ZXJwb2xhdGVfOiBmdW5jdGlvbiggaTEsIHQwLCB0
LCB0MSApIHsKKworCQkJdGhyb3cgbmV3IEVycm9yKCAiY2FsbCB0byBhYnN0cmFjdCBtZXRob2Qi
ICk7CisJCQkvLyBpbXBsZW1lbnRhdGlvbnMgc2hhbGwgcmV0dXJuIHRoaXMucmVzdWx0QnVmZmVy
CisKKwkJfSwKKworCQlpbnRlcnZhbENoYW5nZWRfOiBmdW5jdGlvbiggaTEsIHQwLCB0MSApIHsK
KworCQkJLy8gZW1wdHkKKworCQl9CisKKwl9ICk7CisKKwkvLyFcIERFQ0xBUkUgQUxJQVMgQUZU
RVIgYXNzaWduIHByb3RvdHlwZSAhCisJT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90
eXBlLCB7CisKKwkJLy8oIDAsIHQsIHQwICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXIKKwkJ
YmVmb3JlU3RhcnRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXywKKwor
CQkvLyggTi0xLCB0Ti0xLCB0ICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXIKKwkJYWZ0ZXJF
bmRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXywKKworCX0gKTsKKwor
CS8qKgorCSAqIEZhc3QgYW5kIHNpbXBsZSBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhbnQuCisJICoK
KwkgKiBJdCB3YXMgZGVyaXZlZCBmcm9tIGEgSGVybWl0aWFuIGNvbnN0cnVjdGlvbiBzZXR0aW5n
IHRoZSBmaXJzdCBkZXJpdmF0aXZlCisJICogYXQgZWFjaCBzYW1wbGUgcG9zaXRpb24gdG8gdGhl
IGxpbmVhciBzbG9wZSBiZXR3ZWVuIG5laWdoYm9yaW5nIHBvc2l0aW9ucworCSAqIG92ZXIgdGhl
aXIgcGFyYW1ldGVyIGludGVydmFsLgorCSAqCisJICogQGF1dGhvciB0c2NodworCSAqLworCisJ
ZnVuY3Rpb24gQ3ViaWNJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1
ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHsKKworCQlJbnRlcnBvbGFudC5jYWxsKAor
CQkJCXRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCBy
ZXN1bHRCdWZmZXIgKTsKKworCQl0aGlzLl93ZWlnaHRQcmV2ID0gLTA7CisJCXRoaXMuX29mZnNl
dFByZXYgPSAtMDsKKwkJdGhpcy5fd2VpZ2h0TmV4dCA9IC0wOworCQl0aGlzLl9vZmZzZXROZXh0
ID0gLTA7CisKKwl9CisKKwlDdWJpY0ludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3Np
Z24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7CisKKwkJY29uc3Ry
dWN0b3I6IEN1YmljSW50ZXJwb2xhbnQsCisKKwkJRGVmYXVsdFNldHRpbmdzXzogeworCisJCQll
bmRpbmdTdGFydDogCVplcm9DdXJ2YXR1cmVFbmRpbmcsCisJCQllbmRpbmdFbmQ6CQlaZXJvQ3Vy
dmF0dXJlRW5kaW5nCisKKwkJfSwKKworCQlpbnRlcnZhbENoYW5nZWRfOiBmdW5jdGlvbiggaTEs
IHQwLCB0MSApIHsKKworCQkJdmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsCisJCQkJ
aVByZXYgPSBpMSAtIDIsCisJCQkJaU5leHQgPSBpMSArIDEsCisKKwkJCQl0UHJldiA9IHBwWyBp
UHJldiBdLAorCQkJCXROZXh0ID0gcHBbIGlOZXh0IF07CisKKwkJCWlmICggdFByZXYgPT09IHVu
ZGVmaW5lZCApIHsKKworCQkJCXN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3Rh
cnQgKSB7CisKKwkJCQkJY2FzZSBaZXJvU2xvcGVFbmRpbmc6CisKKwkJCQkJCS8vIGYnKHQwKSA9
IDAKKwkJCQkJCWlQcmV2ID0gaTE7CisJCQkJCQl0UHJldiA9IDIgKiB0MCAtIHQxOworCisJCQkJ
CQlicmVhazsKKworCQkJCQljYXNlIFdyYXBBcm91bmRFbmRpbmc6CisKKwkJCQkJCS8vIHVzZSB0
aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZQorCQkJCQkJaVByZXYgPSBwcC5sZW5ndGggLSAyOwor
CQkJCQkJdFByZXYgPSB0MCArIHBwWyBpUHJldiBdIC0gcHBbIGlQcmV2ICsgMSBdOworCisJCQkJ
CQlicmVhazsKKworCQkJCQlkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nCisKKwkJCQkJ
CS8vIGYnJyh0MCkgPSAwIGEuay5hLiBOYXR1cmFsIFNwbGluZQorCQkJCQkJaVByZXYgPSBpMTsK
KwkJCQkJCXRQcmV2ID0gdDE7CisKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCB0TmV4dCA9PT0g
dW5kZWZpbmVkICkgeworCisJCQkJc3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdF
bmQgKSB7CisKKwkJCQkJY2FzZSBaZXJvU2xvcGVFbmRpbmc6CisKKwkJCQkJCS8vIGYnKHROKSA9
IDAKKwkJCQkJCWlOZXh0ID0gaTE7CisJCQkJCQl0TmV4dCA9IDIgKiB0MSAtIHQwOworCisJCQkJ
CQlicmVhazsKKworCQkJCQljYXNlIFdyYXBBcm91bmRFbmRpbmc6CisKKwkJCQkJCS8vIHVzZSB0
aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZQorCQkJCQkJaU5leHQgPSAxOworCQkJCQkJdE5leHQg
PSB0MSArIHBwWyAxIF0gLSBwcFsgMCBdOworCisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0
OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nCisKKwkJCQkJCS8vIGYnJyh0TikgPSAwLCBhLmsuYS4g
TmF0dXJhbCBTcGxpbmUKKwkJCQkJCWlOZXh0ID0gaTEgLSAxOworCQkJCQkJdE5leHQgPSB0MDsK
KworCQkJCX0KKworCQkJfQorCisJCQl2YXIgaGFsZkR0ID0gKCB0MSAtIHQwICkgKiAwLjUsCisJ
CQkJc3RyaWRlID0gdGhpcy52YWx1ZVNpemU7CisKKwkJCXRoaXMuX3dlaWdodFByZXYgPSBoYWxm
RHQgLyAoIHQwIC0gdFByZXYgKTsKKwkJCXRoaXMuX3dlaWdodE5leHQgPSBoYWxmRHQgLyAoIHRO
ZXh0IC0gdDEgKTsKKwkJCXRoaXMuX29mZnNldFByZXYgPSBpUHJldiAqIHN0cmlkZTsKKwkJCXRo
aXMuX29mZnNldE5leHQgPSBpTmV4dCAqIHN0cmlkZTsKKworCQl9LAorCisJCWludGVycG9sYXRl
XzogZnVuY3Rpb24oIGkxLCB0MCwgdCwgdDEgKSB7CisKKwkJCXZhciByZXN1bHQgPSB0aGlzLnJl
c3VsdEJ1ZmZlciwKKwkJCQl2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcywKKwkJCQlzdHJpZGUg
PSB0aGlzLnZhbHVlU2l6ZSwKKworCQkJCW8xID0gaTEgKiBzdHJpZGUsCQlvMCA9IG8xIC0gc3Ry
aWRlLAorCQkJCW9QID0gdGhpcy5fb2Zmc2V0UHJldiwgCW9OID0gdGhpcy5fb2Zmc2V0TmV4dCwK
KwkJCQl3UCA9IHRoaXMuX3dlaWdodFByZXYsCXdOID0gdGhpcy5fd2VpZ2h0TmV4dCwKKworCQkJ
CXAgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICksCisJCQkJcHAgPSBwICogcCwKKwkJCQlwcHAg
PSBwcCAqIHA7CisKKwkJCS8vIGV2YWx1YXRlIHBvbHlub21pYWxzCisKKwkJCXZhciBzUCA9ICAg
ICAtIHdQICAgKiBwcHAgICArICAgICAgICAgMiAqIHdQICAgICogcHAgICAgLSAgICAgICAgICB3
UCAgICogcDsKKwkJCXZhciBzMCA9ICggMSArIHdQICkgKiBwcHAgICArICgtMS41IC0gMiAqIHdQ
ICkgICogcHAgICAgKyAoIC0wLjUgKyB3UCApICogcCAgICAgKyAxOworCQkJdmFyIHMxID0gKC0x
IC0gd04gKSAqIHBwcCAgICsgKCAxLjUgKyAgIHdOICAgKSAgKiBwcCAgICArICAgIDAuNSAgICAg
ICAgKiBwOworCQkJdmFyIHNOID0gICAgICAgd04gICAqIHBwcCAgIC0gICAgICAgICAgIHdOICAg
ICAgKiBwcDsKKworCQkJLy8gY29tYmluZSBkYXRhIGxpbmVhcmx5CisKKwkJCWZvciAoIHZhciBp
ID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkgeworCisJCQkJcmVzdWx0WyBpIF0gPQorCQkJCQkJ
c1AgKiB2YWx1ZXNbIG9QICsgaSBdICsKKwkJCQkJCXMwICogdmFsdWVzWyBvMCArIGkgXSArCisJ
CQkJCQlzMSAqIHZhbHVlc1sgbzEgKyBpIF0gKworCQkJCQkJc04gKiB2YWx1ZXNbIG9OICsgaSBd
OworCisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfQorCisJfSApOworCisJLyoqCisJ
ICogQGF1dGhvciB0c2NodworCSAqLworCisJZnVuY3Rpb24gTGluZWFySW50ZXJwb2xhbnQoIHBh
cmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIg
KSB7CisKKwkJSW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1w
bGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApOworCisJfQorCisJTGluZWFySW50
ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJw
b2xhbnQucHJvdG90eXBlICksIHsKKworCQljb25zdHJ1Y3RvcjogTGluZWFySW50ZXJwb2xhbnQs
CisKKwkJaW50ZXJwb2xhdGVfOiBmdW5jdGlvbiggaTEsIHQwLCB0LCB0MSApIHsKKworCQkJdmFy
IHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLAorCQkJCXZhbHVlcyA9IHRoaXMuc2FtcGxlVmFs
dWVzLAorCQkJCXN0cmlkZSA9IHRoaXMudmFsdWVTaXplLAorCisJCQkJb2Zmc2V0MSA9IGkxICog
c3RyaWRlLAorCQkJCW9mZnNldDAgPSBvZmZzZXQxIC0gc3RyaWRlLAorCisJCQkJd2VpZ2h0MSA9
ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKSwKKwkJCQl3ZWlnaHQwID0gMSAtIHdlaWdodDE7CisK
KwkJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkgeworCisJCQkJcmVzdWx0
WyBpIF0gPQorCQkJCQkJdmFsdWVzWyBvZmZzZXQwICsgaSBdICogd2VpZ2h0MCArCisJCQkJCQl2
YWx1ZXNbIG9mZnNldDEgKyBpIF0gKiB3ZWlnaHQxOworCisJCQl9CisKKwkJCXJldHVybiByZXN1
bHQ7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICoKKwkgKiBJbnRlcnBvbGFudCB0aGF0IGV2
YWx1YXRlcyB0byB0aGUgc2FtcGxlIHZhbHVlIGF0IHRoZSBwb3NpdGlvbiBwcmVjZWVkaW5nCisJ
ICogdGhlIHBhcmFtZXRlci4KKwkgKgorCSAqIEBhdXRob3IgdHNjaHcKKwkgKi8KKworCWZ1bmN0
aW9uIERpc2NyZXRlSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVz
LCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7CisKKwkJSW50ZXJwb2xhbnQuY2FsbCggdGhp
cywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1
ZmZlciApOworCisJfQorCisJRGlzY3JldGVJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3Qu
YXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwgeworCisJCWNv
bnN0cnVjdG9yOiBEaXNjcmV0ZUludGVycG9sYW50LAorCisJCWludGVycG9sYXRlXzogZnVuY3Rp
b24oIGkxLCB0MCwgdCwgdDEgKSB7CisKKwkJCXJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8o
IGkxIC0gMSApOworCisJCX0KKworCX0gKTsKKworCXZhciBLZXlmcmFtZVRyYWNrUHJvdG90eXBl
OworCisJS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSA9IHsKKworCQlUaW1lQnVmZmVyVHlwZTogRmxv
YXQzMkFycmF5LAorCQlWYWx1ZUJ1ZmZlclR5cGU6IEZsb2F0MzJBcnJheSwKKworCQlEZWZhdWx0
SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsCisKKwkJSW50ZXJwb2xhbnRGYWN0b3J5
TWV0aG9kRGlzY3JldGU6IGZ1bmN0aW9uICggcmVzdWx0ICkgeworCisJCQlyZXR1cm4gbmV3IERp
c2NyZXRlSW50ZXJwb2xhbnQoCisJCQkJCXRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdl
dFZhbHVlU2l6ZSgpLCByZXN1bHQgKTsKKworCQl9LAorCisJCUludGVycG9sYW50RmFjdG9yeU1l
dGhvZExpbmVhcjogZnVuY3Rpb24gKCByZXN1bHQgKSB7CisKKwkJCXJldHVybiBuZXcgTGluZWFy
SW50ZXJwb2xhbnQoCisJCQkJCXRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVl
U2l6ZSgpLCByZXN1bHQgKTsKKworCQl9LAorCisJCUludGVycG9sYW50RmFjdG9yeU1ldGhvZFNt
b290aDogZnVuY3Rpb24gKCByZXN1bHQgKSB7CisKKwkJCXJldHVybiBuZXcgQ3ViaWNJbnRlcnBv
bGFudCgKKwkJCQkJdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCks
IHJlc3VsdCApOworCisJCX0sCisKKwkJc2V0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKCBpbnRl
cnBvbGF0aW9uICkgeworCisJCQl2YXIgZmFjdG9yeU1ldGhvZDsKKworCQkJc3dpdGNoICggaW50
ZXJwb2xhdGlvbiApIHsKKworCQkJCWNhc2UgSW50ZXJwb2xhdGVEaXNjcmV0ZToKKworCQkJCQlm
YWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTsKKwor
CQkJCQlicmVhazsKKworCQkJCWNhc2UgSW50ZXJwb2xhdGVMaW5lYXI6CisKKwkJCQkJZmFjdG9y
eU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOworCisJCQkJCWJy
ZWFrOworCisJCQkJY2FzZSBJbnRlcnBvbGF0ZVNtb290aDoKKworCQkJCQlmYWN0b3J5TWV0aG9k
ID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg7CisKKwkJCQkJYnJlYWs7CisK
KwkJCX0KKworCQkJaWYgKCBmYWN0b3J5TWV0aG9kID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQl2
YXIgbWVzc2FnZSA9ICJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiICsKKwkJCQkJCXRo
aXMuVmFsdWVUeXBlTmFtZSArICIga2V5ZnJhbWUgdHJhY2sgbmFtZWQgIiArIHRoaXMubmFtZTsK
KworCQkJCWlmICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkgeworCisJ
CQkJCS8vIGZhbGwgYmFjayB0byBkZWZhdWx0LCB1bmxlc3MgdGhlIGRlZmF1bHQgaXRzZWxmIGlz
IG1lc3NlZCB1cAorCQkJCQlpZiAoIGludGVycG9sYXRpb24gIT09IHRoaXMuRGVmYXVsdEludGVy
cG9sYXRpb24gKSB7CisKKwkJCQkJCXRoaXMuc2V0SW50ZXJwb2xhdGlvbiggdGhpcy5EZWZhdWx0
SW50ZXJwb2xhdGlvbiApOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCXRocm93IG5ldyBFcnJv
ciggbWVzc2FnZSApOyAvLyBmYXRhbCwgaW4gdGhpcyBjYXNlCisKKwkJCQkJfQorCisJCQkJfQor
CisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuS2V5ZnJhbWVUcmFja1Byb3RvdHlwZTonLCBtZXNz
YWdlICk7CisJCQkJcmV0dXJuOworCisJCQl9CisKKwkJCXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQg
PSBmYWN0b3J5TWV0aG9kOworCisJCX0sCisKKwkJZ2V0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24g
KCkgeworCisJCQlzd2l0Y2ggKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ICkgeworCisJCQkJY2Fz
ZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOgorCisJCQkJCXJldHVybiBJ
bnRlcnBvbGF0ZURpc2NyZXRlOworCisJCQkJY2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1l
dGhvZExpbmVhcjoKKworCQkJCQlyZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXI7CisKKwkJCQljYXNl
IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOgorCisJCQkJCXJldHVybiBJbnRl
cnBvbGF0ZVNtb290aDsKKworCQkJfQorCisJCX0sCisKKwkJZ2V0VmFsdWVTaXplOiBmdW5jdGlv
biAoKSB7CisKKwkJCXJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggLyB0aGlzLnRpbWVzLmxlbmd0
aDsKKworCQl9LAorCisJCS8vIG1vdmUgYWxsIGtleWZyYW1lcyBlaXRoZXIgZm9yd2FyZHMgb3Ig
YmFja3dhcmRzIGluIHRpbWUKKwkJc2hpZnQ6IGZ1bmN0aW9uICggdGltZU9mZnNldCApIHsKKwor
CQkJaWYgKCB0aW1lT2Zmc2V0ICE9PSAwLjAgKSB7CisKKwkJCQl2YXIgdGltZXMgPSB0aGlzLnRp
bWVzOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyAr
KyBpICkgeworCisJCQkJCXRpbWVzWyBpIF0gKz0gdGltZU9mZnNldDsKKworCQkJCX0KKworCQkJ
fQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCS8vIHNjYWxlIGFsbCBrZXlmcmFtZSB0
aW1lcyBieSBhIGZhY3RvciAodXNlZnVsIGZvciBmcmFtZSA8LT4gc2Vjb25kcyBjb252ZXJzaW9u
cykKKwkJc2NhbGU6IGZ1bmN0aW9uICggdGltZVNjYWxlICkgeworCisJCQlpZiAoIHRpbWVTY2Fs
ZSAhPT0gMS4wICkgeworCisJCQkJdmFyIHRpbWVzID0gdGhpcy50aW1lczsKKworCQkJCWZvciAo
IHZhciBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworCQkJCQl0
aW1lc1sgaSBdICo9IHRpbWVTY2FsZTsKKworCQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gdGhp
czsKKworCQl9LAorCisJCS8vIHJlbW92ZXMga2V5ZnJhbWVzIGJlZm9yZSBhbmQgYWZ0ZXIgYW5p
bWF0aW9uIHdpdGhvdXQgY2hhbmdpbmcgYW55IHZhbHVlcyB3aXRoaW4gdGhlIHJhbmdlIFtzdGFy
dFRpbWUsIGVuZFRpbWVdLgorCQkvLyBJTVBPUlRBTlQ6IFdlIGRvIG5vdCBzaGlmdCBhcm91bmQg
a2V5cyB0byB0aGUgc3RhcnQgb2YgdGhlIHRyYWNrIHRpbWUsIGJlY2F1c2UgZm9yIGludGVycG9s
YXRlZCBrZXlzIHRoaXMgd2lsbCBjaGFuZ2UgdGhlaXIgdmFsdWVzCisJCXRyaW06IGZ1bmN0aW9u
ICggc3RhcnRUaW1lLCBlbmRUaW1lICkgeworCisJCQl2YXIgdGltZXMgPSB0aGlzLnRpbWVzLAor
CQkJCW5LZXlzID0gdGltZXMubGVuZ3RoLAorCQkJCWZyb20gPSAwLAorCQkJCXRvID0gbktleXMg
LSAxOworCisJCQl3aGlsZSAoIGZyb20gIT09IG5LZXlzICYmIHRpbWVzWyBmcm9tIF0gPCBzdGFy
dFRpbWUgKSArKyBmcm9tOworCQkJd2hpbGUgKCB0byAhPT0gLSAxICYmIHRpbWVzWyB0byBdID4g
ZW5kVGltZSApIC0tIHRvOworCisJCQkrKyB0bzsgLy8gaW5jbHVzaXZlIC0+IGV4Y2x1c2l2ZSBi
b3VuZAorCisJCQlpZiAoIGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzICkgeworCisJCQkJLy8g
ZW1wdHkgdHJhY2tzIGFyZSBmb3JiaWRkZW4sIHNvIGtlZXAgYXQgbGVhc3Qgb25lIGtleWZyYW1l
CisJCQkJaWYgKCBmcm9tID49IHRvICkgdG8gPSBNYXRoLm1heCggdG8sIDEgKSwgZnJvbSA9IHRv
IC0gMTsKKworCQkJCXZhciBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpOworCQkJCXRoaXMu
dGltZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aW1lcywgZnJvbSwgdG8gKTsKKwkJ
CQl0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLgorCQkJCQkJYXJyYXlTbGljZSggdGhpcy52
YWx1ZXMsIGZyb20gKiBzdHJpZGUsIHRvICogc3RyaWRlICk7CisKKwkJCX0KKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQkvLyBlbnN1cmUgd2UgZG8gbm90IGdldCBhIEdhcmJhZ2VJbkdh
cmJhZ2VPdXQgc2l0dWF0aW9uLCBtYWtlIHN1cmUgdHJhY2tzIGFyZSBhdCBsZWFzdCBtaW5pbWFs
bHkgdmlhYmxlCisJCXZhbGlkYXRlOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2YWxpZCA9IHRy
dWU7CisKKwkJCXZhciB2YWx1ZVNpemUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpOworCQkJaWYgKCB2
YWx1ZVNpemUgLSBNYXRoLmZsb29yKCB2YWx1ZVNpemUgKSAhPT0gMCApIHsKKworCQkJCWNvbnNv
bGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrUHJvdG90eXBlOiBJbnZhbGlkIHZhbHVlIHNp
emUgaW4gdHJhY2suJywgdGhpcyApOworCQkJCXZhbGlkID0gZmFsc2U7CisKKwkJCX0KKworCQkJ
dmFyIHRpbWVzID0gdGhpcy50aW1lcywKKwkJCQl2YWx1ZXMgPSB0aGlzLnZhbHVlcywKKworCQkJ
CW5LZXlzID0gdGltZXMubGVuZ3RoOworCisJCQlpZiAoIG5LZXlzID09PSAwICkgeworCisJCQkJ
Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2tQcm90b3R5cGU6IFRyYWNrIGlzIGVt
cHR5LicsIHRoaXMgKTsKKwkJCQl2YWxpZCA9IGZhbHNlOworCisJCQl9CisKKwkJCXZhciBwcmV2
VGltZSA9IG51bGw7CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gbktleXM7IGkgKysgKSB7
CisKKwkJCQl2YXIgY3VyclRpbWUgPSB0aW1lc1sgaSBdOworCisJCQkJaWYgKCB0eXBlb2YgY3Vy
clRpbWUgPT09ICdudW1iZXInICYmIGlzTmFOKCBjdXJyVGltZSApICkgeworCisJCQkJCWNvbnNv
bGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrUHJvdG90eXBlOiBUaW1lIGlzIG5vdCBhIHZh
bGlkIG51bWJlci4nLCB0aGlzLCBpLCBjdXJyVGltZSApOworCQkJCQl2YWxpZCA9IGZhbHNlOwor
CQkJCQlicmVhazsKKworCQkJCX0KKworCQkJCWlmICggcHJldlRpbWUgIT09IG51bGwgJiYgcHJl
dlRpbWUgPiBjdXJyVGltZSApIHsKKworCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJh
bWVUcmFja1Byb3RvdHlwZTogT3V0IG9mIG9yZGVyIGtleXMuJywgdGhpcywgaSwgY3VyclRpbWUs
IHByZXZUaW1lICk7CisJCQkJCXZhbGlkID0gZmFsc2U7CisJCQkJCWJyZWFrOworCisJCQkJfQor
CisJCQkJcHJldlRpbWUgPSBjdXJyVGltZTsKKworCQkJfQorCisJCQlpZiAoIHZhbHVlcyAhPT0g
dW5kZWZpbmVkICkgeworCisJCQkJaWYgKCBBbmltYXRpb25VdGlscy5pc1R5cGVkQXJyYXkoIHZh
bHVlcyApICkgeworCisJCQkJCWZvciAoIHZhciBpID0gMCwgbiA9IHZhbHVlcy5sZW5ndGg7IGkg
IT09IG47ICsrIGkgKSB7CisKKwkJCQkJCXZhciB2YWx1ZSA9IHZhbHVlc1sgaSBdOworCisJCQkJ
CQlpZiAoIGlzTmFOKCB2YWx1ZSApICkgeworCisJCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVF
LktleWZyYW1lVHJhY2tQcm90b3R5cGU6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0
aGlzLCBpLCB2YWx1ZSApOworCQkJCQkJCXZhbGlkID0gZmFsc2U7CisJCQkJCQkJYnJlYWs7CisK
KwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuIHZhbGlkOwor
CisJCX0sCisKKwkJLy8gcmVtb3ZlcyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyBhcyBjb21t
b24gaW4gbW9ycGggdGFyZ2V0IHNlcXVlbmNlcworCQkvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCww
LDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKQorCQlvcHRpbWl6ZTogZnVuY3Rpb24gKCkgeworCisJ
CQl2YXIgdGltZXMgPSB0aGlzLnRpbWVzLAorCQkJCXZhbHVlcyA9IHRoaXMudmFsdWVzLAorCQkJ
CXN0cmlkZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCksCisKKwkJCQlzbW9vdGhJbnRlcnBvbGF0aW9u
ID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IEludGVycG9sYXRlU21vb3RoLAorCisJCQkJ
d3JpdGVJbmRleCA9IDEsCisJCQkJbGFzdEluZGV4ID0gdGltZXMubGVuZ3RoIC0gMTsKKworCQkJ
Zm9yICggdmFyIGkgPSAxOyBpIDwgbGFzdEluZGV4OyArKyBpICkgeworCisJCQkJdmFyIGtlZXAg
PSBmYWxzZTsKKworCQkJCXZhciB0aW1lID0gdGltZXNbIGkgXTsKKwkJCQl2YXIgdGltZU5leHQg
PSB0aW1lc1sgaSArIDEgXTsKKworCQkJCS8vIHJlbW92ZSBhZGphY2VudCBrZXlmcmFtZXMgc2No
ZWR1bGVkIGF0IHRoZSBzYW1lIHRpbWUKKworCQkJCWlmICggdGltZSAhPT0gdGltZU5leHQgJiYg
KCBpICE9PSAxIHx8IHRpbWUgIT09IHRpbWVbIDAgXSApICkgeworCisJCQkJCWlmICggISBzbW9v
dGhJbnRlcnBvbGF0aW9uICkgeworCisJCQkJCQkvLyByZW1vdmUgdW5uZWNlc3Nhcnkga2V5ZnJh
bWVzIHNhbWUgYXMgdGhlaXIgbmVpZ2hib3JzCisKKwkJCQkJCXZhciBvZmZzZXQgPSBpICogc3Ry
aWRlLAorCQkJCQkJCW9mZnNldFAgPSBvZmZzZXQgLSBzdHJpZGUsCisJCQkJCQkJb2Zmc2V0TiA9
IG9mZnNldCArIHN0cmlkZTsKKworCQkJCQkJZm9yICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7
ICsrIGogKSB7CisKKwkJCQkJCQl2YXIgdmFsdWUgPSB2YWx1ZXNbIG9mZnNldCArIGogXTsKKwor
CQkJCQkJCWlmICggdmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0UCArIGogXSB8fAorCQkJCQkJCQkJ
dmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0TiArIGogXSApIHsKKworCQkJCQkJCQlrZWVwID0gdHJ1
ZTsKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQl9IGVsc2Ug
a2VlcCA9IHRydWU7CisKKwkJCQl9CisKKwkJCQkvLyBpbi1wbGFjZSBjb21wYWN0aW9uCisKKwkJ
CQlpZiAoIGtlZXAgKSB7CisKKwkJCQkJaWYgKCBpICE9PSB3cml0ZUluZGV4ICkgeworCisJCQkJ
CQl0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGkgXTsKKworCQkJCQkJdmFyIHJlYWRPZmZz
ZXQgPSBpICogc3RyaWRlLAorCQkJCQkJCXdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlk
ZTsKKworCQkJCQkJZm9yICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKQorCisJCQkJ
CQkJdmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGogXTsK
KworCQkJCQl9CisKKwkJCQkJKysgd3JpdGVJbmRleDsKKworCQkJCX0KKworCQkJfQorCisJCQkv
LyBmbHVzaCBsYXN0IGtleWZyYW1lIChjb21wYWN0aW9uIGxvb2tzIGFoZWFkKQorCisJCQlpZiAo
IGxhc3RJbmRleCA+IDAgKSB7CisKKwkJCQl0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGxh
c3RJbmRleCBdOworCisJCQkJZm9yICggdmFyIHJlYWRPZmZzZXQgPSBsYXN0SW5kZXggKiBzdHJp
ZGUsIHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZSwgaiA9IDA7IGogIT09IHN0cmlk
ZTsgKysgaiApCisKKwkJCQkJdmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVh
ZE9mZnNldCArIGogXTsKKworCQkJCSsrIHdyaXRlSW5kZXg7CisKKwkJCX0KKworCQkJaWYgKCB3
cml0ZUluZGV4ICE9PSB0aW1lcy5sZW5ndGggKSB7CisKKwkJCQl0aGlzLnRpbWVzID0gQW5pbWF0
aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIDAsIHdyaXRlSW5kZXggKTsKKwkJCQl0aGlzLnZh
bHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHZhbHVlcywgMCwgd3JpdGVJbmRleCAq
IHN0cmlkZSApOworCisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX07CisKKwlm
dW5jdGlvbiBLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3IoIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGlu
dGVycG9sYXRpb24gKSB7CisKKwkJaWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSB0aHJvdyBuZXcg
RXJyb3IoICJ0cmFjayBuYW1lIGlzIHVuZGVmaW5lZCIgKTsKKworCQlpZiAoIHRpbWVzID09PSB1
bmRlZmluZWQgfHwgdGltZXMubGVuZ3RoID09PSAwICkgeworCisJCQl0aHJvdyBuZXcgRXJyb3Io
ICJubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgIiArIG5hbWUgKTsKKworCQl9CisKKwkJdGhp
cy5uYW1lID0gbmFtZTsKKworCQl0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFy
cmF5KCB0aW1lcywgdGhpcy5UaW1lQnVmZmVyVHlwZSApOworCQl0aGlzLnZhbHVlcyA9IEFuaW1h
dGlvblV0aWxzLmNvbnZlcnRBcnJheSggdmFsdWVzLCB0aGlzLlZhbHVlQnVmZmVyVHlwZSApOwor
CisJCXRoaXMuc2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlvbiB8fCB0aGlzLkRlZmF1bHRJ
bnRlcnBvbGF0aW9uICk7CisKKwkJdGhpcy52YWxpZGF0ZSgpOworCQl0aGlzLm9wdGltaXplKCk7
CisKKwl9CisKKwkvKioKKwkgKgorCSAqIEEgVHJhY2sgb2YgdmVjdG9yZWQga2V5ZnJhbWUgdmFs
dWVzLgorCSAqCisJICoKKwkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlv
LworCSAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworCSAqIEBh
dXRob3IgdHNjaHcKKwkgKi8KKworCWZ1bmN0aW9uIFZlY3RvcktleWZyYW1lVHJhY2soIG5hbWUs
IHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7CisKKwkJS2V5ZnJhbWVUcmFja0NvbnN0
cnVjdG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTsK
KworCX0KKworCVZlY3RvcktleWZyYW1lVHJhY2sucHJvdG90eXBlID0KKwkJCU9iamVjdC5hc3Np
Z24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2tQcm90b3R5cGUgKSwgeworCisJCWNvbnN0
cnVjdG9yOiBWZWN0b3JLZXlmcmFtZVRyYWNrLAorCisJCVZhbHVlVHlwZU5hbWU6ICd2ZWN0b3In
CisKKwkJLy8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZAorCisJCS8vIERlZmF1bHRJbnRl
cnBvbGF0aW9uIGlzIGluaGVyaXRlZAorCisJfSApOworCisJLyoqCisJICogU3BoZXJpY2FsIGxp
bmVhciB1bml0IHF1YXRlcm5pb24gaW50ZXJwb2xhbnQuCisJICoKKwkgKiBAYXV0aG9yIHRzY2h3
CisJICovCisKKwlmdW5jdGlvbiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRl
clBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7CisK
KwkJSW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1
ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApOworCisJfQorCisJUXVhdGVybmlvbkxpbmVh
ckludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIElu
dGVycG9sYW50LnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IFF1YXRlcm5pb25MaW5l
YXJJbnRlcnBvbGFudCwKKworCQlpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uKCBpMSwgdDAsIHQsIHQx
ICkgeworCisJCQl2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsCisJCQkJdmFsdWVzID0g
dGhpcy5zYW1wbGVWYWx1ZXMsCisJCQkJc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsCisKKwkJCQlv
ZmZzZXQgPSBpMSAqIHN0cmlkZSwKKworCQkJCWFscGhhID0gKCB0IC0gdDAgKSAvICggdDEgLSB0
MCApOworCisJCQlmb3IgKCB2YXIgZW5kID0gb2Zmc2V0ICsgc3RyaWRlOyBvZmZzZXQgIT09IGVu
ZDsgb2Zmc2V0ICs9IDQgKSB7CisKKwkJCQlRdWF0ZXJuaW9uLnNsZXJwRmxhdCggcmVzdWx0LCAw
LAorCQkJCQkJdmFsdWVzLCBvZmZzZXQgLSBzdHJpZGUsIHZhbHVlcywgb2Zmc2V0LCBhbHBoYSAp
OworCisJCQl9CisKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJfQorCisJfSApOworCisJLyoqCisJ
ICoKKwkgKiBBIFRyYWNrIG9mIHF1YXRlcm5pb24ga2V5ZnJhbWUgdmFsdWVzLgorCSAqCisJICog
QGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KKwkgKiBAYXV0aG9yIERhdmlk
IFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KKwkgKiBAYXV0aG9yIHRzY2h3CisJICovCisK
KwlmdW5jdGlvbiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywg
aW50ZXJwb2xhdGlvbiApIHsKKworCQlLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3IuY2FsbCggdGhp
cywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApOworCisJfQorCisJUXVhdGVy
bmlvbktleWZyYW1lVHJhY2sucHJvdG90eXBlID0KKwkJCU9iamVjdC5hc3NpZ24oIE9iamVjdC5j
cmVhdGUoIEtleWZyYW1lVHJhY2tQcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBRdWF0
ZXJuaW9uS2V5ZnJhbWVUcmFjaywKKworCQlWYWx1ZVR5cGVOYW1lOiAncXVhdGVybmlvbicsCisK
KwkJLy8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZAorCisJCURlZmF1bHRJbnRlcnBvbGF0
aW9uOiBJbnRlcnBvbGF0ZUxpbmVhciwKKworCQlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5l
YXI6IGZ1bmN0aW9uKCByZXN1bHQgKSB7CisKKwkJCXJldHVybiBuZXcgUXVhdGVybmlvbkxpbmVh
ckludGVycG9sYW50KAorCQkJCQl0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1
ZVNpemUoKSwgcmVzdWx0ICk7CisKKwkJfSwKKworCQlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RT
bW9vdGg6IHVuZGVmaW5lZCAvLyBub3QgeWV0IGltcGxlbWVudGVkCisKKwl9ICk7CisKKwkvKioK
KwkgKgorCSAqIEEgVHJhY2sgb2YgbnVtZXJpYyBrZXlmcmFtZSB2YWx1ZXMuCisJICoKKwkgKiBA
YXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLworCSAqIEBhdXRob3IgRGF2aWQg
U2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworCSAqIEBhdXRob3IgdHNjaHcKKwkgKi8KKwor
CWZ1bmN0aW9uIE51bWJlcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVy
cG9sYXRpb24gKSB7CisKKwkJS2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIG5h
bWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTsKKworCX0KKworCU51bWJlcktleWZy
YW1lVHJhY2sucHJvdG90eXBlID0KKwkJCU9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtl
eWZyYW1lVHJhY2tQcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBOdW1iZXJLZXlmcmFt
ZVRyYWNrLAorCisJCVZhbHVlVHlwZU5hbWU6ICdudW1iZXInCisKKwkJLy8gVmFsdWVCdWZmZXJU
eXBlIGlzIGluaGVyaXRlZAorCisJCS8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRl
ZAorCisJfSApOworCisJLyoqCisJICoKKwkgKiBBIFRyYWNrIHRoYXQgaW50ZXJwb2xhdGVzIFN0
cmluZ3MKKwkgKgorCSAqCisJICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5p
by8KKwkgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KKwkgKiBA
YXV0aG9yIHRzY2h3CisJICovCisKKwlmdW5jdGlvbiBTdHJpbmdLZXlmcmFtZVRyYWNrKCBuYW1l
LCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkgeworCisJCUtleWZyYW1lVHJhY2tDb25z
dHJ1Y3Rvci5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7
CisKKwl9CisKKwlTdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9CisJCQlPYmplY3QuYXNz
aWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrUHJvdG90eXBlICksIHsKKworCQljb25z
dHJ1Y3RvcjogU3RyaW5nS2V5ZnJhbWVUcmFjaywKKworCQlWYWx1ZVR5cGVOYW1lOiAnc3RyaW5n
JywKKwkJVmFsdWVCdWZmZXJUeXBlOiBBcnJheSwKKworCQlEZWZhdWx0SW50ZXJwb2xhdGlvbjog
SW50ZXJwb2xhdGVEaXNjcmV0ZSwKKworCQlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6
IHVuZGVmaW5lZCwKKworCQlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5l
ZAorCisJfSApOworCisJLyoqCisJICoKKwkgKiBBIFRyYWNrIG9mIEJvb2xlYW4ga2V5ZnJhbWUg
dmFsdWVzLgorCSAqCisJICoKKwkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJh
LmlvLworCSAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworCSAq
IEBhdXRob3IgdHNjaHcKKwkgKi8KKworCWZ1bmN0aW9uIEJvb2xlYW5LZXlmcmFtZVRyYWNrKCBu
YW1lLCB0aW1lcywgdmFsdWVzICkgeworCisJCUtleWZyYW1lVHJhY2tDb25zdHJ1Y3Rvci5jYWxs
KCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzICk7CisKKwl9CisKKwlCb29sZWFuS2V5ZnJhbWVU
cmFjay5wcm90b3R5cGUgPQorCQkJT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJh
bWVUcmFja1Byb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IEJvb2xlYW5LZXlmcmFtZVRy
YWNrLAorCisJCVZhbHVlVHlwZU5hbWU6ICdib29sJywKKwkJVmFsdWVCdWZmZXJUeXBlOiBBcnJh
eSwKKworCQlEZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSwKKworCQlJ
bnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCwKKwkJSW50ZXJwb2xhbnRG
YWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWQKKworCQkvLyBOb3RlOiBBY3R1YWxseSB0aGlz
IHRyYWNrIGNvdWxkIGhhdmUgYSBvcHRpbWl6ZWQgLyBjb21wcmVzc2VkCisJCS8vIHJlcHJlc2Vu
dGF0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGFuZCBhIGN1c3RvbSBpbnRlcnBvbGFudCB0aGF0CisJ
CS8vIGNvbXB1dGVzICJmaXJzdFZhbHVlIF4gaXNPZGQoIGluZGV4ICkiLgorCisJfSApOworCisJ
LyoqCisJICoKKwkgKiBBIFRyYWNrIG9mIGtleWZyYW1lIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBj
b2xvci4KKwkgKgorCSAqCisJICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5p
by8KKwkgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KKwkgKiBA
YXV0aG9yIHRzY2h3CisJICovCisKKwlmdW5jdGlvbiBDb2xvcktleWZyYW1lVHJhY2soIG5hbWUs
IHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7CisKKwkJS2V5ZnJhbWVUcmFja0NvbnN0
cnVjdG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTsK
KworCX0KKworCUNvbG9yS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPQorCQkJT2JqZWN0LmFzc2ln
biggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSApLCB7CisKKwkJY29uc3Ry
dWN0b3I6IENvbG9yS2V5ZnJhbWVUcmFjaywKKworCQlWYWx1ZVR5cGVOYW1lOiAnY29sb3InCisK
KwkJLy8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZAorCisJCS8vIERlZmF1bHRJbnRlcnBv
bGF0aW9uIGlzIGluaGVyaXRlZAorCisKKwkJLy8gTm90ZTogVmVyeSBiYXNpYyBpbXBsZW1lbnRh
dGlvbiBhbmQgbm90aGluZyBzcGVjaWFsIHlldC4KKwkJLy8gSG93ZXZlciwgdGhpcyBpcyB0aGUg
cGxhY2UgZm9yIGNvbG9yIHNwYWNlIHBhcmFtZXRlcml6YXRpb24uCisKKwl9ICk7CisKKwkvKioK
KwkgKgorCSAqIEEgdGltZWQgc2VxdWVuY2Ugb2Yga2V5ZnJhbWVzIGZvciBhIHNwZWNpZmljIHBy
b3BlcnR5LgorCSAqCisJICoKKwkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJh
LmlvLworCSAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworCSAq
IEBhdXRob3IgdHNjaHcKKwkgKi8KKworCWZ1bmN0aW9uIEtleWZyYW1lVHJhY2soIG5hbWUsIHRp
bWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7CisKKwkJS2V5ZnJhbWVUcmFja0NvbnN0cnVj
dG9yLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKworCX0KKworCUtleWZyYW1lVHJhY2sucHJv
dG90eXBlID0gS2V5ZnJhbWVUcmFja1Byb3RvdHlwZTsKKwlLZXlmcmFtZVRyYWNrUHJvdG90eXBl
LmNvbnN0cnVjdG9yID0gS2V5ZnJhbWVUcmFjazsKKworCS8vIFN0YXRpYyBtZXRob2RzOgorCisJ
T2JqZWN0LmFzc2lnbiggS2V5ZnJhbWVUcmFjaywgeworCisJCS8vIFNlcmlhbGl6YXRpb24gKGlu
IHN0YXRpYyBjb250ZXh0LCBiZWNhdXNlIG9mIGNvbnN0cnVjdG9yIGludm9jYXRpb24KKwkJLy8g
YW5kIGF1dG9tYXRpYyBpbnZvY2F0aW9uIG9mIC50b0pTT04pOgorCisJCXBhcnNlOiBmdW5jdGlv
bigganNvbiApIHsKKworCQkJaWYoIGpzb24udHlwZSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJ
dGhyb3cgbmV3IEVycm9yKCAidHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UiICk7
CisKKwkJCX0KKworCQkJdmFyIHRyYWNrVHlwZSA9IEtleWZyYW1lVHJhY2suX2dldFRyYWNrVHlw
ZUZvclZhbHVlVHlwZU5hbWUoIGpzb24udHlwZSApOworCisJCQlpZiAoIGpzb24udGltZXMgPT09
IHVuZGVmaW5lZCApIHsKKworCQkJCXZhciB0aW1lcyA9IFtdLCB2YWx1ZXMgPSBbXTsKKworCQkJ
CUFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBqc29uLmtleXMsIHRpbWVzLCB2YWx1ZXMsICd2
YWx1ZScgKTsKKworCQkJCWpzb24udGltZXMgPSB0aW1lczsKKwkJCQlqc29uLnZhbHVlcyA9IHZh
bHVlczsKKworCQkJfQorCisJCQkvLyBkZXJpdmVkIGNsYXNzZXMgY2FuIGRlZmluZSBhIHN0YXRp
YyBwYXJzZSBtZXRob2QKKwkJCWlmICggdHJhY2tUeXBlLnBhcnNlICE9PSB1bmRlZmluZWQgKSB7
CisKKwkJCQlyZXR1cm4gdHJhY2tUeXBlLnBhcnNlKCBqc29uICk7CisKKwkJCX0gZWxzZSB7CisK
KwkJCQkvLyBieSBkZWZhdWx0LCB3ZSBhc3NzdW1lIGEgY29uc3RydWN0b3IgY29tcGF0aWJsZSB3
aXRoIHRoZSBiYXNlCisJCQkJcmV0dXJuIG5ldyB0cmFja1R5cGUoCisJCQkJCQlqc29uLm5hbWUs
IGpzb24udGltZXMsIGpzb24udmFsdWVzLCBqc29uLmludGVycG9sYXRpb24gKTsKKworCQkJfQor
CisJCX0sCisKKwkJdG9KU09OOiBmdW5jdGlvbiggdHJhY2sgKSB7CisKKwkJCXZhciB0cmFja1R5
cGUgPSB0cmFjay5jb25zdHJ1Y3RvcjsKKworCQkJdmFyIGpzb247CisKKwkJCS8vIGRlcml2ZWQg
Y2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHRvSlNPTiBtZXRob2QKKwkJCWlmICggdHJhY2tU
eXBlLnRvSlNPTiAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJanNvbiA9IHRyYWNrVHlwZS50b0pT
T04oIHRyYWNrICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQkvLyBieSBkZWZhdWx0LCB3ZSBhc3N1
bWUgdGhlIGRhdGEgY2FuIGJlIHNlcmlhbGl6ZWQgYXMtaXMKKwkJCQlqc29uID0geworCisJCQkJ
CSduYW1lJzogdHJhY2submFtZSwKKwkJCQkJJ3RpbWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVy
dEFycmF5KCB0cmFjay50aW1lcywgQXJyYXkgKSwKKwkJCQkJJ3ZhbHVlcyc6IEFuaW1hdGlvblV0
aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudmFsdWVzLCBBcnJheSApCisKKwkJCQl9OworCisJCQkJ
dmFyIGludGVycG9sYXRpb24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7CisKKwkJCQlpZiAo
IGludGVycG9sYXRpb24gIT09IHRyYWNrLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkgeworCisJCQkJ
CWpzb24uaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb247CisKKwkJCQl9CisKKwkJCX0KKwor
CQkJanNvbi50eXBlID0gdHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5CisKKwkJCXJl
dHVybiBqc29uOworCisJCX0sCisKKwkJX2dldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWU6IGZ1
bmN0aW9uKCB0eXBlTmFtZSApIHsKKworCQkJc3dpdGNoKCB0eXBlTmFtZS50b0xvd2VyQ2FzZSgp
ICkgeworCisJCQkJY2FzZSAic2NhbGFyIjoKKwkJCQljYXNlICJkb3VibGUiOgorCQkJCWNhc2Ug
ImZsb2F0IjoKKwkJCQljYXNlICJudW1iZXIiOgorCQkJCWNhc2UgImludGVnZXIiOgorCisJCQkJ
CXJldHVybiBOdW1iZXJLZXlmcmFtZVRyYWNrOworCisJCQkJY2FzZSAidmVjdG9yIjoKKwkJCQlj
YXNlICJ2ZWN0b3IyIjoKKwkJCQljYXNlICJ2ZWN0b3IzIjoKKwkJCQljYXNlICJ2ZWN0b3I0IjoK
KworCQkJCQlyZXR1cm4gVmVjdG9yS2V5ZnJhbWVUcmFjazsKKworCQkJCWNhc2UgImNvbG9yIjoK
KworCQkJCQlyZXR1cm4gQ29sb3JLZXlmcmFtZVRyYWNrOworCisJCQkJY2FzZSAicXVhdGVybmlv
biI6CisKKwkJCQkJcmV0dXJuIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrOworCisJCQkJY2FzZSAi
Ym9vbCI6CisJCQkJY2FzZSAiYm9vbGVhbiI6CisKKwkJCQkJcmV0dXJuIEJvb2xlYW5LZXlmcmFt
ZVRyYWNrOworCisJCQkJY2FzZSAic3RyaW5nIjoKKworCQkJCQlyZXR1cm4gU3RyaW5nS2V5ZnJh
bWVUcmFjazsKKworCQkJfQorCisJCQl0aHJvdyBuZXcgRXJyb3IoICJVbnN1cHBvcnRlZCB0eXBl
TmFtZTogIiArIHR5cGVOYW1lICk7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICoKKwkgKiBS
ZXVzYWJsZSBzZXQgb2YgVHJhY2tzIHRoYXQgcmVwcmVzZW50IGFuIGFuaW1hdGlvbi4KKwkgKgor
CSAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCisJICogQGF1dGhvciBE
YXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCisJICovCisKKwlmdW5jdGlvbiBBbmlt
YXRpb25DbGlwKCBuYW1lLCBkdXJhdGlvbiwgdHJhY2tzICkgeworCisJCXRoaXMubmFtZSA9IG5h
bWU7CisJCXRoaXMudHJhY2tzID0gdHJhY2tzOworCQl0aGlzLmR1cmF0aW9uID0gKCBkdXJhdGlv
biAhPT0gdW5kZWZpbmVkICkgPyBkdXJhdGlvbiA6IC0gMTsKKworCQl0aGlzLnV1aWQgPSBfTWF0
aC5nZW5lcmF0ZVVVSUQoKTsKKworCQkvLyB0aGlzIG1lYW5zIGl0IHNob3VsZCBmaWd1cmUgb3V0
IGl0cyBkdXJhdGlvbiBieSBzY2FubmluZyB0aGUgdHJhY2tzCisJCWlmICggdGhpcy5kdXJhdGlv
biA8IDAgKSB7CisKKwkJCXRoaXMucmVzZXREdXJhdGlvbigpOworCisJCX0KKworCQl0aGlzLm9w
dGltaXplKCk7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLCB7CisKKwkJ
cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHsKKworCQkJdmFyIHRyYWNrcyA9IFtdLAorCQkJCWpz
b25UcmFja3MgPSBqc29uLnRyYWNrcywKKwkJCQlmcmFtZVRpbWUgPSAxLjAgLyAoIGpzb24uZnBz
IHx8IDEuMCApOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBqc29uVHJhY2tzLmxlbmd0aDsg
aSAhPT0gbjsgKysgaSApIHsKKworCQkJCXRyYWNrcy5wdXNoKCBLZXlmcmFtZVRyYWNrLnBhcnNl
KCBqc29uVHJhY2tzWyBpIF0gKS5zY2FsZSggZnJhbWVUaW1lICkgKTsKKworCQkJfQorCisJCQly
ZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIGpzb24ubmFtZSwganNvbi5kdXJhdGlvbiwgdHJhY2tz
ICk7CisKKwkJfSwKKworCQl0b0pTT046IGZ1bmN0aW9uICggY2xpcCApIHsKKworCQkJdmFyIHRy
YWNrcyA9IFtdLAorCQkJCWNsaXBUcmFja3MgPSBjbGlwLnRyYWNrczsKKworCQkJdmFyIGpzb24g
PSB7CisKKwkJCQknbmFtZSc6IGNsaXAubmFtZSwKKwkJCQknZHVyYXRpb24nOiBjbGlwLmR1cmF0
aW9uLAorCQkJCSd0cmFja3MnOiB0cmFja3MKKworCQkJfTsKKworCQkJZm9yICggdmFyIGkgPSAw
LCBuID0gY2xpcFRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKwkJCQl0cmFja3Mu
cHVzaCggS2V5ZnJhbWVUcmFjay50b0pTT04oIGNsaXBUcmFja3NbIGkgXSApICk7CisKKwkJCX0K
KworCQkJcmV0dXJuIGpzb247CisKKwkJfSwKKworCQlDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1
ZW5jZTogZnVuY3Rpb24gKCBuYW1lLCBtb3JwaFRhcmdldFNlcXVlbmNlLCBmcHMsIG5vTG9vcCAp
IHsKKworCQkJdmFyIG51bU1vcnBoVGFyZ2V0cyA9IG1vcnBoVGFyZ2V0U2VxdWVuY2UubGVuZ3Ro
OworCQkJdmFyIHRyYWNrcyA9IFtdOworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBudW1Nb3Jw
aFRhcmdldHM7IGkgKysgKSB7CisKKwkJCQl2YXIgdGltZXMgPSBbXTsKKwkJCQl2YXIgdmFsdWVz
ID0gW107CisKKwkJCQl0aW1lcy5wdXNoKAorCQkJCQkJKCBpICsgbnVtTW9ycGhUYXJnZXRzIC0g
MSApICUgbnVtTW9ycGhUYXJnZXRzLAorCQkJCQkJaSwKKwkJCQkJCSggaSArIDEgKSAlIG51bU1v
cnBoVGFyZ2V0cyApOworCisJCQkJdmFsdWVzLnB1c2goIDAsIDEsIDAgKTsKKworCQkJCXZhciBv
cmRlciA9IEFuaW1hdGlvblV0aWxzLmdldEtleWZyYW1lT3JkZXIoIHRpbWVzICk7CisJCQkJdGlt
ZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdGltZXMsIDEsIG9yZGVyICk7CisJCQkJ
dmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuc29ydGVkQXJyYXkoIHZhbHVlcywgMSwgb3JkZXIgKTsK
KworCQkJCS8vIGlmIHRoZXJlIGlzIGEga2V5IGF0IHRoZSBmaXJzdCBmcmFtZSwgZHVwbGljYXRl
IGl0IGFzIHRoZQorCQkJCS8vIGxhc3QgZnJhbWUgYXMgd2VsbCBmb3IgcGVyZmVjdCBsb29wLgor
CQkJCWlmICggISBub0xvb3AgJiYgdGltZXNbIDAgXSA9PT0gMCApIHsKKworCQkJCQl0aW1lcy5w
dXNoKCBudW1Nb3JwaFRhcmdldHMgKTsKKwkJCQkJdmFsdWVzLnB1c2goIHZhbHVlc1sgMCBdICk7
CisKKwkJCQl9CisKKwkJCQl0cmFja3MucHVzaCgKKwkJCQkJCW5ldyBOdW1iZXJLZXlmcmFtZVRy
YWNrKAorCQkJCQkJCScubW9ycGhUYXJnZXRJbmZsdWVuY2VzWycgKyBtb3JwaFRhcmdldFNlcXVl
bmNlWyBpIF0ubmFtZSArICddJywKKwkJCQkJCQl0aW1lcywgdmFsdWVzCisJCQkJCQkpLnNjYWxl
KCAxLjAgLyBmcHMgKSApOworCisJCQl9CisKKwkJCXJldHVybiBuZXcgQW5pbWF0aW9uQ2xpcCgg
bmFtZSwgLSAxLCB0cmFja3MgKTsKKworCQl9LAorCisJCWZpbmRCeU5hbWU6IGZ1bmN0aW9uICgg
b2JqZWN0T3JDbGlwQXJyYXksIG5hbWUgKSB7CisKKwkJCXZhciBjbGlwQXJyYXkgPSBvYmplY3RP
ckNsaXBBcnJheTsKKworCQkJaWYgKCAhIEFycmF5LmlzQXJyYXkoIG9iamVjdE9yQ2xpcEFycmF5
ICkgKSB7CisKKwkJCQl2YXIgbyA9IG9iamVjdE9yQ2xpcEFycmF5OworCQkJCWNsaXBBcnJheSA9
IG8uZ2VvbWV0cnkgJiYgby5nZW9tZXRyeS5hbmltYXRpb25zIHx8IG8uYW5pbWF0aW9uczsKKwor
CQkJfQorCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBjbGlwQXJyYXkubGVuZ3RoOyBpICsrICkg
eworCisJCQkJaWYgKCBjbGlwQXJyYXlbIGkgXS5uYW1lID09PSBuYW1lICkgeworCisJCQkJCXJl
dHVybiBjbGlwQXJyYXlbIGkgXTsKKworCQkJCX0KKworCQkJfQorCisJCQlyZXR1cm4gbnVsbDsK
KworCQl9LAorCisJCUNyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzOiBmdW5jdGlv
biAoIG1vcnBoVGFyZ2V0cywgZnBzLCBub0xvb3AgKSB7CisKKwkJCXZhciBhbmltYXRpb25Ub01v
cnBoVGFyZ2V0cyA9IHt9OworCisJCQkvLyB0ZXN0ZWQgd2l0aCBodHRwczovL3JlZ2V4MTAxLmNv
bS8gb24gdHJpY2sgc2VxdWVuY2VzCisJCQkvLyBzdWNoIGZsYW1pbmdvX2ZseUFfMDAzLCBmbGFt
aW5nb19ydW4xXzAwMywgY3JkZWF0aDAwNTkKKwkJCXZhciBwYXR0ZXJuID0gL14oW1x3LV0qPyko
W1xkXSspJC87CisKKwkJCS8vIHNvcnQgbW9ycGggdGFyZ2V0IG5hbWVzIGludG8gYW5pbWF0aW9u
IGdyb3VwcyBiYXNlZAorCQkJLy8gcGF0dGVybnMgbGlrZSBXYWxrXzAwMSwgV2Fsa18wMDIsIFJ1
bl8wMDEsIFJ1bl8wMDIKKwkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVu
Z3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKwkJCQl2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdl
dHNbIGkgXTsKKwkJCQl2YXIgcGFydHMgPSBtb3JwaFRhcmdldC5uYW1lLm1hdGNoKCBwYXR0ZXJu
ICk7CisKKwkJCQlpZiAoIHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgKSB7CisKKwkJCQkJdmFy
IG5hbWUgPSBwYXJ0c1sgMSBdOworCisJCQkJCXZhciBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBh
bmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdOworCQkJCQlpZiAoICEgYW5pbWF0aW9uTW9y
cGhUYXJnZXRzICkgeworCisJCQkJCQlhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdID0g
YW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gW107CisKKwkJCQkJfQorCisJCQkJCWFuaW1hdGlvbk1v
cnBoVGFyZ2V0cy5wdXNoKCBtb3JwaFRhcmdldCApOworCisJCQkJfQorCisJCQl9CisKKwkJCXZh
ciBjbGlwcyA9IFtdOworCisJCQlmb3IgKCB2YXIgbmFtZSBpbiBhbmltYXRpb25Ub01vcnBoVGFy
Z2V0cyApIHsKKworCQkJCWNsaXBzLnB1c2goIEFuaW1hdGlvbkNsaXAuQ3JlYXRlRnJvbU1vcnBo
VGFyZ2V0U2VxdWVuY2UoIG5hbWUsIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0sIGZw
cywgbm9Mb29wICkgKTsKKworCQkJfQorCisJCQlyZXR1cm4gY2xpcHM7CisKKwkJfSwKKworCQkv
LyBwYXJzZSB0aGUgYW5pbWF0aW9uLmhpZXJhcmNoeSBmb3JtYXQKKwkJcGFyc2VBbmltYXRpb246
IGZ1bmN0aW9uICggYW5pbWF0aW9uLCBib25lcyApIHsKKworCQkJaWYgKCAhIGFuaW1hdGlvbiAp
IHsKKworCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRp
b24gaW4gSlNPTkxvYWRlciBkYXRhLicgKTsKKwkJCQlyZXR1cm4gbnVsbDsKKworCQkJfQorCisJ
CQl2YXIgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uICggdHJhY2tUeXBlLCB0cmFja05hbWUs
IGFuaW1hdGlvbktleXMsIHByb3BlcnR5TmFtZSwgZGVzdFRyYWNrcyApIHsKKworCQkJCS8vIG9u
bHkgcmV0dXJuIHRyYWNrIGlmIHRoZXJlIGFyZSBhY3R1YWxseSBrZXlzLgorCQkJCWlmICggYW5p
bWF0aW9uS2V5cy5sZW5ndGggIT09IDAgKSB7CisKKwkJCQkJdmFyIHRpbWVzID0gW107CisJCQkJ
CXZhciB2YWx1ZXMgPSBbXTsKKworCQkJCQlBbmltYXRpb25VdGlscy5mbGF0dGVuSlNPTiggYW5p
bWF0aW9uS2V5cywgdGltZXMsIHZhbHVlcywgcHJvcGVydHlOYW1lICk7CisKKwkJCQkJLy8gZW1w
dHkga2V5cyBhcmUgZmlsdGVyZWQgb3V0LCBzbyBjaGVjayBhZ2FpbgorCQkJCQlpZiAoIHRpbWVz
Lmxlbmd0aCAhPT0gMCApIHsKKworCQkJCQkJZGVzdFRyYWNrcy5wdXNoKCBuZXcgdHJhY2tUeXBl
KCB0cmFja05hbWUsIHRpbWVzLCB2YWx1ZXMgKSApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJ
fTsKKworCQkJdmFyIHRyYWNrcyA9IFtdOworCisJCQl2YXIgY2xpcE5hbWUgPSBhbmltYXRpb24u
bmFtZSB8fCAnZGVmYXVsdCc7CisJCQkvLyBhdXRvbWF0aWMgbGVuZ3RoIGRldGVybWluYXRpb24g
aW4gQW5pbWF0aW9uQ2xpcC4KKwkJCXZhciBkdXJhdGlvbiA9IGFuaW1hdGlvbi5sZW5ndGggfHwg
LSAxOworCQkJdmFyIGZwcyA9IGFuaW1hdGlvbi5mcHMgfHwgMzA7CisKKwkJCXZhciBoaWVyYXJj
aHlUcmFja3MgPSBhbmltYXRpb24uaGllcmFyY2h5IHx8IFtdOworCisJCQlmb3IgKCB2YXIgaCA9
IDA7IGggPCBoaWVyYXJjaHlUcmFja3MubGVuZ3RoOyBoICsrICkgeworCisJCQkJdmFyIGFuaW1h
dGlvbktleXMgPSBoaWVyYXJjaHlUcmFja3NbIGggXS5rZXlzOworCisJCQkJLy8gc2tpcCBlbXB0
eSB0cmFja3MKKwkJCQlpZiAoICEgYW5pbWF0aW9uS2V5cyB8fCBhbmltYXRpb25LZXlzLmxlbmd0
aCA9PT0gMCApIGNvbnRpbnVlOworCisJCQkJLy8gcHJvY2VzcyBtb3JwaCB0YXJnZXRzCisJCQkJ
aWYgKCBhbmltYXRpb25LZXlzWyAwIF0ubW9ycGhUYXJnZXRzICkgeworCisJCQkJCS8vIGZpZ3Vy
ZSBvdXQgYWxsIG1vcnBoIHRhcmdldHMgdXNlZCBpbiB0aGlzIHRyYWNrCisJCQkJCXZhciBtb3Jw
aFRhcmdldE5hbWVzID0ge307CisKKwkJCQkJZm9yICggdmFyIGsgPSAwOyBrIDwgYW5pbWF0aW9u
S2V5cy5sZW5ndGg7IGsgKysgKSB7CisKKwkJCQkJCWlmICggYW5pbWF0aW9uS2V5c1sgayBdLm1v
cnBoVGFyZ2V0cyApIHsKKworCQkJCQkJCWZvciAoIHZhciBtID0gMDsgbSA8IGFuaW1hdGlvbktl
eXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyBtICsrICkgeworCisJCQkJCQkJCW1vcnBoVGFy
Z2V0TmFtZXNbIGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHNbIG0gXSBdID0gLSAxOwor
CisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJCS8vIGNyZWF0ZSBhIHRyYWNr
IGZvciBlYWNoIG1vcnBoIHRhcmdldCB3aXRoIGFsbCB6ZXJvCisJCQkJCS8vIG1vcnBoVGFyZ2V0
SW5mbHVlbmNlcyBleGNlcHQgZm9yIHRoZSBrZXlzIGluIHdoaWNoCisJCQkJCS8vIHRoZSBtb3Jw
aFRhcmdldCBpcyBuYW1lZC4KKwkJCQkJZm9yICggdmFyIG1vcnBoVGFyZ2V0TmFtZSBpbiBtb3Jw
aFRhcmdldE5hbWVzICkgeworCisJCQkJCQl2YXIgdGltZXMgPSBbXTsKKwkJCQkJCXZhciB2YWx1
ZXMgPSBbXTsKKworCQkJCQkJZm9yICggdmFyIG0gPSAwOyBtICE9PSBhbmltYXRpb25LZXlzWyBr
IF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgKysgbSApIHsKKworCQkJCQkJCXZhciBhbmltYXRpb25L
ZXkgPSBhbmltYXRpb25LZXlzWyBrIF07CisKKwkJCQkJCQl0aW1lcy5wdXNoKCBhbmltYXRpb25L
ZXkudGltZSApOworCQkJCQkJCXZhbHVlcy5wdXNoKCAoIGFuaW1hdGlvbktleS5tb3JwaFRhcmdl
dCA9PT0gbW9ycGhUYXJnZXROYW1lICkgPyAxIDogMCApOworCisJCQkJCQl9CisKKwkJCQkJCXRy
YWNrcy5wdXNoKCBuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayggJy5tb3JwaFRhcmdldEluZmx1ZW5j
ZVsnICsgbW9ycGhUYXJnZXROYW1lICsgJ10nLCB0aW1lcywgdmFsdWVzICkgKTsKKworCQkJCQl9
CisKKwkJCQkJZHVyYXRpb24gPSBtb3JwaFRhcmdldE5hbWVzLmxlbmd0aCAqICggZnBzIHx8IDEu
MCApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQkvLyAuLi5hc3N1bWUgc2tlbGV0YWwgYW5pbWF0
aW9uCisKKwkJCQkJdmFyIGJvbmVOYW1lID0gJy5ib25lc1snICsgYm9uZXNbIGggXS5uYW1lICsg
J10nOworCisJCQkJCWFkZE5vbmVtcHR5VHJhY2soCisJCQkJCQkJVmVjdG9yS2V5ZnJhbWVUcmFj
aywgYm9uZU5hbWUgKyAnLnBvc2l0aW9uJywKKwkJCQkJCQlhbmltYXRpb25LZXlzLCAncG9zJywg
dHJhY2tzICk7CisKKwkJCQkJYWRkTm9uZW1wdHlUcmFjaygKKwkJCQkJCQlRdWF0ZXJuaW9uS2V5
ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnF1YXRlcm5pb24nLAorCQkJCQkJCWFuaW1hdGlvbktl
eXMsICdyb3QnLCB0cmFja3MgKTsKKworCQkJCQlhZGROb25lbXB0eVRyYWNrKAorCQkJCQkJCVZl
Y3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5zY2FsZScsCisJCQkJCQkJYW5pbWF0aW9u
S2V5cywgJ3NjbCcsIHRyYWNrcyApOworCisJCQkJfQorCisJCQl9CisKKwkJCWlmICggdHJhY2tz
Lmxlbmd0aCA9PT0gMCApIHsKKworCQkJCXJldHVybiBudWxsOworCisJCQl9CisKKwkJCXZhciBj
bGlwID0gbmV3IEFuaW1hdGlvbkNsaXAoIGNsaXBOYW1lLCBkdXJhdGlvbiwgdHJhY2tzICk7CisK
KwkJCXJldHVybiBjbGlwOworCisJCX0KKworCX0gKTsKKworCU9iamVjdC5hc3NpZ24oIEFuaW1h
dGlvbkNsaXAucHJvdG90eXBlLCB7CisKKwkJcmVzZXREdXJhdGlvbjogZnVuY3Rpb24gKCkgewor
CisJCQl2YXIgdHJhY2tzID0gdGhpcy50cmFja3MsIGR1cmF0aW9uID0gMDsKKworCQkJZm9yICgg
dmFyIGkgPSAwLCBuID0gdHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworCQkJCXZh
ciB0cmFjayA9IHRoaXMudHJhY2tzWyBpIF07CisKKwkJCQlkdXJhdGlvbiA9IE1hdGgubWF4KCBk
dXJhdGlvbiwgdHJhY2sudGltZXNbIHRyYWNrLnRpbWVzLmxlbmd0aCAtIDEgXSApOworCisJCQl9
CisKKwkJCXRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjsKKworCQl9LAorCisJCXRyaW06IGZ1bmN0
aW9uICgpIHsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBp
ICsrICkgeworCisJCQkJdGhpcy50cmFja3NbIGkgXS50cmltKCAwLCB0aGlzLmR1cmF0aW9uICk7
CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlvcHRpbWl6ZTogZnVuY3Rp
b24gKCkgeworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkg
KysgKSB7CisKKwkJCQl0aGlzLnRyYWNrc1sgaSBdLm9wdGltaXplKCk7CisKKwkJCX0KKworCQkJ
cmV0dXJuIHRoaXM7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2Ig
LyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIE1hdGVyaWFsTG9hZGVyKCBt
YW5hZ2VyICkgeworCisJCXRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkg
PyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyOworCQl0aGlzLnRleHR1cmVzID0ge307
CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBNYXRlcmlhbExvYWRlci5wcm90b3R5cGUsIHsKKwor
CQlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgewor
CisJCQl2YXIgc2NvcGUgPSB0aGlzOworCisJCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIo
IHNjb3BlLm1hbmFnZXIgKTsKKwkJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCAp
IHsKKworCQkJCW9uTG9hZCggc2NvcGUucGFyc2UoIEpTT04ucGFyc2UoIHRleHQgKSApICk7CisK
KwkJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKKworCQl9LAorCisJCXNldFRleHR1cmVzOiBm
dW5jdGlvbiAoIHZhbHVlICkgeworCisJCQl0aGlzLnRleHR1cmVzID0gdmFsdWU7CisKKwkJfSwK
KworCQlwYXJzZTogZnVuY3Rpb24gKCBqc29uICkgeworCisJCQl2YXIgdGV4dHVyZXMgPSB0aGlz
LnRleHR1cmVzOworCisJCQlmdW5jdGlvbiBnZXRUZXh0dXJlKCBuYW1lICkgeworCisJCQkJaWYg
KCB0ZXh0dXJlc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJY29uc29sZS53YXJu
KCAnVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlJywgbmFtZSApOworCisJ
CQkJfQorCisJCQkJcmV0dXJuIHRleHR1cmVzWyBuYW1lIF07CisKKwkJCX0KKworCQkJdmFyIG1h
dGVyaWFsID0gbmV3IE1hdGVyaWFsc1sganNvbi50eXBlIF0oKTsKKworCQkJaWYgKCBqc29uLnV1
aWQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnV1aWQgPSBqc29uLnV1aWQ7CisJCQlpZiAoIGpz
b24ubmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubmFtZSA9IGpzb24ubmFtZTsKKwkJCWlm
ICgganNvbi5jb2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3Iuc2V0SGV4KCBqc29u
LmNvbG9yICk7CisJCQlpZiAoIGpzb24ucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlh
bC5yb3VnaG5lc3MgPSBqc29uLnJvdWdobmVzczsKKwkJCWlmICgganNvbi5tZXRhbG5lc3MgIT09
IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzcyA9IGpzb24ubWV0YWxuZXNzOworCQkJaWYg
KCBqc29uLmVtaXNzaXZlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZS5zZXRIZXgo
IGpzb24uZW1pc3NpdmUgKTsKKwkJCWlmICgganNvbi5zcGVjdWxhciAhPT0gdW5kZWZpbmVkICkg
bWF0ZXJpYWwuc3BlY3VsYXIuc2V0SGV4KCBqc29uLnNwZWN1bGFyICk7CisJCQlpZiAoIGpzb24u
c2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGluaW5lc3MgPSBqc29uLnNoaW5p
bmVzczsKKwkJCWlmICgganNvbi5jbGVhckNvYXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNs
ZWFyQ29hdCA9IGpzb24uY2xlYXJDb2F0OworCQkJaWYgKCBqc29uLmNsZWFyQ29hdFJvdWdobmVz
cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzID0ganNvbi5jbGVh
ckNvYXRSb3VnaG5lc3M7CisJCQlpZiAoIGpzb24udW5pZm9ybXMgIT09IHVuZGVmaW5lZCApIG1h
dGVyaWFsLnVuaWZvcm1zID0ganNvbi51bmlmb3JtczsKKwkJCWlmICgganNvbi52ZXJ0ZXhTaGFk
ZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZlcnRleFNoYWRlciA9IGpzb24udmVydGV4U2hh
ZGVyOworCQkJaWYgKCBqc29uLmZyYWdtZW50U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlh
bC5mcmFnbWVudFNoYWRlciA9IGpzb24uZnJhZ21lbnRTaGFkZXI7CisJCQlpZiAoIGpzb24udmVy
dGV4Q29sb3JzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBqc29uLnZl
cnRleENvbG9yczsKKwkJCWlmICgganNvbi5mb2cgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZv
ZyA9IGpzb24uZm9nOworCQkJaWYgKCBqc29uLnNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVy
aWFsLnNoYWRpbmcgPSBqc29uLnNoYWRpbmc7CisJCQlpZiAoIGpzb24uYmxlbmRpbmcgIT09IHVu
ZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kaW5nID0ganNvbi5ibGVuZGluZzsKKwkJCWlmICgganNv
bi5zaWRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaWRlID0ganNvbi5zaWRlOworCQkJaWYg
KCBqc29uLm9wYWNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm9wYWNpdHkgPSBqc29uLm9w
YWNpdHk7CisJCQlpZiAoIGpzb24udHJhbnNwYXJlbnQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFs
LnRyYW5zcGFyZW50ID0ganNvbi50cmFuc3BhcmVudDsKKwkJCWlmICgganNvbi5hbHBoYVRlc3Qg
IT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhVGVzdCA9IGpzb24uYWxwaGFUZXN0OworCQkJ
aWYgKCBqc29uLmRlcHRoVGVzdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhUZXN0ID0g
anNvbi5kZXB0aFRlc3Q7CisJCQlpZiAoIGpzb24uZGVwdGhXcml0ZSAhPT0gdW5kZWZpbmVkICkg
bWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGpzb24uZGVwdGhXcml0ZTsKKwkJCWlmICgganNvbi5jb2xv
cldyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvcldyaXRlID0ganNvbi5jb2xvcldy
aXRlOworCQkJaWYgKCBqc29uLndpcmVmcmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2ly
ZWZyYW1lID0ganNvbi53aXJlZnJhbWU7CisJCQlpZiAoIGpzb24ud2lyZWZyYW1lTGluZXdpZHRo
ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggPSBqc29uLndpcmVm
cmFtZUxpbmV3aWR0aDsKKwkJCWlmICgganNvbi53aXJlZnJhbWVMaW5lY2FwICE9PSB1bmRlZmlu
ZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lY2FwID0ganNvbi53aXJlZnJhbWVMaW5lY2FwOwor
CQkJaWYgKCBqc29uLndpcmVmcmFtZUxpbmVqb2luICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53
aXJlZnJhbWVMaW5lam9pbiA9IGpzb24ud2lyZWZyYW1lTGluZWpvaW47CisJCQlpZiAoIGpzb24u
c2tpbm5pbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNraW5uaW5nID0ganNvbi5za2lubmlu
ZzsKKwkJCWlmICgganNvbi5tb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1v
cnBoVGFyZ2V0cyA9IGpzb24ubW9ycGhUYXJnZXRzOworCisJCQkvLyBmb3IgUG9pbnRzTWF0ZXJp
YWwKKworCQkJaWYgKCBqc29uLnNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemUgPSBq
c29uLnNpemU7CisJCQlpZiAoIGpzb24uc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBt
YXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPSBqc29uLnNpemVBdHRlbnVhdGlvbjsKKworCQkJLy8g
bWFwcworCisJCQlpZiAoIGpzb24ubWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tYXAgPSBn
ZXRUZXh0dXJlKCBqc29uLm1hcCApOworCisJCQlpZiAoIGpzb24uYWxwaGFNYXAgIT09IHVuZGVm
aW5lZCApIHsKKworCQkJCW1hdGVyaWFsLmFscGhhTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hbHBo
YU1hcCApOworCQkJCW1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTsKKworCQkJfQorCisJCQlp
ZiAoIGpzb24uYnVtcE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcE1hcCA9IGdldFRl
eHR1cmUoIGpzb24uYnVtcE1hcCApOworCQkJaWYgKCBqc29uLmJ1bXBTY2FsZSAhPT0gdW5kZWZp
bmVkICkgbWF0ZXJpYWwuYnVtcFNjYWxlID0ganNvbi5idW1wU2NhbGU7CisKKwkJCWlmICgganNv
bi5ub3JtYWxNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5vcm1hbE1hcCA9IGdldFRleHR1
cmUoIGpzb24ubm9ybWFsTWFwICk7CisJCQlpZiAoIGpzb24ubm9ybWFsU2NhbGUgIT09IHVuZGVm
aW5lZCApIHsKKworCQkJCXZhciBub3JtYWxTY2FsZSA9IGpzb24ubm9ybWFsU2NhbGU7CisKKwkJ
CQlpZiAoIEFycmF5LmlzQXJyYXkoIG5vcm1hbFNjYWxlICkgPT09IGZhbHNlICkgeworCisJCQkJ
CS8vIEJsZW5kZXIgZXhwb3J0ZXIgdXNlZCB0byBleHBvcnQgYSBzY2FsYXIuIFNlZSAjNzQ1OQor
CisJCQkJCW5vcm1hbFNjYWxlID0gWyBub3JtYWxTY2FsZSwgbm9ybWFsU2NhbGUgXTsKKworCQkJ
CX0KKworCQkJCW1hdGVyaWFsLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXko
IG5vcm1hbFNjYWxlICk7CisKKwkJCX0KKworCQkJaWYgKCBqc29uLmRpc3BsYWNlbWVudE1hcCAh
PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwID0gZ2V0VGV4dHVyZSgganNv
bi5kaXNwbGFjZW1lbnRNYXAgKTsKKwkJCWlmICgganNvbi5kaXNwbGFjZW1lbnRTY2FsZSAhPT0g
dW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGUgPSBqc29uLmRpc3BsYWNlbWVu
dFNjYWxlOworCQkJaWYgKCBqc29uLmRpc3BsYWNlbWVudEJpYXMgIT09IHVuZGVmaW5lZCApIG1h
dGVyaWFsLmRpc3BsYWNlbWVudEJpYXMgPSBqc29uLmRpc3BsYWNlbWVudEJpYXM7CisKKwkJCWlm
ICgganNvbi5yb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzc01h
cCA9IGdldFRleHR1cmUoIGpzb24ucm91Z2huZXNzTWFwICk7CisJCQlpZiAoIGpzb24ubWV0YWxu
ZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgPSBnZXRUZXh0dXJl
KCBqc29uLm1ldGFsbmVzc01hcCApOworCisJCQlpZiAoIGpzb24uZW1pc3NpdmVNYXAgIT09IHVu
ZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbWlzc2l2
ZU1hcCApOworCQkJaWYgKCBqc29uLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBt
YXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSA9IGpzb24uZW1pc3NpdmVJbnRlbnNpdHk7CisKKwkJ
CWlmICgganNvbi5zcGVjdWxhck1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXJN
YXAgPSBnZXRUZXh0dXJlKCBqc29uLnNwZWN1bGFyTWFwICk7CisKKwkJCWlmICgganNvbi5lbnZN
YXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVudk1hcCA9IGdldFRleHR1cmUoIGpzb24uZW52
TWFwICk7CisKKwkJCWlmICgganNvbi5yZWZsZWN0aXZpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVy
aWFsLnJlZmxlY3Rpdml0eSA9IGpzb24ucmVmbGVjdGl2aXR5OworCisJCQlpZiAoIGpzb24ubGln
aHRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwID0gZ2V0VGV4dHVyZSgganNv
bi5saWdodE1hcCApOworCQkJaWYgKCBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmlu
ZWQgKSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eSA9IGpzb24ubGlnaHRNYXBJbnRlbnNpdHk7
CisKKwkJCWlmICgganNvbi5hb01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXAgPSBn
ZXRUZXh0dXJlKCBqc29uLmFvTWFwICk7CisJCQlpZiAoIGpzb24uYW9NYXBJbnRlbnNpdHkgIT09
IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5ID0ganNvbi5hb01hcEludGVuc2l0
eTsKKworCQkJaWYgKCBqc29uLmdyYWRpZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5n
cmFkaWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZ3JhZGllbnRNYXAgKTsKKworCQkJcmV0dXJu
IG1hdGVyaWFsOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8g
aHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBCdWZmZXJHZW9tZXRyeUxvYWRl
ciggbWFuYWdlciApIHsKKworCQl0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5l
ZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKKworCX0KKworCU9iamVjdC5h
c3NpZ24oIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLnByb3RvdHlwZSwgeworCisJCWxvYWQ6IGZ1bmN0
aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CisKKwkJCXZhciBzY29w
ZSA9IHRoaXM7CisKKwkJCXZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdl
ciApOworCQkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkgeworCisJCQkJb25M
b2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTsKKworCQkJfSwgb25Qcm9n
cmVzcywgb25FcnJvciApOworCisJCX0sCisKKwkJcGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHsK
KworCQkJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisKKwkJCXZhciBpbmRl
eCA9IGpzb24uZGF0YS5pbmRleDsKKworCQkJaWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgewor
CisJCQkJdmFyIHR5cGVkQXJyYXkgPSBuZXcgVFlQRURfQVJSQVlTWyBpbmRleC50eXBlIF0oIGlu
ZGV4LmFycmF5ICk7CisJCQkJZ2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUo
IHR5cGVkQXJyYXksIDEgKSApOworCisJCQl9CisKKwkJCXZhciBhdHRyaWJ1dGVzID0ganNvbi5k
YXRhLmF0dHJpYnV0ZXM7CisKKwkJCWZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHsKKwor
CQkJCXZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTsKKwkJCQl2YXIgdHlwZWRBcnJh
eSA9IG5ldyBUWVBFRF9BUlJBWVNbIGF0dHJpYnV0ZS50eXBlIF0oIGF0dHJpYnV0ZS5hcnJheSAp
OworCisJCQkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCBrZXksIG5ldyBCdWZmZXJBdHRyaWJ1dGUo
IHR5cGVkQXJyYXksIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlLm5vcm1hbGl6ZWQgKSAp
OworCisJCQl9CisKKwkJCXZhciBncm91cHMgPSBqc29uLmRhdGEuZ3JvdXBzIHx8IGpzb24uZGF0
YS5kcmF3Y2FsbHMgfHwganNvbi5kYXRhLm9mZnNldHM7CisKKwkJCWlmICggZ3JvdXBzICE9PSB1
bmRlZmluZWQgKSB7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBncm91cHMubGVuZ3RoOyBp
ICE9PSBuOyArKyBpICkgeworCisJCQkJCXZhciBncm91cCA9IGdyb3Vwc1sgaSBdOworCisJCQkJ
CWdlb21ldHJ5LmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVy
aWFsSW5kZXggKTsKKworCQkJCX0KKworCQkJfQorCisJCQl2YXIgYm91bmRpbmdTcGhlcmUgPSBq
c29uLmRhdGEuYm91bmRpbmdTcGhlcmU7CisKKwkJCWlmICggYm91bmRpbmdTcGhlcmUgIT09IHVu
ZGVmaW5lZCApIHsKKworCQkJCXZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpOworCisJCQkJaWYg
KCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQljZW50ZXIu
ZnJvbUFycmF5KCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgKTsKKworCQkJCX0KKworCQkJCWdlb21l
dHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSggY2VudGVyLCBib3VuZGluZ1NwaGVyZS5y
YWRpdXMgKTsKKworCQkJfQorCisJCQlyZXR1cm4gZ2VvbWV0cnk7CisKKwkJfQorCisJfSApOwor
CisJdmFyIFRZUEVEX0FSUkFZUyA9IHsKKwkJSW50OEFycmF5OiBJbnQ4QXJyYXksCisJCVVpbnQ4
QXJyYXk6IFVpbnQ4QXJyYXksCisJCS8vIFdvcmthcm91bmQgZm9yIElFMTEgcHJlIEtCMjkyOTQz
Ny4gU2VlICMxMTQ0MAorCQlVaW50OENsYW1wZWRBcnJheTogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFy
cmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4Q2xhbXBlZEFycmF5IDogVWludDhBcnJheSwKKwkJ
SW50MTZBcnJheTogSW50MTZBcnJheSwKKwkJVWludDE2QXJyYXk6IFVpbnQxNkFycmF5LAorCQlJ
bnQzMkFycmF5OiBJbnQzMkFycmF5LAorCQlVaW50MzJBcnJheTogVWludDMyQXJyYXksCisJCUZs
b2F0MzJBcnJheTogRmxvYXQzMkFycmF5LAorCQlGbG9hdDY0QXJyYXk6IEZsb2F0NjRBcnJheQor
CX07CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEu
Y29tLworCSAqLworCisJZnVuY3Rpb24gTG9hZGVyKCkgeworCisJCXRoaXMub25Mb2FkU3RhcnQg
PSBmdW5jdGlvbiAoKSB7fTsKKwkJdGhpcy5vbkxvYWRQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHt9
OworCQl0aGlzLm9uTG9hZENvbXBsZXRlID0gZnVuY3Rpb24gKCkge307CisKKwl9CisKKwlMb2Fk
ZXIuSGFuZGxlcnMgPSB7CisKKwkJaGFuZGxlcnM6IFtdLAorCisJCWFkZDogZnVuY3Rpb24gKCBy
ZWdleCwgbG9hZGVyICkgeworCisJCQl0aGlzLmhhbmRsZXJzLnB1c2goIHJlZ2V4LCBsb2FkZXIg
KTsKKworCQl9LAorCisJCWdldDogZnVuY3Rpb24gKCBmaWxlICkgeworCisJCQl2YXIgaGFuZGxl
cnMgPSB0aGlzLmhhbmRsZXJzOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5s
ZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7CisKKwkJCQl2YXIgcmVnZXggPSBoYW5kbGVyc1sgaSBd
OworCQkJCXZhciBsb2FkZXIgPSBoYW5kbGVyc1sgaSArIDEgXTsKKworCQkJCWlmICggcmVnZXgu
dGVzdCggZmlsZSApICkgeworCisJCQkJCXJldHVybiBsb2FkZXI7CisKKwkJCQl9CisKKwkJCX0K
KworCQkJcmV0dXJuIG51bGw7CisKKwkJfQorCisJfTsKKworCU9iamVjdC5hc3NpZ24oIExvYWRl
ci5wcm90b3R5cGUsIHsKKworCQljcm9zc09yaWdpbjogdW5kZWZpbmVkLAorCisJCWV4dHJhY3RV
cmxCYXNlOiBmdW5jdGlvbiAoIHVybCApIHsKKworCQkJdmFyIHBhcnRzID0gdXJsLnNwbGl0KCAn
LycgKTsKKworCQkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDEgKSByZXR1cm4gJy4vJzsKKworCQkJ
cGFydHMucG9wKCk7CisKKwkJCXJldHVybiBwYXJ0cy5qb2luKCAnLycgKSArICcvJzsKKworCQl9
LAorCisJCWluaXRNYXRlcmlhbHM6IGZ1bmN0aW9uICggbWF0ZXJpYWxzLCB0ZXh0dXJlUGF0aCwg
Y3Jvc3NPcmlnaW4gKSB7CisKKwkJCXZhciBhcnJheSA9IFtdOworCisJCQlmb3IgKCB2YXIgaSA9
IDA7IGkgPCBtYXRlcmlhbHMubGVuZ3RoOyArKyBpICkgeworCisJCQkJYXJyYXlbIGkgXSA9IHRo
aXMuY3JlYXRlTWF0ZXJpYWwoIG1hdGVyaWFsc1sgaSBdLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmln
aW4gKTsKKworCQkJfQorCisJCQlyZXR1cm4gYXJyYXk7CisKKwkJfSwKKworCQljcmVhdGVNYXRl
cmlhbDogKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBCbGVuZGluZ01vZGUgPSB7CisJCQkJTm9C
bGVuZGluZzogTm9CbGVuZGluZywKKwkJCQlOb3JtYWxCbGVuZGluZzogTm9ybWFsQmxlbmRpbmcs
CisJCQkJQWRkaXRpdmVCbGVuZGluZzogQWRkaXRpdmVCbGVuZGluZywKKwkJCQlTdWJ0cmFjdGl2
ZUJsZW5kaW5nOiBTdWJ0cmFjdGl2ZUJsZW5kaW5nLAorCQkJCU11bHRpcGx5QmxlbmRpbmc6IE11
bHRpcGx5QmxlbmRpbmcsCisJCQkJQ3VzdG9tQmxlbmRpbmc6IEN1c3RvbUJsZW5kaW5nCisJCQl9
OworCisJCQl2YXIgY29sb3IgPSBuZXcgQ29sb3IoKTsKKwkJCXZhciB0ZXh0dXJlTG9hZGVyID0g
bmV3IFRleHR1cmVMb2FkZXIoKTsKKwkJCXZhciBtYXRlcmlhbExvYWRlciA9IG5ldyBNYXRlcmlh
bExvYWRlcigpOworCisJCQlyZXR1cm4gZnVuY3Rpb24gY3JlYXRlTWF0ZXJpYWwoIG0sIHRleHR1
cmVQYXRoLCBjcm9zc09yaWdpbiApIHsKKworCQkJCS8vIGNvbnZlcnQgZnJvbSBvbGQgbWF0ZXJp
YWwgZm9ybWF0CisKKwkJCQl2YXIgdGV4dHVyZXMgPSB7fTsKKworCQkJCWZ1bmN0aW9uIGxvYWRU
ZXh0dXJlKCBwYXRoLCByZXBlYXQsIG9mZnNldCwgd3JhcCwgYW5pc290cm9weSApIHsKKworCQkJ
CQl2YXIgZnVsbFBhdGggPSB0ZXh0dXJlUGF0aCArIHBhdGg7CisJCQkJCXZhciBsb2FkZXIgPSBM
b2FkZXIuSGFuZGxlcnMuZ2V0KCBmdWxsUGF0aCApOworCisJCQkJCXZhciB0ZXh0dXJlOworCisJ
CQkJCWlmICggbG9hZGVyICE9PSBudWxsICkgeworCisJCQkJCQl0ZXh0dXJlID0gbG9hZGVyLmxv
YWQoIGZ1bGxQYXRoICk7CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJdGV4dHVyZUxvYWRlci5z
ZXRDcm9zc09yaWdpbiggY3Jvc3NPcmlnaW4gKTsKKwkJCQkJCXRleHR1cmUgPSB0ZXh0dXJlTG9h
ZGVyLmxvYWQoIGZ1bGxQYXRoICk7CisKKwkJCQkJfQorCisJCQkJCWlmICggcmVwZWF0ICE9PSB1
bmRlZmluZWQgKSB7CisKKwkJCQkJCXRleHR1cmUucmVwZWF0LmZyb21BcnJheSggcmVwZWF0ICk7
CisKKwkJCQkJCWlmICggcmVwZWF0WyAwIF0gIT09IDEgKSB0ZXh0dXJlLndyYXBTID0gUmVwZWF0
V3JhcHBpbmc7CisJCQkJCQlpZiAoIHJlcGVhdFsgMSBdICE9PSAxICkgdGV4dHVyZS53cmFwVCA9
IFJlcGVhdFdyYXBwaW5nOworCisJCQkJCX0KKworCQkJCQlpZiAoIG9mZnNldCAhPT0gdW5kZWZp
bmVkICkgeworCisJCQkJCQl0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIG9mZnNldCApOworCisJ
CQkJCX0KKworCQkJCQlpZiAoIHdyYXAgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJaWYgKCB3
cmFwWyAwIF0gPT09ICdyZXBlYXQnICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nOwor
CQkJCQkJaWYgKCB3cmFwWyAwIF0gPT09ICdtaXJyb3InICkgdGV4dHVyZS53cmFwUyA9IE1pcnJv
cmVkUmVwZWF0V3JhcHBpbmc7CisKKwkJCQkJCWlmICggd3JhcFsgMSBdID09PSAncmVwZWF0JyAp
IHRleHR1cmUud3JhcFQgPSBSZXBlYXRXcmFwcGluZzsKKwkJCQkJCWlmICggd3JhcFsgMSBdID09
PSAnbWlycm9yJyApIHRleHR1cmUud3JhcFQgPSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOworCisJ
CQkJCX0KKworCQkJCQlpZiAoIGFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJ
dGV4dHVyZS5hbmlzb3Ryb3B5ID0gYW5pc290cm9weTsKKworCQkJCQl9CisKKwkJCQkJdmFyIHV1
aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKKworCQkJCQl0ZXh0dXJlc1sgdXVpZCBdID0gdGV4
dHVyZTsKKworCQkJCQlyZXR1cm4gdXVpZDsKKworCQkJCX0KKworCQkJCS8vCisKKwkJCQl2YXIg
anNvbiA9IHsKKwkJCQkJdXVpZDogX01hdGguZ2VuZXJhdGVVVUlEKCksCisJCQkJCXR5cGU6ICdN
ZXNoTGFtYmVydE1hdGVyaWFsJworCQkJCX07CisKKwkJCQlmb3IgKCB2YXIgbmFtZSBpbiBtICkg
eworCisJCQkJCXZhciB2YWx1ZSA9IG1bIG5hbWUgXTsKKworCQkJCQlzd2l0Y2ggKCBuYW1lICkg
eworCisJCQkJCQljYXNlICdEYmdDb2xvcic6CisJCQkJCQljYXNlICdEYmdJbmRleCc6CisJCQkJ
CQljYXNlICdvcHRpY2FsRGVuc2l0eSc6CisJCQkJCQljYXNlICdpbGx1bWluYXRpb24nOgorCQkJ
CQkJCWJyZWFrOworCQkJCQkJY2FzZSAnRGJnTmFtZSc6CisJCQkJCQkJanNvbi5uYW1lID0gdmFs
dWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdibGVuZGluZyc6CisJCQkJCQkJanNvbi5i
bGVuZGluZyA9IEJsZW5kaW5nTW9kZVsgdmFsdWUgXTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNh
c2UgJ2NvbG9yQW1iaWVudCc6CisJCQkJCQljYXNlICdtYXBBbWJpZW50JzoKKwkJCQkJCQljb25z
b2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6JywgbmFtZSwgJ2lzIG5vIGxv
bmdlciBzdXBwb3J0ZWQuJyApOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnY29sb3JEaWZm
dXNlJzoKKwkJCQkJCQlqc29uLmNvbG9yID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhl
eCgpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnY29sb3JTcGVjdWxhcic6CisJCQkJCQkJ
anNvbi5zcGVjdWxhciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTsKKwkJCQkJ
CQlicmVhazsKKwkJCQkJCWNhc2UgJ2NvbG9yRW1pc3NpdmUnOgorCQkJCQkJCWpzb24uZW1pc3Np
dmUgPSBjb2xvci5mcm9tQXJyYXkoIHZhbHVlICkuZ2V0SGV4KCk7CisJCQkJCQkJYnJlYWs7CisJ
CQkJCQljYXNlICdzcGVjdWxhckNvZWYnOgorCQkJCQkJCWpzb24uc2hpbmluZXNzID0gdmFsdWU7
CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdzaGFkaW5nJzoKKwkJCQkJCQlpZiAoIHZhbHVl
LnRvTG93ZXJDYXNlKCkgPT09ICdiYXNpYycgKSBqc29uLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJp
YWwnOworCQkJCQkJCWlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3Bob25nJyApIGpzb24u
dHlwZSA9ICdNZXNoUGhvbmdNYXRlcmlhbCc7CisJCQkJCQkJaWYgKCB2YWx1ZS50b0xvd2VyQ2Fz
ZSgpID09PSAnc3RhbmRhcmQnICkganNvbi50eXBlID0gJ01lc2hTdGFuZGFyZE1hdGVyaWFsJzsK
KwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ21hcERpZmZ1c2UnOgorCQkJCQkJCWpzb24ubWFw
ID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcERpZmZ1c2VSZXBlYXQsIG0ubWFwRGlmZnVzZU9m
ZnNldCwgbS5tYXBEaWZmdXNlV3JhcCwgbS5tYXBEaWZmdXNlQW5pc290cm9weSApOworCQkJCQkJ
CWJyZWFrOworCQkJCQkJY2FzZSAnbWFwRGlmZnVzZVJlcGVhdCc6CisJCQkJCQljYXNlICdtYXBE
aWZmdXNlT2Zmc2V0JzoKKwkJCQkJCWNhc2UgJ21hcERpZmZ1c2VXcmFwJzoKKwkJCQkJCWNhc2Ug
J21hcERpZmZ1c2VBbmlzb3Ryb3B5JzoKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ21hcEVt
aXNzaXZlJzoKKwkJCQkJCQlqc29uLmVtaXNzaXZlTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBt
Lm1hcEVtaXNzaXZlUmVwZWF0LCBtLm1hcEVtaXNzaXZlT2Zmc2V0LCBtLm1hcEVtaXNzaXZlV3Jh
cCwgbS5tYXBFbWlzc2l2ZUFuaXNvdHJvcHkgKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2Ug
J21hcEVtaXNzaXZlUmVwZWF0JzoKKwkJCQkJCWNhc2UgJ21hcEVtaXNzaXZlT2Zmc2V0JzoKKwkJ
CQkJCWNhc2UgJ21hcEVtaXNzaXZlV3JhcCc6CisJCQkJCQljYXNlICdtYXBFbWlzc2l2ZUFuaXNv
dHJvcHknOgorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnbWFwTGlnaHQnOgorCQkJCQkJCWpz
b24ubGlnaHRNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTGlnaHRSZXBlYXQsIG0ubWFw
TGlnaHRPZmZzZXQsIG0ubWFwTGlnaHRXcmFwLCBtLm1hcExpZ2h0QW5pc290cm9weSApOworCQkJ
CQkJCWJyZWFrOworCQkJCQkJY2FzZSAnbWFwTGlnaHRSZXBlYXQnOgorCQkJCQkJY2FzZSAnbWFw
TGlnaHRPZmZzZXQnOgorCQkJCQkJY2FzZSAnbWFwTGlnaHRXcmFwJzoKKwkJCQkJCWNhc2UgJ21h
cExpZ2h0QW5pc290cm9weSc6CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdtYXBBTyc6CisJ
CQkJCQkJanNvbi5hb01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBBT1JlcGVhdCwgbS5t
YXBBT09mZnNldCwgbS5tYXBBT1dyYXAsIG0ubWFwQU9Bbmlzb3Ryb3B5ICk7CisJCQkJCQkJYnJl
YWs7CisJCQkJCQljYXNlICdtYXBBT1JlcGVhdCc6CisJCQkJCQljYXNlICdtYXBBT09mZnNldCc6
CisJCQkJCQljYXNlICdtYXBBT1dyYXAnOgorCQkJCQkJY2FzZSAnbWFwQU9Bbmlzb3Ryb3B5JzoK
KwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ21hcEJ1bXAnOgorCQkJCQkJCWpzb24uYnVtcE1h
cCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBCdW1wUmVwZWF0LCBtLm1hcEJ1bXBPZmZzZXQs
IG0ubWFwQnVtcFdyYXAsIG0ubWFwQnVtcEFuaXNvdHJvcHkgKTsKKwkJCQkJCQlicmVhazsKKwkJ
CQkJCWNhc2UgJ21hcEJ1bXBTY2FsZSc6CisJCQkJCQkJanNvbi5idW1wU2NhbGUgPSB2YWx1ZTsK
KwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ21hcEJ1bXBSZXBlYXQnOgorCQkJCQkJY2FzZSAn
bWFwQnVtcE9mZnNldCc6CisJCQkJCQljYXNlICdtYXBCdW1wV3JhcCc6CisJCQkJCQljYXNlICdt
YXBCdW1wQW5pc290cm9weSc6CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdtYXBOb3JtYWwn
OgorCQkJCQkJCWpzb24ubm9ybWFsTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE5vcm1h
bFJlcGVhdCwgbS5tYXBOb3JtYWxPZmZzZXQsIG0ubWFwTm9ybWFsV3JhcCwgbS5tYXBOb3JtYWxB
bmlzb3Ryb3B5ICk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdtYXBOb3JtYWxGYWN0b3In
OgorCQkJCQkJCWpzb24ubm9ybWFsU2NhbGUgPSBbIHZhbHVlLCB2YWx1ZSBdOworCQkJCQkJCWJy
ZWFrOworCQkJCQkJY2FzZSAnbWFwTm9ybWFsUmVwZWF0JzoKKwkJCQkJCWNhc2UgJ21hcE5vcm1h
bE9mZnNldCc6CisJCQkJCQljYXNlICdtYXBOb3JtYWxXcmFwJzoKKwkJCQkJCWNhc2UgJ21hcE5v
cm1hbEFuaXNvdHJvcHknOgorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnbWFwU3BlY3VsYXIn
OgorCQkJCQkJCWpzb24uc3BlY3VsYXJNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwU3Bl
Y3VsYXJSZXBlYXQsIG0ubWFwU3BlY3VsYXJPZmZzZXQsIG0ubWFwU3BlY3VsYXJXcmFwLCBtLm1h
cFNwZWN1bGFyQW5pc290cm9weSApOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnbWFwU3Bl
Y3VsYXJSZXBlYXQnOgorCQkJCQkJY2FzZSAnbWFwU3BlY3VsYXJPZmZzZXQnOgorCQkJCQkJY2Fz
ZSAnbWFwU3BlY3VsYXJXcmFwJzoKKwkJCQkJCWNhc2UgJ21hcFNwZWN1bGFyQW5pc290cm9weSc6
CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdtYXBNZXRhbG5lc3MnOgorCQkJCQkJCWpzb24u
bWV0YWxuZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE1ldGFsbmVzc1JlcGVhdCwg
bS5tYXBNZXRhbG5lc3NPZmZzZXQsIG0ubWFwTWV0YWxuZXNzV3JhcCwgbS5tYXBNZXRhbG5lc3NB
bmlzb3Ryb3B5ICk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdtYXBNZXRhbG5lc3NSZXBl
YXQnOgorCQkJCQkJY2FzZSAnbWFwTWV0YWxuZXNzT2Zmc2V0JzoKKwkJCQkJCWNhc2UgJ21hcE1l
dGFsbmVzc1dyYXAnOgorCQkJCQkJY2FzZSAnbWFwTWV0YWxuZXNzQW5pc290cm9weSc6CisJCQkJ
CQkJYnJlYWs7CisJCQkJCQljYXNlICdtYXBSb3VnaG5lc3MnOgorCQkJCQkJCWpzb24ucm91Z2hu
ZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFJvdWdobmVzc1JlcGVhdCwgbS5tYXBS
b3VnaG5lc3NPZmZzZXQsIG0ubWFwUm91Z2huZXNzV3JhcCwgbS5tYXBSb3VnaG5lc3NBbmlzb3Ry
b3B5ICk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdtYXBSb3VnaG5lc3NSZXBlYXQnOgor
CQkJCQkJY2FzZSAnbWFwUm91Z2huZXNzT2Zmc2V0JzoKKwkJCQkJCWNhc2UgJ21hcFJvdWdobmVz
c1dyYXAnOgorCQkJCQkJY2FzZSAnbWFwUm91Z2huZXNzQW5pc290cm9weSc6CisJCQkJCQkJYnJl
YWs7CisJCQkJCQljYXNlICdtYXBBbHBoYSc6CisJCQkJCQkJanNvbi5hbHBoYU1hcCA9IGxvYWRU
ZXh0dXJlKCB2YWx1ZSwgbS5tYXBBbHBoYVJlcGVhdCwgbS5tYXBBbHBoYU9mZnNldCwgbS5tYXBB
bHBoYVdyYXAsIG0ubWFwQWxwaGFBbmlzb3Ryb3B5ICk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlj
YXNlICdtYXBBbHBoYVJlcGVhdCc6CisJCQkJCQljYXNlICdtYXBBbHBoYU9mZnNldCc6CisJCQkJ
CQljYXNlICdtYXBBbHBoYVdyYXAnOgorCQkJCQkJY2FzZSAnbWFwQWxwaGFBbmlzb3Ryb3B5JzoK
KwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ2ZsaXBTaWRlZCc6CisJCQkJCQkJanNvbi5zaWRl
ID0gQmFja1NpZGU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlICdkb3VibGVTaWRlZCc6CisJ
CQkJCQkJanNvbi5zaWRlID0gRG91YmxlU2lkZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2Ug
J3RyYW5zcGFyZW5jeSc6CisJCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTG9hZGVyLmNyZWF0
ZU1hdGVyaWFsOiB0cmFuc3BhcmVuY3kgaGFzIGJlZW4gcmVuYW1lZCB0byBvcGFjaXR5JyApOwor
CQkJCQkJCWpzb24ub3BhY2l0eSA9IHZhbHVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAn
ZGVwdGhUZXN0JzoKKwkJCQkJCWNhc2UgJ2RlcHRoV3JpdGUnOgorCQkJCQkJY2FzZSAnY29sb3JX
cml0ZSc6CisJCQkJCQljYXNlICdvcGFjaXR5JzoKKwkJCQkJCWNhc2UgJ3JlZmxlY3Rpdml0eSc6
CisJCQkJCQljYXNlICd0cmFuc3BhcmVudCc6CisJCQkJCQljYXNlICd2aXNpYmxlJzoKKwkJCQkJ
CWNhc2UgJ3dpcmVmcmFtZSc6CisJCQkJCQkJanNvblsgbmFtZSBdID0gdmFsdWU7CisJCQkJCQkJ
YnJlYWs7CisJCQkJCQljYXNlICd2ZXJ0ZXhDb2xvcnMnOgorCQkJCQkJCWlmICggdmFsdWUgPT09
IHRydWUgKSBqc29uLnZlcnRleENvbG9ycyA9IFZlcnRleENvbG9yczsKKwkJCQkJCQlpZiAoIHZh
bHVlID09PSAnZmFjZScgKSBqc29uLnZlcnRleENvbG9ycyA9IEZhY2VDb2xvcnM7CisJCQkJCQkJ
YnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Mb2Fk
ZXIuY3JlYXRlTWF0ZXJpYWw6IFVuc3VwcG9ydGVkJywgbmFtZSwgdmFsdWUgKTsKKwkJCQkJCQli
cmVhazsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlpZiAoIGpzb24udHlwZSA9PT0gJ01lc2hC
YXNpY01hdGVyaWFsJyApIGRlbGV0ZSBqc29uLmVtaXNzaXZlOworCQkJCWlmICgganNvbi50eXBl
ICE9PSAnTWVzaFBob25nTWF0ZXJpYWwnICkgZGVsZXRlIGpzb24uc3BlY3VsYXI7CisKKwkJCQlp
ZiAoIGpzb24ub3BhY2l0eSA8IDEgKSBqc29uLnRyYW5zcGFyZW50ID0gdHJ1ZTsKKworCQkJCW1h
dGVyaWFsTG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApOworCisJCQkJcmV0dXJuIG1hdGVy
aWFsTG9hZGVyLnBhcnNlKCBqc29uICk7CisKKwkJCX07CisKKwkJfSApKCkKKworCX0gKTsKKwor
CS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhv
ciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9u
IEpTT05Mb2FkZXIoIG1hbmFnZXIgKSB7CisKKwkJaWYgKCB0eXBlb2YgbWFuYWdlciA9PT0gJ2Jv
b2xlYW4nICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5KU09OTG9hZGVyOiBzaG93U3Rh
dHVzIHBhcmFtZXRlciBoYXMgYmVlbiByZW1vdmVkIGZyb20gY29uc3RydWN0b3IuJyApOworCQkJ
bWFuYWdlciA9IHVuZGVmaW5lZDsKKworCQl9CisKKwkJdGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2Vy
ICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CisKKwkJ
dGhpcy53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZTsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIEpT
T05Mb2FkZXIucHJvdG90eXBlLCB7CisKKwkJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwg
b25Qcm9ncmVzcywgb25FcnJvciApIHsKKworCQkJdmFyIHNjb3BlID0gdGhpczsKKworCQkJdmFy
IHRleHR1cmVQYXRoID0gdGhpcy50ZXh0dXJlUGF0aCAmJiAoIHR5cGVvZiB0aGlzLnRleHR1cmVQ
YXRoID09PSAic3RyaW5nIiApID8gdGhpcy50ZXh0dXJlUGF0aCA6IExvYWRlci5wcm90b3R5cGUu
ZXh0cmFjdFVybEJhc2UoIHVybCApOworCisJCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIo
IHRoaXMubWFuYWdlciApOworCQkJbG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggdGhpcy53aXRo
Q3JlZGVudGlhbHMgKTsKKwkJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHsK
KworCQkJCXZhciBqc29uID0gSlNPTi5wYXJzZSggdGV4dCApOworCQkJCXZhciBtZXRhZGF0YSA9
IGpzb24ubWV0YWRhdGE7CisKKwkJCQlpZiAoIG1ldGFkYXRhICE9PSB1bmRlZmluZWQgKSB7CisK
KwkJCQkJdmFyIHR5cGUgPSBtZXRhZGF0YS50eXBlOworCisJCQkJCWlmICggdHlwZSAhPT0gdW5k
ZWZpbmVkICkgeworCisJCQkJCQlpZiAoIHR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ29iamVjdCcg
KSB7CisKKwkJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuSlNPTkxvYWRlcjogJyArIHVybCAr
ICcgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIFRIUkVFLk9iamVjdExvYWRlciBpbnN0ZWFkLicgKTsK
KwkJCQkJCQlyZXR1cm47CisKKwkJCQkJCX0KKworCQkJCQkJaWYgKCB0eXBlLnRvTG93ZXJDYXNl
KCkgPT09ICdzY2VuZScgKSB7CisKKwkJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuSlNPTkxv
YWRlcjogJyArIHVybCArICcgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIFRIUkVFLlNjZW5lTG9hZGVy
IGluc3RlYWQuJyApOworCQkJCQkJCXJldHVybjsKKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJ
CX0KKworCQkJCXZhciBvYmplY3QgPSBzY29wZS5wYXJzZSgganNvbiwgdGV4dHVyZVBhdGggKTsK
KwkJCQlvbkxvYWQoIG9iamVjdC5nZW9tZXRyeSwgb2JqZWN0Lm1hdGVyaWFscyApOworCisJCQl9
LCBvblByb2dyZXNzLCBvbkVycm9yICk7CisKKwkJfSwKKworCQlzZXRUZXh0dXJlUGF0aDogZnVu
Y3Rpb24gKCB2YWx1ZSApIHsKKworCQkJdGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlOworCisJCX0s
CisKKwkJcGFyc2U6ICggZnVuY3Rpb24gKCkgeworCisJCQlmdW5jdGlvbiBwYXJzZU1vZGVsKCBq
c29uLCBnZW9tZXRyeSApIHsKKworCQkJCWZ1bmN0aW9uIGlzQml0U2V0KCB2YWx1ZSwgcG9zaXRp
b24gKSB7CisKKwkJCQkJcmV0dXJuIHZhbHVlICYgKCAxIDw8IHBvc2l0aW9uICk7CisKKwkJCQl9
CisKKwkJCQl2YXIgaSwgaiwgZmksCisKKwkJCQkJb2Zmc2V0LCB6TGVuZ3RoLAorCisJCQkJCWNv
bG9ySW5kZXgsIG5vcm1hbEluZGV4LCB1dkluZGV4LCBtYXRlcmlhbEluZGV4LAorCisJCQkJCXR5
cGUsCisJCQkJCWlzUXVhZCwKKwkJCQkJaGFzTWF0ZXJpYWwsCisJCQkJCWhhc0ZhY2VWZXJ0ZXhV
diwKKwkJCQkJaGFzRmFjZU5vcm1hbCwgaGFzRmFjZVZlcnRleE5vcm1hbCwKKwkJCQkJaGFzRmFj
ZUNvbG9yLCBoYXNGYWNlVmVydGV4Q29sb3IsCisKKwkJCQkJdmVydGV4LCBmYWNlLCBmYWNlQSwg
ZmFjZUIsIGhleCwgbm9ybWFsLAorCisJCQkJCXV2TGF5ZXIsIHV2LCB1LCB2LAorCisJCQkJCWZh
Y2VzID0ganNvbi5mYWNlcywKKwkJCQkJdmVydGljZXMgPSBqc29uLnZlcnRpY2VzLAorCQkJCQlu
b3JtYWxzID0ganNvbi5ub3JtYWxzLAorCQkJCQljb2xvcnMgPSBqc29uLmNvbG9ycywKKworCQkJ
CQlzY2FsZSA9IGpzb24uc2NhbGUsCisKKwkJCQkJblV2TGF5ZXJzID0gMDsKKworCisJCQkJaWYg
KCBqc29uLnV2cyAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCS8vIGRpc3JlZ2FyZCBlbXB0eSBh
cnJheXMKKworCQkJCQlmb3IgKCBpID0gMDsgaSA8IGpzb24udXZzLmxlbmd0aDsgaSArKyApIHsK
KworCQkJCQkJaWYgKCBqc29uLnV2c1sgaSBdLmxlbmd0aCApIG5VdkxheWVycyArKzsKKworCQkJ
CQl9CisKKwkJCQkJZm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7CisKKwkJCQkJ
CWdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXSA9IFtdOworCisJCQkJCX0KKworCQkJCX0KKwor
CQkJCW9mZnNldCA9IDA7CisJCQkJekxlbmd0aCA9IHZlcnRpY2VzLmxlbmd0aDsKKworCQkJCXdo
aWxlICggb2Zmc2V0IDwgekxlbmd0aCApIHsKKworCQkJCQl2ZXJ0ZXggPSBuZXcgVmVjdG9yMygp
OworCisJCQkJCXZlcnRleC54ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2NhbGU7CisJCQkJ
CXZlcnRleC55ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2NhbGU7CisJCQkJCXZlcnRleC56
ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2NhbGU7CisKKwkJCQkJZ2VvbWV0cnkudmVydGlj
ZXMucHVzaCggdmVydGV4ICk7CisKKwkJCQl9CisKKwkJCQlvZmZzZXQgPSAwOworCQkJCXpMZW5n
dGggPSBmYWNlcy5sZW5ndGg7CisKKwkJCQl3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7CisK
KwkJCQkJdHlwZSA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKworCQkJCQlpc1F1YWQgPSBpc0JpdFNl
dCggdHlwZSwgMCApOworCQkJCQloYXNNYXRlcmlhbCA9IGlzQml0U2V0KCB0eXBlLCAxICk7CisJ
CQkJCWhhc0ZhY2VWZXJ0ZXhVdiA9IGlzQml0U2V0KCB0eXBlLCAzICk7CisJCQkJCWhhc0ZhY2VO
b3JtYWwgPSBpc0JpdFNldCggdHlwZSwgNCApOworCQkJCQloYXNGYWNlVmVydGV4Tm9ybWFsID0g
aXNCaXRTZXQoIHR5cGUsIDUgKTsKKwkJCQkJaGFzRmFjZUNvbG9yID0gaXNCaXRTZXQoIHR5cGUs
IDYgKTsKKwkJCQkJaGFzRmFjZVZlcnRleENvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDcgKTsKKwor
CQkJCQkvLyBjb25zb2xlLmxvZygidHlwZSIsIHR5cGUsICJiaXRzIiwgaXNRdWFkLCBoYXNNYXRl
cmlhbCwgaGFzRmFjZVZlcnRleFV2LCBoYXNGYWNlTm9ybWFsLCBoYXNGYWNlVmVydGV4Tm9ybWFs
LCBoYXNGYWNlQ29sb3IsIGhhc0ZhY2VWZXJ0ZXhDb2xvcik7CisKKwkJCQkJaWYgKCBpc1F1YWQg
KSB7CisKKwkJCQkJCWZhY2VBID0gbmV3IEZhY2UzKCk7CisJCQkJCQlmYWNlQS5hID0gZmFjZXNb
IG9mZnNldCBdOworCQkJCQkJZmFjZUEuYiA9IGZhY2VzWyBvZmZzZXQgKyAxIF07CisJCQkJCQlm
YWNlQS5jID0gZmFjZXNbIG9mZnNldCArIDMgXTsKKworCQkJCQkJZmFjZUIgPSBuZXcgRmFjZTMo
KTsKKwkJCQkJCWZhY2VCLmEgPSBmYWNlc1sgb2Zmc2V0ICsgMSBdOworCQkJCQkJZmFjZUIuYiA9
IGZhY2VzWyBvZmZzZXQgKyAyIF07CisJCQkJCQlmYWNlQi5jID0gZmFjZXNbIG9mZnNldCArIDMg
XTsKKworCQkJCQkJb2Zmc2V0ICs9IDQ7CisKKwkJCQkJCWlmICggaGFzTWF0ZXJpYWwgKSB7CisK
KwkJCQkJCQltYXRlcmlhbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdOworCQkJCQkJCWZhY2VB
Lm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4OworCQkJCQkJCWZhY2VCLm1hdGVyaWFsSW5k
ZXggPSBtYXRlcmlhbEluZGV4OworCisJCQkJCQl9CisKKwkJCQkJCS8vIHRvIGdldCBmYWNlIDw9
PiB1diBpbmRleCBjb3JyZXNwb25kZW5jZQorCisJCQkJCQlmaSA9IGdlb21ldHJ5LmZhY2VzLmxl
bmd0aDsKKworCQkJCQkJaWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7CisKKwkJCQkJCQlmb3IgKCBp
ID0gMDsgaSA8IG5VdkxheWVyczsgaSArKyApIHsKKworCQkJCQkJCQl1dkxheWVyID0ganNvbi51
dnNbIGkgXTsKKworCQkJCQkJCQlnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0gPSBb
XTsKKwkJCQkJCQkJZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSArIDEgXSA9IFtdOwor
CisJCQkJCQkJCWZvciAoIGogPSAwOyBqIDwgNDsgaiArKyApIHsKKworCQkJCQkJCQkJdXZJbmRl
eCA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKworCQkJCQkJCQkJdSA9IHV2TGF5ZXJbIHV2SW5kZXgg
KiAyIF07CisJCQkJCQkJCQl2ID0gdXZMYXllclsgdXZJbmRleCAqIDIgKyAxIF07CisKKwkJCQkJ
CQkJCXV2ID0gbmV3IFZlY3RvcjIoIHUsIHYgKTsKKworCQkJCQkJCQkJaWYgKCBqICE9PSAyICkg
Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdLnB1c2goIHV2ICk7CisJCQkJCQkJCQlp
ZiAoIGogIT09IDAgKSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdLnB1c2go
IHV2ICk7CisKKwkJCQkJCQkJfQorCisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQkJCWlmICgg
aGFzRmFjZU5vcm1hbCApIHsKKworCQkJCQkJCW5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCAr
KyBdICogMzsKKworCQkJCQkJCWZhY2VBLm5vcm1hbC5zZXQoCisJCQkJCQkJCW5vcm1hbHNbIG5v
cm1hbEluZGV4ICsrIF0sCisJCQkJCQkJCW5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sCisJCQkJ
CQkJCW5vcm1hbHNbIG5vcm1hbEluZGV4IF0KKwkJCQkJCQkpOworCisJCQkJCQkJZmFjZUIubm9y
bWFsLmNvcHkoIGZhY2VBLm5vcm1hbCApOworCisJCQkJCQl9CisKKwkJCQkJCWlmICggaGFzRmFj
ZVZlcnRleE5vcm1hbCApIHsKKworCQkJCQkJCWZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHsK
KworCQkJCQkJCQlub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7CisKKwkJCQkJ
CQkJbm9ybWFsID0gbmV3IFZlY3RvcjMoCisJCQkJCQkJCQlub3JtYWxzWyBub3JtYWxJbmRleCAr
KyBdLAorCQkJCQkJCQkJbm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSwKKwkJCQkJCQkJCW5vcm1h
bHNbIG5vcm1hbEluZGV4IF0KKwkJCQkJCQkJKTsKKworCisJCQkJCQkJCWlmICggaSAhPT0gMiAp
IGZhY2VBLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7CisJCQkJCQkJCWlmICggaSAhPT0g
MCApIGZhY2VCLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7CisKKwkJCQkJCQl9CisKKwkJ
CQkJCX0KKworCisJCQkJCQlpZiAoIGhhc0ZhY2VDb2xvciApIHsKKworCQkJCQkJCWNvbG9ySW5k
ZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07CisJCQkJCQkJaGV4ID0gY29sb3JzWyBjb2xvckluZGV4
IF07CisKKwkJCQkJCQlmYWNlQS5jb2xvci5zZXRIZXgoIGhleCApOworCQkJCQkJCWZhY2VCLmNv
bG9yLnNldEhleCggaGV4ICk7CisKKwkJCQkJCX0KKworCisJCQkJCQlpZiAoIGhhc0ZhY2VWZXJ0
ZXhDb2xvciApIHsKKworCQkJCQkJCWZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHsKKworCQkJ
CQkJCQljb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdOworCQkJCQkJCQloZXggPSBjb2xv
cnNbIGNvbG9ySW5kZXggXTsKKworCQkJCQkJCQlpZiAoIGkgIT09IDIgKSBmYWNlQS52ZXJ0ZXhD
b2xvcnMucHVzaCggbmV3IENvbG9yKCBoZXggKSApOworCQkJCQkJCQlpZiAoIGkgIT09IDAgKSBm
YWNlQi52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBoZXggKSApOworCisJCQkJCQkJfQor
CisJCQkJCQl9CisKKwkJCQkJCWdlb21ldHJ5LmZhY2VzLnB1c2goIGZhY2VBICk7CisJCQkJCQln
ZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlQiApOworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWZh
Y2UgPSBuZXcgRmFjZTMoKTsKKwkJCQkJCWZhY2UuYSA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKwkJ
CQkJCWZhY2UuYiA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKwkJCQkJCWZhY2UuYyA9IGZhY2VzWyBv
ZmZzZXQgKysgXTsKKworCQkJCQkJaWYgKCBoYXNNYXRlcmlhbCApIHsKKworCQkJCQkJCW1hdGVy
aWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07CisJCQkJCQkJZmFjZS5tYXRlcmlhbEluZGV4
ID0gbWF0ZXJpYWxJbmRleDsKKworCQkJCQkJfQorCisJCQkJCQkvLyB0byBnZXQgZmFjZSA8PT4g
dXYgaW5kZXggY29ycmVzcG9uZGVuY2UKKworCQkJCQkJZmkgPSBnZW9tZXRyeS5mYWNlcy5sZW5n
dGg7CisKKwkJCQkJCWlmICggaGFzRmFjZVZlcnRleFV2ICkgeworCisJCQkJCQkJZm9yICggaSA9
IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7CisKKwkJCQkJCQkJdXZMYXllciA9IGpzb24udXZz
WyBpIF07CisKKwkJCQkJCQkJZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdID0gW107
CisKKwkJCQkJCQkJZm9yICggaiA9IDA7IGogPCAzOyBqICsrICkgeworCisJCQkJCQkJCQl1dklu
ZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdOworCisJCQkJCQkJCQl1ID0gdXZMYXllclsgdXZJbmRl
eCAqIDIgXTsKKwkJCQkJCQkJCXYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTsKKworCQkJ
CQkJCQkJdXYgPSBuZXcgVmVjdG9yMiggdSwgdiApOworCisJCQkJCQkJCQlnZW9tZXRyeS5mYWNl
VmVydGV4VXZzWyBpIF1bIGZpIF0ucHVzaCggdXYgKTsKKworCQkJCQkJCQl9CisKKwkJCQkJCQl9
CisKKwkJCQkJCX0KKworCQkJCQkJaWYgKCBoYXNGYWNlTm9ybWFsICkgeworCisJCQkJCQkJbm9y
bWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzOworCisJCQkJCQkJZmFjZS5ub3JtYWwu
c2V0KAorCQkJCQkJCQlub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLAorCQkJCQkJCQlub3JtYWxz
WyBub3JtYWxJbmRleCArKyBdLAorCQkJCQkJCQlub3JtYWxzWyBub3JtYWxJbmRleCBdCisJCQkJ
CQkJKTsKKworCQkJCQkJfQorCisJCQkJCQlpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7CisK
KwkJCQkJCQlmb3IgKCBpID0gMDsgaSA8IDM7IGkgKysgKSB7CisKKwkJCQkJCQkJbm9ybWFsSW5k
ZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzOworCisJCQkJCQkJCW5vcm1hbCA9IG5ldyBWZWN0
b3IzKAorCQkJCQkJCQkJbm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSwKKwkJCQkJCQkJCW5vcm1h
bHNbIG5vcm1hbEluZGV4ICsrIF0sCisJCQkJCQkJCQlub3JtYWxzWyBub3JtYWxJbmRleCBdCisJ
CQkJCQkJCSk7CisKKwkJCQkJCQkJZmFjZS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApOwor
CisJCQkJCQkJfQorCisJCQkJCQl9CisKKworCQkJCQkJaWYgKCBoYXNGYWNlQ29sb3IgKSB7CisK
KwkJCQkJCQljb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdOworCQkJCQkJCWZhY2UuY29s
b3Iuc2V0SGV4KCBjb2xvcnNbIGNvbG9ySW5kZXggXSApOworCisJCQkJCQl9CisKKworCQkJCQkJ
aWYgKCBoYXNGYWNlVmVydGV4Q29sb3IgKSB7CisKKwkJCQkJCQlmb3IgKCBpID0gMDsgaSA8IDM7
IGkgKysgKSB7CisKKwkJCQkJCQkJY29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKwkJ
CQkJCQkJZmFjZS52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBjb2xvcnNbIGNvbG9ySW5k
ZXggXSApICk7CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQkJZ2VvbWV0cnkuZmFjZXMu
cHVzaCggZmFjZSApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQlmdW5jdGlvbiBw
YXJzZVNraW4oIGpzb24sIGdlb21ldHJ5ICkgeworCisJCQkJdmFyIGluZmx1ZW5jZXNQZXJWZXJ0
ZXggPSAoIGpzb24uaW5mbHVlbmNlc1BlclZlcnRleCAhPT0gdW5kZWZpbmVkICkgPyBqc29uLmlu
Zmx1ZW5jZXNQZXJWZXJ0ZXggOiAyOworCisJCQkJaWYgKCBqc29uLnNraW5XZWlnaHRzICkgewor
CisJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uc2tpbldlaWdodHMubGVuZ3RoOyBpIDwg
bDsgaSArPSBpbmZsdWVuY2VzUGVyVmVydGV4ICkgeworCisJCQkJCQl2YXIgeCA9IGpzb24uc2tp
bldlaWdodHNbIGkgXTsKKwkJCQkJCXZhciB5ID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMSAp
ID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDEgXSA6IDA7CisJCQkJCQl2YXIgeiA9ICggaW5mbHVl
bmNlc1BlclZlcnRleCA+IDIgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAyIF0gOiAwOworCQkJ
CQkJdmFyIHcgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBqc29uLnNraW5XZWlnaHRz
WyBpICsgMyBdIDogMDsKKworCQkJCQkJZ2VvbWV0cnkuc2tpbldlaWdodHMucHVzaCggbmV3IFZl
Y3RvcjQoIHgsIHksIHosIHcgKSApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJCWlmICgganNv
bi5za2luSW5kaWNlcyApIHsKKworCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnNraW5J
bmRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKz0gaW5mbHVlbmNlc1BlclZlcnRleCApIHsKKworCQkJ
CQkJdmFyIGEgPSBqc29uLnNraW5JbmRpY2VzWyBpIF07CisJCQkJCQl2YXIgYiA9ICggaW5mbHVl
bmNlc1BlclZlcnRleCA+IDEgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAxIF0gOiAwOworCQkJ
CQkJdmFyIGMgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAyICkgPyBqc29uLnNraW5JbmRpY2Vz
WyBpICsgMiBdIDogMDsKKwkJCQkJCXZhciBkID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMyAp
ID8ganNvbi5za2luSW5kaWNlc1sgaSArIDMgXSA6IDA7CisKKwkJCQkJCWdlb21ldHJ5LnNraW5J
bmRpY2VzLnB1c2goIG5ldyBWZWN0b3I0KCBhLCBiLCBjLCBkICkgKTsKKworCQkJCQl9CisKKwkJ
CQl9CisKKwkJCQlnZW9tZXRyeS5ib25lcyA9IGpzb24uYm9uZXM7CisKKwkJCQlpZiAoIGdlb21l
dHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgJiYgKCBnZW9tZXRyeS5za2lu
V2VpZ2h0cy5sZW5ndGggIT09IGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCB8fCBnZW9tZXRy
eS5za2luSW5kaWNlcy5sZW5ndGggIT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApICkgewor
CisJCQkJCWNvbnNvbGUud2FybiggJ1doZW4gc2tpbm5pbmcsIG51bWJlciBvZiB2ZXJ0aWNlcyAo
JyArIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCArICcpLCBza2luSW5kaWNlcyAoJyArCisJCQkJ
CQlnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggKyAnKSwgYW5kIHNraW5XZWlnaHRzICgnICsg
Z2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICsgJykgc2hvdWxkIG1hdGNoLicgKTsKKworCQkJ
CX0KKworCQkJfQorCisJCQlmdW5jdGlvbiBwYXJzZU1vcnBoaW5nKCBqc29uLCBnZW9tZXRyeSAp
IHsKKworCQkJCXZhciBzY2FsZSA9IGpzb24uc2NhbGU7CisKKwkJCQlpZiAoIGpzb24ubW9ycGhU
YXJnZXRzICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0ganNv
bi5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCQkJZ2VvbWV0cnku
bW9ycGhUYXJnZXRzWyBpIF0gPSB7fTsKKwkJCQkJCWdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBd
Lm5hbWUgPSBqc29uLm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWU7CisJCQkJCQlnZW9tZXRyeS5tb3Jw
aFRhcmdldHNbIGkgXS52ZXJ0aWNlcyA9IFtdOworCisJCQkJCQl2YXIgZHN0VmVydGljZXMgPSBn
ZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlczsKKwkJCQkJCXZhciBzcmNWZXJ0aWNl
cyA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7CisKKwkJCQkJCWZvciAoIHZhciB2
ID0gMCwgdmwgPSBzcmNWZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArPSAzICkgeworCisJCQkJ
CQkJdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CisJCQkJCQkJdmVydGV4LnggPSBzcmNWZXJ0
aWNlc1sgdiBdICogc2NhbGU7CisJCQkJCQkJdmVydGV4LnkgPSBzcmNWZXJ0aWNlc1sgdiArIDEg
XSAqIHNjYWxlOworCQkJCQkJCXZlcnRleC56ID0gc3JjVmVydGljZXNbIHYgKyAyIF0gKiBzY2Fs
ZTsKKworCQkJCQkJCWRzdFZlcnRpY2VzLnB1c2goIHZlcnRleCApOworCisJCQkJCQl9CisKKwkJ
CQkJfQorCisJCQkJfQorCisJCQkJaWYgKCBqc29uLm1vcnBoQ29sb3JzICE9PSB1bmRlZmluZWQg
JiYganNvbi5tb3JwaENvbG9ycy5sZW5ndGggPiAwICkgeworCisJCQkJCWNvbnNvbGUud2Fybigg
J1RIUkVFLkpTT05Mb2FkZXI6ICJtb3JwaENvbG9ycyIgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNp
bmcgdGhlbSBhcyBmYWNlIGNvbG9ycy4nICk7CisKKwkJCQkJdmFyIGZhY2VzID0gZ2VvbWV0cnku
ZmFjZXM7CisJCQkJCXZhciBtb3JwaENvbG9ycyA9IGpzb24ubW9ycGhDb2xvcnNbIDAgXS5jb2xv
cnM7CisKKwkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSAr
KyApIHsKKworCQkJCQkJZmFjZXNbIGkgXS5jb2xvci5mcm9tQXJyYXkoIG1vcnBoQ29sb3JzLCBp
ICogMyApOworCisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQlmdW5jdGlvbiBwYXJzZUFu
aW1hdGlvbnMoIGpzb24sIGdlb21ldHJ5ICkgeworCisJCQkJdmFyIG91dHB1dEFuaW1hdGlvbnMg
PSBbXTsKKworCQkJCS8vIHBhcnNlIG9sZCBzdHlsZSBCb25lL0hpZXJhcmNoeSBhbmltYXRpb25z
CisJCQkJdmFyIGFuaW1hdGlvbnMgPSBbXTsKKworCQkJCWlmICgganNvbi5hbmltYXRpb24gIT09
IHVuZGVmaW5lZCApIHsKKworCQkJCQlhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9uICk7
CisKKwkJCQl9CisKKwkJCQlpZiAoIGpzb24uYW5pbWF0aW9ucyAhPT0gdW5kZWZpbmVkICkgewor
CisJCQkJCWlmICgganNvbi5hbmltYXRpb25zLmxlbmd0aCApIHsKKworCQkJCQkJYW5pbWF0aW9u
cyA9IGFuaW1hdGlvbnMuY29uY2F0KCBqc29uLmFuaW1hdGlvbnMgKTsKKworCQkJCQl9IGVsc2Ug
eworCisJCQkJCQlhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9ucyApOworCisJCQkJCX0K
KworCQkJCX0KKworCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGFuaW1hdGlvbnMubGVuZ3RoOyBp
ICsrICkgeworCisJCQkJCXZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZUFuaW1hdGlvbigg
YW5pbWF0aW9uc1sgaSBdLCBnZW9tZXRyeS5ib25lcyApOworCQkJCQlpZiAoIGNsaXAgKSBvdXRw
dXRBbmltYXRpb25zLnB1c2goIGNsaXAgKTsKKworCQkJCX0KKworCQkJCS8vIHBhcnNlIGltcGxp
Y2l0IG1vcnBoIGFuaW1hdGlvbnMKKwkJCQlpZiAoIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHsK
KworCQkJCQkvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgYW4gYXBwcm9wcmFpdGUgRlBTIGlzIGZv
ciBtb3JwaCB0YXJnZXQgYW5pbWF0aW9ucyAtLSBkZWZhdWx0aW5nIHRvIDEwLCBidXQgcmVhbGx5
IGl0IGlzIGNvbXBsZXRlbHkgYXJiaXRyYXJ5LgorCQkJCQl2YXIgbW9ycGhBbmltYXRpb25DbGlw
cyA9IEFuaW1hdGlvbkNsaXAuQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXMoIGdl
b21ldHJ5Lm1vcnBoVGFyZ2V0cywgMTAgKTsKKwkJCQkJb3V0cHV0QW5pbWF0aW9ucyA9IG91dHB1
dEFuaW1hdGlvbnMuY29uY2F0KCBtb3JwaEFuaW1hdGlvbkNsaXBzICk7CisKKwkJCQl9CisKKwkJ
CQlpZiAoIG91dHB1dEFuaW1hdGlvbnMubGVuZ3RoID4gMCApIGdlb21ldHJ5LmFuaW1hdGlvbnMg
PSBvdXRwdXRBbmltYXRpb25zOworCisJCQl9CisKKwkJCXJldHVybiBmdW5jdGlvbiAoIGpzb24s
IHRleHR1cmVQYXRoICkgeworCisJCQkJaWYgKCBqc29uLmRhdGEgIT09IHVuZGVmaW5lZCApIHsK
KworCQkJCQkvLyBHZW9tZXRyeSA0LjAgc3BlYworCQkJCQlqc29uID0ganNvbi5kYXRhOworCisJ
CQkJfQorCisJCQkJaWYgKCBqc29uLnNjYWxlICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJanNv
bi5zY2FsZSA9IDEuMCAvIGpzb24uc2NhbGU7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCWpzb24u
c2NhbGUgPSAxLjA7CisKKwkJCQl9CisKKwkJCQl2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnko
KTsKKworCQkJCXBhcnNlTW9kZWwoIGpzb24sIGdlb21ldHJ5ICk7CisJCQkJcGFyc2VTa2luKCBq
c29uLCBnZW9tZXRyeSApOworCQkJCXBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICk7CisJ
CQkJcGFyc2VBbmltYXRpb25zKCBqc29uLCBnZW9tZXRyeSApOworCisJCQkJZ2VvbWV0cnkuY29t
cHV0ZUZhY2VOb3JtYWxzKCk7CisJCQkJZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7
CisKKwkJCQlpZiAoIGpzb24ubWF0ZXJpYWxzID09PSB1bmRlZmluZWQgfHwganNvbi5tYXRlcmlh
bHMubGVuZ3RoID09PSAwICkgeworCisJCQkJCXJldHVybiB7IGdlb21ldHJ5OiBnZW9tZXRyeSB9
OworCisJCQkJfSBlbHNlIHsKKworCQkJCQl2YXIgbWF0ZXJpYWxzID0gTG9hZGVyLnByb3RvdHlw
ZS5pbml0TWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZVBhdGgsIHRoaXMuY3Jvc3NP
cmlnaW4gKTsKKworCQkJCQlyZXR1cm4geyBnZW9tZXRyeTogZ2VvbWV0cnksIG1hdGVyaWFsczog
bWF0ZXJpYWxzIH07CisKKwkJCQl9CisKKwkJCX07CisKKwkJfSApKCkKKworCX0gKTsKKworCS8q
KgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5j
dGlvbiBPYmplY3RMb2FkZXIoIG1hbmFnZXIgKSB7CisKKwkJdGhpcy5tYW5hZ2VyID0gKCBtYW5h
Z2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CisJ
CXRoaXMudGV4dHVyZVBhdGggPSAnJzsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIE9iamVjdExv
YWRlci5wcm90b3R5cGUsIHsKKworCQlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblBy
b2dyZXNzLCBvbkVycm9yICkgeworCisJCQlpZiAoIHRoaXMudGV4dHVyZVBhdGggPT09ICcnICkg
eworCisJCQkJdGhpcy50ZXh0dXJlUGF0aCA9IHVybC5zdWJzdHJpbmcoIDAsIHVybC5sYXN0SW5k
ZXhPZiggJy8nICkgKyAxICk7CisKKwkJCX0KKworCQkJdmFyIHNjb3BlID0gdGhpczsKKworCQkJ
dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7CisJCQlsb2FkZXIu
bG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7CisKKwkJCQl2YXIganNvbiA9IG51bGw7CisK
KwkJCQl0cnkgeworCisJCQkJCWpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7CisKKwkJCQl9IGNh
dGNoICggZXJyb3IgKSB7CisKKwkJCQkJaWYgKCBvbkVycm9yICE9PSB1bmRlZmluZWQgKSBvbkVy
cm9yKCBlcnJvciApOworCisJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRTpPYmplY3RMb2FkZXI6
IENhblwndCBwYXJzZSAnICsgdXJsICsgJy4nLCBlcnJvci5tZXNzYWdlICk7CisKKwkJCQkJcmV0
dXJuOworCisJCQkJfQorCisJCQkJdmFyIG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTsKKworCQkJ
CWlmICggbWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlID09PSB1bmRlZmlu
ZWQgfHwgbWV0YWRhdGEudHlwZS50b0xvd2VyQ2FzZSgpID09PSAnZ2VvbWV0cnknICkgeworCisJ
CQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3RMb2FkZXI6IENhblwndCBsb2FkICcgKyB1
cmwgKyAnLiBVc2UgVEhSRUUuSlNPTkxvYWRlciBpbnN0ZWFkLicgKTsKKwkJCQkJcmV0dXJuOwor
CisJCQkJfQorCisJCQkJc2NvcGUucGFyc2UoIGpzb24sIG9uTG9hZCApOworCisJCQl9LCBvblBy
b2dyZXNzLCBvbkVycm9yICk7CisKKwkJfSwKKworCQlzZXRUZXh0dXJlUGF0aDogZnVuY3Rpb24g
KCB2YWx1ZSApIHsKKworCQkJdGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlOworCisJCX0sCisKKwkJ
c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCXRoaXMuY3Jvc3NPcmln
aW4gPSB2YWx1ZTsKKworCQl9LAorCisJCXBhcnNlOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9hZCAp
IHsKKworCQkJdmFyIGdlb21ldHJpZXMgPSB0aGlzLnBhcnNlR2VvbWV0cmllcygganNvbi5nZW9t
ZXRyaWVzICk7CisKKwkJCXZhciBpbWFnZXMgPSB0aGlzLnBhcnNlSW1hZ2VzKCBqc29uLmltYWdl
cywgZnVuY3Rpb24gKCkgeworCisJCQkJaWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9h
ZCggb2JqZWN0ICk7CisKKwkJCX0gKTsKKworCQkJdmFyIHRleHR1cmVzID0gdGhpcy5wYXJzZVRl
eHR1cmVzKCBqc29uLnRleHR1cmVzLCBpbWFnZXMgKTsKKwkJCXZhciBtYXRlcmlhbHMgPSB0aGlz
LnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTsKKworCQkJdmFyIG9i
amVjdCA9IHRoaXMucGFyc2VPYmplY3QoIGpzb24ub2JqZWN0LCBnZW9tZXRyaWVzLCBtYXRlcmlh
bHMgKTsKKworCQkJaWYgKCBqc29uLmFuaW1hdGlvbnMgKSB7CisKKwkJCQlvYmplY3QuYW5pbWF0
aW9ucyA9IHRoaXMucGFyc2VBbmltYXRpb25zKCBqc29uLmFuaW1hdGlvbnMgKTsKKworCQkJfQor
CisJCQlpZiAoIGpzb24uaW1hZ2VzID09PSB1bmRlZmluZWQgfHwganNvbi5pbWFnZXMubGVuZ3Ro
ID09PSAwICkgeworCisJCQkJaWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2Jq
ZWN0ICk7CisKKwkJCX0KKworCQkJcmV0dXJuIG9iamVjdDsKKworCQl9LAorCisJCXBhcnNlR2Vv
bWV0cmllczogZnVuY3Rpb24gKCBqc29uICkgeworCisJCQl2YXIgZ2VvbWV0cmllcyA9IHt9Owor
CisJCQlpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHsKKworCQkJCXZhciBnZW9tZXRyeUxvYWRl
ciA9IG5ldyBKU09OTG9hZGVyKCk7CisJCQkJdmFyIGJ1ZmZlckdlb21ldHJ5TG9hZGVyID0gbmV3
IEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29u
Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJdmFyIGdlb21ldHJ5OworCQkJCQl2YXIg
ZGF0YSA9IGpzb25bIGkgXTsKKworCQkJCQlzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7CisKKwkJCQkJ
CWNhc2UgJ1BsYW5lR2VvbWV0cnknOgorCQkJCQkJY2FzZSAnUGxhbmVCdWZmZXJHZW9tZXRyeSc6
CisKKwkJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKKwkJCQkJ
CQkJZGF0YS53aWR0aCwKKwkJCQkJCQkJZGF0YS5oZWlnaHQsCisJCQkJCQkJCWRhdGEud2lkdGhT
ZWdtZW50cywKKwkJCQkJCQkJZGF0YS5oZWlnaHRTZWdtZW50cworCQkJCQkJCSk7CisKKwkJCQkJ
CQlicmVhazsKKworCQkJCQkJY2FzZSAnQm94R2VvbWV0cnknOgorCQkJCQkJY2FzZSAnQm94QnVm
ZmVyR2VvbWV0cnknOgorCQkJCQkJY2FzZSAnQ3ViZUdlb21ldHJ5JzogLy8gYmFja3dhcmRzIGNv
bXBhdGlibGUKKworCQkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBd
KAorCQkJCQkJCQlkYXRhLndpZHRoLAorCQkJCQkJCQlkYXRhLmhlaWdodCwKKwkJCQkJCQkJZGF0
YS5kZXB0aCwKKwkJCQkJCQkJZGF0YS53aWR0aFNlZ21lbnRzLAorCQkJCQkJCQlkYXRhLmhlaWdo
dFNlZ21lbnRzLAorCQkJCQkJCQlkYXRhLmRlcHRoU2VnbWVudHMKKwkJCQkJCQkpOworCisJCQkJ
CQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgJ0NpcmNsZUdlb21ldHJ5JzoKKwkJCQkJCWNhc2UgJ0Np
cmNsZUJ1ZmZlckdlb21ldHJ5JzoKKworCQkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNb
IGRhdGEudHlwZSBdKAorCQkJCQkJCQlkYXRhLnJhZGl1cywKKwkJCQkJCQkJZGF0YS5zZWdtZW50
cywKKwkJCQkJCQkJZGF0YS50aGV0YVN0YXJ0LAorCQkJCQkJCQlkYXRhLnRoZXRhTGVuZ3RoCisJ
CQkJCQkJKTsKKworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlICdDeWxpbmRlckdlb21ldHJ5
JzoKKwkJCQkJCWNhc2UgJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknOgorCisJCQkJCQkJZ2VvbWV0
cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCisJCQkJCQkJCWRhdGEucmFkaXVzVG9w
LAorCQkJCQkJCQlkYXRhLnJhZGl1c0JvdHRvbSwKKwkJCQkJCQkJZGF0YS5oZWlnaHQsCisJCQkJ
CQkJCWRhdGEucmFkaWFsU2VnbWVudHMsCisJCQkJCQkJCWRhdGEuaGVpZ2h0U2VnbWVudHMsCisJ
CQkJCQkJCWRhdGEub3BlbkVuZGVkLAorCQkJCQkJCQlkYXRhLnRoZXRhU3RhcnQsCisJCQkJCQkJ
CWRhdGEudGhldGFMZW5ndGgKKwkJCQkJCQkpOworCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNh
c2UgJ0NvbmVHZW9tZXRyeSc6CisJCQkJCQljYXNlICdDb25lQnVmZmVyR2VvbWV0cnknOgorCisJ
CQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCisJCQkJCQkJCWRh
dGEucmFkaXVzLAorCQkJCQkJCQlkYXRhLmhlaWdodCwKKwkJCQkJCQkJZGF0YS5yYWRpYWxTZWdt
ZW50cywKKwkJCQkJCQkJZGF0YS5oZWlnaHRTZWdtZW50cywKKwkJCQkJCQkJZGF0YS5vcGVuRW5k
ZWQsCisJCQkJCQkJCWRhdGEudGhldGFTdGFydCwKKwkJCQkJCQkJZGF0YS50aGV0YUxlbmd0aAor
CQkJCQkJCSk7CisKKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAnU3BoZXJlR2VvbWV0cnkn
OgorCQkJCQkJY2FzZSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknOgorCisJCQkJCQkJZ2VvbWV0cnkg
PSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCisJCQkJCQkJCWRhdGEucmFkaXVzLAorCQkJ
CQkJCQlkYXRhLndpZHRoU2VnbWVudHMsCisJCQkJCQkJCWRhdGEuaGVpZ2h0U2VnbWVudHMsCisJ
CQkJCQkJCWRhdGEucGhpU3RhcnQsCisJCQkJCQkJCWRhdGEucGhpTGVuZ3RoLAorCQkJCQkJCQlk
YXRhLnRoZXRhU3RhcnQsCisJCQkJCQkJCWRhdGEudGhldGFMZW5ndGgKKwkJCQkJCQkpOworCisJ
CQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgJ0RvZGVjYWhlZHJvbkdlb21ldHJ5JzoKKwkJCQkJ
CWNhc2UgJ0ljb3NhaGVkcm9uR2VvbWV0cnknOgorCQkJCQkJY2FzZSAnT2N0YWhlZHJvbkdlb21l
dHJ5JzoKKwkJCQkJCWNhc2UgJ1RldHJhaGVkcm9uR2VvbWV0cnknOgorCisJCQkJCQkJZ2VvbWV0
cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCisJCQkJCQkJCWRhdGEucmFkaXVzLAor
CQkJCQkJCQlkYXRhLmRldGFpbAorCQkJCQkJCSk7CisKKwkJCQkJCQlicmVhazsKKworCQkJCQkJ
Y2FzZSAnUmluZ0dlb21ldHJ5JzoKKwkJCQkJCWNhc2UgJ1JpbmdCdWZmZXJHZW9tZXRyeSc6CisK
KwkJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKKwkJCQkJCQkJ
ZGF0YS5pbm5lclJhZGl1cywKKwkJCQkJCQkJZGF0YS5vdXRlclJhZGl1cywKKwkJCQkJCQkJZGF0
YS50aGV0YVNlZ21lbnRzLAorCQkJCQkJCQlkYXRhLnBoaVNlZ21lbnRzLAorCQkJCQkJCQlkYXRh
LnRoZXRhU3RhcnQsCisJCQkJCQkJCWRhdGEudGhldGFMZW5ndGgKKwkJCQkJCQkpOworCisJCQkJ
CQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgJ1RvcnVzR2VvbWV0cnknOgorCQkJCQkJY2FzZSAnVG9y
dXNCdWZmZXJHZW9tZXRyeSc6CisKKwkJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBk
YXRhLnR5cGUgXSgKKwkJCQkJCQkJZGF0YS5yYWRpdXMsCisJCQkJCQkJCWRhdGEudHViZSwKKwkJ
CQkJCQkJZGF0YS5yYWRpYWxTZWdtZW50cywKKwkJCQkJCQkJZGF0YS50dWJ1bGFyU2VnbWVudHMs
CisJCQkJCQkJCWRhdGEuYXJjCisJCQkJCQkJKTsKKworCQkJCQkJCWJyZWFrOworCisJCQkJCQlj
YXNlICdUb3J1c0tub3RHZW9tZXRyeSc6CisJCQkJCQljYXNlICdUb3J1c0tub3RCdWZmZXJHZW9t
ZXRyeSc6CisKKwkJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgK
KwkJCQkJCQkJZGF0YS5yYWRpdXMsCisJCQkJCQkJCWRhdGEudHViZSwKKwkJCQkJCQkJZGF0YS50
dWJ1bGFyU2VnbWVudHMsCisJCQkJCQkJCWRhdGEucmFkaWFsU2VnbWVudHMsCisJCQkJCQkJCWRh
dGEucCwKKwkJCQkJCQkJZGF0YS5xCisJCQkJCQkJKTsKKworCQkJCQkJCWJyZWFrOworCisJCQkJ
CQljYXNlICdMYXRoZUdlb21ldHJ5JzoKKwkJCQkJCWNhc2UgJ0xhdGhlQnVmZmVyR2VvbWV0cnkn
OgorCisJCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCisJCQkJ
CQkJCWRhdGEucG9pbnRzLAorCQkJCQkJCQlkYXRhLnNlZ21lbnRzLAorCQkJCQkJCQlkYXRhLnBo
aVN0YXJ0LAorCQkJCQkJCQlkYXRhLnBoaUxlbmd0aAorCQkJCQkJCSk7CisKKwkJCQkJCQlicmVh
azsKKworCQkJCQkJY2FzZSAnQnVmZmVyR2VvbWV0cnknOgorCisJCQkJCQkJZ2VvbWV0cnkgPSBi
dWZmZXJHZW9tZXRyeUxvYWRlci5wYXJzZSggZGF0YSApOworCisJCQkJCQkJYnJlYWs7CisKKwkJ
CQkJCWNhc2UgJ0dlb21ldHJ5JzoKKworCQkJCQkJCWdlb21ldHJ5ID0gZ2VvbWV0cnlMb2FkZXIu
cGFyc2UoIGRhdGEsIHRoaXMudGV4dHVyZVBhdGggKS5nZW9tZXRyeTsKKworCQkJCQkJCWJyZWFr
OworCisJCQkJCQlkZWZhdWx0OgorCisJCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0
TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlICInICsgZGF0YS50eXBlICsgJyInICk7
CisKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQl9CisKKwkJCQkJZ2VvbWV0cnkudXVpZCA9IGRh
dGEudXVpZDsKKworCQkJCQlpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnku
bmFtZSA9IGRhdGEubmFtZTsKKworCQkJCQlnZW9tZXRyaWVzWyBkYXRhLnV1aWQgXSA9IGdlb21l
dHJ5OworCisJCQkJfQorCisJCQl9CisKKwkJCXJldHVybiBnZW9tZXRyaWVzOworCisJCX0sCisK
KwkJcGFyc2VNYXRlcmlhbHM6IGZ1bmN0aW9uICgganNvbiwgdGV4dHVyZXMgKSB7CisKKwkJCXZh
ciBtYXRlcmlhbHMgPSB7fTsKKworCQkJaWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7CisKKwkJ
CQl2YXIgbG9hZGVyID0gbmV3IE1hdGVyaWFsTG9hZGVyKCk7CisJCQkJbG9hZGVyLnNldFRleHR1
cmVzKCB0ZXh0dXJlcyApOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7
IGkgPCBsOyBpICsrICkgeworCisJCQkJCXZhciBkYXRhID0ganNvblsgaSBdOworCisJCQkJCWlm
ICggZGF0YS50eXBlID09PSAnTXVsdGlNYXRlcmlhbCcgKSB7CisKKwkJCQkJCS8vIERlcHJlY2F0
ZWQKKworCQkJCQkJdmFyIGFycmF5ID0gW107CisKKwkJCQkJCWZvciAoIHZhciBqID0gMDsgaiA8
IGRhdGEubWF0ZXJpYWxzLmxlbmd0aDsgaiArKyApIHsKKworCQkJCQkJCWFycmF5LnB1c2goIGxv
YWRlci5wYXJzZSggZGF0YS5tYXRlcmlhbHNbIGogXSApICk7CisKKwkJCQkJCX0KKworCQkJCQkJ
bWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGFycmF5OworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJ
CW1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBsb2FkZXIucGFyc2UoIGRhdGEgKTsKKworCQkJCQl9
CisKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuIG1hdGVyaWFsczsKKworCQl9LAorCisJCXBh
cnNlQW5pbWF0aW9uczogZnVuY3Rpb24gKCBqc29uICkgeworCisJCQl2YXIgYW5pbWF0aW9ucyA9
IFtdOworCisJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBqc29uLmxlbmd0aDsgaSArKyApIHsKKwor
CQkJCXZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZSgganNvblsgaSBdICk7CisKKwkJCQlh
bmltYXRpb25zLnB1c2goIGNsaXAgKTsKKworCQkJfQorCisJCQlyZXR1cm4gYW5pbWF0aW9uczsK
KworCQl9LAorCisJCXBhcnNlSW1hZ2VzOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9hZCApIHsKKwor
CQkJdmFyIHNjb3BlID0gdGhpczsKKwkJCXZhciBpbWFnZXMgPSB7fTsKKworCQkJZnVuY3Rpb24g
bG9hZEltYWdlKCB1cmwgKSB7CisKKwkJCQlzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7
CisKKwkJCQlyZXR1cm4gbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCkgeworCisJCQkJCXNj
b3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CisKKwkJCQl9LCB1bmRlZmluZWQsIGZ1bmN0aW9u
ICgpIHsKKworCQkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOworCQkJCQlzY29wZS5t
YW5hZ2VyLml0ZW1FcnJvciggdXJsICk7CisKKwkJCQl9ICk7CisKKwkJCX0KKworCQkJaWYgKCBq
c29uICE9PSB1bmRlZmluZWQgJiYganNvbi5sZW5ndGggPiAwICkgeworCisJCQkJdmFyIG1hbmFn
ZXIgPSBuZXcgTG9hZGluZ01hbmFnZXIoIG9uTG9hZCApOworCisJCQkJdmFyIGxvYWRlciA9IG5l
dyBJbWFnZUxvYWRlciggbWFuYWdlciApOworCQkJCWxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhp
cy5jcm9zc09yaWdpbiApOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7
IGkgPCBsOyBpICsrICkgeworCisJCQkJCXZhciBpbWFnZSA9IGpzb25bIGkgXTsKKwkJCQkJdmFy
IHBhdGggPSAvXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdCggaW1hZ2UudXJsICkgPyBp
bWFnZS51cmwgOiBzY29wZS50ZXh0dXJlUGF0aCArIGltYWdlLnVybDsKKworCQkJCQlpbWFnZXNb
IGltYWdlLnV1aWQgXSA9IGxvYWRJbWFnZSggcGF0aCApOworCisJCQkJfQorCisJCQl9CisKKwkJ
CXJldHVybiBpbWFnZXM7CisKKwkJfSwKKworCQlwYXJzZVRleHR1cmVzOiBmdW5jdGlvbiAoIGpz
b24sIGltYWdlcyApIHsKKworCQkJZnVuY3Rpb24gcGFyc2VDb25zdGFudCggdmFsdWUsIHR5cGUg
KSB7CisKKwkJCQlpZiAoIHR5cGVvZiggdmFsdWUgKSA9PT0gJ251bWJlcicgKSByZXR1cm4gdmFs
dWU7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJl
OiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLicsIHZhbHVlICk7CisKKwkJCQly
ZXR1cm4gdHlwZVsgdmFsdWUgXTsKKworCQkJfQorCisJCQl2YXIgdGV4dHVyZXMgPSB7fTsKKwor
CQkJaWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwg
PSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJdmFyIGRhdGEgPSBqc29uWyBp
IF07CisKKwkJCQkJaWYgKCBkYXRhLmltYWdlID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCWNv
bnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gImltYWdlIiBzcGVjaWZpZWQgZm9y
JywgZGF0YS51dWlkICk7CisKKwkJCQkJfQorCisJCQkJCWlmICggaW1hZ2VzWyBkYXRhLmltYWdl
IF0gPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0
TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UnLCBkYXRhLmltYWdlICk7CisKKwkJCQkJfQorCisJCQkJ
CXZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUoIGltYWdlc1sgZGF0YS5pbWFnZSBdICk7CisJCQkJ
CXRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOworCisJCQkJCXRleHR1cmUudXVpZCA9IGRhdGEu
dXVpZDsKKworCQkJCQlpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5uYW1l
ID0gZGF0YS5uYW1lOworCisJCQkJCWlmICggZGF0YS5tYXBwaW5nICE9PSB1bmRlZmluZWQgKSB0
ZXh0dXJlLm1hcHBpbmcgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hcHBpbmcsIFRFWFRVUkVfTUFQ
UElORyApOworCisJCQkJCWlmICggZGF0YS5vZmZzZXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUu
b2Zmc2V0LmZyb21BcnJheSggZGF0YS5vZmZzZXQgKTsKKwkJCQkJaWYgKCBkYXRhLnJlcGVhdCAh
PT0gdW5kZWZpbmVkICkgdGV4dHVyZS5yZXBlYXQuZnJvbUFycmF5KCBkYXRhLnJlcGVhdCApOwor
CQkJCQlpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCQl0ZXh0dXJlLndy
YXBTID0gcGFyc2VDb25zdGFudCggZGF0YS53cmFwWyAwIF0sIFRFWFRVUkVfV1JBUFBJTkcgKTsK
KwkJCQkJCXRleHR1cmUud3JhcFQgPSBwYXJzZUNvbnN0YW50KCBkYXRhLndyYXBbIDEgXSwgVEVY
VFVSRV9XUkFQUElORyApOworCisJCQkJCX0KKworCQkJCQlpZiAoIGRhdGEubWluRmlsdGVyICE9
PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1pbkZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWlu
RmlsdGVyLCBURVhUVVJFX0ZJTFRFUiApOworCQkJCQlpZiAoIGRhdGEubWFnRmlsdGVyICE9PSB1
bmRlZmluZWQgKSB0ZXh0dXJlLm1hZ0ZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFnRmls
dGVyLCBURVhUVVJFX0ZJTFRFUiApOworCQkJCQlpZiAoIGRhdGEuYW5pc290cm9weSAhPT0gdW5k
ZWZpbmVkICkgdGV4dHVyZS5hbmlzb3Ryb3B5ID0gZGF0YS5hbmlzb3Ryb3B5OworCisJCQkJCWlm
ICggZGF0YS5mbGlwWSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5mbGlwWSA9IGRhdGEuZmxpcFk7
CisKKwkJCQkJdGV4dHVyZXNbIGRhdGEudXVpZCBdID0gdGV4dHVyZTsKKworCQkJCX0KKworCQkJ
fQorCisJCQlyZXR1cm4gdGV4dHVyZXM7CisKKwkJfSwKKworCQlwYXJzZU9iamVjdDogZnVuY3Rp
b24gKCkgeworCisJCQl2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKKworCQkJcmV0dXJuIGZ1
bmN0aW9uIHBhcnNlT2JqZWN0KCBkYXRhLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKSB7CisKKwkJ
CQl2YXIgb2JqZWN0OworCisJCQkJZnVuY3Rpb24gZ2V0R2VvbWV0cnkoIG5hbWUgKSB7CisKKwkJ
CQkJaWYgKCBnZW9tZXRyaWVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJY29u
c29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnknLCBuYW1l
ICk7CisKKwkJCQkJfQorCisJCQkJCXJldHVybiBnZW9tZXRyaWVzWyBuYW1lIF07CisKKwkJCQl9
CisKKwkJCQlmdW5jdGlvbiBnZXRNYXRlcmlhbCggbmFtZSApIHsKKworCQkJCQlpZiAoIG5hbWUg
PT09IHVuZGVmaW5lZCApIHJldHVybiB1bmRlZmluZWQ7CisKKwkJCQkJaWYgKCBBcnJheS5pc0Fy
cmF5KCBuYW1lICkgKSB7CisKKwkJCQkJCXZhciBhcnJheSA9IFtdOworCisJCQkJCQlmb3IgKCB2
YXIgaSA9IDAsIGwgPSBuYW1lLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJCQl2YXIg
dXVpZCA9IG5hbWVbIGkgXTsKKworCQkJCQkJCWlmICggbWF0ZXJpYWxzWyB1dWlkIF0gPT09IHVu
ZGVmaW5lZCApIHsKKworCQkJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6
IFVuZGVmaW5lZCBtYXRlcmlhbCcsIHV1aWQgKTsKKworCQkJCQkJCX0KKworCQkJCQkJCWFycmF5
LnB1c2goIG1hdGVyaWFsc1sgdXVpZCBdICk7CisKKwkJCQkJCX0KKworCQkJCQkJcmV0dXJuIGFy
cmF5OworCisJCQkJCX0KKworCQkJCQlpZiAoIG1hdGVyaWFsc1sgbmFtZSBdID09PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZp
bmVkIG1hdGVyaWFsJywgbmFtZSApOworCisJCQkJCX0KKworCQkJCQlyZXR1cm4gbWF0ZXJpYWxz
WyBuYW1lIF07CisKKwkJCQl9CisKKwkJCQlzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7CisKKwkJCQkJ
Y2FzZSAnU2NlbmUnOgorCisJCQkJCQlvYmplY3QgPSBuZXcgU2NlbmUoKTsKKworCQkJCQkJaWYg
KCBkYXRhLmJhY2tncm91bmQgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJCWlmICggTnVtYmVy
LmlzSW50ZWdlciggZGF0YS5iYWNrZ3JvdW5kICkgKSB7CisKKwkJCQkJCQkJb2JqZWN0LmJhY2tn
cm91bmQgPSBuZXcgQ29sb3IoIGRhdGEuYmFja2dyb3VuZCApOworCisJCQkJCQkJfQorCisJCQkJ
CQl9CisKKwkJCQkJCWlmICggZGF0YS5mb2cgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQkJCWlm
ICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZycgKSB7CisKKwkJCQkJCQkJb2JqZWN0LmZvZyA9IG5l
dyBGb2coIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5uZWFyLCBkYXRhLmZvZy5mYXIgKTsKKwor
CQkJCQkJCX0gZWxzZSBpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2dFeHAyJyApIHsKKworCQkJ
CQkJCQlvYmplY3QuZm9nID0gbmV3IEZvZ0V4cDIoIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5k
ZW5zaXR5ICk7CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQkJYnJlYWs7CisKKwkJCQkJ
Y2FzZSAnUGVyc3BlY3RpdmVDYW1lcmEnOgorCisJCQkJCQlvYmplY3QgPSBuZXcgUGVyc3BlY3Rp
dmVDYW1lcmEoIGRhdGEuZm92LCBkYXRhLmFzcGVjdCwgZGF0YS5uZWFyLCBkYXRhLmZhciApOwor
CisJCQkJCQlpZiAoIGRhdGEuZm9jdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mb2N1cyA9IGRh
dGEuZm9jdXM7CisJCQkJCQlpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpv
b20gPSBkYXRhLnpvb207CisJCQkJCQlpZiAoIGRhdGEuZmlsbUdhdWdlICE9PSB1bmRlZmluZWQg
KSBvYmplY3QuZmlsbUdhdWdlID0gZGF0YS5maWxtR2F1Z2U7CisJCQkJCQlpZiAoIGRhdGEuZmls
bU9mZnNldCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1PZmZzZXQgPSBkYXRhLmZpbG1PZmZz
ZXQ7CisJCQkJCQlpZiAoIGRhdGEudmlldyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpZXcgPSBP
YmplY3QuYXNzaWduKCB7fSwgZGF0YS52aWV3ICk7CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWNh
c2UgJ09ydGhvZ3JhcGhpY0NhbWVyYSc6CisKKwkJCQkJCW9iamVjdCA9IG5ldyBPcnRob2dyYXBo
aWNDYW1lcmEoIGRhdGEubGVmdCwgZGF0YS5yaWdodCwgZGF0YS50b3AsIGRhdGEuYm90dG9tLCBk
YXRhLm5lYXIsIGRhdGEuZmFyICk7CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgJ0FtYmll
bnRMaWdodCc6CisKKwkJCQkJCW9iamVjdCA9IG5ldyBBbWJpZW50TGlnaHQoIGRhdGEuY29sb3Is
IGRhdGEuaW50ZW5zaXR5ICk7CisKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgJ0RpcmVjdGlv
bmFsTGlnaHQnOgorCisJCQkJCQlvYmplY3QgPSBuZXcgRGlyZWN0aW9uYWxMaWdodCggZGF0YS5j
b2xvciwgZGF0YS5pbnRlbnNpdHkgKTsKKworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAnUG9p
bnRMaWdodCc6CisKKwkJCQkJCW9iamVjdCA9IG5ldyBQb2ludExpZ2h0KCBkYXRhLmNvbG9yLCBk
YXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5kZWNheSApOworCisJCQkJCQlicmVh
azsKKworCQkJCQljYXNlICdSZWN0QXJlYUxpZ2h0JzoKKworCQkJCQkJb2JqZWN0ID0gbmV3IFJl
Y3RBcmVhTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLndpZHRoLCBkYXRh
LmhlaWdodCApOworCisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICdTcG90TGlnaHQnOgorCisJ
CQkJCQlvYmplY3QgPSBuZXcgU3BvdExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwg
ZGF0YS5kaXN0YW5jZSwgZGF0YS5hbmdsZSwgZGF0YS5wZW51bWJyYSwgZGF0YS5kZWNheSApOwor
CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICdIZW1pc3BoZXJlTGlnaHQnOgorCisJCQkJCQlv
YmplY3QgPSBuZXcgSGVtaXNwaGVyZUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmdyb3VuZENvbG9y
LCBkYXRhLmludGVuc2l0eSApOworCisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICdTa2lubmVk
TWVzaCc6CisKKwkJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZU9i
amVjdCgpIGRvZXMgbm90IHN1cHBvcnQgU2tpbm5lZE1lc2ggeWV0LicgKTsKKworCQkJCQljYXNl
ICdNZXNoJzoKKworCQkJCQkJdmFyIGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0
cnkgKTsKKwkJCQkJCXZhciBtYXRlcmlhbCA9IGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICk7
CisKKwkJCQkJCWlmICggZ2VvbWV0cnkuYm9uZXMgJiYgZ2VvbWV0cnkuYm9uZXMubGVuZ3RoID4g
MCApIHsKKworCQkJCQkJCW9iamVjdCA9IG5ldyBTa2lubmVkTWVzaCggZ2VvbWV0cnksIG1hdGVy
aWFsICk7CisKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQlvYmplY3QgPSBuZXcgTWVzaCggZ2Vv
bWV0cnksIG1hdGVyaWFsICk7CisKKwkJCQkJCX0KKworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2Fz
ZSAnTE9EJzoKKworCQkJCQkJb2JqZWN0ID0gbmV3IExPRCgpOworCisJCQkJCQlicmVhazsKKwor
CQkJCQljYXNlICdMaW5lJzoKKworCQkJCQkJb2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5
KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICksIGRhdGEubW9k
ZSApOworCisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICdMaW5lTG9vcCc6CisKKwkJCQkJCW9i
amVjdCA9IG5ldyBMaW5lTG9vcCggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0
ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApOworCisJCQkJCQlicmVhazsKKworCQkJCQljYXNlICdM
aW5lU2VnbWVudHMnOgorCisJCQkJCQlvYmplY3QgPSBuZXcgTGluZVNlZ21lbnRzKCBnZXRHZW9t
ZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7CisK
KwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgJ1BvaW50Q2xvdWQnOgorCQkJCQljYXNlICdQb2lu
dHMnOgorCisJCQkJCQlvYmplY3QgPSBuZXcgUG9pbnRzKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9t
ZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7CisKKwkJCQkJCWJyZWFrOwor
CisJCQkJCWNhc2UgJ1Nwcml0ZSc6CisKKwkJCQkJCW9iamVjdCA9IG5ldyBTcHJpdGUoIGdldE1h
dGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTsKKworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAn
R3JvdXAnOgorCisJCQkJCQlvYmplY3QgPSBuZXcgR3JvdXAoKTsKKworCQkJCQkJYnJlYWs7CisK
KwkJCQkJZGVmYXVsdDoKKworCQkJCQkJb2JqZWN0ID0gbmV3IE9iamVjdDNEKCk7CisKKwkJCQl9
CisKKwkJCQlvYmplY3QudXVpZCA9IGRhdGEudXVpZDsKKworCQkJCWlmICggZGF0YS5uYW1lICE9
PSB1bmRlZmluZWQgKSBvYmplY3QubmFtZSA9IGRhdGEubmFtZTsKKwkJCQlpZiAoIGRhdGEubWF0
cml4ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJbWF0cml4LmZyb21BcnJheSggZGF0YS5tYXRy
aXggKTsKKwkJCQkJbWF0cml4LmRlY29tcG9zZSggb2JqZWN0LnBvc2l0aW9uLCBvYmplY3QucXVh
dGVybmlvbiwgb2JqZWN0LnNjYWxlICk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCWlmICggZGF0
YS5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnBvc2l0aW9uLmZyb21BcnJheSggZGF0
YS5wb3NpdGlvbiApOworCQkJCQlpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG9i
amVjdC5yb3RhdGlvbi5mcm9tQXJyYXkoIGRhdGEucm90YXRpb24gKTsKKwkJCQkJaWYgKCBkYXRh
LnF1YXRlcm5pb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5xdWF0ZXJuaW9uLmZyb21BcnJheSgg
ZGF0YS5xdWF0ZXJuaW9uICk7CisJCQkJCWlmICggZGF0YS5zY2FsZSAhPT0gdW5kZWZpbmVkICkg
b2JqZWN0LnNjYWxlLmZyb21BcnJheSggZGF0YS5zY2FsZSApOworCisJCQkJfQorCisJCQkJaWYg
KCBkYXRhLmNhc3RTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5jYXN0U2hhZG93ID0gZGF0
YS5jYXN0U2hhZG93OworCQkJCWlmICggZGF0YS5yZWNlaXZlU2hhZG93ICE9PSB1bmRlZmluZWQg
KSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IGRhdGEucmVjZWl2ZVNoYWRvdzsKKworCQkJCWlmICgg
ZGF0YS5zaGFkb3cgKSB7CisKKwkJCQkJaWYgKCBkYXRhLnNoYWRvdy5iaWFzICE9PSB1bmRlZmlu
ZWQgKSBvYmplY3Quc2hhZG93LmJpYXMgPSBkYXRhLnNoYWRvdy5iaWFzOworCQkJCQlpZiAoIGRh
dGEuc2hhZG93LnJhZGl1cyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5yYWRpdXMgPSBk
YXRhLnNoYWRvdy5yYWRpdXM7CisJCQkJCWlmICggZGF0YS5zaGFkb3cubWFwU2l6ZSAhPT0gdW5k
ZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5tYXBTaXplLmZyb21BcnJheSggZGF0YS5zaGFkb3cubWFw
U2l6ZSApOworCQkJCQlpZiAoIGRhdGEuc2hhZG93LmNhbWVyYSAhPT0gdW5kZWZpbmVkICkgb2Jq
ZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KCBkYXRhLnNoYWRvdy5jYW1lcmEg
KTsKKworCQkJCX0KKworCQkJCWlmICggZGF0YS52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBvYmpl
Y3QudmlzaWJsZSA9IGRhdGEudmlzaWJsZTsKKwkJCQlpZiAoIGRhdGEudXNlckRhdGEgIT09IHVu
ZGVmaW5lZCApIG9iamVjdC51c2VyRGF0YSA9IGRhdGEudXNlckRhdGE7CisKKwkJCQlpZiAoIGRh
dGEuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQlmb3IgKCB2YXIgY2hpbGQgaW4g
ZGF0YS5jaGlsZHJlbiApIHsKKworCQkJCQkJb2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCgg
ZGF0YS5jaGlsZHJlblsgY2hpbGQgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkgKTsKKworCQkJ
CQl9CisKKwkJCQl9CisKKwkJCQlpZiAoIGRhdGEudHlwZSA9PT0gJ0xPRCcgKSB7CisKKwkJCQkJ
dmFyIGxldmVscyA9IGRhdGEubGV2ZWxzOworCisJCQkJCWZvciAoIHZhciBsID0gMDsgbCA8IGxl
dmVscy5sZW5ndGg7IGwgKysgKSB7CisKKwkJCQkJCXZhciBsZXZlbCA9IGxldmVsc1sgbCBdOwor
CQkJCQkJdmFyIGNoaWxkID0gb2JqZWN0LmdldE9iamVjdEJ5UHJvcGVydHkoICd1dWlkJywgbGV2
ZWwub2JqZWN0ICk7CisKKwkJCQkJCWlmICggY2hpbGQgIT09IHVuZGVmaW5lZCApIHsKKworCQkJ
CQkJCW9iamVjdC5hZGRMZXZlbCggY2hpbGQsIGxldmVsLmRpc3RhbmNlICk7CisKKwkJCQkJCX0K
KworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlyZXR1cm4gb2JqZWN0OworCisJCQl9OworCisJCX0o
KQorCisJfSApOworCisJdmFyIFRFWFRVUkVfTUFQUElORyA9IHsKKwkJVVZNYXBwaW5nOiBVVk1h
cHBpbmcsCisJCUN1YmVSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLAor
CQlDdWJlUmVmcmFjdGlvbk1hcHBpbmc6IEN1YmVSZWZyYWN0aW9uTWFwcGluZywKKwkJRXF1aXJl
Y3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBw
aW5nLAorCQlFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFy
UmVmcmFjdGlvbk1hcHBpbmcsCisJCVNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nOiBTcGhlcmlj
YWxSZWZsZWN0aW9uTWFwcGluZywKKwkJQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVVVlJl
ZmxlY3Rpb25NYXBwaW5nLAorCQlDdWJlVVZSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmcmFj
dGlvbk1hcHBpbmcKKwl9OworCisJdmFyIFRFWFRVUkVfV1JBUFBJTkcgPSB7CisJCVJlcGVhdFdy
YXBwaW5nOiBSZXBlYXRXcmFwcGluZywKKwkJQ2xhbXBUb0VkZ2VXcmFwcGluZzogQ2xhbXBUb0Vk
Z2VXcmFwcGluZywKKwkJTWlycm9yZWRSZXBlYXRXcmFwcGluZzogTWlycm9yZWRSZXBlYXRXcmFw
cGluZworCX07CisKKwl2YXIgVEVYVFVSRV9GSUxURVIgPSB7CisJCU5lYXJlc3RGaWx0ZXI6IE5l
YXJlc3RGaWx0ZXIsCisJCU5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyOiBOZWFyZXN0TWlwTWFw
TmVhcmVzdEZpbHRlciwKKwkJTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlcjogTmVhcmVzdE1pcE1h
cExpbmVhckZpbHRlciwKKwkJTGluZWFyRmlsdGVyOiBMaW5lYXJGaWx0ZXIsCisJCUxpbmVhck1p
cE1hcE5lYXJlc3RGaWx0ZXI6IExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIsCisJCUxpbmVhck1p
cE1hcExpbmVhckZpbHRlcjogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyCisJfTsKKworCS8qKgor
CSAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKKwkg
KgorCSAqIEJlemllciBDdXJ2ZXMgZm9ybXVsYXMgb2J0YWluZWQgZnJvbQorCSAqIGh0dHA6Ly9l
bi53aWtpcGVkaWEub3JnL3dpa2kvQsOpemllcl9jdXJ2ZQorCSAqLworCisJZnVuY3Rpb24gQ2F0
bXVsbFJvbSggdCwgcDAsIHAxLCBwMiwgcDMgKSB7CisKKwkJdmFyIHYwID0gKCBwMiAtIHAwICkg
KiAwLjU7CisJCXZhciB2MSA9ICggcDMgLSBwMSApICogMC41OworCQl2YXIgdDIgPSB0ICogdDsK
KwkJdmFyIHQzID0gdCAqIHQyOworCQlyZXR1cm4gKCAyICogcDEgLSAyICogcDIgKyB2MCArIHYx
ICkgKiB0MyArICggLSAzICogcDEgKyAzICogcDIgLSAyICogdjAgLSB2MSApICogdDIgKyB2MCAq
IHQgKyBwMTsKKworCX0KKworCS8vCisKKwlmdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMCggdCwg
cCApIHsKKworCQl2YXIgayA9IDEgLSB0OworCQlyZXR1cm4gayAqIGsgKiBwOworCisJfQorCisJ
ZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAgKSB7CisKKwkJcmV0dXJuIDIgKiAoIDEg
LSB0ICkgKiB0ICogcDsKKworCX0KKworCWZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAyKCB0LCBw
ICkgeworCisJCXJldHVybiB0ICogdCAqIHA7CisKKwl9CisKKwlmdW5jdGlvbiBRdWFkcmF0aWNC
ZXppZXIoIHQsIHAwLCBwMSwgcDIgKSB7CisKKwkJcmV0dXJuIFF1YWRyYXRpY0JlemllclAwKCB0
LCBwMCApICsgUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAxICkgKworCQkJUXVhZHJhdGljQmV6aWVy
UDIoIHQsIHAyICk7CisKKwl9CisKKwkvLworCisJZnVuY3Rpb24gQ3ViaWNCZXppZXJQMCggdCwg
cCApIHsKKworCQl2YXIgayA9IDEgLSB0OworCQlyZXR1cm4gayAqIGsgKiBrICogcDsKKworCX0K
KworCWZ1bmN0aW9uIEN1YmljQmV6aWVyUDEoIHQsIHAgKSB7CisKKwkJdmFyIGsgPSAxIC0gdDsK
KwkJcmV0dXJuIDMgKiBrICogayAqIHQgKiBwOworCisJfQorCisJZnVuY3Rpb24gQ3ViaWNCZXpp
ZXJQMiggdCwgcCApIHsKKworCQlyZXR1cm4gMyAqICggMSAtIHQgKSAqIHQgKiB0ICogcDsKKwor
CX0KKworCWZ1bmN0aW9uIEN1YmljQmV6aWVyUDMoIHQsIHAgKSB7CisKKwkJcmV0dXJuIHQgKiB0
ICogdCAqIHA7CisKKwl9CisKKwlmdW5jdGlvbiBDdWJpY0JlemllciggdCwgcDAsIHAxLCBwMiwg
cDMgKSB7CisKKwkJcmV0dXJuIEN1YmljQmV6aWVyUDAoIHQsIHAwICkgKyBDdWJpY0JlemllclAx
KCB0LCBwMSApICsgQ3ViaWNCZXppZXJQMiggdCwgcDIgKSArCisJCQlDdWJpY0JlemllclAzKCB0
LCBwMyApOworCisJfQorCisJLyoqCisJICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0
Z2FtZXMubmV0L3p6ODUvYmxvZworCSAqIEV4dGVuc2libGUgY3VydmUgb2JqZWN0CisJICoKKwkg
KiBTb21lIGNvbW1vbiBvZiBjdXJ2ZSBtZXRob2RzOgorCSAqIC5nZXRQb2ludCh0KSwgZ2V0VGFu
Z2VudCh0KQorCSAqIC5nZXRQb2ludEF0KHUpLCBnZXRUYW5nZW50QXQodSkKKwkgKiAuZ2V0UG9p
bnRzKCksIC5nZXRTcGFjZWRQb2ludHMoKQorCSAqIC5nZXRMZW5ndGgoKQorCSAqIC51cGRhdGVB
cmNMZW5ndGhzKCkKKwkgKgorCSAqIFRoaXMgZm9sbG93aW5nIGN1cnZlcyBpbmhlcml0IGZyb20g
VEhSRUUuQ3VydmU6CisJICoKKwkgKiAtLSAyRCBjdXJ2ZXMgLS0KKwkgKiBUSFJFRS5BcmNDdXJ2
ZQorCSAqIFRIUkVFLkN1YmljQmV6aWVyQ3VydmUKKwkgKiBUSFJFRS5FbGxpcHNlQ3VydmUKKwkg
KiBUSFJFRS5MaW5lQ3VydmUKKwkgKiBUSFJFRS5RdWFkcmF0aWNCZXppZXJDdXJ2ZQorCSAqIFRI
UkVFLlNwbGluZUN1cnZlCisJICoKKwkgKiAtLSAzRCBjdXJ2ZXMgLS0KKwkgKiBUSFJFRS5DYXRt
dWxsUm9tQ3VydmUzCisJICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZTMKKwkgKiBUSFJFRS5MaW5l
Q3VydmUzCisJICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmUzCisJICoKKwkgKiBBIHNlcmll
cyBvZiBjdXJ2ZXMgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVEhSRUUuQ3VydmVQYXRoLgorCSAq
CisJICoqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqCisJICoJQWJzdHJhY3QgQ3VydmUgYmFzZSBjbGFzcworCSAqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
Ki8KKworCWZ1bmN0aW9uIEN1cnZlKCkgeworCisJCXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0g
MjAwOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggQ3VydmUucHJvdG90eXBlLCB7CisKKwkJLy8g
VmlydHVhbCBiYXNlIGNsYXNzIG1ldGhvZCB0byBvdmVyd3JpdGUgYW5kIGltcGxlbWVudCBpbiBz
dWJjbGFzc2VzCisJCS8vCS0gdCBbMCAuLiAxXQorCisJCWdldFBvaW50OiBmdW5jdGlvbiAoKSB7
CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVt
ZW50ZWQuJyApOworCQkJcmV0dXJuIG51bGw7CisKKwkJfSwKKworCQkvLyBHZXQgcG9pbnQgYXQg
cmVsYXRpdmUgcG9zaXRpb24gaW4gY3VydmUgYWNjb3JkaW5nIHRvIGFyYyBsZW5ndGgKKwkJLy8g
LSB1IFswIC4uIDFdCisKKwkJZ2V0UG9pbnRBdDogZnVuY3Rpb24gKCB1ICkgeworCisJCQl2YXIg
dCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTsKKwkJCXJldHVybiB0aGlzLmdldFBvaW50KCB0
ICk7CisKKwkJfSwKKworCQkvLyBHZXQgc2VxdWVuY2Ugb2YgcG9pbnRzIHVzaW5nIGdldFBvaW50
KCB0ICkKKworCQlnZXRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgeworCisJCQlpZiAo
IGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNTsKKworCQkJdmFyIHBvaW50
cyA9IFtdOworCisJCQlmb3IgKCB2YXIgZCA9IDA7IGQgPD0gZGl2aXNpb25zOyBkICsrICkgewor
CisJCQkJcG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGQgLyBkaXZpc2lvbnMgKSApOworCisJ
CQl9CisKKwkJCXJldHVybiBwb2ludHM7CisKKwkJfSwKKworCQkvLyBHZXQgc2VxdWVuY2Ugb2Yg
cG9pbnRzIHVzaW5nIGdldFBvaW50QXQoIHUgKQorCisJCWdldFNwYWNlZFBvaW50czogZnVuY3Rp
b24gKCBkaXZpc2lvbnMgKSB7CisKKwkJCWlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBk
aXZpc2lvbnMgPSA1OworCisJCQl2YXIgcG9pbnRzID0gW107CisKKwkJCWZvciAoIHZhciBkID0g
MDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7CisKKwkJCQlwb2ludHMucHVzaCggdGhpcy5nZXRQ
b2ludEF0KCBkIC8gZGl2aXNpb25zICkgKTsKKworCQkJfQorCisJCQlyZXR1cm4gcG9pbnRzOwor
CisJCX0sCisKKwkJLy8gR2V0IHRvdGFsIGN1cnZlIGFyYyBsZW5ndGgKKworCQlnZXRMZW5ndGg6
IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGxlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTsKKwkJ
CXJldHVybiBsZW5ndGhzWyBsZW5ndGhzLmxlbmd0aCAtIDEgXTsKKworCQl9LAorCisJCS8vIEdl
dCBsaXN0IG9mIGN1bXVsYXRpdmUgc2VnbWVudCBsZW5ndGhzCisKKwkJZ2V0TGVuZ3RoczogZnVu
Y3Rpb24gKCBkaXZpc2lvbnMgKSB7CisKKwkJCWlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQg
KSBkaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9uczsKKworCQkJaWYgKCB0aGlzLmNh
Y2hlQXJjTGVuZ3RocyAmJgorCQkJCSggdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoID09PSBk
aXZpc2lvbnMgKyAxICkgJiYKKwkJCQkhIHRoaXMubmVlZHNVcGRhdGUgKSB7CisKKwkJCQlyZXR1
cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7CisKKwkJCX0KKworCQkJdGhpcy5uZWVkc1VwZGF0ZSA9
IGZhbHNlOworCisJCQl2YXIgY2FjaGUgPSBbXTsKKwkJCXZhciBjdXJyZW50LCBsYXN0ID0gdGhp
cy5nZXRQb2ludCggMCApOworCQkJdmFyIHAsIHN1bSA9IDA7CisKKwkJCWNhY2hlLnB1c2goIDAg
KTsKKworCQkJZm9yICggcCA9IDE7IHAgPD0gZGl2aXNpb25zOyBwICsrICkgeworCisJCQkJY3Vy
cmVudCA9IHRoaXMuZ2V0UG9pbnQoIHAgLyBkaXZpc2lvbnMgKTsKKwkJCQlzdW0gKz0gY3VycmVu
dC5kaXN0YW5jZVRvKCBsYXN0ICk7CisJCQkJY2FjaGUucHVzaCggc3VtICk7CisJCQkJbGFzdCA9
IGN1cnJlbnQ7CisKKwkJCX0KKworCQkJdGhpcy5jYWNoZUFyY0xlbmd0aHMgPSBjYWNoZTsKKwor
CQkJcmV0dXJuIGNhY2hlOyAvLyB7IHN1bXM6IGNhY2hlLCBzdW06IHN1bSB9OyBTdW0gaXMgaW4g
dGhlIGxhc3QgZWxlbWVudC4KKworCQl9LAorCisJCXVwZGF0ZUFyY0xlbmd0aHM6IGZ1bmN0aW9u
ICgpIHsKKworCQkJdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7CisJCQl0aGlzLmdldExlbmd0aHMo
KTsKKworCQl9LAorCisJCS8vIEdpdmVuIHUgKCAwIC4uIDEgKSwgZ2V0IGEgdCB0byBmaW5kIHAu
IFRoaXMgZ2l2ZXMgeW91IHBvaW50cyB3aGljaCBhcmUgZXF1aWRpc3RhbnQKKworCQlnZXRVdG9U
bWFwcGluZzogZnVuY3Rpb24gKCB1LCBkaXN0YW5jZSApIHsKKworCQkJdmFyIGFyY0xlbmd0aHMg
PSB0aGlzLmdldExlbmd0aHMoKTsKKworCQkJdmFyIGkgPSAwLCBpbCA9IGFyY0xlbmd0aHMubGVu
Z3RoOworCisJCQl2YXIgdGFyZ2V0QXJjTGVuZ3RoOyAvLyBUaGUgdGFyZ2V0ZWQgdSBkaXN0YW5j
ZSB2YWx1ZSB0byBnZXQKKworCQkJaWYgKCBkaXN0YW5jZSApIHsKKworCQkJCXRhcmdldEFyY0xl
bmd0aCA9IGRpc3RhbmNlOworCisJCQl9IGVsc2UgeworCisJCQkJdGFyZ2V0QXJjTGVuZ3RoID0g
dSAqIGFyY0xlbmd0aHNbIGlsIC0gMSBdOworCisJCQl9CisKKwkJCS8vIGJpbmFyeSBzZWFyY2gg
Zm9yIHRoZSBpbmRleCB3aXRoIGxhcmdlc3QgdmFsdWUgc21hbGxlciB0aGFuIHRhcmdldCB1IGRp
c3RhbmNlCisKKwkJCXZhciBsb3cgPSAwLCBoaWdoID0gaWwgLSAxLCBjb21wYXJpc29uOworCisJ
CQl3aGlsZSAoIGxvdyA8PSBoaWdoICkgeworCisJCQkJaSA9IE1hdGguZmxvb3IoIGxvdyArICgg
aGlnaCAtIGxvdyApIC8gMiApOyAvLyBsZXNzIGxpa2VseSB0byBvdmVyZmxvdywgdGhvdWdoIHBy
b2JhYmx5IG5vdCBpc3N1ZSBoZXJlLCBKUyBkb2Vzbid0IHJlYWxseSBoYXZlIGludGVnZXJzLCBh
bGwgbnVtYmVycyBhcmUgZmxvYXRzCisKKwkJCQljb21wYXJpc29uID0gYXJjTGVuZ3Roc1sgaSBd
IC0gdGFyZ2V0QXJjTGVuZ3RoOworCisJCQkJaWYgKCBjb21wYXJpc29uIDwgMCApIHsKKworCQkJ
CQlsb3cgPSBpICsgMTsKKworCQkJCX0gZWxzZSBpZiAoIGNvbXBhcmlzb24gPiAwICkgeworCisJ
CQkJCWhpZ2ggPSBpIC0gMTsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJaGlnaCA9IGk7CisJCQkJ
CWJyZWFrOworCisJCQkJCS8vIERPTkUKKworCQkJCX0KKworCQkJfQorCisJCQlpID0gaGlnaDsK
KworCQkJaWYgKCBhcmNMZW5ndGhzWyBpIF0gPT09IHRhcmdldEFyY0xlbmd0aCApIHsKKworCQkJ
CXJldHVybiBpIC8gKCBpbCAtIDEgKTsKKworCQkJfQorCisJCQkvLyB3ZSBjb3VsZCBnZXQgZmlu
ZXIgZ3JhaW4gYXQgbGVuZ3Rocywgb3IgdXNlIHNpbXBsZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4g
dHdvIHBvaW50cworCisJCQl2YXIgbGVuZ3RoQmVmb3JlID0gYXJjTGVuZ3Roc1sgaSBdOworCQkJ
dmFyIGxlbmd0aEFmdGVyID0gYXJjTGVuZ3Roc1sgaSArIDEgXTsKKworCQkJdmFyIHNlZ21lbnRM
ZW5ndGggPSBsZW5ndGhBZnRlciAtIGxlbmd0aEJlZm9yZTsKKworCQkJLy8gZGV0ZXJtaW5lIHdo
ZXJlIHdlIGFyZSBiZXR3ZWVuIHRoZSAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBwb2ludHMKKworCQkJ
dmFyIHNlZ21lbnRGcmFjdGlvbiA9ICggdGFyZ2V0QXJjTGVuZ3RoIC0gbGVuZ3RoQmVmb3JlICkg
LyBzZWdtZW50TGVuZ3RoOworCisJCQkvLyBhZGQgdGhhdCBmcmFjdGlvbmFsIGFtb3VudCB0byB0
CisKKwkJCXZhciB0ID0gKCBpICsgc2VnbWVudEZyYWN0aW9uICkgLyAoIGlsIC0gMSApOworCisJ
CQlyZXR1cm4gdDsKKworCQl9LAorCisJCS8vIFJldHVybnMgYSB1bml0IHZlY3RvciB0YW5nZW50
IGF0IHQKKwkJLy8gSW4gY2FzZSBhbnkgc3ViIGN1cnZlIGRvZXMgbm90IGltcGxlbWVudCBpdHMg
dGFuZ2VudCBkZXJpdmF0aW9uLAorCQkvLyAyIHBvaW50cyBhIHNtYWxsIGRlbHRhIGFwYXJ0IHdp
bGwgYmUgdXNlZCB0byBmaW5kIGl0cyBncmFkaWVudAorCQkvLyB3aGljaCBzZWVtcyB0byBnaXZl
IGEgcmVhc29uYWJsZSBhcHByb3hpbWF0aW9uCisKKwkJZ2V0VGFuZ2VudDogZnVuY3Rpb24gKCB0
ICkgeworCisJCQl2YXIgZGVsdGEgPSAwLjAwMDE7CisJCQl2YXIgdDEgPSB0IC0gZGVsdGE7CisJ
CQl2YXIgdDIgPSB0ICsgZGVsdGE7CisKKwkJCS8vIENhcHBpbmcgaW4gY2FzZSBvZiBkYW5nZXIK
KworCQkJaWYgKCB0MSA8IDAgKSB0MSA9IDA7CisJCQlpZiAoIHQyID4gMSApIHQyID0gMTsKKwor
CQkJdmFyIHB0MSA9IHRoaXMuZ2V0UG9pbnQoIHQxICk7CisJCQl2YXIgcHQyID0gdGhpcy5nZXRQ
b2ludCggdDIgKTsKKworCQkJdmFyIHZlYyA9IHB0Mi5jbG9uZSgpLnN1YiggcHQxICk7CisJCQly
ZXR1cm4gdmVjLm5vcm1hbGl6ZSgpOworCisJCX0sCisKKwkJZ2V0VGFuZ2VudEF0OiBmdW5jdGlv
biAoIHUgKSB7CisKKwkJCXZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApOworCQkJcmV0
dXJuIHRoaXMuZ2V0VGFuZ2VudCggdCApOworCisJCX0sCisKKwkJY29tcHV0ZUZyZW5ldEZyYW1l
czogZnVuY3Rpb24gKCBzZWdtZW50cywgY2xvc2VkICkgeworCisJCQkvLyBzZWUgaHR0cDovL3d3
dy5jcy5pbmRpYW5hLmVkdS9wdWIvdGVjaHJlcG9ydHMvVFI0MjUucGRmCisKKwkJCXZhciBub3Jt
YWwgPSBuZXcgVmVjdG9yMygpOworCisJCQl2YXIgdGFuZ2VudHMgPSBbXTsKKwkJCXZhciBub3Jt
YWxzID0gW107CisJCQl2YXIgYmlub3JtYWxzID0gW107CisKKwkJCXZhciB2ZWMgPSBuZXcgVmVj
dG9yMygpOworCQkJdmFyIG1hdCA9IG5ldyBNYXRyaXg0KCk7CisKKwkJCXZhciBpLCB1LCB0aGV0
YTsKKworCQkJLy8gY29tcHV0ZSB0aGUgdGFuZ2VudCB2ZWN0b3JzIGZvciBlYWNoIHNlZ21lbnQg
b24gdGhlIGN1cnZlCisKKwkJCWZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkgewor
CisJCQkJdSA9IGkgLyBzZWdtZW50czsKKworCQkJCXRhbmdlbnRzWyBpIF0gPSB0aGlzLmdldFRh
bmdlbnRBdCggdSApOworCQkJCXRhbmdlbnRzWyBpIF0ubm9ybWFsaXplKCk7CisKKwkJCX0KKwor
CQkJLy8gc2VsZWN0IGFuIGluaXRpYWwgbm9ybWFsIHZlY3RvciBwZXJwZW5kaWN1bGFyIHRvIHRo
ZSBmaXJzdCB0YW5nZW50IHZlY3RvciwKKwkJCS8vIGFuZCBpbiB0aGUgZGlyZWN0aW9uIG9mIHRo
ZSBtaW5pbXVtIHRhbmdlbnQgeHl6IGNvbXBvbmVudAorCisJCQlub3JtYWxzWyAwIF0gPSBuZXcg
VmVjdG9yMygpOworCQkJYmlub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpOworCQkJdmFyIG1p
biA9IE51bWJlci5NQVhfVkFMVUU7CisJCQl2YXIgdHggPSBNYXRoLmFicyggdGFuZ2VudHNbIDAg
XS54ICk7CisJCQl2YXIgdHkgPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS55ICk7CisJCQl2YXIg
dHogPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS56ICk7CisKKwkJCWlmICggdHggPD0gbWluICkg
eworCisJCQkJbWluID0gdHg7CisJCQkJbm9ybWFsLnNldCggMSwgMCwgMCApOworCisJCQl9CisK
KwkJCWlmICggdHkgPD0gbWluICkgeworCisJCQkJbWluID0gdHk7CisJCQkJbm9ybWFsLnNldCgg
MCwgMSwgMCApOworCisJCQl9CisKKwkJCWlmICggdHogPD0gbWluICkgeworCisJCQkJbm9ybWFs
LnNldCggMCwgMCwgMSApOworCisJCQl9CisKKwkJCXZlYy5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRz
WyAwIF0sIG5vcm1hbCApLm5vcm1hbGl6ZSgpOworCisJCQlub3JtYWxzWyAwIF0uY3Jvc3NWZWN0
b3JzKCB0YW5nZW50c1sgMCBdLCB2ZWMgKTsKKwkJCWJpbm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9y
cyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsc1sgMCBdICk7CisKKworCQkJLy8gY29tcHV0ZSB0aGUg
c2xvd2x5LXZhcnlpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbCB2ZWN0b3JzIGZvciBlYWNoIHNlZ21l
bnQgb24gdGhlIGN1cnZlCisKKwkJCWZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkg
eworCisJCQkJbm9ybWFsc1sgaSBdID0gbm9ybWFsc1sgaSAtIDEgXS5jbG9uZSgpOworCisJCQkJ
Ymlub3JtYWxzWyBpIF0gPSBiaW5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTsKKworCQkJCXZlYy5j
cm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIC0gMSBdLCB0YW5nZW50c1sgaSBdICk7CisKKwkJCQlp
ZiAoIHZlYy5sZW5ndGgoKSA+IE51bWJlci5FUFNJTE9OICkgeworCisJCQkJCXZlYy5ub3JtYWxp
emUoKTsKKworCQkJCQl0aGV0YSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIHRhbmdlbnRzWyBp
IC0gMSBdLmRvdCggdGFuZ2VudHNbIGkgXSApLCAtIDEsIDEgKSApOyAvLyBjbGFtcCBmb3IgZmxv
YXRpbmcgcHQgZXJyb3JzCisKKwkJCQkJbm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1h
a2VSb3RhdGlvbkF4aXMoIHZlYywgdGhldGEgKSApOworCisJCQkJfQorCisJCQkJYmlub3JtYWxz
WyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTsKKworCQkJ
fQorCisJCQkvLyBpZiB0aGUgY3VydmUgaXMgY2xvc2VkLCBwb3N0cHJvY2VzcyB0aGUgdmVjdG9y
cyBzbyB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9ybWFsIHZlY3RvcnMgYXJlIHRoZSBzYW1lCisKKwkJ
CWlmICggY2xvc2VkID09PSB0cnVlICkgeworCisJCQkJdGhldGEgPSBNYXRoLmFjb3MoIF9NYXRo
LmNsYW1wKCBub3JtYWxzWyAwIF0uZG90KCBub3JtYWxzWyBzZWdtZW50cyBdICksIC0gMSwgMSAp
ICk7CisJCQkJdGhldGEgLz0gc2VnbWVudHM7CisKKwkJCQlpZiAoIHRhbmdlbnRzWyAwIF0uZG90
KCB2ZWMuY3Jvc3NWZWN0b3JzKCBub3JtYWxzWyAwIF0sIG5vcm1hbHNbIHNlZ21lbnRzIF0gKSAp
ID4gMCApIHsKKworCQkJCQl0aGV0YSA9IC0gdGhldGE7CisKKwkJCQl9CisKKwkJCQlmb3IgKCBp
ID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHsKKworCQkJCQkvLyB0d2lzdCBhIGxpdHRsZS4u
LgorCQkJCQlub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcygg
dGFuZ2VudHNbIGkgXSwgdGhldGEgKiBpICkgKTsKKwkJCQkJYmlub3JtYWxzWyBpIF0uY3Jvc3NW
ZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTsKKworCQkJCX0KKworCQkJfQor
CisJCQlyZXR1cm4geworCQkJCXRhbmdlbnRzOiB0YW5nZW50cywKKwkJCQlub3JtYWxzOiBub3Jt
YWxzLAorCQkJCWJpbm9ybWFsczogYmlub3JtYWxzCisJCQl9OworCisJCX0KKworCX0gKTsKKwor
CWZ1bmN0aW9uIExpbmVDdXJ2ZSggdjEsIHYyICkgeworCisJCUN1cnZlLmNhbGwoIHRoaXMgKTsK
KworCQl0aGlzLnYxID0gdjE7CisJCXRoaXMudjIgPSB2MjsKKworCX0KKworCUxpbmVDdXJ2ZS5w
cm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKKwlMaW5lQ3VydmUu
cHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlOworCisJTGluZUN1cnZlLnByb3RvdHlw
ZS5pc0xpbmVDdXJ2ZSA9IHRydWU7CisKKwlMaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0g
ZnVuY3Rpb24gKCB0ICkgeworCisJCWlmICggdCA9PT0gMSApIHsKKworCQkJcmV0dXJuIHRoaXMu
djIuY2xvbmUoKTsKKworCQl9CisKKwkJdmFyIHBvaW50ID0gdGhpcy52Mi5jbG9uZSgpLnN1Yigg
dGhpcy52MSApOworCQlwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApOwor
CisJCXJldHVybiBwb2ludDsKKworCX07CisKKwkvLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28g
d2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXQKKworCUxpbmVDdXJ2ZS5wcm90b3R5
cGUuZ2V0UG9pbnRBdCA9IGZ1bmN0aW9uICggdSApIHsKKworCQlyZXR1cm4gdGhpcy5nZXRQb2lu
dCggdSApOworCisJfTsKKworCUxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0VGFuZ2VudCA9IGZ1bmN0
aW9uICggdCApIHsKKworCQl2YXIgdGFuZ2VudCA9IHRoaXMudjIuY2xvbmUoKS5zdWIoIHRoaXMu
djEgKTsKKworCQlyZXR1cm4gdGFuZ2VudC5ub3JtYWxpemUoKTsKKworCX07CisKKwkvKioKKwkg
KiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCisJICoK
KwkgKiovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioKKwkgKglDdXJ2ZWQgUGF0aCAtIGEgY3VydmUgcGF0aCBpcyBzaW1w
bHkgYSBhcnJheSBvZiBjb25uZWN0ZWQKKwkgKiAgY3VydmVzLCBidXQgcmV0YWlucyB0aGUgYXBp
IG9mIGEgY3VydmUKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKiovCisKKwlmdW5jdGlvbiBDdXJ2ZVBhdGgoKSB7CisKKwkJQ3Vy
dmUuY2FsbCggdGhpcyApOworCisJCXRoaXMuY3VydmVzID0gW107CisKKwkJdGhpcy5hdXRvQ2xv
c2UgPSBmYWxzZTsgLy8gQXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHBhdGgKKworCX0KKworCUN1
cnZlUGF0aC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5w
cm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBDdXJ2ZVBhdGgsCisKKwkJYWRkOiBmdW5j
dGlvbiAoIGN1cnZlICkgeworCisJCQl0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApOworCisJCX0s
CisKKwkJY2xvc2VQYXRoOiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIEFkZCBhIGxpbmUgY3VydmUg
aWYgc3RhcnQgYW5kIGVuZCBvZiBsaW5lcyBhcmUgbm90IGNvbm5lY3RlZAorCQkJdmFyIHN0YXJ0
UG9pbnQgPSB0aGlzLmN1cnZlc1sgMCBdLmdldFBvaW50KCAwICk7CisJCQl2YXIgZW5kUG9pbnQg
PSB0aGlzLmN1cnZlc1sgdGhpcy5jdXJ2ZXMubGVuZ3RoIC0gMSBdLmdldFBvaW50KCAxICk7CisK
KwkJCWlmICggISBzdGFydFBvaW50LmVxdWFscyggZW5kUG9pbnQgKSApIHsKKworCQkJCXRoaXMu
Y3VydmVzLnB1c2goIG5ldyBMaW5lQ3VydmUoIGVuZFBvaW50LCBzdGFydFBvaW50ICkgKTsKKwor
CQkJfQorCisJCX0sCisKKwkJLy8gVG8gZ2V0IGFjY3VyYXRlIHBvaW50IHdpdGggcmVmZXJlbmNl
IHRvCisJCS8vIGVudGlyZSBwYXRoIGRpc3RhbmNlIGF0IHRpbWUgdCwKKwkJLy8gZm9sbG93aW5n
IGhhcyB0byBiZSBkb25lOgorCisJCS8vIDEuIExlbmd0aCBvZiBlYWNoIHN1YiBwYXRoIGhhdmUg
dG8gYmUga25vd24KKwkJLy8gMi4gTG9jYXRlIGFuZCBpZGVudGlmeSB0eXBlIG9mIGN1cnZlCisJ
CS8vIDMuIEdldCB0IGZvciB0aGUgY3VydmUKKwkJLy8gNC4gUmV0dXJuIGN1cnZlLmdldFBvaW50
QXQodCcpCisKKwkJZ2V0UG9pbnQ6IGZ1bmN0aW9uICggdCApIHsKKworCQkJdmFyIGQgPSB0ICog
dGhpcy5nZXRMZW5ndGgoKTsKKwkJCXZhciBjdXJ2ZUxlbmd0aHMgPSB0aGlzLmdldEN1cnZlTGVu
Z3RocygpOworCQkJdmFyIGkgPSAwOworCisJCQkvLyBUbyB0aGluayBhYm91dCBib3VuZGFyaWVz
IHBvaW50cy4KKworCQkJd2hpbGUgKCBpIDwgY3VydmVMZW5ndGhzLmxlbmd0aCApIHsKKworCQkJ
CWlmICggY3VydmVMZW5ndGhzWyBpIF0gPj0gZCApIHsKKworCQkJCQl2YXIgZGlmZiA9IGN1cnZl
TGVuZ3Roc1sgaSBdIC0gZDsKKwkJCQkJdmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTsKKwor
CQkJCQl2YXIgc2VnbWVudExlbmd0aCA9IGN1cnZlLmdldExlbmd0aCgpOworCQkJCQl2YXIgdSA9
IHNlZ21lbnRMZW5ndGggPT09IDAgPyAwIDogMSAtIGRpZmYgLyBzZWdtZW50TGVuZ3RoOworCisJ
CQkJCXJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KCB1ICk7CisKKwkJCQl9CisKKwkJCQlpICsrOwor
CisJCQl9CisKKwkJCXJldHVybiBudWxsOworCisJCQkvLyBsb29wIHdoZXJlIHN1bSAhPSAwLCBz
dW0gPiBkICwgc3VtKzEgPGQKKworCQl9LAorCisJCS8vIFdlIGNhbm5vdCB1c2UgdGhlIGRlZmF1
bHQgVEhSRUUuQ3VydmUgZ2V0UG9pbnQoKSB3aXRoIGdldExlbmd0aCgpIGJlY2F1c2UgaW4KKwkJ
Ly8gVEhSRUUuQ3VydmUsIGdldExlbmd0aCgpIGRlcGVuZHMgb24gZ2V0UG9pbnQoKSBidXQgaW4g
VEhSRUUuQ3VydmVQYXRoCisJCS8vIGdldFBvaW50KCkgZGVwZW5kcyBvbiBnZXRMZW5ndGgKKwor
CQlnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGxlbnMgPSB0aGlzLmdldEN1cnZl
TGVuZ3RocygpOworCQkJcmV0dXJuIGxlbnNbIGxlbnMubGVuZ3RoIC0gMSBdOworCisJCX0sCisK
KwkJLy8gY2FjaGVMZW5ndGhzIG11c3QgYmUgcmVjYWxjdWxhdGVkLgorCQl1cGRhdGVBcmNMZW5n
dGhzOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMubmVlZHNVcGRhdGUgPSB0cnVlOworCQkJdGhp
cy5jYWNoZUxlbmd0aHMgPSBudWxsOworCQkJdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTsKKworCQl9
LAorCisJCS8vIENvbXB1dGUgbGVuZ3RocyBhbmQgY2FjaGUgdGhlbQorCQkvLyBXZSBjYW5ub3Qg
b3ZlcndyaXRlIGdldExlbmd0aHMoKSBiZWNhdXNlIFV0b1QgbWFwcGluZyB1c2VzIGl0LgorCisJ
CWdldEN1cnZlTGVuZ3RoczogZnVuY3Rpb24gKCkgeworCisJCQkvLyBXZSB1c2UgY2FjaGUgdmFs
dWVzIGlmIGN1cnZlcyBhbmQgY2FjaGUgYXJyYXkgYXJlIHNhbWUgbGVuZ3RoCisKKwkJCWlmICgg
dGhpcy5jYWNoZUxlbmd0aHMgJiYgdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoID09PSB0aGlzLmN1
cnZlcy5sZW5ndGggKSB7CisKKwkJCQlyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7CisKKwkJCX0K
KworCQkJLy8gR2V0IGxlbmd0aCBvZiBzdWItY3VydmUKKwkJCS8vIFB1c2ggc3VtcyBpbnRvIGNh
Y2hlZCBhcnJheQorCisJCQl2YXIgbGVuZ3RocyA9IFtdLCBzdW1zID0gMDsKKworCQkJZm9yICgg
dmFyIGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJ
CXN1bXMgKz0gdGhpcy5jdXJ2ZXNbIGkgXS5nZXRMZW5ndGgoKTsKKwkJCQlsZW5ndGhzLnB1c2go
IHN1bXMgKTsKKworCQkJfQorCisJCQl0aGlzLmNhY2hlTGVuZ3RocyA9IGxlbmd0aHM7CisKKwkJ
CXJldHVybiBsZW5ndGhzOworCisJCX0sCisKKwkJZ2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAo
IGRpdmlzaW9ucyApIHsKKworCQkJaWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlz
aW9ucyA9IDQwOworCisJCQl2YXIgcG9pbnRzID0gW107CisKKwkJCWZvciAoIHZhciBpID0gMDsg
aSA8PSBkaXZpc2lvbnM7IGkgKysgKSB7CisKKwkJCQlwb2ludHMucHVzaCggdGhpcy5nZXRQb2lu
dCggaSAvIGRpdmlzaW9ucyApICk7CisKKwkJCX0KKworCQkJaWYgKCB0aGlzLmF1dG9DbG9zZSAp
IHsKKworCQkJCXBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApOworCisJCQl9CisKKwkJCXJldHVy
biBwb2ludHM7CisKKwkJfSwKKworCQlnZXRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkg
eworCisJCQlkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgMTI7CisKKwkJCXZhciBwb2ludHMgPSBb
XSwgbGFzdDsKKworCQkJZm9yICggdmFyIGkgPSAwLCBjdXJ2ZXMgPSB0aGlzLmN1cnZlczsgaSA8
IGN1cnZlcy5sZW5ndGg7IGkgKysgKSB7CisKKwkJCQl2YXIgY3VydmUgPSBjdXJ2ZXNbIGkgXTsK
KwkJCQl2YXIgcmVzb2x1dGlvbiA9IChjdXJ2ZSAmJiBjdXJ2ZS5pc0VsbGlwc2VDdXJ2ZSkgPyBk
aXZpc2lvbnMgKiAyCisJCQkJCTogKGN1cnZlICYmIGN1cnZlLmlzTGluZUN1cnZlKSA/IDEKKwkJ
CQkJOiAoY3VydmUgJiYgY3VydmUuaXNTcGxpbmVDdXJ2ZSkgPyBkaXZpc2lvbnMgKiBjdXJ2ZS5w
b2ludHMubGVuZ3RoCisJCQkJCTogZGl2aXNpb25zOworCisJCQkJdmFyIHB0cyA9IGN1cnZlLmdl
dFBvaW50cyggcmVzb2x1dGlvbiApOworCisJCQkJZm9yICggdmFyIGogPSAwOyBqIDwgcHRzLmxl
bmd0aDsgaisrICkgeworCisJCQkJCXZhciBwb2ludCA9IHB0c1sgaiBdOworCisJCQkJCWlmICgg
bGFzdCAmJiBsYXN0LmVxdWFscyggcG9pbnQgKSApIGNvbnRpbnVlOyAvLyBlbnN1cmVzIG5vIGNv
bnNlY3V0aXZlIHBvaW50cyBhcmUgZHVwbGljYXRlcworCisJCQkJCXBvaW50cy5wdXNoKCBwb2lu
dCApOworCQkJCQlsYXN0ID0gcG9pbnQ7CisKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCB0aGlz
LmF1dG9DbG9zZSAmJiBwb2ludHMubGVuZ3RoID4gMSAmJiAhcG9pbnRzWyBwb2ludHMubGVuZ3Ro
IC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHsKKworCQkJCXBvaW50cy5wdXNoKCBwb2lu
dHNbIDAgXSApOworCisJCQl9CisKKwkJCXJldHVybiBwb2ludHM7CisKKwkJfSwKKworCQkvKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioKKwkJICoJQ3JlYXRlIEdlb21ldHJpZXMgSGVscGVycworCQkgKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkJLy8vIEdl
bmVyYXRlIGdlb21ldHJ5IGZyb20gcGF0aCBwb2ludHMgKGZvciBMaW5lIG9yIFBvaW50cyBvYmpl
Y3RzKQorCisJCWNyZWF0ZVBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsK
KworCQkJdmFyIHB0cyA9IHRoaXMuZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKTsKKwkJCXJldHVybiB0
aGlzLmNyZWF0ZUdlb21ldHJ5KCBwdHMgKTsKKworCQl9LAorCisJCS8vIEdlbmVyYXRlIGdlb21l
dHJ5IGZyb20gZXF1aWRpc3RhbnQgc2FtcGxpbmcgYWxvbmcgdGhlIHBhdGgKKworCQljcmVhdGVT
cGFjZWRQb2ludHNHZW9tZXRyeTogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CisKKwkJCXZhciBw
dHMgPSB0aGlzLmdldFNwYWNlZFBvaW50cyggZGl2aXNpb25zICk7CisJCQlyZXR1cm4gdGhpcy5j
cmVhdGVHZW9tZXRyeSggcHRzICk7CisKKwkJfSwKKworCQljcmVhdGVHZW9tZXRyeTogZnVuY3Rp
b24gKCBwb2ludHMgKSB7CisKKwkJCXZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpOworCisJ
CQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKwor
CQkJCXZhciBwb2ludCA9IHBvaW50c1sgaSBdOworCQkJCWdlb21ldHJ5LnZlcnRpY2VzLnB1c2go
IG5ldyBWZWN0b3IzKCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKSApOworCisJCQl9
CisKKwkJCXJldHVybiBnZW9tZXRyeTsKKworCQl9CisKKwl9ICk7CisKKwlmdW5jdGlvbiBFbGxp
cHNlQ3VydmUoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmds
ZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkgeworCisJCUN1cnZlLmNhbGwoIHRoaXMgKTsKKwor
CQl0aGlzLmFYID0gYVg7CisJCXRoaXMuYVkgPSBhWTsKKworCQl0aGlzLnhSYWRpdXMgPSB4UmFk
aXVzOworCQl0aGlzLnlSYWRpdXMgPSB5UmFkaXVzOworCisJCXRoaXMuYVN0YXJ0QW5nbGUgPSBh
U3RhcnRBbmdsZTsKKwkJdGhpcy5hRW5kQW5nbGUgPSBhRW5kQW5nbGU7CisKKwkJdGhpcy5hQ2xv
Y2t3aXNlID0gYUNsb2Nrd2lzZTsKKworCQl0aGlzLmFSb3RhdGlvbiA9IGFSb3RhdGlvbiB8fCAw
OworCisJfQorCisJRWxsaXBzZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZl
LnByb3RvdHlwZSApOworCUVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFbGxp
cHNlQ3VydmU7CisKKwlFbGxpcHNlQ3VydmUucHJvdG90eXBlLmlzRWxsaXBzZUN1cnZlID0gdHJ1
ZTsKKworCUVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7
CisKKwkJdmFyIHR3b1BpID0gTWF0aC5QSSAqIDI7CisJCXZhciBkZWx0YUFuZ2xlID0gdGhpcy5h
RW5kQW5nbGUgLSB0aGlzLmFTdGFydEFuZ2xlOworCQl2YXIgc2FtZVBvaW50cyA9IE1hdGguYWJz
KCBkZWx0YUFuZ2xlICkgPCBOdW1iZXIuRVBTSUxPTjsKKworCQkvLyBlbnN1cmVzIHRoYXQgZGVs
dGFBbmdsZSBpcyAwIC4uIDIgUEkKKwkJd2hpbGUgKCBkZWx0YUFuZ2xlIDwgMCApIGRlbHRhQW5n
bGUgKz0gdHdvUGk7CisJCXdoaWxlICggZGVsdGFBbmdsZSA+IHR3b1BpICkgZGVsdGFBbmdsZSAt
PSB0d29QaTsKKworCQlpZiAoIGRlbHRhQW5nbGUgPCBOdW1iZXIuRVBTSUxPTiApIHsKKworCQkJ
aWYgKCBzYW1lUG9pbnRzICkgeworCisJCQkJZGVsdGFBbmdsZSA9IDA7CisKKwkJCX0gZWxzZSB7
CisKKwkJCQlkZWx0YUFuZ2xlID0gdHdvUGk7CisKKwkJCX0KKworCQl9CisKKwkJaWYgKCB0aGlz
LmFDbG9ja3dpc2UgPT09IHRydWUgJiYgISBzYW1lUG9pbnRzICkgeworCisJCQlpZiAoIGRlbHRh
QW5nbGUgPT09IHR3b1BpICkgeworCisJCQkJZGVsdGFBbmdsZSA9IC0gdHdvUGk7CisKKwkJCX0g
ZWxzZSB7CisKKwkJCQlkZWx0YUFuZ2xlID0gZGVsdGFBbmdsZSAtIHR3b1BpOworCisJCQl9CisK
KwkJfQorCisJCXZhciBhbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGUgKyB0ICogZGVsdGFBbmdsZTsK
KwkJdmFyIHggPSB0aGlzLmFYICsgdGhpcy54UmFkaXVzICogTWF0aC5jb3MoIGFuZ2xlICk7CisJ
CXZhciB5ID0gdGhpcy5hWSArIHRoaXMueVJhZGl1cyAqIE1hdGguc2luKCBhbmdsZSApOworCisJ
CWlmICggdGhpcy5hUm90YXRpb24gIT09IDAgKSB7CisKKwkJCXZhciBjb3MgPSBNYXRoLmNvcygg
dGhpcy5hUm90YXRpb24gKTsKKwkJCXZhciBzaW4gPSBNYXRoLnNpbiggdGhpcy5hUm90YXRpb24g
KTsKKworCQkJdmFyIHR4ID0geCAtIHRoaXMuYVg7CisJCQl2YXIgdHkgPSB5IC0gdGhpcy5hWTsK
KworCQkJLy8gUm90YXRlIHRoZSBwb2ludCBhYm91dCB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNl
LgorCQkJeCA9IHR4ICogY29zIC0gdHkgKiBzaW4gKyB0aGlzLmFYOworCQkJeSA9IHR4ICogc2lu
ICsgdHkgKiBjb3MgKyB0aGlzLmFZOworCisJCX0KKworCQlyZXR1cm4gbmV3IFZlY3RvcjIoIHgs
IHkgKTsKKworCX07CisKKwlmdW5jdGlvbiBTcGxpbmVDdXJ2ZSggcG9pbnRzIC8qIGFycmF5IG9m
IFZlY3RvcjIgKi8gKSB7CisKKwkJQ3VydmUuY2FsbCggdGhpcyApOworCisJCXRoaXMucG9pbnRz
ID0gKCBwb2ludHMgPT09IHVuZGVmaW5lZCApID8gW10gOiBwb2ludHM7CisKKwl9CisKKwlTcGxp
bmVDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKKwlT
cGxpbmVDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGxpbmVDdXJ2ZTsKKworCVNwbGlu
ZUN1cnZlLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlID0gdHJ1ZTsKKworCVNwbGluZUN1cnZlLnBy
b3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHsKKworCQl2YXIgcG9pbnRzID0gdGhp
cy5wb2ludHM7CisJCXZhciBwb2ludCA9ICggcG9pbnRzLmxlbmd0aCAtIDEgKSAqIHQ7CisKKwkJ
dmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcG9pbnQgKTsKKwkJdmFyIHdlaWdodCA9IHBvaW50
IC0gaW50UG9pbnQ7CisKKwkJdmFyIHBvaW50MCA9IHBvaW50c1sgaW50UG9pbnQgPT09IDAgPyBp
bnRQb2ludCA6IGludFBvaW50IC0gMSBdOworCQl2YXIgcG9pbnQxID0gcG9pbnRzWyBpbnRQb2lu
dCBdOworCQl2YXIgcG9pbnQyID0gcG9pbnRzWyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAy
ID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDEgXTsKKwkJdmFyIHBvaW50MyA9IHBv
aW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMyA/IHBvaW50cy5sZW5ndGggLSAxIDog
aW50UG9pbnQgKyAyIF07CisKKwkJcmV0dXJuIG5ldyBWZWN0b3IyKAorCQkJQ2F0bXVsbFJvbSgg
d2VpZ2h0LCBwb2ludDAueCwgcG9pbnQxLngsIHBvaW50Mi54LCBwb2ludDMueCApLAorCQkJQ2F0
bXVsbFJvbSggd2VpZ2h0LCBwb2ludDAueSwgcG9pbnQxLnksIHBvaW50Mi55LCBwb2ludDMueSAp
CisJCSk7CisKKwl9OworCisJZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2Miwg
djMgKSB7CisKKwkJQ3VydmUuY2FsbCggdGhpcyApOworCisJCXRoaXMudjAgPSB2MDsKKwkJdGhp
cy52MSA9IHYxOworCQl0aGlzLnYyID0gdjI7CisJCXRoaXMudjMgPSB2MzsKKworCX0KKworCUN1
YmljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBl
ICk7CisJQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJpY0Jlemll
ckN1cnZlOworCisJQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlv
biAoIHQgKSB7CisKKwkJdmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMu
djIsIHYzID0gdGhpcy52MzsKKworCQlyZXR1cm4gbmV3IFZlY3RvcjIoCisJCQlDdWJpY0Jlemll
ciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLAorCQkJQ3ViaWNCZXppZXIoIHQsIHYwLnks
IHYxLnksIHYyLnksIHYzLnkgKQorCQkpOworCisJfTsKKworCWZ1bmN0aW9uIFF1YWRyYXRpY0Jl
emllckN1cnZlKCB2MCwgdjEsIHYyICkgeworCisJCUN1cnZlLmNhbGwoIHRoaXMgKTsKKworCQl0
aGlzLnYwID0gdjA7CisJCXRoaXMudjEgPSB2MTsKKwkJdGhpcy52MiA9IHYyOworCisJfQorCisJ
UXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJv
dG90eXBlICk7CisJUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0g
UXVhZHJhdGljQmV6aWVyQ3VydmU7CisKKwlRdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUu
Z2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7CisKKwkJdmFyIHYwID0gdGhpcy52MCwgdjEgPSB0
aGlzLnYxLCB2MiA9IHRoaXMudjI7CisKKwkJcmV0dXJuIG5ldyBWZWN0b3IyKAorCQkJUXVhZHJh
dGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksCisJCQlRdWFkcmF0aWNCZXppZXIoIHQs
IHYwLnksIHYxLnksIHYyLnkgKQorCQkpOworCisJfTsKKworCXZhciBQYXRoUHJvdG90eXBlID0g
T2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ3VydmVQYXRoLnByb3RvdHlwZSApLCB7CisK
KwkJZnJvbVBvaW50czogZnVuY3Rpb24gKCB2ZWN0b3JzICkgeworCisJCQl0aGlzLm1vdmVUbygg
dmVjdG9yc1sgMCBdLngsIHZlY3RvcnNbIDAgXS55ICk7CisKKwkJCWZvciAoIHZhciBpID0gMSwg
bCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCXRoaXMubGluZVRvKCB2
ZWN0b3JzWyBpIF0ueCwgdmVjdG9yc1sgaSBdLnkgKTsKKworCQkJfQorCisJCX0sCisKKwkJbW92
ZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7CisKKwkJCXRoaXMuY3VycmVudFBvaW50LnNldCggeCwg
eSApOyAvLyBUT0RPIGNvbnNpZGVyIHJlZmVyZW5jaW5nIHZlY3RvcnMgaW5zdGVhZCBvZiBjb3B5
aW5nPworCisJCX0sCisKKwkJbGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7CisKKwkJCXZhciBj
dXJ2ZSA9IG5ldyBMaW5lQ3VydmUoIHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksIG5ldyBWZWN0
b3IyKCB4LCB5ICkgKTsKKwkJCXRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7CisKKwkJCXRoaXMu
Y3VycmVudFBvaW50LnNldCggeCwgeSApOworCisJCX0sCisKKwkJcXVhZHJhdGljQ3VydmVUbzog
ZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7CisKKwkJCXZhciBjdXJ2ZSA9IG5ldyBR
dWFkcmF0aWNCZXppZXJDdXJ2ZSgKKwkJCQl0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLAorCQkJ
CW5ldyBWZWN0b3IyKCBhQ1B4LCBhQ1B5ICksCisJCQkJbmV3IFZlY3RvcjIoIGFYLCBhWSApCisJ
CQkpOworCisJCQl0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApOworCisJCQl0aGlzLmN1cnJlbnRQ
b2ludC5zZXQoIGFYLCBhWSApOworCisJCX0sCisKKwkJYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24g
KCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkgeworCisJCQl2YXIgY3VydmUg
PSBuZXcgQ3ViaWNCZXppZXJDdXJ2ZSgKKwkJCQl0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLAor
CQkJCW5ldyBWZWN0b3IyKCBhQ1AxeCwgYUNQMXkgKSwKKwkJCQluZXcgVmVjdG9yMiggYUNQMngs
IGFDUDJ5ICksCisJCQkJbmV3IFZlY3RvcjIoIGFYLCBhWSApCisJCQkpOworCisJCQl0aGlzLmN1
cnZlcy5wdXNoKCBjdXJ2ZSApOworCisJCQl0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSAp
OworCisJCX0sCisKKwkJc3BsaW5lVGhydTogZnVuY3Rpb24gKCBwdHMgLypBcnJheSBvZiBWZWN0
b3IqLyApIHsKKworCQkJdmFyIG5wdHMgPSBbIHRoaXMuY3VycmVudFBvaW50LmNsb25lKCkgXS5j
b25jYXQoIHB0cyApOworCisJCQl2YXIgY3VydmUgPSBuZXcgU3BsaW5lQ3VydmUoIG5wdHMgKTsK
KwkJCXRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7CisKKwkJCXRoaXMuY3VycmVudFBvaW50LmNv
cHkoIHB0c1sgcHRzLmxlbmd0aCAtIDEgXSApOworCisJCX0sCisKKwkJYXJjOiBmdW5jdGlvbiAo
IGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHsK
KworCQkJdmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDsKKwkJCXZhciB5MCA9IHRoaXMuY3Vy
cmVudFBvaW50Lnk7CisKKwkJCXRoaXMuYWJzYXJjKCBhWCArIHgwLCBhWSArIHkwLCBhUmFkaXVz
LAorCQkJCWFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTsKKworCQl9LAorCisJ
CWFic2FyYzogZnVuY3Rpb24gKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5n
bGUsIGFDbG9ja3dpc2UgKSB7CisKKwkJCXRoaXMuYWJzZWxsaXBzZSggYVgsIGFZLCBhUmFkaXVz
LCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7CisKKwkJfSwK
KworCQllbGxpcHNlOiBmdW5jdGlvbiAoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0
QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkgeworCisJCQl2YXIgeDAg
PSB0aGlzLmN1cnJlbnRQb2ludC54OworCQkJdmFyIHkwID0gdGhpcy5jdXJyZW50UG9pbnQueTsK
KworCQkJdGhpcy5hYnNlbGxpcHNlKCBhWCArIHgwLCBhWSArIHkwLCB4UmFkaXVzLCB5UmFkaXVz
LCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTsKKworCQl9
LAorCisJCWFic2VsbGlwc2U6IGZ1bmN0aW9uICggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBh
U3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7CisKKwkJCXZh
ciBjdXJ2ZSA9IG5ldyBFbGxpcHNlQ3VydmUoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0
YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7CisKKwkJCWlmICgg
dGhpcy5jdXJ2ZXMubGVuZ3RoID4gMCApIHsKKworCQkJCS8vIGlmIGEgcHJldmlvdXMgY3VydmUg
aXMgcHJlc2VudCwgYXR0ZW1wdCB0byBqb2luCisJCQkJdmFyIGZpcnN0UG9pbnQgPSBjdXJ2ZS5n
ZXRQb2ludCggMCApOworCisJCQkJaWYgKCAhIGZpcnN0UG9pbnQuZXF1YWxzKCB0aGlzLmN1cnJl
bnRQb2ludCApICkgeworCisJCQkJCXRoaXMubGluZVRvKCBmaXJzdFBvaW50LngsIGZpcnN0UG9p
bnQueSApOworCisJCQkJfQorCisJCQl9CisKKwkJCXRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7
CisKKwkJCXZhciBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMSApOworCQkJdGhpcy5jdXJy
ZW50UG9pbnQuY29weSggbGFzdFBvaW50ICk7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICog
QGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZworCSAqIENy
ZWF0ZXMgZnJlZSBmb3JtIDJkIHBhdGggdXNpbmcgc2VyaWVzIG9mIHBvaW50cywgbGluZXMgb3Ig
Y3VydmVzLgorCSAqKi8KKworCWZ1bmN0aW9uIFBhdGgoIHBvaW50cyApIHsKKworCQlDdXJ2ZVBh
dGguY2FsbCggdGhpcyApOworCQl0aGlzLmN1cnJlbnRQb2ludCA9IG5ldyBWZWN0b3IyKCk7CisK
KwkJaWYgKCBwb2ludHMgKSB7CisKKwkJCXRoaXMuZnJvbVBvaW50cyggcG9pbnRzICk7CisKKwkJ
fQorCisJfQorCisJUGF0aC5wcm90b3R5cGUgPSBQYXRoUHJvdG90eXBlOworCVBhdGhQcm90b3R5
cGUuY29uc3RydWN0b3IgPSBQYXRoOworCisJLyoqCisJICogQGF1dGhvciB6ejg1IC8gaHR0cDov
L3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZworCSAqIERlZmluZXMgYSAyZCBzaGFwZSBwbGFu
ZSB1c2luZyBwYXRocy4KKwkgKiovCisKKwkvLyBTVEVQIDEgQ3JlYXRlIGEgcGF0aC4KKwkvLyBT
VEVQIDIgVHVybiBwYXRoIGludG8gc2hhcGUuCisJLy8gU1RFUCAzIEV4dHJ1ZGVHZW9tZXRyeSB0
YWtlcyBpbiBTaGFwZS9TaGFwZXMKKwkvLyBTVEVQIDNhIC0gRXh0cmFjdCBwb2ludHMgZnJvbSBl
YWNoIHNoYXBlLCB0dXJuIHRvIHZlcnRpY2VzCisJLy8gU1RFUCAzYiAtIFRyaWFuZ3VsYXRlIGVh
Y2ggc2hhcGUsIGFkZCBmYWNlcy4KKworCWZ1bmN0aW9uIFNoYXBlKCkgeworCisJCVBhdGguYXBw
bHkoIHRoaXMsIGFyZ3VtZW50cyApOworCisJCXRoaXMuaG9sZXMgPSBbXTsKKworCX0KKworCVNo
YXBlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIFBhdGhQcm90b3R5
cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBTaGFwZSwKKworCQlnZXRQb2ludHNIb2xlczogZnVu
Y3Rpb24gKCBkaXZpc2lvbnMgKSB7CisKKwkJCXZhciBob2xlc1B0cyA9IFtdOworCisJCQlmb3Ig
KCB2YXIgaSA9IDAsIGwgPSB0aGlzLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJ
CQlob2xlc1B0c1sgaSBdID0gdGhpcy5ob2xlc1sgaSBdLmdldFBvaW50cyggZGl2aXNpb25zICk7
CisKKwkJCX0KKworCQkJcmV0dXJuIGhvbGVzUHRzOworCisJCX0sCisKKwkJLy8gR2V0IHBvaW50
cyBvZiBzaGFwZSBhbmQgaG9sZXMgKGtleXBvaW50cyBiYXNlZCBvbiBzZWdtZW50cyBwYXJhbWV0
ZXIpCisKKwkJZXh0cmFjdEFsbFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CisKKwkJ
CXJldHVybiB7CisKKwkJCQlzaGFwZTogdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApLAorCQkJ
CWhvbGVzOiB0aGlzLmdldFBvaW50c0hvbGVzKCBkaXZpc2lvbnMgKQorCisJCQl9OworCisJCX0s
CisKKwkJZXh0cmFjdFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CisKKwkJCXJldHVy
biB0aGlzLmV4dHJhY3RBbGxQb2ludHMoIGRpdmlzaW9ucyApOworCisJCX0KKworCX0gKTsKKwor
CS8qKgorCSAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Js
b2cKKwkgKiBtaW5pbWFsIGNsYXNzIGZvciBwcm94aW5nIGZ1bmN0aW9ucyB0byBQYXRoLiBSZXBs
YWNlcyBvbGQgImV4dHJhY3RTdWJwYXRocygpIgorCSAqKi8KKworCWZ1bmN0aW9uIFNoYXBlUGF0
aCgpIHsKKworCQl0aGlzLnN1YlBhdGhzID0gW107CisJCXRoaXMuY3VycmVudFBhdGggPSBudWxs
OworCisJfQorCisJT2JqZWN0LmFzc2lnbiggU2hhcGVQYXRoLnByb3RvdHlwZSwgeworCisJCW1v
dmVUbzogZnVuY3Rpb24gKCB4LCB5ICkgeworCisJCQl0aGlzLmN1cnJlbnRQYXRoID0gbmV3IFBh
dGgoKTsKKwkJCXRoaXMuc3ViUGF0aHMucHVzaCggdGhpcy5jdXJyZW50UGF0aCApOworCQkJdGhp
cy5jdXJyZW50UGF0aC5tb3ZlVG8oIHgsIHkgKTsKKworCQl9LAorCisJCWxpbmVUbzogZnVuY3Rp
b24gKCB4LCB5ICkgeworCisJCQl0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyggeCwgeSApOworCisJ
CX0sCisKKwkJcXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkg
KSB7CisKKwkJCXRoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyggYUNQeCwgYUNQeSwg
YVgsIGFZICk7CisKKwkJfSwKKworCQliZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUDF4LCBh
Q1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7CisKKwkJCXRoaXMuY3VycmVudFBhdGguYmV6
aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApOworCisJCX0s
CisKKwkJc3BsaW5lVGhydTogZnVuY3Rpb24gKCBwdHMgKSB7CisKKwkJCXRoaXMuY3VycmVudFBh
dGguc3BsaW5lVGhydSggcHRzICk7CisKKwkJfSwKKworCQl0b1NoYXBlczogZnVuY3Rpb24gKCBp
c0NDVywgbm9Ib2xlcyApIHsKKworCQkJZnVuY3Rpb24gdG9TaGFwZXNOb0hvbGVzKCBpblN1YnBh
dGhzICkgeworCisJCQkJdmFyIHNoYXBlcyA9IFtdOworCisJCQkJZm9yICggdmFyIGkgPSAwLCBs
ID0gaW5TdWJwYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJCXZhciB0bXBQYXRo
ID0gaW5TdWJwYXRoc1sgaSBdOworCisJCQkJCXZhciB0bXBTaGFwZSA9IG5ldyBTaGFwZSgpOwor
CQkJCQl0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlczsKKworCQkJCQlzaGFwZXMucHVz
aCggdG1wU2hhcGUgKTsKKworCQkJCX0KKworCQkJCXJldHVybiBzaGFwZXM7CisKKwkJCX0KKwor
CQkJZnVuY3Rpb24gaXNQb2ludEluc2lkZVBvbHlnb24oIGluUHQsIGluUG9seWdvbiApIHsKKwor
CQkJCXZhciBwb2x5TGVuID0gaW5Qb2x5Z29uLmxlbmd0aDsKKworCQkJCS8vIGluUHQgb24gcG9s
eWdvbiBjb250b3VyID0+IGltbWVkaWF0ZSBzdWNjZXNzICAgIG9yCisJCQkJLy8gdG9nZ2xpbmcg
b2YgaW5zaWRlL291dHNpZGUgYXQgZXZlcnkgc2luZ2xlISBpbnRlcnNlY3Rpb24gcG9pbnQgb2Yg
YW4gZWRnZQorCQkJCS8vICB3aXRoIHRoZSBob3Jpem9udGFsIGxpbmUgdGhyb3VnaCBpblB0LCBs
ZWZ0IG9mIGluUHQKKwkJCQkvLyAgbm90IGNvdW50aW5nIGxvd2VyWSBlbmRwb2ludHMgb2YgZWRn
ZXMgYW5kIHdob2xlIGVkZ2VzIG9uIHRoYXQgbGluZQorCQkJCXZhciBpbnNpZGUgPSBmYWxzZTsK
KwkJCQlmb3IgKCB2YXIgcCA9IHBvbHlMZW4gLSAxLCBxID0gMDsgcSA8IHBvbHlMZW47IHAgPSBx
ICsrICkgeworCisJCQkJCXZhciBlZGdlTG93UHQgID0gaW5Qb2x5Z29uWyBwIF07CisJCQkJCXZh
ciBlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBxIF07CisKKwkJCQkJdmFyIGVkZ2VEeCA9IGVkZ2VI
aWdoUHQueCAtIGVkZ2VMb3dQdC54OworCQkJCQl2YXIgZWRnZUR5ID0gZWRnZUhpZ2hQdC55IC0g
ZWRnZUxvd1B0Lnk7CisKKwkJCQkJaWYgKCBNYXRoLmFicyggZWRnZUR5ICkgPiBOdW1iZXIuRVBT
SUxPTiApIHsKKworCQkJCQkJLy8gbm90IHBhcmFsbGVsCisJCQkJCQlpZiAoIGVkZ2VEeSA8IDAg
KSB7CisKKwkJCQkJCQllZGdlTG93UHQgID0gaW5Qb2x5Z29uWyBxIF07IGVkZ2VEeCA9IC0gZWRn
ZUR4OworCQkJCQkJCWVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHAgXTsgZWRnZUR5ID0gLSBlZGdl
RHk7CisKKwkJCQkJCX0KKwkJCQkJCWlmICggKCBpblB0LnkgPCBlZGdlTG93UHQueSApIHx8ICgg
aW5QdC55ID4gZWRnZUhpZ2hQdC55ICkgKSAJCWNvbnRpbnVlOworCisJCQkJCQlpZiAoIGluUHQu
eSA9PT0gZWRnZUxvd1B0LnkgKSB7CisKKwkJCQkJCQlpZiAoIGluUHQueCA9PT0gZWRnZUxvd1B0
LnggKQkJcmV0dXJuCXRydWU7CQkvLyBpblB0IGlzIG9uIGNvbnRvdXIgPworCQkJCQkJCS8vIGNv
bnRpbnVlOwkJCQkvLyBubyBpbnRlcnNlY3Rpb24gb3IgZWRnZUxvd1B0ID0+IGRvZXNuJ3QgY291
bnQgISEhCisKKwkJCQkJCX0gZWxzZSB7CisKKwkJCQkJCQl2YXIgcGVycEVkZ2UgPSBlZGdlRHkg
KiAoIGluUHQueCAtIGVkZ2VMb3dQdC54ICkgLSBlZGdlRHggKiAoIGluUHQueSAtIGVkZ2VMb3dQ
dC55ICk7CisJCQkJCQkJaWYgKCBwZXJwRWRnZSA9PT0gMCApCQkJCXJldHVybgl0cnVlOwkJLy8g
aW5QdCBpcyBvbiBjb250b3VyID8KKwkJCQkJCQlpZiAoIHBlcnBFZGdlIDwgMCApIAkJCQljb250
aW51ZTsKKwkJCQkJCQlpbnNpZGUgPSAhIGluc2lkZTsJCS8vIHRydWUgaW50ZXJzZWN0aW9uIGxl
ZnQgb2YgaW5QdAorCisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJLy8gcGFyYWxs
ZWwgb3IgY29sbGluZWFyCisJCQkJCQlpZiAoIGluUHQueSAhPT0gZWRnZUxvd1B0LnkgKSAJCWNv
bnRpbnVlOwkJCS8vIHBhcmFsbGVsCisJCQkJCQkvLyBlZGdlIGxpZXMgb24gdGhlIHNhbWUgaG9y
aXpvbnRhbCBsaW5lIGFzIGluUHQKKwkJCQkJCWlmICggKCAoIGVkZ2VIaWdoUHQueCA8PSBpblB0
LnggKSAmJiAoIGluUHQueCA8PSBlZGdlTG93UHQueCApICkgfHwKKwkJCQkJCQkgKCAoIGVkZ2VM
b3dQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VIaWdoUHQueCApICkgKQkJcmV0
dXJuCXRydWU7CS8vIGluUHQ6IFBvaW50IG9uIGNvbnRvdXIgIQorCQkJCQkJLy8gY29udGludWU7
CisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJcmV0dXJuCWluc2lkZTsKKworCQkJfQorCisJCQl2
YXIgaXNDbG9ja1dpc2UgPSBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlOworCisJCQl2YXIgc3ViUGF0
aHMgPSB0aGlzLnN1YlBhdGhzOworCQkJaWYgKCBzdWJQYXRocy5sZW5ndGggPT09IDAgKSByZXR1
cm4gW107CisKKwkJCWlmICggbm9Ib2xlcyA9PT0gdHJ1ZSApCXJldHVybgl0b1NoYXBlc05vSG9s
ZXMoIHN1YlBhdGhzICk7CisKKworCQkJdmFyIHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZSwgc2hh
cGVzID0gW107CisKKwkJCWlmICggc3ViUGF0aHMubGVuZ3RoID09PSAxICkgeworCisJCQkJdG1w
UGF0aCA9IHN1YlBhdGhzWyAwIF07CisJCQkJdG1wU2hhcGUgPSBuZXcgU2hhcGUoKTsKKwkJCQl0
bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlczsKKwkJCQlzaGFwZXMucHVzaCggdG1wU2hh
cGUgKTsKKwkJCQlyZXR1cm4gc2hhcGVzOworCisJCQl9CisKKwkJCXZhciBob2xlc0ZpcnN0ID0g
ISBpc0Nsb2NrV2lzZSggc3ViUGF0aHNbIDAgXS5nZXRQb2ludHMoKSApOworCQkJaG9sZXNGaXJz
dCA9IGlzQ0NXID8gISBob2xlc0ZpcnN0IDogaG9sZXNGaXJzdDsKKworCQkJLy8gY29uc29sZS5s
b2coIkhvbGVzIGZpcnN0IiwgaG9sZXNGaXJzdCk7CisKKwkJCXZhciBiZXR0ZXJTaGFwZUhvbGVz
ID0gW107CisJCQl2YXIgbmV3U2hhcGVzID0gW107CisJCQl2YXIgbmV3U2hhcGVIb2xlcyA9IFtd
OworCQkJdmFyIG1haW5JZHggPSAwOworCQkJdmFyIHRtcFBvaW50czsKKworCQkJbmV3U2hhcGVz
WyBtYWluSWR4IF0gPSB1bmRlZmluZWQ7CisJCQluZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBb
XTsKKworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gc3ViUGF0aHMubGVuZ3RoOyBpIDwgbDsgaSAr
KyApIHsKKworCQkJCXRtcFBhdGggPSBzdWJQYXRoc1sgaSBdOworCQkJCXRtcFBvaW50cyA9IHRt
cFBhdGguZ2V0UG9pbnRzKCk7CisJCQkJc29saWQgPSBpc0Nsb2NrV2lzZSggdG1wUG9pbnRzICk7
CisJCQkJc29saWQgPSBpc0NDVyA/ICEgc29saWQgOiBzb2xpZDsKKworCQkJCWlmICggc29saWQg
KSB7CisKKwkJCQkJaWYgKCAoICEgaG9sZXNGaXJzdCApICYmICggbmV3U2hhcGVzWyBtYWluSWR4
IF0gKSApCW1haW5JZHggKys7CisKKwkJCQkJbmV3U2hhcGVzWyBtYWluSWR4IF0gPSB7IHM6IG5l
dyBTaGFwZSgpLCBwOiB0bXBQb2ludHMgfTsKKwkJCQkJbmV3U2hhcGVzWyBtYWluSWR4IF0ucy5j
dXJ2ZXMgPSB0bXBQYXRoLmN1cnZlczsKKworCQkJCQlpZiAoIGhvbGVzRmlyc3QgKQltYWluSWR4
ICsrOworCQkJCQluZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTsKKworCQkJCQkvL2NvbnNv
bGUubG9nKCdjdycsIGkpOworCisJCQkJfSBlbHNlIHsKKworCQkJCQluZXdTaGFwZUhvbGVzWyBt
YWluSWR4IF0ucHVzaCggeyBoOiB0bXBQYXRoLCBwOiB0bXBQb2ludHNbIDAgXSB9ICk7CisKKwkJ
CQkJLy9jb25zb2xlLmxvZygnY2N3JywgaSk7CisKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gb25s
eSBIb2xlcz8gLT4gcHJvYmFibHkgYWxsIFNoYXBlcyB3aXRoIHdyb25nIG9yaWVudGF0aW9uCisJ
CQlpZiAoICEgbmV3U2hhcGVzWyAwIF0gKQlyZXR1cm4JdG9TaGFwZXNOb0hvbGVzKCBzdWJQYXRo
cyApOworCisKKwkJCWlmICggbmV3U2hhcGVzLmxlbmd0aCA+IDEgKSB7CisKKwkJCQl2YXIgYW1i
aWd1b3VzID0gZmFsc2U7CisJCQkJdmFyIHRvQ2hhbmdlID0gW107CisKKwkJCQlmb3IgKCB2YXIg
c0lkeCA9IDAsIHNMZW4gPSBuZXdTaGFwZXMubGVuZ3RoOyBzSWR4IDwgc0xlbjsgc0lkeCArKyAp
IHsKKworCQkJCQliZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0gPSBbXTsKKworCQkJCX0KKworCQkJ
CWZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVu
OyBzSWR4ICsrICkgeworCisJCQkJCXZhciBzaG8gPSBuZXdTaGFwZUhvbGVzWyBzSWR4IF07CisK
KwkJCQkJZm9yICggdmFyIGhJZHggPSAwOyBoSWR4IDwgc2hvLmxlbmd0aDsgaElkeCArKyApIHsK
KworCQkJCQkJdmFyIGhvID0gc2hvWyBoSWR4IF07CisJCQkJCQl2YXIgaG9sZV91bmFzc2lnbmVk
ID0gdHJ1ZTsKKworCQkJCQkJZm9yICggdmFyIHMySWR4ID0gMDsgczJJZHggPCBuZXdTaGFwZXMu
bGVuZ3RoOyBzMklkeCArKyApIHsKKworCQkJCQkJCWlmICggaXNQb2ludEluc2lkZVBvbHlnb24o
IGhvLnAsIG5ld1NoYXBlc1sgczJJZHggXS5wICkgKSB7CisKKwkJCQkJCQkJaWYgKCBzSWR4ICE9
PSBzMklkeCApCXRvQ2hhbmdlLnB1c2goIHsgZnJvbXM6IHNJZHgsIHRvczogczJJZHgsIGhvbGU6
IGhJZHggfSApOworCQkJCQkJCQlpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHsKKworCQkJCQkJCQkJ
aG9sZV91bmFzc2lnbmVkID0gZmFsc2U7CisJCQkJCQkJCQliZXR0ZXJTaGFwZUhvbGVzWyBzMklk
eCBdLnB1c2goIGhvICk7CisKKwkJCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCQkJYW1iaWd1b3Vz
ID0gdHJ1ZTsKKworCQkJCQkJCQl9CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJCWlmICgg
aG9sZV91bmFzc2lnbmVkICkgeworCisJCQkJCQkJYmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdLnB1
c2goIGhvICk7CisKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9CisJCQkJLy8gY29uc29sZS5s
b2coImFtYmlndW91czogIiwgYW1iaWd1b3VzKTsKKwkJCQlpZiAoIHRvQ2hhbmdlLmxlbmd0aCA+
IDAgKSB7CisKKwkJCQkJLy8gY29uc29sZS5sb2coInRvIGNoYW5nZTogIiwgdG9DaGFuZ2UpOwor
CQkJCQlpZiAoICEgYW1iaWd1b3VzICkJbmV3U2hhcGVIb2xlcyA9IGJldHRlclNoYXBlSG9sZXM7
CisKKwkJCQl9CisKKwkJCX0KKworCQkJdmFyIHRtcEhvbGVzOworCisJCQlmb3IgKCB2YXIgaSA9
IDAsIGlsID0gbmV3U2hhcGVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisJCQkJdG1wU2hh
cGUgPSBuZXdTaGFwZXNbIGkgXS5zOworCQkJCXNoYXBlcy5wdXNoKCB0bXBTaGFwZSApOworCQkJ
CXRtcEhvbGVzID0gbmV3U2hhcGVIb2xlc1sgaSBdOworCisJCQkJZm9yICggdmFyIGogPSAwLCBq
bCA9IHRtcEhvbGVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgeworCisJCQkJCXRtcFNoYXBlLmhv
bGVzLnB1c2goIHRtcEhvbGVzWyBqIF0uaCApOworCisJCQkJfQorCisJCQl9CisKKwkJCS8vY29u
c29sZS5sb2coInNoYXBlIiwgc2hhcGVzKTsKKworCQkJcmV0dXJuIHNoYXBlczsKKworCQl9CisK
Kwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5u
ZXQveno4NS9ibG9nCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkg
Ki8KKworCWZ1bmN0aW9uIEZvbnQoIGRhdGEgKSB7CisKKwkJdGhpcy5kYXRhID0gZGF0YTsKKwor
CX0KKworCU9iamVjdC5hc3NpZ24oIEZvbnQucHJvdG90eXBlLCB7CisKKwkJaXNGb250OiB0cnVl
LAorCisJCWdlbmVyYXRlU2hhcGVzOiBmdW5jdGlvbiAoIHRleHQsIHNpemUsIGRpdmlzaW9ucyAp
IHsKKworCQkJZnVuY3Rpb24gY3JlYXRlUGF0aHMoIHRleHQgKSB7CisKKwkJCQl2YXIgY2hhcnMg
PSBTdHJpbmcoIHRleHQgKS5zcGxpdCggJycgKTsKKwkJCQl2YXIgc2NhbGUgPSBzaXplIC8gZGF0
YS5yZXNvbHV0aW9uOworCQkJCXZhciBsaW5lX2hlaWdodCA9ICggZGF0YS5ib3VuZGluZ0JveC55
TWF4IC0gZGF0YS5ib3VuZGluZ0JveC55TWluICsgZGF0YS51bmRlcmxpbmVUaGlja25lc3MgKSAq
IHNjYWxlOworCisJCQkJdmFyIG9mZnNldFggPSAwLCBvZmZzZXRZID0gMDsKKworCQkJCXZhciBw
YXRocyA9IFtdOworCisJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpICsr
ICkgeworCisJCQkJCXZhciBjaGFyID0gY2hhcnNbIGkgXTsKKworCQkJCQlpZiAoIGNoYXIgPT09
ICdcbicgKSB7CisKKwkJCQkJCW9mZnNldFggPSAwOworCQkJCQkJb2Zmc2V0WSAtPSBsaW5lX2hl
aWdodDsKKworCQkJCQl9IGVsc2UgeworCisJCQkJCQl2YXIgcmV0ID0gY3JlYXRlUGF0aCggY2hh
ciwgc2NhbGUsIG9mZnNldFgsIG9mZnNldFkgKTsKKwkJCQkJCW9mZnNldFggKz0gcmV0Lm9mZnNl
dFg7CisJCQkJCQlwYXRocy5wdXNoKCByZXQucGF0aCApOworCisJCQkJCX0KKworCQkJCX0KKwor
CQkJCXJldHVybiBwYXRoczsKKworCQkJfQorCisJCQlmdW5jdGlvbiBjcmVhdGVQYXRoKCBjLCBz
Y2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSApIHsKKworCQkJCXZhciBnbHlwaCA9IGRhdGEuZ2x5cGhz
WyBjIF0gfHwgZGF0YS5nbHlwaHNbICc/JyBdOworCisJCQkJaWYgKCAhIGdseXBoICkgcmV0dXJu
OworCisJCQkJdmFyIHBhdGggPSBuZXcgU2hhcGVQYXRoKCk7CisKKwkJCQl2YXIgcHRzID0gW107
CisJCQkJdmFyIHgsIHksIGNweCwgY3B5LCBjcHgwLCBjcHkwLCBjcHgxLCBjcHkxLCBjcHgyLCBj
cHkyLCBsYXN0ZTsKKworCQkJCWlmICggZ2x5cGgubyApIHsKKworCQkJCQl2YXIgb3V0bGluZSA9
IGdseXBoLl9jYWNoZWRPdXRsaW5lIHx8ICggZ2x5cGguX2NhY2hlZE91dGxpbmUgPSBnbHlwaC5v
LnNwbGl0KCAnICcgKSApOworCisJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IG91dGxpbmUubGVu
Z3RoOyBpIDwgbDsgKSB7CisKKwkJCQkJCXZhciBhY3Rpb24gPSBvdXRsaW5lWyBpICsrIF07CisK
KwkJCQkJCXN3aXRjaCAoIGFjdGlvbiApIHsKKworCQkJCQkJCWNhc2UgJ20nOiAvLyBtb3ZlVG8K
KworCQkJCQkJCQl4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYOworCQkJCQkJ
CQl5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZOworCisJCQkJCQkJCXBhdGgu
bW92ZVRvKCB4LCB5ICk7CisKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlICdsJzogLy8g
bGluZVRvCisKKwkJCQkJCQkJeCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDsK
KwkJCQkJCQkJeSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTsKKworCQkJCQkJ
CQlwYXRoLmxpbmVUbyggeCwgeSApOworCisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSAn
cSc6IC8vIHF1YWRyYXRpY0N1cnZlVG8KKworCQkJCQkJCQljcHggID0gb3V0bGluZVsgaSArKyBd
ICogc2NhbGUgKyBvZmZzZXRYOworCQkJCQkJCQljcHkgID0gb3V0bGluZVsgaSArKyBdICogc2Nh
bGUgKyBvZmZzZXRZOworCQkJCQkJCQljcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBv
ZmZzZXRYOworCQkJCQkJCQljcHkxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZ
OworCisJCQkJCQkJCXBhdGgucXVhZHJhdGljQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4LCBjcHkg
KTsKKworCQkJCQkJCQlsYXN0ZSA9IHB0c1sgcHRzLmxlbmd0aCAtIDEgXTsKKworCQkJCQkJCQlp
ZiAoIGxhc3RlICkgeworCisJCQkJCQkJCQljcHgwID0gbGFzdGUueDsKKwkJCQkJCQkJCWNweTAg
PSBsYXN0ZS55OworCisJCQkJCQkJCQlmb3IgKCB2YXIgaTIgPSAxOyBpMiA8PSBkaXZpc2lvbnM7
IGkyICsrICkgeworCisJCQkJCQkJCQkJdmFyIHQgPSBpMiAvIGRpdmlzaW9uczsKKwkJCQkJCQkJ
CQlRdWFkcmF0aWNCZXppZXIoIHQsIGNweDAsIGNweDEsIGNweCApOworCQkJCQkJCQkJCVF1YWRy
YXRpY0JlemllciggdCwgY3B5MCwgY3B5MSwgY3B5ICk7CisKKwkJCQkJCQkJCX0KKworCQkJCQkJ
CQl9CisKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlICdiJzogLy8gYmV6aWVyQ3VydmVU
bworCisJCQkJCQkJCWNweCAgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CisJ
CQkJCQkJCWNweSAgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CisJCQkJCQkJ
CWNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CisJCQkJCQkJCWNweTEg
PSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CisJCQkJCQkJCWNweDIgPSBvdXRs
aW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CisJCQkJCQkJCWNweTIgPSBvdXRsaW5lWyBp
ICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CisKKwkJCQkJCQkJcGF0aC5iZXppZXJDdXJ2ZVRvKCBj
cHgxLCBjcHkxLCBjcHgyLCBjcHkyLCBjcHgsIGNweSApOworCisJCQkJCQkJCWxhc3RlID0gcHRz
WyBwdHMubGVuZ3RoIC0gMSBdOworCisJCQkJCQkJCWlmICggbGFzdGUgKSB7CisKKwkJCQkJCQkJ
CWNweDAgPSBsYXN0ZS54OworCQkJCQkJCQkJY3B5MCA9IGxhc3RlLnk7CisKKwkJCQkJCQkJCWZv
ciAoIHZhciBpMiA9IDE7IGkyIDw9IGRpdmlzaW9uczsgaTIgKysgKSB7CisKKwkJCQkJCQkJCQl2
YXIgdCA9IGkyIC8gZGl2aXNpb25zOworCQkJCQkJCQkJCUN1YmljQmV6aWVyKCB0LCBjcHgwLCBj
cHgxLCBjcHgyLCBjcHggKTsKKwkJCQkJCQkJCQlDdWJpY0JlemllciggdCwgY3B5MCwgY3B5MSwg
Y3B5MiwgY3B5ICk7CisKKwkJCQkJCQkJCX0KKworCQkJCQkJCQl9CisKKwkJCQkJCQkJYnJlYWs7
CisKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlyZXR1cm4geyBvZmZzZXRYOiBn
bHlwaC5oYSAqIHNjYWxlLCBwYXRoOiBwYXRoIH07CisKKwkJCX0KKworCQkJLy8KKworCQkJaWYg
KCBzaXplID09PSB1bmRlZmluZWQgKSBzaXplID0gMTAwOworCQkJaWYgKCBkaXZpc2lvbnMgPT09
IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDQ7CisKKwkJCXZhciBkYXRhID0gdGhpcy5kYXRhOwor
CisJCQl2YXIgcGF0aHMgPSBjcmVhdGVQYXRocyggdGV4dCApOworCQkJdmFyIHNoYXBlcyA9IFtd
OworCisJCQlmb3IgKCB2YXIgcCA9IDAsIHBsID0gcGF0aHMubGVuZ3RoOyBwIDwgcGw7IHAgKysg
KSB7CisKKwkJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggc2hhcGVzLCBwYXRoc1sgcCBd
LnRvU2hhcGVzKCkgKTsKKworCQkJfQorCisJCQlyZXR1cm4gc2hhcGVzOworCisJCX0KKworCX0g
KTsKKworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICov
CisKKwlmdW5jdGlvbiBGb250TG9hZGVyKCBtYW5hZ2VyICkgeworCisJCXRoaXMubWFuYWdlciA9
ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5h
Z2VyOworCisJfQorCisJT2JqZWN0LmFzc2lnbiggRm9udExvYWRlci5wcm90b3R5cGUsIHsKKwor
CQlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgewor
CisJCQl2YXIgc2NvcGUgPSB0aGlzOworCisJCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIo
IHRoaXMubWFuYWdlciApOworCQkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkg
eworCisJCQkJdmFyIGpzb247CisKKwkJCQl0cnkgeworCisJCQkJCWpzb24gPSBKU09OLnBhcnNl
KCB0ZXh0ICk7CisKKwkJCQl9IGNhdGNoICggZSApIHsKKworCQkJCQljb25zb2xlLndhcm4oICdU
SFJFRS5Gb250TG9hZGVyOiB0eXBlZmFjZS5qcyBzdXBwb3J0IGlzIGJlaW5nIGRlcHJlY2F0ZWQu
IFVzZSB0eXBlZmFjZS5qc29uIGluc3RlYWQuJyApOworCQkJCQlqc29uID0gSlNPTi5wYXJzZSgg
dGV4dC5zdWJzdHJpbmcoIDY1LCB0ZXh0Lmxlbmd0aCAtIDIgKSApOworCisJCQkJfQorCisJCQkJ
dmFyIGZvbnQgPSBzY29wZS5wYXJzZSgganNvbiApOworCisJCQkJaWYgKCBvbkxvYWQgKSBvbkxv
YWQoIGZvbnQgKTsKKworCQkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOworCisJCX0sCisKKwkJ
cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHsKKworCQkJcmV0dXJuIG5ldyBGb250KCBqc29uICk7
CisKKwkJfQorCisJfSApOworCisJdmFyIGNvbnRleHQ7CisKKwl2YXIgQXVkaW9Db250ZXh0ID0g
eworCisJCWdldENvbnRleHQ6IGZ1bmN0aW9uICgpIHsKKworCQkJaWYgKCBjb250ZXh0ID09PSB1
bmRlZmluZWQgKSB7CisKKwkJCQljb250ZXh0ID0gbmV3ICggd2luZG93LkF1ZGlvQ29udGV4dCB8
fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0ICkoKTsKKworCQkJfQorCisJCQlyZXR1cm4gY29u
dGV4dDsKKworCQl9LAorCisJCXNldENvbnRleHQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJ
CWNvbnRleHQgPSB2YWx1ZTsKKworCQl9CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBSZWVj
ZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vub3Rlcy5jb20vCisJICovCisKKwlmdW5j
dGlvbiBBdWRpb0xvYWRlciggbWFuYWdlciApIHsKKworCQl0aGlzLm1hbmFnZXIgPSAoIG1hbmFn
ZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKKwor
CX0KKworCU9iamVjdC5hc3NpZ24oIEF1ZGlvTG9hZGVyLnByb3RvdHlwZSwgeworCisJCWxvYWQ6
IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CisKKwkJCXZh
ciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7CisJCQlsb2FkZXIuc2V0
UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7CisJCQlsb2FkZXIubG9hZCggdXJsLCBmdW5j
dGlvbiAoIGJ1ZmZlciApIHsKKworCQkJCXZhciBjb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENv
bnRleHQoKTsKKworCQkJCWNvbnRleHQuZGVjb2RlQXVkaW9EYXRhKCBidWZmZXIsIGZ1bmN0aW9u
ICggYXVkaW9CdWZmZXIgKSB7CisKKwkJCQkJb25Mb2FkKCBhdWRpb0J1ZmZlciApOworCisJCQkJ
fSApOworCisJCQl9LCBvblByb2dyZXNzLCBvbkVycm9yICk7CisKKwkJfQorCisJfSApOworCisJ
LyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1
bmN0aW9uIFN0ZXJlb0NhbWVyYSgpIHsKKworCQl0aGlzLnR5cGUgPSAnU3RlcmVvQ2FtZXJhJzsK
KworCQl0aGlzLmFzcGVjdCA9IDE7CisKKwkJdGhpcy5leWVTZXAgPSAwLjA2NDsKKworCQl0aGlz
LmNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTsKKwkJdGhpcy5jYW1lcmFMLmxheWVy
cy5lbmFibGUoIDEgKTsKKwkJdGhpcy5jYW1lcmFMLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsK
KworCQl0aGlzLmNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTsKKwkJdGhpcy5jYW1l
cmFSLmxheWVycy5lbmFibGUoIDIgKTsKKwkJdGhpcy5jYW1lcmFSLm1hdHJpeEF1dG9VcGRhdGUg
PSBmYWxzZTsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIFN0ZXJlb0NhbWVyYS5wcm90b3R5cGUs
IHsKKworCQl1cGRhdGU6ICggZnVuY3Rpb24gKCkgeworCisJCQl2YXIgaW5zdGFuY2UsIGZvY3Vz
LCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyLCB6b29tLCBleWVTZXA7CisKKwkJCXZhciBleWVSaWdo
dCA9IG5ldyBNYXRyaXg0KCk7CisJCQl2YXIgZXllTGVmdCA9IG5ldyBNYXRyaXg0KCk7CisKKwkJ
CXJldHVybiBmdW5jdGlvbiB1cGRhdGUoIGNhbWVyYSApIHsKKworCQkJCXZhciBuZWVkc1VwZGF0
ZSA9IGluc3RhbmNlICE9PSB0aGlzIHx8IGZvY3VzICE9PSBjYW1lcmEuZm9jdXMgfHwgZm92ICE9
PSBjYW1lcmEuZm92IHx8CisJCQkJCQkJCQkJCQkJYXNwZWN0ICE9PSBjYW1lcmEuYXNwZWN0ICog
dGhpcy5hc3BlY3QgfHwgbmVhciAhPT0gY2FtZXJhLm5lYXIgfHwKKwkJCQkJCQkJCQkJCQlmYXIg
IT09IGNhbWVyYS5mYXIgfHwgem9vbSAhPT0gY2FtZXJhLnpvb20gfHwgZXllU2VwICE9PSB0aGlz
LmV5ZVNlcDsKKworCQkJCWlmICggbmVlZHNVcGRhdGUgKSB7CisKKwkJCQkJaW5zdGFuY2UgPSB0
aGlzOworCQkJCQlmb2N1cyA9IGNhbWVyYS5mb2N1czsKKwkJCQkJZm92ID0gY2FtZXJhLmZvdjsK
KwkJCQkJYXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0OworCQkJCQluZWFyID0g
Y2FtZXJhLm5lYXI7CisJCQkJCWZhciA9IGNhbWVyYS5mYXI7CisJCQkJCXpvb20gPSBjYW1lcmEu
em9vbTsKKworCQkJCQkvLyBPZmYtYXhpcyBzdGVyZW9zY29waWMgZWZmZWN0IGJhc2VkIG9uCisJ
CQkJCS8vIGh0dHA6Ly9wYXVsYm91cmtlLm5ldC9zdGVyZW9ncmFwaGljcy9zdGVyZW9yZW5kZXIv
CisKKwkJCQkJdmFyIHByb2plY3Rpb25NYXRyaXggPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5j
bG9uZSgpOworCQkJCQlleWVTZXAgPSB0aGlzLmV5ZVNlcCAvIDI7CisJCQkJCXZhciBleWVTZXBP
blByb2plY3Rpb24gPSBleWVTZXAgKiBuZWFyIC8gZm9jdXM7CisJCQkJCXZhciB5bWF4ID0gKCBu
ZWFyICogTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiBmb3YgKiAwLjUgKSApIC8gem9vbTsKKwkJ
CQkJdmFyIHhtaW4sIHhtYXg7CisKKwkJCQkJLy8gdHJhbnNsYXRlIHhPZmZzZXQKKworCQkJCQll
eWVMZWZ0LmVsZW1lbnRzWyAxMiBdID0gLSBleWVTZXA7CisJCQkJCWV5ZVJpZ2h0LmVsZW1lbnRz
WyAxMiBdID0gZXllU2VwOworCisJCQkJCS8vIGZvciBsZWZ0IGV5ZQorCisJCQkJCXhtaW4gPSAt
IHltYXggKiBhc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247CisJCQkJCXhtYXggPSB5bWF4ICog
YXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uOworCisJCQkJCXByb2plY3Rpb25NYXRyaXguZWxl
bWVudHNbIDAgXSA9IDIgKiBuZWFyIC8gKCB4bWF4IC0geG1pbiApOworCQkJCQlwcm9qZWN0aW9u
TWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7
CisKKwkJCQkJdGhpcy5jYW1lcmFMLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1h
dHJpeCApOworCisJCQkJCS8vIGZvciByaWdodCBleWUKKworCQkJCQl4bWluID0gLSB5bWF4ICog
YXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uOworCQkJCQl4bWF4ID0geW1heCAqIGFzcGVjdCAt
IGV5ZVNlcE9uUHJvamVjdGlvbjsKKworCQkJCQlwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAw
IF0gPSAyICogbmVhciAvICggeG1heCAtIHhtaW4gKTsKKwkJCQkJcHJvamVjdGlvbk1hdHJpeC5l
bGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApOworCisJCQkJ
CXRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHByb2plY3Rpb25NYXRyaXggKTsK
KworCQkJCX0KKworCQkJCXRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0
cml4V29ybGQgKS5tdWx0aXBseSggZXllTGVmdCApOworCQkJCXRoaXMuY2FtZXJhUi5tYXRyaXhX
b3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggZXllUmlnaHQgKTsKKwor
CQkJfTsKKworCQl9ICkoKQorCisJfSApOworCisJLyoqCisJICogQ2FtZXJhIGZvciByZW5kZXJp
bmcgY3ViZSBtYXBzCisJICoJLSByZW5kZXJzIHNjZW5lIGludG8gYXhpcy1hbGlnbmVkIGN1YmUK
KwkgKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJ
ICovCisKKwlmdW5jdGlvbiBDdWJlQ2FtZXJhKCBuZWFyLCBmYXIsIGN1YmVSZXNvbHV0aW9uICkg
eworCisJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnQ3ViZUNhbWVy
YSc7CisKKwkJdmFyIGZvdiA9IDkwLCBhc3BlY3QgPSAxOworCisJCXZhciBjYW1lcmFQWCA9IG5l
dyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApOworCQljYW1lcmFQ
WC51cC5zZXQoIDAsIC0gMSwgMCApOworCQljYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAx
LCAwLCAwICkgKTsKKwkJdGhpcy5hZGQoIGNhbWVyYVBYICk7CisKKwkJdmFyIGNhbWVyYU5YID0g
bmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CisJCWNhbWVy
YU5YLnVwLnNldCggMCwgLSAxLCAwICk7CisJCWNhbWVyYU5YLmxvb2tBdCggbmV3IFZlY3RvcjMo
IC0gMSwgMCwgMCApICk7CisJCXRoaXMuYWRkKCBjYW1lcmFOWCApOworCisJCXZhciBjYW1lcmFQ
WSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApOworCQlj
YW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTsKKwkJY2FtZXJhUFkubG9va0F0KCBuZXcgVmVjdG9y
MyggMCwgMSwgMCApICk7CisJCXRoaXMuYWRkKCBjYW1lcmFQWSApOworCisJCXZhciBjYW1lcmFO
WSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApOworCQlj
YW1lcmFOWS51cC5zZXQoIDAsIDAsIC0gMSApOworCQljYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0
b3IzKCAwLCAtIDEsIDAgKSApOworCQl0aGlzLmFkZCggY2FtZXJhTlkgKTsKKworCQl2YXIgY2Ft
ZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTsK
KwkJY2FtZXJhUFoudXAuc2V0KCAwLCAtIDEsIDAgKTsKKwkJY2FtZXJhUFoubG9va0F0KCBuZXcg
VmVjdG9yMyggMCwgMCwgMSApICk7CisJCXRoaXMuYWRkKCBjYW1lcmFQWiApOworCisJCXZhciBj
YW1lcmFOWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciAp
OworCQljYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApOworCQljYW1lcmFOWi5sb29rQXQoIG5l
dyBWZWN0b3IzKCAwLCAwLCAtIDEgKSApOworCQl0aGlzLmFkZCggY2FtZXJhTlogKTsKKworCQl2
YXIgb3B0aW9ucyA9IHsgZm9ybWF0OiBSR0JGb3JtYXQsIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVy
LCBtaW5GaWx0ZXI6IExpbmVhckZpbHRlciB9OworCisJCXRoaXMucmVuZGVyVGFyZ2V0ID0gbmV3
IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggY3ViZVJlc29sdXRpb24sIGN1YmVSZXNvbHV0aW9uLCBv
cHRpb25zICk7CisJCXRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9ICJDdWJlQ2FtZXJh
IjsKKworCQl0aGlzLnVwZGF0ZUN1YmVNYXAgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSAp
IHsKKworCQkJaWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHRoaXMudXBkYXRlTWF0cml4V29y
bGQoKTsKKworCQkJdmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0OworCQkJdmFy
IGdlbmVyYXRlTWlwbWFwcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwczsK
KworCQkJcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CisKKwkJ
CXJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDA7CisJCQlyZW5kZXJlci5yZW5kZXIoIHNj
ZW5lLCBjYW1lcmFQWCwgcmVuZGVyVGFyZ2V0ICk7CisKKwkJCXJlbmRlclRhcmdldC5hY3RpdmVD
dWJlRmFjZSA9IDE7CisJCQlyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWCwgcmVuZGVy
VGFyZ2V0ICk7CisKKwkJCXJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDI7CisJCQlyZW5k
ZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWSwgcmVuZGVyVGFyZ2V0ICk7CisKKwkJCXJlbmRl
clRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDM7CisJCQlyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBj
YW1lcmFOWSwgcmVuZGVyVGFyZ2V0ICk7CisKKwkJCXJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFj
ZSA9IDQ7CisJCQlyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWiwgcmVuZGVyVGFyZ2V0
ICk7CisKKwkJCXJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGdlbmVyYXRl
TWlwbWFwczsKKworCQkJcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gNTsKKwkJCXJlbmRl
cmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aLCByZW5kZXJUYXJnZXQgKTsKKworCQkJcmVuZGVy
ZXIuc2V0UmVuZGVyVGFyZ2V0KCBudWxsICk7CisKKwkJfTsKKworCX0KKworCUN1YmVDYW1lcmEu
cHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7CisJQ3ViZUNh
bWVyYS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJlQ2FtZXJhOworCisJLyoqCisJICogQGF1
dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIEF1ZGlv
TGlzdGVuZXIoKSB7CisKKwkJT2JqZWN0M0QuY2FsbCggdGhpcyApOworCisJCXRoaXMudHlwZSA9
ICdBdWRpb0xpc3RlbmVyJzsKKworCQl0aGlzLmNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29u
dGV4dCgpOworCisJCXRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7CisJCXRo
aXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTsKKworCQl0aGlzLmZp
bHRlciA9IG51bGw7CisKKwl9CisKKwlBdWRpb0xpc3RlbmVyLnByb3RvdHlwZSA9IE9iamVjdC5h
c3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CisKKwkJY29uc3Ry
dWN0b3I6IEF1ZGlvTGlzdGVuZXIsCisKKwkJZ2V0SW5wdXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJ
cmV0dXJuIHRoaXMuZ2FpbjsKKworCQl9LAorCisJCXJlbW92ZUZpbHRlcjogZnVuY3Rpb24gKCAp
IHsKKworCQkJaWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHsKKworCQkJCXRoaXMuZ2Fpbi5k
aXNjb25uZWN0KCB0aGlzLmZpbHRlciApOworCQkJCXRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRo
aXMuY29udGV4dC5kZXN0aW5hdGlvbiApOworCQkJCXRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNv
bnRleHQuZGVzdGluYXRpb24gKTsKKwkJCQl0aGlzLmZpbHRlciA9IG51bGw7CisKKwkJCX0KKwor
CQl9LAorCisJCWdldEZpbHRlcjogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5maWx0
ZXI7CisKKwkJfSwKKworCQlzZXRGaWx0ZXI6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCWlm
ICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7CisKKwkJCQl0aGlzLmdhaW4uZGlzY29ubmVjdCgg
dGhpcy5maWx0ZXIgKTsKKwkJCQl0aGlzLmZpbHRlci5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQu
ZGVzdGluYXRpb24gKTsKKworCQkJfSBlbHNlIHsKKworCQkJCXRoaXMuZ2Fpbi5kaXNjb25uZWN0
KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTsKKworCQkJfQorCisJCQl0aGlzLmZpbHRlciA9
IHZhbHVlOworCQkJdGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuZmlsdGVyICk7CisJCQl0aGlzLmZp
bHRlci5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTsKKworCQl9LAorCisJCWdl
dE1hc3RlclZvbHVtZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5nYWluLmdhaW4u
dmFsdWU7CisKKwkJfSwKKworCQlzZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7
CisKKwkJCXRoaXMuZ2Fpbi5nYWluLnZhbHVlID0gdmFsdWU7CisKKwkJfSwKKworCQl1cGRhdGVN
YXRyaXhXb3JsZDogKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBwb3NpdGlvbiA9IG5ldyBWZWN0
b3IzKCk7CisJCQl2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CisJCQl2YXIgc2Nh
bGUgPSBuZXcgVmVjdG9yMygpOworCisJCQl2YXIgb3JpZW50YXRpb24gPSBuZXcgVmVjdG9yMygp
OworCisJCQlyZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkgeworCisJ
CQkJT2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNl
ICk7CisKKwkJCQl2YXIgbGlzdGVuZXIgPSB0aGlzLmNvbnRleHQubGlzdGVuZXI7CisJCQkJdmFy
IHVwID0gdGhpcy51cDsKKworCQkJCXRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlv
biwgcXVhdGVybmlvbiwgc2NhbGUgKTsKKworCQkJCW9yaWVudGF0aW9uLnNldCggMCwgMCwgLSAx
ICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7CisKKwkJCQlpZiAoIGxpc3RlbmVyLnBv
c2l0aW9uWCApIHsKKworCQkJCQlsaXN0ZW5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoIHBv
c2l0aW9uLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOworCQkJCQlsaXN0ZW5lci5wb3Np
dGlvblkuc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGlt
ZSApOworCQkJCQlsaXN0ZW5lci5wb3NpdGlvblouc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLnos
IHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOworCQkJCQlsaXN0ZW5lci5mb3J3YXJkWC5zZXRW
YWx1ZUF0VGltZSggb3JpZW50YXRpb24ueCwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7CisJ
CQkJCWxpc3RlbmVyLmZvcndhcmRZLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi55LCB0aGlz
LmNvbnRleHQuY3VycmVudFRpbWUgKTsKKwkJCQkJbGlzdGVuZXIuZm9yd2FyZFouc2V0VmFsdWVB
dFRpbWUoIG9yaWVudGF0aW9uLnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOworCQkJCQls
aXN0ZW5lci51cFguc2V0VmFsdWVBdFRpbWUoIHVwLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGlt
ZSApOworCQkJCQlsaXN0ZW5lci51cFkuc2V0VmFsdWVBdFRpbWUoIHVwLnksIHRoaXMuY29udGV4
dC5jdXJyZW50VGltZSApOworCQkJCQlsaXN0ZW5lci51cFouc2V0VmFsdWVBdFRpbWUoIHVwLnos
IHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOworCisJCQkJfSBlbHNlIHsKKworCQkJCQlsaXN0
ZW5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApOwor
CQkJCQlsaXN0ZW5lci5zZXRPcmllbnRhdGlvbiggb3JpZW50YXRpb24ueCwgb3JpZW50YXRpb24u
eSwgb3JpZW50YXRpb24ueiwgdXAueCwgdXAueSwgdXAueiApOworCisJCQkJfQorCisJCQl9Owor
CisJCX0gKSgpCisKKwl9ICk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9t
cmRvb2IuY29tLworCSAqIEBhdXRob3IgUmVlY2UgQWFyb24gTGVjcml2YWluIC8gaHR0cDovL3Jl
ZWNlbm90ZXMuY29tLworCSAqLworCisJZnVuY3Rpb24gQXVkaW8oIGxpc3RlbmVyICkgeworCisJ
CU9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5cGUgPSAnQXVkaW8nOworCisJCXRo
aXMuY29udGV4dCA9IGxpc3RlbmVyLmNvbnRleHQ7CisKKwkJdGhpcy5nYWluID0gdGhpcy5jb250
ZXh0LmNyZWF0ZUdhaW4oKTsKKwkJdGhpcy5nYWluLmNvbm5lY3QoIGxpc3RlbmVyLmdldElucHV0
KCkgKTsKKworCQl0aGlzLmF1dG9wbGF5ID0gZmFsc2U7CisKKwkJdGhpcy5idWZmZXIgPSBudWxs
OworCQl0aGlzLmxvb3AgPSBmYWxzZTsKKwkJdGhpcy5zdGFydFRpbWUgPSAwOworCQl0aGlzLnBs
YXliYWNrUmF0ZSA9IDE7CisJCXRoaXMuaXNQbGF5aW5nID0gZmFsc2U7CisJCXRoaXMuaGFzUGxh
eWJhY2tDb250cm9sID0gdHJ1ZTsKKwkJdGhpcy5zb3VyY2VUeXBlID0gJ2VtcHR5JzsKKworCQl0
aGlzLmZpbHRlcnMgPSBbXTsKKworCX0KKworCUF1ZGlvLnByb3RvdHlwZSA9IE9iamVjdC5hc3Np
Z24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0
b3I6IEF1ZGlvLAorCisJCWdldE91dHB1dDogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhp
cy5nYWluOworCisJCX0sCisKKwkJc2V0Tm9kZVNvdXJjZTogZnVuY3Rpb24gKCBhdWRpb05vZGUg
KSB7CisKKwkJCXRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gZmFsc2U7CisJCQl0aGlzLnNvdXJj
ZVR5cGUgPSAnYXVkaW9Ob2RlJzsKKwkJCXRoaXMuc291cmNlID0gYXVkaW9Ob2RlOworCQkJdGhp
cy5jb25uZWN0KCk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0QnVmZmVyOiBm
dW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkgeworCisJCQl0aGlzLmJ1ZmZlciA9IGF1ZGlvQnVmZmVy
OworCQkJdGhpcy5zb3VyY2VUeXBlID0gJ2J1ZmZlcic7CisKKwkJCWlmICggdGhpcy5hdXRvcGxh
eSApIHRoaXMucGxheSgpOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXBsYXk6IGZ1
bmN0aW9uICgpIHsKKworCQkJaWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHsKKworCQkJ
CWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiBBdWRpbyBpcyBhbHJlYWR5IHBsYXlpbmcuJyAp
OworCQkJCXJldHVybjsKKworCQkJfQorCisJCQlpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9s
ID09PSBmYWxzZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1
ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTsKKwkJCQlyZXR1cm47CisKKwkJCX0KKwor
CQkJdmFyIHNvdXJjZSA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTsKKworCQkJ
c291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyOworCQkJc291cmNlLmxvb3AgPSB0aGlzLmxvb3A7
CisJCQlzb3VyY2Uub25lbmRlZCA9IHRoaXMub25FbmRlZC5iaW5kKCB0aGlzICk7CisJCQlzb3Vy
Y2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKCB0aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5z
dGFydFRpbWUgKTsKKwkJCXNvdXJjZS5zdGFydCggMCwgdGhpcy5zdGFydFRpbWUgKTsKKworCQkJ
dGhpcy5pc1BsYXlpbmcgPSB0cnVlOworCisJCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKworCQkJ
cmV0dXJuIHRoaXMuY29ubmVjdCgpOworCisJCX0sCisKKwkJcGF1c2U6IGZ1bmN0aW9uICgpIHsK
KworCQkJaWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7CisKKwkJCQlj
b25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29u
dHJvbC4nICk7CisJCQkJcmV0dXJuOworCisJCQl9CisKKwkJCXRoaXMuc291cmNlLnN0b3AoKTsK
KwkJCXRoaXMuc3RhcnRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lOworCQkJdGhpcy5p
c1BsYXlpbmcgPSBmYWxzZTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlzdG9wOiBm
dW5jdGlvbiAoKSB7CisKKwkJCWlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNl
ICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5v
IHBsYXliYWNrIGNvbnRyb2wuJyApOworCQkJCXJldHVybjsKKworCQkJfQorCisJCQl0aGlzLnNv
dXJjZS5zdG9wKCk7CisJCQl0aGlzLnN0YXJ0VGltZSA9IDA7CisJCQl0aGlzLmlzUGxheWluZyA9
IGZhbHNlOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNvbm5lY3Q6IGZ1bmN0aW9u
ICgpIHsKKworCQkJaWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHsKKworCQkJCXRoaXMu
c291cmNlLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7CisKKwkJCQlmb3IgKCB2YXIgaSA9
IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCQl0aGlz
LmZpbHRlcnNbIGkgLSAxIF0uY29ubmVjdCggdGhpcy5maWx0ZXJzWyBpIF0gKTsKKworCQkJCX0K
KworCQkJCXRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5jb25uZWN0KCB0
aGlzLmdldE91dHB1dCgpICk7CisKKwkJCX0gZWxzZSB7CisKKwkJCQl0aGlzLnNvdXJjZS5jb25u
ZWN0KCB0aGlzLmdldE91dHB1dCgpICk7CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJ
fSwKKworCQlkaXNjb25uZWN0OiBmdW5jdGlvbiAoKSB7CisKKwkJCWlmICggdGhpcy5maWx0ZXJz
Lmxlbmd0aCA+IDAgKSB7CisKKwkJCQl0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmZpbHRl
cnNbIDAgXSApOworCisJCQkJZm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0
aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJdGhpcy5maWx0ZXJzWyBpIC0gMSBdLmRpc2Nvbm5l
Y3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7CisKKwkJCQl9CisKKwkJCQl0aGlzLmZpbHRlcnNbIHRo
aXMuZmlsdGVycy5sZW5ndGggLSAxIF0uZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApOwor
CisJCQl9IGVsc2UgeworCisJCQkJdGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5nZXRPdXRw
dXQoKSApOworCisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJZ2V0RmlsdGVy
czogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5maWx0ZXJzOworCisJCX0sCisKKwkJ
c2V0RmlsdGVyczogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJaWYgKCAhIHZhbHVlICkgdmFs
dWUgPSBbXTsKKworCQkJaWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHsKKworCQkJCXRo
aXMuZGlzY29ubmVjdCgpOworCQkJCXRoaXMuZmlsdGVycyA9IHZhbHVlOworCQkJCXRoaXMuY29u
bmVjdCgpOworCisJCQl9IGVsc2UgeworCisJCQkJdGhpcy5maWx0ZXJzID0gdmFsdWU7CisKKwkJ
CX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlnZXRGaWx0ZXI6IGZ1bmN0aW9uICgp
IHsKKworCQkJcmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWyAwIF07CisKKwkJfSwKKworCQlzZXRG
aWx0ZXI6IGZ1bmN0aW9uICggZmlsdGVyICkgeworCisJCQlyZXR1cm4gdGhpcy5zZXRGaWx0ZXJz
KCBmaWx0ZXIgPyBbIGZpbHRlciBdIDogW10gKTsKKworCQl9LAorCisJCXNldFBsYXliYWNrUmF0
ZTogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJaWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJv
bCA9PT0gZmFsc2UgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBB
dWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7CisJCQkJcmV0dXJuOworCisJCQl9CisK
KwkJCXRoaXMucGxheWJhY2tSYXRlID0gdmFsdWU7CisKKwkJCWlmICggdGhpcy5pc1BsYXlpbmcg
PT09IHRydWUgKSB7CisKKwkJCQl0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRp
bWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTsKKworCQkJ
fQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWdldFBsYXliYWNrUmF0ZTogZnVuY3Rp
b24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU7CisKKwkJfSwKKworCQlvbkVu
ZGVkOiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMuaXNQbGF5aW5nID0gZmFsc2U7CisKKwkJfSwK
KworCQlnZXRMb29wOiBmdW5jdGlvbiAoKSB7CisKKwkJCWlmICggdGhpcy5oYXNQbGF5YmFja0Nv
bnRyb2wgPT09IGZhbHNlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRo
aXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApOworCQkJCXJldHVybiBmYWxzZTsK
KworCQkJfQorCisJCQlyZXR1cm4gdGhpcy5sb29wOworCisJCX0sCisKKwkJc2V0TG9vcDogZnVu
Y3Rpb24gKCB2YWx1ZSApIHsKKworCQkJaWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0g
ZmFsc2UgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBo
YXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7CisJCQkJcmV0dXJuOworCisJCQl9CisKKwkJCXRo
aXMubG9vcCA9IHZhbHVlOworCisJCQlpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkgewor
CisJCQkJdGhpcy5zb3VyY2UubG9vcCA9IHRoaXMubG9vcDsKKworCQkJfQorCisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCWdldFZvbHVtZTogZnVuY3Rpb24gKCkgeworCisJCQlyZXR1cm4g
dGhpcy5nYWluLmdhaW4udmFsdWU7CisKKwkJfSwKKwkJCisJCXNldFZvbHVtZTogZnVuY3Rpb24g
KCB2YWx1ZSApIHsKKworCQkJdGhpcy5nYWluLmdhaW4udmFsdWUgPSB2YWx1ZTsKKworCQkJcmV0
dXJuIHRoaXM7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBo
dHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFBvc2l0aW9uYWxBdWRpbyggbGlz
dGVuZXIgKSB7CisKKwkJQXVkaW8uY2FsbCggdGhpcywgbGlzdGVuZXIgKTsKKworCQl0aGlzLnBh
bm5lciA9IHRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTsKKwkJdGhpcy5wYW5uZXIuY29ubmVj
dCggdGhpcy5nYWluICk7CisKKwl9CisKKwlQb3NpdGlvbmFsQXVkaW8ucHJvdG90eXBlID0gT2Jq
ZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQXVkaW8ucHJvdG90eXBlICksIHsKKworCQljb25z
dHJ1Y3RvcjogUG9zaXRpb25hbEF1ZGlvLAorCisJCWdldE91dHB1dDogZnVuY3Rpb24gKCkgewor
CisJCQlyZXR1cm4gdGhpcy5wYW5uZXI7CisKKwkJfSwKKworCQlnZXRSZWZEaXN0YW5jZTogZnVu
Y3Rpb24gKCkgeworCisJCQlyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2U7CisKKwkJfSwK
KworCQlzZXRSZWZEaXN0YW5jZTogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJdGhpcy5wYW5u
ZXIucmVmRGlzdGFuY2UgPSB2YWx1ZTsKKworCQl9LAorCisJCWdldFJvbGxvZmZGYWN0b3I6IGZ1
bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I7CisKKwkJ
fSwKKworCQlzZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQl0aGlz
LnBhbm5lci5yb2xsb2ZmRmFjdG9yID0gdmFsdWU7CisKKwkJfSwKKworCQlnZXREaXN0YW5jZU1v
ZGVsOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVs
OworCisJCX0sCisKKwkJc2V0RGlzdGFuY2VNb2RlbDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKwor
CQkJdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHZhbHVlOworCisJCX0sCisKKwkJZ2V0TWF4
RGlzdGFuY2U6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHRoaXMucGFubmVyLm1heERpc3Rh
bmNlOworCisJCX0sCisKKwkJc2V0TWF4RGlzdGFuY2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisK
KwkJCXRoaXMucGFubmVyLm1heERpc3RhbmNlID0gdmFsdWU7CisKKwkJfSwKKworCQl1cGRhdGVN
YXRyaXhXb3JsZDogKCBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBwb3NpdGlvbiA9IG5ldyBWZWN0
b3IzKCk7CisKKwkJCXJldHVybiBmdW5jdGlvbiB1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7
CisKKwkJCQlPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywg
Zm9yY2UgKTsKKworCQkJCXBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRy
aXhXb3JsZCApOworCisJCQkJdGhpcy5wYW5uZXIuc2V0UG9zaXRpb24oIHBvc2l0aW9uLngsIHBv
c2l0aW9uLnksIHBvc2l0aW9uLnogKTsKKworCQkJfTsKKworCQl9ICkoKQorCisKKwl9ICk7CisK
KwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJ
ZnVuY3Rpb24gQXVkaW9BbmFseXNlciggYXVkaW8sIGZmdFNpemUgKSB7CisKKwkJdGhpcy5hbmFs
eXNlciA9IGF1ZGlvLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTsKKwkJdGhpcy5hbmFseXNlci5m
ZnRTaXplID0gZmZ0U2l6ZSAhPT0gdW5kZWZpbmVkID8gZmZ0U2l6ZSA6IDIwNDg7CisKKwkJdGhp
cy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoIHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQg
KTsKKworCQlhdWRpby5nZXRPdXRwdXQoKS5jb25uZWN0KCB0aGlzLmFuYWx5c2VyICk7CisKKwl9
CisKKwlPYmplY3QuYXNzaWduKCBBdWRpb0FuYWx5c2VyLnByb3RvdHlwZSwgeworCisJCWdldEZy
ZXF1ZW5jeURhdGE6IGZ1bmN0aW9uICgpIHsKKworCQkJdGhpcy5hbmFseXNlci5nZXRCeXRlRnJl
cXVlbmN5RGF0YSggdGhpcy5kYXRhICk7CisKKwkJCXJldHVybiB0aGlzLmRhdGE7CisKKwkJfSwK
KworCQlnZXRBdmVyYWdlRnJlcXVlbmN5OiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciB2YWx1ZSA9
IDAsIGRhdGEgPSB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTsKKworCQkJZm9yICggdmFyIGkgPSAw
OyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7CisKKwkJCQl2YWx1ZSArPSBkYXRhWyBpIF07CisK
KwkJCX0KKworCQkJcmV0dXJuIHZhbHVlIC8gZGF0YS5sZW5ndGg7CisKKwkJfQorCisJfSApOwor
CisJLyoqCisJICoKKwkgKiBCdWZmZXJlZCBzY2VuZSBncmFwaCBwcm9wZXJ0eSB0aGF0IGFsbG93
cyB3ZWlnaHRlZCBhY2N1bXVsYXRpb24uCisJICoKKwkgKgorCSAqIEBhdXRob3IgQmVuIEhvdXN0
b24gLyBodHRwOi8vY2xhcmEuaW8vCisJICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9s
aWdodGhhdXMudXMvCisJICogQGF1dGhvciB0c2NodworCSAqLworCisJZnVuY3Rpb24gUHJvcGVy
dHlNaXhlciggYmluZGluZywgdHlwZU5hbWUsIHZhbHVlU2l6ZSApIHsKKworCQl0aGlzLmJpbmRp
bmcgPSBiaW5kaW5nOworCQl0aGlzLnZhbHVlU2l6ZSA9IHZhbHVlU2l6ZTsKKworCQl2YXIgYnVm
ZmVyVHlwZSA9IEZsb2F0NjRBcnJheSwKKwkJCW1peEZ1bmN0aW9uOworCisJCXN3aXRjaCAoIHR5
cGVOYW1lICkgeworCisJCQljYXNlICdxdWF0ZXJuaW9uJzoKKwkJCQltaXhGdW5jdGlvbiA9IHRo
aXMuX3NsZXJwOworCQkJCWJyZWFrOworCisJCQljYXNlICdzdHJpbmcnOgorCQkJY2FzZSAnYm9v
bCc6CisJCQkJYnVmZmVyVHlwZSA9IEFycmF5OworCQkJCW1peEZ1bmN0aW9uID0gdGhpcy5fc2Vs
ZWN0OworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCW1peEZ1bmN0aW9uID0gdGhpcy5f
bGVycDsKKworCQl9CisKKwkJdGhpcy5idWZmZXIgPSBuZXcgYnVmZmVyVHlwZSggdmFsdWVTaXpl
ICogNCApOworCQkvLyBsYXlvdXQ6IFsgaW5jb21pbmcgfCBhY2N1MCB8IGFjY3UxIHwgb3JpZyBd
CisJCS8vCisJCS8vIGludGVycG9sYXRvcnMgY2FuIHVzZSAuYnVmZmVyIGFzIHRoZWlyIC5yZXN1
bHQKKwkJLy8gdGhlIGRhdGEgdGhlbiBnb2VzIHRvICdpbmNvbWluZycKKwkJLy8KKwkJLy8gJ2Fj
Y3UwJyBhbmQgJ2FjY3UxJyBhcmUgdXNlZCBmcmFtZS1pbnRlcmxlYXZlZCBmb3IKKwkJLy8gdGhl
IGN1bXVsYXRpdmUgcmVzdWx0IGFuZCBhcmUgY29tcGFyZWQgdG8gZGV0ZWN0CisJCS8vIGNoYW5n
ZXMKKwkJLy8KKwkJLy8gJ29yaWcnIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHBy
b3BlcnR5CisKKwkJdGhpcy5fbWl4QnVmZmVyUmVnaW9uID0gbWl4RnVuY3Rpb247CisKKwkJdGhp
cy5jdW11bGF0aXZlV2VpZ2h0ID0gMDsKKworCQl0aGlzLnVzZUNvdW50ID0gMDsKKwkJdGhpcy5y
ZWZlcmVuY2VDb3VudCA9IDA7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBQcm9wZXJ0eU1peGVy
LnByb3RvdHlwZSwgeworCisJCS8vIGFjY3VtdWxhdGUgZGF0YSBpbiB0aGUgJ2luY29taW5nJyBy
ZWdpb24gaW50byAnYWNjdTxpPicKKwkJYWNjdW11bGF0ZTogZnVuY3Rpb24gKCBhY2N1SW5kZXgs
IHdlaWdodCApIHsKKworCQkJLy8gbm90ZTogaGFwcGlseSBhY2N1bXVsYXRpbmcgbm90aGluZyB3
aGVuIHdlaWdodCA9IDAsIHRoZSBjYWxsZXIga25vd3MKKwkJCS8vIHRoZSB3ZWlnaHQgYW5kIHNo
b3VsZG4ndCBoYXZlIG1hZGUgdGhlIGNhbGwgaW4gdGhlIGZpcnN0IHBsYWNlCisKKwkJCXZhciBi
dWZmZXIgPSB0aGlzLmJ1ZmZlciwKKwkJCQlzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKKwkJCQlv
ZmZzZXQgPSBhY2N1SW5kZXggKiBzdHJpZGUgKyBzdHJpZGUsCisKKwkJCQljdXJyZW50V2VpZ2h0
ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0OworCisJCQlpZiAoIGN1cnJlbnRXZWlnaHQgPT09IDAg
KSB7CisKKwkJCQkvLyBhY2N1TiA6PSBpbmNvbWluZyAqIHdlaWdodAorCisJCQkJZm9yICggdmFy
IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7CisKKwkJCQkJYnVmZmVyWyBvZmZzZXQgKyBp
IF0gPSBidWZmZXJbIGkgXTsKKworCQkJCX0KKworCQkJCWN1cnJlbnRXZWlnaHQgPSB3ZWlnaHQ7
CisKKwkJCX0gZWxzZSB7CisKKwkJCQkvLyBhY2N1TiA6PSBhY2N1TiArIGluY29taW5nICogd2Vp
Z2h0CisKKwkJCQljdXJyZW50V2VpZ2h0ICs9IHdlaWdodDsKKwkJCQl2YXIgbWl4ID0gd2VpZ2h0
IC8gY3VycmVudFdlaWdodDsKKwkJCQl0aGlzLl9taXhCdWZmZXJSZWdpb24oIGJ1ZmZlciwgb2Zm
c2V0LCAwLCBtaXgsIHN0cmlkZSApOworCisJCQl9CisKKwkJCXRoaXMuY3VtdWxhdGl2ZVdlaWdo
dCA9IGN1cnJlbnRXZWlnaHQ7CisKKwkJfSwKKworCQkvLyBhcHBseSB0aGUgc3RhdGUgb2YgJ2Fj
Y3U8aT4nIHRvIHRoZSBiaW5kaW5nIHdoZW4gYWNjdXMgZGlmZmVyCisJCWFwcGx5OiBmdW5jdGlv
biAoIGFjY3VJbmRleCApIHsKKworCQkJdmFyIHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLAorCQkJ
CWJ1ZmZlciA9IHRoaXMuYnVmZmVyLAorCQkJCW9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSAr
IHN0cmlkZSwKKworCQkJCXdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodCwKKworCQkJCWJp
bmRpbmcgPSB0aGlzLmJpbmRpbmc7CisKKwkJCXRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7CisK
KwkJCWlmICggd2VpZ2h0IDwgMSApIHsKKworCQkJCS8vIGFjY3VOIDo9IGFjY3VOICsgb3JpZ2lu
YWwgKiAoIDEgLSBjdW11bGF0aXZlV2VpZ2h0ICkKKworCQkJCXZhciBvcmlnaW5hbFZhbHVlT2Zm
c2V0ID0gc3RyaWRlICogMzsKKworCQkJCXRoaXMuX21peEJ1ZmZlclJlZ2lvbigKKwkJCQkJYnVm
ZmVyLCBvZmZzZXQsIG9yaWdpbmFsVmFsdWVPZmZzZXQsIDEgLSB3ZWlnaHQsIHN0cmlkZSApOwor
CisJCQl9CisKKwkJCWZvciAoIHZhciBpID0gc3RyaWRlLCBlID0gc3RyaWRlICsgc3RyaWRlOyBp
ICE9PSBlOyArKyBpICkgeworCisJCQkJaWYgKCBidWZmZXJbIGkgXSAhPT0gYnVmZmVyWyBpICsg
c3RyaWRlIF0gKSB7CisKKwkJCQkJLy8gdmFsdWUgaGFzIGNoYW5nZWQgLT4gdXBkYXRlIHNjZW5l
IGdyYXBoCisKKwkJCQkJYmluZGluZy5zZXRWYWx1ZSggYnVmZmVyLCBvZmZzZXQgKTsKKwkJCQkJ
YnJlYWs7CisKKwkJCQl9CisKKwkJCX0KKworCQl9LAorCisJCS8vIHJlbWVtYmVyIHRoZSBzdGF0
ZSBvZiB0aGUgYm91bmQgcHJvcGVydHkgYW5kIGNvcHkgaXQgdG8gYm90aCBhY2N1cworCQlzYXZl
T3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkgeworCisJCQl2YXIgYmluZGluZyA9IHRoaXMuYmlu
ZGluZzsKKworCQkJdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyLAorCQkJCXN0cmlkZSA9IHRoaXMu
dmFsdWVTaXplLAorCisJCQkJb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7CisKKwkJ
CWJpbmRpbmcuZ2V0VmFsdWUoIGJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApOworCisJCQkv
LyBhY2N1WzAuLjFdIDo9IG9yaWcgLS0gaW5pdGlhbGx5IGRldGVjdCBjaGFuZ2VzIGFnYWluc3Qg
dGhlIG9yaWdpbmFsCisJCQlmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IG9yaWdpbmFsVmFsdWVP
ZmZzZXQ7IGkgIT09IGU7ICsrIGkgKSB7CisKKwkJCQlidWZmZXJbIGkgXSA9IGJ1ZmZlclsgb3Jp
Z2luYWxWYWx1ZU9mZnNldCArICggaSAlIHN0cmlkZSApIF07CisKKwkJCX0KKworCQkJdGhpcy5j
dW11bGF0aXZlV2VpZ2h0ID0gMDsKKworCQl9LAorCisJCS8vIGFwcGx5IHRoZSBzdGF0ZSBwcmV2
aW91c2x5IHRha2VuIHZpYSAnc2F2ZU9yaWdpbmFsU3RhdGUnIHRvIHRoZSBiaW5kaW5nCisJCXJl
c3RvcmVPcmlnaW5hbFN0YXRlOiBmdW5jdGlvbiAoKSB7CisKKwkJCXZhciBvcmlnaW5hbFZhbHVl
T2Zmc2V0ID0gdGhpcy52YWx1ZVNpemUgKiAzOworCQkJdGhpcy5iaW5kaW5nLnNldFZhbHVlKCB0
aGlzLmJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApOworCisJCX0sCisKKworCQkvLyBtaXgg
ZnVuY3Rpb25zCisKKwkJX3NlbGVjdDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3Jj
T2Zmc2V0LCB0LCBzdHJpZGUgKSB7CisKKwkJCWlmICggdCA+PSAwLjUgKSB7CisKKwkJCQlmb3Ig
KCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHsKKworCQkJCQlidWZmZXJbIGRzdE9m
ZnNldCArIGkgXSA9IGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdOworCisJCQkJfQorCisJCQl9CisK
KwkJfSwKKworCQlfc2xlcnA6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNl
dCwgdCApIHsKKworCQkJUXVhdGVybmlvbi5zbGVycEZsYXQoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBi
dWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBzcmNPZmZzZXQsIHQgKTsKKworCQl9LAorCisJCV9s
ZXJwOiBmdW5jdGlvbiAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSAp
IHsKKworCQkJdmFyIHMgPSAxIC0gdDsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJp
ZGU7ICsrIGkgKSB7CisKKwkJCQl2YXIgaiA9IGRzdE9mZnNldCArIGk7CisKKwkJCQlidWZmZXJb
IGogXSA9IGJ1ZmZlclsgaiBdICogcyArIGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdICogdDsKKwor
CQkJfQorCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqCisJICogQSByZWZlcmVuY2UgdG8gYSBy
ZWFsIHByb3BlcnR5IGluIHRoZSBzY2VuZSBncmFwaC4KKwkgKgorCSAqCisJICogQGF1dGhvciBC
ZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KKwkgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8g
aHR0cDovL2xpZ2h0aGF1cy51cy8KKwkgKiBAYXV0aG9yIHRzY2h3CisJICovCisKKwlmdW5jdGlv
biBDb21wb3NpdGUoIHRhcmdldEdyb3VwLCBwYXRoLCBvcHRpb25hbFBhcnNlZFBhdGggKSB7CisK
KwkJdmFyIHBhcnNlZFBhdGggPSBvcHRpb25hbFBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5n
LnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7CisKKwkJdGhpcy5fdGFyZ2V0R3JvdXAgPSB0YXJnZXRH
cm91cDsKKwkJdGhpcy5fYmluZGluZ3MgPSB0YXJnZXRHcm91cC5zdWJzY3JpYmVfKCBwYXRoLCBw
YXJzZWRQYXRoICk7CisKKwl9CisKKwlPYmplY3QuYXNzaWduKCBDb21wb3NpdGUucHJvdG90eXBl
LCB7CisKKwkJZ2V0VmFsdWU6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKKworCQkJdGhp
cy5iaW5kKCk7IC8vIGJpbmQgYWxsIGJpbmRpbmcKKworCQkJdmFyIGZpcnN0VmFsaWRJbmRleCA9
IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywKKwkJCQliaW5kaW5nID0gdGhpcy5f
YmluZGluZ3NbIGZpcnN0VmFsaWRJbmRleCBdOworCisJCQkvLyBhbmQgb25seSBjYWxsIC5nZXRW
YWx1ZSBvbiB0aGUgZmlyc3QKKwkJCWlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkgYmluZGlu
Zy5nZXRWYWx1ZSggYXJyYXksIG9mZnNldCApOworCisJCX0sCisKKwkJc2V0VmFsdWU6IGZ1bmN0
aW9uICggYXJyYXksIG9mZnNldCApIHsKKworCQkJdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGlu
Z3M7CisKKwkJCWZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNf
LAorCQkJCQkgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKwkJCQli
aW5kaW5nc1sgaSBdLnNldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7CisKKwkJCX0KKworCQl9LAor
CisJCWJpbmQ6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGlu
Z3M7CisKKwkJCWZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNf
LAorCQkJCQkgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKwkJCQli
aW5kaW5nc1sgaSBdLmJpbmQoKTsKKworCQkJfQorCisJCX0sCisKKwkJdW5iaW5kOiBmdW5jdGlv
biAoKSB7CisKKwkJCXZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzOworCisJCQlmb3IgKCB2
YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywKKwkJCQkJICBuID0gYmlu
ZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisJCQkJYmluZGluZ3NbIGkgXS51bmJp
bmQoKTsKKworCQkJfQorCisJCX0KKworCX0gKTsKKworCisJZnVuY3Rpb24gUHJvcGVydHlCaW5k
aW5nKCByb290Tm9kZSwgcGF0aCwgcGFyc2VkUGF0aCApIHsKKworCQl0aGlzLnBhdGggPSBwYXRo
OworCQl0aGlzLnBhcnNlZFBhdGggPSBwYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJz
ZVRyYWNrTmFtZSggcGF0aCApOworCisJCXRoaXMubm9kZSA9IFByb3BlcnR5QmluZGluZy5maW5k
Tm9kZSggcm9vdE5vZGUsIHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHJvb3ROb2RlOwor
CisJCXRoaXMucm9vdE5vZGUgPSByb290Tm9kZTsKKworCX0KKworCU9iamVjdC5hc3NpZ24oIFBy
b3BlcnR5QmluZGluZywgeworCisJCUNvbXBvc2l0ZTogQ29tcG9zaXRlLAorCisJCWNyZWF0ZTog
ZnVuY3Rpb24gKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICkgeworCisJCQlpZiAoICEgKCByb290
ICYmIHJvb3QuaXNBbmltYXRpb25PYmplY3RHcm91cCApICkgeworCisJCQkJcmV0dXJuIG5ldyBQ
cm9wZXJ0eUJpbmRpbmcoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTsKKworCQkJfSBlbHNlIHsK
KworCQkJCXJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZSggcm9vdCwgcGF0aCwg
cGFyc2VkUGF0aCApOworCisJCQl9CisKKwkJfSwKKworCQkvKioKKwkJICogUmVwbGFjZXMgc3Bh
Y2VzIHdpdGggdW5kZXJzY29yZXMgYW5kIHJlbW92ZXMgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycyBm
cm9tCisJCSAqIG5vZGUgbmFtZXMsIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggcGFyc2VU
cmFja05hbWUoKS4KKwkJICoKKwkJICogQHBhcmFtICB7c3RyaW5nfSBuYW1lIE5vZGUgbmFtZSB0
byBiZSBzYW5pdGl6ZWQuCisJCSAqIEByZXR1cm4ge3N0cmluZ30KKwkJICovCisJCXNhbml0aXpl
Tm9kZU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHsKKworCQkJcmV0dXJuIG5hbWUucmVwbGFjZSgg
L1xzL2csICdfJyApLnJlcGxhY2UoIC9bXlx3LV0vZywgJycgKTsKKworCQl9LAorCisJCXBhcnNl
VHJhY2tOYW1lOiBmdW5jdGlvbiAoKSB7CisKKwkJCS8vIFBhcmVudCBkaXJlY3RvcmllcywgZGVs
aW1pdGVkIGJ5ICcvJyBvciAnOicuIEN1cnJlbnRseSB1bnVzZWQsIGJ1dCBtdXN0CisJCQkvLyBi
ZSBtYXRjaGVkIHRvIHBhcnNlIHRoZSByZXN0IG9mIHRoZSB0cmFjayBuYW1lLgorCQkJdmFyIGRp
cmVjdG9yeVJlID0gLygoPzpbXHctXStbXC86XSkqKS87CisKKwkJCS8vIFRhcmdldCBub2RlLiBN
YXkgY29udGFpbiB3b3JkIGNoYXJhY3RlcnMgKGEtekEtWjAtOV8pIGFuZCAnLicgb3IgJy0nLgor
CQkJdmFyIG5vZGVSZSA9IC8oW1x3LVwuXSspPy87CisKKwkJCS8vIE9iamVjdCBvbiB0YXJnZXQg
bm9kZSwgYW5kIGFjY2Vzc29yLiBOYW1lIG1heSBjb250YWluIG9ubHkgd29yZAorCQkJLy8gY2hh
cmFjdGVycy4gQWNjZXNzb3IgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlciBleGNlcHQgY2xvc2lu
ZyBicmFja2V0LgorCQkJdmFyIG9iamVjdFJlID0gLyg/OlwuKFtcdy1dKykoPzpcWyguKylcXSk/
KT8vOworCisJCQkvLyBQcm9wZXJ0eSBhbmQgYWNjZXNzb3IuIE1heSBjb250YWluIG9ubHkgd29y
ZCBjaGFyYWN0ZXJzLiBBY2Nlc3NvciBtYXkKKwkJCS8vIGNvbnRhaW4gYW55IG5vbi1icmFja2V0
IGNoYXJhY3RlcnMuCisJCQl2YXIgcHJvcGVydHlSZSA9IC9cLihbXHctXSspKD86XFsoLispXF0p
Py87CisKKwkJCXZhciB0cmFja1JlID0gbmV3IFJlZ0V4cCgnJworCQkJCSsgJ14nCisJCQkJKyBk
aXJlY3RvcnlSZS5zb3VyY2UKKwkJCQkrIG5vZGVSZS5zb3VyY2UKKwkJCQkrIG9iamVjdFJlLnNv
dXJjZQorCQkJCSsgcHJvcGVydHlSZS5zb3VyY2UKKwkJCQkrICckJworCQkJKTsKKworCQkJdmFy
IHN1cHBvcnRlZE9iamVjdE5hbWVzID0gWyAnbWF0ZXJpYWwnLCAnbWF0ZXJpYWxzJywgJ2JvbmVz
JyBdOworCisJCQlyZXR1cm4gZnVuY3Rpb24gKCB0cmFja05hbWUgKSB7CisKKwkJCQkJdmFyIG1h
dGNoZXMgPSB0cmFja1JlLmV4ZWMoIHRyYWNrTmFtZSApOworCisJCQkJCWlmICggISBtYXRjaGVz
ICkgeworCisJCQkJCQl0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBw
YXJzZSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTsKKworCQkJCQl9CisKKwkJCQkJdmFyIHJl
c3VsdHMgPSB7CisJCQkJCQkvLyBkaXJlY3RvcnlOYW1lOiBtYXRjaGVzWyAxIF0sIC8vICh0c2No
dykgY3VycmVudGx5IHVudXNlZAorCQkJCQkJbm9kZU5hbWU6IG1hdGNoZXNbIDIgXSwKKwkJCQkJ
CW9iamVjdE5hbWU6IG1hdGNoZXNbIDMgXSwKKwkJCQkJCW9iamVjdEluZGV4OiBtYXRjaGVzWyA0
IF0sCisJCQkJCQlwcm9wZXJ0eU5hbWU6IG1hdGNoZXNbIDUgXSwgICAgIC8vIHJlcXVpcmVkCisJ
CQkJCQlwcm9wZXJ0eUluZGV4OiBtYXRjaGVzWyA2IF0KKwkJCQkJfTsKKworCQkJCQl2YXIgbGFz
dERvdCA9IHJlc3VsdHMubm9kZU5hbWUgJiYgcmVzdWx0cy5ub2RlTmFtZS5sYXN0SW5kZXhPZigg
Jy4nICk7CisKKwkJCQkJaWYgKCBsYXN0RG90ICE9PSB1bmRlZmluZWQgJiYgbGFzdERvdCAhPT0g
LTEgKSB7CisKKwkJCQkJCXZhciBvYmplY3ROYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJp
bmcoIGxhc3REb3QgKyAxICk7CisKKwkJCQkJCS8vIE9iamVjdCBuYW1lcyBtdXN0IGJlIGNoZWNr
ZWQgYWdhaW5zdCBhIHdoaXRlbGlzdC4gT3RoZXJ3aXNlLCB0aGVyZQorCQkJCQkJLy8gaXMgbm8g
d2F5IHRvIHBhcnNlICdmb28uYmFyLmJheic6ICdiYXonIG11c3QgYmUgYSBwcm9wZXJ0eSwgYnV0
CisJCQkJCQkvLyAnYmFyJyBjb3VsZCBiZSB0aGUgb2JqZWN0TmFtZSwgb3IgcGFydCBvZiBhIG5v
ZGVOYW1lICh3aGljaCBjYW4KKwkJCQkJCS8vIGluY2x1ZGUgJy4nIGNoYXJhY3RlcnMpLgorCQkJ
CQkJaWYgKCBzdXBwb3J0ZWRPYmplY3ROYW1lcy5pbmRleE9mKCBvYmplY3ROYW1lICkgIT09IC0x
ICkgeworCisJCQkJCQkJcmVzdWx0cy5ub2RlTmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3Ry
aW5nKCAwLCBsYXN0RG90ICk7CisJCQkJCQkJcmVzdWx0cy5vYmplY3ROYW1lID0gb2JqZWN0TmFt
ZTsKKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCQlpZiAoIHJlc3VsdHMucHJvcGVydHlOYW1l
ID09PSBudWxsIHx8IHJlc3VsdHMucHJvcGVydHlOYW1lLmxlbmd0aCA9PT0gMCApIHsKKworCQkJ
CQkJdGhyb3cgbmV3IEVycm9yKCAnUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3Bl
cnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApOworCisJCQkJCX0KKworCQkJ
CQlyZXR1cm4gcmVzdWx0czsKKworCQkJCX07CisKKwkJfSgpLAorCisJCWZpbmROb2RlOiBmdW5j
dGlvbiAoIHJvb3QsIG5vZGVOYW1lICkgeworCisJCQlpZiAoICEgbm9kZU5hbWUgfHwgbm9kZU5h
bWUgPT09ICIiIHx8IG5vZGVOYW1lID09PSAicm9vdCIgfHwgbm9kZU5hbWUgPT09ICIuIiB8fCBu
b2RlTmFtZSA9PT0gLSAxIHx8IG5vZGVOYW1lID09PSByb290Lm5hbWUgfHwgbm9kZU5hbWUgPT09
IHJvb3QudXVpZCApIHsKKworCQkJCXJldHVybiByb290OworCisJCQl9CisKKwkJCS8vIHNlYXJj
aCBpbnRvIHNrZWxldG9uIGJvbmVzLgorCQkJaWYgKCByb290LnNrZWxldG9uICkgeworCisJCQkJ
dmFyIHNlYXJjaFNrZWxldG9uID0gZnVuY3Rpb24gKCBza2VsZXRvbiApIHsKKworCQkJCQlmb3Ig
KCB2YXIgaSA9IDA7IGkgPCBza2VsZXRvbi5ib25lcy5sZW5ndGg7IGkgKysgKSB7CisKKwkJCQkJ
CXZhciBib25lID0gc2tlbGV0b24uYm9uZXNbIGkgXTsKKworCQkJCQkJaWYgKCBib25lLm5hbWUg
PT09IG5vZGVOYW1lICkgeworCisJCQkJCQkJcmV0dXJuIGJvbmU7CisKKwkJCQkJCX0KKworCQkJ
CQl9CisKKwkJCQkJcmV0dXJuIG51bGw7CisKKwkJCQl9OworCisJCQkJdmFyIGJvbmUgPSBzZWFy
Y2hTa2VsZXRvbiggcm9vdC5za2VsZXRvbiApOworCisJCQkJaWYgKCBib25lICkgeworCisJCQkJ
CXJldHVybiBib25lOworCisJCQkJfQorCisJCQl9CisKKwkJCS8vIHNlYXJjaCBpbnRvIG5vZGUg
c3VidHJlZS4KKwkJCWlmICggcm9vdC5jaGlsZHJlbiApIHsKKworCQkJCXZhciBzZWFyY2hOb2Rl
U3VidHJlZSA9IGZ1bmN0aW9uICggY2hpbGRyZW4gKSB7CisKKwkJCQkJZm9yICggdmFyIGkgPSAw
OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkgeworCisJCQkJCQl2YXIgY2hpbGROb2RlID0g
Y2hpbGRyZW5bIGkgXTsKKworCQkJCQkJaWYgKCBjaGlsZE5vZGUubmFtZSA9PT0gbm9kZU5hbWUg
fHwgY2hpbGROb2RlLnV1aWQgPT09IG5vZGVOYW1lICkgeworCisJCQkJCQkJcmV0dXJuIGNoaWxk
Tm9kZTsKKworCQkJCQkJfQorCisJCQkJCQl2YXIgcmVzdWx0ID0gc2VhcmNoTm9kZVN1YnRyZWUo
IGNoaWxkTm9kZS5jaGlsZHJlbiApOworCisJCQkJCQlpZiAoIHJlc3VsdCApIHJldHVybiByZXN1
bHQ7CisKKwkJCQkJfQorCisJCQkJCXJldHVybiBudWxsOworCisJCQkJfTsKKworCQkJCXZhciBz
dWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKCByb290LmNoaWxkcmVuICk7CisKKwkJCQlp
ZiAoIHN1YlRyZWVOb2RlICkgeworCisJCQkJCXJldHVybiBzdWJUcmVlTm9kZTsKKworCQkJCX0K
KworCQkJfQorCisJCQlyZXR1cm4gbnVsbDsKKworCQl9CisKKwl9ICk7CisKKwlPYmplY3QuYXNz
aWduKCBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLCB7IC8vIHByb3RvdHlwZSwgY29udGludWVk
CisKKwkJLy8gdGhlc2UgYXJlIHVzZWQgdG8gImJpbmQiIGEgbm9uZXhpc3RlbnQgcHJvcGVydHkK
KwkJX2dldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSwKKwkJX3NldFZhbHVlX3Vu
YXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSwKKworCQlCaW5kaW5nVHlwZTogeworCQkJRGlyZWN0
OiAwLAorCQkJRW50aXJlQXJyYXk6IDEsCisJCQlBcnJheUVsZW1lbnQ6IDIsCisJCQlIYXNGcm9t
VG9BcnJheTogMworCQl9LAorCisJCVZlcnNpb25pbmc6IHsKKwkJCU5vbmU6IDAsCisJCQlOZWVk
c1VwZGF0ZTogMSwKKwkJCU1hdHJpeFdvcmxkTmVlZHNVcGRhdGU6IDIKKwkJfSwKKworCQlHZXR0
ZXJCeUJpbmRpbmdUeXBlOiBbCisKKwkJCWZ1bmN0aW9uIGdldFZhbHVlX2RpcmVjdCggYnVmZmVy
LCBvZmZzZXQgKSB7CisKKwkJCQlidWZmZXJbIG9mZnNldCBdID0gdGhpcy5ub2RlWyB0aGlzLnBy
b3BlcnR5TmFtZSBdOworCisJCQl9LAorCisJCQlmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheSggYnVm
ZmVyLCBvZmZzZXQgKSB7CisKKwkJCQl2YXIgc291cmNlID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5
OworCisJCQkJZm9yICggdmFyIGkgPSAwLCBuID0gc291cmNlLmxlbmd0aDsgaSAhPT0gbjsgKysg
aSApIHsKKworCQkJCQlidWZmZXJbIG9mZnNldCArKyBdID0gc291cmNlWyBpIF07CisKKwkJCQl9
CisKKwkJCX0sCisKKwkJCWZ1bmN0aW9uIGdldFZhbHVlX2FycmF5RWxlbWVudCggYnVmZmVyLCBv
ZmZzZXQgKSB7CisKKwkJCQlidWZmZXJbIG9mZnNldCBdID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5
WyB0aGlzLnByb3BlcnR5SW5kZXggXTsKKworCQkJfSwKKworCQkJZnVuY3Rpb24gZ2V0VmFsdWVf
dG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7CisKKwkJCQl0aGlzLnJlc29sdmVkUHJvcGVydHku
dG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKTsKKworCQkJfQorCisJCV0sCisKKwkJU2V0dGVyQnlC
aW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6IFsKKworCQkJWworCQkJCS8vIERpcmVjdAorCisJCQkJ
ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHsKKworCQkJCQl0aGlz
Lm5vZGVbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdOworCisJCQkJfSwK
KworCQkJCWZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBv
ZmZzZXQgKSB7CisKKwkJCQkJdGhpcy5ub2RlWyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVy
WyBvZmZzZXQgXTsKKwkJCQkJdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlOwor
CisJCQkJfSwKKworCQkJCWZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5l
ZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHsKKworCQkJCQl0aGlzLm5vZGVbIHRoaXMucHJv
cGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdOworCQkJCQl0aGlzLnRhcmdldE9iamVjdC5t
YXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTsKKworCQkJCX0KKworCQkJXSwgWworCisJCQkJ
Ly8gRW50aXJlQXJyYXkKKworCQkJCWZ1bmN0aW9uIHNldFZhbHVlX2FycmF5KCBidWZmZXIsIG9m
ZnNldCApIHsKKworCQkJCQl2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTsKKworCQkJ
CQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKwor
CQkJCQkJZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTsKKworCQkJCQl9CisKKwkJCQl9
LAorCisJCQkJZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwg
b2Zmc2V0ICkgeworCisJCQkJCXZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5OworCisJ
CQkJCWZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewor
CisJCQkJCQlkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdOworCisJCQkJCX0KKworCQkJ
CQl0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCQl9LAorCisJCQkJ
ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVy
LCBvZmZzZXQgKSB7CisKKwkJCQkJdmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7CisK
KwkJCQkJZm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7
CisKKwkJCQkJCWRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07CisKKwkJCQkJfQorCisJ
CQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOworCisJ
CQkJfQorCisJCQldLCBbCisKKwkJCQkvLyBBcnJheUVsZW1lbnQKKworCQkJCWZ1bmN0aW9uIHNl
dFZhbHVlX2FycmF5RWxlbWVudCggYnVmZmVyLCBvZmZzZXQgKSB7CisKKwkJCQkJdGhpcy5yZXNv
bHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07CisK
KwkJCQl9LAorCisJCQkJZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBk
YXRlKCBidWZmZXIsIG9mZnNldCApIHsKKworCQkJCQl0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRo
aXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTsKKwkJCQkJdGhpcy50YXJnZXRP
YmplY3QubmVlZHNVcGRhdGUgPSB0cnVlOworCisJCQkJfSwKKworCQkJCWZ1bmN0aW9uIHNldFZh
bHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNl
dCApIHsKKworCQkJCQl0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBd
ID0gYnVmZmVyWyBvZmZzZXQgXTsKKwkJCQkJdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGRO
ZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCQl9CisKKwkJCV0sIFsKKworCQkJCS8vIEhhc1RvRnJv
bUFycmF5CisKKwkJCQlmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0
ICkgeworCisJCQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zm
c2V0ICk7CisKKwkJCQl9LAorCisJCQkJZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE5l
ZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHsKKworCQkJCQl0aGlzLnJlc29sdmVkUHJvcGVy
dHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApOworCQkJCQl0aGlzLnRhcmdldE9iamVjdC5u
ZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJCQl9LAorCisJCQkJZnVuY3Rpb24gc2V0VmFsdWVfZnJv
bUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkgeworCisJ
CQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7CisJ
CQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOworCisJ
CQkJfQorCisJCQldCisKKwkJXSwKKworCQlnZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWVfdW5i
b3VuZCggdGFyZ2V0QXJyYXksIG9mZnNldCApIHsKKworCQkJdGhpcy5iaW5kKCk7CisJCQl0aGlz
LmdldFZhbHVlKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICk7CisKKwkJCS8vIE5vdGU6IFRoaXMgY2xh
c3MgdXNlcyBhIFN0YXRlIHBhdHRlcm4gb24gYSBwZXItbWV0aG9kIGJhc2lzOgorCQkJLy8gJ2Jp
bmQnIHNldHMgJ3RoaXMuZ2V0VmFsdWUnIC8gJ3NldFZhbHVlJyBhbmQgc2hhZG93cyB0aGUKKwkJ
CS8vIHByb3RvdHlwZSB2ZXJzaW9uIG9mIHRoZXNlIG1ldGhvZHMgd2l0aCBvbmUgdGhhdCByZXBy
ZXNlbnRzCisJCQkvLyB0aGUgYm91bmQgc3RhdGUuIFdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCBm
b3VuZCwgdGhlIG1ldGhvZHMKKwkJCS8vIGJlY29tZSBuby1vcHMuCisKKwkJfSwKKworCQlzZXRW
YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWVfdW5ib3VuZCggc291cmNlQXJyYXksIG9mZnNldCApIHsK
KworCQkJdGhpcy5iaW5kKCk7CisJCQl0aGlzLnNldFZhbHVlKCBzb3VyY2VBcnJheSwgb2Zmc2V0
ICk7CisKKwkJfSwKKworCQkvLyBjcmVhdGUgZ2V0dGVyIC8gc2V0dGVyIHBhaXIgZm9yIGEgcHJv
cGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoCisJCWJpbmQ6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFy
IHRhcmdldE9iamVjdCA9IHRoaXMubm9kZSwKKwkJCQlwYXJzZWRQYXRoID0gdGhpcy5wYXJzZWRQ
YXRoLAorCisJCQkJb2JqZWN0TmFtZSA9IHBhcnNlZFBhdGgub2JqZWN0TmFtZSwKKwkJCQlwcm9w
ZXJ0eU5hbWUgPSBwYXJzZWRQYXRoLnByb3BlcnR5TmFtZSwKKwkJCQlwcm9wZXJ0eUluZGV4ID0g
cGFyc2VkUGF0aC5wcm9wZXJ0eUluZGV4OworCisJCQlpZiAoICEgdGFyZ2V0T2JqZWN0ICkgewor
CisJCQkJdGFyZ2V0T2JqZWN0ID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2RlKAorCQkJCQkJdGhp
cy5yb290Tm9kZSwgcGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHRoaXMucm9vdE5vZGU7CisKKwkJ
CQl0aGlzLm5vZGUgPSB0YXJnZXRPYmplY3Q7CisKKwkJCX0KKworCQkJLy8gc2V0IGZhaWwgc3Rh
dGUgc28gd2UgY2FuIGp1c3QgJ3JldHVybicgb24gZXJyb3IKKwkJCXRoaXMuZ2V0VmFsdWUgPSB0
aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTsKKwkJCXRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRW
YWx1ZV91bmF2YWlsYWJsZTsKKworCQkJLy8gZW5zdXJlIHRoZXJlIGlzIGEgdmFsdWUgbm9kZQor
CQkJaWYgKCAhIHRhcmdldE9iamVjdCApIHsKKworCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Q
cm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6ICcgKyB0aGlz
LnBhdGggKyAnIGJ1dCBpdCB3YXNuXCd0IGZvdW5kLicgKTsKKwkJCQlyZXR1cm47CisKKwkJCX0K
KworCQkJaWYgKCBvYmplY3ROYW1lICkgeworCisJCQkJdmFyIG9iamVjdEluZGV4ID0gcGFyc2Vk
UGF0aC5vYmplY3RJbmRleDsKKworCQkJCS8vIHNwZWNpYWwgY2FzZXMgd2VyZSB3ZSBuZWVkIHRv
IHJlYWNoIGRlZXBlciBpbnRvIHRoZSBoaWVyYXJjaHkgdG8gZ2V0IHRoZSBmYWNlIG1hdGVyaWFs
cy4uLi4KKwkJCQlzd2l0Y2ggKCBvYmplY3ROYW1lICkgeworCisJCQkJCWNhc2UgJ21hdGVyaWFs
cyc6CisKKwkJCQkJCWlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwgKSB7CisKKwkJCQkJCQlj
b25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0
ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuJywgdGhpcyApOworCQkJCQkJ
CXJldHVybjsKKworCQkJCQkJfQorCisJCQkJCQlpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFs
Lm1hdGVyaWFscyApIHsKKworCQkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJp
bmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlh
bCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LicsIHRoaXMgKTsKKwkJCQkJCQlyZXR1
cm47CisKKwkJCQkJCX0KKworCQkJCQkJdGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0Lm1hdGVy
aWFsLm1hdGVyaWFsczsKKworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAnYm9uZXMnOgorCisJ
CQkJCQlpZiAoICEgdGFyZ2V0T2JqZWN0LnNrZWxldG9uICkgeworCisJCQkJCQkJY29uc29sZS5l
cnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5v
ZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLicsIHRoaXMgKTsKKwkJCQkJCQlyZXR1cm47CisK
KwkJCQkJCX0KKworCQkJCQkJLy8gcG90ZW50aWFsIGZ1dHVyZSBvcHRpbWl6YXRpb246IHNraXAg
dGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlcgorCQkJCQkJLy8gYW5k
IGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLgorCisJCQkJCQl0
YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Quc2tlbGV0b24uYm9uZXM7CisKKwkJCQkJCS8vIHN1
cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy4KKwkJCQkJCWZv
ciAoIHZhciBpID0gMDsgaSA8IHRhcmdldE9iamVjdC5sZW5ndGg7IGkgKysgKSB7CisKKwkJCQkJ
CQlpZiAoIHRhcmdldE9iamVjdFsgaSBdLm5hbWUgPT09IG9iamVjdEluZGV4ICkgeworCisJCQkJ
CQkJCW9iamVjdEluZGV4ID0gaTsKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQl9CisKKwkJCQkJ
CX0KKworCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKworCQkJCQkJaWYgKCB0YXJnZXRP
YmplY3RbIG9iamVjdE5hbWUgXSA9PT0gdW5kZWZpbmVkICkgeworCisJCQkJCQkJY29uc29sZS5l
cnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUg
b2Ygbm9kZSB1bmRlZmluZWQuJywgdGhpcyApOworCQkJCQkJCXJldHVybjsKKworCQkJCQkJfQor
CisJCQkJCQl0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXTsKKworCQkJ
CX0KKworCisJCQkJaWYgKCBvYmplY3RJbmRleCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJCWlm
ICggdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJ
CWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRv
IG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuJywgdGhpcywgdGFy
Z2V0T2JqZWN0ICk7CisJCQkJCQlyZXR1cm47CisKKwkJCQkJfQorCisJCQkJCXRhcmdldE9iamVj
dCA9IHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXTsKKworCQkJCX0KKworCQkJfQorCisJCQkv
LyByZXNvbHZlIHByb3BlcnR5CisJCQl2YXIgbm9kZVByb3BlcnR5ID0gdGFyZ2V0T2JqZWN0WyBw
cm9wZXJ0eU5hbWUgXTsKKworCQkJaWYgKCBub2RlUHJvcGVydHkgPT09IHVuZGVmaW5lZCApIHsK
KworCQkJCXZhciBub2RlTmFtZSA9IHBhcnNlZFBhdGgubm9kZU5hbWU7CisKKwkJCQljb25zb2xl
LmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5
IGZvciB0cmFjazogJyArIG5vZGVOYW1lICsKKwkJCQkJJy4nICsgcHJvcGVydHlOYW1lICsgJyBi
dXQgaXQgd2FzblwndCBmb3VuZC4nLCB0YXJnZXRPYmplY3QgKTsKKwkJCQlyZXR1cm47CisKKwkJ
CX0KKworCQkJLy8gZGV0ZXJtaW5lIHZlcnNpb25pbmcgc2NoZW1lCisJCQl2YXIgdmVyc2lvbmlu
ZyA9IHRoaXMuVmVyc2lvbmluZy5Ob25lOworCisJCQlpZiAoIHRhcmdldE9iamVjdC5uZWVkc1Vw
ZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBtYXRlcmlhbAorCisJCQkJdmVyc2lvbmluZyA9IHRo
aXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTsKKwkJCQl0aGlzLnRhcmdldE9iamVjdCA9IHRhcmdl
dE9iamVjdDsKKworCQkJfSBlbHNlIGlmICggdGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNV
cGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbm9kZSB0cmFuc2Zvcm0KKworCQkJCXZlcnNpb25p
bmcgPSB0aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZTsKKwkJCQl0aGlzLnRh
cmdldE9iamVjdCA9IHRhcmdldE9iamVjdDsKKworCQkJfQorCisJCQkvLyBkZXRlcm1pbmUgaG93
IHRoZSBwcm9wZXJ0eSBnZXRzIGJvdW5kCisJCQl2YXIgYmluZGluZ1R5cGUgPSB0aGlzLkJpbmRp
bmdUeXBlLkRpcmVjdDsKKworCQkJaWYgKCBwcm9wZXJ0eUluZGV4ICE9PSB1bmRlZmluZWQgKSB7
CisKKwkJCQkvLyBhY2Nlc3MgYSBzdWIgZWxlbWVudCBvZiB0aGUgcHJvcGVydHkgYXJyYXkgKG9u
bHkgcHJpbWl0aXZlcyBhcmUgc3VwcG9ydGVkIHJpZ2h0IG5vdykKKworCQkJCWlmICggcHJvcGVy
dHlOYW1lID09PSAibW9ycGhUYXJnZXRJbmZsdWVuY2VzIiApIHsKKworCQkJCQkvLyBwb3RlbnRp
YWwgb3B0aW1pemF0aW9uLCBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFu
IGludGVnZXIsIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdl
ci4KKworCQkJCQkvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGlu
ZGljZXMuCisJCQkJCWlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkgKSB7CisKKwkJCQkJCWNv
bnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3Jw
aFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4n
LCB0aGlzICk7CisJCQkJCQlyZXR1cm47CisKKwkJCQkJfQorCisJCQkJCWlmICggdGFyZ2V0T2Jq
ZWN0Lmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisKKwkJCQkJCWlmICggISB0YXJnZXRP
YmplY3QuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICkgeworCisJCQkJCQkJY29uc29sZS5lcnJv
ciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5m
bHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmli
dXRlcy4nLCB0aGlzICk7CisJCQkJCQkJcmV0dXJuOworCisJCQkJCQl9CisKKwkJCQkJCWZvciAo
IHZhciBpID0gMDsgaSA8IHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRp
b24ubGVuZ3RoOyBpICsrICkgeworCisJCQkJCQkJaWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnku
bW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uWyBpIF0ubmFtZSA9PT0gcHJvcGVydHlJbmRleCApIHsK
KworCQkJCQkJCQlwcm9wZXJ0eUluZGV4ID0gaTsKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQl9
CisKKwkJCQkJCX0KKworCisJCQkJCX0gZWxzZSB7CisKKwkJCQkJCWlmICggISB0YXJnZXRPYmpl
Y3QuZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkgeworCisJCQkJCQkJY29uc29sZS5lcnJvciggJ1RI
UkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNl
cyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy4nLCB0
aGlzICk7CisJCQkJCQkJcmV0dXJuOworCisJCQkJCQl9CisKKwkJCQkJCWZvciAoIHZhciBpID0g
MDsgaSA8IHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaFRhcmdldHMubGVuZ3RoOyBpICsrICkgewor
CisJCQkJCQkJaWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0ubmFt
ZSA9PT0gcHJvcGVydHlJbmRleCApIHsKKworCQkJCQkJCQlwcm9wZXJ0eUluZGV4ID0gaTsKKwkJ
CQkJCQkJYnJlYWs7CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9CisK
KwkJCQliaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50OworCisJCQkJ
dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5OworCQkJCXRoaXMucHJvcGVydHlJ
bmRleCA9IHByb3BlcnR5SW5kZXg7CisKKwkJCX0gZWxzZSBpZiAoIG5vZGVQcm9wZXJ0eS5mcm9t
QXJyYXkgIT09IHVuZGVmaW5lZCAmJiBub2RlUHJvcGVydHkudG9BcnJheSAhPT0gdW5kZWZpbmVk
ICkgeworCisJCQkJLy8gbXVzdCB1c2UgY29weSBmb3IgT2JqZWN0M0QuRXVsZXIvUXVhdGVybmlv
bgorCisJCQkJYmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5Owor
CisJCQkJdGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5OworCisJCQl9IGVsc2Ug
aWYgKCBBcnJheS5pc0FycmF5KCBub2RlUHJvcGVydHkgKSApIHsKKworCQkJCWJpbmRpbmdUeXBl
ID0gdGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheTsKKworCQkJCXRoaXMucmVzb2x2ZWRQcm9w
ZXJ0eSA9IG5vZGVQcm9wZXJ0eTsKKworCQkJfSBlbHNlIHsKKworCQkJCXRoaXMucHJvcGVydHlO
YW1lID0gcHJvcGVydHlOYW1lOworCisJCQl9CisKKwkJCS8vIHNlbGVjdCBnZXR0ZXIgLyBzZXR0
ZXIKKwkJCXRoaXMuZ2V0VmFsdWUgPSB0aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbIGJpbmRpbmdU
eXBlIF07CisJCQl0aGlzLnNldFZhbHVlID0gdGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVy
c2lvbmluZ1sgYmluZGluZ1R5cGUgXVsgdmVyc2lvbmluZyBdOworCisJCX0sCisKKwkJdW5iaW5k
OiBmdW5jdGlvbiAoKSB7CisKKwkJCXRoaXMubm9kZSA9IG51bGw7CisKKwkJCS8vIGJhY2sgdG8g
dGhlIHByb3RvdHlwZSB2ZXJzaW9uIG9mIGdldFZhbHVlIC8gc2V0VmFsdWUKKwkJCS8vIG5vdGU6
IGF2b2lkaW5nIHRvIG11dGF0ZSB0aGUgc2hhcGUgb2YgJ3RoaXMnIHZpYSAnZGVsZXRlJworCQkJ
dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYm91bmQ7CisJCQl0aGlzLnNldFZhbHVl
ID0gdGhpcy5fc2V0VmFsdWVfdW5ib3VuZDsKKworCQl9CisKKwl9ICk7CisKKwkvLyFcIERFQ0xB
UkUgQUxJQVMgQUZURVIgYXNzaWduIHByb3RvdHlwZSAhCisJT2JqZWN0LmFzc2lnbiggUHJvcGVy
dHlCaW5kaW5nLnByb3RvdHlwZSwgeworCisJCS8vIGluaXRpYWwgc3RhdGUgb2YgdGhlc2UgbWV0
aG9kcyB0aGF0IGNhbGxzICdiaW5kJworCQlfZ2V0VmFsdWVfdW5ib3VuZDogUHJvcGVydHlCaW5k
aW5nLnByb3RvdHlwZS5nZXRWYWx1ZSwKKwkJX3NldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5Qmlu
ZGluZy5wcm90b3R5cGUuc2V0VmFsdWUsCisKKwl9ICk7CisKKwkvKioKKwkgKgorCSAqIEEgZ3Jv
dXAgb2Ygb2JqZWN0cyB0aGF0IHJlY2VpdmVzIGEgc2hhcmVkIGFuaW1hdGlvbiBzdGF0ZS4KKwkg
KgorCSAqIFVzYWdlOgorCSAqCisJICogCS0JQWRkIG9iamVjdHMgeW91IHdvdWxkIG90aGVyd2lz
ZSBwYXNzIGFzICdyb290JyB0byB0aGUKKwkgKiAJCWNvbnN0cnVjdG9yIG9yIHRoZSAuY2xpcEFj
dGlvbiBtZXRob2Qgb2YgQW5pbWF0aW9uTWl4ZXIuCisJICoKKwkgKiAJLQlJbnN0ZWFkIHBhc3Mg
dGhpcyBvYmplY3QgYXMgJ3Jvb3QnLgorCSAqCisJICogCS0JWW91IGNhbiBhbHNvIGFkZCBhbmQg
cmVtb3ZlIG9iamVjdHMgbGF0ZXIgd2hlbiB0aGUgbWl4ZXIKKwkgKiAJCWlzIHJ1bm5pbmcuCisJ
ICoKKwkgKiBOb3RlOgorCSAqCisJICogIAlPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXBwZWFyIGFz
IG9uZSBvYmplY3QgdG8gdGhlIG1peGVyLAorCSAqICAJc28gY2FjaGUgY29udHJvbCBvZiB0aGUg
aW5kaXZpZHVhbCBvYmplY3RzIG11c3QgYmUgZG9uZQorCSAqICAJb24gdGhlIGdyb3VwLgorCSAq
CisJICogTGltaXRhdGlvbjoKKwkgKgorCSAqIAktIAlUaGUgYW5pbWF0ZWQgcHJvcGVydGllcyBt
dXN0IGJlIGNvbXBhdGlibGUgYW1vbmcgdGhlCisJICogCQlhbGwgb2JqZWN0cyBpbiB0aGUgZ3Jv
dXAuCisJICoKKwkgKiAgLQlBIHNpbmdsZSBwcm9wZXJ0eSBjYW4gZWl0aGVyIGJlIGNvbnRyb2xs
ZWQgdGhyb3VnaCBhCisJICogIAl0YXJnZXQgZ3JvdXAgb3IgZGlyZWN0bHksIGJ1dCBub3QgYm90
aC4KKwkgKgorCSAqIEBhdXRob3IgdHNjaHcKKwkgKi8KKworCWZ1bmN0aW9uIEFuaW1hdGlvbk9i
amVjdEdyb3VwKCB2YXJfYXJncyApIHsKKworCQl0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVV
SUQoKTsKKworCQkvLyBjYWNoZWQgb2JqZWN0cyBmb2xsb3dlZCBieSB0aGUgYWN0aXZlIG9uZXMK
KwkJdGhpcy5fb2JqZWN0cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMg
KTsKKworCQl0aGlzLm5DYWNoZWRPYmplY3RzXyA9IDA7CQkJLy8gdGhyZXNob2xkCisJCS8vIG5v
dGU6IHJlYWQgYnkgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZQorCisJCXZhciBpbmRpY2VzID0g
e307CisJCXRoaXMuX2luZGljZXNCeVVVSUQgPSBpbmRpY2VzOwkJLy8gZm9yIGJvb2trZWVwaW5n
CisKKwkJZm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysg
aSApIHsKKworCQkJaW5kaWNlc1sgYXJndW1lbnRzWyBpIF0udXVpZCBdID0gaTsKKworCQl9CisK
KwkJdGhpcy5fcGF0aHMgPSBbXTsJCQkJCS8vIGluc2lkZTogc3RyaW5nCisJCXRoaXMuX3BhcnNl
ZFBhdGhzID0gW107CQkJCS8vIGluc2lkZTogeyB3ZSBkb24ndCBjYXJlLCBoZXJlIH0KKwkJdGhp
cy5fYmluZGluZ3MgPSBbXTsgCQkJCS8vIGluc2lkZTogQXJyYXk8IFByb3BlcnR5QmluZGluZyA+
CisJCXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OyAJLy8gaW5zaWRlOiBpbmRpY2Vz
IGluIHRoZXNlIGFycmF5cworCisJCXZhciBzY29wZSA9IHRoaXM7CisKKwkJdGhpcy5zdGF0cyA9
IHsKKworCQkJb2JqZWN0czogeworCQkJCWdldCB0b3RhbCgpIHsgcmV0dXJuIHNjb3BlLl9vYmpl
Y3RzLmxlbmd0aDsgfSwKKwkJCQlnZXQgaW5Vc2UoKSB7IHJldHVybiB0aGlzLnRvdGFsIC0gc2Nv
cGUubkNhY2hlZE9iamVjdHNfOyB9CisJCQl9LAorCisJCQlnZXQgYmluZGluZ3NQZXJPYmplY3Qo
KSB7IHJldHVybiBzY29wZS5fYmluZGluZ3MubGVuZ3RoOyB9CisKKwkJfTsKKworCX0KKworCU9i
amVjdC5hc3NpZ24oIEFuaW1hdGlvbk9iamVjdEdyb3VwLnByb3RvdHlwZSwgeworCisJCWlzQW5p
bWF0aW9uT2JqZWN0R3JvdXA6IHRydWUsCisKKwkJYWRkOiBmdW5jdGlvbiggdmFyX2FyZ3MgKSB7
CisKKwkJCXZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cywKKwkJCQluT2JqZWN0cyA9IG9iamVj
dHMubGVuZ3RoLAorCQkJCW5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sCisJ
CQkJaW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsCisJCQkJcGF0aHMgPSB0aGlz
Ll9wYXRocywKKwkJCQlwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLAorCQkJCWJpbmRp
bmdzID0gdGhpcy5fYmluZGluZ3MsCisJCQkJbkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoOwor
CisJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBp
ICkgeworCisJCQkJdmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLAorCQkJCQl1dWlkID0gb2Jq
ZWN0LnV1aWQsCisJCQkJCWluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdLAorCQkJCQlrbm93
bk9iamVjdCA9IHVuZGVmaW5lZDsKKworCQkJCWlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHsK
KworCQkJCQkvLyB1bmtub3duIG9iamVjdCAtPiBhZGQgaXQgdG8gdGhlIEFDVElWRSByZWdpb24K
KworCQkJCQlpbmRleCA9IG5PYmplY3RzICsrOworCQkJCQlpbmRpY2VzQnlVVUlEWyB1dWlkIF0g
PSBpbmRleDsKKwkJCQkJb2JqZWN0cy5wdXNoKCBvYmplY3QgKTsKKworCQkJCQkvLyBhY2NvdW50
aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzCisKKwkJCQkJZm9y
ICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkgeworCisJCQkJCQli
aW5kaW5nc1sgaiBdLnB1c2goCisJCQkJCQkJCW5ldyBQcm9wZXJ0eUJpbmRpbmcoCisJCQkJCQkJ
CQlvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApOworCisJCQkJCX0KKwor
CQkJCX0gZWxzZSBpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7CisKKwkJCQkJa25vd25P
YmplY3QgPSBvYmplY3RzWyBpbmRleCBdOworCisJCQkJCS8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0
IHRvIHRoZSBBQ1RJVkUgcmVnaW9uCisKKwkJCQkJdmFyIGZpcnN0QWN0aXZlSW5kZXggPSAtLSBu
Q2FjaGVkT2JqZWN0cywKKwkJCQkJCWxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFj
dGl2ZUluZGV4IF07CisKKwkJCQkJaW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlk
IF0gPSBpbmRleDsKKwkJCQkJb2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7CisK
KwkJCQkJaW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDsKKwkJCQkJb2Jq
ZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gb2JqZWN0OworCisJCQkJCS8vIGFjY291bnRpbmcg
aXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3MKKworCQkJCQlmb3IgKCB2
YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7CisKKwkJCQkJCXZhciBi
aW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLAorCQkJCQkJCWxhc3RDYWNoZWQgPSBiaW5k
aW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSwKKwkJCQkJCQliaW5kaW5nID0gYmluZGlu
Z3NGb3JQYXRoWyBpbmRleCBdOworCisJCQkJCQliaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBs
YXN0Q2FjaGVkOworCisJCQkJCQlpZiAoIGJpbmRpbmcgPT09IHVuZGVmaW5lZCApIHsKKworCQkJ
CQkJCS8vIHNpbmNlIHdlIGRvIG5vdCBib3RoZXIgdG8gY3JlYXRlIG5ldyBiaW5kaW5ncworCQkJ
CQkJCS8vIGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCwgdGhlIGJpbmRpbmcgbWF5CisJCQkJ
CQkJLy8gb3IgbWF5IG5vdCBleGlzdAorCisJCQkJCQkJYmluZGluZyA9IG5ldyBQcm9wZXJ0eUJp
bmRpbmcoCisJCQkJCQkJCQlvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKTsK
KworCQkJCQkJfQorCisJCQkJCQliaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9
IGJpbmRpbmc7CisKKwkJCQkJfQorCisJCQkJfSBlbHNlIGlmICggb2JqZWN0c1sgaW5kZXggXSAh
PT0ga25vd25PYmplY3QgKSB7CisKKwkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlv
bk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgJyArCisJ
CQkJCQkJJ2RldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFz
dHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLicgKTsKKworCQkJCX0gLy8gZWxzZSB0aGUg
b2JqZWN0IGlzIGFscmVhZHkgd2hlcmUgd2Ugd2FudCBpdCB0byBiZQorCisJCQl9IC8vIGZvciBh
cmd1bWVudHMKKworCQkJdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0czsKKwor
CQl9LAorCisJCXJlbW92ZTogZnVuY3Rpb24oIHZhcl9hcmdzICkgeworCisJCQl2YXIgb2JqZWN0
cyA9IHRoaXMuX29iamVjdHMsCisJCQkJbkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmpl
Y3RzXywKKwkJCQlpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCwKKwkJCQliaW5k
aW5ncyA9IHRoaXMuX2JpbmRpbmdzLAorCQkJCW5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDsK
KworCQkJZm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysg
aSApIHsKKworCQkJCXZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSwKKwkJCQkJdXVpZCA9IG9i
amVjdC51dWlkLAorCQkJCQlpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTsKKworCQkJCWlm
ICggaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+PSBuQ2FjaGVkT2JqZWN0cyApIHsKKwor
CQkJCQkvLyBtb3ZlIGV4aXN0aW5nIG9iamVjdCBpbnRvIHRoZSBDQUNIRUQgcmVnaW9uCisKKwkJ
CQkJdmFyIGxhc3RDYWNoZWRJbmRleCA9IG5DYWNoZWRPYmplY3RzICsrLAorCQkJCQkJZmlyc3RB
Y3RpdmVPYmplY3QgPSBvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXTsKKworCQkJCQlpbmRpY2Vz
QnlVVUlEWyBmaXJzdEFjdGl2ZU9iamVjdC51dWlkIF0gPSBpbmRleDsKKwkJCQkJb2JqZWN0c1sg
aW5kZXggXSA9IGZpcnN0QWN0aXZlT2JqZWN0OworCisJCQkJCWluZGljZXNCeVVVSURbIHV1aWQg
XSA9IGxhc3RDYWNoZWRJbmRleDsKKwkJCQkJb2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF0gPSBv
YmplY3Q7CisKKwkJCQkJLy8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9y
IGFsbCBiaW5kaW5ncworCisJCQkJCWZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAh
PT0gbTsgKysgaiApIHsKKworCQkJCQkJdmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBq
IF0sCisJCQkJCQkJZmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRl
eCBdLAorCQkJCQkJCWJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07CisKKwkJCQkJ
CWJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlOworCQkJCQkJYmluZGluZ3NG
b3JQYXRoWyBsYXN0Q2FjaGVkSW5kZXggXSA9IGJpbmRpbmc7CisKKwkJCQkJfQorCisJCQkJfQor
CisJCQl9IC8vIGZvciBhcmd1bWVudHMKKworCQkJdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2Fj
aGVkT2JqZWN0czsKKworCQl9LAorCisJCS8vIHJlbW92ZSAmIGZvcmdldAorCQl1bmNhY2hlOiBm
dW5jdGlvbiggdmFyX2FyZ3MgKSB7CisKKwkJCXZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cywK
KwkJCQluT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLAorCQkJCW5DYWNoZWRPYmplY3RzID0gdGhp
cy5uQ2FjaGVkT2JqZWN0c18sCisJCQkJaW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVV
SUQsCisJCQkJYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncywKKwkJCQluQmluZGluZ3MgPSBiaW5k
aW5ncy5sZW5ndGg7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7
IGkgIT09IG47ICsrIGkgKSB7CisKKwkJCQl2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sCisJ
CQkJCXV1aWQgPSBvYmplY3QudXVpZCwKKwkJCQkJaW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlk
IF07CisKKwkJCQlpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJZGVsZXRlIGlu
ZGljZXNCeVVVSURbIHV1aWQgXTsKKworCQkJCQlpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMg
KSB7CisKKwkJCQkJCS8vIG9iamVjdCBpcyBjYWNoZWQsIHNocmluayB0aGUgQ0FDSEVEIHJlZ2lv
bgorCisJCQkJCQl2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLAorCQkJ
CQkJCWxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0sCisJCQkJ
CQkJbGFzdEluZGV4ID0gLS0gbk9iamVjdHMsCisJCQkJCQkJbGFzdE9iamVjdCA9IG9iamVjdHNb
IGxhc3RJbmRleCBdOworCisJCQkJCQkvLyBsYXN0IGNhY2hlZCBvYmplY3QgdGFrZXMgdGhpcyBv
YmplY3QncyBwbGFjZQorCQkJCQkJaW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlk
IF0gPSBpbmRleDsKKwkJCQkJCW9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0Owor
CisJCQkJCQkvLyBsYXN0IG9iamVjdCBnb2VzIHRvIHRoZSBhY3RpdmF0ZWQgc2xvdCBhbmQgcG9w
CisJCQkJCQlpbmRpY2VzQnlVVUlEWyBsYXN0T2JqZWN0LnV1aWQgXSA9IGZpcnN0QWN0aXZlSW5k
ZXg7CisJCQkJCQlvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0T2JqZWN0OworCQkJ
CQkJb2JqZWN0cy5wb3AoKTsKKworCQkJCQkJLy8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8g
dGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5ncworCisJCQkJCQlmb3IgKCB2YXIgaiA9IDAsIG0gPSBu
QmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7CisKKwkJCQkJCQl2YXIgYmluZGluZ3NGb3JQYXRo
ID0gYmluZGluZ3NbIGogXSwKKwkJCQkJCQkJbGFzdENhY2hlZCA9IGJpbmRpbmdzRm9yUGF0aFsg
Zmlyc3RBY3RpdmVJbmRleCBdLAorCQkJCQkJCQlsYXN0ID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0
SW5kZXggXTsKKworCQkJCQkJCWJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7
CisJCQkJCQkJYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0OworCQkJ
CQkJCWJpbmRpbmdzRm9yUGF0aC5wb3AoKTsKKworCQkJCQkJfQorCisJCQkJCX0gZWxzZSB7CisK
KwkJCQkJCS8vIG9iamVjdCBpcyBhY3RpdmUsIGp1c3Qgc3dhcCB3aXRoIHRoZSBsYXN0IGFuZCBw
b3AKKworCQkJCQkJdmFyIGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLAorCQkJCQkJCWxhc3RPYmpl
Y3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTsKKworCQkJCQkJaW5kaWNlc0J5VVVJRFsgbGFzdE9i
amVjdC51dWlkIF0gPSBpbmRleDsKKwkJCQkJCW9iamVjdHNbIGluZGV4IF0gPSBsYXN0T2JqZWN0
OworCQkJCQkJb2JqZWN0cy5wb3AoKTsKKworCQkJCQkJLy8gYWNjb3VudGluZyBpcyBkb25lLCBu
b3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5ncworCisJCQkJCQlmb3IgKCB2YXIgaiA9IDAs
IG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7CisKKwkJCQkJCQl2YXIgYmluZGluZ3NG
b3JQYXRoID0gYmluZGluZ3NbIGogXTsKKworCQkJCQkJCWJpbmRpbmdzRm9yUGF0aFsgaW5kZXgg
XSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07CisJCQkJCQkJYmluZGluZ3NGb3JQYXRo
LnBvcCgpOworCisJCQkJCQl9CisKKwkJCQkJfSAvLyBjYWNoZWQgb3IgYWN0aXZlCisKKwkJCQl9
IC8vIGlmIG9iamVjdCBpcyBrbm93bgorCisJCQl9IC8vIGZvciBhcmd1bWVudHMKKworCQkJdGhp
cy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0czsKKworCQl9LAorCisJCS8vIEludGVy
bmFsIGludGVyZmFjZSB1c2VkIGJ5IGJlZnJpZW5kZWQgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0
ZToKKworCQlzdWJzY3JpYmVfOiBmdW5jdGlvbiAoIHBhdGgsIHBhcnNlZFBhdGggKSB7CisKKwkJ
CS8vIHJldHVybnMgYW4gYXJyYXkgb2YgYmluZGluZ3MgZm9yIHRoZSBnaXZlbiBwYXRoIHRoYXQg
aXMgY2hhbmdlZAorCQkJLy8gYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQgb2JqZWN0cyBpbiB0
aGUgZ3JvdXAKKworCQkJdmFyIGluZGljZXNCeVBhdGggPSB0aGlzLl9iaW5kaW5nc0luZGljZXNC
eVBhdGgsCisJCQkJaW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF0sCisJCQkJYmluZGluZ3Mg
PSB0aGlzLl9iaW5kaW5nczsKKworCQkJaWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgcmV0dXJu
IGJpbmRpbmdzWyBpbmRleCBdOworCisJCQl2YXIgcGF0aHMgPSB0aGlzLl9wYXRocywKKwkJCQlw
YXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLAorCQkJCW9iamVjdHMgPSB0aGlzLl9vYmpl
Y3RzLAorCQkJCW5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsCisJCQkJbkNhY2hlZE9iamVjdHMg
PSB0aGlzLm5DYWNoZWRPYmplY3RzXywKKwkJCQliaW5kaW5nc0ZvclBhdGggPSBuZXcgQXJyYXko
IG5PYmplY3RzICk7CisKKwkJCWluZGV4ID0gYmluZGluZ3MubGVuZ3RoOworCisJCQlpbmRpY2Vz
QnlQYXRoWyBwYXRoIF0gPSBpbmRleDsKKworCQkJcGF0aHMucHVzaCggcGF0aCApOworCQkJcGFy
c2VkUGF0aHMucHVzaCggcGFyc2VkUGF0aCApOworCQkJYmluZGluZ3MucHVzaCggYmluZGluZ3NG
b3JQYXRoICk7CisKKwkJCWZvciAoIHZhciBpID0gbkNhY2hlZE9iamVjdHMsIG4gPSBvYmplY3Rz
Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworCQkJCXZhciBvYmplY3QgPSBvYmplY3RzWyBp
IF07CisJCQkJYmluZGluZ3NGb3JQYXRoWyBpIF0gPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmpl
Y3QsIHBhdGgsIHBhcnNlZFBhdGggKTsKKworCQkJfQorCisJCQlyZXR1cm4gYmluZGluZ3NGb3JQ
YXRoOworCisJCX0sCisKKwkJdW5zdWJzY3JpYmVfOiBmdW5jdGlvbiAoIHBhdGggKSB7CisKKwkJ
CS8vIHRlbGxzIHRoZSBncm91cCB0byBmb3JnZXQgYWJvdXQgYSBwcm9wZXJ0eSBwYXRoIGFuZCBu
byBsb25nZXIKKwkJCS8vIHVwZGF0ZSB0aGUgYXJyYXkgcHJldmlvdXNseSBvYnRhaW5lZCB3aXRo
ICdzdWJzY3JpYmVfJworCisJCQl2YXIgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5k
aWNlc0J5UGF0aCwKKwkJCQlpbmRleCA9IGluZGljZXNCeVBhdGhbIHBhdGggXTsKKworCQkJaWYg
KCBpbmRleCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJdmFyIHBhdGhzID0gdGhpcy5fcGF0aHMs
CisJCQkJCXBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsCisJCQkJCWJpbmRpbmdzID0g
dGhpcy5fYmluZGluZ3MsCisJCQkJCWxhc3RCaW5kaW5nc0luZGV4ID0gYmluZGluZ3MubGVuZ3Ro
IC0gMSwKKwkJCQkJbGFzdEJpbmRpbmdzID0gYmluZGluZ3NbIGxhc3RCaW5kaW5nc0luZGV4IF0s
CisJCQkJCWxhc3RCaW5kaW5nc1BhdGggPSBwYXRoWyBsYXN0QmluZGluZ3NJbmRleCBdOworCisJ
CQkJaW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7CisKKwkJCQliaW5k
aW5nc1sgaW5kZXggXSA9IGxhc3RCaW5kaW5nczsKKwkJCQliaW5kaW5ncy5wb3AoKTsKKworCQkJ
CXBhcnNlZFBhdGhzWyBpbmRleCBdID0gcGFyc2VkUGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07
CisJCQkJcGFyc2VkUGF0aHMucG9wKCk7CisKKwkJCQlwYXRoc1sgaW5kZXggXSA9IHBhdGhzWyBs
YXN0QmluZGluZ3NJbmRleCBdOworCQkJCXBhdGhzLnBvcCgpOworCisJCQl9CisKKwkJfQorCisJ
fSApOworCisJLyoqCisJICoKKwkgKiBBY3Rpb24gcHJvdmlkZWQgYnkgQW5pbWF0aW9uTWl4ZXIg
Zm9yIHNjaGVkdWxpbmcgY2xpcCBwbGF5YmFjayBvbiBzcGVjaWZpYworCSAqIG9iamVjdHMuCisJ
ICoKKwkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLworCSAqIEBhdXRo
b3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworCSAqIEBhdXRob3IgdHNjaHcK
KwkgKgorCSAqLworCisJZnVuY3Rpb24gQW5pbWF0aW9uQWN0aW9uKCBtaXhlciwgY2xpcCwgbG9j
YWxSb290ICkgeworCisJCXRoaXMuX21peGVyID0gbWl4ZXI7CisJCXRoaXMuX2NsaXAgPSBjbGlw
OworCQl0aGlzLl9sb2NhbFJvb3QgPSBsb2NhbFJvb3QgfHwgbnVsbDsKKworCQl2YXIgdHJhY2tz
ID0gY2xpcC50cmFja3MsCisJCQluVHJhY2tzID0gdHJhY2tzLmxlbmd0aCwKKwkJCWludGVycG9s
YW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApOworCisJCXZhciBpbnRlcnBvbGFudFNldHRpbmdz
ID0geworCQkJCWVuZGluZ1N0YXJ0OiAJWmVyb0N1cnZhdHVyZUVuZGluZywKKwkJCQllbmRpbmdF
bmQ6CQlaZXJvQ3VydmF0dXJlRW5kaW5nCisJCX07CisKKwkJZm9yICggdmFyIGkgPSAwOyBpICE9
PSBuVHJhY2tzOyArKyBpICkgeworCisJCQl2YXIgaW50ZXJwb2xhbnQgPSB0cmFja3NbIGkgXS5j
cmVhdGVJbnRlcnBvbGFudCggbnVsbCApOworCQkJaW50ZXJwb2xhbnRzWyBpIF0gPSBpbnRlcnBv
bGFudDsKKwkJCWludGVycG9sYW50LnNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5nczsKKwor
CQl9CisKKwkJdGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7
CisKKwkJdGhpcy5faW50ZXJwb2xhbnRzID0gaW50ZXJwb2xhbnRzOwkvLyBib3VuZCBieSB0aGUg
bWl4ZXIKKworCQkvLyBpbnNpZGU6IFByb3BlcnR5TWl4ZXIgKG1hbmFnZWQgYnkgdGhlIG1peGVy
KQorCQl0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzID0gbmV3IEFycmF5KCBuVHJhY2tzICk7CisKKwkJ
dGhpcy5fY2FjaGVJbmRleCA9IG51bGw7CQkJLy8gZm9yIHRoZSBtZW1vcnkgbWFuYWdlcgorCQl0
aGlzLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDsJCS8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXIK
KworCQl0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IG51bGw7CisJCXRoaXMuX3dlaWdodElu
dGVycG9sYW50ID0gbnVsbDsKKworCQl0aGlzLmxvb3AgPSBMb29wUmVwZWF0OworCQl0aGlzLl9s
b29wQ291bnQgPSAtMTsKKworCQkvLyBnbG9iYWwgbWl4ZXIgdGltZSB3aGVuIHRoZSBhY3Rpb24g
aXMgdG8gYmUgc3RhcnRlZAorCQkvLyBpdCdzIHNldCBiYWNrIHRvICdudWxsJyB1cG9uIHN0YXJ0
IG9mIHRoZSBhY3Rpb24KKwkJdGhpcy5fc3RhcnRUaW1lID0gbnVsbDsKKworCQkvLyBzY2FsZWQg
bG9jYWwgdGltZSBvZiB0aGUgYWN0aW9uCisJCS8vIGdldHMgY2xhbXBlZCBvciB3cmFwcGVkIHRv
IDAuLmNsaXAuZHVyYXRpb24gYWNjb3JkaW5nIHRvIGxvb3AKKwkJdGhpcy50aW1lID0gMDsKKwor
CQl0aGlzLnRpbWVTY2FsZSA9IDE7CisJCXRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IDE7CisK
KwkJdGhpcy53ZWlnaHQgPSAxOworCQl0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSAxOworCisJCXRo
aXMucmVwZXRpdGlvbnMgPSBJbmZpbml0eTsgCQkvLyBuby4gb2YgcmVwZXRpdGlvbnMgd2hlbiBs
b29waW5nCisKKwkJdGhpcy5wYXVzZWQgPSBmYWxzZTsJCQkJLy8gdHJ1ZSAtPiB6ZXJvIGVmZmVj
dGl2ZSB0aW1lIHNjYWxlCisJCXRoaXMuZW5hYmxlZCA9IHRydWU7CQkJCS8vIGZhbHNlIC0+IHpl
cm8gZWZmZWN0aXZlIHdlaWdodAorCisJCXRoaXMuY2xhbXBXaGVuRmluaXNoZWQgCT0gZmFsc2U7
CS8vIGtlZXAgZmVlZGluZyB0aGUgbGFzdCBmcmFtZT8KKworCQl0aGlzLnplcm9TbG9wZUF0U3Rh
cnQgCT0gdHJ1ZTsJCS8vIGZvciBzbW9vdGggaW50ZXJwb2xhdGlvbiB3L28gc2VwYXJhdGUKKwkJ
dGhpcy56ZXJvU2xvcGVBdEVuZAkJPSB0cnVlOwkJLy8gY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFu
ZCBlbmQKKworCX0KKworCU9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkFjdGlvbi5wcm90b3R5cGUs
IHsKKworCQkvLyBTdGF0ZSAmIFNjaGVkdWxpbmcKKworCQlwbGF5OiBmdW5jdGlvbigpIHsKKwor
CQkJdGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKCB0aGlzICk7CisKKwkJCXJldHVybiB0aGlz
OworCisJCX0sCisKKwkJc3RvcDogZnVuY3Rpb24oKSB7CisKKwkJCXRoaXMuX21peGVyLl9kZWFj
dGl2YXRlQWN0aW9uKCB0aGlzICk7CisKKwkJCXJldHVybiB0aGlzLnJlc2V0KCk7CisKKwkJfSwK
KworCQlyZXNldDogZnVuY3Rpb24oKSB7CisKKwkJCXRoaXMucGF1c2VkID0gZmFsc2U7CisJCQl0
aGlzLmVuYWJsZWQgPSB0cnVlOworCisJCQl0aGlzLnRpbWUgPSAwOwkJCS8vIHJlc3RhcnQgY2xp
cAorCQkJdGhpcy5fbG9vcENvdW50ID0gLTE7CS8vIGZvcmdldCBwcmV2aW91cyBsb29wcworCQkJ
dGhpcy5fc3RhcnRUaW1lID0gbnVsbDsJLy8gZm9yZ2V0IHNjaGVkdWxpbmcKKworCQkJcmV0dXJu
IHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCk7CisKKwkJfSwKKworCQlpc1J1bm5pbmc6
IGZ1bmN0aW9uKCkgeworCisJCQlyZXR1cm4gdGhpcy5lbmFibGVkICYmICEgdGhpcy5wYXVzZWQg
JiYgdGhpcy50aW1lU2NhbGUgIT09IDAgJiYKKwkJCQkJdGhpcy5fc3RhcnRUaW1lID09PSBudWxs
ICYmIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApOworCisJCX0sCisKKwkJLy8g
cmV0dXJuIHRydWUgd2hlbiBwbGF5IGhhcyBiZWVuIGNhbGxlZAorCQlpc1NjaGVkdWxlZDogZnVu
Y3Rpb24oKSB7CisKKwkJCXJldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMg
KTsKKworCQl9LAorCisJCXN0YXJ0QXQ6IGZ1bmN0aW9uKCB0aW1lICkgeworCisJCQl0aGlzLl9z
dGFydFRpbWUgPSB0aW1lOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldExvb3A6
IGZ1bmN0aW9uKCBtb2RlLCByZXBldGl0aW9ucyApIHsKKworCQkJdGhpcy5sb29wID0gbW9kZTsK
KwkJCXRoaXMucmVwZXRpdGlvbnMgPSByZXBldGl0aW9uczsKKworCQkJcmV0dXJuIHRoaXM7CisK
KwkJfSwKKworCQkvLyBXZWlnaHQKKworCQkvLyBzZXQgdGhlIHdlaWdodCBzdG9wcGluZyBhbnkg
c2NoZWR1bGVkIGZhZGluZworCQkvLyBhbHRob3VnaCAuZW5hYmxlZCA9IGZhbHNlIHlpZWxkcyBh
biBlZmZlY3RpdmUgd2VpZ2h0IG9mIHplcm8sIHRoaXMKKwkJLy8gbWV0aG9kIGRvZXMgKm5vdCog
Y2hhbmdlIC5lbmFibGVkLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGNvbmZ1c2luZworCQlzZXRFZmZl
Y3RpdmVXZWlnaHQ6IGZ1bmN0aW9uKCB3ZWlnaHQgKSB7CisKKwkJCXRoaXMud2VpZ2h0ID0gd2Vp
Z2h0OworCisJCQkvLyBub3RlOiBzYW1lIGxvZ2ljIGFzIHdoZW4gdXBkYXRlZCBhdCBydW50aW1l
CisJCQl0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB0aGlzLmVuYWJsZWQgPyB3ZWlnaHQgOiAwOwor
CisJCQlyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCk7CisKKwkJfSwKKworCQkvLyByZXR1cm4gdGhl
IHdlaWdodCBjb25zaWRlcmluZyBmYWRpbmcgYW5kIC5lbmFibGVkCisJCWdldEVmZmVjdGl2ZVdl
aWdodDogZnVuY3Rpb24oKSB7CisKKwkJCXJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ7CisK
KwkJfSwKKworCQlmYWRlSW46IGZ1bmN0aW9uKCBkdXJhdGlvbiApIHsKKworCQkJcmV0dXJuIHRo
aXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMCwgMSApOworCisJCX0sCisKKwkJZmFkZU91
dDogZnVuY3Rpb24oIGR1cmF0aW9uICkgeworCisJCQlyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRp
bmcoIGR1cmF0aW9uLCAxLCAwICk7CisKKwkJfSwKKworCQljcm9zc0ZhZGVGcm9tOiBmdW5jdGlv
biggZmFkZU91dEFjdGlvbiwgZHVyYXRpb24sIHdhcnAgKSB7CisKKwkJCWZhZGVPdXRBY3Rpb24u
ZmFkZU91dCggZHVyYXRpb24gKTsKKwkJCXRoaXMuZmFkZUluKCBkdXJhdGlvbiApOworCisJCQlp
Ziggd2FycCApIHsKKworCQkJCXZhciBmYWRlSW5EdXJhdGlvbiA9IHRoaXMuX2NsaXAuZHVyYXRp
b24sCisJCQkJCWZhZGVPdXREdXJhdGlvbiA9IGZhZGVPdXRBY3Rpb24uX2NsaXAuZHVyYXRpb24s
CisKKwkJCQkJc3RhcnRFbmRSYXRpbyA9IGZhZGVPdXREdXJhdGlvbiAvIGZhZGVJbkR1cmF0aW9u
LAorCQkJCQllbmRTdGFydFJhdGlvID0gZmFkZUluRHVyYXRpb24gLyBmYWRlT3V0RHVyYXRpb247
CisKKwkJCQlmYWRlT3V0QWN0aW9uLndhcnAoIDEuMCwgc3RhcnRFbmRSYXRpbywgZHVyYXRpb24g
KTsKKwkJCQl0aGlzLndhcnAoIGVuZFN0YXJ0UmF0aW8sIDEuMCwgZHVyYXRpb24gKTsKKworCQkJ
fQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNyb3NzRmFkZVRvOiBmdW5jdGlvbigg
ZmFkZUluQWN0aW9uLCBkdXJhdGlvbiwgd2FycCApIHsKKworCQkJcmV0dXJuIGZhZGVJbkFjdGlv
bi5jcm9zc0ZhZGVGcm9tKCB0aGlzLCBkdXJhdGlvbiwgd2FycCApOworCisJCX0sCisKKwkJc3Rv
cEZhZGluZzogZnVuY3Rpb24oKSB7CisKKwkJCXZhciB3ZWlnaHRJbnRlcnBvbGFudCA9IHRoaXMu
X3dlaWdodEludGVycG9sYW50OworCisJCQlpZiAoIHdlaWdodEludGVycG9sYW50ICE9PSBudWxs
ICkgeworCisJCQkJdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBudWxsOworCQkJCXRoaXMuX21p
eGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggd2VpZ2h0SW50ZXJwb2xhbnQgKTsKKwor
CQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCS8vIFRpbWUgU2NhbGUgQ29udHJv
bAorCisJCS8vIHNldCB0aGUgdGltZSBzY2FsZSBzdG9wcGluZyBhbnkgc2NoZWR1bGVkIHdhcnBp
bmcKKwkJLy8gYWx0aG91Z2ggLnBhdXNlZCA9IHRydWUgeWllbGRzIGFuIGVmZmVjdGl2ZSB0aW1l
IHNjYWxlIG9mIHplcm8sIHRoaXMKKwkJLy8gbWV0aG9kIGRvZXMgKm5vdCogY2hhbmdlIC5wYXVz
ZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nCisJCXNldEVmZmVjdGl2ZVRpbWVTY2Fs
ZTogZnVuY3Rpb24oIHRpbWVTY2FsZSApIHsKKworCQkJdGhpcy50aW1lU2NhbGUgPSB0aW1lU2Nh
bGU7CisJCQl0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aGlzLnBhdXNlZCA/IDAgOnRpbWVT
Y2FsZTsKKworCQkJcmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTsKKworCQl9LAorCisJCS8vIHJl
dHVybiB0aGUgdGltZSBzY2FsZSBjb25zaWRlcmluZyB3YXJwaW5nIGFuZCAucGF1c2VkCisJCWdl
dEVmZmVjdGl2ZVRpbWVTY2FsZTogZnVuY3Rpb24oKSB7CisKKwkJCXJldHVybiB0aGlzLl9lZmZl
Y3RpdmVUaW1lU2NhbGU7CisKKwkJfSwKKworCQlzZXREdXJhdGlvbjogZnVuY3Rpb24oIGR1cmF0
aW9uICkgeworCisJCQl0aGlzLnRpbWVTY2FsZSA9IHRoaXMuX2NsaXAuZHVyYXRpb24gLyBkdXJh
dGlvbjsKKworCQkJcmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTsKKworCQl9LAorCisJCXN5bmNX
aXRoOiBmdW5jdGlvbiggYWN0aW9uICkgeworCisJCQl0aGlzLnRpbWUgPSBhY3Rpb24udGltZTsK
KwkJCXRoaXMudGltZVNjYWxlID0gYWN0aW9uLnRpbWVTY2FsZTsKKworCQkJcmV0dXJuIHRoaXMu
c3RvcFdhcnBpbmcoKTsKKworCQl9LAorCisJCWhhbHQ6IGZ1bmN0aW9uKCBkdXJhdGlvbiApIHsK
KworCQkJcmV0dXJuIHRoaXMud2FycCggdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLCAwLCBkdXJh
dGlvbiApOworCisJCX0sCisKKwkJd2FycDogZnVuY3Rpb24oIHN0YXJ0VGltZVNjYWxlLCBlbmRU
aW1lU2NhbGUsIGR1cmF0aW9uICkgeworCisJCQl2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93
ID0gbWl4ZXIudGltZSwKKwkJCQlpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9s
YW50LAorCisJCQkJdGltZVNjYWxlID0gdGhpcy50aW1lU2NhbGU7CisKKwkJCWlmICggaW50ZXJw
b2xhbnQgPT09IG51bGwgKSB7CisKKwkJCQlpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJv
bEludGVycG9sYW50KCk7CisJCQkJdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBpbnRlcnBv
bGFudDsKKworCQkJfQorCisJCQl2YXIgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3Np
dGlvbnMsCisJCQkJdmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzOworCisJCQl0aW1l
c1sgMCBdID0gbm93OworCQkJdGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uOworCisJCQl2YWx1
ZXNbIDAgXSA9IHN0YXJ0VGltZVNjYWxlIC8gdGltZVNjYWxlOworCQkJdmFsdWVzWyAxIF0gPSBl
bmRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJ
c3RvcFdhcnBpbmc6IGZ1bmN0aW9uKCkgeworCisJCQl2YXIgdGltZVNjYWxlSW50ZXJwb2xhbnQg
PSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDsKKworCQkJaWYgKCB0aW1lU2NhbGVJbnRlcnBv
bGFudCAhPT0gbnVsbCApIHsKKworCQkJCXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVs
bDsKKwkJCQl0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHRpbWVTY2Fs
ZUludGVycG9sYW50ICk7CisKKwkJCX0KKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQkv
LyBPYmplY3QgQWNjZXNzb3JzCisKKwkJZ2V0TWl4ZXI6IGZ1bmN0aW9uKCkgeworCisJCQlyZXR1
cm4gdGhpcy5fbWl4ZXI7CisKKwkJfSwKKworCQlnZXRDbGlwOiBmdW5jdGlvbigpIHsKKworCQkJ
cmV0dXJuIHRoaXMuX2NsaXA7CisKKwkJfSwKKworCQlnZXRSb290OiBmdW5jdGlvbigpIHsKKwor
CQkJcmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9taXhlci5fcm9vdDsKKworCQl9LAor
CisJCS8vIEludGVybmEKKworCQlfdXBkYXRlOiBmdW5jdGlvbiggdGltZSwgZGVsdGFUaW1lLCB0
aW1lRGlyZWN0aW9uLCBhY2N1SW5kZXggKSB7CisKKwkJCS8vIGNhbGxlZCBieSB0aGUgbWl4ZXIK
KworCQkJaWYgKCAhIHRoaXMuZW5hYmxlZCApIHsKKworCQkJCS8vIGNhbGwgLl91cGRhdGVXZWln
aHQoKSB0byB1cGRhdGUgLl9lZmZlY3RpdmVXZWlnaHQKKworCQkJCXRoaXMuX3VwZGF0ZVdlaWdo
dCggdGltZSApOworCQkJCXJldHVybjsKKworCQkJfQorCisJCQl2YXIgc3RhcnRUaW1lID0gdGhp
cy5fc3RhcnRUaW1lOworCisJCQlpZiAoIHN0YXJ0VGltZSAhPT0gbnVsbCApIHsKKworCQkJCS8v
IGNoZWNrIGZvciBzY2hlZHVsZWQgc3RhcnQgb2YgYWN0aW9uCisKKwkJCQl2YXIgdGltZVJ1bm5p
bmcgPSAoIHRpbWUgLSBzdGFydFRpbWUgKSAqIHRpbWVEaXJlY3Rpb247CisJCQkJaWYgKCB0aW1l
UnVubmluZyA8IDAgfHwgdGltZURpcmVjdGlvbiA9PT0gMCApIHsKKworCQkJCQlyZXR1cm47IC8v
IHlldCB0byBjb21lIC8gZG9uJ3QgZGVjaWRlIHdoZW4gZGVsdGEgPSAwCisKKwkJCQl9CisKKwkJ
CQkvLyBzdGFydAorCisJCQkJdGhpcy5fc3RhcnRUaW1lID0gbnVsbDsgLy8gdW5zY2hlZHVsZQor
CQkJCWRlbHRhVGltZSA9IHRpbWVEaXJlY3Rpb24gKiB0aW1lUnVubmluZzsKKworCQkJfQorCisJ
CQkvLyBhcHBseSB0aW1lIHNjYWxlIGFuZCBhZHZhbmNlIHRpbWUKKworCQkJZGVsdGFUaW1lICo9
IHRoaXMuX3VwZGF0ZVRpbWVTY2FsZSggdGltZSApOworCQkJdmFyIGNsaXBUaW1lID0gdGhpcy5f
dXBkYXRlVGltZSggZGVsdGFUaW1lICk7CisKKwkJCS8vIG5vdGU6IF91cGRhdGVUaW1lIG1heSBk
aXNhYmxlIHRoZSBhY3Rpb24gcmVzdWx0aW5nIGluCisJCQkvLyBhbiBlZmZlY3RpdmUgd2VpZ2h0
IG9mIDAKKworCQkJdmFyIHdlaWdodCA9IHRoaXMuX3VwZGF0ZVdlaWdodCggdGltZSApOworCisJ
CQlpZiAoIHdlaWdodCA+IDAgKSB7CisKKwkJCQl2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5faW50
ZXJwb2xhbnRzOworCQkJCXZhciBwcm9wZXJ0eU1peGVycyA9IHRoaXMuX3Byb3BlcnR5QmluZGlu
Z3M7CisKKwkJCQlmb3IgKCB2YXIgaiA9IDAsIG0gPSBpbnRlcnBvbGFudHMubGVuZ3RoOyBqICE9
PSBtOyArKyBqICkgeworCisJCQkJCWludGVycG9sYW50c1sgaiBdLmV2YWx1YXRlKCBjbGlwVGlt
ZSApOworCQkJCQlwcm9wZXJ0eU1peGVyc1sgaiBdLmFjY3VtdWxhdGUoIGFjY3VJbmRleCwgd2Vp
Z2h0ICk7CisKKwkJCQl9CisKKwkJCX0KKworCQl9LAorCisJCV91cGRhdGVXZWlnaHQ6IGZ1bmN0
aW9uKCB0aW1lICkgeworCisJCQl2YXIgd2VpZ2h0ID0gMDsKKworCQkJaWYgKCB0aGlzLmVuYWJs
ZWQgKSB7CisKKwkJCQl3ZWlnaHQgPSB0aGlzLndlaWdodDsKKwkJCQl2YXIgaW50ZXJwb2xhbnQg
PSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDsKKworCQkJCWlmICggaW50ZXJwb2xhbnQgIT09IG51
bGwgKSB7CisKKwkJCQkJdmFyIGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0
ZSggdGltZSApWyAwIF07CisKKwkJCQkJd2VpZ2h0ICo9IGludGVycG9sYW50VmFsdWU7CisKKwkJ
CQkJaWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7CisK
KwkJCQkJCXRoaXMuc3RvcEZhZGluZygpOworCisJCQkJCQlpZiAoIGludGVycG9sYW50VmFsdWUg
PT09IDAgKSB7CisKKwkJCQkJCQkvLyBmYWRlZCBvdXQsIGRpc2FibGUKKwkJCQkJCQl0aGlzLmVu
YWJsZWQgPSBmYWxzZTsKKworCQkJCQkJfQorCisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJ
CQl0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB3ZWlnaHQ7CisJCQlyZXR1cm4gd2VpZ2h0OworCisJ
CX0sCisKKwkJX3VwZGF0ZVRpbWVTY2FsZTogZnVuY3Rpb24oIHRpbWUgKSB7CisKKwkJCXZhciB0
aW1lU2NhbGUgPSAwOworCisJCQlpZiAoICEgdGhpcy5wYXVzZWQgKSB7CisKKwkJCQl0aW1lU2Nh
bGUgPSB0aGlzLnRpbWVTY2FsZTsKKworCQkJCXZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVT
Y2FsZUludGVycG9sYW50OworCisJCQkJaWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCApIHsKKwor
CQkJCQl2YXIgaW50ZXJwb2xhbnRWYWx1ZSA9IGludGVycG9sYW50LmV2YWx1YXRlKCB0aW1lIClb
IDAgXTsKKworCQkJCQl0aW1lU2NhbGUgKj0gaW50ZXJwb2xhbnRWYWx1ZTsKKworCQkJCQlpZiAo
IHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbIDEgXSApIHsKKworCQkJCQkJ
dGhpcy5zdG9wV2FycGluZygpOworCisJCQkJCQlpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHsKKwor
CQkJCQkJCS8vIG1vdGlvbiBoYXMgaGFsdGVkLCBwYXVzZQorCQkJCQkJCXRoaXMucGF1c2VkID0g
dHJ1ZTsKKworCQkJCQkJfSBlbHNlIHsKKworCQkJCQkJCS8vIHdhcnAgZG9uZSAtIGFwcGx5IGZp
bmFsIHRpbWUgc2NhbGUKKwkJCQkJCQl0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTsKKworCQkJ
CQkJfQorCisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCisJCQl0aGlzLl9lZmZlY3RpdmVUaW1l
U2NhbGUgPSB0aW1lU2NhbGU7CisJCQlyZXR1cm4gdGltZVNjYWxlOworCisJCX0sCisKKwkJX3Vw
ZGF0ZVRpbWU6IGZ1bmN0aW9uKCBkZWx0YVRpbWUgKSB7CisKKwkJCXZhciB0aW1lID0gdGhpcy50
aW1lICsgZGVsdGFUaW1lOworCisJCQlpZiAoIGRlbHRhVGltZSA9PT0gMCApIHJldHVybiB0aW1l
OworCisJCQl2YXIgZHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLAorCisJCQkJbG9vcCA9
IHRoaXMubG9vcCwKKwkJCQlsb29wQ291bnQgPSB0aGlzLl9sb29wQ291bnQ7CisKKwkJCWlmICgg
bG9vcCA9PT0gTG9vcE9uY2UgKSB7CisKKwkJCQlpZiAoIGxvb3BDb3VudCA9PT0gLTEgKSB7CisJ
CQkJCS8vIGp1c3Qgc3RhcnRlZAorCisJCQkJCXRoaXMuX2xvb3BDb3VudCA9IDA7CisJCQkJCXRo
aXMuX3NldEVuZGluZ3MoIHRydWUsIHRydWUsIGZhbHNlICk7CisKKwkJCQl9CisKKwkJCQloYW5k
bGVfc3RvcDogeworCisJCQkJCWlmICggdGltZSA+PSBkdXJhdGlvbiApIHsKKworCQkJCQkJdGlt
ZSA9IGR1cmF0aW9uOworCisJCQkJCX0gZWxzZSBpZiAoIHRpbWUgPCAwICkgeworCisJCQkJCQl0
aW1lID0gMDsKKworCQkJCQl9IGVsc2UgYnJlYWsgaGFuZGxlX3N0b3A7CisKKwkJCQkJaWYgKCB0
aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlOworCQkJCQllbHNlIHRo
aXMuZW5hYmxlZCA9IGZhbHNlOworCisJCQkJCXRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHsK
KwkJCQkJCXR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcywKKwkJCQkJCWRpcmVjdGlvbjog
ZGVsdGFUaW1lIDwgMCA/IC0xIDogMQorCQkJCQl9ICk7CisKKwkJCQl9CisKKwkJCX0gZWxzZSB7
IC8vIHJlcGV0aXRpdmUgUmVwZWF0IG9yIFBpbmdQb25nCisKKwkJCQl2YXIgcGluZ1BvbmcgPSAo
IGxvb3AgPT09IExvb3BQaW5nUG9uZyApOworCisJCQkJaWYgKCBsb29wQ291bnQgPT09IC0xICkg
eworCQkJCQkvLyBqdXN0IHN0YXJ0ZWQKKworCQkJCQlpZiAoIGRlbHRhVGltZSA+PSAwICkgewor
CisJCQkJCQlsb29wQ291bnQgPSAwOworCisJCQkJCQl0aGlzLl9zZXRFbmRpbmdzKAorCQkJCQkJ
CQl0cnVlLCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCBwaW5nUG9uZyApOworCisJCQkJCX0gZWxz
ZSB7CisKKwkJCQkJCS8vIHdoZW4gbG9vcGluZyBpbiByZXZlcnNlIGRpcmVjdGlvbiwgdGhlIGlu
aXRpYWwKKwkJCQkJCS8vIHRyYW5zaXRpb24gdGhyb3VnaCB6ZXJvIGNvdW50cyBhcyBhIHJlcGV0
aXRpb24sCisJCQkJCQkvLyBzbyBsZWF2ZSBsb29wQ291bnQgYXQgLTEKKworCQkJCQkJdGhpcy5f
c2V0RW5kaW5ncygKKwkJCQkJCQkJdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgdHJ1ZSwgcGluZ1Bv
bmcgKTsKKworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlpZiAoIHRpbWUgPj0gZHVyYXRpb24gfHwg
dGltZSA8IDAgKSB7CisJCQkJCS8vIHdyYXAgYXJvdW5kCisKKwkJCQkJdmFyIGxvb3BEZWx0YSA9
IE1hdGguZmxvb3IoIHRpbWUgLyBkdXJhdGlvbiApOyAvLyBzaWduZWQKKwkJCQkJdGltZSAtPSBk
dXJhdGlvbiAqIGxvb3BEZWx0YTsKKworCQkJCQlsb29wQ291bnQgKz0gTWF0aC5hYnMoIGxvb3BE
ZWx0YSApOworCisJCQkJCXZhciBwZW5kaW5nID0gdGhpcy5yZXBldGl0aW9ucyAtIGxvb3BDb3Vu
dDsKKworCQkJCQlpZiAoIHBlbmRpbmcgPCAwICkgeworCQkJCQkJLy8gaGF2ZSB0byBzdG9wIChz
d2l0Y2ggc3RhdGUsIGNsYW1wIHRpbWUsIGZpcmUgZXZlbnQpCisKKwkJCQkJCWlmICggdGhpcy5j
bGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTsKKwkJCQkJCWVsc2UgdGhpcy5l
bmFibGVkID0gZmFsc2U7CisKKwkJCQkJCXRpbWUgPSBkZWx0YVRpbWUgPiAwID8gZHVyYXRpb24g
OiAwOworCisJCQkJCQl0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7CisJCQkJCQkJdHlwZTog
J2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLAorCQkJCQkJCWRpcmVjdGlvbjogZGVsdGFUaW1lID4g
MCA/IDEgOiAtMQorCQkJCQkJfSApOworCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBrZWVwIHJ1
bm5pbmcKKworCQkJCQkJaWYgKCBwZW5kaW5nID09PSAwICkgeworCQkJCQkJCS8vIGVudGVyaW5n
IHRoZSBsYXN0IHJvdW5kCisKKwkJCQkJCQl2YXIgYXRTdGFydCA9IGRlbHRhVGltZSA8IDA7CisJ
CQkJCQkJdGhpcy5fc2V0RW5kaW5ncyggYXRTdGFydCwgISBhdFN0YXJ0LCBwaW5nUG9uZyApOwor
CisJCQkJCQl9IGVsc2UgeworCisJCQkJCQkJdGhpcy5fc2V0RW5kaW5ncyggZmFsc2UsIGZhbHNl
LCBwaW5nUG9uZyApOworCisJCQkJCQl9CisKKwkJCQkJCXRoaXMuX2xvb3BDb3VudCA9IGxvb3BD
b3VudDsKKworCQkJCQkJdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCggeworCQkJCQkJCXR5cGU6
ICdsb29wJywgYWN0aW9uOiB0aGlzLCBsb29wRGVsdGE6IGxvb3BEZWx0YQorCQkJCQkJfSApOwor
CisJCQkJCX0KKworCQkJCX0KKworCQkJCWlmICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAx
ICkgPT09IDEgKSB7CisJCQkJCS8vIGludmVydCB0aW1lIGZvciB0aGUgInBvbmcgcm91bmQiCisK
KwkJCQkJdGhpcy50aW1lID0gdGltZTsKKwkJCQkJcmV0dXJuIGR1cmF0aW9uIC0gdGltZTsKKwor
CQkJCX0KKworCQkJfQorCisJCQl0aGlzLnRpbWUgPSB0aW1lOworCQkJcmV0dXJuIHRpbWU7CisK
KwkJfSwKKworCQlfc2V0RW5kaW5nczogZnVuY3Rpb24oIGF0U3RhcnQsIGF0RW5kLCBwaW5nUG9u
ZyApIHsKKworCQkJdmFyIHNldHRpbmdzID0gdGhpcy5faW50ZXJwb2xhbnRTZXR0aW5nczsKKwor
CQkJaWYgKCBwaW5nUG9uZyApIHsKKworCQkJCXNldHRpbmdzLmVuZGluZ1N0YXJ0IAk9IFplcm9T
bG9wZUVuZGluZzsKKwkJCQlzZXR0aW5ncy5lbmRpbmdFbmQJCT0gWmVyb1Nsb3BlRW5kaW5nOwor
CisJCQl9IGVsc2UgeworCisJCQkJLy8gYXNzdW1pbmcgZm9yIExvb3BPbmNlIGF0U3RhcnQgPT0g
YXRFbmQgPT0gdHJ1ZQorCisJCQkJaWYgKCBhdFN0YXJ0ICkgeworCisJCQkJCXNldHRpbmdzLmVu
ZGluZ1N0YXJ0ID0gdGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID8KKwkJCQkJCQlaZXJvU2xvcGVFbmRp
bmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nOworCisJCQkJfSBlbHNlIHsKKworCQkJCQlzZXR0aW5n
cy5lbmRpbmdTdGFydCA9IFdyYXBBcm91bmRFbmRpbmc7CisKKwkJCQl9CisKKwkJCQlpZiAoIGF0
RW5kICkgeworCisJCQkJCXNldHRpbmdzLmVuZGluZ0VuZCA9IHRoaXMuemVyb1Nsb3BlQXRFbmQg
PworCQkJCQkJCVplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7CisKKwkJCQl9
IGVsc2UgeworCisJCQkJCXNldHRpbmdzLmVuZGluZ0VuZCAJID0gV3JhcEFyb3VuZEVuZGluZzsK
KworCQkJCX0KKworCQkJfQorCisJCX0sCisKKwkJX3NjaGVkdWxlRmFkaW5nOiBmdW5jdGlvbigg
ZHVyYXRpb24sIHdlaWdodE5vdywgd2VpZ2h0VGhlbiApIHsKKworCQkJdmFyIG1peGVyID0gdGhp
cy5fbWl4ZXIsIG5vdyA9IG1peGVyLnRpbWUsCisJCQkJaW50ZXJwb2xhbnQgPSB0aGlzLl93ZWln
aHRJbnRlcnBvbGFudDsKKworCQkJaWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHsKKworCQkJ
CWludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTsKKwkJCQl0aGlz
Ll93ZWlnaHRJbnRlcnBvbGFudCA9IGludGVycG9sYW50OworCisJCQl9CisKKwkJCXZhciB0aW1l
cyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucywKKwkJCQl2YWx1ZXMgPSBpbnRlcnBv
bGFudC5zYW1wbGVWYWx1ZXM7CisKKwkJCXRpbWVzWyAwIF0gPSBub3c7IAkJCQl2YWx1ZXNbIDAg
XSA9IHdlaWdodE5vdzsKKwkJCXRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjsJdmFsdWVzWyAx
IF0gPSB3ZWlnaHRUaGVuOworCisJCQlyZXR1cm4gdGhpczsKKworCQl9CisKKwl9ICk7CisKKwkv
KioKKwkgKgorCSAqIFBsYXllciBmb3IgQW5pbWF0aW9uQ2xpcHMuCisJICoKKwkgKgorCSAqIEBh
dXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCisJICogQGF1dGhvciBEYXZpZCBT
YXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCisJICogQGF1dGhvciB0c2NodworCSAqLworCisJ
ZnVuY3Rpb24gQW5pbWF0aW9uTWl4ZXIoIHJvb3QgKSB7CisKKwkJdGhpcy5fcm9vdCA9IHJvb3Q7
CisJCXRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7CisJCXRoaXMuX2FjY3VJbmRleCA9IDA7CisK
KwkJdGhpcy50aW1lID0gMDsKKworCQl0aGlzLnRpbWVTY2FsZSA9IDEuMDsKKworCX0KKworCU9i
amVjdC5hc3NpZ24oIEFuaW1hdGlvbk1peGVyLnByb3RvdHlwZSwgRXZlbnREaXNwYXRjaGVyLnBy
b3RvdHlwZSwgeworCisJCV9iaW5kQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiwgcHJvdG90eXBl
QWN0aW9uICkgeworCisJCQl2YXIgcm9vdCA9IGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jv
b3QsCisJCQkJdHJhY2tzID0gYWN0aW9uLl9jbGlwLnRyYWNrcywKKwkJCQluVHJhY2tzID0gdHJh
Y2tzLmxlbmd0aCwKKwkJCQliaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncywKKwkJ
CQlpbnRlcnBvbGFudHMgPSBhY3Rpb24uX2ludGVycG9sYW50cywKKwkJCQlyb290VXVpZCA9IHJv
b3QudXVpZCwKKwkJCQliaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFt
ZSwKKwkJCQliaW5kaW5nc0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdOworCisJ
CQlpZiAoIGJpbmRpbmdzQnlOYW1lID09PSB1bmRlZmluZWQgKSB7CisKKwkJCQliaW5kaW5nc0J5
TmFtZSA9IHt9OworCQkJCWJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ3NCeU5h
bWU7CisKKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkg
eworCisJCQkJdmFyIHRyYWNrID0gdHJhY2tzWyBpIF0sCisJCQkJCXRyYWNrTmFtZSA9IHRyYWNr
Lm5hbWUsCisJCQkJCWJpbmRpbmcgPSBiaW5kaW5nc0J5TmFtZVsgdHJhY2tOYW1lIF07CisKKwkJ
CQlpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCQliaW5kaW5nc1sgaSBdID0g
YmluZGluZzsKKworCQkJCX0gZWxzZSB7CisKKwkJCQkJYmluZGluZyA9IGJpbmRpbmdzWyBpIF07
CisKKwkJCQkJaWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJCS8vIGV4aXN0
aW5nIGJpbmRpbmcsIG1ha2Ugc3VyZSB0aGUgY2FjaGUga25vd3MKKworCQkJCQkJaWYgKCBiaW5k
aW5nLl9jYWNoZUluZGV4ID09PSBudWxsICkgeworCisJCQkJCQkJKysgYmluZGluZy5yZWZlcmVu
Y2VDb3VudDsKKwkJCQkJCQl0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RV
dWlkLCB0cmFja05hbWUgKTsKKworCQkJCQkJfQorCisJCQkJCQljb250aW51ZTsKKworCQkJCQl9
CisKKwkJCQkJdmFyIHBhdGggPSBwcm90b3R5cGVBY3Rpb24gJiYgcHJvdG90eXBlQWN0aW9uLgor
CQkJCQkJCV9wcm9wZXJ0eUJpbmRpbmdzWyBpIF0uYmluZGluZy5wYXJzZWRQYXRoOworCisJCQkJ
CWJpbmRpbmcgPSBuZXcgUHJvcGVydHlNaXhlcigKKwkJCQkJCVByb3BlcnR5QmluZGluZy5jcmVh
dGUoIHJvb3QsIHRyYWNrTmFtZSwgcGF0aCApLAorCQkJCQkJdHJhY2suVmFsdWVUeXBlTmFtZSwg
dHJhY2suZ2V0VmFsdWVTaXplKCkgKTsKKworCQkJCQkrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50
OworCQkJCQl0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFj
a05hbWUgKTsKKworCQkJCQliaW5kaW5nc1sgaSBdID0gYmluZGluZzsKKworCQkJCX0KKworCQkJ
CWludGVycG9sYW50c1sgaSBdLnJlc3VsdEJ1ZmZlciA9IGJpbmRpbmcuYnVmZmVyOworCisJCQl9
CisKKwkJfSwKKworCQlfYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkgeworCisJ
CQlpZiAoICEgdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkgeworCisJCQkJaWYgKCBh
Y3Rpb24uX2NhY2hlSW5kZXggPT09IG51bGwgKSB7CisKKwkJCQkJLy8gdGhpcyBhY3Rpb24gaGFz
IGJlZW4gZm9yZ290dGVuIGJ5IHRoZSBjYWNoZSwgYnV0IHRoZSB1c2VyCisJCQkJCS8vIGFwcGVh
cnMgdG8gYmUgc3RpbGwgdXNpbmcgaXQgLT4gcmViaW5kCisKKwkJCQkJdmFyIHJvb3RVdWlkID0g
KCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZCwKKwkJCQkJCWNsaXBVdWlk
ID0gYWN0aW9uLl9jbGlwLnV1aWQsCisJCQkJCQlhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlv
bnNCeUNsaXBbIGNsaXBVdWlkIF07CisKKwkJCQkJdGhpcy5fYmluZEFjdGlvbiggYWN0aW9uLAor
CQkJCQkJYWN0aW9uc0ZvckNsaXAgJiYgYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF0g
KTsKKworCQkJCQl0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggYWN0aW9uLCBjbGlwVXVpZCwgcm9v
dFV1aWQgKTsKKworCQkJCX0KKworCQkJCXZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlC
aW5kaW5nczsKKworCQkJCS8vIGluY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQg
c3RhdGUKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47
ICsrIGkgKSB7CisKKwkJCQkJdmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdOworCisJCQkJCWlm
ICggYmluZGluZy51c2VDb3VudCArKyA9PT0gMCApIHsKKworCQkJCQkJdGhpcy5fbGVuZEJpbmRp
bmcoIGJpbmRpbmcgKTsKKwkJCQkJCWJpbmRpbmcuc2F2ZU9yaWdpbmFsU3RhdGUoKTsKKworCQkJ
CQl9CisKKwkJCQl9CisKKwkJCQl0aGlzLl9sZW5kQWN0aW9uKCBhY3Rpb24gKTsKKworCQkJfQor
CisJCX0sCisKKwkJX2RlYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkgeworCisJ
CQlpZiAoIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHsKKworCQkJCXZhciBiaW5k
aW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5nczsKKworCQkJCS8vIGRlY3JlbWVudCByZWZl
cmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGUKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBi
aW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKwkJCQkJdmFyIGJpbmRpbmcgPSBi
aW5kaW5nc1sgaSBdOworCisJCQkJCWlmICggLS0gYmluZGluZy51c2VDb3VudCA9PT0gMCApIHsK
KworCQkJCQkJYmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpOworCQkJCQkJdGhpcy5fdGFr
ZUJhY2tCaW5kaW5nKCBiaW5kaW5nICk7CisKKwkJCQkJfQorCisJCQkJfQorCisJCQkJdGhpcy5f
dGFrZUJhY2tBY3Rpb24oIGFjdGlvbiApOworCisJCQl9CisKKwkJfSwKKworCQkvLyBNZW1vcnkg
bWFuYWdlcgorCisJCV9pbml0TWVtb3J5TWFuYWdlcjogZnVuY3Rpb24gKCkgeworCisJCQl0aGlz
Ll9hY3Rpb25zID0gW107IC8vICduQWN0aXZlQWN0aW9ucycgZm9sbG93ZWQgYnkgaW5hY3RpdmUg
b25lcworCQkJdGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAwOworCisJCQl0aGlzLl9hY3Rpb25zQnlD
bGlwID0ge307CisJCQkvLyBpbnNpZGU6CisJCQkvLyB7CisJCQkvLyAJCWtub3duQWN0aW9uczog
QXJyYXk8IEFuaW1hdGlvbkFjdGlvbiA+CS0gdXNlZCBhcyBwcm90b3R5cGVzCisJCQkvLyAJCWFj
dGlvbkJ5Um9vdDogQW5pbWF0aW9uQWN0aW9uCQkJLSBsb29rdXAKKwkJCS8vIH0KKworCisJCQl0
aGlzLl9iaW5kaW5ncyA9IFtdOyAvLyAnbkFjdGl2ZUJpbmRpbmdzJyBmb2xsb3dlZCBieSBpbmFj
dGl2ZSBvbmVzCisJCQl0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwOworCisJCQl0aGlzLl9iaW5k
aW5nc0J5Um9vdEFuZE5hbWUgPSB7fTsgLy8gaW5zaWRlOiBNYXA8IG5hbWUsIFByb3BlcnR5TWl4
ZXIgPgorCisKKwkJCXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMgPSBbXTsgLy8gc2FtZSBnYW1l
IGFzIGFib3ZlCisJCQl0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyA9IDA7CisKKwkJ
CXZhciBzY29wZSA9IHRoaXM7CisKKwkJCXRoaXMuc3RhdHMgPSB7CisKKwkJCQlhY3Rpb25zOiB7
CisJCQkJCWdldCB0b3RhbCgpIHsgcmV0dXJuIHNjb3BlLl9hY3Rpb25zLmxlbmd0aDsgfSwKKwkJ
CQkJZ2V0IGluVXNlKCkgeyByZXR1cm4gc2NvcGUuX25BY3RpdmVBY3Rpb25zOyB9CisJCQkJfSwK
KwkJCQliaW5kaW5nczogeworCQkJCQlnZXQgdG90YWwoKSB7IHJldHVybiBzY29wZS5fYmluZGlu
Z3MubGVuZ3RoOyB9LAorCQkJCQlnZXQgaW5Vc2UoKSB7IHJldHVybiBzY29wZS5fbkFjdGl2ZUJp
bmRpbmdzOyB9CisJCQkJfSwKKwkJCQljb250cm9sSW50ZXJwb2xhbnRzOiB7CisJCQkJCWdldCB0
b3RhbCgpIHsgcmV0dXJuIHNjb3BlLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aDsgfSwKKwkJ
CQkJZ2V0IGluVXNlKCkgeyByZXR1cm4gc2NvcGUuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRz
OyB9CisJCQkJfQorCisJCQl9OworCisJCX0sCisKKwkJLy8gTWVtb3J5IG1hbmFnZW1lbnQgZm9y
IEFuaW1hdGlvbkFjdGlvbiBvYmplY3RzCisKKwkJX2lzQWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAo
IGFjdGlvbiApIHsKKworCQkJdmFyIGluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4OworCQkJcmV0
dXJuIGluZGV4ICE9PSBudWxsICYmIGluZGV4IDwgdGhpcy5fbkFjdGl2ZUFjdGlvbnM7CisKKwkJ
fSwKKworCQlfYWRkSW5hY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBjbGlwVXVpZCwg
cm9vdFV1aWQgKSB7CisKKwkJCXZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywKKwkJCQlhY3Rp
b25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCwKKwkJCQlhY3Rpb25zRm9yQ2xpcCA9IGFj
dGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CisKKwkJCWlmICggYWN0aW9uc0ZvckNsaXAgPT09IHVu
ZGVmaW5lZCApIHsKKworCQkJCWFjdGlvbnNGb3JDbGlwID0geworCisJCQkJCWtub3duQWN0aW9u
czogWyBhY3Rpb24gXSwKKwkJCQkJYWN0aW9uQnlSb290OiB7fQorCisJCQkJfTsKKworCQkJCWFj
dGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IDA7CisKKwkJCQlhY3Rpb25zQnlDbGlwWyBjbGlwVXVp
ZCBdID0gYWN0aW9uc0ZvckNsaXA7CisKKwkJCX0gZWxzZSB7CisKKwkJCQl2YXIga25vd25BY3Rp
b25zID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zOworCisJCQkJYWN0aW9uLl9ieUNsaXBD
YWNoZUluZGV4ID0ga25vd25BY3Rpb25zLmxlbmd0aDsKKwkJCQlrbm93bkFjdGlvbnMucHVzaCgg
YWN0aW9uICk7CisKKwkJCX0KKworCQkJYWN0aW9uLl9jYWNoZUluZGV4ID0gYWN0aW9ucy5sZW5n
dGg7CisJCQlhY3Rpb25zLnB1c2goIGFjdGlvbiApOworCisJCQlhY3Rpb25zRm9yQ2xpcC5hY3Rp
b25CeVJvb3RbIHJvb3RVdWlkIF0gPSBhY3Rpb247CisKKwkJfSwKKworCQlfcmVtb3ZlSW5hY3Rp
dmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkgeworCisJCQl2YXIgYWN0aW9ucyA9IHRoaXMu
X2FjdGlvbnMsCisJCQkJbGFzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgYWN0aW9ucy5sZW5n
dGggLSAxIF0sCisJCQkJY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDsKKworCQkJbGFz
dEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDsKKwkJCWFjdGlvbnNbIGNh
Y2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjsKKwkJCWFjdGlvbnMucG9wKCk7CisKKwkJ
CWFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7CisKKworCQkJdmFyIGNsaXBVdWlkID0gYWN0aW9u
Ll9jbGlwLnV1aWQsCisJCQkJYWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsCisJ
CQkJYWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLAorCQkJCWtub3du
QWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnMsCisKKwkJCQlsYXN0
S25vd25BY3Rpb24gPQorCQkJCQlrbm93bkFjdGlvbnNGb3JDbGlwWyBrbm93bkFjdGlvbnNGb3JD
bGlwLmxlbmd0aCAtIDEgXSwKKworCQkJCWJ5Q2xpcENhY2hlSW5kZXggPSBhY3Rpb24uX2J5Q2xp
cENhY2hlSW5kZXg7CisKKwkJCWxhc3RLbm93bkFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGJ5
Q2xpcENhY2hlSW5kZXg7CisJCQlrbm93bkFjdGlvbnNGb3JDbGlwWyBieUNsaXBDYWNoZUluZGV4
IF0gPSBsYXN0S25vd25BY3Rpb247CisJCQlrbm93bkFjdGlvbnNGb3JDbGlwLnBvcCgpOworCisJ
CQlhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsOworCisKKwkJCXZhciBhY3Rpb25CeVJv
b3QgPSBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3QsCisJCQkJcm9vdFV1aWQgPSAoIGFjdGlv
bi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkOworCisJCQlkZWxldGUgYWN0aW9uQnlS
b290WyByb290VXVpZCBdOworCisJCQlpZiAoIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoID09
PSAwICkgeworCisJCQkJZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CisKKwkJCX0K
KworCQkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7CisK
KwkJfSwKKworCQlfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbjogZnVuY3Rpb24gKCBh
Y3Rpb24gKSB7CisKKwkJCXZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5nczsK
KwkJCWZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSAp
IHsKKworCQkJCXZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTsKKworCQkJCWlmICggLS0gYmlu
ZGluZy5yZWZlcmVuY2VDb3VudCA9PT0gMCApIHsKKworCQkJCQl0aGlzLl9yZW1vdmVJbmFjdGl2
ZUJpbmRpbmcoIGJpbmRpbmcgKTsKKworCQkJCX0KKworCQkJfQorCisJCX0sCisKKwkJX2xlbmRB
Y3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkgeworCisJCQkvLyBbIGFjdGl2ZSBhY3Rpb25zIHwg
IGluYWN0aXZlIGFjdGlvbnMgIF0KKwkJCS8vIFsgIGFjdGl2ZSBhY3Rpb25zID58IGluYWN0aXZl
IGFjdGlvbnMgXQorCQkJLy8gICAgICAgICAgICAgICAgIHMgICAgICAgIGEKKwkJCS8vICAgICAg
ICAgICAgICAgICAgPC1zd2FwLT4KKwkJCS8vICAgICAgICAgICAgICAgICBhICAgICAgICBzCisK
KwkJCXZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywKKwkJCQlwcmV2SW5kZXggPSBhY3Rpb24u
X2NhY2hlSW5kZXgsCisKKwkJCQlsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQWN0aW9u
cyArKywKKworCQkJCWZpcnN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBsYXN0QWN0aXZlSW5k
ZXggXTsKKworCQkJYWN0aW9uLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4OworCQkJYWN0
aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBhY3Rpb247CisKKwkJCWZpcnN0SW5hY3RpdmVBY3Rp
b24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7CisJCQlhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGZp
cnN0SW5hY3RpdmVBY3Rpb247CisKKwkJfSwKKworCQlfdGFrZUJhY2tBY3Rpb246IGZ1bmN0aW9u
ICggYWN0aW9uICkgeworCisJCQkvLyBbICBhY3RpdmUgYWN0aW9ucyAgfCBpbmFjdGl2ZSBhY3Rp
b25zIF0KKwkJCS8vIFsgYWN0aXZlIGFjdGlvbnMgfDwgaW5hY3RpdmUgYWN0aW9ucyAgXQorCQkJ
Ly8gICAgICAgIGEgICAgICAgIHMKKwkJCS8vICAgICAgICAgPC1zd2FwLT4KKwkJCS8vICAgICAg
ICBzICAgICAgICBhCisKKwkJCXZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywKKwkJCQlwcmV2
SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsCisKKwkJCQlmaXJzdEluYWN0aXZlSW5kZXggPSAt
LSB0aGlzLl9uQWN0aXZlQWN0aW9ucywKKworCQkJCWxhc3RBY3RpdmVBY3Rpb24gPSBhY3Rpb25z
WyBmaXJzdEluYWN0aXZlSW5kZXggXTsKKworCQkJYWN0aW9uLl9jYWNoZUluZGV4ID0gZmlyc3RJ
bmFjdGl2ZUluZGV4OworCQkJYWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBhY3Rpb247
CisKKwkJCWxhc3RBY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7CisJCQlhY3Rp
b25zWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVBY3Rpb247CisKKwkJfSwKKworCQkvLyBNZW1v
cnkgbWFuYWdlbWVudCBmb3IgUHJvcGVydHlNaXhlciBvYmplY3RzCisKKwkJX2FkZEluYWN0aXZl
QmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICkgeworCisJ
CQl2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsCisJCQkJ
YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLAorCisJCQkJYmluZGlu
Z3MgPSB0aGlzLl9iaW5kaW5nczsKKworCQkJaWYgKCBiaW5kaW5nQnlOYW1lID09PSB1bmRlZmlu
ZWQgKSB7CisKKwkJCQliaW5kaW5nQnlOYW1lID0ge307CisJCQkJYmluZGluZ3NCeVJvb3RbIHJv
b3RVdWlkIF0gPSBiaW5kaW5nQnlOYW1lOworCisJCQl9CisKKwkJCWJpbmRpbmdCeU5hbWVbIHRy
YWNrTmFtZSBdID0gYmluZGluZzsKKworCQkJYmluZGluZy5fY2FjaGVJbmRleCA9IGJpbmRpbmdz
Lmxlbmd0aDsKKwkJCWJpbmRpbmdzLnB1c2goIGJpbmRpbmcgKTsKKworCQl9LAorCisJCV9yZW1v
dmVJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHsKKworCQkJdmFyIGJpbmRp
bmdzID0gdGhpcy5fYmluZGluZ3MsCisJCQkJcHJvcEJpbmRpbmcgPSBiaW5kaW5nLmJpbmRpbmcs
CisJCQkJcm9vdFV1aWQgPSBwcm9wQmluZGluZy5yb290Tm9kZS51dWlkLAorCQkJCXRyYWNrTmFt
ZSA9IHByb3BCaW5kaW5nLnBhdGgsCisJCQkJYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5n
c0J5Um9vdEFuZE5hbWUsCisJCQkJYmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290
VXVpZCBdLAorCisJCQkJbGFzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBiaW5kaW5ncy5s
ZW5ndGggLSAxIF0sCisJCQkJY2FjaGVJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXg7CisKKwkJ
CWxhc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4OworCQkJYmluZGlu
Z3NbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUJpbmRpbmc7CisJCQliaW5kaW5ncy5wb3Ao
KTsKKworCQkJZGVsZXRlIGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdOworCisJCQlyZW1vdmVf
ZW1wdHlfbWFwOiB7CisKKwkJCQlmb3IgKCB2YXIgXyBpbiBiaW5kaW5nQnlOYW1lICkgYnJlYWsg
cmVtb3ZlX2VtcHR5X21hcDsKKworCQkJCWRlbGV0ZSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQg
XTsKKworCQkJfQorCisJCX0sCisKKwkJX2xlbmRCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcg
KSB7CisKKwkJCXZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLAorCQkJCXByZXZJbmRleCA9
IGJpbmRpbmcuX2NhY2hlSW5kZXgsCisKKwkJCQlsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0
aXZlQmluZGluZ3MgKyssCisKKwkJCQlmaXJzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBs
YXN0QWN0aXZlSW5kZXggXTsKKworCQkJYmluZGluZy5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJ
bmRleDsKKwkJCWJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7CisKKwkJCWZp
cnN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4OworCQkJYmluZGluZ3Nb
IHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUJpbmRpbmc7CisKKwkJfSwKKworCQlfdGFrZUJh
Y2tCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7CisKKwkJCXZhciBiaW5kaW5ncyA9IHRo
aXMuX2JpbmRpbmdzLAorCQkJCXByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsCisKKwkJ
CQlmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQmluZGluZ3MsCisKKwkJCQls
YXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXTsKKworCQkJ
YmluZGluZy5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDsKKwkJCWJpbmRpbmdzWyBm
aXJzdEluYWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7CisKKwkJCWxhc3RBY3RpdmVCaW5kaW5nLl9j
YWNoZUluZGV4ID0gcHJldkluZGV4OworCQkJYmluZGluZ3NbIHByZXZJbmRleCBdID0gbGFzdEFj
dGl2ZUJpbmRpbmc7CisKKwkJfSwKKworCisJCS8vIE1lbW9yeSBtYW5hZ2VtZW50IG9mIEludGVy
cG9sYW50cyBmb3Igd2VpZ2h0IGFuZCB0aW1lIHNjYWxlCisKKwkJX2xlbmRDb250cm9sSW50ZXJw
b2xhbnQ6IGZ1bmN0aW9uICgpIHsKKworCQkJdmFyIGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRy
b2xJbnRlcnBvbGFudHMsCisJCQkJbGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUNvbnRy
b2xJbnRlcnBvbGFudHMgKyssCisJCQkJaW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGxhc3RB
Y3RpdmVJbmRleCBdOworCisJCQlpZiAoIGludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7CisK
KwkJCQlpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudCgKKwkJCQkJbmV3IEZsb2F0
MzJBcnJheSggMiApLCBuZXcgRmxvYXQzMkFycmF5KCAyICksCisJCQkJCTEsIHRoaXMuX2NvbnRy
b2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgKTsKKworCQkJCWludGVycG9sYW50Ll9fY2FjaGVJ
bmRleCA9IGxhc3RBY3RpdmVJbmRleDsKKwkJCQlpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRl
eCBdID0gaW50ZXJwb2xhbnQ7CisKKwkJCX0KKworCQkJcmV0dXJuIGludGVycG9sYW50OworCisJ
CX0sCisKKwkJX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoIGludGVycG9s
YW50ICkgeworCisJCQl2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50
cywKKwkJCQlwcmV2SW5kZXggPSBpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXgsCisKKwkJCQlmaXJz
dEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cywKKwor
CQkJCWxhc3RBY3RpdmVJbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUlu
ZGV4IF07CisKKwkJCWludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRl
eDsKKwkJCWludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBpbnRlcnBvbGFudDsK
KworCQkJbGFzdEFjdGl2ZUludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IHByZXZJbmRleDsKKwkJ
CWludGVycG9sYW50c1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlSW50ZXJwb2xhbnQ7CisKKwkJ
fSwKKworCQlfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlcjogbmV3IEZsb2F0MzJBcnJh
eSggMSApLAorCisJCS8vIHJldHVybiBhbiBhY3Rpb24gZm9yIGEgY2xpcCBvcHRpb25hbGx5IHVz
aW5nIGEgY3VzdG9tIHJvb3QgdGFyZ2V0CisJCS8vIG9iamVjdCAodGhpcyBtZXRob2QgYWxsb2Nh
dGVzIGEgbG90IG9mIGR5bmFtaWMgbWVtb3J5IGluIGNhc2UgYQorCQkvLyBwcmV2aW91c2x5IHVu
a25vd24gY2xpcC9yb290IGNvbWJpbmF0aW9uIGlzIHNwZWNpZmllZCkKKwkJY2xpcEFjdGlvbjog
ZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7CisKKwkJCXZhciByb290ID0gb3B0aW9u
YWxSb290IHx8IHRoaXMuX3Jvb3QsCisJCQkJcm9vdFV1aWQgPSByb290LnV1aWQsCisKKwkJCQlj
bGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID8KKwkJCQkJQW5pbWF0aW9uQ2xp
cC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLAorCisJCQkJY2xpcFV1aWQgPSBjbGlw
T2JqZWN0ICE9PSBudWxsID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCwKKworCQkJCWFjdGlvbnNG
b3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSwKKwkJCQlwcm90b3R5cGVB
Y3Rpb24gPSBudWxsOworCisJCQlpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7
CisKKwkJCQl2YXIgZXhpc3RpbmdBY3Rpb24gPQorCQkJCQkJYWN0aW9uc0ZvckNsaXAuYWN0aW9u
QnlSb290WyByb290VXVpZCBdOworCisJCQkJaWYgKCBleGlzdGluZ0FjdGlvbiAhPT0gdW5kZWZp
bmVkICkgeworCisJCQkJCXJldHVybiBleGlzdGluZ0FjdGlvbjsKKworCQkJCX0KKworCQkJCS8v
IHdlIGtub3cgdGhlIGNsaXAsIHNvIHdlIGRvbid0IGhhdmUgdG8gcGFyc2UgYWxsCisJCQkJLy8g
dGhlIGJpbmRpbmdzIGFnYWluIGJ1dCBjYW4ganVzdCBjb3B5CisJCQkJcHJvdG90eXBlQWN0aW9u
ID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF07CisKKwkJCQkvLyBhbHNvLCB0YWtl
IHRoZSBjbGlwIGZyb20gdGhlIHByb3RvdHlwZSBhY3Rpb24KKwkJCQlpZiAoIGNsaXBPYmplY3Qg
PT09IG51bGwgKQorCQkJCQljbGlwT2JqZWN0ID0gcHJvdG90eXBlQWN0aW9uLl9jbGlwOworCisJ
CQl9CisKKwkJCS8vIGNsaXAgbXVzdCBiZSBrbm93biB3aGVuIHNwZWNpZmllZCB2aWEgc3RyaW5n
CisJCQlpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDsKKworCQkJLy8gYWxs
b2NhdGUgYWxsIHJlc291cmNlcyByZXF1aXJlZCB0byBydW4gaXQKKwkJCXZhciBuZXdBY3Rpb24g
PSBuZXcgQW5pbWF0aW9uQWN0aW9uKCB0aGlzLCBjbGlwT2JqZWN0LCBvcHRpb25hbFJvb3QgKTsK
KworCQkJdGhpcy5fYmluZEFjdGlvbiggbmV3QWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKTsKKwor
CQkJLy8gYW5kIG1ha2UgdGhlIGFjdGlvbiBrbm93biB0byB0aGUgbWVtb3J5IG1hbmFnZXIKKwkJ
CXRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBuZXdBY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCAp
OworCisJCQlyZXR1cm4gbmV3QWN0aW9uOworCisJCX0sCisKKwkJLy8gZ2V0IGFuIGV4aXN0aW5n
IGFjdGlvbgorCQlleGlzdGluZ0FjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3Qg
KSB7CisKKwkJCXZhciByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsCisJCQkJcm9v
dFV1aWQgPSByb290LnV1aWQsCisKKwkJCQljbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdz
dHJpbmcnID8KKwkJCQkJQW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBj
bGlwLAorCisJCQkJY2xpcFV1aWQgPSBjbGlwT2JqZWN0ID8gY2xpcE9iamVjdC51dWlkIDogY2xp
cCwKKworCQkJCWFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQg
XTsKKworCQkJaWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkgeworCisJCQkJcmV0
dXJuIGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSB8fCBudWxsOworCisJ
CQl9CisKKwkJCXJldHVybiBudWxsOworCisJCX0sCisKKwkJLy8gZGVhY3RpdmF0ZXMgYWxsIHBy
ZXZpb3VzbHkgc2NoZWR1bGVkIGFjdGlvbnMKKwkJc3RvcEFsbEFjdGlvbjogZnVuY3Rpb24gKCkg
eworCisJCQl2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsCisJCQkJbkFjdGlvbnMgPSB0aGlz
Ll9uQWN0aXZlQWN0aW9ucywKKwkJCQliaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLAorCQkJCW5C
aW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5nczsKKworCQkJdGhpcy5fbkFjdGl2ZUFjdGlv
bnMgPSAwOworCQkJdGhpcy5fbkFjdGl2ZUJpbmRpbmdzID0gMDsKKworCQkJZm9yICggdmFyIGkg
PSAwOyBpICE9PSBuQWN0aW9uczsgKysgaSApIHsKKworCQkJCWFjdGlvbnNbIGkgXS5yZXNldCgp
OworCisJCQl9CisKKwkJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gbkJpbmRpbmdzOyArKyBpICkg
eworCisJCQkJYmluZGluZ3NbIGkgXS51c2VDb3VudCA9IDA7CisKKwkJCX0KKworCQkJcmV0dXJu
IHRoaXM7CisKKwkJfSwKKworCQkvLyBhZHZhbmNlIHRoZSB0aW1lIGFuZCB1cGRhdGUgYXBwbHkg
dGhlIGFuaW1hdGlvbgorCQl1cGRhdGU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkgeworCisJCQlk
ZWx0YVRpbWUgKj0gdGhpcy50aW1lU2NhbGU7CisKKwkJCXZhciBhY3Rpb25zID0gdGhpcy5fYWN0
aW9ucywKKwkJCQluQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zLAorCisJCQkJdGltZSA9
IHRoaXMudGltZSArPSBkZWx0YVRpbWUsCisJCQkJdGltZURpcmVjdGlvbiA9IE1hdGguc2lnbigg
ZGVsdGFUaW1lICksCisKKwkJCQlhY2N1SW5kZXggPSB0aGlzLl9hY2N1SW5kZXggXj0gMTsKKwor
CQkJLy8gcnVuIGFjdGl2ZSBhY3Rpb25zCisKKwkJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gbkFj
dGlvbnM7ICsrIGkgKSB7CisKKwkJCQl2YXIgYWN0aW9uID0gYWN0aW9uc1sgaSBdOworCisJCQkJ
YWN0aW9uLl91cGRhdGUoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4
ICk7CisKKwkJCX0KKworCQkJLy8gdXBkYXRlIHNjZW5lIGdyYXBoCisKKwkJCXZhciBiaW5kaW5n
cyA9IHRoaXMuX2JpbmRpbmdzLAorCQkJCW5CaW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5n
czsKKworCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7CisKKwkJ
CQliaW5kaW5nc1sgaSBdLmFwcGx5KCBhY2N1SW5kZXggKTsKKworCQkJfQorCisJCQlyZXR1cm4g
dGhpczsKKworCQl9LAorCisJCS8vIHJldHVybiB0aGlzIG1peGVyJ3Mgcm9vdCB0YXJnZXQgb2Jq
ZWN0CisJCWdldFJvb3Q6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIHRoaXMuX3Jvb3Q7CisK
KwkJfSwKKworCQkvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFy
IGNsaXAKKwkJdW5jYWNoZUNsaXA6IGZ1bmN0aW9uICggY2xpcCApIHsKKworCQkJdmFyIGFjdGlv
bnMgPSB0aGlzLl9hY3Rpb25zLAorCQkJCWNsaXBVdWlkID0gY2xpcC51dWlkLAorCQkJCWFjdGlv
bnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLAorCQkJCWFjdGlvbnNGb3JDbGlwID0gYWN0
aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTsKKworCQkJaWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5k
ZWZpbmVkICkgeworCisJCQkJLy8gbm90ZToganVzdCBjYWxsaW5nIF9yZW1vdmVJbmFjdGl2ZUFj
dGlvbiB3b3VsZCBtZXNzIHVwIHRoZQorCQkJCS8vIGl0ZXJhdGlvbiBzdGF0ZSBhbmQgYWxzbyBy
ZXF1aXJlIHVwZGF0aW5nIHRoZSBzdGF0ZSB3ZSBjYW4KKwkJCQkvLyBqdXN0IHRocm93IGF3YXkK
KworCQkJCXZhciBhY3Rpb25zVG9SZW1vdmUgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7
CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBhY3Rpb25zVG9SZW1vdmUubGVuZ3RoOyBpICE9
PSBuOyArKyBpICkgeworCisJCQkJCXZhciBhY3Rpb24gPSBhY3Rpb25zVG9SZW1vdmVbIGkgXTsK
KworCQkJCQl0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTsKKworCQkJCQl2YXIgY2Fj
aGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCwKKwkJCQkJCWxhc3RJbmFjdGl2ZUFjdGlvbiA9
IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdOworCisJCQkJCWFjdGlvbi5fY2FjaGVJbmRl
eCA9IG51bGw7CisJCQkJCWFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7CisKKwkJCQkJ
bGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDsKKwkJCQkJYWN0aW9u
c1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uOworCQkJCQlhY3Rpb25zLnBvcCgp
OworCisJCQkJCXRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiAp
OworCisJCQkJfQorCisJCQkJZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CisKKwkJ
CX0KKworCQl9LAorCisJCS8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRp
Y3VsYXIgcm9vdCB0YXJnZXQgb2JqZWN0CisJCXVuY2FjaGVSb290OiBmdW5jdGlvbiAoIHJvb3Qg
KSB7CisKKwkJCXZhciByb290VXVpZCA9IHJvb3QudXVpZCwKKwkJCQlhY3Rpb25zQnlDbGlwID0g
dGhpcy5fYWN0aW9uc0J5Q2xpcDsKKworCQkJZm9yICggdmFyIGNsaXBVdWlkIGluIGFjdGlvbnNC
eUNsaXAgKSB7CisKKwkJCQl2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1
aWQgXS5hY3Rpb25CeVJvb3QsCisJCQkJCWFjdGlvbiA9IGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQg
XTsKKworCQkJCWlmICggYWN0aW9uICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQkJdGhpcy5fZGVh
Y3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7CisJCQkJCXRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9u
KCBhY3Rpb24gKTsKKworCQkJCX0KKworCQkJfQorCisJCQl2YXIgYmluZGluZ3NCeVJvb3QgPSB0
aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsCisJCQkJYmluZGluZ0J5TmFtZSA9IGJpbmRpbmdz
QnlSb290WyByb290VXVpZCBdOworCisJCQlpZiAoIGJpbmRpbmdCeU5hbWUgIT09IHVuZGVmaW5l
ZCApIHsKKworCQkJCWZvciAoIHZhciB0cmFja05hbWUgaW4gYmluZGluZ0J5TmFtZSApIHsKKwor
CQkJCQl2YXIgYmluZGluZyA9IGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdOworCQkJCQliaW5k
aW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7CisJCQkJCXRoaXMuX3JlbW92ZUluYWN0aXZlQmlu
ZGluZyggYmluZGluZyApOworCisJCQkJfQorCisJCQl9CisKKwkJfSwKKworCQkvLyByZW1vdmUg
YSB0YXJnZXRlZCBjbGlwIGZyb20gdGhlIGNhY2hlCisJCXVuY2FjaGVBY3Rpb246IGZ1bmN0aW9u
ICggY2xpcCwgb3B0aW9uYWxSb290ICkgeworCisJCQl2YXIgYWN0aW9uID0gdGhpcy5leGlzdGlu
Z0FjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICk7CisKKwkJCWlmICggYWN0aW9uICE9PSBudWxs
ICkgeworCisJCQkJdGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7CisJCQkJdGhpcy5f
cmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApOworCisJCQl9CisKKwkJfQorCisJfSApOwor
CisJLyoqCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkgKi8KKwor
CWZ1bmN0aW9uIFVuaWZvcm0oIHZhbHVlICkgeworCisJCWlmICggdHlwZW9mIHZhbHVlID09PSAn
c3RyaW5nJyApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJh
bWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4nICk7CisJCQl2YWx1ZSA9IGFyZ3VtZW50c1sgMSBd
OworCisJCX0KKworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisKKwl9CisKKwlVbmlmb3JtLnByb3Rv
dHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHsKKworCQlyZXR1cm4gbmV3IFVuaWZvcm0oIHRoaXMu
dmFsdWUuY2xvbmUgPT09IHVuZGVmaW5lZCA/IHRoaXMudmFsdWUgOiB0aGlzLnZhbHVlLmNsb25l
KCkgKTsKKworCX07CisKKwkvKioKKwkgKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdp
dHRlci5jb20vYmVuX2FfYWRhbXMKKwkgKi8KKworCWZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckdl
b21ldHJ5KCkgeworCisJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnR5
cGUgPSAnSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnknOworCQl0aGlzLm1heEluc3RhbmNlZENvdW50
ID0gdW5kZWZpbmVkOworCisJfQorCisJSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkucHJvdG90eXBl
ID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBl
ICksIHsKKworCQljb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksCisKKwkJaXNJ
bnN0YW5jZWRCdWZmZXJHZW9tZXRyeTogdHJ1ZSwKKworCQlhZGRHcm91cDogZnVuY3Rpb24gKCBz
dGFydCwgY291bnQsIG1hdGVyaWFsSW5kZXggKSB7CisKKwkJCXRoaXMuZ3JvdXBzLnB1c2goIHsK
KworCQkJCXN0YXJ0OiBzdGFydCwKKwkJCQljb3VudDogY291bnQsCisJCQkJbWF0ZXJpYWxJbmRl
eDogbWF0ZXJpYWxJbmRleAorCisJCQl9ICk7CisKKwkJfSwKKworCQljb3B5OiBmdW5jdGlvbiAo
IHNvdXJjZSApIHsKKworCQkJdmFyIGluZGV4ID0gc291cmNlLmluZGV4OworCisJCQlpZiAoIGlu
ZGV4ICE9PSBudWxsICkgeworCisJCQkJdGhpcy5zZXRJbmRleCggaW5kZXguY2xvbmUoKSApOwor
CisJCQl9CisKKwkJCXZhciBhdHRyaWJ1dGVzID0gc291cmNlLmF0dHJpYnV0ZXM7CisKKwkJCWZv
ciAoIHZhciBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7CisKKwkJCQl2YXIgYXR0cmlidXRlID0gYXR0
cmlidXRlc1sgbmFtZSBdOworCQkJCXRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUu
Y2xvbmUoKSApOworCisJCQl9CisKKwkJCXZhciBncm91cHMgPSBzb3VyY2UuZ3JvdXBzOworCisJ
CQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKwor
CQkJCXZhciBncm91cCA9IGdyb3Vwc1sgaSBdOworCQkJCXRoaXMuYWRkR3JvdXAoIGdyb3VwLnN0
YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApOworCisJCQl9CisKKwkJCXJl
dHVybiB0aGlzOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgYmVuYWFkYW1z
IC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtcworCSAqLworCisJZnVuY3Rpb24gSW50
ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBpdGVtU2l6ZSwgb2Zm
c2V0LCBub3JtYWxpemVkICkgeworCisJCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgp
OworCisJCXRoaXMuZGF0YSA9IGludGVybGVhdmVkQnVmZmVyOworCQl0aGlzLml0ZW1TaXplID0g
aXRlbVNpemU7CisJCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OworCisJCXRoaXMubm9ybWFsaXplZCA9
IG5vcm1hbGl6ZWQgPT09IHRydWU7CisKKwl9CisKKwlPYmplY3QuZGVmaW5lUHJvcGVydGllcygg
SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7CisKKwkJY291bnQ6IHsKKwor
CQkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQlyZXR1cm4gdGhpcy5kYXRhLmNvdW50OworCisJ
CQl9CisKKwkJfSwKKworCQlhcnJheTogeworCisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJ
CXJldHVybiB0aGlzLmRhdGEuYXJyYXk7CisKKwkJCX0KKworCQl9CisKKwl9ICk7CisKKwlPYmpl
Y3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHsKKworCQlp
c0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLAorCisJCXNldFg6IGZ1bmN0aW9uICgg
aW5kZXgsIHggKSB7CisKKwkJCXRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3Ry
aWRlICsgdGhpcy5vZmZzZXQgXSA9IHg7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJ
c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHsKKworCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRl
eCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXSA9IHk7CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0sCisKKwkJc2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHsKKworCQkJ
dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCAr
IDIgXSA9IHo7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJc2V0VzogZnVuY3Rpb24g
KCBpbmRleCwgdyApIHsKKworCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5z
dHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXSA9IHc7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0s
CisKKwkJZ2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHsKKworCQkJcmV0dXJuIHRoaXMuZGF0YS5h
cnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXTsKKworCQl9LAor
CisJCWdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7CisKKwkJCXJldHVybiB0aGlzLmRhdGEuYXJy
YXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdOworCisJCX0s
CisKKwkJZ2V0WjogZnVuY3Rpb24gKCBpbmRleCApIHsKKworCQkJcmV0dXJuIHRoaXMuZGF0YS5h
cnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyIF07CisKKwkJ
fSwKKworCQlnZXRXOiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisJCQlyZXR1cm4gdGhpcy5kYXRh
LmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXTsKKwor
CQl9LAorCisJCXNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkgeworCisJCQlpbmRleCA9
IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0OworCisJCQl0aGlzLmRhdGEu
YXJyYXlbIGluZGV4ICsgMCBdID0geDsKKwkJCXRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0g
PSB5OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldFhZWjogZnVuY3Rpb24gKCBp
bmRleCwgeCwgeSwgeiApIHsKKworCQkJaW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUg
KyB0aGlzLm9mZnNldDsKKworCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7CisJ
CQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTsKKwkJCXRoaXMuZGF0YS5hcnJheVsg
aW5kZXggKyAyIF0gPSB6OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldFhZWlc6
IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7CisKKwkJCWluZGV4ID0gaW5kZXggKiB0
aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7CisKKwkJCXRoaXMuZGF0YS5hcnJheVsgaW5k
ZXggKyAwIF0gPSB4OworCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7CisJCQl0
aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMiBdID0gejsKKwkJCXRoaXMuZGF0YS5hcnJheVsgaW5k
ZXggKyAzIF0gPSB3OworCisJCQlyZXR1cm4gdGhpczsKKworCQl9CisKKwl9ICk7CisKKwkvKioK
KwkgKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXMK
KwkgKi8KKworCWZ1bmN0aW9uIEludGVybGVhdmVkQnVmZmVyKCBhcnJheSwgc3RyaWRlICkgewor
CisJCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOworCisJCXRoaXMuYXJyYXkgPSBh
cnJheTsKKwkJdGhpcy5zdHJpZGUgPSBzdHJpZGU7CisJCXRoaXMuY291bnQgPSBhcnJheSAhPT0g
dW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gc3RyaWRlIDogMDsKKworCQl0aGlzLmR5bmFtaWMg
PSBmYWxzZTsKKwkJdGhpcy51cGRhdGVSYW5nZSA9IHsgb2Zmc2V0OiAwLCBjb3VudDogLSAxIH07
CisKKwkJdGhpcy5vblVwbG9hZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CisKKwkJdGhpcy52
ZXJzaW9uID0gMDsKKworCX0KKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggSW50ZXJsZWF2ZWRC
dWZmZXIucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7CisKKwkJc2V0OiBmdW5jdGlvbiAoIHZh
bHVlICkgeworCisJCQlpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrOworCisJ
CX0KKworCX0gKTsKKworCU9iamVjdC5hc3NpZ24oIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlw
ZSwgeworCisJCWlzSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsCisKKwkJc2V0QXJyYXk6IGZ1bmN0
aW9uICggYXJyYXkgKSB7CisKKwkJCWlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHsKKwor
CQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNo
b3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTsKKworCQkJfQorCisJCQl0aGlzLmNvdW50ID0gYXJy
YXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHRoaXMuc3RyaWRlIDogMDsKKwkJCXRo
aXMuYXJyYXkgPSBhcnJheTsKKworCQl9LAorCisJCXNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFs
dWUgKSB7CisKKwkJCXRoaXMuZHluYW1pYyA9IHZhbHVlOworCisJCQlyZXR1cm4gdGhpczsKKwor
CQl9LAorCisJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisJCQl0aGlzLmFycmF5ID0g
bmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7CisJCQl0aGlzLmNv
dW50ID0gc291cmNlLmNvdW50OworCQkJdGhpcy5zdHJpZGUgPSBzb3VyY2Uuc3RyaWRlOworCQkJ
dGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0s
CisKKwkJY29weUF0OiBmdW5jdGlvbiAoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIgKSB7CisK
KwkJCWluZGV4MSAqPSB0aGlzLnN0cmlkZTsKKwkJCWluZGV4MiAqPSBhdHRyaWJ1dGUuc3RyaWRl
OworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLnN0cmlkZTsgaSA8IGw7IGkgKysgKSB7
CisKKwkJCQl0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4
MiArIGkgXTsKKworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKworCQl9LAorCisJCXNldDogZnVu
Y3Rpb24gKCB2YWx1ZSwgb2Zmc2V0ICkgeworCisJCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVk
ICkgb2Zmc2V0ID0gMDsKKworCQkJdGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTsKKwor
CQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQljbG9uZTogZnVuY3Rpb24gKCkgeworCisJCQly
ZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisKKwkJfSwKKworCQlv
blVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKKworCQkJdGhpcy5vblVwbG9hZENhbGxi
YWNrID0gY2FsbGJhY2s7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0gKTsKKworCS8q
KgorCSAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFt
cworCSAqLworCisJZnVuY3Rpb24gSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBz
dHJpZGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7CisKKwkJSW50ZXJsZWF2ZWRCdWZmZXIuY2FsbCgg
dGhpcywgYXJyYXksIHN0cmlkZSApOworCisJCXRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQ
ZXJBdHRyaWJ1dGUgfHwgMTsKKworCX0KKworCUluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLnBy
b3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVybGVhdmVkQnVmZmVy
LnByb3RvdHlwZSApLCB7CisKKwkJY29uc3RydWN0b3I6IEluc3RhbmNlZEludGVybGVhdmVkQnVm
ZmVyLAorCisJCWlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsCisKKwkJY29weTog
ZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJCUludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZS5j
b3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOworCisJCQl0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBz
b3VyY2UubWVzaFBlckF0dHJpYnV0ZTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfQorCisJfSAp
OworCisJLyoqCisJICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jl
bl9hX2FkYW1zCisJICovCisKKwlmdW5jdGlvbiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIGFy
cmF5LCBpdGVtU2l6ZSwgbWVzaFBlckF0dHJpYnV0ZSApIHsKKworCQlCdWZmZXJBdHRyaWJ1dGUu
Y2FsbCggdGhpcywgYXJyYXksIGl0ZW1TaXplICk7CisKKwkJdGhpcy5tZXNoUGVyQXR0cmlidXRl
ID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxOworCisJfQorCisJSW5zdGFuY2VkQnVmZmVyQXR0cmli
dXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJp
YnV0ZS5wcm90b3R5cGUgKSwgeworCisJCWNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJBdHRy
aWJ1dGUsCisKKwkJaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsCisKKwkJY29weTog
ZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKwkJCUJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29w
eS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworCQkJdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291
cmNlLm1lc2hQZXJBdHRyaWJ1dGU7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0gKTsK
KworCS8qKgorCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1
dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KKwkgKiBAYXV0aG9yIHN0ZXBob21pIC8g
aHR0cDovL3N0ZXBoYW5lZ2luaWVyLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIFJheWNhc3Rlcigg
b3JpZ2luLCBkaXJlY3Rpb24sIG5lYXIsIGZhciApIHsKKworCQl0aGlzLnJheSA9IG5ldyBSYXko
IG9yaWdpbiwgZGlyZWN0aW9uICk7CisJCS8vIGRpcmVjdGlvbiBpcyBhc3N1bWVkIHRvIGJlIG5v
cm1hbGl6ZWQgKGZvciBhY2N1cmF0ZSBkaXN0YW5jZSBjYWxjdWxhdGlvbnMpCisKKwkJdGhpcy5u
ZWFyID0gbmVhciB8fCAwOworCQl0aGlzLmZhciA9IGZhciB8fCBJbmZpbml0eTsKKworCQl0aGlz
LnBhcmFtcyA9IHsKKwkJCU1lc2g6IHt9LAorCQkJTGluZToge30sCisJCQlMT0Q6IHt9LAorCQkJ
UG9pbnRzOiB7IHRocmVzaG9sZDogMSB9LAorCQkJU3ByaXRlOiB7fQorCQl9OworCisJCU9iamVj
dC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLnBhcmFtcywgeworCQkJUG9pbnRDbG91ZDogeworCQkJ
CWdldDogZnVuY3Rpb24gKCkgeworCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXI6
IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4nICk7
CisJCQkJCXJldHVybiB0aGlzLlBvaW50czsKKwkJCQl9CisJCQl9CisJCX0gKTsKKworCX0KKwor
CWZ1bmN0aW9uIGFzY1NvcnQoIGEsIGIgKSB7CisKKwkJcmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRp
c3RhbmNlOworCisJfQorCisJZnVuY3Rpb24gaW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHJheWNh
c3RlciwgaW50ZXJzZWN0cywgcmVjdXJzaXZlICkgeworCisJCWlmICggb2JqZWN0LnZpc2libGUg
PT09IGZhbHNlICkgcmV0dXJuOworCisJCW9iamVjdC5yYXljYXN0KCByYXljYXN0ZXIsIGludGVy
c2VjdHMgKTsKKworCQlpZiAoIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSApIHsKKworCQkJdmFyIGNoaWxk
cmVuID0gb2JqZWN0LmNoaWxkcmVuOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJl
bi5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJaW50ZXJzZWN0T2JqZWN0KCBjaGlsZHJl
blsgaSBdLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHRydWUgKTsKKworCQkJfQorCisJCX0KKwor
CX0KKworCU9iamVjdC5hc3NpZ24oIFJheWNhc3Rlci5wcm90b3R5cGUsIHsKKworCQlsaW5lUHJl
Y2lzaW9uOiAxLAorCisJCXNldDogZnVuY3Rpb24gKCBvcmlnaW4sIGRpcmVjdGlvbiApIHsKKwor
CQkJLy8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRl
IGRpc3RhbmNlIGNhbGN1bGF0aW9ucykKKworCQkJdGhpcy5yYXkuc2V0KCBvcmlnaW4sIGRpcmVj
dGlvbiApOworCisJCX0sCisKKwkJc2V0RnJvbUNhbWVyYTogZnVuY3Rpb24gKCBjb29yZHMsIGNh
bWVyYSApIHsKKworCQkJaWYgKCAoIGNhbWVyYSAmJiBjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVy
YSApICkgeworCisJCQkJdGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2Ft
ZXJhLm1hdHJpeFdvcmxkICk7CisJCQkJdGhpcy5yYXkuZGlyZWN0aW9uLnNldCggY29vcmRzLngs
IGNvb3Jkcy55LCAwLjUgKS51bnByb2plY3QoIGNhbWVyYSApLnN1YiggdGhpcy5yYXkub3JpZ2lu
ICkubm9ybWFsaXplKCk7CisKKwkJCX0gZWxzZSBpZiAoICggY2FtZXJhICYmIGNhbWVyYS5pc09y
dGhvZ3JhcGhpY0NhbWVyYSApICkgeworCisJCQkJdGhpcy5yYXkub3JpZ2luLnNldCggY29vcmRz
LngsIGNvb3Jkcy55LCAoIGNhbWVyYS5uZWFyICsgY2FtZXJhLmZhciApIC8gKCBjYW1lcmEubmVh
ciAtIGNhbWVyYS5mYXIgKSApLnVucHJvamVjdCggY2FtZXJhICk7IC8vIHNldCBvcmlnaW4gaW4g
cGxhbmUgb2YgY2FtZXJhCisJCQkJdGhpcy5yYXkuZGlyZWN0aW9uLnNldCggMCwgMCwgLSAxICku
dHJhbnNmb3JtRGlyZWN0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTsKKworCQkJfSBlbHNlIHsK
KworCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVy
YSB0eXBlLicgKTsKKworCQkJfQorCisJCX0sCisKKwkJaW50ZXJzZWN0T2JqZWN0OiBmdW5jdGlv
biAoIG9iamVjdCwgcmVjdXJzaXZlICkgeworCisJCQl2YXIgaW50ZXJzZWN0cyA9IFtdOworCisJ
CQlpbnRlcnNlY3RPYmplY3QoIG9iamVjdCwgdGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7
CisKKwkJCWludGVyc2VjdHMuc29ydCggYXNjU29ydCApOworCisJCQlyZXR1cm4gaW50ZXJzZWN0
czsKKworCQl9LAorCisJCWludGVyc2VjdE9iamVjdHM6IGZ1bmN0aW9uICggb2JqZWN0cywgcmVj
dXJzaXZlICkgeworCisJCQl2YXIgaW50ZXJzZWN0cyA9IFtdOworCisJCQlpZiAoIEFycmF5Lmlz
QXJyYXkoIG9iamVjdHMgKSA9PT0gZmFsc2UgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJF
RS5SYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0czogb2JqZWN0cyBpcyBub3QgYW4gQXJyYXkuJyAp
OworCQkJCXJldHVybiBpbnRlcnNlY3RzOworCisJCQl9CisKKwkJCWZvciAoIHZhciBpID0gMCwg
bCA9IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworCQkJCWludGVyc2VjdE9iamVj
dCggb2JqZWN0c1sgaSBdLCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTsKKworCQkJfQor
CisJCQlpbnRlcnNlY3RzLnNvcnQoIGFzY1NvcnQgKTsKKworCQkJcmV0dXJuIGludGVyc2VjdHM7
CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9h
bHRlcmVkcXVhbGlhLmNvbS8KKwkgKi8KKworCWZ1bmN0aW9uIENsb2NrKCBhdXRvU3RhcnQgKSB7
CisKKwkJdGhpcy5hdXRvU3RhcnQgPSAoIGF1dG9TdGFydCAhPT0gdW5kZWZpbmVkICkgPyBhdXRv
U3RhcnQgOiB0cnVlOworCisJCXRoaXMuc3RhcnRUaW1lID0gMDsKKwkJdGhpcy5vbGRUaW1lID0g
MDsKKwkJdGhpcy5lbGFwc2VkVGltZSA9IDA7CisKKwkJdGhpcy5ydW5uaW5nID0gZmFsc2U7CisK
Kwl9CisKKwlPYmplY3QuYXNzaWduKCBDbG9jay5wcm90b3R5cGUsIHsKKworCQlzdGFydDogZnVu
Y3Rpb24gKCkgeworCisJCQl0aGlzLnN0YXJ0VGltZSA9ICggdHlwZW9mIHBlcmZvcm1hbmNlID09
PSAndW5kZWZpbmVkJyA/IERhdGUgOiBwZXJmb3JtYW5jZSApLm5vdygpOyAvLyBzZWUgIzEwNzMy
CisKKwkJCXRoaXMub2xkVGltZSA9IHRoaXMuc3RhcnRUaW1lOworCQkJdGhpcy5lbGFwc2VkVGlt
ZSA9IDA7CisJCQl0aGlzLnJ1bm5pbmcgPSB0cnVlOworCisJCX0sCisKKwkJc3RvcDogZnVuY3Rp
b24gKCkgeworCisJCQl0aGlzLmdldEVsYXBzZWRUaW1lKCk7CisJCQl0aGlzLnJ1bm5pbmcgPSBm
YWxzZTsKKwkJCXRoaXMuYXV0b1N0YXJ0ID0gZmFsc2U7CisKKwkJfSwKKworCQlnZXRFbGFwc2Vk
VGltZTogZnVuY3Rpb24gKCkgeworCisJCQl0aGlzLmdldERlbHRhKCk7CisJCQlyZXR1cm4gdGhp
cy5lbGFwc2VkVGltZTsKKworCQl9LAorCisJCWdldERlbHRhOiBmdW5jdGlvbiAoKSB7CisKKwkJ
CXZhciBkaWZmID0gMDsKKworCQkJaWYgKCB0aGlzLmF1dG9TdGFydCAmJiAhIHRoaXMucnVubmlu
ZyApIHsKKworCQkJCXRoaXMuc3RhcnQoKTsKKwkJCQlyZXR1cm4gMDsKKworCQkJfQorCisJCQlp
ZiAoIHRoaXMucnVubmluZyApIHsKKworCQkJCXZhciBuZXdUaW1lID0gKCB0eXBlb2YgcGVyZm9y
bWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7CisKKwkJ
CQlkaWZmID0gKCBuZXdUaW1lIC0gdGhpcy5vbGRUaW1lICkgLyAxMDAwOworCQkJCXRoaXMub2xk
VGltZSA9IG5ld1RpbWU7CisKKwkJCQl0aGlzLmVsYXBzZWRUaW1lICs9IGRpZmY7CisKKwkJCX0K
KworCQkJcmV0dXJuIGRpZmY7CisKKwkJfQorCisJfSApOworCisJLyoqCisJICogQGF1dGhvciBi
aG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRw
Oi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorCSAqCisJICogUmVmOiBodHRwczovL2VuLndpa2lw
ZWRpYS5vcmcvd2lraS9TcGhlcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW0KKwkgKgorCSAqIFRoZSBw
b2xlcyAocGhpKSBhcmUgYXQgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB5IGF4aXMuCisJICog
VGhlIGVxdWF0b3Igc3RhcnRzIGF0IHBvc2l0aXZlIHouCisJICovCisKKwlmdW5jdGlvbiBTcGhl
cmljYWwoIHJhZGl1cywgcGhpLCB0aGV0YSApIHsKKworCQl0aGlzLnJhZGl1cyA9ICggcmFkaXVz
ICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDsKKwkJdGhpcy5waGkgPSAoIHBoaSAhPT0g
dW5kZWZpbmVkICkgPyBwaGkgOiAwOyAvLyB1cCAvIGRvd24gdG93YXJkcyB0b3AgYW5kIGJvdHRv
bSBwb2xlCisJCXRoaXMudGhldGEgPSAoIHRoZXRhICE9PSB1bmRlZmluZWQgKSA/IHRoZXRhIDog
MDsgLy8gYXJvdW5kIHRoZSBlcXVhdG9yIG9mIHRoZSBzcGhlcmUKKworCQlyZXR1cm4gdGhpczsK
KworCX0KKworCU9iamVjdC5hc3NpZ24oIFNwaGVyaWNhbC5wcm90b3R5cGUsIHsKKworCQlzZXQ6
IGZ1bmN0aW9uICggcmFkaXVzLCBwaGksIHRoZXRhICkgeworCisJCQl0aGlzLnJhZGl1cyA9IHJh
ZGl1czsKKwkJCXRoaXMucGhpID0gcGhpOworCQkJdGhpcy50aGV0YSA9IHRoZXRhOworCisJCQly
ZXR1cm4gdGhpczsKKworCQl9LAorCisJCWNsb25lOiBmdW5jdGlvbiAoKSB7CisKKwkJCXJldHVy
biBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKworCQl9LAorCisJCWNvcHk6
IGZ1bmN0aW9uICggb3RoZXIgKSB7CisKKwkJCXRoaXMucmFkaXVzID0gb3RoZXIucmFkaXVzOwor
CQkJdGhpcy5waGkgPSBvdGhlci5waGk7CisJCQl0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7CisK
KwkJCXJldHVybiB0aGlzOworCisJCX0sCisKKwkJLy8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdl
ZSBFUFMgYW5kIFBJLUVQUworCQltYWtlU2FmZTogZnVuY3Rpb24oKSB7CisKKwkJCXZhciBFUFMg
PSAwLjAwMDAwMTsKKwkJCXRoaXMucGhpID0gTWF0aC5tYXgoIEVQUywgTWF0aC5taW4oIE1hdGgu
UEkgLSBFUFMsIHRoaXMucGhpICkgKTsKKworCQkJcmV0dXJuIHRoaXM7CisKKwkJfSwKKworCQlz
ZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24oIHZlYzMgKSB7CisKKwkJCXRoaXMucmFkaXVzID0gdmVj
My5sZW5ndGgoKTsKKworCQkJaWYgKCB0aGlzLnJhZGl1cyA9PT0gMCApIHsKKworCQkJCXRoaXMu
dGhldGEgPSAwOworCQkJCXRoaXMucGhpID0gMDsKKworCQkJfSBlbHNlIHsKKworCQkJCXRoaXMu
dGhldGEgPSBNYXRoLmF0YW4yKCB2ZWMzLngsIHZlYzMueiApOyAvLyBlcXVhdG9yIGFuZ2xlIGFy
b3VuZCB5LXVwIGF4aXMKKwkJCQl0aGlzLnBoaSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIHZl
YzMueSAvIHRoaXMucmFkaXVzLCAtIDEsIDEgKSApOyAvLyBwb2xhciBhbmdsZQorCisJCQl9CisK
KwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0gKTsKKworCS8qKgorCSAqIEBhdXRob3IgTXVn
ZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisJICoKKwkgKiBSZWY6IGh0dHBzOi8v
ZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5bGluZHJpY2FsX2Nvb3JkaW5hdGVfc3lzdGVtCisJICoK
KwkgKi8KKworCWZ1bmN0aW9uIEN5bGluZHJpY2FsKCByYWRpdXMsIHRoZXRhLCB5ICkgeworCisJ
CXRoaXMucmFkaXVzID0gKCByYWRpdXMgIT09IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMS4wOyAv
LyBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4gdG8gYSBwb2ludCBpbiB0aGUgeC16IHBsYW5lCisJ
CXRoaXMudGhldGEgPSAoIHRoZXRhICE9PSB1bmRlZmluZWQgKSA/IHRoZXRhIDogMDsgLy8gY291
bnRlcmNsb2Nrd2lzZSBhbmdsZSBpbiB0aGUgeC16IHBsYW5lIG1lYXN1cmVkIGluIHJhZGlhbnMg
ZnJvbSB0aGUgcG9zaXRpdmUgei1heGlzCisJCXRoaXMueSA9ICggeSAhPT0gdW5kZWZpbmVkICkg
PyB5IDogMDsgLy8gaGVpZ2h0IGFib3ZlIHRoZSB4LXogcGxhbmUKKworCQlyZXR1cm4gdGhpczsK
KworCX0KKworCU9iamVjdC5hc3NpZ24oIEN5bGluZHJpY2FsLnByb3RvdHlwZSwgeworCisJCXNl
dDogZnVuY3Rpb24gKCByYWRpdXMsIHRoZXRhLCB5ICkgeworCisJCQl0aGlzLnJhZGl1cyA9IHJh
ZGl1czsKKwkJCXRoaXMudGhldGEgPSB0aGV0YTsKKwkJCXRoaXMueSA9IHk7CisKKwkJCXJldHVy
biB0aGlzOworCisJCX0sCisKKwkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG5l
dyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOworCisJCX0sCisKKwkJY29weTogZnVu
Y3Rpb24gKCBvdGhlciApIHsKKworCQkJdGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7CisJCQl0
aGlzLnRoZXRhID0gb3RoZXIudGhldGE7CisJCQl0aGlzLnkgPSBvdGhlci55OworCisJCQlyZXR1
cm4gdGhpczsKKworCQl9LAorCisJCXNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiggdmVjMyApIHsK
KworCQkJdGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIHZlYzMueCAqIHZlYzMueCArIHZlYzMueiAq
IHZlYzMueiApOworCQkJdGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHZlYzMueCwgdmVjMy56ICk7
CisJCQl0aGlzLnkgPSB2ZWMzLnk7CisKKwkJCXJldHVybiB0aGlzOworCisJCX0KKworCX0gKTsK
KworCS8qKg0KKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29t
Lw0KKwkgKi8NCisNCisJZnVuY3Rpb24gTW9ycGhCbGVuZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlh
bCApIHsKKw0KKwkJTWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsNCisNCisJ
CXRoaXMuYW5pbWF0aW9uc01hcCA9IHt9Ow0KKwkJdGhpcy5hbmltYXRpb25zTGlzdCA9IFtdOw0K
Kw0KKwkJLy8gcHJlcGFyZSBkZWZhdWx0IGFuaW1hdGlvbg0KKwkJLy8gKGFsbCBmcmFtZXMgcGxh
eWVkIHRvZ2V0aGVyIGluIDEgc2Vjb25kKQ0KKw0KKwkJdmFyIG51bUZyYW1lcyA9IHRoaXMuZ2Vv
bWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDsNCisNCisJCXZhciBuYW1lID0gIl9fZGVmYXVsdCI7
DQorDQorCQl2YXIgc3RhcnRGcmFtZSA9IDA7DQorCQl2YXIgZW5kRnJhbWUgPSBudW1GcmFtZXMg
LSAxOw0KKw0KKwkJdmFyIGZwcyA9IG51bUZyYW1lcyAvIDE7DQorDQorCQl0aGlzLmNyZWF0ZUFu
aW1hdGlvbiggbmFtZSwgc3RhcnRGcmFtZSwgZW5kRnJhbWUsIGZwcyApOw0KKwkJdGhpcy5zZXRB
bmltYXRpb25XZWlnaHQoIG5hbWUsIDEgKTsNCisNCisJfQ0KKw0KKwlNb3JwaEJsZW5kTWVzaC5w
cm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApOw0KKwlNb3JwaEJsZW5k
TWVzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNb3JwaEJsZW5kTWVzaDsNCisNCisJTW9ycGhC
bGVuZE1lc2gucHJvdG90eXBlLmNyZWF0ZUFuaW1hdGlvbiA9IGZ1bmN0aW9uICggbmFtZSwgc3Rh
cnQsIGVuZCwgZnBzICkgew0KKw0KKwkJdmFyIGFuaW1hdGlvbiA9IHsNCisNCisJCQlzdGFydDog
c3RhcnQsDQorCQkJZW5kOiBlbmQsDQorDQorCQkJbGVuZ3RoOiBlbmQgLSBzdGFydCArIDEsDQor
DQorCQkJZnBzOiBmcHMsDQorCQkJZHVyYXRpb246ICggZW5kIC0gc3RhcnQgKSAvIGZwcywNCisN
CisJCQlsYXN0RnJhbWU6IDAsDQorCQkJY3VycmVudEZyYW1lOiAwLA0KKw0KKwkJCWFjdGl2ZTog
ZmFsc2UsDQorDQorCQkJdGltZTogMCwNCisJCQlkaXJlY3Rpb246IDEsDQorCQkJd2VpZ2h0OiAx
LA0KKw0KKwkJCWRpcmVjdGlvbkJhY2t3YXJkczogZmFsc2UsDQorCQkJbWlycm9yZWRMb29wOiBm
YWxzZQ0KKw0KKwkJfTsNCisNCisJCXRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdID0gYW5pbWF0
aW9uOw0KKwkJdGhpcy5hbmltYXRpb25zTGlzdC5wdXNoKCBhbmltYXRpb24gKTsNCisNCisJfTsN
CisNCisJTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLmF1dG9DcmVhdGVBbmltYXRpb25zID0gZnVu
Y3Rpb24gKCBmcHMgKSB7DQorDQorCQl2YXIgcGF0dGVybiA9IC8oW2Etel0rKV8/KFxkKykvaTsN
CisNCisJCXZhciBmaXJzdEFuaW1hdGlvbiwgZnJhbWVSYW5nZXMgPSB7fTsNCisNCisJCXZhciBn
ZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7DQorDQorCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gZ2Vv
bWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgew0KKw0KKwkJCXZhciBt
b3JwaCA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdOw0KKwkJCXZhciBjaHVua3MgPSBtb3Jw
aC5uYW1lLm1hdGNoKCBwYXR0ZXJuICk7DQorDQorCQkJaWYgKCBjaHVua3MgJiYgY2h1bmtzLmxl
bmd0aCA+IDEgKSB7DQorDQorCQkJCXZhciBuYW1lID0gY2h1bmtzWyAxIF07DQorDQorCQkJCWlm
ICggISBmcmFtZVJhbmdlc1sgbmFtZSBdICkgZnJhbWVSYW5nZXNbIG5hbWUgXSA9IHsgc3RhcnQ6
IEluZmluaXR5LCBlbmQ6IC0gSW5maW5pdHkgfTsNCisNCisJCQkJdmFyIHJhbmdlID0gZnJhbWVS
YW5nZXNbIG5hbWUgXTsNCisNCisJCQkJaWYgKCBpIDwgcmFuZ2Uuc3RhcnQgKSByYW5nZS5zdGFy
dCA9IGk7DQorCQkJCWlmICggaSA+IHJhbmdlLmVuZCApIHJhbmdlLmVuZCA9IGk7DQorDQorCQkJ
CWlmICggISBmaXJzdEFuaW1hdGlvbiApIGZpcnN0QW5pbWF0aW9uID0gbmFtZTsNCisNCisJCQl9
DQorDQorCQl9DQorDQorCQlmb3IgKCB2YXIgbmFtZSBpbiBmcmFtZVJhbmdlcyApIHsNCisNCisJ
CQl2YXIgcmFuZ2UgPSBmcmFtZVJhbmdlc1sgbmFtZSBdOw0KKwkJCXRoaXMuY3JlYXRlQW5pbWF0
aW9uKCBuYW1lLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kLCBmcHMgKTsNCisNCisJCX0NCisNCisJ
CXRoaXMuZmlyc3RBbmltYXRpb24gPSBmaXJzdEFuaW1hdGlvbjsNCisNCisJfTsNCisNCisJTW9y
cGhCbGVuZE1lc2gucHJvdG90eXBlLnNldEFuaW1hdGlvbkRpcmVjdGlvbkZvcndhcmQgPSBmdW5j
dGlvbiAoIG5hbWUgKSB7DQorDQorCQl2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFw
WyBuYW1lIF07DQorDQorCQlpZiAoIGFuaW1hdGlvbiApIHsNCisNCisJCQlhbmltYXRpb24uZGly
ZWN0aW9uID0gMTsNCisJCQlhbmltYXRpb24uZGlyZWN0aW9uQmFja3dhcmRzID0gZmFsc2U7DQor
DQorCQl9DQorDQorCX07DQorDQorCU1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5zZXRBbmltYXRp
b25EaXJlY3Rpb25CYWNrd2FyZCA9IGZ1bmN0aW9uICggbmFtZSApIHsNCisNCisJCXZhciBhbmlt
YXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTsNCisNCisJCWlmICggYW5pbWF0aW9u
ICkgew0KKw0KKwkJCWFuaW1hdGlvbi5kaXJlY3Rpb24gPSAtIDE7DQorCQkJYW5pbWF0aW9uLmRp
cmVjdGlvbkJhY2t3YXJkcyA9IHRydWU7DQorDQorCQl9DQorDQorCX07DQorDQorCU1vcnBoQmxl
bmRNZXNoLnByb3RvdHlwZS5zZXRBbmltYXRpb25GUFMgPSBmdW5jdGlvbiAoIG5hbWUsIGZwcyAp
IHsNCisNCisJCXZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTsNCisN
CisJCWlmICggYW5pbWF0aW9uICkgew0KKw0KKwkJCWFuaW1hdGlvbi5mcHMgPSBmcHM7DQorCQkJ
YW5pbWF0aW9uLmR1cmF0aW9uID0gKCBhbmltYXRpb24uZW5kIC0gYW5pbWF0aW9uLnN0YXJ0ICkg
LyBhbmltYXRpb24uZnBzOw0KKw0KKwkJfQ0KKw0KKwl9Ow0KKw0KKwlNb3JwaEJsZW5kTWVzaC5w
cm90b3R5cGUuc2V0QW5pbWF0aW9uRHVyYXRpb24gPSBmdW5jdGlvbiAoIG5hbWUsIGR1cmF0aW9u
ICkgew0KKw0KKwkJdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdOw0K
Kw0KKwkJaWYgKCBhbmltYXRpb24gKSB7DQorDQorCQkJYW5pbWF0aW9uLmR1cmF0aW9uID0gZHVy
YXRpb247DQorCQkJYW5pbWF0aW9uLmZwcyA9ICggYW5pbWF0aW9uLmVuZCAtIGFuaW1hdGlvbi5z
dGFydCApIC8gYW5pbWF0aW9uLmR1cmF0aW9uOw0KKw0KKwkJfQ0KKw0KKwl9Ow0KKw0KKwlNb3Jw
aEJsZW5kTWVzaC5wcm90b3R5cGUuc2V0QW5pbWF0aW9uV2VpZ2h0ID0gZnVuY3Rpb24gKCBuYW1l
LCB3ZWlnaHQgKSB7DQorDQorCQl2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBu
YW1lIF07DQorDQorCQlpZiAoIGFuaW1hdGlvbiApIHsNCisNCisJCQlhbmltYXRpb24ud2VpZ2h0
ID0gd2VpZ2h0Ow0KKw0KKwkJfQ0KKw0KKwl9Ow0KKw0KKwlNb3JwaEJsZW5kTWVzaC5wcm90b3R5
cGUuc2V0QW5pbWF0aW9uVGltZSA9IGZ1bmN0aW9uICggbmFtZSwgdGltZSApIHsNCisNCisJCXZh
ciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTsNCisNCisJCWlmICggYW5p
bWF0aW9uICkgew0KKw0KKwkJCWFuaW1hdGlvbi50aW1lID0gdGltZTsNCisNCisJCX0NCisNCisJ
fTsNCisNCisJTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLmdldEFuaW1hdGlvblRpbWUgPSBmdW5j
dGlvbiAoIG5hbWUgKSB7DQorDQorCQl2YXIgdGltZSA9IDA7DQorDQorCQl2YXIgYW5pbWF0aW9u
ID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07DQorDQorCQlpZiAoIGFuaW1hdGlvbiApIHsN
CisNCisJCQl0aW1lID0gYW5pbWF0aW9uLnRpbWU7DQorDQorCQl9DQorDQorCQlyZXR1cm4gdGlt
ZTsNCisNCisJfTsNCisNCisJTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLmdldEFuaW1hdGlvbkR1
cmF0aW9uID0gZnVuY3Rpb24gKCBuYW1lICkgew0KKw0KKwkJdmFyIGR1cmF0aW9uID0gLSAxOw0K
Kw0KKwkJdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdOw0KKw0KKwkJ
aWYgKCBhbmltYXRpb24gKSB7DQorDQorCQkJZHVyYXRpb24gPSBhbmltYXRpb24uZHVyYXRpb247
DQorDQorCQl9DQorDQorCQlyZXR1cm4gZHVyYXRpb247DQorDQorCX07DQorDQorCU1vcnBoQmxl
bmRNZXNoLnByb3RvdHlwZS5wbGF5QW5pbWF0aW9uID0gZnVuY3Rpb24gKCBuYW1lICkgew0KKw0K
KwkJdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdOw0KKw0KKwkJaWYg
KCBhbmltYXRpb24gKSB7DQorDQorCQkJYW5pbWF0aW9uLnRpbWUgPSAwOw0KKwkJCWFuaW1hdGlv
bi5hY3RpdmUgPSB0cnVlOw0KKw0KKwkJfSBlbHNlIHsNCisNCisJCQljb25zb2xlLndhcm4oICJU
SFJFRS5Nb3JwaEJsZW5kTWVzaDogYW5pbWF0aW9uWyIgKyBuYW1lICsgIl0gdW5kZWZpbmVkIGlu
IC5wbGF5QW5pbWF0aW9uKCkiICk7DQorDQorCQl9DQorDQorCX07DQorDQorCU1vcnBoQmxlbmRN
ZXNoLnByb3RvdHlwZS5zdG9wQW5pbWF0aW9uID0gZnVuY3Rpb24gKCBuYW1lICkgew0KKw0KKwkJ
dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdOw0KKw0KKwkJaWYgKCBh
bmltYXRpb24gKSB7DQorDQorCQkJYW5pbWF0aW9uLmFjdGl2ZSA9IGZhbHNlOw0KKw0KKwkJfQ0K
Kw0KKwl9Ow0KKw0KKwlNb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24g
KCBkZWx0YSApIHsNCisNCisJCWZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmFuaW1hdGlvbnNM
aXN0Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkgew0KKw0KKwkJCXZhciBhbmltYXRpb24gPSB0aGlz
LmFuaW1hdGlvbnNMaXN0WyBpIF07DQorDQorCQkJaWYgKCAhIGFuaW1hdGlvbi5hY3RpdmUgKSBj
b250aW51ZTsNCisNCisJCQl2YXIgZnJhbWVUaW1lID0gYW5pbWF0aW9uLmR1cmF0aW9uIC8gYW5p
bWF0aW9uLmxlbmd0aDsNCisNCisJCQlhbmltYXRpb24udGltZSArPSBhbmltYXRpb24uZGlyZWN0
aW9uICogZGVsdGE7DQorDQorCQkJaWYgKCBhbmltYXRpb24ubWlycm9yZWRMb29wICkgew0KKw0K
KwkJCQlpZiAoIGFuaW1hdGlvbi50aW1lID4gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IGFuaW1hdGlv
bi50aW1lIDwgMCApIHsNCisNCisJCQkJCWFuaW1hdGlvbi5kaXJlY3Rpb24gKj0gLSAxOw0KKw0K
KwkJCQkJaWYgKCBhbmltYXRpb24udGltZSA+IGFuaW1hdGlvbi5kdXJhdGlvbiApIHsNCisNCisJ
CQkJCQlhbmltYXRpb24udGltZSA9IGFuaW1hdGlvbi5kdXJhdGlvbjsNCisJCQkJCQlhbmltYXRp
b24uZGlyZWN0aW9uQmFja3dhcmRzID0gdHJ1ZTsNCisNCisJCQkJCX0NCisNCisJCQkJCWlmICgg
YW5pbWF0aW9uLnRpbWUgPCAwICkgew0KKw0KKwkJCQkJCWFuaW1hdGlvbi50aW1lID0gMDsNCisJ
CQkJCQlhbmltYXRpb24uZGlyZWN0aW9uQmFja3dhcmRzID0gZmFsc2U7DQorDQorCQkJCQl9DQor
DQorCQkJCX0NCisNCisJCQl9IGVsc2Ugew0KKw0KKwkJCQlhbmltYXRpb24udGltZSA9IGFuaW1h
dGlvbi50aW1lICUgYW5pbWF0aW9uLmR1cmF0aW9uOw0KKw0KKwkJCQlpZiAoIGFuaW1hdGlvbi50
aW1lIDwgMCApIGFuaW1hdGlvbi50aW1lICs9IGFuaW1hdGlvbi5kdXJhdGlvbjsNCisNCisJCQl9
DQorDQorCQkJdmFyIGtleWZyYW1lID0gYW5pbWF0aW9uLnN0YXJ0ICsgX01hdGguY2xhbXAoIE1h
dGguZmxvb3IoIGFuaW1hdGlvbi50aW1lIC8gZnJhbWVUaW1lICksIDAsIGFuaW1hdGlvbi5sZW5n
dGggLSAxICk7DQorCQkJdmFyIHdlaWdodCA9IGFuaW1hdGlvbi53ZWlnaHQ7DQorDQorCQkJaWYg
KCBrZXlmcmFtZSAhPT0gYW5pbWF0aW9uLmN1cnJlbnRGcmFtZSApIHsNCisNCisJCQkJdGhpcy5t
b3JwaFRhcmdldEluZmx1ZW5jZXNbIGFuaW1hdGlvbi5sYXN0RnJhbWUgXSA9IDA7DQorCQkJCXRo
aXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBhbmltYXRpb24uY3VycmVudEZyYW1lIF0gPSAxICog
d2VpZ2h0Ow0KKw0KKwkJCQl0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sga2V5ZnJhbWUgXSA9
IDA7DQorDQorCQkJCWFuaW1hdGlvbi5sYXN0RnJhbWUgPSBhbmltYXRpb24uY3VycmVudEZyYW1l
Ow0KKwkJCQlhbmltYXRpb24uY3VycmVudEZyYW1lID0ga2V5ZnJhbWU7DQorDQorCQkJfQ0KKw0K
KwkJCXZhciBtaXggPSAoIGFuaW1hdGlvbi50aW1lICUgZnJhbWVUaW1lICkgLyBmcmFtZVRpbWU7
DQorDQorCQkJaWYgKCBhbmltYXRpb24uZGlyZWN0aW9uQmFja3dhcmRzICkgbWl4ID0gMSAtIG1p
eDsNCisNCisJCQlpZiAoIGFuaW1hdGlvbi5jdXJyZW50RnJhbWUgIT09IGFuaW1hdGlvbi5sYXN0
RnJhbWUgKSB7DQorDQorCQkJCXRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBhbmltYXRpb24u
Y3VycmVudEZyYW1lIF0gPSBtaXggKiB3ZWlnaHQ7DQorCQkJCXRoaXMubW9ycGhUYXJnZXRJbmZs
dWVuY2VzWyBhbmltYXRpb24ubGFzdEZyYW1lIF0gPSAoIDEgLSBtaXggKSAqIHdlaWdodDsNCisN
CisJCQl9IGVsc2Ugew0KKw0KKwkJCQl0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgYW5pbWF0
aW9uLmN1cnJlbnRGcmFtZSBdID0gd2VpZ2h0Ow0KKw0KKwkJCX0NCisNCisJCX0NCisNCisJfTsK
KworCS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20v
CisJICovCisKKwlmdW5jdGlvbiBJbW1lZGlhdGVSZW5kZXJPYmplY3QoIG1hdGVyaWFsICkgewor
CisJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7
CisJCXRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCByZW5kZXJDYWxsYmFjayApIHt9OworCisJfQor
CisJSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVj
dDNELnByb3RvdHlwZSApOworCUltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90b3R5cGUuY29uc3Ry
dWN0b3IgPSBJbW1lZGlhdGVSZW5kZXJPYmplY3Q7CisKKwlJbW1lZGlhdGVSZW5kZXJPYmplY3Qu
cHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gdHJ1ZTsKKworCS8qKgorCSAqIEBh
dXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBXZXN0TGFuZ2xl
eSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisJKi8KKworCWZ1bmN0aW9uIFZlcnRl
eE5vcm1hbHNIZWxwZXIoIG9iamVjdCwgc2l6ZSwgaGV4LCBsaW5ld2lkdGggKSB7CisKKwkJdGhp
cy5vYmplY3QgPSBvYmplY3Q7CisKKwkJdGhpcy5zaXplID0gKCBzaXplICE9PSB1bmRlZmluZWQg
KSA/IHNpemUgOiAxOworCisJCXZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmluZWQgKSA/IGhl
eCA6IDB4ZmYwMDAwOworCisJCXZhciB3aWR0aCA9ICggbGluZXdpZHRoICE9PSB1bmRlZmluZWQg
KSA/IGxpbmV3aWR0aCA6IDE7CisKKwkJLy8KKworCQl2YXIgbk5vcm1hbHMgPSAwOworCisJCXZh
ciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5OworCisJCWlmICggb2JqR2VvbWV0
cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKKworCQkJbk5vcm1hbHMgPSBvYmpHZW9t
ZXRyeS5mYWNlcy5sZW5ndGggKiAzOworCisJCX0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9i
akdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisKKwkJCW5Ob3JtYWxzID0gb2JqR2VvbWV0
cnkuYXR0cmlidXRlcy5ub3JtYWwuY291bnQ7CisKKwkJfQorCisJCS8vCisKKwkJdmFyIGdlb21l
dHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisKKwkJdmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9h
dDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7CisKKwkJZ2VvbWV0cnku
YWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMgKTsKKworCQlMaW5lU2VnbWVudHMu
Y2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29s
b3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7CisKKwkJLy8KKworCQl0aGlzLm1hdHJpeEF1dG9V
cGRhdGUgPSBmYWxzZTsKKworCQl0aGlzLnVwZGF0ZSgpOworCisJfQorCisJVmVydGV4Tm9ybWFs
c0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBl
ICk7CisJVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBWZXJ0ZXhO
b3JtYWxzSGVscGVyOworCisJVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUudXBkYXRlID0g
KCBmdW5jdGlvbiAoKSB7CisKKwkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFyIHYyID0g
bmV3IFZlY3RvcjMoKTsKKwkJdmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7CisKKwkJ
cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHsKKworCQkJdmFyIGtleXMgPSBbICdhJywgJ2InLCAn
YycgXTsKKworCQkJdGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKKworCQkJ
bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTsK
KworCQkJdmFyIG1hdHJpeFdvcmxkID0gdGhpcy5vYmplY3QubWF0cml4V29ybGQ7CisKKwkJCXZh
ciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKKworCQkJLy8K
KworCQkJdmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7CisKKwkJCWlmICgg
b2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKKworCQkJCXZhciB2ZXJ0
aWNlcyA9IG9iakdlb21ldHJ5LnZlcnRpY2VzOworCisJCQkJdmFyIGZhY2VzID0gb2JqR2VvbWV0
cnkuZmFjZXM7CisKKwkJCQl2YXIgaWR4ID0gMDsKKworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9
IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKwkJCQkJdmFyIGZhY2UgPSBmYWNlc1sg
aSBdOworCisJCQkJCWZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVu
Z3RoOyBqIDwgamw7IGogKysgKSB7CisKKwkJCQkJCXZhciB2ZXJ0ZXggPSB2ZXJ0aWNlc1sgZmFj
ZVsga2V5c1sgaiBdIF0gXTsKKworCQkJCQkJdmFyIG5vcm1hbCA9IGZhY2UudmVydGV4Tm9ybWFs
c1sgaiBdOworCisJCQkJCQl2MS5jb3B5KCB2ZXJ0ZXggKS5hcHBseU1hdHJpeDQoIG1hdHJpeFdv
cmxkICk7CisKKwkJCQkJCXYyLmNvcHkoIG5vcm1hbCApLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0
cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTsK
KworCQkJCQkJcG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTsKKworCQkJ
CQkJaWR4ID0gaWR4ICsgMTsKKworCQkJCQkJcG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYy
LnksIHYyLnogKTsKKworCQkJCQkJaWR4ID0gaWR4ICsgMTsKKworCQkJCQl9CisKKwkJCQl9CisK
KwkJCX0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0
cnkgKSB7CisKKwkJCQl2YXIgb2JqUG9zID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlv
bjsKKworCQkJCXZhciBvYmpOb3JtID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWw7CisK
KwkJCQl2YXIgaWR4ID0gMDsKKworCQkJCS8vIGZvciBzaW1wbGljaXR5LCBpZ25vcmUgaW5kZXgg
YW5kIGRyYXdjYWxscywgYW5kIHJlbmRlciBldmVyeSBub3JtYWwKKworCQkJCWZvciAoIHZhciBq
ID0gMCwgamwgPSBvYmpQb3MuY291bnQ7IGogPCBqbDsgaiArKyApIHsKKworCQkJCQl2MS5zZXQo
IG9ialBvcy5nZXRYKCBqICksIG9ialBvcy5nZXRZKCBqICksIG9ialBvcy5nZXRaKCBqICkgKS5h
cHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7CisKKwkJCQkJdjIuc2V0KCBvYmpOb3JtLmdldFgo
IGogKSwgb2JqTm9ybS5nZXRZKCBqICksIG9iak5vcm0uZ2V0WiggaiApICk7CisKKwkJCQkJdjIu
YXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcigg
dGhpcy5zaXplICkuYWRkKCB2MSApOworCisJCQkJCXBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54
LCB2MS55LCB2MS56ICk7CisKKwkJCQkJaWR4ID0gaWR4ICsgMTsKKworCQkJCQlwb3NpdGlvbi5z
ZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApOworCisJCQkJCWlkeCA9IGlkeCArIDE7CisK
KwkJCQl9CisKKwkJCX0KKworCQkJcG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlOworCisJCX07
CisKKwl9KCkgKTsKKworCS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJl
ZHF1YWxpYS5jb20vCisJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKwkg
KiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKwkq
LworCisJZnVuY3Rpb24gU3BvdExpZ2h0SGVscGVyKCBsaWdodCApIHsKKworCQlPYmplY3QzRC5j
YWxsKCB0aGlzICk7CisKKwkJdGhpcy5saWdodCA9IGxpZ2h0OworCQl0aGlzLmxpZ2h0LnVwZGF0
ZU1hdHJpeFdvcmxkKCk7CisKKwkJdGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDsKKwkJ
dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CisKKwkJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1
ZmZlckdlb21ldHJ5KCk7CisKKwkJdmFyIHBvc2l0aW9ucyA9IFsKKwkJCTAsIDAsIDAsICAgMCwg
ICAwLCAgIDEsCisJCQkwLCAwLCAwLCAgIDEsICAgMCwgICAxLAorCQkJMCwgMCwgMCwgLSAxLCAg
IDAsICAgMSwKKwkJCTAsIDAsIDAsICAgMCwgICAxLCAgIDEsCisJCQkwLCAwLCAwLCAgIDAsIC0g
MSwgICAxCisJCV07CisKKwkJZm9yICggdmFyIGkgPSAwLCBqID0gMSwgbCA9IDMyOyBpIDwgbDsg
aSArKywgaiArKyApIHsKKworCQkJdmFyIHAxID0gKCBpIC8gbCApICogTWF0aC5QSSAqIDI7CisJ
CQl2YXIgcDIgPSAoIGogLyBsICkgKiBNYXRoLlBJICogMjsKKworCQkJcG9zaXRpb25zLnB1c2go
CisJCQkJTWF0aC5jb3MoIHAxICksIE1hdGguc2luKCBwMSApLCAxLAorCQkJCU1hdGguY29zKCBw
MiApLCBNYXRoLnNpbiggcDIgKSwgMQorCQkJKTsKKworCQl9CisKKwkJZ2VvbWV0cnkuYWRkQXR0
cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25z
LCAzICkgKTsKKworCQl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9n
OiBmYWxzZSB9ICk7CisKKwkJdGhpcy5jb25lID0gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnks
IG1hdGVyaWFsICk7CisJCXRoaXMuYWRkKCB0aGlzLmNvbmUgKTsKKworCQl0aGlzLnVwZGF0ZSgp
OworCisJfQorCisJU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9i
amVjdDNELnByb3RvdHlwZSApOworCVNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0
b3IgPSBTcG90TGlnaHRIZWxwZXI7CisKKwlTcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bv
c2UgPSBmdW5jdGlvbiAoKSB7CisKKwkJdGhpcy5jb25lLmdlb21ldHJ5LmRpc3Bvc2UoKTsKKwkJ
dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKTsKKworCX07CisKKwlTcG90TGlnaHRIZWxwZXIu
cHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKKworCQl2YXIgdmVjdG9yID0gbmV3IFZl
Y3RvcjMoKTsKKwkJdmFyIHZlY3RvcjIgPSBuZXcgVmVjdG9yMygpOworCisJCXJldHVybiBmdW5j
dGlvbiB1cGRhdGUoKSB7CisKKwkJCXRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTsKKwor
CQkJdmFyIGNvbmVMZW5ndGggPSB0aGlzLmxpZ2h0LmRpc3RhbmNlID8gdGhpcy5saWdodC5kaXN0
YW5jZSA6IDEwMDA7CisJCQl2YXIgY29uZVdpZHRoID0gY29uZUxlbmd0aCAqIE1hdGgudGFuKCB0
aGlzLmxpZ2h0LmFuZ2xlICk7CisKKwkJCXRoaXMuY29uZS5zY2FsZS5zZXQoIGNvbmVXaWR0aCwg
Y29uZVdpZHRoLCBjb25lTGVuZ3RoICk7CisKKwkJCXZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRp
b24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKTsKKwkJCXZlY3RvcjIuc2V0RnJvbU1hdHJpeFBv
c2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApOworCisJCQl0aGlzLmNvbmUu
bG9va0F0KCB2ZWN0b3IyLnN1YiggdmVjdG9yICkgKTsKKworCQkJdGhpcy5jb25lLm1hdGVyaWFs
LmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTsKKworCQl9OworCisJfSgpOworCisJLyoq
CisJICogQGF1dGhvciBTZWFuIEdyaWZmaW4gLyBodHRwOi8vdHdpdHRlci5jb20vc2dyaWYKKwkg
KiBAYXV0aG9yIE1pY2hhZWwgR3VlcnJlcm8gLyBodHRwOi8vcmVhbGl0eW1lbHRkb3duLmNvbQor
CSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICogQGF1dGhvciBpa2Vy
ciAvIGh0dHA6Ly92ZXJvbGQuY29tCisJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRo
dWIuY29tL011Z2VuODcKKwkgKi8KKworCWZ1bmN0aW9uIGdldEJvbmVMaXN0KCBvYmplY3QgKSB7
CisKKwkJdmFyIGJvbmVMaXN0ID0gW107CisKKwkJaWYgKCBvYmplY3QgJiYgb2JqZWN0LmlzQm9u
ZSApIHsKKworCQkJYm9uZUxpc3QucHVzaCggb2JqZWN0ICk7CisKKwkJfQorCisJCWZvciAoIHZh
ciBpID0gMDsgaSA8IG9iamVjdC5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7CisKKwkJCWJvbmVM
aXN0LnB1c2guYXBwbHkoIGJvbmVMaXN0LCBnZXRCb25lTGlzdCggb2JqZWN0LmNoaWxkcmVuWyBp
IF0gKSApOworCisJCX0KKworCQlyZXR1cm4gYm9uZUxpc3Q7CisKKwl9CisKKwlmdW5jdGlvbiBT
a2VsZXRvbkhlbHBlciggb2JqZWN0ICkgeworCisJCXZhciBib25lcyA9IGdldEJvbmVMaXN0KCBv
YmplY3QgKTsKKworCQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKworCQl2
YXIgdmVydGljZXMgPSBbXTsKKwkJdmFyIGNvbG9ycyA9IFtdOworCisJCXZhciBjb2xvcjEgPSBu
ZXcgQ29sb3IoIDAsIDAsIDEgKTsKKwkJdmFyIGNvbG9yMiA9IG5ldyBDb2xvciggMCwgMSwgMCAp
OworCisJCWZvciAoIHZhciBpID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHsKKworCQkJ
dmFyIGJvbmUgPSBib25lc1sgaSBdOworCisJCQlpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFy
ZW50LmlzQm9uZSApIHsKKworCQkJCXZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKKwkJCQl2ZXJ0
aWNlcy5wdXNoKCAwLCAwLCAwICk7CisJCQkJY29sb3JzLnB1c2goIGNvbG9yMS5yLCBjb2xvcjEu
ZywgY29sb3IxLmIgKTsKKwkJCQljb2xvcnMucHVzaCggY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xv
cjIuYiApOworCisJCQl9CisKKwkJfQorCisJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0
aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKwkJZ2Vv
bWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgg
Y29sb3JzLCAzICkgKTsKKworCQl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwo
IHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMsIGRlcHRoVGVzdDogZmFsc2UsIGRlcHRoV3Jp
dGU6IGZhbHNlLCB0cmFuc3BhcmVudDogdHJ1ZSB9ICk7CisKKwkJTGluZVNlZ21lbnRzLmNhbGwo
IHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApOworCisJCXRoaXMucm9vdCA9IG9iamVjdDsKKwkJ
dGhpcy5ib25lcyA9IGJvbmVzOworCisJCXRoaXMubWF0cml4ID0gb2JqZWN0Lm1hdHJpeFdvcmxk
OworCQl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKKworCQl0aGlzLm9uQmVmb3JlUmVu
ZGVyKCk7CisKKwl9CisKKwlTa2VsZXRvbkhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRl
KCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7CisJU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLmNv
bnN0cnVjdG9yID0gU2tlbGV0b25IZWxwZXI7CisKKwlTa2VsZXRvbkhlbHBlci5wcm90b3R5cGUu
b25CZWZvcmVSZW5kZXIgPSBmdW5jdGlvbiAoKSB7CisKKwkJdmFyIHZlY3RvciA9IG5ldyBWZWN0
b3IzKCk7CisKKwkJdmFyIGJvbmVNYXRyaXggPSBuZXcgTWF0cml4NCgpOworCQl2YXIgbWF0cml4
V29ybGRJbnYgPSBuZXcgTWF0cml4NCgpOworCisJCXJldHVybiBmdW5jdGlvbiBvbkJlZm9yZVJl
bmRlcigpIHsKKworCQkJdmFyIGJvbmVzID0gdGhpcy5ib25lczsKKworCQkJdmFyIGdlb21ldHJ5
ID0gdGhpcy5nZW9tZXRyeTsKKwkJCXZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0
ZSggJ3Bvc2l0aW9uJyApOworCisJCQltYXRyaXhXb3JsZEludi5nZXRJbnZlcnNlKCB0aGlzLnJv
b3QubWF0cml4V29ybGQgKTsKKworCQkJZm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IGJvbmVz
Lmxlbmd0aDsgaSArKyApIHsKKworCQkJCXZhciBib25lID0gYm9uZXNbIGkgXTsKKworCQkJCWlm
ICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkgeworCisJCQkJCWJvbmVNYXRy
aXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4V29ybGRJbnYsIGJvbmUubWF0cml4V29ybGQgKTsK
KwkJCQkJdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggYm9uZU1hdHJpeCApOworCQkJCQlw
b3NpdGlvbi5zZXRYWVooIGosIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTsKKworCQkJ
CQlib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeFdvcmxkSW52LCBib25lLnBhcmVu
dC5tYXRyaXhXb3JsZCApOworCQkJCQl2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBib25l
TWF0cml4ICk7CisJCQkJCXBvc2l0aW9uLnNldFhZWiggaiArIDEsIHZlY3Rvci54LCB2ZWN0b3Iu
eSwgdmVjdG9yLnogKTsKKworCQkJCQlqICs9IDI7CisKKwkJCQl9CisKKwkJCX0KKworCQkJZ2Vv
bWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkubmVlZHNVcGRhdGUgPSB0cnVlOworCisJ
CX07CisKKwl9KCk7CisKKwkvKioKKwkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVy
ZWRxdWFsaWEuY29tLworCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJ
ICovCisKKwlmdW5jdGlvbiBQb2ludExpZ2h0SGVscGVyKCBsaWdodCwgc3BoZXJlU2l6ZSApIHsK
KworCQl0aGlzLmxpZ2h0ID0gbGlnaHQ7CisJCXRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQo
KTsKKworCQl2YXIgZ2VvbWV0cnkgPSBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHNwaGVyZVNp
emUsIDQsIDIgKTsKKwkJdmFyIG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdp
cmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSB9ICk7CisJCW1hdGVyaWFsLmNvbG9yLmNvcHkoIHRo
aXMubGlnaHQuY29sb3IgKTsKKworCQlNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlh
bCApOworCisJCXRoaXMubWF0cml4ID0gdGhpcy5saWdodC5tYXRyaXhXb3JsZDsKKwkJdGhpcy5t
YXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CisKKwkJLyoKKwkJdmFyIGRpc3RhbmNlR2VvbWV0cnkg
PSBuZXcgVEhSRUUuSWNvc2FoZWRyb25HZW9tZXRyeSggMSwgMiApOworCQl2YXIgZGlzdGFuY2VN
YXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4Q29sb3Is
IGZvZzogZmFsc2UsIHdpcmVmcmFtZTogdHJ1ZSwgb3BhY2l0eTogMC4xLCB0cmFuc3BhcmVudDog
dHJ1ZSB9ICk7CisKKwkJdGhpcy5saWdodFNwaGVyZSA9IG5ldyBUSFJFRS5NZXNoKCBidWxiR2Vv
bWV0cnksIGJ1bGJNYXRlcmlhbCApOworCQl0aGlzLmxpZ2h0RGlzdGFuY2UgPSBuZXcgVEhSRUUu
TWVzaCggZGlzdGFuY2VHZW9tZXRyeSwgZGlzdGFuY2VNYXRlcmlhbCApOworCisJCXZhciBkID0g
bGlnaHQuZGlzdGFuY2U7CisKKwkJaWYgKCBkID09PSAwLjAgKSB7CisKKwkJCXRoaXMubGlnaHRE
aXN0YW5jZS52aXNpYmxlID0gZmFsc2U7CisKKwkJfSBlbHNlIHsKKworCQkJdGhpcy5saWdodERp
c3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApOworCisJCX0KKworCQl0aGlzLmFkZCggdGhpcy5s
aWdodERpc3RhbmNlICk7CisJCSovCisKKwl9CisKKwlQb2ludExpZ2h0SGVscGVyLnByb3RvdHlw
ZSA9IE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICk7CisJUG9pbnRMaWdodEhlbHBlci5w
cm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludExpZ2h0SGVscGVyOworCisJUG9pbnRMaWdodEhl
bHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsKKworCQl0aGlzLmdlb21ldHJ5
LmRpc3Bvc2UoKTsKKwkJdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7CisKKwl9OworCisJUG9pbnRM
aWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkgeworCisJCXRoaXMubWF0
ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApOworCisJCS8qCisJCXZhciBkID0g
dGhpcy5saWdodC5kaXN0YW5jZTsKKworCQlpZiAoIGQgPT09IDAuMCApIHsKKworCQkJdGhpcy5s
aWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTsKKworCQl9IGVsc2UgeworCisJCQl0aGlzLmxp
Z2h0RGlzdGFuY2UudmlzaWJsZSA9IHRydWU7CisJCQl0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUu
c2V0KCBkLCBkLCBkICk7CisKKwkJfQorCQkqLworCisJfTsKKworCS8qKgorCSAqIEBhdXRob3Ig
YWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb24KKwkgKiBAYXV0aG9yIE11
Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisJICogQGF1dGhvciBXZXN0TGFuZ2xl
eSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisJICovCisKKwlmdW5jdGlvbiBSZWN0
QXJlYUxpZ2h0SGVscGVyKCBsaWdodCApIHsKKworCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CisK
KwkJdGhpcy5saWdodCA9IGxpZ2h0OworCQl0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7
CisKKwkJdGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDsKKwkJdGhpcy5tYXRyaXhBdXRv
VXBkYXRlID0gZmFsc2U7CisKKwkJdmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFs
KCB7IGNvbG9yOiBsaWdodC5jb2xvciB9ICk7CisKKwkJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZl
ckdlb21ldHJ5KCk7CisKKwkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcg
QnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCA1ICogMyApLCAzICkgKTsKKworCQl0
aGlzLmFkZCggbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApICk7CisKKwkJdGhpcy51cGRh
dGUoKTsKKworCX0KKworCVJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNy
ZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7CisJUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5
cGUuY29uc3RydWN0b3IgPSBSZWN0QXJlYUxpZ2h0SGVscGVyOworCisJUmVjdEFyZWFMaWdodEhl
bHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsKKworCQl0aGlzLmNoaWxkcmVu
WyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpOworCQl0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwu
ZGlzcG9zZSgpOworCisJfTsKKworCVJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0
ZSA9IGZ1bmN0aW9uICgpIHsKKworCQl2YXIgbGluZSA9IHRoaXMuY2hpbGRyZW5bIDAgXTsKKwor
CQkvLyB1cGRhdGUgbWF0ZXJpYWwKKworCQlsaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMu
bGlnaHQuY29sb3IgKTsKKworCQkvLyBjYWxjdWxhdGUgbmV3IGRpbWVuc2lvbnMgb2YgdGhlIGhl
bHBlcgorCisJCXZhciBoeCA9IHRoaXMubGlnaHQud2lkdGggKiAwLjU7CisJCXZhciBoeSA9IHRo
aXMubGlnaHQuaGVpZ2h0ICogMC41OworCisJCXZhciBwb3NpdGlvbiA9IGxpbmUuZ2VvbWV0cnku
YXR0cmlidXRlcy5wb3NpdGlvbjsKKwkJdmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7CisKKwkJ
Ly8gdXBkYXRlIHZlcnRpY2VzCisKKwkJYXJyYXlbICAwIF0gPSAgIGh4OyBhcnJheVsgIDEgXSA9
IC0gaHk7IGFycmF5WyAgMiBdID0gMDsKKwkJYXJyYXlbICAzIF0gPSAgIGh4OyBhcnJheVsgIDQg
XSA9ICAgaHk7IGFycmF5WyAgNSBdID0gMDsKKwkJYXJyYXlbICA2IF0gPSAtIGh4OyBhcnJheVsg
IDcgXSA9ICAgaHk7IGFycmF5WyAgOCBdID0gMDsKKwkJYXJyYXlbICA5IF0gPSAtIGh4OyBhcnJh
eVsgMTAgXSA9IC0gaHk7IGFycmF5WyAxMSBdID0gMDsKKwkJYXJyYXlbIDEyIF0gPSAgIGh4OyBh
cnJheVsgMTMgXSA9IC0gaHk7IGFycmF5WyAxNCBdID0gMDsKKworCQlwb3NpdGlvbi5uZWVkc1Vw
ZGF0ZSA9IHRydWU7CisKKwl9OworCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6
Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2Iu
Y29tLworCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisJ
ICovCisKKwlmdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHRIZWxwZXIoIGxpZ2h0LCBzaXplICkgewor
CisJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLmxpZ2h0ID0gbGlnaHQ7CisJCXRo
aXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTsKKworCQl0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1h
dHJpeFdvcmxkOworCQl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKKworCQl2YXIgZ2Vv
bWV0cnkgPSBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCBzaXplICk7CisJCWdlb21ldHJ5
LnJvdGF0ZVkoIE1hdGguUEkgKiAwLjUgKTsKKworCQl2YXIgbWF0ZXJpYWwgPSBuZXcgTWVzaEJh
c2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMsIHdpcmVmcmFtZTogdHJ1
ZSB9ICk7CisKKwkJdmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRp
b24nICk7CisJCXZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbi5jb3VudCAq
IDMgKTsKKworCQlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBCdWZmZXJBdHRy
aWJ1dGUoIGNvbG9ycywgMyApICk7CisKKwkJdGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwg
bWF0ZXJpYWwgKSApOworCisJCXRoaXMudXBkYXRlKCk7CisKKwl9CisKKwlIZW1pc3BoZXJlTGln
aHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7
CisJSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEhlbWlzcGhl
cmVMaWdodEhlbHBlcjsKKworCUhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9z
ZSA9IGZ1bmN0aW9uICgpIHsKKworCQl0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9z
ZSgpOworCQl0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpOworCisJfTsKKwor
CUhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkgewor
CisJCXZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpOworCisJCXZhciBjb2xvcjEgPSBuZXcgQ29s
b3IoKTsKKwkJdmFyIGNvbG9yMiA9IG5ldyBDb2xvcigpOworCisJCXJldHVybiBmdW5jdGlvbiB1
cGRhdGUoKSB7CisKKwkJCXZhciBtZXNoID0gdGhpcy5jaGlsZHJlblsgMCBdOworCisJCQl2YXIg
Y29sb3JzID0gbWVzaC5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdjb2xvcicgKTsKKworCQkJY29s
b3IxLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTsKKwkJCWNvbG9yMi5jb3B5KCB0aGlzLmxpZ2h0
Lmdyb3VuZENvbG9yICk7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5jb3VudDsg
aSA8IGw7IGkgKysgKSB7CisKKwkJCQl2YXIgY29sb3IgPSAoIGkgPCAoIGwgLyAyICkgKSA/IGNv
bG9yMSA6IGNvbG9yMjsKKworCQkJCWNvbG9ycy5zZXRYWVooIGksIGNvbG9yLnIsIGNvbG9yLmcs
IGNvbG9yLmIgKTsKKworCQkJfQorCisJCQltZXNoLmxvb2tBdCggdmVjdG9yLnNldEZyb21NYXRy
aXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApLm5lZ2F0ZSgpICk7CisKKwkJCWNv
bG9ycy5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKwkJfTsKKworCX0oKTsKKworCS8qKgorCSAqIEBh
dXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisJICovCisKKwlmdW5jdGlvbiBHcmlk
SGVscGVyKCBzaXplLCBkaXZpc2lvbnMsIGNvbG9yMSwgY29sb3IyICkgeworCisJCXNpemUgPSBz
aXplIHx8IDEwOworCQlkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgMTA7CisJCWNvbG9yMSA9IG5l
dyBDb2xvciggY29sb3IxICE9PSB1bmRlZmluZWQgPyBjb2xvcjEgOiAweDQ0NDQ0NCApOworCQlj
b2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4
ODggKTsKKworCQl2YXIgY2VudGVyID0gZGl2aXNpb25zIC8gMjsKKwkJdmFyIHN0ZXAgPSBzaXpl
IC8gZGl2aXNpb25zOworCQl2YXIgaGFsZlNpemUgPSBzaXplIC8gMjsKKworCQl2YXIgdmVydGlj
ZXMgPSBbXSwgY29sb3JzID0gW107CisKKwkJZm9yICggdmFyIGkgPSAwLCBqID0gMCwgayA9IC0g
aGFsZlNpemU7IGkgPD0gZGl2aXNpb25zOyBpICsrLCBrICs9IHN0ZXAgKSB7CisKKwkJCXZlcnRp
Y2VzLnB1c2goIC0gaGFsZlNpemUsIDAsIGssIGhhbGZTaXplLCAwLCBrICk7CisJCQl2ZXJ0aWNl
cy5wdXNoKCBrLCAwLCAtIGhhbGZTaXplLCBrLCAwLCBoYWxmU2l6ZSApOworCisJCQl2YXIgY29s
b3IgPSBpID09PSBjZW50ZXIgPyBjb2xvcjEgOiBjb2xvcjI7CisKKwkJCWNvbG9yLnRvQXJyYXko
IGNvbG9ycywgaiApOyBqICs9IDM7CisJCQljb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiAr
PSAzOworCQkJY29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMzsKKwkJCWNvbG9yLnRv
QXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7CisKKwkJfQorCisJCXZhciBnZW9tZXRyeSA9IG5l
dyBCdWZmZXJHZW9tZXRyeSgpOworCQlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbics
IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CisJCWdlb21ldHJ5
LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9y
cywgMyApICk7CisKKwkJdmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZl
cnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTsKKworCQlMaW5lU2VnbWVudHMuY2FsbCggdGhp
cywgZ2VvbWV0cnksIG1hdGVyaWFsICk7CisKKwl9CisKKwlHcmlkSGVscGVyLnByb3RvdHlwZSA9
IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTsKKwlHcmlkSGVscGVyLnBy
b3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdyaWRIZWxwZXI7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1y
ZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9n
aXRodWIuY29tL011Z2VuODcKKwkgKiBAYXV0aG9yIEhlY3RhdGUgLyBodHRwOi8vd3d3LmdpdGh1
Yi5jb20vSGVjdGF0ZQorCSAqLworCisJZnVuY3Rpb24gUG9sYXJHcmlkSGVscGVyKCByYWRpdXMs
IHJhZGlhbHMsIGNpcmNsZXMsIGRpdmlzaW9ucywgY29sb3IxLCBjb2xvcjIgKSB7CisKKwkJcmFk
aXVzID0gcmFkaXVzIHx8IDEwOworCQlyYWRpYWxzID0gcmFkaWFscyB8fCAxNjsKKwkJY2lyY2xl
cyA9IGNpcmNsZXMgfHwgODsKKwkJZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDY0OworCQljb2xv
cjEgPSBuZXcgQ29sb3IoIGNvbG9yMSAhPT0gdW5kZWZpbmVkID8gY29sb3IxIDogMHg0NDQ0NDQg
KTsKKwkJY29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgIT09IHVuZGVmaW5lZCA/IGNvbG9yMiA6
IDB4ODg4ODg4ICk7CisKKwkJdmFyIHZlcnRpY2VzID0gW107CisJCXZhciBjb2xvcnMgPSBbXTsK
KworCQl2YXIgeCwgejsKKwkJdmFyIHYsIGksIGosIHIsIGNvbG9yOworCisJCS8vIGNyZWF0ZSB0
aGUgcmFkaWFscworCisJCWZvciAoIGkgPSAwOyBpIDw9IHJhZGlhbHM7IGkgKysgKSB7CisKKwkJ
CXYgPSAoIGkgLyByYWRpYWxzICkgKiAoIE1hdGguUEkgKiAyICk7CisKKwkJCXggPSBNYXRoLnNp
biggdiApICogcmFkaXVzOworCQkJeiA9IE1hdGguY29zKCB2ICkgKiByYWRpdXM7CisKKwkJCXZl
cnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKKwkJCXZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTsKKwor
CQkJY29sb3IgPSAoIGkgJiAxICkgPyBjb2xvcjEgOiBjb2xvcjI7CisKKwkJCWNvbG9ycy5wdXNo
KCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7CisJCQljb2xvcnMucHVzaCggY29sb3Iuciwg
Y29sb3IuZywgY29sb3IuYiApOworCisJCX0KKworCQkvLyBjcmVhdGUgdGhlIGNpcmNsZXMKKwor
CQlmb3IgKCBpID0gMDsgaSA8PSBjaXJjbGVzOyBpICsrICkgeworCisJCQljb2xvciA9ICggaSAm
IDEgKSA/IGNvbG9yMSA6IGNvbG9yMjsKKworCQkJciA9IHJhZGl1cyAtICggcmFkaXVzIC8gY2ly
Y2xlcyAqIGkgKTsKKworCQkJZm9yICggaiA9IDA7IGogPCBkaXZpc2lvbnM7IGogKysgKSB7CisK
KwkJCQkvLyBmaXJzdCB2ZXJ0ZXgKKworCQkJCXYgPSAoIGogLyBkaXZpc2lvbnMgKSAqICggTWF0
aC5QSSAqIDIgKTsKKworCQkJCXggPSBNYXRoLnNpbiggdiApICogcjsKKwkJCQl6ID0gTWF0aC5j
b3MoIHYgKSAqIHI7CisKKwkJCQl2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7CisJCQkJY29sb3Jz
LnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTsKKworCQkJCS8vIHNlY29uZCB2ZXJ0
ZXgKKworCQkJCXYgPSAoICggaiArIDEgKSAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiAp
OworCisJCQkJeCA9IE1hdGguc2luKCB2ICkgKiByOworCQkJCXogPSBNYXRoLmNvcyggdiApICog
cjsKKworCQkJCXZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTsKKwkJCQljb2xvcnMucHVzaCggY29s
b3IuciwgY29sb3IuZywgY29sb3IuYiApOworCisJCQl9CisKKwkJfQorCisJCXZhciBnZW9tZXRy
eSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOworCQlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3Np
dGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CisJCWdl
b21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUo
IGNvbG9ycywgMyApICk7CisKKwkJdmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFs
KCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTsKKworCQlMaW5lU2VnbWVudHMuY2Fs
bCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7CisKKwl9CisKKwlQb2xhckdyaWRIZWxwZXIu
cHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApOworCVBv
bGFyR3JpZEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2xhckdyaWRIZWxwZXI7CisK
KwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRo
b3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorCSovCisKKwlm
dW5jdGlvbiBGYWNlTm9ybWFsc0hlbHBlciggb2JqZWN0LCBzaXplLCBoZXgsIGxpbmV3aWR0aCAp
IHsKKworCQkvLyBGYWNlTm9ybWFsc0hlbHBlciBvbmx5IHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5
CisKKwkJdGhpcy5vYmplY3QgPSBvYmplY3Q7CisKKwkJdGhpcy5zaXplID0gKCBzaXplICE9PSB1
bmRlZmluZWQgKSA/IHNpemUgOiAxOworCisJCXZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmlu
ZWQgKSA/IGhleCA6IDB4ZmZmZjAwOworCisJCXZhciB3aWR0aCA9ICggbGluZXdpZHRoICE9PSB1
bmRlZmluZWQgKSA/IGxpbmV3aWR0aCA6IDE7CisKKwkJLy8KKworCQl2YXIgbk5vcm1hbHMgPSAw
OworCisJCXZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5OworCisJCWlmICgg
b2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKKworCQkJbk5vcm1hbHMg
PSBvYmpHZW9tZXRyeS5mYWNlcy5sZW5ndGg7CisKKwkJfSBlbHNlIHsKKworCQkJY29uc29sZS53
YXJuKCAnVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3Vw
cG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4nICk7CisKKwkJ
fQorCisJCS8vCisKKwkJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisKKwkJ
dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIg
KiAzLCAzICk7CisKKwkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlv
bnMgKTsKKworCQlMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFz
aWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7CisKKwkJ
Ly8KKworCQl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKKwkJdGhpcy51cGRhdGUoKTsK
KworCX0KKworCUZhY2VOb3JtYWxzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExp
bmVTZWdtZW50cy5wcm90b3R5cGUgKTsKKwlGYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29u
c3RydWN0b3IgPSBGYWNlTm9ybWFsc0hlbHBlcjsKKworCUZhY2VOb3JtYWxzSGVscGVyLnByb3Rv
dHlwZS51cGRhdGUgPSAoIGZ1bmN0aW9uICgpIHsKKworCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygp
OworCQl2YXIgdjIgPSBuZXcgVmVjdG9yMygpOworCQl2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1h
dHJpeDMoKTsKKworCQlyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkgeworCisJCQl0aGlzLm9iamVj
dC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApOworCisJCQlub3JtYWxNYXRyaXguZ2V0Tm9ybWFs
TWF0cml4KCB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCApOworCisJCQl2YXIgbWF0cml4V29ybGQg
PSB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZDsKKworCQkJdmFyIHBvc2l0aW9uID0gdGhpcy5nZW9t
ZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOworCisJCQkvLworCisJCQl2YXIgb2JqR2VvbWV0cnkg
PSB0aGlzLm9iamVjdC5nZW9tZXRyeTsKKworCQkJdmFyIHZlcnRpY2VzID0gb2JqR2VvbWV0cnku
dmVydGljZXM7CisKKwkJCXZhciBmYWNlcyA9IG9iakdlb21ldHJ5LmZhY2VzOworCisJCQl2YXIg
aWR4ID0gMDsKKworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsg
aSArKyApIHsKKworCQkJCXZhciBmYWNlID0gZmFjZXNbIGkgXTsKKworCQkJCXZhciBub3JtYWwg
PSBmYWNlLm5vcm1hbDsKKworCQkJCXYxLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmEgXSApCisJCQkJ
CS5hZGQoIHZlcnRpY2VzWyBmYWNlLmIgXSApCisJCQkJCS5hZGQoIHZlcnRpY2VzWyBmYWNlLmMg
XSApCisJCQkJCS5kaXZpZGVTY2FsYXIoIDMgKQorCQkJCQkuYXBwbHlNYXRyaXg0KCBtYXRyaXhX
b3JsZCApOworCisJCQkJdjIuY29weSggbm9ybWFsICkuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRy
aXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApOwor
CisJCQkJcG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTsKKworCQkJCWlk
eCA9IGlkeCArIDE7CisKKwkJCQlwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIu
eiApOworCisJCQkJaWR4ID0gaWR4ICsgMTsKKworCQkJfQorCisJCQlwb3NpdGlvbi5uZWVkc1Vw
ZGF0ZSA9IHRydWU7CisKKwkJfTsKKworCX0oKSApOworCisJLyoqCisJICogQGF1dGhvciBhbHRl
cmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0
dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHVi
LmNvbS9XZXN0TGFuZ2xleQorCSAqLworCisJZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodEhlbHBl
ciggbGlnaHQsIHNpemUgKSB7CisKKwkJT2JqZWN0M0QuY2FsbCggdGhpcyApOworCisJCXRoaXMu
bGlnaHQgPSBsaWdodDsKKwkJdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOworCisJCXRo
aXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7CisJCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9
IGZhbHNlOworCisJCWlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IDE7CisKKwkJdmFy
IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisJCWdlb21ldHJ5LmFkZEF0dHJpYnV0
ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsKKwkJCS0gc2l6ZSwg
ICBzaXplLCAwLAorCQkJICBzaXplLCAgIHNpemUsIDAsCisJCQkgIHNpemUsIC0gc2l6ZSwgMCwK
KwkJCS0gc2l6ZSwgLSBzaXplLCAwLAorCQkJLSBzaXplLCAgIHNpemUsIDAKKwkJXSwgMyApICk7
CisKKwkJdmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2Ug
fSApOworCisJCXRoaXMuYWRkKCBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICkgKTsKKwor
CQlnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOworCQlnZW9tZXRyeS5hZGRBdHRyaWJ1
dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAs
IDAsIDEgXSwgMyApICk7CisKKwkJdGhpcy5hZGQoIG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJp
YWwgKSk7CisKKwkJdGhpcy51cGRhdGUoKTsKKworCX0KKworCURpcmVjdGlvbmFsTGlnaHRIZWxw
ZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7CisJRGly
ZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEaXJlY3Rpb25hbExp
Z2h0SGVscGVyOworCisJRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9
IGZ1bmN0aW9uICgpIHsKKworCQl2YXIgbGlnaHRQbGFuZSA9IHRoaXMuY2hpbGRyZW5bIDAgXTsK
KwkJdmFyIHRhcmdldExpbmUgPSB0aGlzLmNoaWxkcmVuWyAxIF07CisKKwkJbGlnaHRQbGFuZS5n
ZW9tZXRyeS5kaXNwb3NlKCk7CisJCWxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpOworCQl0
YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTsKKwkJdGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNw
b3NlKCk7CisKKwl9OworCisJRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRl
ID0gZnVuY3Rpb24gKCkgeworCisJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CisJCXZhciB2MiA9
IG5ldyBWZWN0b3IzKCk7CisJCXZhciB2MyA9IG5ldyBWZWN0b3IzKCk7CisKKwkJcmV0dXJuIGZ1
bmN0aW9uIHVwZGF0ZSgpIHsKKworCQkJdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxp
Z2h0Lm1hdHJpeFdvcmxkICk7CisJCQl2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGln
aHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7CisJCQl2My5zdWJWZWN0b3JzKCB2MiwgdjEgKTsKKwor
CQkJdmFyIGxpZ2h0UGxhbmUgPSB0aGlzLmNoaWxkcmVuWyAwIF07CisJCQl2YXIgdGFyZ2V0TGlu
ZSA9IHRoaXMuY2hpbGRyZW5bIDEgXTsKKworCQkJbGlnaHRQbGFuZS5sb29rQXQoIHYzICk7CisJ
CQlsaWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTsKKwor
CQkJdGFyZ2V0TGluZS5sb29rQXQoIHYzICk7CisJCQl0YXJnZXRMaW5lLnNjYWxlLnogPSB2My5s
ZW5ndGgoKTsKKworCQl9OworCisJfSgpOworCisJLyoqCisJICogQGF1dGhvciBhbHRlcmVkcSAv
IGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKwkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczov
L2dpdGh1Yi5jb20vTXVnZW44NworCSAqCisJICoJLSBzaG93cyBmcnVzdHVtLCBsaW5lIG9mIHNp
Z2h0IGFuZCB1cCBvZiB0aGUgY2FtZXJhCisJICoJLSBzdWl0YWJsZSBmb3IgZmFzdCB1cGRhdGVz
CisJICogCS0gYmFzZWQgb24gZnJ1c3R1bSB2aXN1YWxpemF0aW9uIGluIGxpZ2h0Z2wuanMgc2hh
ZG93bWFwIGV4YW1wbGUKKwkgKgkJaHR0cDovL2V2YW53LmdpdGh1Yi5jb20vbGlnaHRnbC5qcy90
ZXN0cy9zaGFkb3dtYXAuaHRtbAorCSAqLworCisJZnVuY3Rpb24gQ2FtZXJhSGVscGVyKCBjYW1l
cmEgKSB7CisKKwkJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisJCXZhciBt
YXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYsIHZlcnRl
eENvbG9yczogRmFjZUNvbG9ycyB9ICk7CisKKwkJdmFyIHZlcnRpY2VzID0gW107CisJCXZhciBj
b2xvcnMgPSBbXTsKKworCQl2YXIgcG9pbnRNYXAgPSB7fTsKKworCQkvLyBjb2xvcnMKKworCQl2
YXIgY29sb3JGcnVzdHVtID0gbmV3IENvbG9yKCAweGZmYWEwMCApOworCQl2YXIgY29sb3JDb25l
ID0gbmV3IENvbG9yKCAweGZmMDAwMCApOworCQl2YXIgY29sb3JVcCA9IG5ldyBDb2xvciggMHgw
MGFhZmYgKTsKKwkJdmFyIGNvbG9yVGFyZ2V0ID0gbmV3IENvbG9yKCAweGZmZmZmZiApOworCQl2
YXIgY29sb3JDcm9zcyA9IG5ldyBDb2xvciggMHgzMzMzMzMgKTsKKworCQkvLyBuZWFyCisKKwkJ
YWRkTGluZSggIm4xIiwgIm4yIiwgY29sb3JGcnVzdHVtICk7CisJCWFkZExpbmUoICJuMiIsICJu
NCIsIGNvbG9yRnJ1c3R1bSApOworCQlhZGRMaW5lKCAibjQiLCAibjMiLCBjb2xvckZydXN0dW0g
KTsKKwkJYWRkTGluZSggIm4zIiwgIm4xIiwgY29sb3JGcnVzdHVtICk7CisKKwkJLy8gZmFyCisK
KwkJYWRkTGluZSggImYxIiwgImYyIiwgY29sb3JGcnVzdHVtICk7CisJCWFkZExpbmUoICJmMiIs
ICJmNCIsIGNvbG9yRnJ1c3R1bSApOworCQlhZGRMaW5lKCAiZjQiLCAiZjMiLCBjb2xvckZydXN0
dW0gKTsKKwkJYWRkTGluZSggImYzIiwgImYxIiwgY29sb3JGcnVzdHVtICk7CisKKwkJLy8gc2lk
ZXMKKworCQlhZGRMaW5lKCAibjEiLCAiZjEiLCBjb2xvckZydXN0dW0gKTsKKwkJYWRkTGluZSgg
Im4yIiwgImYyIiwgY29sb3JGcnVzdHVtICk7CisJCWFkZExpbmUoICJuMyIsICJmMyIsIGNvbG9y
RnJ1c3R1bSApOworCQlhZGRMaW5lKCAibjQiLCAiZjQiLCBjb2xvckZydXN0dW0gKTsKKworCQkv
LyBjb25lCisKKwkJYWRkTGluZSggInAiLCAibjEiLCBjb2xvckNvbmUgKTsKKwkJYWRkTGluZSgg
InAiLCAibjIiLCBjb2xvckNvbmUgKTsKKwkJYWRkTGluZSggInAiLCAibjMiLCBjb2xvckNvbmUg
KTsKKwkJYWRkTGluZSggInAiLCAibjQiLCBjb2xvckNvbmUgKTsKKworCQkvLyB1cAorCisJCWFk
ZExpbmUoICJ1MSIsICJ1MiIsIGNvbG9yVXAgKTsKKwkJYWRkTGluZSggInUyIiwgInUzIiwgY29s
b3JVcCApOworCQlhZGRMaW5lKCAidTMiLCAidTEiLCBjb2xvclVwICk7CisKKwkJLy8gdGFyZ2V0
CisKKwkJYWRkTGluZSggImMiLCAidCIsIGNvbG9yVGFyZ2V0ICk7CisJCWFkZExpbmUoICJwIiwg
ImMiLCBjb2xvckNyb3NzICk7CisKKwkJLy8gY3Jvc3MKKworCQlhZGRMaW5lKCAiY24xIiwgImNu
MiIsIGNvbG9yQ3Jvc3MgKTsKKwkJYWRkTGluZSggImNuMyIsICJjbjQiLCBjb2xvckNyb3NzICk7
CisKKwkJYWRkTGluZSggImNmMSIsICJjZjIiLCBjb2xvckNyb3NzICk7CisJCWFkZExpbmUoICJj
ZjMiLCAiY2Y0IiwgY29sb3JDcm9zcyApOworCisJCWZ1bmN0aW9uIGFkZExpbmUoIGEsIGIsIGNv
bG9yICkgeworCisJCQlhZGRQb2ludCggYSwgY29sb3IgKTsKKwkJCWFkZFBvaW50KCBiLCBjb2xv
ciApOworCisJCX0KKworCQlmdW5jdGlvbiBhZGRQb2ludCggaWQsIGNvbG9yICkgeworCisJCQl2
ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7CisJCQljb2xvcnMucHVzaCggY29sb3IuciwgY29sb3Iu
ZywgY29sb3IuYiApOworCisJCQlpZiAoIHBvaW50TWFwWyBpZCBdID09PSB1bmRlZmluZWQgKSB7
CisKKwkJCQlwb2ludE1hcFsgaWQgXSA9IFtdOworCisJCQl9CisKKwkJCXBvaW50TWFwWyBpZCBd
LnB1c2goICggdmVydGljZXMubGVuZ3RoIC8gMyApIC0gMSApOworCisJCX0KKworCQlnZW9tZXRy
eS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2
ZXJ0aWNlcywgMyApICk7CisJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZs
b2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7CisKKwkJTGluZVNlZ21lbnRzLmNh
bGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApOworCisJCXRoaXMuY2FtZXJhID0gY2FtZXJh
OworCQlpZiAoIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXggKSB0aGlzLmNhbWVy
YS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CisKKwkJdGhpcy5tYXRyaXggPSBjYW1lcmEubWF0
cml4V29ybGQ7CisJCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworCisJCXRoaXMucG9p
bnRNYXAgPSBwb2ludE1hcDsKKworCQl0aGlzLnVwZGF0ZSgpOworCisJfQorCisJQ2FtZXJhSGVs
cGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTsK
KwlDYW1lcmFIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FtZXJhSGVscGVyOworCisJ
Q2FtZXJhSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7CisKKwkJdmFyIGdl
b21ldHJ5LCBwb2ludE1hcDsKKworCQl2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTsKKwkJdmFy
IGNhbWVyYSA9IG5ldyBDYW1lcmEoKTsKKworCQlmdW5jdGlvbiBzZXRQb2ludCggcG9pbnQsIHgs
IHksIHogKSB7CisKKwkJCXZlY3Rvci5zZXQoIHgsIHksIHogKS51bnByb2plY3QoIGNhbWVyYSAp
OworCisJCQl2YXIgcG9pbnRzID0gcG9pbnRNYXBbIHBvaW50IF07CisKKwkJCWlmICggcG9pbnRz
ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQl2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRy
aWJ1dGUoICdwb3NpdGlvbicgKTsKKworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5s
ZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisJCQkJCXBvc2l0aW9uLnNldFhZWiggcG9pbnRzWyBp
IF0sIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTsKKworCQkJCX0KKworCQkJfQorCisJ
CX0KKworCQlyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkgeworCisJCQlnZW9tZXRyeSA9IHRoaXMu
Z2VvbWV0cnk7CisJCQlwb2ludE1hcCA9IHRoaXMucG9pbnRNYXA7CisKKwkJCXZhciB3ID0gMSwg
aCA9IDE7CisKKwkJCS8vIHdlIG5lZWQganVzdCBjYW1lcmEgcHJvamVjdGlvbiBtYXRyaXgKKwkJ
CS8vIHdvcmxkIG1hdHJpeCBtdXN0IGJlIGlkZW50aXR5CisKKwkJCWNhbWVyYS5wcm9qZWN0aW9u
TWF0cml4LmNvcHkoIHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTsKKworCQkJLy8gY2Vu
dGVyIC8gdGFyZ2V0CisKKwkJCXNldFBvaW50KCAiYyIsIDAsIDAsIC0gMSApOworCQkJc2V0UG9p
bnQoICJ0IiwgMCwgMCwgIDEgKTsKKworCQkJLy8gbmVhcgorCisJCQlzZXRQb2ludCggIm4xIiwg
LSB3LCAtIGgsIC0gMSApOworCQkJc2V0UG9pbnQoICJuMiIsICAgdywgLSBoLCAtIDEgKTsKKwkJ
CXNldFBvaW50KCAibjMiLCAtIHcsICAgaCwgLSAxICk7CisJCQlzZXRQb2ludCggIm40IiwgICB3
LCAgIGgsIC0gMSApOworCisJCQkvLyBmYXIKKworCQkJc2V0UG9pbnQoICJmMSIsIC0gdywgLSBo
LCAxICk7CisJCQlzZXRQb2ludCggImYyIiwgICB3LCAtIGgsIDEgKTsKKwkJCXNldFBvaW50KCAi
ZjMiLCAtIHcsICAgaCwgMSApOworCQkJc2V0UG9pbnQoICJmNCIsICAgdywgICBoLCAxICk7CisK
KwkJCS8vIHVwCisKKwkJCXNldFBvaW50KCAidTEiLCAgIHcgKiAwLjcsIGggKiAxLjEsIC0gMSAp
OworCQkJc2V0UG9pbnQoICJ1MiIsIC0gdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7CisJCQlzZXRQ
b2ludCggInUzIiwgICAgICAgICAwLCBoICogMiwgICAtIDEgKTsKKworCQkJLy8gY3Jvc3MKKwor
CQkJc2V0UG9pbnQoICJjZjEiLCAtIHcsICAgMCwgMSApOworCQkJc2V0UG9pbnQoICJjZjIiLCAg
IHcsICAgMCwgMSApOworCQkJc2V0UG9pbnQoICJjZjMiLCAgIDAsIC0gaCwgMSApOworCQkJc2V0
UG9pbnQoICJjZjQiLCAgIDAsICAgaCwgMSApOworCisJCQlzZXRQb2ludCggImNuMSIsIC0gdywg
ICAwLCAtIDEgKTsKKwkJCXNldFBvaW50KCAiY24yIiwgICB3LCAgIDAsIC0gMSApOworCQkJc2V0
UG9pbnQoICJjbjMiLCAgIDAsIC0gaCwgLSAxICk7CisJCQlzZXRQb2ludCggImNuNCIsICAgMCwg
ICBoLCAtIDEgKTsKKworCQkJZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkubmVl
ZHNVcGRhdGUgPSB0cnVlOworCisJCX07CisKKwl9KCk7CisKKwkvKioKKwkgKiBAYXV0aG9yIG1y
ZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9n
aXRodWIuY29tL011Z2VuODcKKwkgKi8KKworCWZ1bmN0aW9uIEJveEhlbHBlciggb2JqZWN0LCBj
b2xvciApIHsKKworCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKKworCQlpZiAoIGNvbG9yID09PSB1
bmRlZmluZWQgKSBjb2xvciA9IDB4ZmZmZjAwOworCisJCXZhciBpbmRpY2VzID0gbmV3IFVpbnQx
NkFycmF5KCBbIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDAsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDQs
IDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgXSApOworCQl2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0
MzJBcnJheSggOCAqIDMgKTsKKworCQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnko
KTsKKwkJZ2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEg
KSApOworCQlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRy
aWJ1dGUoIHBvc2l0aW9ucywgMyApICk7CisKKwkJTGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdl
b21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApOworCisJ
CXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworCisJCXRoaXMudXBkYXRlKCk7CisKKwl9
CisKKwlCb3hIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnBy
b3RvdHlwZSApOworCUJveEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hIZWxwZXI7
CisKKwlCb3hIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkgeworCisJCXZh
ciBib3ggPSBuZXcgQm94MygpOworCisJCXJldHVybiBmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCAp
IHsKKworCQkJaWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHsKKworCQkJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLicg
KTsKKworCQkJfQorCisJCQlpZiAoIHRoaXMub2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJ
CQlib3guc2V0RnJvbU9iamVjdCggdGhpcy5vYmplY3QgKTsKKworCQkJfQorCisJCQlpZiAoIGJv
eC5pc0VtcHR5KCkgKSByZXR1cm47CisKKwkJCXZhciBtaW4gPSBib3gubWluOworCQkJdmFyIG1h
eCA9IGJveC5tYXg7CisKKwkJCS8qCisJCQkgIDVfX19fNAorCQkJMS9fX18wL3wKKwkJCXwgNl9f
fF83CisJCQkyL19fXzMvCisKKwkJCTA6IG1heC54LCBtYXgueSwgbWF4LnoKKwkJCTE6IG1pbi54
LCBtYXgueSwgbWF4LnoKKwkJCTI6IG1pbi54LCBtaW4ueSwgbWF4LnoKKwkJCTM6IG1heC54LCBt
aW4ueSwgbWF4LnoKKwkJCTQ6IG1heC54LCBtYXgueSwgbWluLnoKKwkJCTU6IG1pbi54LCBtYXgu
eSwgbWluLnoKKwkJCTY6IG1pbi54LCBtaW4ueSwgbWluLnoKKwkJCTc6IG1heC54LCBtaW4ueSwg
bWluLnoKKwkJCSovCisKKwkJCXZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRl
cy5wb3NpdGlvbjsKKwkJCXZhciBhcnJheSA9IHBvc2l0aW9uLmFycmF5OworCisJCQlhcnJheVsg
IDAgXSA9IG1heC54OyBhcnJheVsgIDEgXSA9IG1heC55OyBhcnJheVsgIDIgXSA9IG1heC56Owor
CQkJYXJyYXlbICAzIF0gPSBtaW4ueDsgYXJyYXlbICA0IF0gPSBtYXgueTsgYXJyYXlbICA1IF0g
PSBtYXguejsKKwkJCWFycmF5WyAgNiBdID0gbWluLng7IGFycmF5WyAgNyBdID0gbWluLnk7IGFy
cmF5WyAgOCBdID0gbWF4Lno7CisJCQlhcnJheVsgIDkgXSA9IG1heC54OyBhcnJheVsgMTAgXSA9
IG1pbi55OyBhcnJheVsgMTEgXSA9IG1heC56OworCQkJYXJyYXlbIDEyIF0gPSBtYXgueDsgYXJy
YXlbIDEzIF0gPSBtYXgueTsgYXJyYXlbIDE0IF0gPSBtaW4uejsKKwkJCWFycmF5WyAxNSBdID0g
bWluLng7IGFycmF5WyAxNiBdID0gbWF4Lnk7IGFycmF5WyAxNyBdID0gbWluLno7CisJCQlhcnJh
eVsgMTggXSA9IG1pbi54OyBhcnJheVsgMTkgXSA9IG1pbi55OyBhcnJheVsgMjAgXSA9IG1pbi56
OworCQkJYXJyYXlbIDIxIF0gPSBtYXgueDsgYXJyYXlbIDIyIF0gPSBtaW4ueTsgYXJyYXlbIDIz
IF0gPSBtaW4uejsKKworCQkJcG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlOworCisJCQl0aGlz
Lmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOworCisJCX07CisKKwl9ICkoKTsKKwor
CUJveEhlbHBlci5wcm90b3R5cGUuc2V0RnJvbU9iamVjdCA9IGZ1bmN0aW9uICggb2JqZWN0ICkg
eworCisJCXRoaXMub2JqZWN0ID0gb2JqZWN0OworCQl0aGlzLnVwZGF0ZSgpOworCisJCXJldHVy
biB0aGlzOworCisJfTsKKworCS8qKgorCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8v
Z2l0aHViLmNvbS9XZXN0TGFuZ2xleQorCSAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly9naXRodWIu
Y29tL3p6ODUKKwkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCisJICoKKwkg
KiBDcmVhdGVzIGFuIGFycm93IGZvciB2aXN1YWxpemluZyBkaXJlY3Rpb25zCisJICoKKwkgKiBQ
YXJhbWV0ZXJzOgorCSAqICBkaXIgLSBWZWN0b3IzCisJICogIG9yaWdpbiAtIFZlY3RvcjMKKwkg
KiAgbGVuZ3RoIC0gTnVtYmVyCisJICogIGNvbG9yIC0gY29sb3IgaW4gaGV4IHZhbHVlCisJICog
IGhlYWRMZW5ndGggLSBOdW1iZXIKKwkgKiAgaGVhZFdpZHRoIC0gTnVtYmVyCisJICovCisKKwl2
YXIgbGluZUdlb21ldHJ5OworCXZhciBjb25lR2VvbWV0cnk7CisKKwlmdW5jdGlvbiBBcnJvd0hl
bHBlciggZGlyLCBvcmlnaW4sIGxlbmd0aCwgY29sb3IsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCAp
IHsKKworCQkvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkCisKKwkJT2JqZWN0M0Qu
Y2FsbCggdGhpcyApOworCisJCWlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhm
ZmZmMDA7CisJCWlmICggbGVuZ3RoID09PSB1bmRlZmluZWQgKSBsZW5ndGggPSAxOworCQlpZiAo
IGhlYWRMZW5ndGggPT09IHVuZGVmaW5lZCApIGhlYWRMZW5ndGggPSAwLjIgKiBsZW5ndGg7CisJ
CWlmICggaGVhZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVu
Z3RoOworCisJCWlmICggbGluZUdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7CisKKwkJCWxpbmVH
ZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOworCQkJbGluZUdlb21ldHJ5LmFkZEF0dHJp
YnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwg
MCwgMSwgMCBdLCAzICkgKTsKKworCQkJY29uZUdlb21ldHJ5ID0gbmV3IEN5bGluZGVyQnVmZmVy
R2VvbWV0cnkoIDAsIDAuNSwgMSwgNSwgMSApOworCQkJY29uZUdlb21ldHJ5LnRyYW5zbGF0ZSgg
MCwgLSAwLjUsIDAgKTsKKworCQl9CisKKwkJdGhpcy5wb3NpdGlvbi5jb3B5KCBvcmlnaW4gKTsK
KworCQl0aGlzLmxpbmUgPSBuZXcgTGluZSggbGluZUdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0
ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApOworCQl0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0
ZSA9IGZhbHNlOworCQl0aGlzLmFkZCggdGhpcy5saW5lICk7CisKKwkJdGhpcy5jb25lID0gbmV3
IE1lc2goIGNvbmVHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xv
ciB9ICkgKTsKKwkJdGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKKwkJdGhpcy5h
ZGQoIHRoaXMuY29uZSApOworCisJCXRoaXMuc2V0RGlyZWN0aW9uKCBkaXIgKTsKKwkJdGhpcy5z
ZXRMZW5ndGgoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7CisKKwl9CisKKwlBcnJv
d0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsK
KwlBcnJvd0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcnJvd0hlbHBlcjsKKworCUFy
cm93SGVscGVyLnByb3RvdHlwZS5zZXREaXJlY3Rpb24gPSAoIGZ1bmN0aW9uICgpIHsKKworCQl2
YXIgYXhpcyA9IG5ldyBWZWN0b3IzKCk7CisJCXZhciByYWRpYW5zOworCisJCXJldHVybiBmdW5j
dGlvbiBzZXREaXJlY3Rpb24oIGRpciApIHsKKworCQkJLy8gZGlyIGlzIGFzc3VtZWQgdG8gYmUg
bm9ybWFsaXplZAorCisJCQlpZiAoIGRpci55ID4gMC45OTk5OSApIHsKKworCQkJCXRoaXMucXVh
dGVybmlvbi5zZXQoIDAsIDAsIDAsIDEgKTsKKworCQkJfSBlbHNlIGlmICggZGlyLnkgPCAtIDAu
OTk5OTkgKSB7CisKKwkJCQl0aGlzLnF1YXRlcm5pb24uc2V0KCAxLCAwLCAwLCAwICk7CisKKwkJ
CX0gZWxzZSB7CisKKwkJCQlheGlzLnNldCggZGlyLnosIDAsIC0gZGlyLnggKS5ub3JtYWxpemUo
KTsKKworCQkJCXJhZGlhbnMgPSBNYXRoLmFjb3MoIGRpci55ICk7CisKKwkJCQl0aGlzLnF1YXRl
cm5pb24uc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgcmFkaWFucyApOworCisJCQl9CisKKwkJfTsK
KworCX0oKSApOworCisJQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldExlbmd0aCA9IGZ1bmN0aW9u
ICggbGVuZ3RoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKSB7CisKKwkJaWYgKCBoZWFkTGVuZ3Ro
ID09PSB1bmRlZmluZWQgKSBoZWFkTGVuZ3RoID0gMC4yICogbGVuZ3RoOworCQlpZiAoIGhlYWRX
aWR0aCA9PT0gdW5kZWZpbmVkICkgaGVhZFdpZHRoID0gMC4yICogaGVhZExlbmd0aDsKKworCQl0
aGlzLmxpbmUuc2NhbGUuc2V0KCAxLCBNYXRoLm1heCggMCwgbGVuZ3RoIC0gaGVhZExlbmd0aCAp
LCAxICk7CisJCXRoaXMubGluZS51cGRhdGVNYXRyaXgoKTsKKworCQl0aGlzLmNvbmUuc2NhbGUu
c2V0KCBoZWFkV2lkdGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApOworCQl0aGlzLmNvbmUucG9z
aXRpb24ueSA9IGxlbmd0aDsKKwkJdGhpcy5jb25lLnVwZGF0ZU1hdHJpeCgpOworCisJfTsKKwor
CUFycm93SGVscGVyLnByb3RvdHlwZS5zZXRDb2xvciA9IGZ1bmN0aW9uICggY29sb3IgKSB7CisK
KwkJdGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIGNvbG9yICk7CisJCXRoaXMuY29uZS5t
YXRlcmlhbC5jb2xvci5jb3B5KCBjb2xvciApOworCisJfTsKKworCS8qKgorCSAqIEBhdXRob3Ig
c3JvdWNoZXJheSAvIGh0dHA6Ly9zcm91Y2hlcmF5Lm9yZy8KKwkgKiBAYXV0aG9yIG1yZG9vYiAv
IGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLworCisJZnVuY3Rpb24gQXhpc0hlbHBlciggc2l6ZSAp
IHsKKworCQlzaXplID0gc2l6ZSB8fCAxOworCisJCXZhciB2ZXJ0aWNlcyA9IFsKKwkJCTAsIDAs
IDAsICBzaXplLCAwLCAwLAorCQkJMCwgMCwgMCwgIDAsIHNpemUsIDAsCisJCQkwLCAwLCAwLCAg
MCwgMCwgc2l6ZQorCQldOworCisJCXZhciBjb2xvcnMgPSBbCisJCQkxLCAwLCAwLCAgMSwgMC42
LCAwLAorCQkJMCwgMSwgMCwgIDAuNiwgMSwgMCwKKwkJCTAsIDAsIDEsICAwLCAwLjYsIDEKKwkJ
XTsKKworCQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKwkJZ2VvbWV0cnku
YWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVy
dGljZXMsIDMgKSApOworCQlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9h
dDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApOworCisJCXZhciBtYXRlcmlhbCA9IG5l
dyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7CisK
KwkJTGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApOworCisJfQor
CisJQXhpc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJv
dG90eXBlICk7CisJQXhpc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBeGlzSGVscGVy
OworCisJLyoqCisJICogQGF1dGhvciB6ejg1IGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1CisJICoK
KwkgKiBDZW50cmlwZXRhbCBDYXRtdWxsUm9tIEN1cnZlIC0gd2hpY2ggaXMgdXNlZnVsIGZvciBh
dm9pZGluZworCSAqIGN1c3BzIGFuZCBzZWxmLWludGVyc2VjdGlvbnMgaW4gbm9uLXVuaWZvcm0g
Y2F0bXVsbCByb20gY3VydmVzLgorCSAqIGh0dHA6Ly93d3cuY2VteXVrc2VsLmNvbS9yZXNlYXJj
aC9jYXRtdWxscm9tX3BhcmFtL2NhdG11bGxyb20ucGRmCisJICoKKwkgKiBjdXJ2ZS50eXBlIGFj
Y2VwdHMgY2VudHJpcGV0YWwoZGVmYXVsdCksIGNob3JkYWwgYW5kIGNhdG11bGxyb20KKwkgKiBj
dXJ2ZS50ZW5zaW9uIGlzIHVzZWQgZm9yIGNhdG11bGxyb20gd2hpY2ggZGVmYXVsdHMgdG8gMC41
CisJICovCisKKworCS8qCisJQmFzZWQgb24gYW4gb3B0aW1pemVkIGMrKyBzb2x1dGlvbiBpbgor
CSAtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTQ4OTczNi9jYXRtdWxsLXJv
bS1jdXJ2ZS13aXRoLW5vLWN1c3BzLWFuZC1uby1zZWxmLWludGVyc2VjdGlvbnMvCisJIC0gaHR0
cDovL2lkZW9uZS5jb20vTm9FYlZNCisKKwlUaGlzIEN1YmljUG9seSBjbGFzcyBjb3VsZCBiZSB1
c2VkIGZvciByZXVzaW5nIHNvbWUgdmFyaWFibGVzIGFuZCBjYWxjdWxhdGlvbnMsCisJYnV0IGZv
ciB0aHJlZS5qcyBjdXJ2ZSB1c2UsIGl0IGNvdWxkIGJlIHBvc3NpYmxlIGlubGluZWQgYW5kIGZs
YXR0ZW4gaW50byBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsCisJd2hpY2ggY2FuIGJlIHBsYWNlZCBp
biBDdXJ2ZVV0aWxzLgorCSovCisKKwlmdW5jdGlvbiBDdWJpY1BvbHkoKSB7CisKKwkJdmFyIGMw
ID0gMCwgYzEgPSAwLCBjMiA9IDAsIGMzID0gMDsKKworCQkvKgorCQkgKiBDb21wdXRlIGNvZWZm
aWNpZW50cyBmb3IgYSBjdWJpYyBwb2x5bm9taWFsCisJCSAqICAgcChzKSA9IGMwICsgYzEqcyAr
IGMyKnNeMiArIGMzKnNeMworCQkgKiBzdWNoIHRoYXQKKwkJICogICBwKDApID0geDAsIHAoMSkg
PSB4MQorCQkgKiAgYW5kCisJCSAqICAgcCcoMCkgPSB0MCwgcCcoMSkgPSB0MS4KKwkJICovCisJ
CWZ1bmN0aW9uIGluaXQoIHgwLCB4MSwgdDAsIHQxICkgeworCisJCQljMCA9IHgwOworCQkJYzEg
PSB0MDsKKwkJCWMyID0gLSAzICogeDAgKyAzICogeDEgLSAyICogdDAgLSB0MTsKKwkJCWMzID0g
MiAqIHgwIC0gMiAqIHgxICsgdDAgKyB0MTsKKworCQl9CisKKwkJcmV0dXJuIHsKKworCQkJaW5p
dENhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIHRlbnNpb24gKSB7CisKKwkJ
CQlpbml0KCB4MSwgeDIsIHRlbnNpb24gKiAoIHgyIC0geDAgKSwgdGVuc2lvbiAqICggeDMgLSB4
MSApICk7CisKKwkJCX0sCisKKwkJCWluaXROb251bmlmb3JtQ2F0bXVsbFJvbTogZnVuY3Rpb24g
KCB4MCwgeDEsIHgyLCB4MywgZHQwLCBkdDEsIGR0MiApIHsKKworCQkJCS8vIGNvbXB1dGUgdGFu
Z2VudHMgd2hlbiBwYXJhbWV0ZXJpemVkIGluIFt0MSx0Ml0KKwkJCQl2YXIgdDEgPSAoIHgxIC0g
eDAgKSAvIGR0MCAtICggeDIgLSB4MCApIC8gKCBkdDAgKyBkdDEgKSArICggeDIgLSB4MSApIC8g
ZHQxOworCQkJCXZhciB0MiA9ICggeDIgLSB4MSApIC8gZHQxIC0gKCB4MyAtIHgxICkgLyAoIGR0
MSArIGR0MiApICsgKCB4MyAtIHgyICkgLyBkdDI7CisKKwkJCQkvLyByZXNjYWxlIHRhbmdlbnRz
IGZvciBwYXJhbWV0cml6YXRpb24gaW4gWzAsMV0KKwkJCQl0MSAqPSBkdDE7CisJCQkJdDIgKj0g
ZHQxOworCisJCQkJaW5pdCggeDEsIHgyLCB0MSwgdDIgKTsKKworCQkJfSwKKworCQkJY2FsYzog
ZnVuY3Rpb24gKCB0ICkgeworCisJCQkJdmFyIHQyID0gdCAqIHQ7CisJCQkJdmFyIHQzID0gdDIg
KiB0OworCQkJCXJldHVybiBjMCArIGMxICogdCArIGMyICogdDIgKyBjMyAqIHQzOworCisJCQl9
CisKKwkJfTsKKworCX0KKworCS8vCisKKwl2YXIgdG1wID0gbmV3IFZlY3RvcjMoKTsKKwl2YXIg
cHggPSBuZXcgQ3ViaWNQb2x5KCk7CisJdmFyIHB5ID0gbmV3IEN1YmljUG9seSgpOworCXZhciBw
eiA9IG5ldyBDdWJpY1BvbHkoKTsKKworCWZ1bmN0aW9uIENhdG11bGxSb21DdXJ2ZTMoIHBvaW50
cyApIHsKKworCQlDdXJ2ZS5jYWxsKCB0aGlzICk7CisKKwkJaWYgKCBwb2ludHMubGVuZ3RoIDwg
MiApIGNvbnNvbGUud2FybiggJ1RIUkVFLkNhdG11bGxSb21DdXJ2ZTM6IFBvaW50cyBhcnJheSBu
ZWVkcyBhdCBsZWFzdCB0d28gZW50cmllcy4nICk7CisKKwkJdGhpcy5wb2ludHMgPSBwb2ludHMg
fHwgW107CisJCXRoaXMuY2xvc2VkID0gZmFsc2U7CisKKwl9CisKKwlDYXRtdWxsUm9tQ3VydmUz
LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApOworCUNhdG11bGxS
b21DdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2F0bXVsbFJvbUN1cnZlMzsKKworCUNh
dG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkgeworCisJ
CXZhciBwb2ludHMgPSB0aGlzLnBvaW50czsKKwkJdmFyIGwgPSBwb2ludHMubGVuZ3RoOworCisJ
CXZhciBwb2ludCA9ICggbCAtICggdGhpcy5jbG9zZWQgPyAwIDogMSApICkgKiB0OworCQl2YXIg
aW50UG9pbnQgPSBNYXRoLmZsb29yKCBwb2ludCApOworCQl2YXIgd2VpZ2h0ID0gcG9pbnQgLSBp
bnRQb2ludDsKKworCQlpZiAoIHRoaXMuY2xvc2VkICkgeworCisJCQlpbnRQb2ludCArPSBpbnRQ
b2ludCA+IDAgPyAwIDogKCBNYXRoLmZsb29yKCBNYXRoLmFicyggaW50UG9pbnQgKSAvIHBvaW50
cy5sZW5ndGggKSArIDEgKSAqIHBvaW50cy5sZW5ndGg7CisKKwkJfSBlbHNlIGlmICggd2VpZ2h0
ID09PSAwICYmIGludFBvaW50ID09PSBsIC0gMSApIHsKKworCQkJaW50UG9pbnQgPSBsIC0gMjsK
KwkJCXdlaWdodCA9IDE7CisKKwkJfQorCisJCXZhciBwMCwgcDEsIHAyLCBwMzsgLy8gNCBwb2lu
dHMKKworCQlpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ID4gMCApIHsKKworCQkJcDAgPSBw
b2ludHNbICggaW50UG9pbnQgLSAxICkgJSBsIF07CisKKwkJfSBlbHNlIHsKKworCQkJLy8gZXh0
cmFwb2xhdGUgZmlyc3QgcG9pbnQKKwkJCXRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIDAgXSwgcG9p
bnRzWyAxIF0gKS5hZGQoIHBvaW50c1sgMCBdICk7CisJCQlwMCA9IHRtcDsKKworCQl9CisKKwkJ
cDEgPSBwb2ludHNbIGludFBvaW50ICUgbCBdOworCQlwMiA9IHBvaW50c1sgKCBpbnRQb2ludCAr
IDEgKSAlIGwgXTsKKworCQlpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ICsgMiA8IGwgKSB7
CisKKwkJCXAzID0gcG9pbnRzWyAoIGludFBvaW50ICsgMiApICUgbCBdOworCisJCX0gZWxzZSB7
CisKKwkJCS8vIGV4dHJhcG9sYXRlIGxhc3QgcG9pbnQKKwkJCXRtcC5zdWJWZWN0b3JzKCBwb2lu
dHNbIGwgLSAxIF0sIHBvaW50c1sgbCAtIDIgXSApLmFkZCggcG9pbnRzWyBsIC0gMSBdICk7CisJ
CQlwMyA9IHRtcDsKKworCQl9CisKKwkJaWYgKCB0aGlzLnR5cGUgPT09IHVuZGVmaW5lZCB8fCB0
aGlzLnR5cGUgPT09ICdjZW50cmlwZXRhbCcgfHwgdGhpcy50eXBlID09PSAnY2hvcmRhbCcgKSB7
CisKKwkJCS8vIGluaXQgQ2VudHJpcGV0YWwgLyBDaG9yZGFsIENhdG11bGwtUm9tCisJCQl2YXIg
cG93ID0gdGhpcy50eXBlID09PSAnY2hvcmRhbCcgPyAwLjUgOiAwLjI1OworCQkJdmFyIGR0MCA9
IE1hdGgucG93KCBwMC5kaXN0YW5jZVRvU3F1YXJlZCggcDEgKSwgcG93ICk7CisJCQl2YXIgZHQx
ID0gTWF0aC5wb3coIHAxLmRpc3RhbmNlVG9TcXVhcmVkKCBwMiApLCBwb3cgKTsKKwkJCXZhciBk
dDIgPSBNYXRoLnBvdyggcDIuZGlzdGFuY2VUb1NxdWFyZWQoIHAzICksIHBvdyApOworCisJCQkv
LyBzYWZldHkgY2hlY2sgZm9yIHJlcGVhdGVkIHBvaW50cworCQkJaWYgKCBkdDEgPCAxZS00ICkg
ZHQxID0gMS4wOworCQkJaWYgKCBkdDAgPCAxZS00ICkgZHQwID0gZHQxOworCQkJaWYgKCBkdDIg
PCAxZS00ICkgZHQyID0gZHQxOworCisJCQlweC5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAw
LngsIHAxLngsIHAyLngsIHAzLngsIGR0MCwgZHQxLCBkdDIgKTsKKwkJCXB5LmluaXROb251bmlm
b3JtQ2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgZHQwLCBkdDEsIGR0MiApOwor
CQkJcHouaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCBk
dDAsIGR0MSwgZHQyICk7CisKKwkJfSBlbHNlIGlmICggdGhpcy50eXBlID09PSAnY2F0bXVsbHJv
bScgKSB7CisKKwkJCXZhciB0ZW5zaW9uID0gdGhpcy50ZW5zaW9uICE9PSB1bmRlZmluZWQgPyB0
aGlzLnRlbnNpb24gOiAwLjU7CisJCQlweC5pbml0Q2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIu
eCwgcDMueCwgdGVuc2lvbiApOworCQkJcHkuaW5pdENhdG11bGxSb20oIHAwLnksIHAxLnksIHAy
LnksIHAzLnksIHRlbnNpb24gKTsKKwkJCXB6LmluaXRDYXRtdWxsUm9tKCBwMC56LCBwMS56LCBw
Mi56LCBwMy56LCB0ZW5zaW9uICk7CisKKwkJfQorCisJCXJldHVybiBuZXcgVmVjdG9yMyggcHgu
Y2FsYyggd2VpZ2h0ICksIHB5LmNhbGMoIHdlaWdodCApLCBwei5jYWxjKCB3ZWlnaHQgKSApOwor
CisJfTsKKworCWZ1bmN0aW9uIEN1YmljQmV6aWVyQ3VydmUzKCB2MCwgdjEsIHYyLCB2MyApIHsK
KworCQlDdXJ2ZS5jYWxsKCB0aGlzICk7CisKKwkJdGhpcy52MCA9IHYwOworCQl0aGlzLnYxID0g
djE7CisJCXRoaXMudjIgPSB2MjsKKwkJdGhpcy52MyA9IHYzOworCisJfQorCisJQ3ViaWNCZXpp
ZXJDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CisJ
Q3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViaWNCZXppZXJDdXJ2
ZTM7CisKKwlDdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAo
IHQgKSB7CisKKwkJdmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIs
IHYzID0gdGhpcy52MzsKKworCQlyZXR1cm4gbmV3IFZlY3RvcjMoCisJCQlDdWJpY0Jlemllcigg
dCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLAorCQkJQ3ViaWNCZXppZXIoIHQsIHYwLnksIHYx
LnksIHYyLnksIHYzLnkgKSwKKwkJCUN1YmljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56LCB2
My56ICkKKwkJKTsKKworCX07CisKKwlmdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMoIHYw
LCB2MSwgdjIgKSB7CisKKwkJQ3VydmUuY2FsbCggdGhpcyApOworCisJCXRoaXMudjAgPSB2MDsK
KwkJdGhpcy52MSA9IHYxOworCQl0aGlzLnYyID0gdjI7CisKKwl9CisKKwlRdWFkcmF0aWNCZXpp
ZXJDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CisJ
UXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFF1YWRyYXRpY0Jl
emllckN1cnZlMzsKKworCVF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQg
PSBmdW5jdGlvbiAoIHQgKSB7CisKKwkJdmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2
MiA9IHRoaXMudjI7CisKKwkJcmV0dXJuIG5ldyBWZWN0b3IzKAorCQkJUXVhZHJhdGljQmV6aWVy
KCB0LCB2MC54LCB2MS54LCB2Mi54ICksCisJCQlRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYx
LnksIHYyLnkgKSwKKwkJCVF1YWRyYXRpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiApCisJ
CSk7CisKKwl9OworCisJZnVuY3Rpb24gTGluZUN1cnZlMyggdjEsIHYyICkgeworCisJCUN1cnZl
LmNhbGwoIHRoaXMgKTsKKworCQl0aGlzLnYxID0gdjE7CisJCXRoaXMudjIgPSB2MjsKKworCX0K
KworCUxpbmVDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBl
ICk7CisJTGluZUN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQ3VydmUzOworCisJ
TGluZUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7CisKKwkJaWYg
KCB0ID09PSAxICkgeworCisJCQlyZXR1cm4gdGhpcy52Mi5jbG9uZSgpOworCisJCX0KKworCQl2
YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTsKKworCQl2ZWN0b3Iuc3ViVmVjdG9ycyggdGhpcy52
MiwgdGhpcy52MSApOyAvLyBkaWZmCisJCXZlY3Rvci5tdWx0aXBseVNjYWxhciggdCApOworCQl2
ZWN0b3IuYWRkKCB0aGlzLnYxICk7CisKKwkJcmV0dXJuIHZlY3RvcjsKKworCX07CisKKwlmdW5j
dGlvbiBBcmNDdXJ2ZSggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBh
Q2xvY2t3aXNlICkgeworCisJCUVsbGlwc2VDdXJ2ZS5jYWxsKCB0aGlzLCBhWCwgYVksIGFSYWRp
dXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTsKKworCX0K
KworCUFyY0N1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEVsbGlwc2VDdXJ2ZS5wcm90
b3R5cGUgKTsKKwlBcmNDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcmNDdXJ2ZTsKKwor
CS8qKgorCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisJ
ICovCisKKwl2YXIgU2NlbmVVdGlscyA9IHsKKworCQljcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0
OiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBtYXRlcmlhbHMgKSB7CisKKwkJCXZhciBncm91cCA9IG5l
dyBHcm91cCgpOworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBtYXRlcmlhbHMubGVuZ3RoOyBp
IDwgbDsgaSArKyApIHsKKworCQkJCWdyb3VwLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRl
cmlhbHNbIGkgXSApICk7CisKKwkJCX0KKworCQkJcmV0dXJuIGdyb3VwOworCisJCX0sCisKKwkJ
ZGV0YWNoOiBmdW5jdGlvbiAoIGNoaWxkLCBwYXJlbnQsIHNjZW5lICkgeworCisJCQljaGlsZC5h
cHBseU1hdHJpeCggcGFyZW50Lm1hdHJpeFdvcmxkICk7CisJCQlwYXJlbnQucmVtb3ZlKCBjaGls
ZCApOworCQkJc2NlbmUuYWRkKCBjaGlsZCApOworCisJCX0sCisKKwkJYXR0YWNoOiBmdW5jdGlv
biAoIGNoaWxkLCBzY2VuZSwgcGFyZW50ICkgeworCisJCQljaGlsZC5hcHBseU1hdHJpeCggbmV3
IE1hdHJpeDQoKS5nZXRJbnZlcnNlKCBwYXJlbnQubWF0cml4V29ybGQgKSApOworCisJCQlzY2Vu
ZS5yZW1vdmUoIGNoaWxkICk7CisJCQlwYXJlbnQuYWRkKCBjaGlsZCApOworCisJCX0KKworCX07
CisKKwkvKioKKwkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworCSAqLwor
CisJZnVuY3Rpb24gRmFjZTQoIGEsIGIsIGMsIGQsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5k
ZXggKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuRmFjZTQgaGFzIGJlZW4gcmVtb3ZlZC4g
QSBUSFJFRS5GYWNlMyB3aWxsIGJlIGNyZWF0ZWQgaW5zdGVhZC4nICk7CisJCXJldHVybiBuZXcg
RmFjZTMoIGEsIGIsIGMsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKTsKKworCX0KKwor
CXZhciBMaW5lU3RyaXAgPSAwOworCisJdmFyIExpbmVQaWVjZXMgPSAxOworCisJZnVuY3Rpb24g
TWVzaEZhY2VNYXRlcmlhbCggbWF0ZXJpYWxzICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVF
Lk1lc2hGYWNlTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQu
JyApOworCQlyZXR1cm4gbWF0ZXJpYWxzOworCisJfQorCisJZnVuY3Rpb24gTXVsdGlNYXRlcmlh
bCggbWF0ZXJpYWxzICkgeworCisJCWlmICggbWF0ZXJpYWxzID09PSB1bmRlZmluZWQgKSBtYXRl
cmlhbHMgPSBbXTsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5NdWx0aU1hdGVyaWFsIGhhcyBi
ZWVuIHJlbW92ZWQuIFVzZSBhbiBBcnJheSBpbnN0ZWFkLicgKTsKKwkJbWF0ZXJpYWxzLmlzTXVs
dGlNYXRlcmlhbCA9IHRydWU7CisJCW1hdGVyaWFscy5tYXRlcmlhbHMgPSBtYXRlcmlhbHM7CisJ
CW1hdGVyaWFscy5jbG9uZSA9IGZ1bmN0aW9uICgpIHsKKworCQkJcmV0dXJuIG1hdGVyaWFscy5z
bGljZSgpOworCisJCX07CisJCXJldHVybiBtYXRlcmlhbHM7CisKKwl9CisKKwlmdW5jdGlvbiBQ
b2ludENsb3VkKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhS
RUUuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4nICk7CisJCXJl
dHVybiBuZXcgUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKKworCX0KKworCWZ1bmN0aW9u
IFBhcnRpY2xlKCBtYXRlcmlhbCApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNs
ZSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlNwcml0ZS4nICk7CisJCXJldHVybiBuZXcgU3By
aXRlKCBtYXRlcmlhbCApOworCisJfQorCisJZnVuY3Rpb24gUGFydGljbGVTeXN0ZW0oIGdlb21l
dHJ5LCBtYXRlcmlhbCApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZVN5c3Rl
bSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4nICk7CisJCXJldHVybiBuZXcgUG9p
bnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKKworCX0KKworCWZ1bmN0aW9uIFBvaW50Q2xvdWRN
YXRlcmlhbCggcGFyYW1ldGVycyApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5Qb2ludENs
b3VkTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7
CisJCXJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKTsKKworCX0KKworCWZ1
bmN0aW9uIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKKworCQljb25zb2xl
Lndhcm4oICdUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBU
SFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7CisJCXJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBh
cmFtZXRlcnMgKTsKKworCX0KKworCWZ1bmN0aW9uIFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwoIHBh
cmFtZXRlcnMgKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVTeXN0ZW1NYXRl
cmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTsKKwkJcmV0
dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApOworCisJfQorCisJZnVuY3Rpb24g
VmVydGV4KCB4LCB5LCB6ICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlcnRleCBoYXMg
YmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLicgKTsKKwkJcmV0dXJuIG5l
dyBWZWN0b3IzKCB4LCB5LCB6ICk7CisKKwl9CisKKwkvLworCisJZnVuY3Rpb24gRHluYW1pY0J1
ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisJCWNvbnNvbGUud2FybiggJ1RI
UkVFLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJF
RS5CdWZmZXJBdHRyaWJ1dGUoKS5zZXREeW5hbWljKCB0cnVlICkgaW5zdGVhZC4nICk7CisJCXJl
dHVybiBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKS5zZXREeW5hbWljKCB0
cnVlICk7CisKKwl9CisKKwlmdW5jdGlvbiBJbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUg
KSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuSW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1v
dmVkLiBVc2UgbmV3IFRIUkVFLkludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKKwkJ
cmV0dXJuIG5ldyBJbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKKworCX0K
KworCWZ1bmN0aW9uIFVpbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKwkJY29u
c29sZS53YXJuKCAnVEhSRUUuVWludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5l
dyBUSFJFRS5VaW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOworCQlyZXR1cm4gbmV3
IFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKKworCX0KKworCWZ1bmN0
aW9uIFVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisJCWNvbnNv
bGUud2FybiggJ1RIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBV
c2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOwor
CQlyZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXpl
ICk7CisKKwl9CisKKwlmdW5jdGlvbiBJbnQxNkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkg
eworCisJCWNvbnNvbGUud2FybiggJ1RIUkVFLkludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92
ZWQuIFVzZSBuZXcgVEhSRUUuSW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKKwkJ
cmV0dXJuIG5ldyBJbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CisKKwl9
CisKKwlmdW5jdGlvbiBVaW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworCQlj
b25zb2xlLndhcm4oICdUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNl
IG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKKwkJcmV0dXJu
IG5ldyBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOworCisJfQorCisJ
ZnVuY3Rpb24gSW50MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworCQljb25zb2xl
Lndhcm4oICdUSFJFRS5JbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRI
UkVFLkludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CisJCXJldHVybiBuZXcgSW50
MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOworCisJfQorCisJZnVuY3Rpb24g
VWludDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKwkJY29uc29sZS53YXJuKCAn
VEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWlu
dDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CisJCXJldHVybiBuZXcgVWludDMyQnVm
ZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKKworCX0KKworCWZ1bmN0aW9uIEZsb2F0
MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJF
RS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQz
MkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOworCQlyZXR1cm4gbmV3IEZsb2F0MzJCdWZm
ZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOworCisJfQorCisJZnVuY3Rpb24gRmxvYXQ2
NEF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVF
LkZsb2F0NjRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDY0
QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CisJCXJldHVybiBuZXcgRmxvYXQ2NEJ1ZmZl
ckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CisKKwl9CisKKwkvLworCisJQ3VydmUuY3Jl
YXRlID0gZnVuY3Rpb24gKCBjb25zdHJ1Y3QsIGdldFBvaW50ICkgeworCisJCWNvbnNvbGUubG9n
KCAnVEhSRUUuQ3VydmUuY3JlYXRlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCcgKTsKKworCQljb25z
dHJ1Y3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CisJCWNv
bnN0cnVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Q7CisJCWNvbnN0cnVjdC5w
cm90b3R5cGUuZ2V0UG9pbnQgPSBnZXRQb2ludDsKKworCQlyZXR1cm4gY29uc3RydWN0OworCisJ
fTsKKworCS8vCisKKwlmdW5jdGlvbiBDbG9zZWRTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHsKKwor
CQljb25zb2xlLndhcm4oICdUSFJFRS5DbG9zZWRTcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVj
YXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7CisKKwkJQ2F0bXVs
bFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTsKKwkJdGhpcy50eXBlID0gJ2NhdG11bGxy
b20nOworCQl0aGlzLmNsb3NlZCA9IHRydWU7CisKKwl9CisKKwlDbG9zZWRTcGxpbmVDdXJ2ZTMu
cHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgKTsK
KworCS8vCisKKwlmdW5jdGlvbiBTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHsKKworCQljb25zb2xl
Lndhcm4oICdUSFJFRS5TcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVF
LkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7CisKKwkJQ2F0bXVsbFJvbUN1cnZlMy5jYWxs
KCB0aGlzLCBwb2ludHMgKTsKKwkJdGhpcy50eXBlID0gJ2NhdG11bGxyb20nOworCisJfQorCisJ
U3BsaW5lQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENhdG11bGxSb21DdXJ2ZTMu
cHJvdG90eXBlICk7CisKKwkvLworCisJZnVuY3Rpb24gU3BsaW5lKCBwb2ludHMgKSB7CisKKwkJ
Y29uc29sZS53YXJuKCAnVEhSRUUuU3BsaW5lIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5D
YXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuJyApOworCisJCUNhdG11bGxSb21DdXJ2ZTMuY2FsbCgg
dGhpcywgcG9pbnRzICk7CisJCXRoaXMudHlwZSA9ICdjYXRtdWxscm9tJzsKKworCX0KKworCVNw
bGluZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlw
ZSApOworCisJT2JqZWN0LmFzc2lnbiggU3BsaW5lLnByb3RvdHlwZSwgeworCisJCWluaXRGcm9t
QXJyYXk6IGZ1bmN0aW9uICggYSApIHsKKworCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGlu
ZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKKworCQl9LAorCQlnZXRD
b250cm9sUG9pbnRzQXJyYXk6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCWNv
bnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5nZXRDb250cm9sUG9pbnRzQXJyYXkoKSBoYXMg
YmVlbiByZW1vdmVkLicgKTsKKworCQl9LAorCQlyZXBhcmFtZXRyaXplQnlBcmNMZW5ndGg6IGZ1
bmN0aW9uICggc2FtcGxpbmdDb2VmICkgeworCisJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuU3Bs
aW5lOiAucmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisK
KwkJfQorCisJfSApOworCisJLy8KKwlmdW5jdGlvbiBCb3VuZGluZ0JveEhlbHBlciggb2JqZWN0
LCBjb2xvciApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3VuZGluZ0JveEhlbHBlciBo
YXMgYmVlbiBkZXByZWNhdGVkLiBDcmVhdGluZyBhIFRIUkVFLkJveEhlbHBlciBpbnN0ZWFkLicg
KTsKKwkJcmV0dXJuIG5ldyBCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKTsKKworCX0KKworCWZ1
bmN0aW9uIEVkZ2VzSGVscGVyKCBvYmplY3QsIGhleCApIHsKKworCQljb25zb2xlLndhcm4oICdU
SFJFRS5FZGdlc0hlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRWRnZXNHZW9tZXRy
eSBpbnN0ZWFkLicgKTsKKwkJcmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBFZGdlc0dlb21l
dHJ5KCBvYmplY3QuZ2VvbWV0cnkgKSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBo
ZXggIT09IHVuZGVmaW5lZCA/IGhleCA6IDB4ZmZmZmZmIH0gKSApOworCisJfQorCisJR3JpZEhl
bHBlci5wcm90b3R5cGUuc2V0Q29sb3JzID0gZnVuY3Rpb24gKCkgeworCisJCWNvbnNvbGUuZXJy
b3IoICdUSFJFRS5HcmlkSGVscGVyOiBzZXRDb2xvcnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBw
YXNzIHRoZW0gaW4gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuJyApOworCisJfTsKKworCVNrZWxl
dG9uSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7CisKKwkJY29uc29sZS5l
cnJvciggJ1RIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8g
YmUgY2FsbGVkLicgKTsKKwkJCisJfTsKKworCWZ1bmN0aW9uIFdpcmVmcmFtZUhlbHBlciggb2Jq
ZWN0LCBoZXggKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuV2lyZWZyYW1lSGVscGVyIGhh
cyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5XaXJlZnJhbWVHZW9tZXRyeSBpbnN0ZWFkLicgKTsK
KwkJcmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBXaXJlZnJhbWVHZW9tZXRyeSggb2JqZWN0
Lmdlb21ldHJ5ICksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4ICE9PSB1bmRl
ZmluZWQgPyBoZXggOiAweGZmZmZmZiB9ICkgKTsKKworCX0KKworCS8vCisKKwlmdW5jdGlvbiBY
SFJMb2FkZXIoIG1hbmFnZXIgKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuWEhSTG9hZGVy
IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRmlsZUxvYWRlci4nICk7CisJCXJldHVybiBuZXcg
RmlsZUxvYWRlciggbWFuYWdlciApOworCisJfQorCisJZnVuY3Rpb24gQmluYXJ5VGV4dHVyZUxv
YWRlciggbWFuYWdlciApIHsKKworCQljb25zb2xlLndhcm4oICdUSFJFRS5CaW5hcnlUZXh0dXJl
TG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRGF0YVRleHR1cmVMb2FkZXIuJyApOwor
CQlyZXR1cm4gbmV3IERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICk7CisKKwl9CisKKwkvLwor
CisJT2JqZWN0LmFzc2lnbiggQm94Mi5wcm90b3R5cGUsIHsKKworCQljZW50ZXI6IGZ1bmN0aW9u
ICggb3B0aW9uYWxUYXJnZXQgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5j
ZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7CisJCQlyZXR1cm4g
dGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7CisKKwkJfSwKKwkJZW1wdHk6IGZ1bmN0
aW9uICgpIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmVtcHR5KCkgaGFzIGJl
ZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLicgKTsKKwkJCXJldHVybiB0aGlzLmlzRW1wdHkoKTsK
KworCQl9LAorCQlpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7CisKKwkJCWNv
bnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJl
bmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7CisJCQlyZXR1cm4gdGhpcy5pbnRlcnNlY3Rz
Qm94KCBib3ggKTsKKworCQl9LAorCQlzaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkg
eworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFt
ZWQgdG8gLmdldFNpemUoKS4nICk7CisJCQlyZXR1cm4gdGhpcy5nZXRTaXplKCBvcHRpb25hbFRh
cmdldCApOworCisJCX0KKwl9ICk7CisKKwlPYmplY3QuYXNzaWduKCBCb3gzLnByb3RvdHlwZSwg
eworCisJCWNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworCQkJY29uc29s
ZS53YXJuKCAnVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENl
bnRlcigpLicgKTsKKwkJCXJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTsK
KworCQl9LAorCQllbXB0eTogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJF
RS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApOworCQkJ
cmV0dXJuIHRoaXMuaXNFbXB0eSgpOworCisJCX0sCisJCWlzSW50ZXJzZWN0aW9uQm94OiBmdW5j
dGlvbiAoIGJveCApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJz
ZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTsKKwkJ
CXJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApOworCisJCX0sCisJCWlzSW50ZXJzZWN0
aW9uU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhS
RUUuQm94MzogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50
ZXJzZWN0c1NwaGVyZSgpLicgKTsKKwkJCXJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNw
aGVyZSApOworCisJCX0sCisJCXNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CisK
KwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0
byAuZ2V0U2l6ZSgpLicgKTsKKwkJCXJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0
ICk7CisKKwkJfQorCX0gKTsKKworCUxpbmUzLnByb3RvdHlwZS5jZW50ZXIgPSBmdW5jdGlvbiAo
IG9wdGlvbmFsVGFyZ2V0ICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuY2Vu
dGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuJyApOworCQlyZXR1cm4gdGhp
cy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7CisKKwl9OworCisJX01hdGgucmFuZG9tMTYg
PSBmdW5jdGlvbiAoKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0aC5yYW5kb20xNigp
IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGluc3RlYWQuJyApOworCQly
ZXR1cm4gTWF0aC5yYW5kb20oKTsKKworCX07CisKKwlPYmplY3QuYXNzaWduKCBNYXRyaXgzLnBy
b3RvdHlwZSwgeworCisJCWZsYXR0ZW5Ub0FycmF5T2Zmc2V0OiBmdW5jdGlvbiAoIGFycmF5LCBv
ZmZzZXQgKSB7CisKKwkJCWNvbnNvbGUud2FybiggIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9B
cnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQu
IiApOworCQkJcmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApOworCisJCX0sCisJ
CW11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7CisKKwkJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBV
c2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4nICk7CisJCQlyZXR1cm4g
dmVjdG9yLmFwcGx5TWF0cml4MyggdGhpcyApOworCisJCX0sCisJCW11bHRpcGx5VmVjdG9yM0Fy
cmF5OiBmdW5jdGlvbiAoIGEgKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgz
OiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgICk7CisKKwkJfSwK
KwkJYXBwbHlUb0J1ZmZlcjogZnVuY3Rpb24oIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGggKSB7CisK
KwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJl
ZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUg
KSBpbnN0ZWFkLicgKTsKKwkJCXJldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGJ1
ZmZlciApOworCisJCX0sCisJCWFwcGx5VG9WZWN0b3IzQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSwg
b2Zmc2V0LCBsZW5ndGggKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAu
YXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOworCisJCX0KKworCX0g
KTsKKworCU9iamVjdC5hc3NpZ24oIE1hdHJpeDQucHJvdG90eXBlLCB7CisKKwkJZXh0cmFjdFBv
c2l0aW9uOiBmdW5jdGlvbiAoIG0gKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJp
eDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24o
KS4nICk7CisJCQlyZXR1cm4gdGhpcy5jb3B5UG9zaXRpb24oIG0gKTsKKworCQl9LAorCQlmbGF0
dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgeworCisJCQljb25z
b2xlLndhcm4oICJUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVl
biBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLiIgKTsKKwkJCXJldHVybiB0aGlz
LnRvQXJyYXkoIGFycmF5LCBvZmZzZXQgKTsKKworCQl9LAorCQlnZXRQb3NpdGlvbjogZnVuY3Rp
b24gKCkgeworCisJCQl2YXIgdjE7CisKKwkJCXJldHVybiBmdW5jdGlvbiBnZXRQb3NpdGlvbigp
IHsKKworCQkJCWlmICggdjEgPT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTsKKwkJ
CQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiBy
ZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3Rl
YWQuJyApOworCQkJCXJldHVybiB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAzICk7CisK
KwkJCX07CisKKwkJfSgpLAorCQlzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAo
IHEgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5zZXRSb3RhdGlvbkZy
b21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFrZVJvdGF0aW9uRnJvbVF1YXRl
cm5pb24oKS4nICk7CisJCQlyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigg
cSApOworCisJCX0sCisJCW11bHRpcGx5VG9BcnJheTogZnVuY3Rpb24gKCkgeworCisJCQljb25z
b2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVt
b3ZlZC4nICk7CisKKwkJfSwKKwkJbXVsdGlwbHlWZWN0b3IzOiBmdW5jdGlvbiAoIHZlY3RvciAp
IHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygp
IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0
ZWFkLicgKTsKKwkJCXJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7CisKKwkJfSwK
KwkJbXVsdGlwbHlWZWN0b3I0OiBmdW5jdGlvbiAoIHZlY3RvciApIHsKKworCQkJY29uc29sZS53
YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQu
IFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKKwkJCXJldHVy
biB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7CisKKwkJfSwKKwkJbXVsdGlwbHlWZWN0b3Iz
QXJyYXk6IGZ1bmN0aW9uICggYSApIHsKKworCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJp
eDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyAgKTsKKworCQl9
LAorCQlyb3RhdGVBeGlzOiBmdW5jdGlvbiAoIHYgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RI
UkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMu
dHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKKwkJCXYudHJhbnNmb3Jt
RGlyZWN0aW9uKCB0aGlzICk7CisKKwkJfSwKKwkJY3Jvc3NWZWN0b3I6IGZ1bmN0aW9uICggdmVj
dG9yICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuY3Jvc3NWZWN0b3Io
KSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5z
dGVhZC4nICk7CisJCQlyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApOworCisJCX0s
CisJCXRyYW5zbGF0ZTogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLmVycm9yKCAnVEhSRUUu
TWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOworCisJCX0sCisJCXJv
dGF0ZVg6IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6
IC5yb3RhdGVYKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKwkJfSwKKwkJcm90YXRlWTogZnVu
Y3Rpb24gKCkgeworCisJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVko
KSBoYXMgYmVlbiByZW1vdmVkLicgKTsKKworCQl9LAorCQlyb3RhdGVaOiBmdW5jdGlvbiAoKSB7
CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVu
IHJlbW92ZWQuJyApOworCisJCX0sCisJCXJvdGF0ZUJ5QXhpczogZnVuY3Rpb24gKCkgeworCisJ
CQljb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZUJ5QXhpcygpIGhhcyBiZWVu
IHJlbW92ZWQuJyApOworCisJCX0sCisJCWFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uKCBidWZmZXIs
IG9mZnNldCwgbGVuZ3RoICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAu
YXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZl
ckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4nICk7CisJCQlyZXR1cm4gdGhpcy5hcHBs
eVRvQnVmZmVyQXR0cmlidXRlKCBidWZmZXIgKTsKKworCQl9LAorCQlhcHBseVRvVmVjdG9yM0Fy
cmF5OiBmdW5jdGlvbiggYXJyYXksIG9mZnNldCwgbGVuZ3RoICkgeworCisJCQljb25zb2xlLmVy
cm9yKCAnVEhSRUUuTWF0cml4NDogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1v
dmVkLicgKTsKKworCQl9LAorCQltYWtlRnJ1c3R1bTogZnVuY3Rpb24oIGxlZnQsIHJpZ2h0LCBi
b3R0b20sIHRvcCwgbmVhciwgZmFyICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRy
aXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2
ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLicgKTsKKwkJ
CXJldHVybiB0aGlzLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBu
ZWFyLCBmYXIgKTsKKworCQl9CisKKwl9ICk7CisKKwlQbGFuZS5wcm90b3R5cGUuaXNJbnRlcnNl
Y3Rpb25MaW5lID0gZnVuY3Rpb24gKCBsaW5lICkgeworCisJCWNvbnNvbGUud2FybiggJ1RIUkVF
LlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJz
ZWN0c0xpbmUoKS4nICk7CisJCXJldHVybiB0aGlzLmludGVyc2VjdHNMaW5lKCBsaW5lICk7CisK
Kwl9OworCisJUXVhdGVybmlvbi5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzID0gZnVuY3Rpb24g
KCB2ZWN0b3IgKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRp
cGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVh
dGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuJyApOworCQlyZXR1cm4gdmVjdG9yLmFwcGx5
UXVhdGVybmlvbiggdGhpcyApOworCisJfTsKKworCU9iamVjdC5hc3NpZ24oIFJheS5wcm90b3R5
cGUsIHsKKworCQlpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7CisKKwkJCWNv
bnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVu
YW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTsKKwkJCXJldHVybiB0aGlzLmludGVyc2VjdHNC
b3goIGJveCApOworCisJCX0sCisJCWlzSW50ZXJzZWN0aW9uUGxhbmU6IGZ1bmN0aW9uICggcGxh
bmUgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uUGxh
bmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzUGxhbmUoKS4nICk7CisJCQlyZXR1
cm4gdGhpcy5pbnRlcnNlY3RzUGxhbmUoIHBsYW5lICk7CisKKwkJfSwKKwkJaXNJbnRlcnNlY3Rp
b25TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJF
RS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVy
c2VjdHNTcGhlcmUoKS4nICk7CisJCQlyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhl
cmUgKTsKKworCQl9CisKKwl9ICk7CisKKwlPYmplY3QuYXNzaWduKCBTaGFwZS5wcm90b3R5cGUs
IHsKKworCQlleHRydWRlOiBmdW5jdGlvbiAoIG9wdGlvbnMgKSB7CisKKwkJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRl
R2VvbWV0cnkoKSBpbnN0ZWFkLicgKTsKKwkJCXJldHVybiBuZXcgRXh0cnVkZUdlb21ldHJ5KCB0
aGlzLCBvcHRpb25zICk7CisKKwkJfSwKKwkJbWFrZUdlb21ldHJ5OiBmdW5jdGlvbiAoIG9wdGlv
bnMgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkg
aGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTsKKwkJCXJl
dHVybiBuZXcgU2hhcGVHZW9tZXRyeSggdGhpcywgb3B0aW9ucyApOworCisJCX0KKworCX0gKTsK
KworCU9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJvdG90eXBlLCB7CisKKwkJZnJvbUF0dHJpYnV0
ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7CisKKwkJCWNvbnNvbGUu
ZXJyb3IoICdUSFJFRS5WZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQg
dG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7CisJCQlyZXR1cm4gdGhpcy5mcm9tQnVmZmVy
QXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTsKKworCQl9CisKKwl9ICk7CisK
KwlPYmplY3QuYXNzaWduKCBWZWN0b3IzLnByb3RvdHlwZSwgeworCisJCXNldEV1bGVyRnJvbVJv
dGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5W
ZWN0b3IzOiAuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgoKSBoYXMgYmVlbiByZW1vdmVkLiBV
c2UgRXVsZXIuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgaW5zdGVhZC4nICk7CisKKwkJfSwKKwkJ
c2V0RXVsZXJGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLmVycm9y
KCAnVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1v
dmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLicgKTsKKworCQl9LAor
CQlnZXRQb3NpdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHsKKworCQkJY29uc29sZS53
YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldFBvc2l0aW9uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJl
bmFtZWQgdG8gLnNldEZyb21NYXRyaXhQb3NpdGlvbigpLicgKTsKKwkJCXJldHVybiB0aGlzLnNl
dEZyb21NYXRyaXhQb3NpdGlvbiggbSApOworCisJCX0sCisJCWdldFNjYWxlRnJvbU1hdHJpeDog
ZnVuY3Rpb24gKCBtICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0
U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxl
KCkuJyApOworCQkJcmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKCBtICk7CisKKwkJfSwK
KwkJZ2V0Q29sdW1uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBpbmRleCwgbWF0cml4ICkgeworCisJ
CQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhh
cyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4nICk7CisJCQlyZXR1cm4g
dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtYXRyaXgsIGluZGV4ICk7CisKKwkJfSwKKwkJYXBw
bHlQcm9qZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVF
LlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5
TWF0cml4NCggbSApIGluc3RlYWQuJyApOworCQkJcmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBt
ICk7CisKKwkJfSwKKwkJZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4
LCBvZmZzZXQgKSB7CisKKwkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuZnJvbUF0
dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7
CisJCQlyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBv
ZmZzZXQgKTsKKworCQl9CisKKwl9ICk7CisKKwlPYmplY3QuYXNzaWduKCBWZWN0b3I0LnByb3Rv
dHlwZSwgeworCisJCWZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwg
b2Zmc2V0ICkgeworCisJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yNDogLmZyb21BdHRy
aWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApOwor
CQkJcmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zm
c2V0ICk7CisKKwkJfQorCisJfSApOworCisJLy8KKworCUdlb21ldHJ5LnByb3RvdHlwZS5jb21w
dXRlVGFuZ2VudHMgPSBmdW5jdGlvbiAoKSB7CisKKwkJY29uc29sZS53YXJuKCAnVEhSRUUuR2Vv
bWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKKworCX07CisK
KwlPYmplY3QuYXNzaWduKCBPYmplY3QzRC5wcm90b3R5cGUsIHsKKworCQlnZXRDaGlsZEJ5TmFt
ZTogZnVuY3Rpb24gKCBuYW1lICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3Qz
RDogLmdldENoaWxkQnlOYW1lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0T2JqZWN0QnlOYW1l
KCkuJyApOworCQkJcmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlOYW1lKCBuYW1lICk7CisKKwkJfSwK
KwkJcmVuZGVyRGVwdGg6IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUu
T2JqZWN0M0Q6IC5yZW5kZXJEZXB0aCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnJlbmRlck9yZGVy
LCBpbnN0ZWFkLicgKTsKKworCQl9LAorCQl0cmFuc2xhdGU6IGZ1bmN0aW9uICggZGlzdGFuY2Us
IGF4aXMgKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudHJhbnNsYXRl
KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNl
ICkgaW5zdGVhZC4nICk7CisJCQlyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRp
c3RhbmNlICk7CisKKwkJfQorCisJfSApOworCisJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE9i
amVjdDNELnByb3RvdHlwZSwgeworCisJCWV1bGVyT3JkZXI6IHsKKwkJCWdldDogZnVuY3Rpb24g
KCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlz
IG5vdyAucm90YXRpb24ub3JkZXIuJyApOworCQkJCXJldHVybiB0aGlzLnJvdGF0aW9uLm9yZGVy
OworCisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJY29uc29sZS53
YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIu
JyApOworCQkJCXRoaXMucm90YXRpb24ub3JkZXIgPSB2YWx1ZTsKKworCQkJfQorCQl9LAorCQl1
c2VRdWF0ZXJuaW9uOiB7CisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUg
bGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTsKKworCQkJfSwKKwkJ
CXNldDogZnVuY3Rpb24gKCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6
IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1
YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApOworCisJCQl9CisJCX0KKworCX0gKTsKKworCU9iamVj
dC5kZWZpbmVQcm9wZXJ0aWVzKCBMT0QucHJvdG90eXBlLCB7CisKKwkJb2JqZWN0czogeworCQkJ
Z2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MT0Q6IC5vYmpl
Y3RzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmxldmVscy4nICk7CisJCQkJcmV0dXJuIHRoaXMubGV2
ZWxzOworCisJCQl9CisJCX0KKworCX0gKTsKKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggU2tl
bGV0b24ucHJvdG90eXBlLCAndXNlVmVydGV4VGV4dHVyZScsIHsKKworCQlnZXQ6IGZ1bmN0aW9u
ICgpIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1
cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKwkJfSwKKwkJc2V0OiBmdW5jdGlvbiAoKSB7CisK
KwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBi
ZWVuIHJlbW92ZWQuJyApOworCisJCX0KKworCX0gKTsKKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0
eSggQ3VydmUucHJvdG90eXBlLCAnX19hcmNMZW5ndGhEaXZpc2lvbnMnLCB7CisKKwkJZ2V0OiBm
dW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuX19hcmNMZW5n
dGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApOworCQkJcmV0dXJuIHRo
aXMuYXJjTGVuZ3RoRGl2aXNpb25zOworCisJCX0sCisJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSAp
IHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9u
cyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7CisJCQl0aGlzLmFyY0xlbmd0aERpdmlz
aW9ucyA9IHZhbHVlOworCisJCX0KKworCX0gKTsKKworCS8vCisKKwlQZXJzcGVjdGl2ZUNhbWVy
YS5wcm90b3R5cGUuc2V0TGVucyA9IGZ1bmN0aW9uICggZm9jYWxMZW5ndGgsIGZpbG1HYXVnZSAp
IHsKKworCQljb25zb2xlLndhcm4oICJUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYS5zZXRMZW5zIGlz
IGRlcHJlY2F0ZWQuICIgKworCQkJCSJVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdl
IGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC4iICk7CisKKwkJaWYgKCBmaWxtR2F1Z2UgIT09IHVu
ZGVmaW5lZCApIHRoaXMuZmlsbUdhdWdlID0gZmlsbUdhdWdlOworCQl0aGlzLnNldEZvY2FsTGVu
Z3RoKCBmb2NhbExlbmd0aCApOworCisJfTsKKworCS8vCisKKwlPYmplY3QuZGVmaW5lUHJvcGVy
dGllcyggTGlnaHQucHJvdG90eXBlLCB7CisJCW9ubHlTaGFkb3c6IHsKKwkJCXNldDogZnVuY3Rp
b24gKCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhh
cyBiZWVuIHJlbW92ZWQuJyApOworCisJCQl9CisJCX0sCisJCXNoYWRvd0NhbWVyYUZvdjogewor
CQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUu
TGlnaHQ6IC5zaGFkb3dDYW1lcmFGb3YgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZvdi4nICk7CisJ
CQkJdGhpcy5zaGFkb3cuY2FtZXJhLmZvdiA9IHZhbHVlOworCisJCQl9CisJCX0sCisJCXNoYWRv
d0NhbWVyYUxlZnQ6IHsKKwkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJCWNvbnNv
bGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTGVmdCBpcyBub3cgLnNoYWRvdy5j
YW1lcmEubGVmdC4nICk7CisJCQkJdGhpcy5zaGFkb3cuY2FtZXJhLmxlZnQgPSB2YWx1ZTsKKwor
CQkJfQorCQl9LAorCQlzaGFkb3dDYW1lcmFSaWdodDogeworCQkJc2V0OiBmdW5jdGlvbiAoIHZh
bHVlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFS
aWdodCBpcyBub3cgLnNoYWRvdy5jYW1lcmEucmlnaHQuJyApOworCQkJCXRoaXMuc2hhZG93LmNh
bWVyYS5yaWdodCA9IHZhbHVlOworCisJCQl9CisJCX0sCisJCXNoYWRvd0NhbWVyYVRvcDogewor
CQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUu
TGlnaHQ6IC5zaGFkb3dDYW1lcmFUb3AgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnRvcC4nICk7CisJ
CQkJdGhpcy5zaGFkb3cuY2FtZXJhLnRvcCA9IHZhbHVlOworCisJCQl9CisJCX0sCisJCXNoYWRv
d0NhbWVyYUJvdHRvbTogeworCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJY29u
c29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFk
b3cuY2FtZXJhLmJvdHRvbS4nICk7CisJCQkJdGhpcy5zaGFkb3cuY2FtZXJhLmJvdHRvbSA9IHZh
bHVlOworCisJCQl9CisJCX0sCisJCXNoYWRvd0NhbWVyYU5lYXI6IHsKKwkJCXNldDogZnVuY3Rp
b24gKCB2YWx1ZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93
Q2FtZXJhTmVhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEubmVhci4nICk7CisJCQkJdGhpcy5zaGFk
b3cuY2FtZXJhLm5lYXIgPSB2YWx1ZTsKKworCQkJfQorCQl9LAorCQlzaGFkb3dDYW1lcmFGYXI6
IHsKKwkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RI
UkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRmFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mYXIuJyAp
OworCQkJCXRoaXMuc2hhZG93LmNhbWVyYS5mYXIgPSB2YWx1ZTsKKworCQkJfQorCQl9LAorCQlz
aGFkb3dDYW1lcmFWaXNpYmxlOiB7CisJCQlzZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCWNvbnNv
bGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1v
dmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGlu
c3RlYWQuJyApOworCisJCQl9CisJCX0sCisJCXNoYWRvd0JpYXM6IHsKKwkJCXNldDogZnVuY3Rp
b24gKCB2YWx1ZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93
QmlhcyBpcyBub3cgLnNoYWRvdy5iaWFzLicgKTsKKwkJCQl0aGlzLnNoYWRvdy5iaWFzID0gdmFs
dWU7CisKKwkJCX0KKwkJfSwKKwkJc2hhZG93RGFya25lc3M6IHsKKwkJCXNldDogZnVuY3Rpb24g
KCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBo
YXMgYmVlbiByZW1vdmVkLicgKTsKKworCQkJfQorCQl9LAorCQlzaGFkb3dNYXBXaWR0aDogewor
CQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUu
TGlnaHQ6IC5zaGFkb3dNYXBXaWR0aCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLndpZHRoLicgKTsK
KwkJCQl0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoID0gdmFsdWU7CisKKwkJCX0KKwkJfSwKKwkJ
c2hhZG93TWFwSGVpZ2h0OiB7CisJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQlj
b25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcEhlaWdodCBpcyBub3cgLnNoYWRv
dy5tYXBTaXplLmhlaWdodC4nICk7CisJCQkJdGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQgPSB2
YWx1ZTsKKworCQkJfQorCQl9CisJfSApOworCisJLy8KKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0
aWVzKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7CisKKwkJbGVuZ3RoOiB7CisJCQlnZXQ6
IGZ1bmN0aW9uICgpIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0
ZTogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmNvdW50IGluc3RlYWQuJyApOwor
CQkJCXJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDsKKworCQkJfQorCQl9CisKKwl9ICk7CisKKwlP
YmplY3QuYXNzaWduKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUsIHsKKworCQlhZGRJbmRleDog
ZnVuY3Rpb24gKCBpbmRleCApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2Vv
bWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuJyApOwor
CQkJdGhpcy5zZXRJbmRleCggaW5kZXggKTsKKworCQl9LAorCQlhZGREcmF3Q2FsbDogZnVuY3Rp
b24gKCBzdGFydCwgY291bnQsIGluZGV4T2Zmc2V0ICkgeworCisJCQlpZiAoIGluZGV4T2Zmc2V0
ICE9PSB1bmRlZmluZWQgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9t
ZXRyeTogLmFkZERyYXdDYWxsKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIGluZGV4T2Zmc2V0LicgKTsK
KworCQkJfQorCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3
Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4nICk7CisJCQl0aGlzLmFkZEdyb3VwKCBzdGFydCwg
Y291bnQgKTsKKworCQl9LAorCQljbGVhckRyYXdDYWxsczogZnVuY3Rpb24gKCkgeworCisJCQlj
b25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMg
bm93IC5jbGVhckdyb3VwcygpLicgKTsKKwkJCXRoaXMuY2xlYXJHcm91cHMoKTsKKworCQl9LAor
CQljb21wdXRlVGFuZ2VudHM6IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhS
RUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLicg
KTsKKworCQl9LAorCQljb21wdXRlT2Zmc2V0czogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xl
Lndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVPZmZzZXRzKCkgaGFzIGJlZW4g
cmVtb3ZlZC4nICk7CisKKwkJfQorCisJfSApOworCisJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMo
IEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwgeworCisJCWRyYXdjYWxsczogeworCQkJZ2V0OiBm
dW5jdGlvbiAoKSB7CisKKwkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6
IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLicgKTsKKwkJCQlyZXR1cm4g
dGhpcy5ncm91cHM7CisKKwkJCX0KKwkJfSwKKwkJb2Zmc2V0czogeworCQkJZ2V0OiBmdW5jdGlv
biAoKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLm9mZnNl
dHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLicgKTsKKwkJCQlyZXR1cm4gdGhpcy5ncm91
cHM7CisKKwkJCX0KKwkJfQorCisJfSApOworCisJLy8KKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0
aWVzKCBVbmlmb3JtLnByb3RvdHlwZSwgeworCisJCWR5bmFtaWM6IHsKKwkJCXNldDogZnVuY3Rp
b24gKCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogLmR5bmFtaWMgaGFz
IGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuJyApOwor
CisJCQl9CisJCX0sCisJCW9uVXBkYXRlOiB7CisJCQl2YWx1ZTogZnVuY3Rpb24gKCkgeworCisJ
CQkJY29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogLm9uVXBkYXRlKCkgaGFzIGJlZW4gcmVt
b3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuJyApOworCQkJCXJldHVy
biB0aGlzOworCisJCQl9CisJCX0KKworCX0gKTsKKworCS8vCisKKwlPYmplY3QuZGVmaW5lUHJv
cGVydGllcyggTWF0ZXJpYWwucHJvdG90eXBlLCB7CisKKwkJd3JhcEFyb3VuZDogeworCQkJZ2V0
OiBmdW5jdGlvbiAoKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndy
YXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKwkJCX0sCisJCQlzZXQ6IGZ1bmN0aW9u
ICgpIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBo
YXMgYmVlbiByZW1vdmVkLicgKTsKKworCQkJfQorCQl9LAorCQl3cmFwUkdCOiB7CisJCQlnZXQ6
IGZ1bmN0aW9uICgpIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3Jh
cFJHQiBoYXMgYmVlbiByZW1vdmVkLicgKTsKKwkJCQlyZXR1cm4gbmV3IENvbG9yKCk7CisKKwkJ
CX0KKwkJfQorCisJfSApOworCisJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1lc2hQaG9uZ01h
dGVyaWFsLnByb3RvdHlwZSwgeworCisJCW1ldGFsOiB7CisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsK
KworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFz
IGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQuJyAp
OworCQkJCXJldHVybiBmYWxzZTsKKworCQkJfSwKKwkJCXNldDogZnVuY3Rpb24gKCkgeworCisJ
CQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVl
biByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCcgKTsKKwor
CQkJfQorCQl9CisKKwl9ICk7CisKKwlPYmplY3QuZGVmaW5lUHJvcGVydGllcyggU2hhZGVyTWF0
ZXJpYWwucHJvdG90eXBlLCB7CisKKwkJZGVyaXZhdGl2ZXM6IHsKKwkJCWdldDogZnVuY3Rpb24g
KCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0
aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4nICk7CisJCQkJ
cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlczsKKworCQkJfSwKKwkJCXNldDogZnVu
Y3Rpb24gKCB2YWx1ZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLiBTaGFkZXJNYXRl
cmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRp
dmVzLicgKTsKKwkJCQl0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMgPSB2YWx1ZTsKKworCQkJ
fQorCQl9CisKKwl9ICk7CisKKwkvLworCisJT2JqZWN0LmFzc2lnbiggV2ViR0xSZW5kZXJlci5w
cm90b3R5cGUsIHsKKworCQlnZXRDdXJyZW50UmVuZGVyVGFyZ2V0OiBmdW5jdGlvbiAoKSB7CisK
KwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVy
VGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4nICk7CisJCQlyZXR1cm4gdGhpcy5n
ZXRSZW5kZXJUYXJnZXQoKTsKKworCQl9LAorCisJCXN1cHBvcnRzRmxvYXRUZXh0dXJlczogZnVu
Y3Rpb24gKCkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3Vw
cG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXCdPRVNfdGV4dHVy
ZV9mbG9hdFwnICkuJyApOworCQkJcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4
dHVyZV9mbG9hdCcgKTsKKworCQl9LAorCQlzdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzOiBmdW5j
dGlvbiAoKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBw
b3J0c0hhbGZGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXCdPRVNfdGV4
dHVyZV9oYWxmX2Zsb2F0XCcgKS4nICk7CisJCQlyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgg
J09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7CisKKwkJfSwKKwkJc3VwcG9ydHNTdGFuZGFyZERl
cml2YXRpdmVzOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdM
UmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lv
bnMuZ2V0KCBcJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlc1wnICkuJyApOworCQkJcmV0dXJuIHRo
aXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7CisKKwkJfSwK
KwkJc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6IGZ1bmN0aW9uICgpIHsKKworCQkJY29u
c29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1
cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXCdXRUJHTF9jb21wcmVzc2VkX3RleHR1
cmVfczN0Y1wnICkuJyApOworCQkJcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9j
b21wcmVzc2VkX3RleHR1cmVfczN0YycgKTsKKworCQl9LAorCQlzdXBwb3J0c0NvbXByZXNzZWRU
ZXh0dXJlUFZSVEM6IGZ1bmN0aW9uICgpIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2Vi
R0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0
ZW5zaW9ucy5nZXQoIFwnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjXCcgKS4nICk7CisJ
CQlyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9w
dnJ0YycgKTsKKworCQl9LAorCQlzdXBwb3J0c0JsZW5kTWluTWF4OiBmdW5jdGlvbiAoKSB7CisK
KwkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWlu
TWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXCdFWFRfYmxlbmRfbWlubWF4XCcgKS4nICk7
CisJCQlyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7CisK
KwkJfSwKKwkJc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogZnVuY3Rpb24gKCkgeworCisJCQljb25z
b2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcygp
IGlzIG5vdyAuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLicgKTsKKwkJCXJldHVybiB0aGlz
LmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlczsKKworCQl9LAorCQlzdXBwb3J0c0luc3RhbmNl
ZEFycmF5czogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJl
bmRlcmVyOiAuc3VwcG9ydHNJbnN0YW5jZWRBcnJheXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0
KCBcJ0FOR0xFX2luc3RhbmNlZF9hcnJheXNcJyApLicgKTsKKwkJCXJldHVybiB0aGlzLmV4dGVu
c2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTsKKworCQl9LAorCQllbmFibGVT
Y2lzc29yVGVzdDogZnVuY3Rpb24gKCBib29sZWFuICkgeworCisJCQljb25zb2xlLndhcm4oICdU
SFJFRS5XZWJHTFJlbmRlcmVyOiAuZW5hYmxlU2Npc3NvclRlc3QoKSBpcyBub3cgLnNldFNjaXNz
b3JUZXN0KCkuJyApOworCQkJdGhpcy5zZXRTY2lzc29yVGVzdCggYm9vbGVhbiApOworCisJCX0s
CisJCWluaXRNYXRlcmlhbDogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJF
RS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisK
KwkJfSwKKwkJYWRkUHJlUGx1Z2luOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUud2Fybigg
J1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQcmVQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicg
KTsKKworCQl9LAorCQlhZGRQb3N0UGx1Z2luOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUu
d2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVt
b3ZlZC4nICk7CisKKwkJfSwKKwkJdXBkYXRlU2hhZG93TWFwOiBmdW5jdGlvbiAoKSB7CisKKwkJ
CWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBo
YXMgYmVlbiByZW1vdmVkLicgKTsKKworCQl9CisKKwl9ICk7CisKKwlPYmplY3QuZGVmaW5lUHJv
cGVydGllcyggV2ViR0xSZW5kZXJlci5wcm90b3R5cGUsIHsKKworCQlzaGFkb3dNYXBFbmFibGVk
OiB7CisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCXJldHVybiB0aGlzLnNoYWRvd01hcC5l
bmFibGVkOworCisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJCQkJY29u
c29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93
IC5zaGFkb3dNYXAuZW5hYmxlZC4nICk7CisJCQkJdGhpcy5zaGFkb3dNYXAuZW5hYmxlZCA9IHZh
bHVlOworCisJCQl9CisJCX0sCisJCXNoYWRvd01hcFR5cGU6IHsKKwkJCWdldDogZnVuY3Rpb24g
KCkgeworCisJCQkJcmV0dXJuIHRoaXMuc2hhZG93TWFwLnR5cGU7CisKKwkJCX0sCisJCQlzZXQ6
IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJl
bmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLicgKTsKKwkJCQl0
aGlzLnNoYWRvd01hcC50eXBlID0gdmFsdWU7CisKKwkJCX0KKwkJfSwKKwkJc2hhZG93TWFwQ3Vs
bEZhY2U6IHsKKwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJcmV0dXJuIHRoaXMuc2hhZG93
TWFwLmN1bGxGYWNlOworCisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisJ
CQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNl
IGlzIG5vdyAuc2hhZG93TWFwLmN1bGxGYWNlLicgKTsKKwkJCQl0aGlzLnNoYWRvd01hcC5jdWxs
RmFjZSA9IHZhbHVlOworCisJCQl9CisJCX0KKwl9ICk7CisKKwlPYmplY3QuZGVmaW5lUHJvcGVy
dGllcyggV2ViR0xTaGFkb3dNYXAucHJvdG90eXBlLCB7CisKKwkJY3VsbEZhY2U6IHsKKwkJCWdl
dDogZnVuY3Rpb24gKCkgeworCisJCQkJcmV0dXJuIHRoaXMucmVuZGVyUmV2ZXJzZVNpZGVkID8g
Q3VsbEZhY2VGcm9udCA6IEN1bGxGYWNlQmFjazsKKworCQkJfSwKKwkJCXNldDogZnVuY3Rpb24g
KCBjdWxsRmFjZSApIHsKKworCQkJCXZhciB2YWx1ZSA9ICggY3VsbEZhY2UgIT09IEN1bGxGYWNl
QmFjayApOworCQkJCWNvbnNvbGUud2FybiggIldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3Vs
bEZhY2UgaXMgZGVwcmVjYXRlZC4gU2V0IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIHRv
ICIgKyB2YWx1ZSArICIuIiApOworCQkJCXRoaXMucmVuZGVyUmV2ZXJzZVNpZGVkID0gdmFsdWU7
CisKKwkJCX0KKwkJfQorCisJfSApOworCisJLy8KKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVz
KCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUsIHsKKworCQl3cmFwUzogeworCQkJZ2V0OiBm
dW5jdGlvbiAoKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdl
dDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7CisJCQkJcmV0dXJuIHRoaXMudGV4
dHVyZS53cmFwUzsKKworCQkJfSwKKwkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJ
CWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50
ZXh0dXJlLndyYXBTLicgKTsKKwkJCQl0aGlzLnRleHR1cmUud3JhcFMgPSB2YWx1ZTsKKworCQkJ
fQorCQl9LAorCQl3cmFwVDogeworCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQljb25zb2xl
Lndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53
cmFwVC4nICk7CisJCQkJcmV0dXJuIHRoaXMudGV4dHVyZS53cmFwVDsKKworCQkJfSwKKwkJCXNl
dDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdM
UmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTsKKwkJCQl0aGlz
LnRleHR1cmUud3JhcFQgPSB2YWx1ZTsKKworCQkJfQorCQl9LAorCQltYWdGaWx0ZXI6IHsKKwkJ
CWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5k
ZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4nICk7CisJCQkJ
cmV0dXJuIHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI7CisKKwkJCX0sCisJCQlzZXQ6IGZ1bmN0aW9u
ICggdmFsdWUgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdl
dDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTsKKwkJCQl0aGlzLnRl
eHR1cmUubWFnRmlsdGVyID0gdmFsdWU7CisKKwkJCX0KKwkJfSwKKwkJbWluRmlsdGVyOiB7CisJ
CQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVu
ZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApOworCQkJ
CXJldHVybiB0aGlzLnRleHR1cmUubWluRmlsdGVyOworCisJCQl9LAorCQkJc2V0OiBmdW5jdGlv
biAoIHZhbHVlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJn
ZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7CisJCQkJdGhpcy50
ZXh0dXJlLm1pbkZpbHRlciA9IHZhbHVlOworCisJCQl9CisJCX0sCisJCWFuaXNvdHJvcHk6IHsK
KwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xS
ZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTsK
KwkJCQlyZXR1cm4gdGhpcy50ZXh0dXJlLmFuaXNvdHJvcHk7CisKKwkJCX0sCisJCQlzZXQ6IGZ1
bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRl
clRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApOworCQkJ
CXRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5ID0gdmFsdWU7CisKKwkJCX0KKwkJfSwKKwkJb2Zmc2V0
OiB7CisJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKKworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldl
YkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuJyApOworCQkJ
CXJldHVybiB0aGlzLnRleHR1cmUub2Zmc2V0OworCisJCQl9LAorCQkJc2V0OiBmdW5jdGlvbiAo
IHZhbHVlICkgeworCisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6
IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7CisJCQkJdGhpcy50ZXh0dXJlLm9m
ZnNldCA9IHZhbHVlOworCisJCQl9CisJCX0sCisJCXJlcGVhdDogeworCQkJZ2V0OiBmdW5jdGlv
biAoKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJl
cGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTsKKwkJCQlyZXR1cm4gdGhpcy50ZXh0dXJl
LnJlcGVhdDsKKworCQkJfSwKKwkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworCQkJCWNv
bnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4
dHVyZS5yZXBlYXQuJyApOworCQkJCXRoaXMudGV4dHVyZS5yZXBlYXQgPSB2YWx1ZTsKKworCQkJ
fQorCQl9LAorCQlmb3JtYXQ6IHsKKwkJCWdldDogZnVuY3Rpb24gKCkgeworCisJCQkJY29uc29s
ZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJl
LmZvcm1hdC4nICk7CisJCQkJcmV0dXJuIHRoaXMudGV4dHVyZS5mb3JtYXQ7CisKKwkJCX0sCisJ
CQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5X
ZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTsKKwkJ
CQl0aGlzLnRleHR1cmUuZm9ybWF0ID0gdmFsdWU7CisKKwkJCX0KKwkJfSwKKwkJdHlwZTogewor
CQkJZ2V0OiBmdW5jdGlvbiAoKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJl
bmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuJyApOworCQkJCXJldHVybiB0
aGlzLnRleHR1cmUudHlwZTsKKworCQkJfSwKKwkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsK
KworCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBu
b3cgLnRleHR1cmUudHlwZS4nICk7CisJCQkJdGhpcy50ZXh0dXJlLnR5cGUgPSB2YWx1ZTsKKwor
CQkJfQorCQl9LAorCQlnZW5lcmF0ZU1pcG1hcHM6IHsKKwkJCWdldDogZnVuY3Rpb24gKCkgewor
CisJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1p
cG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7CisJCQkJcmV0dXJuIHRo
aXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7CisKKwkJCX0sCisJCQlzZXQ6IGZ1bmN0aW9uICgg
dmFsdWUgKSB7CisKKwkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDog
LmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTsKKwkJ
CQl0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gdmFsdWU7CisKKwkJCX0KKwkJfQorCisJ
fSApOworCisJLy8KKworCUF1ZGlvLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKCBmaWxlICkg
eworCisJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiAubG9hZCBoYXMgYmVlbiBkZXByZWNh
dGVkLiBVc2UgVEhSRUUuQXVkaW9Mb2FkZXIgaW5zdGVhZC4nICk7CisJCXZhciBzY29wZSA9IHRo
aXM7CisJCXZhciBhdWRpb0xvYWRlciA9IG5ldyBBdWRpb0xvYWRlcigpOworCQlhdWRpb0xvYWRl
ci5sb2FkKCBmaWxlLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHsKKworCQkJc2NvcGUuc2V0QnVmZmVy
KCBidWZmZXIgKTsKKworCQl9ICk7CisJCXJldHVybiB0aGlzOworCisJfTsKKworCUF1ZGlvQW5h
bHlzZXIucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbiAoKSB7CisKKwkJY29uc29sZS53YXJu
KCAnVEhSRUUuQXVkaW9BbmFseXNlcjogLmdldERhdGEoKSBpcyBub3cgLmdldEZyZXF1ZW5jeURh
dGEoKS4nICk7CisJCXJldHVybiB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTsKKworCX07CisKKwkv
LworCisJdmFyIEdlb21ldHJ5VXRpbHMgPSB7CisKKwkJbWVyZ2U6IGZ1bmN0aW9uICggZ2VvbWV0
cnkxLCBnZW9tZXRyeTIsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSB7CisKKwkJCWNvbnNvbGUud2Fy
biggJ1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21l
dHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4
T2Zmc2V0ICkgaW5zdGVhZC4nICk7CisJCQl2YXIgbWF0cml4OworCisJCQlpZiAoIGdlb21ldHJ5
Mi5pc01lc2ggKSB7CisKKwkJCQlnZW9tZXRyeTIubWF0cml4QXV0b1VwZGF0ZSAmJiBnZW9tZXRy
eTIudXBkYXRlTWF0cml4KCk7CisKKwkJCQltYXRyaXggPSBnZW9tZXRyeTIubWF0cml4OworCQkJ
CWdlb21ldHJ5MiA9IGdlb21ldHJ5Mi5nZW9tZXRyeTsKKworCQkJfQorCisJCQlnZW9tZXRyeTEu
bWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICk7CisKKwkJfSwK
KworCQljZW50ZXI6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7CisKKwkJCWNvbnNvbGUud2Fybigg
J1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5jZW50ZXIoKSBoYXMgYmVlbiBtb3ZlZCB0byBHZW9tZXRy
eS4gVXNlIGdlb21ldHJ5LmNlbnRlcigpIGluc3RlYWQuJyApOworCQkJcmV0dXJuIGdlb21ldHJ5
LmNlbnRlcigpOworCisJCX0KKworCX07CisKKwl2YXIgSW1hZ2VVdGlscyA9IHsKKworCQljcm9z
c09yaWdpbjogdW5kZWZpbmVkLAorCisJCWxvYWRUZXh0dXJlOiBmdW5jdGlvbiAoIHVybCwgbWFw
cGluZywgb25Mb2FkLCBvbkVycm9yICkgeworCisJCQljb25zb2xlLndhcm4oICdUSFJFRS5JbWFn
ZVV0aWxzLmxvYWRUZXh0dXJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5UZXh0dXJl
TG9hZGVyKCkgaW5zdGVhZC4nICk7CisKKwkJCXZhciBsb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRl
cigpOworCQkJbG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7CisKKwkJ
CXZhciB0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIHVybCwgb25Mb2FkLCB1bmRlZmluZWQsIG9uRXJy
b3IgKTsKKworCQkJaWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZzsKKwor
CQkJcmV0dXJuIHRleHR1cmU7CisKKwkJfSwKKworCQlsb2FkVGV4dHVyZUN1YmU6IGZ1bmN0aW9u
ICggdXJscywgbWFwcGluZywgb25Mb2FkLCBvbkVycm9yICkgeworCisJCQljb25zb2xlLndhcm4o
ICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBV
c2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTsKKworCQkJdmFyIGxvYWRl
ciA9IG5ldyBDdWJlVGV4dHVyZUxvYWRlcigpOworCQkJbG9hZGVyLnNldENyb3NzT3JpZ2luKCB0
aGlzLmNyb3NzT3JpZ2luICk7CisKKwkJCXZhciB0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIHVybHMs
IG9uTG9hZCwgdW5kZWZpbmVkLCBvbkVycm9yICk7CisKKwkJCWlmICggbWFwcGluZyApIHRleHR1
cmUubWFwcGluZyA9IG1hcHBpbmc7CisKKwkJCXJldHVybiB0ZXh0dXJlOworCisJCX0sCisKKwkJ
bG9hZENvbXByZXNzZWRUZXh0dXJlOiBmdW5jdGlvbiAoKSB7CisKKwkJCWNvbnNvbGUuZXJyb3Io
ICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVk
LiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuJyApOworCisJCX0sCisKKwkJbG9hZENvbXBy
ZXNzZWRUZXh0dXJlQ3ViZTogZnVuY3Rpb24gKCkgeworCisJCQljb25zb2xlLmVycm9yKCAnVEhS
RUUuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlIGhhcyBiZWVuIHJlbW92ZWQu
IFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7CisKKwkJfQorCisJfTsKKworCS8vCisK
KwlmdW5jdGlvbiBQcm9qZWN0b3IoKSB7CisKKwkJY29uc29sZS5lcnJvciggJ1RIUkVFLlByb2pl
Y3RvciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVyZXJzL1Byb2plY3Rvci5q
cy4nICk7CisKKwkJdGhpcy5wcm9qZWN0VmVjdG9yID0gZnVuY3Rpb24gKCB2ZWN0b3IsIGNhbWVy
YSApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuUHJvamVjdG9yOiAucHJvamVjdFZlY3Rv
cigpIGlzIG5vdyB2ZWN0b3IucHJvamVjdCgpLicgKTsKKwkJCXZlY3Rvci5wcm9qZWN0KCBjYW1l
cmEgKTsKKworCQl9OworCisJCXRoaXMudW5wcm9qZWN0VmVjdG9yID0gZnVuY3Rpb24gKCB2ZWN0
b3IsIGNhbWVyYSApIHsKKworCQkJY29uc29sZS53YXJuKCAnVEhSRUUuUHJvamVjdG9yOiAudW5w
cm9qZWN0VmVjdG9yKCkgaXMgbm93IHZlY3Rvci51bnByb2plY3QoKS4nICk7CisJCQl2ZWN0b3Iu
dW5wcm9qZWN0KCBjYW1lcmEgKTsKKworCQl9OworCisJCXRoaXMucGlja2luZ1JheSA9IGZ1bmN0
aW9uICgpIHsKKworCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlByb2plY3RvcjogLnBpY2tpbmdS
YXkoKSBpcyBub3cgcmF5Y2FzdGVyLnNldEZyb21DYW1lcmEoKS4nICk7CisKKwkJfTsKKworCX0K
KworCS8vCisKKwlmdW5jdGlvbiBDYW52YXNSZW5kZXJlcigpIHsKKworCQljb25zb2xlLmVycm9y
KCAnVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3Jl
bmRlcmVycy9DYW52YXNSZW5kZXJlci5qcycgKTsKKworCQl0aGlzLmRvbUVsZW1lbnQgPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2Nh
bnZhcycgKTsKKwkJdGhpcy5jbGVhciA9IGZ1bmN0aW9uICgpIHt9OworCQl0aGlzLnJlbmRlciA9
IGZ1bmN0aW9uICgpIHt9OworCQl0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7fTsK
KwkJdGhpcy5zZXRTaXplID0gZnVuY3Rpb24gKCkge307CisKKwl9CisKKwlleHBvcnRzLldlYkdM
UmVuZGVyVGFyZ2V0Q3ViZSA9IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZTsKKwlleHBvcnRzLldlYkdM
UmVuZGVyVGFyZ2V0ID0gV2ViR0xSZW5kZXJUYXJnZXQ7CisJZXhwb3J0cy5XZWJHTFJlbmRlcmVy
ID0gV2ViR0xSZW5kZXJlcjsKKwlleHBvcnRzLlNoYWRlckxpYiA9IFNoYWRlckxpYjsKKwlleHBv
cnRzLlVuaWZvcm1zTGliID0gVW5pZm9ybXNMaWI7CisJZXhwb3J0cy5Vbmlmb3Jtc1V0aWxzID0g
VW5pZm9ybXNVdGlsczsKKwlleHBvcnRzLlNoYWRlckNodW5rID0gU2hhZGVyQ2h1bms7CisJZXhw
b3J0cy5Gb2dFeHAyID0gRm9nRXhwMjsKKwlleHBvcnRzLkZvZyA9IEZvZzsKKwlleHBvcnRzLlNj
ZW5lID0gU2NlbmU7CisJZXhwb3J0cy5MZW5zRmxhcmUgPSBMZW5zRmxhcmU7CisJZXhwb3J0cy5T
cHJpdGUgPSBTcHJpdGU7CisJZXhwb3J0cy5MT0QgPSBMT0Q7CisJZXhwb3J0cy5Ta2lubmVkTWVz
aCA9IFNraW5uZWRNZXNoOworCWV4cG9ydHMuU2tlbGV0b24gPSBTa2VsZXRvbjsKKwlleHBvcnRz
LkJvbmUgPSBCb25lOworCWV4cG9ydHMuTWVzaCA9IE1lc2g7CisJZXhwb3J0cy5MaW5lU2VnbWVu
dHMgPSBMaW5lU2VnbWVudHM7CisJZXhwb3J0cy5MaW5lTG9vcCA9IExpbmVMb29wOworCWV4cG9y
dHMuTGluZSA9IExpbmU7CisJZXhwb3J0cy5Qb2ludHMgPSBQb2ludHM7CisJZXhwb3J0cy5Hcm91
cCA9IEdyb3VwOworCWV4cG9ydHMuVmlkZW9UZXh0dXJlID0gVmlkZW9UZXh0dXJlOworCWV4cG9y
dHMuRGF0YVRleHR1cmUgPSBEYXRhVGV4dHVyZTsKKwlleHBvcnRzLkNvbXByZXNzZWRUZXh0dXJl
ID0gQ29tcHJlc3NlZFRleHR1cmU7CisJZXhwb3J0cy5DdWJlVGV4dHVyZSA9IEN1YmVUZXh0dXJl
OworCWV4cG9ydHMuQ2FudmFzVGV4dHVyZSA9IENhbnZhc1RleHR1cmU7CisJZXhwb3J0cy5EZXB0
aFRleHR1cmUgPSBEZXB0aFRleHR1cmU7CisJZXhwb3J0cy5UZXh0dXJlID0gVGV4dHVyZTsKKwll
eHBvcnRzLkNvbXByZXNzZWRUZXh0dXJlTG9hZGVyID0gQ29tcHJlc3NlZFRleHR1cmVMb2FkZXI7
CisJZXhwb3J0cy5EYXRhVGV4dHVyZUxvYWRlciA9IERhdGFUZXh0dXJlTG9hZGVyOworCWV4cG9y
dHMuQ3ViZVRleHR1cmVMb2FkZXIgPSBDdWJlVGV4dHVyZUxvYWRlcjsKKwlleHBvcnRzLlRleHR1
cmVMb2FkZXIgPSBUZXh0dXJlTG9hZGVyOworCWV4cG9ydHMuT2JqZWN0TG9hZGVyID0gT2JqZWN0
TG9hZGVyOworCWV4cG9ydHMuTWF0ZXJpYWxMb2FkZXIgPSBNYXRlcmlhbExvYWRlcjsKKwlleHBv
cnRzLkJ1ZmZlckdlb21ldHJ5TG9hZGVyID0gQnVmZmVyR2VvbWV0cnlMb2FkZXI7CisJZXhwb3J0
cy5EZWZhdWx0TG9hZGluZ01hbmFnZXIgPSBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CisJZXhwb3J0
cy5Mb2FkaW5nTWFuYWdlciA9IExvYWRpbmdNYW5hZ2VyOworCWV4cG9ydHMuSlNPTkxvYWRlciA9
IEpTT05Mb2FkZXI7CisJZXhwb3J0cy5JbWFnZUxvYWRlciA9IEltYWdlTG9hZGVyOworCWV4cG9y
dHMuRm9udExvYWRlciA9IEZvbnRMb2FkZXI7CisJZXhwb3J0cy5GaWxlTG9hZGVyID0gRmlsZUxv
YWRlcjsKKwlleHBvcnRzLkxvYWRlciA9IExvYWRlcjsKKwlleHBvcnRzLkNhY2hlID0gQ2FjaGU7
CisJZXhwb3J0cy5BdWRpb0xvYWRlciA9IEF1ZGlvTG9hZGVyOworCWV4cG9ydHMuU3BvdExpZ2h0
U2hhZG93ID0gU3BvdExpZ2h0U2hhZG93OworCWV4cG9ydHMuU3BvdExpZ2h0ID0gU3BvdExpZ2h0
OworCWV4cG9ydHMuUG9pbnRMaWdodCA9IFBvaW50TGlnaHQ7CisJZXhwb3J0cy5SZWN0QXJlYUxp
Z2h0ID0gUmVjdEFyZWFMaWdodDsKKwlleHBvcnRzLkhlbWlzcGhlcmVMaWdodCA9IEhlbWlzcGhl
cmVMaWdodDsKKwlleHBvcnRzLkRpcmVjdGlvbmFsTGlnaHRTaGFkb3cgPSBEaXJlY3Rpb25hbExp
Z2h0U2hhZG93OworCWV4cG9ydHMuRGlyZWN0aW9uYWxMaWdodCA9IERpcmVjdGlvbmFsTGlnaHQ7
CisJZXhwb3J0cy5BbWJpZW50TGlnaHQgPSBBbWJpZW50TGlnaHQ7CisJZXhwb3J0cy5MaWdodFNo
YWRvdyA9IExpZ2h0U2hhZG93OworCWV4cG9ydHMuTGlnaHQgPSBMaWdodDsKKwlleHBvcnRzLlN0
ZXJlb0NhbWVyYSA9IFN0ZXJlb0NhbWVyYTsKKwlleHBvcnRzLlBlcnNwZWN0aXZlQ2FtZXJhID0g
UGVyc3BlY3RpdmVDYW1lcmE7CisJZXhwb3J0cy5PcnRob2dyYXBoaWNDYW1lcmEgPSBPcnRob2dy
YXBoaWNDYW1lcmE7CisJZXhwb3J0cy5DdWJlQ2FtZXJhID0gQ3ViZUNhbWVyYTsKKwlleHBvcnRz
LkFycmF5Q2FtZXJhID0gQXJyYXlDYW1lcmE7CisJZXhwb3J0cy5DYW1lcmEgPSBDYW1lcmE7CisJ
ZXhwb3J0cy5BdWRpb0xpc3RlbmVyID0gQXVkaW9MaXN0ZW5lcjsKKwlleHBvcnRzLlBvc2l0aW9u
YWxBdWRpbyA9IFBvc2l0aW9uYWxBdWRpbzsKKwlleHBvcnRzLkF1ZGlvQ29udGV4dCA9IEF1ZGlv
Q29udGV4dDsKKwlleHBvcnRzLkF1ZGlvQW5hbHlzZXIgPSBBdWRpb0FuYWx5c2VyOworCWV4cG9y
dHMuQXVkaW8gPSBBdWRpbzsKKwlleHBvcnRzLlZlY3RvcktleWZyYW1lVHJhY2sgPSBWZWN0b3JL
ZXlmcmFtZVRyYWNrOworCWV4cG9ydHMuU3RyaW5nS2V5ZnJhbWVUcmFjayA9IFN0cmluZ0tleWZy
YW1lVHJhY2s7CisJZXhwb3J0cy5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayA9IFF1YXRlcm5pb25L
ZXlmcmFtZVRyYWNrOworCWV4cG9ydHMuTnVtYmVyS2V5ZnJhbWVUcmFjayA9IE51bWJlcktleWZy
YW1lVHJhY2s7CisJZXhwb3J0cy5Db2xvcktleWZyYW1lVHJhY2sgPSBDb2xvcktleWZyYW1lVHJh
Y2s7CisJZXhwb3J0cy5Cb29sZWFuS2V5ZnJhbWVUcmFjayA9IEJvb2xlYW5LZXlmcmFtZVRyYWNr
OworCWV4cG9ydHMuUHJvcGVydHlNaXhlciA9IFByb3BlcnR5TWl4ZXI7CisJZXhwb3J0cy5Qcm9w
ZXJ0eUJpbmRpbmcgPSBQcm9wZXJ0eUJpbmRpbmc7CisJZXhwb3J0cy5LZXlmcmFtZVRyYWNrID0g
S2V5ZnJhbWVUcmFjazsKKwlleHBvcnRzLkFuaW1hdGlvblV0aWxzID0gQW5pbWF0aW9uVXRpbHM7
CisJZXhwb3J0cy5BbmltYXRpb25PYmplY3RHcm91cCA9IEFuaW1hdGlvbk9iamVjdEdyb3VwOwor
CWV4cG9ydHMuQW5pbWF0aW9uTWl4ZXIgPSBBbmltYXRpb25NaXhlcjsKKwlleHBvcnRzLkFuaW1h
dGlvbkNsaXAgPSBBbmltYXRpb25DbGlwOworCWV4cG9ydHMuVW5pZm9ybSA9IFVuaWZvcm07CisJ
ZXhwb3J0cy5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA9IEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5
OworCWV4cG9ydHMuQnVmZmVyR2VvbWV0cnkgPSBCdWZmZXJHZW9tZXRyeTsKKwlleHBvcnRzLkdl
b21ldHJ5SWRDb3VudCA9IEdlb21ldHJ5SWRDb3VudDsKKwlleHBvcnRzLkdlb21ldHJ5ID0gR2Vv
bWV0cnk7CisJZXhwb3J0cy5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSA9IEludGVybGVhdmVk
QnVmZmVyQXR0cmlidXRlOworCWV4cG9ydHMuSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgPSBJ
bnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjsKKwlleHBvcnRzLkludGVybGVhdmVkQnVmZmVyID0g
SW50ZXJsZWF2ZWRCdWZmZXI7CisJZXhwb3J0cy5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPSBJ
bnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU7CisJZXhwb3J0cy5GYWNlMyA9IEZhY2UzOworCWV4cG9y
dHMuT2JqZWN0M0QgPSBPYmplY3QzRDsKKwlleHBvcnRzLlJheWNhc3RlciA9IFJheWNhc3RlcjsK
KwlleHBvcnRzLkxheWVycyA9IExheWVyczsKKwlleHBvcnRzLkV2ZW50RGlzcGF0Y2hlciA9IEV2
ZW50RGlzcGF0Y2hlcjsKKwlleHBvcnRzLkNsb2NrID0gQ2xvY2s7CisJZXhwb3J0cy5RdWF0ZXJu
aW9uTGluZWFySW50ZXJwb2xhbnQgPSBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQ7CisJZXhw
b3J0cy5MaW5lYXJJbnRlcnBvbGFudCA9IExpbmVhckludGVycG9sYW50OworCWV4cG9ydHMuRGlz
Y3JldGVJbnRlcnBvbGFudCA9IERpc2NyZXRlSW50ZXJwb2xhbnQ7CisJZXhwb3J0cy5DdWJpY0lu
dGVycG9sYW50ID0gQ3ViaWNJbnRlcnBvbGFudDsKKwlleHBvcnRzLkludGVycG9sYW50ID0gSW50
ZXJwb2xhbnQ7CisJZXhwb3J0cy5UcmlhbmdsZSA9IFRyaWFuZ2xlOworCWV4cG9ydHMuTWF0aCA9
IF9NYXRoOworCWV4cG9ydHMuU3BoZXJpY2FsID0gU3BoZXJpY2FsOworCWV4cG9ydHMuQ3lsaW5k
cmljYWwgPSBDeWxpbmRyaWNhbDsKKwlleHBvcnRzLlBsYW5lID0gUGxhbmU7CisJZXhwb3J0cy5G
cnVzdHVtID0gRnJ1c3R1bTsKKwlleHBvcnRzLlNwaGVyZSA9IFNwaGVyZTsKKwlleHBvcnRzLlJh
eSA9IFJheTsKKwlleHBvcnRzLk1hdHJpeDQgPSBNYXRyaXg0OworCWV4cG9ydHMuTWF0cml4MyA9
IE1hdHJpeDM7CisJZXhwb3J0cy5Cb3gzID0gQm94MzsKKwlleHBvcnRzLkJveDIgPSBCb3gyOwor
CWV4cG9ydHMuTGluZTMgPSBMaW5lMzsKKwlleHBvcnRzLkV1bGVyID0gRXVsZXI7CisJZXhwb3J0
cy5WZWN0b3I0ID0gVmVjdG9yNDsKKwlleHBvcnRzLlZlY3RvcjMgPSBWZWN0b3IzOworCWV4cG9y
dHMuVmVjdG9yMiA9IFZlY3RvcjI7CisJZXhwb3J0cy5RdWF0ZXJuaW9uID0gUXVhdGVybmlvbjsK
KwlleHBvcnRzLkNvbG9yID0gQ29sb3I7CisJZXhwb3J0cy5Nb3JwaEJsZW5kTWVzaCA9IE1vcnBo
QmxlbmRNZXNoOworCWV4cG9ydHMuSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gSW1tZWRpYXRlUmVu
ZGVyT2JqZWN0OworCWV4cG9ydHMuVmVydGV4Tm9ybWFsc0hlbHBlciA9IFZlcnRleE5vcm1hbHNI
ZWxwZXI7CisJZXhwb3J0cy5TcG90TGlnaHRIZWxwZXIgPSBTcG90TGlnaHRIZWxwZXI7CisJZXhw
b3J0cy5Ta2VsZXRvbkhlbHBlciA9IFNrZWxldG9uSGVscGVyOworCWV4cG9ydHMuUG9pbnRMaWdo
dEhlbHBlciA9IFBvaW50TGlnaHRIZWxwZXI7CisJZXhwb3J0cy5SZWN0QXJlYUxpZ2h0SGVscGVy
ID0gUmVjdEFyZWFMaWdodEhlbHBlcjsKKwlleHBvcnRzLkhlbWlzcGhlcmVMaWdodEhlbHBlciA9
IEhlbWlzcGhlcmVMaWdodEhlbHBlcjsKKwlleHBvcnRzLkdyaWRIZWxwZXIgPSBHcmlkSGVscGVy
OworCWV4cG9ydHMuUG9sYXJHcmlkSGVscGVyID0gUG9sYXJHcmlkSGVscGVyOworCWV4cG9ydHMu
RmFjZU5vcm1hbHNIZWxwZXIgPSBGYWNlTm9ybWFsc0hlbHBlcjsKKwlleHBvcnRzLkRpcmVjdGlv
bmFsTGlnaHRIZWxwZXIgPSBEaXJlY3Rpb25hbExpZ2h0SGVscGVyOworCWV4cG9ydHMuQ2FtZXJh
SGVscGVyID0gQ2FtZXJhSGVscGVyOworCWV4cG9ydHMuQm94SGVscGVyID0gQm94SGVscGVyOwor
CWV4cG9ydHMuQXJyb3dIZWxwZXIgPSBBcnJvd0hlbHBlcjsKKwlleHBvcnRzLkF4aXNIZWxwZXIg
PSBBeGlzSGVscGVyOworCWV4cG9ydHMuQ2F0bXVsbFJvbUN1cnZlMyA9IENhdG11bGxSb21DdXJ2
ZTM7CisJZXhwb3J0cy5DdWJpY0JlemllckN1cnZlMyA9IEN1YmljQmV6aWVyQ3VydmUzOworCWV4
cG9ydHMuUXVhZHJhdGljQmV6aWVyQ3VydmUzID0gUXVhZHJhdGljQmV6aWVyQ3VydmUzOworCWV4
cG9ydHMuTGluZUN1cnZlMyA9IExpbmVDdXJ2ZTM7CisJZXhwb3J0cy5BcmNDdXJ2ZSA9IEFyY0N1
cnZlOworCWV4cG9ydHMuRWxsaXBzZUN1cnZlID0gRWxsaXBzZUN1cnZlOworCWV4cG9ydHMuU3Bs
aW5lQ3VydmUgPSBTcGxpbmVDdXJ2ZTsKKwlleHBvcnRzLkN1YmljQmV6aWVyQ3VydmUgPSBDdWJp
Y0JlemllckN1cnZlOworCWV4cG9ydHMuUXVhZHJhdGljQmV6aWVyQ3VydmUgPSBRdWFkcmF0aWNC
ZXppZXJDdXJ2ZTsKKwlleHBvcnRzLkxpbmVDdXJ2ZSA9IExpbmVDdXJ2ZTsKKwlleHBvcnRzLlNo
YXBlID0gU2hhcGU7CisJZXhwb3J0cy5QYXRoID0gUGF0aDsKKwlleHBvcnRzLlNoYXBlUGF0aCA9
IFNoYXBlUGF0aDsKKwlleHBvcnRzLkZvbnQgPSBGb250OworCWV4cG9ydHMuQ3VydmVQYXRoID0g
Q3VydmVQYXRoOworCWV4cG9ydHMuQ3VydmUgPSBDdXJ2ZTsKKwlleHBvcnRzLlNoYXBlVXRpbHMg
PSBTaGFwZVV0aWxzOworCWV4cG9ydHMuU2NlbmVVdGlscyA9IFNjZW5lVXRpbHM7CisJZXhwb3J0
cy5XaXJlZnJhbWVHZW9tZXRyeSA9IFdpcmVmcmFtZUdlb21ldHJ5OworCWV4cG9ydHMuUGFyYW1l
dHJpY0dlb21ldHJ5ID0gUGFyYW1ldHJpY0dlb21ldHJ5OworCWV4cG9ydHMuUGFyYW1ldHJpY0J1
ZmZlckdlb21ldHJ5ID0gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5OworCWV4cG9ydHMuVGV0cmFo
ZWRyb25HZW9tZXRyeSA9IFRldHJhaGVkcm9uR2VvbWV0cnk7CisJZXhwb3J0cy5UZXRyYWhlZHJv
bkJ1ZmZlckdlb21ldHJ5ID0gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTsKKwlleHBvcnRzLk9j
dGFoZWRyb25HZW9tZXRyeSA9IE9jdGFoZWRyb25HZW9tZXRyeTsKKwlleHBvcnRzLk9jdGFoZWRy
b25CdWZmZXJHZW9tZXRyeSA9IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTsKKwlleHBvcnRzLklj
b3NhaGVkcm9uR2VvbWV0cnkgPSBJY29zYWhlZHJvbkdlb21ldHJ5OworCWV4cG9ydHMuSWNvc2Fo
ZWRyb25CdWZmZXJHZW9tZXRyeSA9IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk7CisJZXhwb3J0
cy5Eb2RlY2FoZWRyb25HZW9tZXRyeSA9IERvZGVjYWhlZHJvbkdlb21ldHJ5OworCWV4cG9ydHMu
RG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkgPSBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTsK
KwlleHBvcnRzLlBvbHloZWRyb25HZW9tZXRyeSA9IFBvbHloZWRyb25HZW9tZXRyeTsKKwlleHBv
cnRzLlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSA9IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTsK
KwlleHBvcnRzLlR1YmVHZW9tZXRyeSA9IFR1YmVHZW9tZXRyeTsKKwlleHBvcnRzLlR1YmVCdWZm
ZXJHZW9tZXRyeSA9IFR1YmVCdWZmZXJHZW9tZXRyeTsKKwlleHBvcnRzLlRvcnVzS25vdEdlb21l
dHJ5ID0gVG9ydXNLbm90R2VvbWV0cnk7CisJZXhwb3J0cy5Ub3J1c0tub3RCdWZmZXJHZW9tZXRy
eSA9IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OworCWV4cG9ydHMuVG9ydXNHZW9tZXRyeSA9IFRv
cnVzR2VvbWV0cnk7CisJZXhwb3J0cy5Ub3J1c0J1ZmZlckdlb21ldHJ5ID0gVG9ydXNCdWZmZXJH
ZW9tZXRyeTsKKwlleHBvcnRzLlRleHRHZW9tZXRyeSA9IFRleHRHZW9tZXRyeTsKKwlleHBvcnRz
LlRleHRCdWZmZXJHZW9tZXRyeSA9IFRleHRCdWZmZXJHZW9tZXRyeTsKKwlleHBvcnRzLlNwaGVy
ZUdlb21ldHJ5ID0gU3BoZXJlR2VvbWV0cnk7CisJZXhwb3J0cy5TcGhlcmVCdWZmZXJHZW9tZXRy
eSA9IFNwaGVyZUJ1ZmZlckdlb21ldHJ5OworCWV4cG9ydHMuUmluZ0dlb21ldHJ5ID0gUmluZ0dl
b21ldHJ5OworCWV4cG9ydHMuUmluZ0J1ZmZlckdlb21ldHJ5ID0gUmluZ0J1ZmZlckdlb21ldHJ5
OworCWV4cG9ydHMuUGxhbmVHZW9tZXRyeSA9IFBsYW5lR2VvbWV0cnk7CisJZXhwb3J0cy5QbGFu
ZUJ1ZmZlckdlb21ldHJ5ID0gUGxhbmVCdWZmZXJHZW9tZXRyeTsKKwlleHBvcnRzLkxhdGhlR2Vv
bWV0cnkgPSBMYXRoZUdlb21ldHJ5OworCWV4cG9ydHMuTGF0aGVCdWZmZXJHZW9tZXRyeSA9IExh
dGhlQnVmZmVyR2VvbWV0cnk7CisJZXhwb3J0cy5TaGFwZUdlb21ldHJ5ID0gU2hhcGVHZW9tZXRy
eTsKKwlleHBvcnRzLlNoYXBlQnVmZmVyR2VvbWV0cnkgPSBTaGFwZUJ1ZmZlckdlb21ldHJ5Owor
CWV4cG9ydHMuRXh0cnVkZUdlb21ldHJ5ID0gRXh0cnVkZUdlb21ldHJ5OworCWV4cG9ydHMuRXh0
cnVkZUJ1ZmZlckdlb21ldHJ5ID0gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OworCWV4cG9ydHMuRWRn
ZXNHZW9tZXRyeSA9IEVkZ2VzR2VvbWV0cnk7CisJZXhwb3J0cy5Db25lR2VvbWV0cnkgPSBDb25l
R2VvbWV0cnk7CisJZXhwb3J0cy5Db25lQnVmZmVyR2VvbWV0cnkgPSBDb25lQnVmZmVyR2VvbWV0
cnk7CisJZXhwb3J0cy5DeWxpbmRlckdlb21ldHJ5ID0gQ3lsaW5kZXJHZW9tZXRyeTsKKwlleHBv
cnRzLkN5bGluZGVyQnVmZmVyR2VvbWV0cnkgPSBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OworCWV4
cG9ydHMuQ2lyY2xlR2VvbWV0cnkgPSBDaXJjbGVHZW9tZXRyeTsKKwlleHBvcnRzLkNpcmNsZUJ1
ZmZlckdlb21ldHJ5ID0gQ2lyY2xlQnVmZmVyR2VvbWV0cnk7CisJZXhwb3J0cy5Cb3hHZW9tZXRy
eSA9IEJveEdlb21ldHJ5OworCWV4cG9ydHMuQm94QnVmZmVyR2VvbWV0cnkgPSBCb3hCdWZmZXJH
ZW9tZXRyeTsKKwlleHBvcnRzLlNoYWRvd01hdGVyaWFsID0gU2hhZG93TWF0ZXJpYWw7CisJZXhw
b3J0cy5TcHJpdGVNYXRlcmlhbCA9IFNwcml0ZU1hdGVyaWFsOworCWV4cG9ydHMuUmF3U2hhZGVy
TWF0ZXJpYWwgPSBSYXdTaGFkZXJNYXRlcmlhbDsKKwlleHBvcnRzLlNoYWRlck1hdGVyaWFsID0g
U2hhZGVyTWF0ZXJpYWw7CisJZXhwb3J0cy5Qb2ludHNNYXRlcmlhbCA9IFBvaW50c01hdGVyaWFs
OworCWV4cG9ydHMuTWVzaFBoeXNpY2FsTWF0ZXJpYWwgPSBNZXNoUGh5c2ljYWxNYXRlcmlhbDsK
KwlleHBvcnRzLk1lc2hTdGFuZGFyZE1hdGVyaWFsID0gTWVzaFN0YW5kYXJkTWF0ZXJpYWw7CisJ
ZXhwb3J0cy5NZXNoUGhvbmdNYXRlcmlhbCA9IE1lc2hQaG9uZ01hdGVyaWFsOworCWV4cG9ydHMu
TWVzaFRvb25NYXRlcmlhbCA9IE1lc2hUb29uTWF0ZXJpYWw7CisJZXhwb3J0cy5NZXNoTm9ybWFs
TWF0ZXJpYWwgPSBNZXNoTm9ybWFsTWF0ZXJpYWw7CisJZXhwb3J0cy5NZXNoTGFtYmVydE1hdGVy
aWFsID0gTWVzaExhbWJlcnRNYXRlcmlhbDsKKwlleHBvcnRzLk1lc2hEZXB0aE1hdGVyaWFsID0g
TWVzaERlcHRoTWF0ZXJpYWw7CisJZXhwb3J0cy5NZXNoQmFzaWNNYXRlcmlhbCA9IE1lc2hCYXNp
Y01hdGVyaWFsOworCWV4cG9ydHMuTGluZURhc2hlZE1hdGVyaWFsID0gTGluZURhc2hlZE1hdGVy
aWFsOworCWV4cG9ydHMuTGluZUJhc2ljTWF0ZXJpYWwgPSBMaW5lQmFzaWNNYXRlcmlhbDsKKwll
eHBvcnRzLk1hdGVyaWFsID0gTWF0ZXJpYWw7CisJZXhwb3J0cy5GbG9hdDY0QnVmZmVyQXR0cmli
dXRlID0gRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZTsKKwlleHBvcnRzLkZsb2F0MzJCdWZmZXJBdHRy
aWJ1dGUgPSBGbG9hdDMyQnVmZmVyQXR0cmlidXRlOworCWV4cG9ydHMuVWludDMyQnVmZmVyQXR0
cmlidXRlID0gVWludDMyQnVmZmVyQXR0cmlidXRlOworCWV4cG9ydHMuSW50MzJCdWZmZXJBdHRy
aWJ1dGUgPSBJbnQzMkJ1ZmZlckF0dHJpYnV0ZTsKKwlleHBvcnRzLlVpbnQxNkJ1ZmZlckF0dHJp
YnV0ZSA9IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTsKKwlleHBvcnRzLkludDE2QnVmZmVyQXR0cmli
dXRlID0gSW50MTZCdWZmZXJBdHRyaWJ1dGU7CisJZXhwb3J0cy5VaW50OENsYW1wZWRCdWZmZXJB
dHRyaWJ1dGUgPSBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU7CisJZXhwb3J0cy5VaW50OEJ1
ZmZlckF0dHJpYnV0ZSA9IFVpbnQ4QnVmZmVyQXR0cmlidXRlOworCWV4cG9ydHMuSW50OEJ1ZmZl
ckF0dHJpYnV0ZSA9IEludDhCdWZmZXJBdHRyaWJ1dGU7CisJZXhwb3J0cy5CdWZmZXJBdHRyaWJ1
dGUgPSBCdWZmZXJBdHRyaWJ1dGU7CisJZXhwb3J0cy5SRVZJU0lPTiA9IFJFVklTSU9OOworCWV4
cG9ydHMuTU9VU0UgPSBNT1VTRTsKKwlleHBvcnRzLkN1bGxGYWNlTm9uZSA9IEN1bGxGYWNlTm9u
ZTsKKwlleHBvcnRzLkN1bGxGYWNlQmFjayA9IEN1bGxGYWNlQmFjazsKKwlleHBvcnRzLkN1bGxG
YWNlRnJvbnQgPSBDdWxsRmFjZUZyb250OworCWV4cG9ydHMuQ3VsbEZhY2VGcm9udEJhY2sgPSBD
dWxsRmFjZUZyb250QmFjazsKKwlleHBvcnRzLkZyb250RmFjZURpcmVjdGlvbkNXID0gRnJvbnRG
YWNlRGlyZWN0aW9uQ1c7CisJZXhwb3J0cy5Gcm9udEZhY2VEaXJlY3Rpb25DQ1cgPSBGcm9udEZh
Y2VEaXJlY3Rpb25DQ1c7CisJZXhwb3J0cy5CYXNpY1NoYWRvd01hcCA9IEJhc2ljU2hhZG93TWFw
OworCWV4cG9ydHMuUENGU2hhZG93TWFwID0gUENGU2hhZG93TWFwOworCWV4cG9ydHMuUENGU29m
dFNoYWRvd01hcCA9IFBDRlNvZnRTaGFkb3dNYXA7CisJZXhwb3J0cy5Gcm9udFNpZGUgPSBGcm9u
dFNpZGU7CisJZXhwb3J0cy5CYWNrU2lkZSA9IEJhY2tTaWRlOworCWV4cG9ydHMuRG91YmxlU2lk
ZSA9IERvdWJsZVNpZGU7CisJZXhwb3J0cy5GbGF0U2hhZGluZyA9IEZsYXRTaGFkaW5nOworCWV4
cG9ydHMuU21vb3RoU2hhZGluZyA9IFNtb290aFNoYWRpbmc7CisJZXhwb3J0cy5Ob0NvbG9ycyA9
IE5vQ29sb3JzOworCWV4cG9ydHMuRmFjZUNvbG9ycyA9IEZhY2VDb2xvcnM7CisJZXhwb3J0cy5W
ZXJ0ZXhDb2xvcnMgPSBWZXJ0ZXhDb2xvcnM7CisJZXhwb3J0cy5Ob0JsZW5kaW5nID0gTm9CbGVu
ZGluZzsKKwlleHBvcnRzLk5vcm1hbEJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7CisJZXhwb3J0
cy5BZGRpdGl2ZUJsZW5kaW5nID0gQWRkaXRpdmVCbGVuZGluZzsKKwlleHBvcnRzLlN1YnRyYWN0
aXZlQmxlbmRpbmcgPSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOworCWV4cG9ydHMuTXVsdGlwbHlCbGVu
ZGluZyA9IE11bHRpcGx5QmxlbmRpbmc7CisJZXhwb3J0cy5DdXN0b21CbGVuZGluZyA9IEN1c3Rv
bUJsZW5kaW5nOworCWV4cG9ydHMuQWRkRXF1YXRpb24gPSBBZGRFcXVhdGlvbjsKKwlleHBvcnRz
LlN1YnRyYWN0RXF1YXRpb24gPSBTdWJ0cmFjdEVxdWF0aW9uOworCWV4cG9ydHMuUmV2ZXJzZVN1
YnRyYWN0RXF1YXRpb24gPSBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbjsKKwlleHBvcnRzLk1pbkVx
dWF0aW9uID0gTWluRXF1YXRpb247CisJZXhwb3J0cy5NYXhFcXVhdGlvbiA9IE1heEVxdWF0aW9u
OworCWV4cG9ydHMuWmVyb0ZhY3RvciA9IFplcm9GYWN0b3I7CisJZXhwb3J0cy5PbmVGYWN0b3Ig
PSBPbmVGYWN0b3I7CisJZXhwb3J0cy5TcmNDb2xvckZhY3RvciA9IFNyY0NvbG9yRmFjdG9yOwor
CWV4cG9ydHMuT25lTWludXNTcmNDb2xvckZhY3RvciA9IE9uZU1pbnVzU3JjQ29sb3JGYWN0b3I7
CisJZXhwb3J0cy5TcmNBbHBoYUZhY3RvciA9IFNyY0FscGhhRmFjdG9yOworCWV4cG9ydHMuT25l
TWludXNTcmNBbHBoYUZhY3RvciA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7CisJZXhwb3J0cy5E
c3RBbHBoYUZhY3RvciA9IERzdEFscGhhRmFjdG9yOworCWV4cG9ydHMuT25lTWludXNEc3RBbHBo
YUZhY3RvciA9IE9uZU1pbnVzRHN0QWxwaGFGYWN0b3I7CisJZXhwb3J0cy5Ec3RDb2xvckZhY3Rv
ciA9IERzdENvbG9yRmFjdG9yOworCWV4cG9ydHMuT25lTWludXNEc3RDb2xvckZhY3RvciA9IE9u
ZU1pbnVzRHN0Q29sb3JGYWN0b3I7CisJZXhwb3J0cy5TcmNBbHBoYVNhdHVyYXRlRmFjdG9yID0g
U3JjQWxwaGFTYXR1cmF0ZUZhY3RvcjsKKwlleHBvcnRzLk5ldmVyRGVwdGggPSBOZXZlckRlcHRo
OworCWV4cG9ydHMuQWx3YXlzRGVwdGggPSBBbHdheXNEZXB0aDsKKwlleHBvcnRzLkxlc3NEZXB0
aCA9IExlc3NEZXB0aDsKKwlleHBvcnRzLkxlc3NFcXVhbERlcHRoID0gTGVzc0VxdWFsRGVwdGg7
CisJZXhwb3J0cy5FcXVhbERlcHRoID0gRXF1YWxEZXB0aDsKKwlleHBvcnRzLkdyZWF0ZXJFcXVh
bERlcHRoID0gR3JlYXRlckVxdWFsRGVwdGg7CisJZXhwb3J0cy5HcmVhdGVyRGVwdGggPSBHcmVh
dGVyRGVwdGg7CisJZXhwb3J0cy5Ob3RFcXVhbERlcHRoID0gTm90RXF1YWxEZXB0aDsKKwlleHBv
cnRzLk11bHRpcGx5T3BlcmF0aW9uID0gTXVsdGlwbHlPcGVyYXRpb247CisJZXhwb3J0cy5NaXhP
cGVyYXRpb24gPSBNaXhPcGVyYXRpb247CisJZXhwb3J0cy5BZGRPcGVyYXRpb24gPSBBZGRPcGVy
YXRpb247CisJZXhwb3J0cy5Ob1RvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZzsKKwlleHBvcnRz
LkxpbmVhclRvbmVNYXBwaW5nID0gTGluZWFyVG9uZU1hcHBpbmc7CisJZXhwb3J0cy5SZWluaGFy
ZFRvbmVNYXBwaW5nID0gUmVpbmhhcmRUb25lTWFwcGluZzsKKwlleHBvcnRzLlVuY2hhcnRlZDJU
b25lTWFwcGluZyA9IFVuY2hhcnRlZDJUb25lTWFwcGluZzsKKwlleHBvcnRzLkNpbmVvblRvbmVN
YXBwaW5nID0gQ2luZW9uVG9uZU1hcHBpbmc7CisJZXhwb3J0cy5VVk1hcHBpbmcgPSBVVk1hcHBp
bmc7CisJZXhwb3J0cy5DdWJlUmVmbGVjdGlvbk1hcHBpbmcgPSBDdWJlUmVmbGVjdGlvbk1hcHBp
bmc7CisJZXhwb3J0cy5DdWJlUmVmcmFjdGlvbk1hcHBpbmcgPSBDdWJlUmVmcmFjdGlvbk1hcHBp
bmc7CisJZXhwb3J0cy5FcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyA9IEVxdWlyZWN0
YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOworCWV4cG9ydHMuRXF1aXJlY3Rhbmd1bGFyUmVmcmFj
dGlvbk1hcHBpbmcgPSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzsKKwlleHBvcnRz
LlNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nID0gU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc7
CisJZXhwb3J0cy5DdWJlVVZSZWZsZWN0aW9uTWFwcGluZyA9IEN1YmVVVlJlZmxlY3Rpb25NYXBw
aW5nOworCWV4cG9ydHMuQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgPSBDdWJlVVZSZWZyYWN0aW9u
TWFwcGluZzsKKwlleHBvcnRzLlJlcGVhdFdyYXBwaW5nID0gUmVwZWF0V3JhcHBpbmc7CisJZXhw
b3J0cy5DbGFtcFRvRWRnZVdyYXBwaW5nID0gQ2xhbXBUb0VkZ2VXcmFwcGluZzsKKwlleHBvcnRz
Lk1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgPSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOworCWV4cG9y
dHMuTmVhcmVzdEZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7CisJZXhwb3J0cy5OZWFyZXN0TWlwTWFw
TmVhcmVzdEZpbHRlciA9IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyOworCWV4cG9ydHMuTmVh
cmVzdE1pcE1hcExpbmVhckZpbHRlciA9IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI7CisJZXhw
b3J0cy5MaW5lYXJGaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CisJZXhwb3J0cy5MaW5lYXJNaXBNYXBO
ZWFyZXN0RmlsdGVyID0gTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlcjsKKwlleHBvcnRzLkxpbmVh
ck1pcE1hcExpbmVhckZpbHRlciA9IExpbmVhck1pcE1hcExpbmVhckZpbHRlcjsKKwlleHBvcnRz
LlVuc2lnbmVkQnl0ZVR5cGUgPSBVbnNpZ25lZEJ5dGVUeXBlOworCWV4cG9ydHMuQnl0ZVR5cGUg
PSBCeXRlVHlwZTsKKwlleHBvcnRzLlNob3J0VHlwZSA9IFNob3J0VHlwZTsKKwlleHBvcnRzLlVu
c2lnbmVkU2hvcnRUeXBlID0gVW5zaWduZWRTaG9ydFR5cGU7CisJZXhwb3J0cy5JbnRUeXBlID0g
SW50VHlwZTsKKwlleHBvcnRzLlVuc2lnbmVkSW50VHlwZSA9IFVuc2lnbmVkSW50VHlwZTsKKwll
eHBvcnRzLkZsb2F0VHlwZSA9IEZsb2F0VHlwZTsKKwlleHBvcnRzLkhhbGZGbG9hdFR5cGUgPSBI
YWxmRmxvYXRUeXBlOworCWV4cG9ydHMuVW5zaWduZWRTaG9ydDQ0NDRUeXBlID0gVW5zaWduZWRT
aG9ydDQ0NDRUeXBlOworCWV4cG9ydHMuVW5zaWduZWRTaG9ydDU1NTFUeXBlID0gVW5zaWduZWRT
aG9ydDU1NTFUeXBlOworCWV4cG9ydHMuVW5zaWduZWRTaG9ydDU2NVR5cGUgPSBVbnNpZ25lZFNo
b3J0NTY1VHlwZTsKKwlleHBvcnRzLlVuc2lnbmVkSW50MjQ4VHlwZSA9IFVuc2lnbmVkSW50MjQ4
VHlwZTsKKwlleHBvcnRzLkFscGhhRm9ybWF0ID0gQWxwaGFGb3JtYXQ7CisJZXhwb3J0cy5SR0JG
b3JtYXQgPSBSR0JGb3JtYXQ7CisJZXhwb3J0cy5SR0JBRm9ybWF0ID0gUkdCQUZvcm1hdDsKKwll
eHBvcnRzLkx1bWluYW5jZUZvcm1hdCA9IEx1bWluYW5jZUZvcm1hdDsKKwlleHBvcnRzLkx1bWlu
YW5jZUFscGhhRm9ybWF0ID0gTHVtaW5hbmNlQWxwaGFGb3JtYXQ7CisJZXhwb3J0cy5SR0JFRm9y
bWF0ID0gUkdCRUZvcm1hdDsKKwlleHBvcnRzLkRlcHRoRm9ybWF0ID0gRGVwdGhGb3JtYXQ7CisJ
ZXhwb3J0cy5EZXB0aFN0ZW5jaWxGb3JtYXQgPSBEZXB0aFN0ZW5jaWxGb3JtYXQ7CisJZXhwb3J0
cy5SR0JfUzNUQ19EWFQxX0Zvcm1hdCA9IFJHQl9TM1RDX0RYVDFfRm9ybWF0OworCWV4cG9ydHMu
UkdCQV9TM1RDX0RYVDFfRm9ybWF0ID0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0OworCWV4cG9ydHMu
UkdCQV9TM1RDX0RYVDNfRm9ybWF0ID0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0OworCWV4cG9ydHMu
UkdCQV9TM1RDX0RYVDVfRm9ybWF0ID0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0OworCWV4cG9ydHMu
UkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdDsKKwlleHBv
cnRzLlJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQ7CisJ
ZXhwb3J0cy5SR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3Jt
YXQ7CisJZXhwb3J0cy5SR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSBSR0JBX1BWUlRDXzJCUFBW
MV9Gb3JtYXQ7CisJZXhwb3J0cy5SR0JfRVRDMV9Gb3JtYXQgPSBSR0JfRVRDMV9Gb3JtYXQ7CisJ
ZXhwb3J0cy5Mb29wT25jZSA9IExvb3BPbmNlOworCWV4cG9ydHMuTG9vcFJlcGVhdCA9IExvb3BS
ZXBlYXQ7CisJZXhwb3J0cy5Mb29wUGluZ1BvbmcgPSBMb29wUGluZ1Bvbmc7CisJZXhwb3J0cy5J
bnRlcnBvbGF0ZURpc2NyZXRlID0gSW50ZXJwb2xhdGVEaXNjcmV0ZTsKKwlleHBvcnRzLkludGVy
cG9sYXRlTGluZWFyID0gSW50ZXJwb2xhdGVMaW5lYXI7CisJZXhwb3J0cy5JbnRlcnBvbGF0ZVNt
b290aCA9IEludGVycG9sYXRlU21vb3RoOworCWV4cG9ydHMuWmVyb0N1cnZhdHVyZUVuZGluZyA9
IFplcm9DdXJ2YXR1cmVFbmRpbmc7CisJZXhwb3J0cy5aZXJvU2xvcGVFbmRpbmcgPSBaZXJvU2xv
cGVFbmRpbmc7CisJZXhwb3J0cy5XcmFwQXJvdW5kRW5kaW5nID0gV3JhcEFyb3VuZEVuZGluZzsK
KwlleHBvcnRzLlRyaWFuZ2xlc0RyYXdNb2RlID0gVHJpYW5nbGVzRHJhd01vZGU7CisJZXhwb3J0
cy5UcmlhbmdsZVN0cmlwRHJhd01vZGUgPSBUcmlhbmdsZVN0cmlwRHJhd01vZGU7CisJZXhwb3J0
cy5UcmlhbmdsZUZhbkRyYXdNb2RlID0gVHJpYW5nbGVGYW5EcmF3TW9kZTsKKwlleHBvcnRzLkxp
bmVhckVuY29kaW5nID0gTGluZWFyRW5jb2Rpbmc7CisJZXhwb3J0cy5zUkdCRW5jb2RpbmcgPSBz
UkdCRW5jb2Rpbmc7CisJZXhwb3J0cy5HYW1tYUVuY29kaW5nID0gR2FtbWFFbmNvZGluZzsKKwll
eHBvcnRzLlJHQkVFbmNvZGluZyA9IFJHQkVFbmNvZGluZzsKKwlleHBvcnRzLkxvZ0x1dkVuY29k
aW5nID0gTG9nTHV2RW5jb2Rpbmc7CisJZXhwb3J0cy5SR0JNN0VuY29kaW5nID0gUkdCTTdFbmNv
ZGluZzsKKwlleHBvcnRzLlJHQk0xNkVuY29kaW5nID0gUkdCTTE2RW5jb2Rpbmc7CisJZXhwb3J0
cy5SR0JERW5jb2RpbmcgPSBSR0JERW5jb2Rpbmc7CisJZXhwb3J0cy5CYXNpY0RlcHRoUGFja2lu
ZyA9IEJhc2ljRGVwdGhQYWNraW5nOworCWV4cG9ydHMuUkdCQURlcHRoUGFja2luZyA9IFJHQkFE
ZXB0aFBhY2tpbmc7CisJZXhwb3J0cy5DdWJlR2VvbWV0cnkgPSBCb3hHZW9tZXRyeTsKKwlleHBv
cnRzLkZhY2U0ID0gRmFjZTQ7CisJZXhwb3J0cy5MaW5lU3RyaXAgPSBMaW5lU3RyaXA7CisJZXhw
b3J0cy5MaW5lUGllY2VzID0gTGluZVBpZWNlczsKKwlleHBvcnRzLk1lc2hGYWNlTWF0ZXJpYWwg
PSBNZXNoRmFjZU1hdGVyaWFsOworCWV4cG9ydHMuTXVsdGlNYXRlcmlhbCA9IE11bHRpTWF0ZXJp
YWw7CisJZXhwb3J0cy5Qb2ludENsb3VkID0gUG9pbnRDbG91ZDsKKwlleHBvcnRzLlBhcnRpY2xl
ID0gUGFydGljbGU7CisJZXhwb3J0cy5QYXJ0aWNsZVN5c3RlbSA9IFBhcnRpY2xlU3lzdGVtOwor
CWV4cG9ydHMuUG9pbnRDbG91ZE1hdGVyaWFsID0gUG9pbnRDbG91ZE1hdGVyaWFsOworCWV4cG9y
dHMuUGFydGljbGVCYXNpY01hdGVyaWFsID0gUGFydGljbGVCYXNpY01hdGVyaWFsOworCWV4cG9y
dHMuUGFydGljbGVTeXN0ZW1NYXRlcmlhbCA9IFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWw7CisJZXhw
b3J0cy5WZXJ0ZXggPSBWZXJ0ZXg7CisJZXhwb3J0cy5EeW5hbWljQnVmZmVyQXR0cmlidXRlID0g
RHluYW1pY0J1ZmZlckF0dHJpYnV0ZTsKKwlleHBvcnRzLkludDhBdHRyaWJ1dGUgPSBJbnQ4QXR0
cmlidXRlOworCWV4cG9ydHMuVWludDhBdHRyaWJ1dGUgPSBVaW50OEF0dHJpYnV0ZTsKKwlleHBv
cnRzLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSA9IFVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZTsKKwlleHBv
cnRzLkludDE2QXR0cmlidXRlID0gSW50MTZBdHRyaWJ1dGU7CisJZXhwb3J0cy5VaW50MTZBdHRy
aWJ1dGUgPSBVaW50MTZBdHRyaWJ1dGU7CisJZXhwb3J0cy5JbnQzMkF0dHJpYnV0ZSA9IEludDMy
QXR0cmlidXRlOworCWV4cG9ydHMuVWludDMyQXR0cmlidXRlID0gVWludDMyQXR0cmlidXRlOwor
CWV4cG9ydHMuRmxvYXQzMkF0dHJpYnV0ZSA9IEZsb2F0MzJBdHRyaWJ1dGU7CisJZXhwb3J0cy5G
bG9hdDY0QXR0cmlidXRlID0gRmxvYXQ2NEF0dHJpYnV0ZTsKKwlleHBvcnRzLkNsb3NlZFNwbGlu
ZUN1cnZlMyA9IENsb3NlZFNwbGluZUN1cnZlMzsKKwlleHBvcnRzLlNwbGluZUN1cnZlMyA9IFNw
bGluZUN1cnZlMzsKKwlleHBvcnRzLlNwbGluZSA9IFNwbGluZTsKKwlleHBvcnRzLkJvdW5kaW5n
Qm94SGVscGVyID0gQm91bmRpbmdCb3hIZWxwZXI7CisJZXhwb3J0cy5FZGdlc0hlbHBlciA9IEVk
Z2VzSGVscGVyOworCWV4cG9ydHMuV2lyZWZyYW1lSGVscGVyID0gV2lyZWZyYW1lSGVscGVyOwor
CWV4cG9ydHMuWEhSTG9hZGVyID0gWEhSTG9hZGVyOworCWV4cG9ydHMuQmluYXJ5VGV4dHVyZUxv
YWRlciA9IEJpbmFyeVRleHR1cmVMb2FkZXI7CisJZXhwb3J0cy5HZW9tZXRyeVV0aWxzID0gR2Vv
bWV0cnlVdGlsczsKKwlleHBvcnRzLkltYWdlVXRpbHMgPSBJbWFnZVV0aWxzOworCWV4cG9ydHMu
UHJvamVjdG9yID0gUHJvamVjdG9yOworCWV4cG9ydHMuQ2FudmFzUmVuZGVyZXIgPSBDYW52YXNS
ZW5kZXJlcjsKKworCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScs
IHsgdmFsdWU6IHRydWUgfSk7CisKK30pKSk7Cg==
</data>
<flag name="review"
          id="338349"
          type_id="1"
          status="+"
          setter="bburg"
    />
    <flag name="commit-queue"
          id="338371"
          type_id="3"
          status="-"
          setter="commit-queue"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>317901</attachid>
            <date>2017-08-10 19:21:28 -0700</date>
            <delta_ts>2017-08-10 20:07:09 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>three.patch</filename>
            <type>text/plain</type>
            <size>1366078</size>
            <attacher name="Ross Kirsling">ross.kirsling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2Vi
SW5zcGVjdG9yVUkvQ2hhbmdlTG9nCmluZGV4IDExNjRhOTAyZmVmLi41OTMwMmI4YWZiYyAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkluc3BlY3RvclVJL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2Vi
SW5zcGVjdG9yVUkvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTctMDgtMTAgIFJvc3Mg
S2lyc2xpbmcgIDxyb3NzLmtpcnNsaW5nQHNvbnkuY29tPgorCisgICAgICAgIFdlYiBJbnNwZWN0
b3I6IEFkZCB0aHJlZS5qcyBpbiBwcmVwYXJhdGlvbiBmb3IgbGF5ZXIgdmlzdWFsaXphdGlvbi4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3NDc5OAor
CisgICAgICAgIFJldmlld2VkIGJ5IEJyaWFuIEJ1cmcuCisKKyAgICAgICAgKiBVc2VySW50ZXJm
YWNlL0V4dGVybmFsL3RocmVlLmpzL0xJQ0VOU0U6IEFkZGVkLgorICAgICAgICAqIFVzZXJJbnRl
cmZhY2UvRXh0ZXJuYWwvdGhyZWUuanMvT3JiaXRDb250cm9scy5qczogQWRkZWQuCisgICAgICAg
ICogVXNlckludGVyZmFjZS9FeHRlcm5hbC90aHJlZS5qcy90aHJlZS5qczogQWRkZWQuCisKIDIw
MTctMDgtMDkgIE5pa2l0YSBWYXNpbHlldiAgPG52YXNpbHlldkBhcHBsZS5jb20+CiAKICAgICAg
ICAgV2ViIEluc3BlY3RvcjogU3R5bGVzOiBBZGQgcHJlLXBvcHVsYXRlZCBkYXRhIHRvIHNwcmVh
ZHNoZWV0LXN0eWxlIHZpZXcKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2Vy
SW50ZXJmYWNlL0V4dGVybmFsL3RocmVlLmpzL0xJQ0VOU0UgYi9Tb3VyY2UvV2ViSW5zcGVjdG9y
VUkvVXNlckludGVyZmFjZS9FeHRlcm5hbC90aHJlZS5qcy9MSUNFTlNFCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi41NjA0OTAxNDBlYgotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0V4dGVybmFsL3RocmVlLmpzL0xJ
Q0VOU0UKQEAgLTAsMCArMSwyMSBAQAorVGhlIE1JVCBMaWNlbnNlCisKK0NvcHlyaWdodCDCqSAy
MDEwLTIwMTcgdGhyZWUuanMgYXV0aG9ycworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVk
LCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlz
IHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdh
cmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1
ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnks
IG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29w
aWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNv
ZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNz
aW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlh
bCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAi
QVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVE
LCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5H
RU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVS
UyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBX
SEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJ
TkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRI
RSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0V4dGVybmFsL3RocmVlLmpzL09yYml0
Q29udHJvbHMuanMgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9FeHRlcm5h
bC90aHJlZS5qcy9PcmJpdENvbnRyb2xzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwLi5kZTc2MTg4NmNlNQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJJbnNw
ZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0V4dGVybmFsL3RocmVlLmpzL09yYml0Q29udHJvbHMuanMK
QEAgLTAsMCArMSwxMDQyIEBACisvKioKKyAqIEBhdXRob3IgcWlhbyAvIGh0dHBzOi8vZ2l0aHVi
LmNvbS9xaWFvCisgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tCisgKiBAYXV0
aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworICogQGF1dGhvciBXZXN0
TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisgKiBAYXV0aG9yIGVyaWNo
NjY2IC8gaHR0cDovL2VyaWNoYWluZXMuY29tCisgKi8KKworLy8gVGhpcyBzZXQgb2YgY29udHJv
bHMgcGVyZm9ybXMgb3JiaXRpbmcsIGRvbGx5aW5nICh6b29taW5nKSwgYW5kIHBhbm5pbmcuCisv
LyBVbmxpa2UgVHJhY2tiYWxsQ29udHJvbHMsIGl0IG1haW50YWlucyB0aGUgInVwIiBkaXJlY3Rp
b24gb2JqZWN0LnVwICgrWSBieSBkZWZhdWx0KS4KKy8vCisvLyAgICBPcmJpdCAtIGxlZnQgbW91
c2UgLyB0b3VjaDogb25lIGZpbmdlciBtb3ZlCisvLyAgICBab29tIC0gbWlkZGxlIG1vdXNlLCBv
ciBtb3VzZXdoZWVsIC8gdG91Y2g6IHR3byBmaW5nZXIgc3ByZWFkIG9yIHNxdWlzaAorLy8gICAg
UGFuIC0gcmlnaHQgbW91c2UsIG9yIGFycm93IGtleXMgLyB0b3VjaDogdGhyZWUgZmluZ2VyIHN3
aXBlCisKK1RIUkVFLk9yYml0Q29udHJvbHMgPSBmdW5jdGlvbiAoIG9iamVjdCwgZG9tRWxlbWVu
dCApIHsKKworICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OworCisgICAgdGhpcy5kb21FbGVtZW50
ID0gKCBkb21FbGVtZW50ICE9PSB1bmRlZmluZWQgKSA/IGRvbUVsZW1lbnQgOiBkb2N1bWVudDsK
KworICAgIC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoaXMgY29udHJvbAorICAgIHRoaXMu
ZW5hYmxlZCA9IHRydWU7CisKKyAgICAvLyAidGFyZ2V0IiBzZXRzIHRoZSBsb2NhdGlvbiBvZiBm
b2N1cywgd2hlcmUgdGhlIG9iamVjdCBvcmJpdHMgYXJvdW5kCisgICAgdGhpcy50YXJnZXQgPSBu
ZXcgVEhSRUUuVmVjdG9yMygpOworCisgICAgLy8gSG93IGZhciB5b3UgY2FuIGRvbGx5IGluIGFu
ZCBvdXQgKCBQZXJzcGVjdGl2ZUNhbWVyYSBvbmx5ICkKKyAgICB0aGlzLm1pbkRpc3RhbmNlID0g
MDsKKyAgICB0aGlzLm1heERpc3RhbmNlID0gSW5maW5pdHk7CisKKyAgICAvLyBIb3cgZmFyIHlv
dSBjYW4gem9vbSBpbiBhbmQgb3V0ICggT3J0aG9ncmFwaGljQ2FtZXJhIG9ubHkgKQorICAgIHRo
aXMubWluWm9vbSA9IDA7CisgICAgdGhpcy5tYXhab29tID0gSW5maW5pdHk7CisKKyAgICAvLyBI
b3cgZmFyIHlvdSBjYW4gb3JiaXQgdmVydGljYWxseSwgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy4K
KyAgICAvLyBSYW5nZSBpcyAwIHRvIE1hdGguUEkgcmFkaWFucy4KKyAgICB0aGlzLm1pblBvbGFy
QW5nbGUgPSAwOyAvLyByYWRpYW5zCisgICAgdGhpcy5tYXhQb2xhckFuZ2xlID0gTWF0aC5QSTsg
Ly8gcmFkaWFucworCisgICAgLy8gSG93IGZhciB5b3UgY2FuIG9yYml0IGhvcml6b250YWxseSwg
dXBwZXIgYW5kIGxvd2VyIGxpbWl0cy4KKyAgICAvLyBJZiBzZXQsIG11c3QgYmUgYSBzdWItaW50
ZXJ2YWwgb2YgdGhlIGludGVydmFsIFsgLSBNYXRoLlBJLCBNYXRoLlBJIF0uCisgICAgdGhpcy5t
aW5BemltdXRoQW5nbGUgPSAtIEluZmluaXR5OyAvLyByYWRpYW5zCisgICAgdGhpcy5tYXhBemlt
dXRoQW5nbGUgPSBJbmZpbml0eTsgLy8gcmFkaWFucworCisgICAgLy8gU2V0IHRvIHRydWUgdG8g
ZW5hYmxlIGRhbXBpbmcgKGluZXJ0aWEpCisgICAgLy8gSWYgZGFtcGluZyBpcyBlbmFibGVkLCB5
b3UgbXVzdCBjYWxsIGNvbnRyb2xzLnVwZGF0ZSgpIGluIHlvdXIgYW5pbWF0aW9uIGxvb3AKKyAg
ICB0aGlzLmVuYWJsZURhbXBpbmcgPSBmYWxzZTsKKyAgICB0aGlzLmRhbXBpbmdGYWN0b3IgPSAw
LjI1OworCisgICAgLy8gVGhpcyBvcHRpb24gYWN0dWFsbHkgZW5hYmxlcyBkb2xseWluZyBpbiBh
bmQgb3V0OyBsZWZ0IGFzICJ6b29tIiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAg
Ly8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgem9vbWluZworICAgIHRoaXMuZW5hYmxlWm9vbSA9
IHRydWU7CisgICAgdGhpcy56b29tU3BlZWQgPSAxLjA7CisKKyAgICAvLyBTZXQgdG8gZmFsc2Ug
dG8gZGlzYWJsZSByb3RhdGluZworICAgIHRoaXMuZW5hYmxlUm90YXRlID0gdHJ1ZTsKKyAgICB0
aGlzLnJvdGF0ZVNwZWVkID0gMS4wOworCisgICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUg
cGFubmluZworICAgIHRoaXMuZW5hYmxlUGFuID0gdHJ1ZTsKKyAgICB0aGlzLmtleVBhblNwZWVk
ID0gNy4wOyAvLyBwaXhlbHMgbW92ZWQgcGVyIGFycm93IGtleSBwdXNoCisKKyAgICAvLyBTZXQg
dG8gdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IHJvdGF0ZSBhcm91bmQgdGhlIHRhcmdldAorICAgIC8v
IElmIGF1dG8tcm90YXRlIGlzIGVuYWJsZWQsIHlvdSBtdXN0IGNhbGwgY29udHJvbHMudXBkYXRl
KCkgaW4geW91ciBhbmltYXRpb24gbG9vcAorICAgIHRoaXMuYXV0b1JvdGF0ZSA9IGZhbHNlOwor
ICAgIHRoaXMuYXV0b1JvdGF0ZVNwZWVkID0gMi4wOyAvLyAzMCBzZWNvbmRzIHBlciByb3VuZCB3
aGVuIGZwcyBpcyA2MAorCisgICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgdXNlIG9mIHRo
ZSBrZXlzCisgICAgdGhpcy5lbmFibGVLZXlzID0gdHJ1ZTsKKworICAgIC8vIFRoZSBmb3VyIGFy
cm93IGtleXMKKyAgICB0aGlzLmtleXMgPSB7IExFRlQ6IDM3LCBVUDogMzgsIFJJR0hUOiAzOSwg
Qk9UVE9NOiA0MCB9OworCisgICAgLy8gTW91c2UgYnV0dG9ucworICAgIHRoaXMubW91c2VCdXR0
b25zID0geyBPUkJJVDogVEhSRUUuTU9VU0UuTEVGVCwgWk9PTTogVEhSRUUuTU9VU0UuTUlERExF
LCBQQU46IFRIUkVFLk1PVVNFLlJJR0hUIH07CisKKyAgICAvLyBmb3IgcmVzZXQKKyAgICB0aGlz
LnRhcmdldDAgPSB0aGlzLnRhcmdldC5jbG9uZSgpOworICAgIHRoaXMucG9zaXRpb24wID0gdGhp
cy5vYmplY3QucG9zaXRpb24uY2xvbmUoKTsKKyAgICB0aGlzLnpvb20wID0gdGhpcy5vYmplY3Qu
em9vbTsKKworICAgIC8vCisgICAgLy8gcHVibGljIG1ldGhvZHMKKyAgICAvLworCisgICAgdGhp
cy5nZXRQb2xhckFuZ2xlID0gZnVuY3Rpb24gKCkgeworCisgICAgICAgIHJldHVybiBzcGhlcmlj
YWwucGhpOworCisgICAgfTsKKworICAgIHRoaXMuZ2V0QXppbXV0aGFsQW5nbGUgPSBmdW5jdGlv
biAoKSB7CisKKyAgICAgICAgcmV0dXJuIHNwaGVyaWNhbC50aGV0YTsKKworICAgIH07CisKKyAg
ICB0aGlzLnNhdmVTdGF0ZSA9IGZ1bmN0aW9uICgpIHsKKworICAgICAgICBzY29wZS50YXJnZXQw
LmNvcHkoIHNjb3BlLnRhcmdldCApOworICAgICAgICBzY29wZS5wb3NpdGlvbjAuY29weSggc2Nv
cGUub2JqZWN0LnBvc2l0aW9uICk7CisgICAgICAgIHNjb3BlLnpvb20wID0gc2NvcGUub2JqZWN0
Lnpvb207CisKKyAgICB9OworCisgICAgdGhpcy5yZXNldCA9IGZ1bmN0aW9uICgpIHsKKworICAg
ICAgICBzY29wZS50YXJnZXQuY29weSggc2NvcGUudGFyZ2V0MCApOworICAgICAgICBzY29wZS5v
YmplY3QucG9zaXRpb24uY29weSggc2NvcGUucG9zaXRpb24wICk7CisgICAgICAgIHNjb3BlLm9i
amVjdC56b29tID0gc2NvcGUuem9vbTA7CisKKyAgICAgICAgc2NvcGUub2JqZWN0LnVwZGF0ZVBy
b2plY3Rpb25NYXRyaXgoKTsKKyAgICAgICAgc2NvcGUuZGlzcGF0Y2hFdmVudCggY2hhbmdlRXZl
bnQgKTsKKworICAgICAgICBzY29wZS51cGRhdGUoKTsKKworICAgICAgICBzdGF0ZSA9IFNUQVRF
Lk5PTkU7CisKKyAgICB9OworCisgICAgLy8gdGhpcyBtZXRob2QgaXMgZXhwb3NlZCwgYnV0IHBl
cmhhcHMgaXQgd291bGQgYmUgYmV0dGVyIGlmIHdlIGNhbiBtYWtlIGl0IHByaXZhdGUuLi4KKyAg
ICB0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKKworICAgICAgICB2YXIgb2Zmc2V0ID0gbmV3
IFRIUkVFLlZlY3RvcjMoKTsKKworICAgICAgICAvLyBzbyBjYW1lcmEudXAgaXMgdGhlIG9yYml0
IGF4aXMKKyAgICAgICAgdmFyIHF1YXQgPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpLnNldEZyb21V
bml0VmVjdG9ycyggb2JqZWN0LnVwLCBuZXcgVEhSRUUuVmVjdG9yMyggMCwgMSwgMCApICk7Cisg
ICAgICAgIHZhciBxdWF0SW52ZXJzZSA9IHF1YXQuY2xvbmUoKS5pbnZlcnNlKCk7CisKKyAgICAg
ICAgdmFyIGxhc3RQb3NpdGlvbiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7CisgICAgICAgIHZhciBs
YXN0UXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7CisKKyAgICAgICAgcmV0dXJu
IGZ1bmN0aW9uIHVwZGF0ZSgpIHsKKworICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gc2NvcGUu
b2JqZWN0LnBvc2l0aW9uOworCisgICAgICAgICAgICBvZmZzZXQuY29weSggcG9zaXRpb24gKS5z
dWIoIHNjb3BlLnRhcmdldCApOworCisgICAgICAgICAgICAvLyByb3RhdGUgb2Zmc2V0IHRvICJ5
LWF4aXMtaXMtdXAiIHNwYWNlCisgICAgICAgICAgICBvZmZzZXQuYXBwbHlRdWF0ZXJuaW9uKCBx
dWF0ICk7CisKKyAgICAgICAgICAgIC8vIGFuZ2xlIGZyb20gei1heGlzIGFyb3VuZCB5LWF4aXMK
KyAgICAgICAgICAgIHNwaGVyaWNhbC5zZXRGcm9tVmVjdG9yMyggb2Zmc2V0ICk7CisKKyAgICAg
ICAgICAgIGlmICggc2NvcGUuYXV0b1JvdGF0ZSAmJiBzdGF0ZSA9PT0gU1RBVEUuTk9ORSApIHsK
KworICAgICAgICAgICAgICAgIHJvdGF0ZUxlZnQoIGdldEF1dG9Sb3RhdGlvbkFuZ2xlKCkgKTsK
KworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcGhlcmljYWwudGhldGEgKz0gc3BoZXJp
Y2FsRGVsdGEudGhldGE7CisgICAgICAgICAgICBzcGhlcmljYWwucGhpICs9IHNwaGVyaWNhbERl
bHRhLnBoaTsKKworICAgICAgICAgICAgLy8gcmVzdHJpY3QgdGhldGEgdG8gYmUgYmV0d2VlbiBk
ZXNpcmVkIGxpbWl0cworICAgICAgICAgICAgc3BoZXJpY2FsLnRoZXRhID0gTWF0aC5tYXgoIHNj
b3BlLm1pbkF6aW11dGhBbmdsZSwgTWF0aC5taW4oIHNjb3BlLm1heEF6aW11dGhBbmdsZSwgc3Bo
ZXJpY2FsLnRoZXRhICkgKTsKKworICAgICAgICAgICAgLy8gcmVzdHJpY3QgcGhpIHRvIGJlIGJl
dHdlZW4gZGVzaXJlZCBsaW1pdHMKKyAgICAgICAgICAgIHNwaGVyaWNhbC5waGkgPSBNYXRoLm1h
eCggc2NvcGUubWluUG9sYXJBbmdsZSwgTWF0aC5taW4oIHNjb3BlLm1heFBvbGFyQW5nbGUsIHNw
aGVyaWNhbC5waGkgKSApOworCisgICAgICAgICAgICBzcGhlcmljYWwubWFrZVNhZmUoKTsKKwor
CisgICAgICAgICAgICBzcGhlcmljYWwucmFkaXVzICo9IHNjYWxlOworCisgICAgICAgICAgICAv
LyByZXN0cmljdCByYWRpdXMgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0cworICAgICAgICAg
ICAgc3BoZXJpY2FsLnJhZGl1cyA9IE1hdGgubWF4KCBzY29wZS5taW5EaXN0YW5jZSwgTWF0aC5t
aW4oIHNjb3BlLm1heERpc3RhbmNlLCBzcGhlcmljYWwucmFkaXVzICkgKTsKKworICAgICAgICAg
ICAgLy8gbW92ZSB0YXJnZXQgdG8gcGFubmVkIGxvY2F0aW9uCisgICAgICAgICAgICBzY29wZS50
YXJnZXQuYWRkKCBwYW5PZmZzZXQgKTsKKworICAgICAgICAgICAgb2Zmc2V0LnNldEZyb21TcGhl
cmljYWwoIHNwaGVyaWNhbCApOworCisgICAgICAgICAgICAvLyByb3RhdGUgb2Zmc2V0IGJhY2sg
dG8gImNhbWVyYS11cC12ZWN0b3ItaXMtdXAiIHNwYWNlCisgICAgICAgICAgICBvZmZzZXQuYXBw
bHlRdWF0ZXJuaW9uKCBxdWF0SW52ZXJzZSApOworCisgICAgICAgICAgICBwb3NpdGlvbi5jb3B5
KCBzY29wZS50YXJnZXQgKS5hZGQoIG9mZnNldCApOworCisgICAgICAgICAgICBzY29wZS5vYmpl
Y3QubG9va0F0KCBzY29wZS50YXJnZXQgKTsKKworICAgICAgICAgICAgaWYgKCBzY29wZS5lbmFi
bGVEYW1waW5nID09PSB0cnVlICkgeworCisgICAgICAgICAgICAgICAgc3BoZXJpY2FsRGVsdGEu
dGhldGEgKj0gKCAxIC0gc2NvcGUuZGFtcGluZ0ZhY3RvciApOworICAgICAgICAgICAgICAgIHNw
aGVyaWNhbERlbHRhLnBoaSAqPSAoIDEgLSBzY29wZS5kYW1waW5nRmFjdG9yICk7CisKKyAgICAg
ICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICBzcGhlcmljYWxEZWx0YS5zZXQoIDAs
IDAsIDAgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzY2FsZSA9IDE7CisgICAg
ICAgICAgICBwYW5PZmZzZXQuc2V0KCAwLCAwLCAwICk7CisKKyAgICAgICAgICAgIC8vIHVwZGF0
ZSBjb25kaXRpb24gaXM6CisgICAgICAgICAgICAvLyBtaW4oY2FtZXJhIGRpc3BsYWNlbWVudCwg
Y2FtZXJhIHJvdGF0aW9uIGluIHJhZGlhbnMpXjIgPiBFUFMKKyAgICAgICAgICAgIC8vIHVzaW5n
IHNtYWxsLWFuZ2xlIGFwcHJveGltYXRpb24gY29zKHgvMikgPSAxIC0geF4yIC8gOAorCisgICAg
ICAgICAgICBpZiAoIHpvb21DaGFuZ2VkIHx8CisgICAgICAgICAgICAgICAgbGFzdFBvc2l0aW9u
LmRpc3RhbmNlVG9TcXVhcmVkKCBzY29wZS5vYmplY3QucG9zaXRpb24gKSA+IEVQUyB8fAorICAg
ICAgICAgICAgICAgIDggKiAoIDEgLSBsYXN0UXVhdGVybmlvbi5kb3QoIHNjb3BlLm9iamVjdC5x
dWF0ZXJuaW9uICkgKSA+IEVQUyApIHsKKworICAgICAgICAgICAgICAgIHNjb3BlLmRpc3BhdGNo
RXZlbnQoIGNoYW5nZUV2ZW50ICk7CisKKyAgICAgICAgICAgICAgICBsYXN0UG9zaXRpb24uY29w
eSggc2NvcGUub2JqZWN0LnBvc2l0aW9uICk7CisgICAgICAgICAgICAgICAgbGFzdFF1YXRlcm5p
b24uY29weSggc2NvcGUub2JqZWN0LnF1YXRlcm5pb24gKTsKKyAgICAgICAgICAgICAgICB6b29t
Q2hhbmdlZCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIH07CisKKyAg
ICB9KCk7CisKKyAgICB0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgc2Nv
cGUuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnY29udGV4dG1lbnUnLCBvbkNvbnRl
eHRNZW51LCBmYWxzZSApOworICAgICAgICBzY29wZS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlz
dGVuZXIoICdtb3VzZWRvd24nLCBvbk1vdXNlRG93biwgZmFsc2UgKTsKKyAgICAgICAgc2NvcGUu
ZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZh
bHNlICk7CisKKyAgICAgICAgc2NvcGUuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAn
dG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCwgZmFsc2UgKTsKKyAgICAgICAgc2NvcGUuZG9tRWxl
bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAndG91Y2hlbmQnLCBvblRvdWNoRW5kLCBmYWxzZSAp
OworICAgICAgICBzY29wZS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd0b3VjaG1v
dmUnLCBvblRvdWNoTW92ZSwgZmFsc2UgKTsKKworICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVu
dExpc3RlbmVyKCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlICk7CisgICAgICAgIGRv
Y3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSAp
OworCisgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAna2V5ZG93bicsIG9uS2V5
RG93biwgZmFsc2UgKTsKKworICAgICAgICAvL3Njb3BlLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTog
J2Rpc3Bvc2UnIH0gKTsgLy8gc2hvdWxkIHRoaXMgYmUgYWRkZWQgaGVyZT8KKworICAgIH07CisK
KyAgICAvLworICAgIC8vIGludGVybmFscworICAgIC8vCisKKyAgICB2YXIgc2NvcGUgPSB0aGlz
OworCisgICAgdmFyIGNoYW5nZUV2ZW50ID0geyB0eXBlOiAnY2hhbmdlJyB9OworICAgIHZhciBz
dGFydEV2ZW50ID0geyB0eXBlOiAnc3RhcnQnIH07CisgICAgdmFyIGVuZEV2ZW50ID0geyB0eXBl
OiAnZW5kJyB9OworCisgICAgdmFyIFNUQVRFID0geyBOT05FOiAtIDEsIFJPVEFURTogMCwgRE9M
TFk6IDEsIFBBTjogMiwgVE9VQ0hfUk9UQVRFOiAzLCBUT1VDSF9ET0xMWTogNCwgVE9VQ0hfUEFO
OiA1IH07CisKKyAgICB2YXIgc3RhdGUgPSBTVEFURS5OT05FOworCisgICAgdmFyIEVQUyA9IDAu
MDAwMDAxOworCisgICAgLy8gY3VycmVudCBwb3NpdGlvbiBpbiBzcGhlcmljYWwgY29vcmRpbmF0
ZXMKKyAgICB2YXIgc3BoZXJpY2FsID0gbmV3IFRIUkVFLlNwaGVyaWNhbCgpOworICAgIHZhciBz
cGhlcmljYWxEZWx0YSA9IG5ldyBUSFJFRS5TcGhlcmljYWwoKTsKKworICAgIHZhciBzY2FsZSA9
IDE7CisgICAgdmFyIHBhbk9mZnNldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7CisgICAgdmFyIHpv
b21DaGFuZ2VkID0gZmFsc2U7CisKKyAgICB2YXIgcm90YXRlU3RhcnQgPSBuZXcgVEhSRUUuVmVj
dG9yMigpOworICAgIHZhciByb3RhdGVFbmQgPSBuZXcgVEhSRUUuVmVjdG9yMigpOworICAgIHZh
ciByb3RhdGVEZWx0YSA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7CisKKyAgICB2YXIgcGFuU3RhcnQg
PSBuZXcgVEhSRUUuVmVjdG9yMigpOworICAgIHZhciBwYW5FbmQgPSBuZXcgVEhSRUUuVmVjdG9y
MigpOworICAgIHZhciBwYW5EZWx0YSA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7CisKKyAgICB2YXIg
ZG9sbHlTdGFydCA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7CisgICAgdmFyIGRvbGx5RW5kID0gbmV3
IFRIUkVFLlZlY3RvcjIoKTsKKyAgICB2YXIgZG9sbHlEZWx0YSA9IG5ldyBUSFJFRS5WZWN0b3Iy
KCk7CisKKyAgICBmdW5jdGlvbiBnZXRBdXRvUm90YXRpb25BbmdsZSgpIHsKKworICAgICAgICBy
ZXR1cm4gMiAqIE1hdGguUEkgLyA2MCAvIDYwICogc2NvcGUuYXV0b1JvdGF0ZVNwZWVkOworCisg
ICAgfQorCisgICAgZnVuY3Rpb24gZ2V0Wm9vbVNjYWxlKCkgeworCisgICAgICAgIHJldHVybiBN
YXRoLnBvdyggMC45NSwgc2NvcGUuem9vbVNwZWVkICk7CisKKyAgICB9CisKKyAgICBmdW5jdGlv
biByb3RhdGVMZWZ0KCBhbmdsZSApIHsKKworICAgICAgICBzcGhlcmljYWxEZWx0YS50aGV0YSAt
PSBhbmdsZTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIHJvdGF0ZVVwKCBhbmdsZSApIHsKKwor
ICAgICAgICBzcGhlcmljYWxEZWx0YS5waGkgLT0gYW5nbGU7CisKKyAgICB9CisKKyAgICB2YXIg
cGFuTGVmdCA9IGZ1bmN0aW9uICgpIHsKKworICAgICAgICB2YXIgdiA9IG5ldyBUSFJFRS5WZWN0
b3IzKCk7CisKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBhbkxlZnQoIGRpc3RhbmNlLCBvYmpl
Y3RNYXRyaXggKSB7CisKKyAgICAgICAgICAgIHYuc2V0RnJvbU1hdHJpeENvbHVtbiggb2JqZWN0
TWF0cml4LCAwICk7IC8vIGdldCBYIGNvbHVtbiBvZiBvYmplY3RNYXRyaXgKKyAgICAgICAgICAg
IHYubXVsdGlwbHlTY2FsYXIoIC0gZGlzdGFuY2UgKTsKKworICAgICAgICAgICAgcGFuT2Zmc2V0
LmFkZCggdiApOworCisgICAgICAgIH07CisKKyAgICB9KCk7CisKKyAgICB2YXIgcGFuVXAgPSBm
dW5jdGlvbiAoKSB7CisKKyAgICAgICAgdmFyIHYgPSBuZXcgVEhSRUUuVmVjdG9yMygpOworCisg
ICAgICAgIHJldHVybiBmdW5jdGlvbiBwYW5VcCggZGlzdGFuY2UsIG9iamVjdE1hdHJpeCApIHsK
KworICAgICAgICAgICAgdi5zZXRGcm9tTWF0cml4Q29sdW1uKCBvYmplY3RNYXRyaXgsIDEgKTsg
Ly8gZ2V0IFkgY29sdW1uIG9mIG9iamVjdE1hdHJpeAorICAgICAgICAgICAgdi5tdWx0aXBseVNj
YWxhciggZGlzdGFuY2UgKTsKKworICAgICAgICAgICAgcGFuT2Zmc2V0LmFkZCggdiApOworCisg
ICAgICAgIH07CisKKyAgICB9KCk7CisKKyAgICAvLyBkZWx0YVggYW5kIGRlbHRhWSBhcmUgaW4g
cGl4ZWxzOyByaWdodCBhbmQgZG93biBhcmUgcG9zaXRpdmUKKyAgICB2YXIgcGFuID0gZnVuY3Rp
b24gKCkgeworCisgICAgICAgIHZhciBvZmZzZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpOworCisg
ICAgICAgIHJldHVybiBmdW5jdGlvbiBwYW4oIGRlbHRhWCwgZGVsdGFZICkgeworCisgICAgICAg
ICAgICB2YXIgZWxlbWVudCA9IHNjb3BlLmRvbUVsZW1lbnQgPT09IGRvY3VtZW50ID8gc2NvcGUu
ZG9tRWxlbWVudC5ib2R5IDogc2NvcGUuZG9tRWxlbWVudDsKKworICAgICAgICAgICAgaWYgKCBz
Y29wZS5vYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSApIHsKKworICAg
ICAgICAgICAgICAgIC8vIHBlcnNwZWN0aXZlCisgICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9u
ID0gc2NvcGUub2JqZWN0LnBvc2l0aW9uOworICAgICAgICAgICAgICAgIG9mZnNldC5jb3B5KCBw
b3NpdGlvbiApLnN1Yiggc2NvcGUudGFyZ2V0ICk7CisgICAgICAgICAgICAgICAgdmFyIHRhcmdl
dERpc3RhbmNlID0gb2Zmc2V0Lmxlbmd0aCgpOworCisgICAgICAgICAgICAgICAgLy8gaGFsZiBv
ZiB0aGUgZm92IGlzIGNlbnRlciB0byB0b3Agb2Ygc2NyZWVuCisgICAgICAgICAgICAgICAgdGFy
Z2V0RGlzdGFuY2UgKj0gTWF0aC50YW4oICggc2NvcGUub2JqZWN0LmZvdiAvIDIgKSAqIE1hdGgu
UEkgLyAxODAuMCApOworCisgICAgICAgICAgICAgICAgLy8gd2UgYWN0dWFsbHkgZG9uJ3QgdXNl
IHNjcmVlbldpZHRoLCBzaW5jZSBwZXJzcGVjdGl2ZSBjYW1lcmEgaXMgZml4ZWQgdG8gc2NyZWVu
IGhlaWdodAorICAgICAgICAgICAgICAgIHBhbkxlZnQoIDIgKiBkZWx0YVggKiB0YXJnZXREaXN0
YW5jZSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBzY29wZS5vYmplY3QubWF0cml4ICk7CisgICAg
ICAgICAgICAgICAgcGFuVXAoIDIgKiBkZWx0YVkgKiB0YXJnZXREaXN0YW5jZSAvIGVsZW1lbnQu
Y2xpZW50SGVpZ2h0LCBzY29wZS5vYmplY3QubWF0cml4ICk7CisKKyAgICAgICAgICAgIH0gZWxz
ZSBpZiAoIHNjb3BlLm9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSAp
IHsKKworICAgICAgICAgICAgICAgIC8vIG9ydGhvZ3JhcGhpYworICAgICAgICAgICAgICAgIHBh
bkxlZnQoIGRlbHRhWCAqICggc2NvcGUub2JqZWN0LnJpZ2h0IC0gc2NvcGUub2JqZWN0LmxlZnQg
KSAvIHNjb3BlLm9iamVjdC56b29tIC8gZWxlbWVudC5jbGllbnRXaWR0aCwgc2NvcGUub2JqZWN0
Lm1hdHJpeCApOworICAgICAgICAgICAgICAgIHBhblVwKCBkZWx0YVkgKiAoIHNjb3BlLm9iamVj
dC50b3AgLSBzY29wZS5vYmplY3QuYm90dG9tICkgLyBzY29wZS5vYmplY3Quem9vbSAvIGVsZW1l
bnQuY2xpZW50SGVpZ2h0LCBzY29wZS5vYmplY3QubWF0cml4ICk7CisKKyAgICAgICAgICAgIH0g
ZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvLyBjYW1lcmEgbmVpdGhlciBvcnRob2dyYXBoaWMg
bm9yIHBlcnNwZWN0aXZlCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnV0FSTklORzog
T3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gcGFu
IGRpc2FibGVkLicgKTsKKyAgICAgICAgICAgICAgICBzY29wZS5lbmFibGVQYW4gPSBmYWxzZTsK
KworICAgICAgICAgICAgfQorCisgICAgICAgIH07CisKKyAgICB9KCk7CisKKyAgICBmdW5jdGlv
biBkb2xseUluKCBkb2xseVNjYWxlICkgeworCisgICAgICAgIGlmICggc2NvcGUub2JqZWN0IGlu
c3RhbmNlb2YgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEgKSB7CisKKyAgICAgICAgICAgIHNjYWxl
IC89IGRvbGx5U2NhbGU7CisKKyAgICAgICAgfSBlbHNlIGlmICggc2NvcGUub2JqZWN0IGluc3Rh
bmNlb2YgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhICkgeworCisgICAgICAgICAgICBzY29wZS5v
YmplY3Quem9vbSA9IE1hdGgubWF4KCBzY29wZS5taW5ab29tLCBNYXRoLm1pbiggc2NvcGUubWF4
Wm9vbSwgc2NvcGUub2JqZWN0Lnpvb20gKiBkb2xseVNjYWxlICkgKTsKKyAgICAgICAgICAgIHNj
b3BlLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CisgICAgICAgICAgICB6b29tQ2hh
bmdlZCA9IHRydWU7CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgY29uc29sZS53
YXJuKCAnV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNh
bWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4nICk7CisgICAgICAgICAgICBzY29wZS5l
bmFibGVab29tID0gZmFsc2U7CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgZnVuY3Rpb24g
ZG9sbHlPdXQoIGRvbGx5U2NhbGUgKSB7CisKKyAgICAgICAgaWYgKCBzY29wZS5vYmplY3QgaW5z
dGFuY2VvZiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSApIHsKKworICAgICAgICAgICAgc2NhbGUg
Kj0gZG9sbHlTY2FsZTsKKworICAgICAgICB9IGVsc2UgaWYgKCBzY29wZS5vYmplY3QgaW5zdGFu
Y2VvZiBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEgKSB7CisKKyAgICAgICAgICAgIHNjb3BlLm9i
amVjdC56b29tID0gTWF0aC5tYXgoIHNjb3BlLm1pblpvb20sIE1hdGgubWluKCBzY29wZS5tYXha
b29tLCBzY29wZS5vYmplY3Quem9vbSAvIGRvbGx5U2NhbGUgKSApOworICAgICAgICAgICAgc2Nv
cGUub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKKyAgICAgICAgICAgIHpvb21DaGFu
Z2VkID0gdHJ1ZTsKKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBjb25zb2xlLndh
cm4oICdXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2Ft
ZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLicgKTsKKyAgICAgICAgICAgIHNjb3BlLmVu
YWJsZVpvb20gPSBmYWxzZTsKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLworICAgIC8v
IGV2ZW50IGNhbGxiYWNrcyAtIHVwZGF0ZSB0aGUgb2JqZWN0IHN0YXRlCisgICAgLy8KKworICAg
IGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93blJvdGF0ZSggZXZlbnQgKSB7CisKKyAgICAgICAgLy9j
b25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlRG93blJvdGF0ZScgKTsKKworICAgICAgICByb3RhdGVT
dGFydC5zZXQoIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkgKTsKKworICAgIH0KKworICAg
IGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93bkRvbGx5KCBldmVudCApIHsKKworICAgICAgICAvL2Nv
bnNvbGUubG9nKCAnaGFuZGxlTW91c2VEb3duRG9sbHknICk7CisKKyAgICAgICAgZG9sbHlTdGFy
dC5zZXQoIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkgKTsKKworICAgIH0KKworICAgIGZ1
bmN0aW9uIGhhbmRsZU1vdXNlRG93blBhbiggZXZlbnQgKSB7CisKKyAgICAgICAgLy9jb25zb2xl
LmxvZyggJ2hhbmRsZU1vdXNlRG93blBhbicgKTsKKworICAgICAgICBwYW5TdGFydC5zZXQoIGV2
ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkgKTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIGhh
bmRsZU1vdXNlTW92ZVJvdGF0ZSggZXZlbnQgKSB7CisKKyAgICAgICAgLy9jb25zb2xlLmxvZygg
J2hhbmRsZU1vdXNlTW92ZVJvdGF0ZScgKTsKKworICAgICAgICByb3RhdGVFbmQuc2V0KCBldmVu
dC5jbGllbnRYLCBldmVudC5jbGllbnRZICk7CisgICAgICAgIHJvdGF0ZURlbHRhLnN1YlZlY3Rv
cnMoIHJvdGF0ZUVuZCwgcm90YXRlU3RhcnQgKTsKKworICAgICAgICB2YXIgZWxlbWVudCA9IHNj
b3BlLmRvbUVsZW1lbnQgPT09IGRvY3VtZW50ID8gc2NvcGUuZG9tRWxlbWVudC5ib2R5IDogc2Nv
cGUuZG9tRWxlbWVudDsKKworICAgICAgICAvLyByb3RhdGluZyBhY3Jvc3Mgd2hvbGUgc2NyZWVu
IGdvZXMgMzYwIGRlZ3JlZXMgYXJvdW5kCisgICAgICAgIHJvdGF0ZUxlZnQoIDIgKiBNYXRoLlBJ
ICogcm90YXRlRGVsdGEueCAvIGVsZW1lbnQuY2xpZW50V2lkdGggKiBzY29wZS5yb3RhdGVTcGVl
ZCApOworCisgICAgICAgIC8vIHJvdGF0aW5nIHVwIGFuZCBkb3duIGFsb25nIHdob2xlIHNjcmVl
biBhdHRlbXB0cyB0byBnbyAzNjAsIGJ1dCBsaW1pdGVkIHRvIDE4MAorICAgICAgICByb3RhdGVV
cCggMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS55IC8gZWxlbWVudC5jbGllbnRIZWlnaHQgKiBz
Y29wZS5yb3RhdGVTcGVlZCApOworCisgICAgICAgIHJvdGF0ZVN0YXJ0LmNvcHkoIHJvdGF0ZUVu
ZCApOworCisgICAgICAgIHNjb3BlLnVwZGF0ZSgpOworCisgICAgfQorCisgICAgZnVuY3Rpb24g
aGFuZGxlTW91c2VNb3ZlRG9sbHkoIGV2ZW50ICkgeworCisgICAgICAgIC8vY29uc29sZS5sb2co
ICdoYW5kbGVNb3VzZU1vdmVEb2xseScgKTsKKworICAgICAgICBkb2xseUVuZC5zZXQoIGV2ZW50
LmNsaWVudFgsIGV2ZW50LmNsaWVudFkgKTsKKworICAgICAgICBkb2xseURlbHRhLnN1YlZlY3Rv
cnMoIGRvbGx5RW5kLCBkb2xseVN0YXJ0ICk7CisKKyAgICAgICAgaWYgKCBkb2xseURlbHRhLnkg
PiAwICkgeworCisgICAgICAgICAgICBkb2xseUluKCBnZXRab29tU2NhbGUoKSApOworCisgICAg
ICAgIH0gZWxzZSBpZiAoIGRvbGx5RGVsdGEueSA8IDAgKSB7CisKKyAgICAgICAgICAgIGRvbGx5
T3V0KCBnZXRab29tU2NhbGUoKSApOworCisgICAgICAgIH0KKworICAgICAgICBkb2xseVN0YXJ0
LmNvcHkoIGRvbGx5RW5kICk7CisKKyAgICAgICAgc2NvcGUudXBkYXRlKCk7CisKKyAgICB9CisK
KyAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmVQYW4oIGV2ZW50ICkgeworCisgICAgICAgIC8v
Y29uc29sZS5sb2coICdoYW5kbGVNb3VzZU1vdmVQYW4nICk7CisKKyAgICAgICAgcGFuRW5kLnNl
dCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSApOworCisgICAgICAgIHBhbkRlbHRhLnN1
YlZlY3RvcnMoIHBhbkVuZCwgcGFuU3RhcnQgKTsKKworICAgICAgICBwYW4oIHBhbkRlbHRhLngs
IHBhbkRlbHRhLnkgKTsKKworICAgICAgICBwYW5TdGFydC5jb3B5KCBwYW5FbmQgKTsKKworICAg
ICAgICBzY29wZS51cGRhdGUoKTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNl
VXAoIGV2ZW50ICkgeworCisgICAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VVcCcg
KTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlV2hlZWwoIGV2ZW50ICkgewor
CisgICAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VXaGVlbCcgKTsKKworICAgICAg
ICBpZiAoIGV2ZW50LmRlbHRhWSA8IDAgKSB7CisKKyAgICAgICAgICAgIGRvbGx5T3V0KCBnZXRa
b29tU2NhbGUoKSApOworCisgICAgICAgIH0gZWxzZSBpZiAoIGV2ZW50LmRlbHRhWSA+IDAgKSB7
CisKKyAgICAgICAgICAgIGRvbGx5SW4oIGdldFpvb21TY2FsZSgpICk7CisKKyAgICAgICAgfQor
CisgICAgICAgIHNjb3BlLnVwZGF0ZSgpOworCisgICAgfQorCisgICAgZnVuY3Rpb24gaGFuZGxl
S2V5RG93biggZXZlbnQgKSB7CisKKyAgICAgICAgLy9jb25zb2xlLmxvZyggJ2hhbmRsZUtleURv
d24nICk7CisKKyAgICAgICAgc3dpdGNoICggZXZlbnQua2V5Q29kZSApIHsKKworICAgICAgICAg
ICAgY2FzZSBzY29wZS5rZXlzLlVQOgorICAgICAgICAgICAgICAgIHBhbiggMCwgc2NvcGUua2V5
UGFuU3BlZWQgKTsKKyAgICAgICAgICAgICAgICBzY29wZS51cGRhdGUoKTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBzY29wZS5rZXlzLkJPVFRPTToKKyAgICAg
ICAgICAgICAgICBwYW4oIDAsIC0gc2NvcGUua2V5UGFuU3BlZWQgKTsKKyAgICAgICAgICAgICAg
ICBzY29wZS51cGRhdGUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAg
Y2FzZSBzY29wZS5rZXlzLkxFRlQ6CisgICAgICAgICAgICAgICAgcGFuKCBzY29wZS5rZXlQYW5T
cGVlZCwgMCApOworICAgICAgICAgICAgICAgIHNjb3BlLnVwZGF0ZSgpOworICAgICAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIHNjb3BlLmtleXMuUklHSFQ6CisgICAgICAg
ICAgICAgICAgcGFuKCAtIHNjb3BlLmtleVBhblNwZWVkLCAwICk7CisgICAgICAgICAgICAgICAg
c2NvcGUudXBkYXRlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisg
ICAgfQorCisgICAgZnVuY3Rpb24gaGFuZGxlVG91Y2hTdGFydFJvdGF0ZSggZXZlbnQgKSB7CisK
KyAgICAgICAgLy9jb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoU3RhcnRSb3RhdGUnICk7CisKKyAg
ICAgICAgcm90YXRlU3RhcnQuc2V0KCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVgsIGV2ZW50LnRv
dWNoZXNbIDAgXS5wYWdlWSApOworCisgICAgfQorCisgICAgZnVuY3Rpb24gaGFuZGxlVG91Y2hT
dGFydERvbGx5KCBldmVudCApIHsKKworICAgICAgICAvL2NvbnNvbGUubG9nKCAnaGFuZGxlVG91
Y2hTdGFydERvbGx5JyApOworCisgICAgICAgIHZhciBkeCA9IGV2ZW50LnRvdWNoZXNbIDAgXS5w
YWdlWCAtIGV2ZW50LnRvdWNoZXNbIDEgXS5wYWdlWDsKKyAgICAgICAgdmFyIGR5ID0gZXZlbnQu
dG91Y2hlc1sgMCBdLnBhZ2VZIC0gZXZlbnQudG91Y2hlc1sgMSBdLnBhZ2VZOworCisgICAgICAg
IHZhciBkaXN0YW5jZSA9IE1hdGguc3FydCggZHggKiBkeCArIGR5ICogZHkgKTsKKworICAgICAg
ICBkb2xseVN0YXJ0LnNldCggMCwgZGlzdGFuY2UgKTsKKworICAgIH0KKworICAgIGZ1bmN0aW9u
IGhhbmRsZVRvdWNoU3RhcnRQYW4oIGV2ZW50ICkgeworCisgICAgICAgIC8vY29uc29sZS5sb2co
ICdoYW5kbGVUb3VjaFN0YXJ0UGFuJyApOworCisgICAgICAgIHBhblN0YXJ0LnNldCggZXZlbnQu
dG91Y2hlc1sgMCBdLnBhZ2VYLCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVkgKTsKKworICAgIH0K
KworICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoTW92ZVJvdGF0ZSggZXZlbnQgKSB7CisKKyAgICAg
ICAgLy9jb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoTW92ZVJvdGF0ZScgKTsKKworICAgICAgICBy
b3RhdGVFbmQuc2V0KCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbIDAg
XS5wYWdlWSApOworICAgICAgICByb3RhdGVEZWx0YS5zdWJWZWN0b3JzKCByb3RhdGVFbmQsIHJv
dGF0ZVN0YXJ0ICk7CisKKyAgICAgICAgdmFyIGVsZW1lbnQgPSBzY29wZS5kb21FbGVtZW50ID09
PSBkb2N1bWVudCA/IHNjb3BlLmRvbUVsZW1lbnQuYm9keSA6IHNjb3BlLmRvbUVsZW1lbnQ7CisK
KyAgICAgICAgLy8gcm90YXRpbmcgYWNyb3NzIHdob2xlIHNjcmVlbiBnb2VzIDM2MCBkZWdyZWVz
IGFyb3VuZAorICAgICAgICByb3RhdGVMZWZ0KCAyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLngg
LyBlbGVtZW50LmNsaWVudFdpZHRoICogc2NvcGUucm90YXRlU3BlZWQgKTsKKworICAgICAgICAv
LyByb3RhdGluZyB1cCBhbmQgZG93biBhbG9uZyB3aG9sZSBzY3JlZW4gYXR0ZW1wdHMgdG8gZ28g
MzYwLCBidXQgbGltaXRlZCB0byAxODAKKyAgICAgICAgcm90YXRlVXAoIDIgKiBNYXRoLlBJICog
cm90YXRlRGVsdGEueSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0ICogc2NvcGUucm90YXRlU3BlZWQg
KTsKKworICAgICAgICByb3RhdGVTdGFydC5jb3B5KCByb3RhdGVFbmQgKTsKKworICAgICAgICBz
Y29wZS51cGRhdGUoKTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoTW92ZURv
bGx5KCBldmVudCApIHsKKworICAgICAgICAvL2NvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hNb3Zl
RG9sbHknICk7CisKKyAgICAgICAgdmFyIGR4ID0gZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VYIC0g
ZXZlbnQudG91Y2hlc1sgMSBdLnBhZ2VYOworICAgICAgICB2YXIgZHkgPSBldmVudC50b3VjaGVz
WyAwIF0ucGFnZVkgLSBldmVudC50b3VjaGVzWyAxIF0ucGFnZVk7CisKKyAgICAgICAgdmFyIGRp
c3RhbmNlID0gTWF0aC5zcXJ0KCBkeCAqIGR4ICsgZHkgKiBkeSApOworCisgICAgICAgIGRvbGx5
RW5kLnNldCggMCwgZGlzdGFuY2UgKTsKKworICAgICAgICBkb2xseURlbHRhLnN1YlZlY3RvcnMo
IGRvbGx5RW5kLCBkb2xseVN0YXJ0ICk7CisKKyAgICAgICAgaWYgKCBkb2xseURlbHRhLnkgPiAw
ICkgeworCisgICAgICAgICAgICBkb2xseU91dCggZ2V0Wm9vbVNjYWxlKCkgKTsKKworICAgICAg
ICB9IGVsc2UgaWYgKCBkb2xseURlbHRhLnkgPCAwICkgeworCisgICAgICAgICAgICBkb2xseUlu
KCBnZXRab29tU2NhbGUoKSApOworCisgICAgICAgIH0KKworICAgICAgICBkb2xseVN0YXJ0LmNv
cHkoIGRvbGx5RW5kICk7CisKKyAgICAgICAgc2NvcGUudXBkYXRlKCk7CisKKyAgICB9CisKKyAg
ICBmdW5jdGlvbiBoYW5kbGVUb3VjaE1vdmVQYW4oIGV2ZW50ICkgeworCisgICAgICAgIC8vY29u
c29sZS5sb2coICdoYW5kbGVUb3VjaE1vdmVQYW4nICk7CisKKyAgICAgICAgcGFuRW5kLnNldCgg
ZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VYLCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVkgKTsKKwor
ICAgICAgICBwYW5EZWx0YS5zdWJWZWN0b3JzKCBwYW5FbmQsIHBhblN0YXJ0ICk7CisKKyAgICAg
ICAgcGFuKCBwYW5EZWx0YS54LCBwYW5EZWx0YS55ICk7CisKKyAgICAgICAgcGFuU3RhcnQuY29w
eSggcGFuRW5kICk7CisKKyAgICAgICAgc2NvcGUudXBkYXRlKCk7CisKKyAgICB9CisKKyAgICBm
dW5jdGlvbiBoYW5kbGVUb3VjaEVuZCggZXZlbnQgKSB7CisKKyAgICAgICAgLy9jb25zb2xlLmxv
ZyggJ2hhbmRsZVRvdWNoRW5kJyApOworCisgICAgfQorCisgICAgLy8KKyAgICAvLyBldmVudCBo
YW5kbGVycyAtIEZTTTogbGlzdGVuIGZvciBldmVudHMgYW5kIHJlc2V0IHN0YXRlCisgICAgLy8K
KworICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKCBldmVudCApIHsKKworICAgICAgICBpZiAoIHNj
b3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuOworCisgICAgICAgIGV2ZW50LnByZXZlbnRE
ZWZhdWx0KCk7CisKKyAgICAgICAgc3dpdGNoICggZXZlbnQuYnV0dG9uICkgeworCisgICAgICAg
ICAgICBjYXNlIHNjb3BlLm1vdXNlQnV0dG9ucy5PUkJJVDoKKworICAgICAgICAgICAgICAgIGlm
ICggc2NvcGUuZW5hYmxlUm90YXRlID09PSBmYWxzZSApIHJldHVybjsKKworICAgICAgICAgICAg
ICAgIGhhbmRsZU1vdXNlRG93blJvdGF0ZSggZXZlbnQgKTsKKworICAgICAgICAgICAgICAgIHN0
YXRlID0gU1RBVEUuUk9UQVRFOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAg
ICAgIGNhc2Ugc2NvcGUubW91c2VCdXR0b25zLlpPT006CisKKyAgICAgICAgICAgICAgICBpZiAo
IHNjb3BlLmVuYWJsZVpvb20gPT09IGZhbHNlICkgcmV0dXJuOworCisgICAgICAgICAgICAgICAg
aGFuZGxlTW91c2VEb3duRG9sbHkoIGV2ZW50ICk7CisKKyAgICAgICAgICAgICAgICBzdGF0ZSA9
IFNUQVRFLkRPTExZOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNh
c2Ugc2NvcGUubW91c2VCdXR0b25zLlBBTjoKKworICAgICAgICAgICAgICAgIGlmICggc2NvcGUu
ZW5hYmxlUGFuID09PSBmYWxzZSApIHJldHVybjsKKworICAgICAgICAgICAgICAgIGhhbmRsZU1v
dXNlRG93blBhbiggZXZlbnQgKTsKKworICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEUuUEFO
OworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmICgg
c3RhdGUgIT09IFNUQVRFLk5PTkUgKSB7CisKKyAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50
TGlzdGVuZXIoICdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UgKTsKKyAgICAgICAgICAg
IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSAp
OworCisgICAgICAgICAgICBzY29wZS5kaXNwYXRjaEV2ZW50KCBzdGFydEV2ZW50ICk7CisKKyAg
ICAgICAgfQorCisgICAgfQorCisgICAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoIGV2ZW50ICkgewor
CisgICAgICAgIGlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47CisKKyAgICAg
ICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKworICAgICAgICBzd2l0Y2ggKCBzdGF0ZSApIHsK
KworICAgICAgICAgICAgY2FzZSBTVEFURS5ST1RBVEU6CisKKyAgICAgICAgICAgICAgICBpZiAo
IHNjb3BlLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47CisKKyAgICAgICAgICAgICAg
ICBoYW5kbGVNb3VzZU1vdmVSb3RhdGUoIGV2ZW50ICk7CisKKyAgICAgICAgICAgICAgICBicmVh
azsKKworICAgICAgICAgICAgY2FzZSBTVEFURS5ET0xMWToKKworICAgICAgICAgICAgICAgIGlm
ICggc2NvcGUuZW5hYmxlWm9vbSA9PT0gZmFsc2UgKSByZXR1cm47CisKKyAgICAgICAgICAgICAg
ICBoYW5kbGVNb3VzZU1vdmVEb2xseSggZXZlbnQgKTsKKworICAgICAgICAgICAgICAgIGJyZWFr
OworCisgICAgICAgICAgICBjYXNlIFNUQVRFLlBBTjoKKworICAgICAgICAgICAgICAgIGlmICgg
c2NvcGUuZW5hYmxlUGFuID09PSBmYWxzZSApIHJldHVybjsKKworICAgICAgICAgICAgICAgIGhh
bmRsZU1vdXNlTW92ZVBhbiggZXZlbnQgKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgIH0KKworICAgIH0KKworICAgIGZ1bmN0aW9uIG9uTW91c2VVcCggZXZlbnQgKSB7CisK
KyAgICAgICAgaWYgKCBzY29wZS5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjsKKworICAgICAg
ICBoYW5kbGVNb3VzZVVwKCBldmVudCApOworCisgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50
TGlzdGVuZXIoICdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UgKTsKKyAgICAgICAgZG9j
dW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlICk7
CisKKyAgICAgICAgc2NvcGUuZGlzcGF0Y2hFdmVudCggZW5kRXZlbnQgKTsKKworICAgICAgICBz
dGF0ZSA9IFNUQVRFLk5PTkU7CisKKyAgICB9CisKKyAgICBmdW5jdGlvbiBvbk1vdXNlV2hlZWwo
IGV2ZW50ICkgeworCisgICAgICAgIGlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgfHwgc2Nv
cGUuZW5hYmxlWm9vbSA9PT0gZmFsc2UgfHwgKCBzdGF0ZSAhPT0gU1RBVEUuTk9ORSAmJiBzdGF0
ZSAhPT0gU1RBVEUuUk9UQVRFICkgKSByZXR1cm47CisKKyAgICAgICAgZXZlbnQucHJldmVudERl
ZmF1bHQoKTsKKyAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisKKyAgICAgICAgaGFu
ZGxlTW91c2VXaGVlbCggZXZlbnQgKTsKKworICAgICAgICBzY29wZS5kaXNwYXRjaEV2ZW50KCBz
dGFydEV2ZW50ICk7IC8vIG5vdCBzdXJlIHdoeSB0aGVzZSBhcmUgaGVyZS4uLgorICAgICAgICBz
Y29wZS5kaXNwYXRjaEV2ZW50KCBlbmRFdmVudCApOworCisgICAgfQorCisgICAgZnVuY3Rpb24g
b25LZXlEb3duKCBldmVudCApIHsKKworICAgICAgICBpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZh
bHNlIHx8IHNjb3BlLmVuYWJsZUtleXMgPT09IGZhbHNlIHx8IHNjb3BlLmVuYWJsZVBhbiA9PT0g
ZmFsc2UgKSByZXR1cm47CisKKyAgICAgICAgaGFuZGxlS2V5RG93biggZXZlbnQgKTsKKworICAg
IH0KKworICAgIGZ1bmN0aW9uIG9uVG91Y2hTdGFydCggZXZlbnQgKSB7CisKKyAgICAgICAgaWYg
KCBzY29wZS5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjsKKworICAgICAgICBzd2l0Y2ggKCBl
dmVudC50b3VjaGVzLmxlbmd0aCApIHsKKworICAgICAgICAgICAgY2FzZSAxOiAvLyBvbmUtZmlu
Z2VyZWQgdG91Y2g6IHJvdGF0ZQorCisgICAgICAgICAgICAgICAgaWYgKCBzY29wZS5lbmFibGVS
b3RhdGUgPT09IGZhbHNlICkgcmV0dXJuOworCisgICAgICAgICAgICAgICAgaGFuZGxlVG91Y2hT
dGFydFJvdGF0ZSggZXZlbnQgKTsKKworICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9V
Q0hfUk9UQVRFOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Ug
MjogLy8gdHdvLWZpbmdlcmVkIHRvdWNoOiBkb2xseQorCisgICAgICAgICAgICAgICAgaWYgKCBz
Y29wZS5lbmFibGVab29tID09PSBmYWxzZSApIHJldHVybjsKKworICAgICAgICAgICAgICAgIGhh
bmRsZVRvdWNoU3RhcnREb2xseSggZXZlbnQgKTsKKworICAgICAgICAgICAgICAgIHN0YXRlID0g
U1RBVEUuVE9VQ0hfRE9MTFk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAg
ICAgY2FzZSAzOiAvLyB0aHJlZS1maW5nZXJlZCB0b3VjaDogcGFuCisKKyAgICAgICAgICAgICAg
ICBpZiAoIHNjb3BlLmVuYWJsZVBhbiA9PT0gZmFsc2UgKSByZXR1cm47CisKKyAgICAgICAgICAg
ICAgICBoYW5kbGVUb3VjaFN0YXJ0UGFuKCBldmVudCApOworCisgICAgICAgICAgICAgICAgc3Rh
dGUgPSBTVEFURS5UT1VDSF9QQU47CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAg
ICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTsKKwor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKCBzdGF0ZSAhPT0gU1RBVEUuTk9ORSApIHsKKworICAg
ICAgICAgICAgc2NvcGUuZGlzcGF0Y2hFdmVudCggc3RhcnRFdmVudCApOworCisgICAgICAgIH0K
KworICAgIH0KKworICAgIGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKCBldmVudCApIHsKKworICAgICAg
ICBpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuOworCisgICAgICAgIGV2ZW50
LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCisg
ICAgICAgIHN3aXRjaCAoIGV2ZW50LnRvdWNoZXMubGVuZ3RoICkgeworCisgICAgICAgICAgICBj
YXNlIDE6IC8vIG9uZS1maW5nZXJlZCB0b3VjaDogcm90YXRlCisKKyAgICAgICAgICAgICAgICBp
ZiAoIHNjb3BlLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47CisgICAgICAgICAgICAg
ICAgaWYgKCBzdGF0ZSAhPT0gU1RBVEUuVE9VQ0hfUk9UQVRFICkgcmV0dXJuOyAvLyBpcyB0aGlz
IG5lZWRlZD8uLi4KKworICAgICAgICAgICAgICAgIGhhbmRsZVRvdWNoTW92ZVJvdGF0ZSggZXZl
bnQgKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6IC8v
IHR3by1maW5nZXJlZCB0b3VjaDogZG9sbHkKKworICAgICAgICAgICAgICAgIGlmICggc2NvcGUu
ZW5hYmxlWm9vbSA9PT0gZmFsc2UgKSByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0
ZSAhPT0gU1RBVEUuVE9VQ0hfRE9MTFkgKSByZXR1cm47IC8vIGlzIHRoaXMgbmVlZGVkPy4uLgor
CisgICAgICAgICAgICAgICAgaGFuZGxlVG91Y2hNb3ZlRG9sbHkoIGV2ZW50ICk7CisKKyAgICAg
ICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAzOiAvLyB0aHJlZS1maW5nZXJl
ZCB0b3VjaDogcGFuCisKKyAgICAgICAgICAgICAgICBpZiAoIHNjb3BlLmVuYWJsZVBhbiA9PT0g
ZmFsc2UgKSByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZSAhPT0gU1RBVEUuVE9V
Q0hfUEFOICkgcmV0dXJuOyAvLyBpcyB0aGlzIG5lZWRlZD8uLi4KKworICAgICAgICAgICAgICAg
IGhhbmRsZVRvdWNoTW92ZVBhbiggZXZlbnQgKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOwor
CisgICAgICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURS5O
T05FOworCisgICAgICAgIH0KKworICAgIH0KKworICAgIGZ1bmN0aW9uIG9uVG91Y2hFbmQoIGV2
ZW50ICkgeworCisgICAgICAgIGlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47
CisKKyAgICAgICAgaGFuZGxlVG91Y2hFbmQoIGV2ZW50ICk7CisKKyAgICAgICAgc2NvcGUuZGlz
cGF0Y2hFdmVudCggZW5kRXZlbnQgKTsKKworICAgICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7CisK
KyAgICB9CisKKyAgICBmdW5jdGlvbiBvbkNvbnRleHRNZW51KCBldmVudCApIHsKKworICAgICAg
ICBpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuOworCisgICAgICAgIGV2ZW50
LnByZXZlbnREZWZhdWx0KCk7CisKKyAgICB9CisKKyAgICAvLworCisgICAgc2NvcGUuZG9tRWxl
bWVudC5hZGRFdmVudExpc3RlbmVyKCAnY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51LCBmYWxz
ZSApOworCisgICAgc2NvcGUuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2Vkb3du
Jywgb25Nb3VzZURvd24sIGZhbHNlICk7CisgICAgc2NvcGUuZG9tRWxlbWVudC5hZGRFdmVudExp
c3RlbmVyKCAnd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZhbHNlICk7CisKKyAgICBzY29wZS5kb21F
bGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBmYWxz
ZSApOworICAgIHNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3RvdWNoZW5kJywg
b25Ub3VjaEVuZCwgZmFsc2UgKTsKKyAgICBzY29wZS5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVu
ZXIoICd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UgKTsKKworICAgIHdpbmRvdy5hZGRF
dmVudExpc3RlbmVyKCAna2V5ZG93bicsIG9uS2V5RG93biwgZmFsc2UgKTsKKworICAgIC8vIGZv
cmNlIGFuIHVwZGF0ZSBhdCBzdGFydAorCisgICAgdGhpcy51cGRhdGUoKTsKKworfTsKKworVEhS
RUUuT3JiaXRDb250cm9scy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUSFJFRS5FdmVudERp
c3BhdGNoZXIucHJvdG90eXBlICk7CitUSFJFRS5PcmJpdENvbnRyb2xzLnByb3RvdHlwZS5jb25z
dHJ1Y3RvciA9IFRIUkVFLk9yYml0Q29udHJvbHM7CisKK09iamVjdC5kZWZpbmVQcm9wZXJ0aWVz
KCBUSFJFRS5PcmJpdENvbnRyb2xzLnByb3RvdHlwZSwgeworCisgICAgY2VudGVyOiB7CisKKyAg
ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RI
UkVFLk9yYml0Q29udHJvbHM6IC5jZW50ZXIgaGFzIGJlZW4gcmVuYW1lZCB0byAudGFyZ2V0JyAp
OworICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0OworCisgICAgICAgIH0KKworICAgIH0s
CisKKyAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisKKyAgICBub1pvb206IHsKKworICAg
ICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhS
RUUuT3JiaXRDb250cm9sczogLm5vWm9vbSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJs
ZVpvb20gaW5zdGVhZC4nICk7CisgICAgICAgICAgICByZXR1cm4gISB0aGlzLmVuYWJsZVpvb207
CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAg
ICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLk9yYml0Q29udHJvbHM6IC5ub1pvb20gaGFz
IGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVab29tIGluc3RlYWQuJyApOworICAgICAgICAg
ICAgdGhpcy5lbmFibGVab29tID0gISB2YWx1ZTsKKworICAgICAgICB9CisKKyAgICB9LAorCisg
ICAgbm9Sb3RhdGU6IHsKKworICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAg
ICAgY29uc29sZS53YXJuKCAnVEhSRUUuT3JiaXRDb250cm9sczogLm5vUm90YXRlIGhhcyBiZWVu
IGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlUm90YXRlIGluc3RlYWQuJyApOworICAgICAgICAgICAg
cmV0dXJuICEgdGhpcy5lbmFibGVSb3RhdGU7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXQ6
IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVF
Lk9yYml0Q29udHJvbHM6IC5ub1JvdGF0ZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJs
ZVJvdGF0ZSBpbnN0ZWFkLicgKTsKKyAgICAgICAgICAgIHRoaXMuZW5hYmxlUm90YXRlID0gISB2
YWx1ZTsKKworICAgICAgICB9CisKKyAgICB9LAorCisgICAgbm9QYW46IHsKKworICAgICAgICBn
ZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuT3Ji
aXRDb250cm9sczogLm5vUGFuIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlUGFuIGlu
c3RlYWQuJyApOworICAgICAgICAgICAgcmV0dXJuICEgdGhpcy5lbmFibGVQYW47CisKKyAgICAg
ICAgfSwKKworICAgICAgICBzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAg
IGNvbnNvbGUud2FybiggJ1RIUkVFLk9yYml0Q29udHJvbHM6IC5ub1BhbiBoYXMgYmVlbiBkZXBy
ZWNhdGVkLiBVc2UgLmVuYWJsZVBhbiBpbnN0ZWFkLicgKTsKKyAgICAgICAgICAgIHRoaXMuZW5h
YmxlUGFuID0gISB2YWx1ZTsKKworICAgICAgICB9CisKKyAgICB9LAorCisgICAgbm9LZXlzOiB7
CisKKyAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2Fy
biggJ1RIUkVFLk9yYml0Q29udHJvbHM6IC5ub0tleXMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNl
IC5lbmFibGVLZXlzIGluc3RlYWQuJyApOworICAgICAgICAgICAgcmV0dXJuICEgdGhpcy5lbmFi
bGVLZXlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkg
eworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5PcmJpdENvbnRyb2xzOiAubm9L
ZXlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlS2V5cyBpbnN0ZWFkLicgKTsKKyAg
ICAgICAgICAgIHRoaXMuZW5hYmxlS2V5cyA9ICEgdmFsdWU7CisKKyAgICAgICAgfQorCisgICAg
fSwKKworICAgIHN0YXRpY01vdmluZzogeworCisgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5PcmJpdENvbnRyb2xzOiAuc3RhdGlj
TW92aW5nIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlRGFtcGluZyBpbnN0ZWFkLicg
KTsKKyAgICAgICAgICAgIHJldHVybiAhIHRoaXMuZW5hYmxlRGFtcGluZzsKKworICAgICAgICB9
LAorCisgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgY29u
c29sZS53YXJuKCAnVEhSRUUuT3JiaXRDb250cm9sczogLnN0YXRpY01vdmluZyBoYXMgYmVlbiBk
ZXByZWNhdGVkLiBVc2UgLmVuYWJsZURhbXBpbmcgaW5zdGVhZC4nICk7CisgICAgICAgICAgICB0
aGlzLmVuYWJsZURhbXBpbmcgPSAhIHZhbHVlOworCisgICAgICAgIH0KKworICAgIH0sCisKKyAg
ICBkeW5hbWljRGFtcGluZ0ZhY3RvcjogeworCisgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5PcmJpdENvbnRyb2xzOiAuZHluYW1p
Y0RhbXBpbmdGYWN0b3IgaGFzIGJlZW4gcmVuYW1lZC4gVXNlIC5kYW1waW5nRmFjdG9yIGluc3Rl
YWQuJyApOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGFtcGluZ0ZhY3RvcjsKKworICAgICAg
ICB9LAorCisgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAg
Y29uc29sZS53YXJuKCAnVEhSRUUuT3JiaXRDb250cm9sczogLmR5bmFtaWNEYW1waW5nRmFjdG9y
IGhhcyBiZWVuIHJlbmFtZWQuIFVzZSAuZGFtcGluZ0ZhY3RvciBpbnN0ZWFkLicgKTsKKyAgICAg
ICAgICAgIHRoaXMuZGFtcGluZ0ZhY3RvciA9IHZhbHVlOworCisgICAgICAgIH0KKworICAgIH0K
KworfSApOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2Uv
RXh0ZXJuYWwvdGhyZWUuanMvdGhyZWUuanMgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlcklu
dGVyZmFjZS9FeHRlcm5hbC90aHJlZS5qcy90aHJlZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMC4uZDI2MDUyMGVkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9FeHRlcm5hbC90aHJlZS5qcy90aHJlZS5qcwpA
QCAtMCwwICsxLDQ0MTEwIEBACisoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgeworICAgIHR5
cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVk
JyA/IGZhY3RvcnkoZXhwb3J0cykgOgorICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicg
JiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOgorICAgIChmYWN0
b3J5KChnbG9iYWwuVEhSRUUgPSBnbG9iYWwuVEhSRUUgfHwge30pKSk7Cit9KHRoaXMsIChmdW5j
dGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7CisKKyAgICAvLyBQb2x5ZmlsbHMKKworICAg
IGlmICggTnVtYmVyLkVQU0lMT04gPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICBOdW1iZXIu
RVBTSUxPTiA9IE1hdGgucG93KCAyLCAtIDUyICk7CisKKyAgICB9CisKKyAgICBpZiAoIE51bWJl
ci5pc0ludGVnZXIgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAvLyBNaXNzaW5nIGluIElF
CisgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2Vi
L0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0ludGVnZXIKKwor
ICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyID0gZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAg
ICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoIHZhbHVl
ICkgJiYgTWF0aC5mbG9vciggdmFsdWUgKSA9PT0gdmFsdWU7CisKKyAgICAgICAgfTsKKworICAg
IH0KKworICAgIC8vCisKKyAgICBpZiAoIE1hdGguc2lnbiA9PT0gdW5kZWZpbmVkICkgeworCisg
ICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0ph
dmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvc2lnbgorCisgICAgICAgIE1h
dGguc2lnbiA9IGZ1bmN0aW9uICggeCApIHsKKworICAgICAgICAgICAgcmV0dXJuICggeCA8IDAg
KSA/IC0gMSA6ICggeCA+IDAgKSA/IDEgOiArIHg7CisKKyAgICAgICAgfTsKKworICAgIH0KKwor
ICAgIGlmICggRnVuY3Rpb24ucHJvdG90eXBlLm5hbWUgPT09IHVuZGVmaW5lZCApIHsKKworICAg
ICAgICAvLyBNaXNzaW5nIGluIElFCisgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemls
bGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3Rz
L0Z1bmN0aW9uL25hbWUKKworICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIEZ1bmN0aW9u
LnByb3RvdHlwZSwgJ25hbWUnLCB7CisKKyAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKS5tYXRjaCggL15ccypmdW5j
dGlvblxzKihbXlwoXHNdKikvIClbIDEgXTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0g
KTsKKworICAgIH0KKworICAgIGlmICggT2JqZWN0LmFzc2lnbiA9PT0gdW5kZWZpbmVkICkgewor
CisgICAgICAgIC8vIE1pc3NpbmcgaW4gSUUKKyAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIu
bW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09i
amVjdHMvT2JqZWN0L2Fzc2lnbgorCisgICAgICAgICggZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7CisKKyAgICAgICAgICAg
ICAgICAndXNlIHN0cmljdCc7CisKKyAgICAgICAgICAgICAgICBpZiAoIHRhcmdldCA9PT0gdW5k
ZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgICAgICB0aHJv
dyBuZXcgVHlwZUVycm9yKCAnQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2Jq
ZWN0JyApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIG91dHB1
dCA9IE9iamVjdCggdGFyZ2V0ICk7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaW5kZXgg
PSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICsrICkgeworCisgICAgICAgICAg
ICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbIGluZGV4IF07CisKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKCBzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIHZhciBuZXh0S2V5IGluIHNvdXJjZSAp
IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggT2JqZWN0LnByb3RvdHlwZS5o
YXNPd25Qcm9wZXJ0eS5jYWxsKCBzb3VyY2UsIG5leHRLZXkgKSApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBvdXRwdXRbIG5leHRLZXkgXSA9IHNvdXJjZVsgbmV4dEtleSBd
OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKworICAgICAgICAgICAgfTsKKworICAgICAg
ICB9ICkoKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9t
cmRvb2IvZXZlbnRkaXNwYXRjaGVyLmpzLworICAgICAqLworCisgICAgZnVuY3Rpb24gRXZlbnRE
aXNwYXRjaGVyKCkge30KKworICAgIE9iamVjdC5hc3NpZ24oIEV2ZW50RGlzcGF0Y2hlci5wcm90
b3R5cGUsIHsKKworICAgICAgICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxp
c3RlbmVyICkgeworCisgICAgICAgICAgICBpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZp
bmVkICkgdGhpcy5fbGlzdGVuZXJzID0ge307CisKKyAgICAgICAgICAgIHZhciBsaXN0ZW5lcnMg
PSB0aGlzLl9saXN0ZW5lcnM7CisKKyAgICAgICAgICAgIGlmICggbGlzdGVuZXJzWyB0eXBlIF0g
PT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIGxpc3RlbmVyc1sgdHlwZSBdID0g
W107CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBsaXN0ZW5lcnNbIHR5cGUg
XS5pbmRleE9mKCBsaXN0ZW5lciApID09PSAtIDEgKSB7CisKKyAgICAgICAgICAgICAgICBsaXN0
ZW5lcnNbIHR5cGUgXS5wdXNoKCBsaXN0ZW5lciApOworCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgfSwKKworICAgICAgICBoYXNFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3Rl
bmVyICkgeworCisgICAgICAgICAgICBpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVk
ICkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlz
dGVuZXJzOworCisgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXJzWyB0eXBlIF0gIT09IHVuZGVm
aW5lZCAmJiBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5lciApICE9PSAtIDE7CisK
KyAgICAgICAgfSwKKworICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5
cGUsIGxpc3RlbmVyICkgeworCisgICAgICAgICAgICBpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0g
dW5kZWZpbmVkICkgcmV0dXJuOworCisgICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5f
bGlzdGVuZXJzOworICAgICAgICAgICAgdmFyIGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIHR5
cGUgXTsKKworICAgICAgICAgICAgaWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7
CisKKyAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBsaXN0ZW5lckFycmF5LmluZGV4T2YoIGxp
c3RlbmVyICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGluZGV4ICE9PSAtIDEgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgbGlzdGVuZXJBcnJheS5zcGxpY2UoIGluZGV4LCAxICk7CisKKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAorCisgICAgICAg
IGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICggZXZlbnQgKSB7CisKKyAgICAgICAgICAgIGlmICgg
dGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47CisKKyAgICAgICAgICAgIHZh
ciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7CisgICAgICAgICAgICB2YXIgbGlzdGVuZXJB
cnJheSA9IGxpc3RlbmVyc1sgZXZlbnQudHlwZSBdOworCisgICAgICAgICAgICBpZiAoIGxpc3Rl
bmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdl
dCA9IHRoaXM7CisKKyAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBsaXN0ZW5lckFycmF5LnNs
aWNlKCAwICk7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5s
ZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIGFycmF5WyBpIF0u
Y2FsbCggdGhpcywgZXZlbnQgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
fQorCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIHZhciBSRVZJU0lPTiA9ICc4Nic7Cisg
ICAgdmFyIE1PVVNFID0geyBMRUZUOiAwLCBNSURETEU6IDEsIFJJR0hUOiAyIH07CisgICAgdmFy
IEN1bGxGYWNlTm9uZSA9IDA7CisgICAgdmFyIEN1bGxGYWNlQmFjayA9IDE7CisgICAgdmFyIEN1
bGxGYWNlRnJvbnQgPSAyOworICAgIHZhciBDdWxsRmFjZUZyb250QmFjayA9IDM7CisgICAgdmFy
IEZyb250RmFjZURpcmVjdGlvbkNXID0gMDsKKyAgICB2YXIgRnJvbnRGYWNlRGlyZWN0aW9uQ0NX
ID0gMTsKKyAgICB2YXIgQmFzaWNTaGFkb3dNYXAgPSAwOworICAgIHZhciBQQ0ZTaGFkb3dNYXAg
PSAxOworICAgIHZhciBQQ0ZTb2Z0U2hhZG93TWFwID0gMjsKKyAgICB2YXIgRnJvbnRTaWRlID0g
MDsKKyAgICB2YXIgQmFja1NpZGUgPSAxOworICAgIHZhciBEb3VibGVTaWRlID0gMjsKKyAgICB2
YXIgRmxhdFNoYWRpbmcgPSAxOworICAgIHZhciBTbW9vdGhTaGFkaW5nID0gMjsKKyAgICB2YXIg
Tm9Db2xvcnMgPSAwOworICAgIHZhciBGYWNlQ29sb3JzID0gMTsKKyAgICB2YXIgVmVydGV4Q29s
b3JzID0gMjsKKyAgICB2YXIgTm9CbGVuZGluZyA9IDA7CisgICAgdmFyIE5vcm1hbEJsZW5kaW5n
ID0gMTsKKyAgICB2YXIgQWRkaXRpdmVCbGVuZGluZyA9IDI7CisgICAgdmFyIFN1YnRyYWN0aXZl
QmxlbmRpbmcgPSAzOworICAgIHZhciBNdWx0aXBseUJsZW5kaW5nID0gNDsKKyAgICB2YXIgQ3Vz
dG9tQmxlbmRpbmcgPSA1OworICAgIHZhciBBZGRFcXVhdGlvbiA9IDEwMDsKKyAgICB2YXIgU3Vi
dHJhY3RFcXVhdGlvbiA9IDEwMTsKKyAgICB2YXIgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gPSAx
MDI7CisgICAgdmFyIE1pbkVxdWF0aW9uID0gMTAzOworICAgIHZhciBNYXhFcXVhdGlvbiA9IDEw
NDsKKyAgICB2YXIgWmVyb0ZhY3RvciA9IDIwMDsKKyAgICB2YXIgT25lRmFjdG9yID0gMjAxOwor
ICAgIHZhciBTcmNDb2xvckZhY3RvciA9IDIwMjsKKyAgICB2YXIgT25lTWludXNTcmNDb2xvckZh
Y3RvciA9IDIwMzsKKyAgICB2YXIgU3JjQWxwaGFGYWN0b3IgPSAyMDQ7CisgICAgdmFyIE9uZU1p
bnVzU3JjQWxwaGFGYWN0b3IgPSAyMDU7CisgICAgdmFyIERzdEFscGhhRmFjdG9yID0gMjA2Owor
ICAgIHZhciBPbmVNaW51c0RzdEFscGhhRmFjdG9yID0gMjA3OworICAgIHZhciBEc3RDb2xvckZh
Y3RvciA9IDIwODsKKyAgICB2YXIgT25lTWludXNEc3RDb2xvckZhY3RvciA9IDIwOTsKKyAgICB2
YXIgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciA9IDIxMDsKKyAgICB2YXIgTmV2ZXJEZXB0aCA9IDA7
CisgICAgdmFyIEFsd2F5c0RlcHRoID0gMTsKKyAgICB2YXIgTGVzc0RlcHRoID0gMjsKKyAgICB2
YXIgTGVzc0VxdWFsRGVwdGggPSAzOworICAgIHZhciBFcXVhbERlcHRoID0gNDsKKyAgICB2YXIg
R3JlYXRlckVxdWFsRGVwdGggPSA1OworICAgIHZhciBHcmVhdGVyRGVwdGggPSA2OworICAgIHZh
ciBOb3RFcXVhbERlcHRoID0gNzsKKyAgICB2YXIgTXVsdGlwbHlPcGVyYXRpb24gPSAwOworICAg
IHZhciBNaXhPcGVyYXRpb24gPSAxOworICAgIHZhciBBZGRPcGVyYXRpb24gPSAyOworICAgIHZh
ciBOb1RvbmVNYXBwaW5nID0gMDsKKyAgICB2YXIgTGluZWFyVG9uZU1hcHBpbmcgPSAxOworICAg
IHZhciBSZWluaGFyZFRvbmVNYXBwaW5nID0gMjsKKyAgICB2YXIgVW5jaGFydGVkMlRvbmVNYXBw
aW5nID0gMzsKKyAgICB2YXIgQ2luZW9uVG9uZU1hcHBpbmcgPSA0OworICAgIHZhciBVVk1hcHBp
bmcgPSAzMDA7CisgICAgdmFyIEN1YmVSZWZsZWN0aW9uTWFwcGluZyA9IDMwMTsKKyAgICB2YXIg
Q3ViZVJlZnJhY3Rpb25NYXBwaW5nID0gMzAyOworICAgIHZhciBFcXVpcmVjdGFuZ3VsYXJSZWZs
ZWN0aW9uTWFwcGluZyA9IDMwMzsKKyAgICB2YXIgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1h
cHBpbmcgPSAzMDQ7CisgICAgdmFyIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nID0gMzA1Owor
ICAgIHZhciBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyA9IDMwNjsKKyAgICB2YXIgQ3ViZVVWUmVm
cmFjdGlvbk1hcHBpbmcgPSAzMDc7CisgICAgdmFyIFJlcGVhdFdyYXBwaW5nID0gMTAwMDsKKyAg
ICB2YXIgQ2xhbXBUb0VkZ2VXcmFwcGluZyA9IDEwMDE7CisgICAgdmFyIE1pcnJvcmVkUmVwZWF0
V3JhcHBpbmcgPSAxMDAyOworICAgIHZhciBOZWFyZXN0RmlsdGVyID0gMTAwMzsKKyAgICB2YXIg
TmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA0OworICAgIHZhciBOZWFyZXN0TWlwTWFw
TGluZWFyRmlsdGVyID0gMTAwNTsKKyAgICB2YXIgTGluZWFyRmlsdGVyID0gMTAwNjsKKyAgICB2
YXIgTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDc7CisgICAgdmFyIExpbmVhck1pcE1h
cExpbmVhckZpbHRlciA9IDEwMDg7CisgICAgdmFyIFVuc2lnbmVkQnl0ZVR5cGUgPSAxMDA5Owor
ICAgIHZhciBCeXRlVHlwZSA9IDEwMTA7CisgICAgdmFyIFNob3J0VHlwZSA9IDEwMTE7CisgICAg
dmFyIFVuc2lnbmVkU2hvcnRUeXBlID0gMTAxMjsKKyAgICB2YXIgSW50VHlwZSA9IDEwMTM7Cisg
ICAgdmFyIFVuc2lnbmVkSW50VHlwZSA9IDEwMTQ7CisgICAgdmFyIEZsb2F0VHlwZSA9IDEwMTU7
CisgICAgdmFyIEhhbGZGbG9hdFR5cGUgPSAxMDE2OworICAgIHZhciBVbnNpZ25lZFNob3J0NDQ0
NFR5cGUgPSAxMDE3OworICAgIHZhciBVbnNpZ25lZFNob3J0NTU1MVR5cGUgPSAxMDE4OworICAg
IHZhciBVbnNpZ25lZFNob3J0NTY1VHlwZSA9IDEwMTk7CisgICAgdmFyIFVuc2lnbmVkSW50MjQ4
VHlwZSA9IDEwMjA7CisgICAgdmFyIEFscGhhRm9ybWF0ID0gMTAyMTsKKyAgICB2YXIgUkdCRm9y
bWF0ID0gMTAyMjsKKyAgICB2YXIgUkdCQUZvcm1hdCA9IDEwMjM7CisgICAgdmFyIEx1bWluYW5j
ZUZvcm1hdCA9IDEwMjQ7CisgICAgdmFyIEx1bWluYW5jZUFscGhhRm9ybWF0ID0gMTAyNTsKKyAg
ICB2YXIgUkdCRUZvcm1hdCA9IFJHQkFGb3JtYXQ7CisgICAgdmFyIERlcHRoRm9ybWF0ID0gMTAy
NjsKKyAgICB2YXIgRGVwdGhTdGVuY2lsRm9ybWF0ID0gMTAyNzsKKyAgICB2YXIgUkdCX1MzVENf
RFhUMV9Gb3JtYXQgPSAyMDAxOworICAgIHZhciBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgPSAyMDAy
OworICAgIHZhciBSR0JBX1MzVENfRFhUM19Gb3JtYXQgPSAyMDAzOworICAgIHZhciBSR0JBX1Mz
VENfRFhUNV9Gb3JtYXQgPSAyMDA0OworICAgIHZhciBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCA9
IDIxMDA7CisgICAgdmFyIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMjEwMTsKKyAgICB2YXIg
UkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMjEwMjsKKyAgICB2YXIgUkdCQV9QVlJUQ18yQlBQ
VjFfRm9ybWF0ID0gMjEwMzsKKyAgICB2YXIgUkdCX0VUQzFfRm9ybWF0ID0gMjE1MTsKKyAgICB2
YXIgTG9vcE9uY2UgPSAyMjAwOworICAgIHZhciBMb29wUmVwZWF0ID0gMjIwMTsKKyAgICB2YXIg
TG9vcFBpbmdQb25nID0gMjIwMjsKKyAgICB2YXIgSW50ZXJwb2xhdGVEaXNjcmV0ZSA9IDIzMDA7
CisgICAgdmFyIEludGVycG9sYXRlTGluZWFyID0gMjMwMTsKKyAgICB2YXIgSW50ZXJwb2xhdGVT
bW9vdGggPSAyMzAyOworICAgIHZhciBaZXJvQ3VydmF0dXJlRW5kaW5nID0gMjQwMDsKKyAgICB2
YXIgWmVyb1Nsb3BlRW5kaW5nID0gMjQwMTsKKyAgICB2YXIgV3JhcEFyb3VuZEVuZGluZyA9IDI0
MDI7CisgICAgdmFyIFRyaWFuZ2xlc0RyYXdNb2RlID0gMDsKKyAgICB2YXIgVHJpYW5nbGVTdHJp
cERyYXdNb2RlID0gMTsKKyAgICB2YXIgVHJpYW5nbGVGYW5EcmF3TW9kZSA9IDI7CisgICAgdmFy
IExpbmVhckVuY29kaW5nID0gMzAwMDsKKyAgICB2YXIgc1JHQkVuY29kaW5nID0gMzAwMTsKKyAg
ICB2YXIgR2FtbWFFbmNvZGluZyA9IDMwMDc7CisgICAgdmFyIFJHQkVFbmNvZGluZyA9IDMwMDI7
CisgICAgdmFyIExvZ0x1dkVuY29kaW5nID0gMzAwMzsKKyAgICB2YXIgUkdCTTdFbmNvZGluZyA9
IDMwMDQ7CisgICAgdmFyIFJHQk0xNkVuY29kaW5nID0gMzAwNTsKKyAgICB2YXIgUkdCREVuY29k
aW5nID0gMzAwNjsKKyAgICB2YXIgQmFzaWNEZXB0aFBhY2tpbmcgPSAzMjAwOworICAgIHZhciBS
R0JBRGVwdGhQYWNraW5nID0gMzIwMTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgYWx0ZXJl
ZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBo
dHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIHZhciBfTWF0aCA9IHsKKworICAgICAg
ICBERUcyUkFEOiBNYXRoLlBJIC8gMTgwLAorICAgICAgICBSQUQyREVHOiAxODAgLyBNYXRoLlBJ
LAorCisgICAgICAgIGdlbmVyYXRlVVVJRDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAv
LyBodHRwOi8vd3d3LmJyb29mYS5jb20vVG9vbHMvTWF0aC51dWlkLmh0bQorCisgICAgICAgICAg
ICB2YXIgY2hhcnMgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVm
Z2hpamtsbW5vcHFyc3R1dnd4eXonLnNwbGl0KCAnJyApOworICAgICAgICAgICAgdmFyIHV1aWQg
PSBuZXcgQXJyYXkoIDM2ICk7CisgICAgICAgICAgICB2YXIgcm5kID0gMCwgcjsKKworICAgICAg
ICAgICAgcmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpIHsKKworICAgICAgICAgICAgICAg
IGZvciAoIHZhciBpID0gMDsgaSA8IDM2OyBpICsrICkgeworCisgICAgICAgICAgICAgICAgICAg
IGlmICggaSA9PT0gOCB8fCBpID09PSAxMyB8fCBpID09PSAxOCB8fCBpID09PSAyMyApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgdXVpZFsgaSBdID0gJy0nOworCisgICAgICAgICAgICAg
ICAgICAgIH0gZWxzZSBpZiAoIGkgPT09IDE0ICkgeworCisgICAgICAgICAgICAgICAgICAgICAg
ICB1dWlkWyBpIF0gPSAnNCc7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCBybmQgPD0gMHgwMiApIHJuZCA9IDB4MjAwMDAwMCAr
ICggTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMCApIHwgMDsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHIgPSBybmQgJiAweGY7CisgICAgICAgICAgICAgICAgICAgICAgICBybmQgPSBybmQgPj4g
NDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHV1aWRbIGkgXSA9IGNoYXJzWyAoIGkgPT09IDE5
ICkgPyAoIHIgJiAweDMgKSB8IDB4OCA6IHIgXTsKKworICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdXVpZC5qb2luKCAn
JyApOworCisgICAgICAgICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICBjbGFtcDog
ZnVuY3Rpb24gKCB2YWx1ZSwgbWluLCBtYXggKSB7CisKKyAgICAgICAgICAgIHJldHVybiBNYXRo
Lm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB2YWx1ZSApICk7CisKKyAgICAgICAgfSwKKworICAg
ICAgICAvLyBjb21wdXRlIGV1Y2xpZGlhbiBtb2R1bG8gb2YgbSAlIG4KKyAgICAgICAgLy8gaHR0
cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9kdWxvX29wZXJhdGlvbgorCisgICAgICAgIGV1
Y2xpZGVhbk1vZHVsbzogZnVuY3Rpb24gKCBuLCBtICkgeworCisgICAgICAgICAgICByZXR1cm4g
KCAoIG4gJSBtICkgKyBtICkgJSBtOworCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gTGluZWFy
IG1hcHBpbmcgZnJvbSByYW5nZSA8YTEsIGEyPiB0byByYW5nZSA8YjEsIGIyPgorCisgICAgICAg
IG1hcExpbmVhcjogZnVuY3Rpb24gKCB4LCBhMSwgYTIsIGIxLCBiMiApIHsKKworICAgICAgICAg
ICAgcmV0dXJuIGIxICsgKCB4IC0gYTEgKSAqICggYjIgLSBiMSApIC8gKCBhMiAtIGExICk7CisK
KyAgICAgICAgfSwKKworICAgICAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9M
aW5lYXJfaW50ZXJwb2xhdGlvbgorCisgICAgICAgIGxlcnA6IGZ1bmN0aW9uICggeCwgeSwgdCAp
IHsKKworICAgICAgICAgICAgcmV0dXJuICggMSAtIHQgKSAqIHggKyB0ICogeTsKKworICAgICAg
ICB9LAorCisgICAgICAgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3Rl
cAorCisgICAgICAgIHNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7CisKKyAg
ICAgICAgICAgIGlmICggeCA8PSBtaW4gKSByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICggeCA+
PSBtYXggKSByZXR1cm4gMTsKKworICAgICAgICAgICAgeCA9ICggeCAtIG1pbiApIC8gKCBtYXgg
LSBtaW4gKTsKKworICAgICAgICAgICAgcmV0dXJuIHggKiB4ICogKCAzIC0gMiAqIHggKTsKKwor
ICAgICAgICB9LAorCisgICAgICAgIHNtb290aGVyc3RlcDogZnVuY3Rpb24gKCB4LCBtaW4sIG1h
eCApIHsKKworICAgICAgICAgICAgaWYgKCB4IDw9IG1pbiApIHJldHVybiAwOworICAgICAgICAg
ICAgaWYgKCB4ID49IG1heCApIHJldHVybiAxOworCisgICAgICAgICAgICB4ID0gKCB4IC0gbWlu
ICkgLyAoIG1heCAtIG1pbiApOworCisgICAgICAgICAgICByZXR1cm4geCAqIHggKiB4ICogKCB4
ICogKCB4ICogNiAtIDE1ICkgKyAxMCApOworCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gUmFu
ZG9tIGludGVnZXIgZnJvbSA8bG93LCBoaWdoPiBpbnRlcnZhbAorCisgICAgICAgIHJhbmRJbnQ6
IGZ1bmN0aW9uICggbG93LCBoaWdoICkgeworCisgICAgICAgICAgICByZXR1cm4gbG93ICsgTWF0
aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApOworCisgICAgICAg
IH0sCisKKyAgICAgICAgLy8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWwK
KworICAgICAgICByYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkgeworCisgICAgICAg
ICAgICByZXR1cm4gbG93ICsgTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyApOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgLy8gUmFuZG9tIGZsb2F0IGZyb20gPC1yYW5nZS8yLCByYW5nZS8y
PiBpbnRlcnZhbAorCisgICAgICAgIHJhbmRGbG9hdFNwcmVhZDogZnVuY3Rpb24gKCByYW5nZSAp
IHsKKworICAgICAgICAgICAgcmV0dXJuIHJhbmdlICogKCAwLjUgLSBNYXRoLnJhbmRvbSgpICk7
CisKKyAgICAgICAgfSwKKworICAgICAgICBkZWdUb1JhZDogZnVuY3Rpb24gKCBkZWdyZWVzICkg
eworCisgICAgICAgICAgICByZXR1cm4gZGVncmVlcyAqIF9NYXRoLkRFRzJSQUQ7CisKKyAgICAg
ICAgfSwKKworICAgICAgICByYWRUb0RlZzogZnVuY3Rpb24gKCByYWRpYW5zICkgeworCisgICAg
ICAgICAgICByZXR1cm4gcmFkaWFucyAqIF9NYXRoLlJBRDJERUc7CisKKyAgICAgICAgfSwKKwor
ICAgICAgICBpc1Bvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAg
IHJldHVybiAoIHZhbHVlICYgKCB2YWx1ZSAtIDEgKSApID09PSAwICYmIHZhbHVlICE9PSAwOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgbmVhcmVzdFBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFs
dWUgKSB7CisKKyAgICAgICAgICAgIHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5yb3VuZCggTWF0
aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBu
ZXh0UG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgdmFsdWUg
LS07CisgICAgICAgICAgICB2YWx1ZSB8PSB2YWx1ZSA+PiAxOworICAgICAgICAgICAgdmFsdWUg
fD0gdmFsdWUgPj4gMjsKKyAgICAgICAgICAgIHZhbHVlIHw9IHZhbHVlID4+IDQ7CisgICAgICAg
ICAgICB2YWx1ZSB8PSB2YWx1ZSA+PiA4OworICAgICAgICAgICAgdmFsdWUgfD0gdmFsdWUgPj4g
MTY7CisgICAgICAgICAgICB2YWx1ZSArKzsKKworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwor
CisgICAgICAgIH0KKworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAv
IGh0dHA6Ly9tcmRvb2IuY29tLworICAgICAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9n
LnRoZWppdC5vcmcvCisgICAgICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVy
LmNvbS8KKyAgICAgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4
NS9ibG9nCisgICAgICovCisKKyAgICBmdW5jdGlvbiBWZWN0b3IyKCB4LCB5ICkgeworCisgICAg
ICAgIHRoaXMueCA9IHggfHwgMDsKKyAgICAgICAgdGhpcy55ID0geSB8fCAwOworCisgICAgfQor
CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZlY3RvcjIucHJvdG90eXBlLCB7CisKKyAg
ICAgICAgIndpZHRoIiA6IHsKKworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisKKyAg
ICAgICAgICAgICAgICByZXR1cm4gdGhpcy54OworCisgICAgICAgICAgICB9LAorCisgICAgICAg
ICAgICBzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLngg
PSB2YWx1ZTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAgImhlaWdo
dCIgOiB7CisKKyAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAg
ICAgcmV0dXJuIHRoaXMueTsKKworICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgc2V0OiBm
dW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAgICAgICAgdGhpcy55ID0gdmFsdWU7CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICBPYmplY3QuYXNz
aWduKCBWZWN0b3IyLnByb3RvdHlwZSwgeworCisgICAgICAgIGlzVmVjdG9yMjogdHJ1ZSwKKwor
ICAgICAgICBzZXQ6IGZ1bmN0aW9uICggeCwgeSApIHsKKworICAgICAgICAgICAgdGhpcy54ID0g
eDsKKyAgICAgICAgICAgIHRoaXMueSA9IHk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgc2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHsK
KworICAgICAgICAgICAgdGhpcy54ID0gc2NhbGFyOworICAgICAgICAgICAgdGhpcy55ID0gc2Nh
bGFyOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAg
IHNldFg6IGZ1bmN0aW9uICggeCApIHsKKworICAgICAgICAgICAgdGhpcy54ID0geDsKKworICAg
ICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRZOiBmdW5j
dGlvbiAoIHkgKSB7CisKKyAgICAgICAgICAgIHRoaXMueSA9IHk7CisKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0Q29tcG9uZW50OiBmdW5jdGlv
biAoIGluZGV4LCB2YWx1ZSApIHsKKworICAgICAgICAgICAgc3dpdGNoICggaW5kZXggKSB7CisK
KyAgICAgICAgICAgICAgICBjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhazsKKyAgICAgICAg
ICAgICAgICBjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBk
ZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRl
eCApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgZ2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisg
ICAgICAgICAgICBzd2l0Y2ggKCBpbmRleCApIHsKKworICAgICAgICAgICAgICAgIGNhc2UgMDog
cmV0dXJuIHRoaXMueDsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiB0aGlzLnk7Cisg
ICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9m
IHJhbmdlOiAnICsgaW5kZXggKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0sCisKKyAg
ICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlz
LmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSApOworCisgICAgICAgIH0sCisKKyAgICAgICAg
Y29weTogZnVuY3Rpb24gKCB2ICkgeworCisgICAgICAgICAgICB0aGlzLnggPSB2Lng7CisgICAg
ICAgICAgICB0aGlzLnkgPSB2Lnk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgYWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7CisKKyAgICAgICAgICAg
IGlmICggdyAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJu
KCAnVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBV
c2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsKKyAgICAgICAgICAgICAgICByZXR1
cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgdGhpcy54ICs9IHYueDsKKyAgICAgICAgICAgIHRoaXMueSArPSB2Lnk7CisKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgYWRkU2NhbGFyOiBmdW5j
dGlvbiAoIHMgKSB7CisKKyAgICAgICAgICAgIHRoaXMueCArPSBzOworICAgICAgICAgICAgdGhp
cy55ICs9IHM7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgYWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkgeworCisgICAgICAgICAgICB0aGlz
LnggPSBhLnggKyBiLng7CisgICAgICAgICAgICB0aGlzLnkgPSBhLnkgKyBiLnk7CisKKyAgICAg
ICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgYWRkU2NhbGVkVmVj
dG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7CisKKyAgICAgICAgICAgIHRoaXMueCArPSB2LnggKiBz
OworICAgICAgICAgICAgdGhpcy55ICs9IHYueSAqIHM7CisKKyAgICAgICAgICAgIHJldHVybiB0
aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7CisK
KyAgICAgICAgICAgIGlmICggdyAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAg
Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25l
IGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7CisKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgdGhpcy54IC09IHYueDsKKyAgICAgICAgICAgIHRoaXMueSAtPSB2Lnk7
CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc3Vi
U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CisKKyAgICAgICAgICAgIHRoaXMueCAtPSBzOworICAg
ICAgICAgICAgdGhpcy55IC09IHM7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgc3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkgeworCisgICAg
ICAgICAgICB0aGlzLnggPSBhLnggLSBiLng7CisgICAgICAgICAgICB0aGlzLnkgPSBhLnkgLSBi
Lnk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAg
bXVsdGlwbHk6IGZ1bmN0aW9uICggdiApIHsKKworICAgICAgICAgICAgdGhpcy54ICo9IHYueDsK
KyAgICAgICAgICAgIHRoaXMueSAqPSB2Lnk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgbXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFy
ICkgeworCisgICAgICAgICAgICB0aGlzLnggKj0gc2NhbGFyOworICAgICAgICAgICAgdGhpcy55
ICo9IHNjYWxhcjsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKwor
ICAgICAgICBkaXZpZGU6IGZ1bmN0aW9uICggdiApIHsKKworICAgICAgICAgICAgdGhpcy54IC89
IHYueDsKKyAgICAgICAgICAgIHRoaXMueSAvPSB2Lnk7CisKKyAgICAgICAgICAgIHJldHVybiB0
aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNj
YWxhciApIHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBz
Y2FsYXIgKTsKKworICAgICAgICB9LAorCisgICAgICAgIG1pbjogZnVuY3Rpb24gKCB2ICkgewor
CisgICAgICAgICAgICB0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTsKKyAgICAgICAg
ICAgIHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApOworCisgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIG1heDogZnVuY3Rpb24gKCB2ICkgewor
CisgICAgICAgICAgICB0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTsKKyAgICAgICAg
ICAgIHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApOworCisgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGNsYW1wOiBmdW5jdGlvbiAoIG1pbiwg
bWF4ICkgeworCisgICAgICAgICAgICAvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lz
ZQorCisgICAgICAgICAgICB0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgu
eCwgdGhpcy54ICkgKTsKKyAgICAgICAgICAgIHRoaXMueSA9IE1hdGgubWF4KCBtaW4ueSwgTWF0
aC5taW4oIG1heC55LCB0aGlzLnkgKSApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKwor
ICAgICAgICB9LAorCisgICAgICAgIGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7CisKKyAgICAg
ICAgICAgIHZhciBtaW4gPSBuZXcgVmVjdG9yMigpOworICAgICAgICAgICAgdmFyIG1heCA9IG5l
dyBWZWN0b3IyKCk7CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBjbGFtcFNjYWxhcigg
bWluVmFsLCBtYXhWYWwgKSB7CisKKyAgICAgICAgICAgICAgICBtaW4uc2V0KCBtaW5WYWwsIG1p
blZhbCApOworICAgICAgICAgICAgICAgIG1heC5zZXQoIG1heFZhbCwgbWF4VmFsICk7CisKKyAg
ICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTsKKworICAgICAgICAg
ICAgfTsKKworICAgICAgICB9KCksCisKKyAgICAgICAgY2xhbXBMZW5ndGg6IGZ1bmN0aW9uICgg
bWluLCBtYXggKSB7CisKKyAgICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpOwor
CisgICAgICAgICAgICByZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVs
dGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkgKTsK
KworICAgICAgICB9LAorCisgICAgICAgIGZsb29yOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAg
ICAgIHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApOworICAgICAgICAgICAgdGhpcy55ID0g
TWF0aC5mbG9vciggdGhpcy55ICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgY2VpbDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB0aGlz
LnggPSBNYXRoLmNlaWwoIHRoaXMueCApOworICAgICAgICAgICAgdGhpcy55ID0gTWF0aC5jZWls
KCB0aGlzLnkgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKwor
ICAgICAgICByb3VuZDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB0aGlzLnggPSBNYXRo
LnJvdW5kKCB0aGlzLnggKTsKKyAgICAgICAgICAgIHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMu
eSApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAg
IHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHRoaXMueCA9ICggdGhp
cy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApOwor
ICAgICAgICAgICAgdGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSAp
IDogTWF0aC5mbG9vciggdGhpcy55ICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisg
ICAgICAgIH0sCisKKyAgICAgICAgbmVnYXRlOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAg
IHRoaXMueCA9IC0gdGhpcy54OworICAgICAgICAgICAgdGhpcy55ID0gLSB0aGlzLnk7CisKKyAg
ICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZG90OiBmdW5j
dGlvbiAoIHYgKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkg
KiB2Lnk7CisKKyAgICAgICAgfSwKKworICAgICAgICBsZW5ndGhTcTogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICByZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55Owor
CisgICAgICAgIH0sCisKKyAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAg
ICAgIHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSAp
OworCisgICAgICAgIH0sCisKKyAgICAgICAgbGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbigpIHsK
KworICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlz
LnkgKTsKKworICAgICAgICB9LAorCisgICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICByZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwg
MSApOworCisgICAgICAgIH0sCisKKyAgICAgICAgYW5nbGU6IGZ1bmN0aW9uICgpIHsKKworICAg
ICAgICAgICAgLy8gY29tcHV0ZXMgdGhlIGFuZ2xlIGluIHJhZGlhbnMgd2l0aCByZXNwZWN0IHRv
IHRoZSBwb3NpdGl2ZSB4LWF4aXMKKworICAgICAgICAgICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFu
MiggdGhpcy55LCB0aGlzLnggKTsKKworICAgICAgICAgICAgaWYgKCBhbmdsZSA8IDAgKSBhbmds
ZSArPSAyICogTWF0aC5QSTsKKworICAgICAgICAgICAgcmV0dXJuIGFuZ2xlOworCisgICAgICAg
IH0sCisKKyAgICAgICAgZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkgeworCisgICAgICAgICAg
ICByZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTsKKworICAg
ICAgICB9LAorCisgICAgICAgIGRpc3RhbmNlVG9TcXVhcmVkOiBmdW5jdGlvbiAoIHYgKSB7CisK
KyAgICAgICAgICAgIHZhciBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2Lnk7Cisg
ICAgICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7CisKKyAgICAgICAgfSwKKworICAg
ICAgICBkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7CisKKyAgICAgICAgICAg
IHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55
ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3Ro
ICkgeworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxh
ciggbGVuZ3RoICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBsZXJwOiBmdW5jdGlvbiAoIHYs
IGFscGhhICkgeworCisgICAgICAgICAgICB0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFs
cGhhOworICAgICAgICAgICAgdGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTsKKwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBsZXJwVmVj
dG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkgeworCisgICAgICAgICAgICByZXR1cm4g
dGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYx
ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBlcXVhbHM6IGZ1bmN0aW9uICggdiApIHsKKwor
ICAgICAgICAgICAgcmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlz
LnkgKSApOworCisgICAgICAgIH0sCisKKyAgICAgICAgZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFy
cmF5LCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAgIGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQg
KSBvZmZzZXQgPSAwOworCisgICAgICAgICAgICB0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07Cisg
ICAgICAgICAgICB0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdOworCisgICAgICAgICAgICBy
ZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHRvQXJyYXk6IGZ1bmN0aW9uICgg
YXJyYXksIG9mZnNldCApIHsKKworICAgICAgICAgICAgaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVk
ICkgYXJyYXkgPSBbXTsKKyAgICAgICAgICAgIGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBv
ZmZzZXQgPSAwOworCisgICAgICAgICAgICBhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7CisgICAg
ICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55OworCisgICAgICAgICAgICByZXR1
cm4gYXJyYXk7CisKKyAgICAgICAgfSwKKworICAgICAgICBmcm9tQnVmZmVyQXR0cmlidXRlOiBm
dW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHsKKworICAgICAgICAgICAgaWYg
KCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fy
biggJ1RIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZm
ZXJBdHRyaWJ1dGUoKS4nICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy54
ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7CisgICAgICAgICAgICB0aGlzLnkgPSBhdHRyaWJ1
dGUuZ2V0WSggaW5kZXggKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAg
fSwKKworICAgICAgICByb3RhdGVBcm91bmQ6IGZ1bmN0aW9uICggY2VudGVyLCBhbmdsZSApIHsK
KworICAgICAgICAgICAgdmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKSwgcyA9IE1hdGguc2luKCBh
bmdsZSApOworCisgICAgICAgICAgICB2YXIgeCA9IHRoaXMueCAtIGNlbnRlci54OworICAgICAg
ICAgICAgdmFyIHkgPSB0aGlzLnkgLSBjZW50ZXIueTsKKworICAgICAgICAgICAgdGhpcy54ID0g
eCAqIGMgLSB5ICogcyArIGNlbnRlci54OworICAgICAgICAgICAgdGhpcy55ID0geCAqIHMgKyB5
ICogYyArIGNlbnRlci55OworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9
CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9t
cmRvb2IuY29tLworICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxp
YS5jb20vCisgICAgICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVr
LworICAgICAqLworCisgICAgdmFyIHRleHR1cmVJZCA9IDA7CisKKyAgICBmdW5jdGlvbiBUZXh0
dXJlKCBpbWFnZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwg
Zm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHsKKworICAgICAgICBPYmplY3Qu
ZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IHRleHR1cmVJZCArKyB9ICk7CisK
KyAgICAgICAgdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CisKKyAgICAgICAgdGhp
cy5uYW1lID0gJyc7CisKKyAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlICE9PSB1bmRlZmluZWQg
PyBpbWFnZSA6IFRleHR1cmUuREVGQVVMVF9JTUFHRTsKKyAgICAgICAgdGhpcy5taXBtYXBzID0g
W107CisKKyAgICAgICAgdGhpcy5tYXBwaW5nID0gbWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFw
cGluZyA6IFRleHR1cmUuREVGQVVMVF9NQVBQSU5HOworCisgICAgICAgIHRoaXMud3JhcFMgPSB3
cmFwUyAhPT0gdW5kZWZpbmVkID8gd3JhcFMgOiBDbGFtcFRvRWRnZVdyYXBwaW5nOworICAgICAg
ICB0aGlzLndyYXBUID0gd3JhcFQgIT09IHVuZGVmaW5lZCA/IHdyYXBUIDogQ2xhbXBUb0VkZ2VX
cmFwcGluZzsKKworICAgICAgICB0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZp
bmVkID8gbWFnRmlsdGVyIDogTGluZWFyRmlsdGVyOworICAgICAgICB0aGlzLm1pbkZpbHRlciA9
IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTGluZWFyTWlwTWFwTGluZWFy
RmlsdGVyOworCisgICAgICAgIHRoaXMuYW5pc290cm9weSA9IGFuaXNvdHJvcHkgIT09IHVuZGVm
aW5lZCA/IGFuaXNvdHJvcHkgOiAxOworCisgICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0ICE9
PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBSR0JBRm9ybWF0OworICAgICAgICB0aGlzLnR5cGUgPSB0
eXBlICE9PSB1bmRlZmluZWQgPyB0eXBlIDogVW5zaWduZWRCeXRlVHlwZTsKKworICAgICAgICB0
aGlzLm9mZnNldCA9IG5ldyBWZWN0b3IyKCAwLCAwICk7CisgICAgICAgIHRoaXMucmVwZWF0ID0g
bmV3IFZlY3RvcjIoIDEsIDEgKTsKKworICAgICAgICB0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHRy
dWU7CisgICAgICAgIHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IGZhbHNlOworICAgICAgICB0aGlz
LmZsaXBZID0gdHJ1ZTsKKyAgICAgICAgdGhpcy51bnBhY2tBbGlnbm1lbnQgPSA0OyAgIC8vIHZh
bGlkIHZhbHVlczogMSwgMiwgNCwgOCAoc2VlIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvb3Blbmds
ZXMvc2RrL2RvY3MvbWFuL3hodG1sL2dsUGl4ZWxTdG9yZWkueG1sKQorCisgICAgICAgIC8vIFZh
bHVlcyBvZiBlbmNvZGluZyAhPT0gVEhSRUUuTGluZWFyRW5jb2Rpbmcgb25seSBzdXBwb3J0ZWQg
b24gbWFwLCBlbnZNYXAgYW5kIGVtaXNzaXZlTWFwLgorICAgICAgICAvLworICAgICAgICAvLyBB
bHNvIGNoYW5naW5nIHRoZSBlbmNvZGluZyBhZnRlciBhbHJlYWR5IHVzZWQgYnkgYSBNYXRlcmlh
bCB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IG1ha2UgdGhlIE1hdGVyaWFsCisgICAgICAgIC8vIHVw
ZGF0ZS4gIFlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCBNYXRlcmlhbC5uZWVkc1VwZGF0ZSB0
byB0cmlnZ2VyIGl0IHRvIHJlY29tcGlsZS4KKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29k
aW5nICE9PSB1bmRlZmluZWQgPyBlbmNvZGluZyA6IExpbmVhckVuY29kaW5nOworCisgICAgICAg
IHRoaXMudmVyc2lvbiA9IDA7CisgICAgICAgIHRoaXMub25VcGRhdGUgPSBudWxsOworCisgICAg
fQorCisgICAgVGV4dHVyZS5ERUZBVUxUX0lNQUdFID0gdW5kZWZpbmVkOworICAgIFRleHR1cmUu
REVGQVVMVF9NQVBQSU5HID0gVVZNYXBwaW5nOworCisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5
KCBUZXh0dXJlLnByb3RvdHlwZSwgIm5lZWRzVXBkYXRlIiwgeworCisgICAgICAgIHNldDogZnVu
Y3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRo
aXMudmVyc2lvbiArKzsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICBPYmplY3QuYXNz
aWduKCBUZXh0dXJlLnByb3RvdHlwZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwgeworCisg
ICAgICAgIGNvbnN0cnVjdG9yOiBUZXh0dXJlLAorCisgICAgICAgIGlzVGV4dHVyZTogdHJ1ZSwK
KworICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICByZXR1cm4gbmV3
IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisKKyAgICAgICAgfSwKKworICAgICAg
ICBjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworICAgICAgICAgICAgdGhpcy5uYW1lID0g
c291cmNlLm5hbWU7CisKKyAgICAgICAgICAgIHRoaXMuaW1hZ2UgPSBzb3VyY2UuaW1hZ2U7Cisg
ICAgICAgICAgICB0aGlzLm1pcG1hcHMgPSBzb3VyY2UubWlwbWFwcy5zbGljZSggMCApOworCisg
ICAgICAgICAgICB0aGlzLm1hcHBpbmcgPSBzb3VyY2UubWFwcGluZzsKKworICAgICAgICAgICAg
dGhpcy53cmFwUyA9IHNvdXJjZS53cmFwUzsKKyAgICAgICAgICAgIHRoaXMud3JhcFQgPSBzb3Vy
Y2Uud3JhcFQ7CisKKyAgICAgICAgICAgIHRoaXMubWFnRmlsdGVyID0gc291cmNlLm1hZ0ZpbHRl
cjsKKyAgICAgICAgICAgIHRoaXMubWluRmlsdGVyID0gc291cmNlLm1pbkZpbHRlcjsKKworICAg
ICAgICAgICAgdGhpcy5hbmlzb3Ryb3B5ID0gc291cmNlLmFuaXNvdHJvcHk7CisKKyAgICAgICAg
ICAgIHRoaXMuZm9ybWF0ID0gc291cmNlLmZvcm1hdDsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9
IHNvdXJjZS50eXBlOworCisgICAgICAgICAgICB0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uub2Zm
c2V0ICk7CisgICAgICAgICAgICB0aGlzLnJlcGVhdC5jb3B5KCBzb3VyY2UucmVwZWF0ICk7CisK
KyAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gc291cmNlLmdlbmVyYXRlTWlwbWFw
czsKKyAgICAgICAgICAgIHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBs
eUFscGhhOworICAgICAgICAgICAgdGhpcy5mbGlwWSA9IHNvdXJjZS5mbGlwWTsKKyAgICAgICAg
ICAgIHRoaXMudW5wYWNrQWxpZ25tZW50ID0gc291cmNlLnVucGFja0FsaWdubWVudDsKKyAgICAg
ICAgICAgIHRoaXMuZW5jb2RpbmcgPSBzb3VyY2UuZW5jb2Rpbmc7CisKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgdG9KU09OOiBmdW5jdGlvbiAoIG1l
dGEgKSB7CisKKyAgICAgICAgICAgIGlmICggbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gIT09
IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIHJldHVybiBtZXRhLnRleHR1cmVzWyB0
aGlzLnV1aWQgXTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdW5jdGlvbiBnZXRE
YXRhVVJMKCBpbWFnZSApIHsKKworICAgICAgICAgICAgICAgIHZhciBjYW52YXM7CisKKyAgICAg
ICAgICAgICAgICBpZiAoIGltYWdlLnRvRGF0YVVSTCAhPT0gdW5kZWZpbmVkICkgeworCisgICAg
ICAgICAgICAgICAgICAgIGNhbnZhcyA9IGltYWdlOworCisgICAgICAgICAgICAgICAgfSBlbHNl
IHsKKworICAgICAgICAgICAgICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTsKKyAgICAgICAg
ICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7CisgICAgICAgICAgICAgICAg
ICAgIGNhbnZhcy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7CisKKyAgICAgICAgICAgICAgICAgICAg
Y2FudmFzLmdldENvbnRleHQoICcyZCcgKS5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53
aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICBpZiAoIGNhbnZhcy53aWR0aCA+IDIwNDggfHwgY2FudmFzLmhlaWdodCA+IDIwNDggKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoICdpbWFnZS9q
cGVnJywgMC42ICk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvcG5nJyApOworCisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBvdXRwdXQgPSB7
CisgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHsKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lv
bjogNC41LAorICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVGV4dHVyZScsCisgICAgICAgICAg
ICAgICAgICAgIGdlbmVyYXRvcjogJ1RleHR1cmUudG9KU09OJworICAgICAgICAgICAgICAgIH0s
CisKKyAgICAgICAgICAgICAgICB1dWlkOiB0aGlzLnV1aWQsCisgICAgICAgICAgICAgICAgbmFt
ZTogdGhpcy5uYW1lLAorCisgICAgICAgICAgICAgICAgbWFwcGluZzogdGhpcy5tYXBwaW5nLAor
CisgICAgICAgICAgICAgICAgcmVwZWF0OiBbIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0Lnkg
XSwKKyAgICAgICAgICAgICAgICBvZmZzZXQ6IFsgdGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQu
eSBdLAorICAgICAgICAgICAgICAgIHdyYXA6IFsgdGhpcy53cmFwUywgdGhpcy53cmFwVCBdLAor
CisgICAgICAgICAgICAgICAgbWluRmlsdGVyOiB0aGlzLm1pbkZpbHRlciwKKyAgICAgICAgICAg
ICAgICBtYWdGaWx0ZXI6IHRoaXMubWFnRmlsdGVyLAorICAgICAgICAgICAgICAgIGFuaXNvdHJv
cHk6IHRoaXMuYW5pc290cm9weSwKKworICAgICAgICAgICAgICAgIGZsaXBZOiB0aGlzLmZsaXBZ
CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZiAoIHRoaXMuaW1hZ2UgIT09IHVuZGVm
aW5lZCApIHsKKworICAgICAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdG8gVEhSRUUuSW1hZ2UK
KworICAgICAgICAgICAgICAgIHZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7CisKKyAgICAgICAgICAg
ICAgICBpZiAoIGltYWdlLnV1aWQgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAg
ICAgICBpbWFnZS51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7IC8vIFVHSAorCisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBtZXRhLmltYWdlc1sgaW1hZ2UudXVp
ZCBdID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgbWV0YS5pbWFnZXNb
IGltYWdlLnV1aWQgXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQ6IGltYWdlLnV1
aWQsCisgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGdldERhdGFVUkwoIGltYWdlICkKKyAg
ICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIG91dHB1dC5pbWFnZSA9IGltYWdlLnV1aWQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gPSBvdXRwdXQ7CisKKyAgICAgICAgICAg
IHJldHVybiBvdXRwdXQ7CisKKyAgICAgICAgfSwKKworICAgICAgICBkaXNwb3NlOiBmdW5jdGlv
biAoKSB7CisKKyAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9z
ZScgfSApOworCisgICAgICAgIH0sCisKKyAgICAgICAgdHJhbnNmb3JtVXY6IGZ1bmN0aW9uICgg
dXYgKSB7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5tYXBwaW5nICE9PSBVVk1hcHBpbmcgKSBy
ZXR1cm47CisKKyAgICAgICAgICAgIHV2Lm11bHRpcGx5KCB0aGlzLnJlcGVhdCApOworICAgICAg
ICAgICAgdXYuYWRkKCB0aGlzLm9mZnNldCApOworCisgICAgICAgICAgICBpZiAoIHV2LnggPCAw
IHx8IHV2LnggPiAxICkgeworCisgICAgICAgICAgICAgICAgc3dpdGNoICggdGhpcy53cmFwUyAp
IHsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlcGVhdFdyYXBwaW5nOgorCisgICAgICAg
ICAgICAgICAgICAgICAgICB1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xh
bXBUb0VkZ2VXcmFwcGluZzoKKworICAgICAgICAgICAgICAgICAgICAgICAgdXYueCA9IHV2Lngg
PCAwID8gMCA6IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAg
ICAgICAgICAgICBjYXNlIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnggKSAlIDIgKSA9PT0gMSAp
IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2LnggPSBNYXRoLmNlaWwoIHV2Lngg
KSAtIHV2Lng7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYg
KCB1di55IDwgMCB8fCB1di55ID4gMSApIHsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoIHRo
aXMud3JhcFQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXBlYXRXcmFwcGluZzoK
KworICAgICAgICAgICAgICAgICAgICAgICAgdXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55
ICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAg
ICBjYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHV2
LnkgPSB1di55IDwgMCA/IDAgOiAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisK
KyAgICAgICAgICAgICAgICAgICAgY2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOgorCisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIE1hdGguYWJzKCBNYXRoLmZsb29yKCB1di55ICkgJSAy
ICkgPT09IDEgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1di55ID0gTWF0aC5j
ZWlsKCB1di55ICkgLSB1di55OworCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugewor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1
di55ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGlmICggdGhpcy5mbGlwWSApIHsKKworICAgICAgICAgICAgICAgIHV2LnkgPSAxIC0g
dXYueTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8q
KgorICAgICAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28u
dWsvCisgICAgICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy8KKyAg
ICAgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLworICAgICAqIEBh
dXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vCisgICAgICogQGF1dGhvciBX
ZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisgICAgICovCisKKyAg
ICBmdW5jdGlvbiBWZWN0b3I0KCB4LCB5LCB6LCB3ICkgeworCisgICAgICAgIHRoaXMueCA9IHgg
fHwgMDsKKyAgICAgICAgdGhpcy55ID0geSB8fCAwOworICAgICAgICB0aGlzLnogPSB6IHx8IDA7
CisgICAgICAgIHRoaXMudyA9ICggdyAhPT0gdW5kZWZpbmVkICkgPyB3IDogMTsKKworICAgIH0K
KworICAgIE9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7CisKKyAgICAgICAgaXNW
ZWN0b3I0OiB0cnVlLAorCisgICAgICAgIHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkgewor
CisgICAgICAgICAgICB0aGlzLnggPSB4OworICAgICAgICAgICAgdGhpcy55ID0geTsKKyAgICAg
ICAgICAgIHRoaXMueiA9IHo7CisgICAgICAgICAgICB0aGlzLncgPSB3OworCisgICAgICAgICAg
ICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNldFNjYWxhcjogZnVuY3Rp
b24gKCBzY2FsYXIgKSB7CisKKyAgICAgICAgICAgIHRoaXMueCA9IHNjYWxhcjsKKyAgICAgICAg
ICAgIHRoaXMueSA9IHNjYWxhcjsKKyAgICAgICAgICAgIHRoaXMueiA9IHNjYWxhcjsKKyAgICAg
ICAgICAgIHRoaXMudyA9IHNjYWxhcjsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBzZXRYOiBmdW5jdGlvbiAoIHggKSB7CisKKyAgICAgICAgICAg
IHRoaXMueCA9IHg7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisK
KyAgICAgICAgc2V0WTogZnVuY3Rpb24gKCB5ICkgeworCisgICAgICAgICAgICB0aGlzLnkgPSB5
OworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNl
dFo6IGZ1bmN0aW9uICggeiApIHsKKworICAgICAgICAgICAgdGhpcy56ID0gejsKKworICAgICAg
ICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRXOiBmdW5jdGlv
biAoIHcgKSB7CisKKyAgICAgICAgICAgIHRoaXMudyA9IHc7CisKKyAgICAgICAgICAgIHJldHVy
biB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0Q29tcG9uZW50OiBmdW5jdGlvbiAo
IGluZGV4LCB2YWx1ZSApIHsKKworICAgICAgICAgICAgc3dpdGNoICggaW5kZXggKSB7CisKKyAg
ICAgICAgICAgICAgICBjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhazsKKyAgICAgICAgICAg
ICAgICBjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNl
IDI6IHRoaXMueiA9IHZhbHVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHRoaXMu
dyA9IHZhbHVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJy
b3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0
Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisgICAgICAgICAgICBzd2l0Y2ggKCBp
bmRleCApIHsKKworICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIHRoaXMueDsKKyAgICAg
ICAgICAgICAgICBjYXNlIDE6IHJldHVybiB0aGlzLnk7CisgICAgICAgICAgICAgICAgY2FzZSAy
OiByZXR1cm4gdGhpcy56OworICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRoaXMudzsK
KyAgICAgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQg
b2YgcmFuZ2U6ICcgKyBpbmRleCApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSwKKwor
ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICByZXR1cm4gbmV3IHRo
aXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyApOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgY29weTogZnVuY3Rpb24gKCB2ICkgeworCisgICAgICAgICAgICB0
aGlzLnggPSB2Lng7CisgICAgICAgICAgICB0aGlzLnkgPSB2Lnk7CisgICAgICAgICAgICB0aGlz
LnogPSB2Lno7CisgICAgICAgICAgICB0aGlzLncgPSAoIHYudyAhPT0gdW5kZWZpbmVkICkgPyB2
LncgOiAxOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAg
ICAgIGFkZDogZnVuY3Rpb24gKCB2LCB3ICkgeworCisgICAgICAgICAgICBpZiAoIHcgIT09IHVu
ZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3Rv
cjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3Jz
KCBhLCBiICkgaW5zdGVhZC4nICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkVmVj
dG9ycyggdiwgdyApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMueCArPSB2
Lng7CisgICAgICAgICAgICB0aGlzLnkgKz0gdi55OworICAgICAgICAgICAgdGhpcy56ICs9IHYu
ejsKKyAgICAgICAgICAgIHRoaXMudyArPSB2Lnc7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlz
OworCisgICAgICAgIH0sCisKKyAgICAgICAgYWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CisK
KyAgICAgICAgICAgIHRoaXMueCArPSBzOworICAgICAgICAgICAgdGhpcy55ICs9IHM7CisgICAg
ICAgICAgICB0aGlzLnogKz0gczsKKyAgICAgICAgICAgIHRoaXMudyArPSBzOworCisgICAgICAg
ICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGFkZFZlY3RvcnM6IGZ1
bmN0aW9uICggYSwgYiApIHsKKworICAgICAgICAgICAgdGhpcy54ID0gYS54ICsgYi54OworICAg
ICAgICAgICAgdGhpcy55ID0gYS55ICsgYi55OworICAgICAgICAgICAgdGhpcy56ID0gYS56ICsg
Yi56OworICAgICAgICAgICAgdGhpcy53ID0gYS53ICsgYi53OworCisgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rp
b24gKCB2LCBzICkgeworCisgICAgICAgICAgICB0aGlzLnggKz0gdi54ICogczsKKyAgICAgICAg
ICAgIHRoaXMueSArPSB2LnkgKiBzOworICAgICAgICAgICAgdGhpcy56ICs9IHYueiAqIHM7Cisg
ICAgICAgICAgICB0aGlzLncgKz0gdi53ICogczsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7
CisKKyAgICAgICAgfSwKKworICAgICAgICBzdWI6IGZ1bmN0aW9uICggdiwgdyApIHsKKworICAg
ICAgICAgICAgaWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICBjb25z
b2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJn
dW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOworICAgICAgICAgICAg
ICAgIHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB0aGlzLnggLT0gdi54OworICAgICAgICAgICAgdGhpcy55IC09IHYueTsKKyAg
ICAgICAgICAgIHRoaXMueiAtPSB2Lno7CisgICAgICAgICAgICB0aGlzLncgLT0gdi53OworCisg
ICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHN1YlNjYWxh
cjogZnVuY3Rpb24gKCBzICkgeworCisgICAgICAgICAgICB0aGlzLnggLT0gczsKKyAgICAgICAg
ICAgIHRoaXMueSAtPSBzOworICAgICAgICAgICAgdGhpcy56IC09IHM7CisgICAgICAgICAgICB0
aGlzLncgLT0gczsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKwor
ICAgICAgICBzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CisKKyAgICAgICAgICAgIHRo
aXMueCA9IGEueCAtIGIueDsKKyAgICAgICAgICAgIHRoaXMueSA9IGEueSAtIGIueTsKKyAgICAg
ICAgICAgIHRoaXMueiA9IGEueiAtIGIuejsKKyAgICAgICAgICAgIHRoaXMudyA9IGEudyAtIGIu
dzsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBt
dWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CisKKyAgICAgICAgICAgIHRoaXMu
eCAqPSBzY2FsYXI7CisgICAgICAgICAgICB0aGlzLnkgKj0gc2NhbGFyOworICAgICAgICAgICAg
dGhpcy56ICo9IHNjYWxhcjsKKyAgICAgICAgICAgIHRoaXMudyAqPSBzY2FsYXI7CisKKyAgICAg
ICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgYXBwbHlNYXRyaXg0
OiBmdW5jdGlvbiAoIG0gKSB7CisKKyAgICAgICAgICAgIHZhciB4ID0gdGhpcy54LCB5ID0gdGhp
cy55LCB6ID0gdGhpcy56LCB3ID0gdGhpcy53OworICAgICAgICAgICAgdmFyIGUgPSBtLmVsZW1l
bnRzOworCisgICAgICAgICAgICB0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVb
IDggXSAqIHogKyBlWyAxMiBdICogdzsKKyAgICAgICAgICAgIHRoaXMueSA9IGVbIDEgXSAqIHgg
KyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKiB3OworICAgICAgICAgICAgdGhp
cy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKiB3
OworICAgICAgICAgICAgdGhpcy53ID0gZVsgMyBdICogeCArIGVbIDcgXSAqIHkgKyBlWyAxMSBd
ICogeiArIGVbIDE1IF0gKiB3OworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAg
ICB9LAorCisgICAgICAgIGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CisKKyAg
ICAgICAgICAgIHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24g
KCBxICkgeworCisgICAgICAgICAgICAvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9t
YXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvcXVhdGVybmlvblRvQW5nbGUvaW5k
ZXguaHRtCisKKyAgICAgICAgICAgIC8vIHEgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkCisK
KyAgICAgICAgICAgIHRoaXMudyA9IDIgKiBNYXRoLmFjb3MoIHEudyApOworCisgICAgICAgICAg
ICB2YXIgcyA9IE1hdGguc3FydCggMSAtIHEudyAqIHEudyApOworCisgICAgICAgICAgICBpZiAo
IHMgPCAwLjAwMDEgKSB7CisKKyAgICAgICAgICAgICAgICAgdGhpcy54ID0gMTsKKyAgICAgICAg
ICAgICAgICAgdGhpcy55ID0gMDsKKyAgICAgICAgICAgICAgICAgdGhpcy56ID0gMDsKKworICAg
ICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICB0aGlzLnggPSBxLnggLyBzOwor
ICAgICAgICAgICAgICAgICB0aGlzLnkgPSBxLnkgLyBzOworICAgICAgICAgICAgICAgICB0aGlz
LnogPSBxLnogLyBzOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlz
OworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4
OiBmdW5jdGlvbiAoIG0gKSB7CisKKyAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFu
c3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb0Fu
Z2xlL2luZGV4Lmh0bQorCisgICAgICAgICAgICAvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2Yg
bSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKQorCisgICAgICAgICAg
ICB2YXIgYW5nbGUsIHgsIHksIHosICAgICAvLyB2YXJpYWJsZXMgZm9yIHJlc3VsdAorICAgICAg
ICAgICAgICAgIGVwc2lsb24gPSAwLjAxLCAgICAgLy8gbWFyZ2luIHRvIGFsbG93IGZvciByb3Vu
ZGluZyBlcnJvcnMKKyAgICAgICAgICAgICAgICBlcHNpbG9uMiA9IDAuMSwgICAgIC8vIG1hcmdp
biB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDAgYW5kIDE4MCBkZWdyZWVzCisKKyAgICAgICAgICAg
ICAgICB0ZSA9IG0uZWxlbWVudHMsCisKKyAgICAgICAgICAgICAgICBtMTEgPSB0ZVsgMCBdLCBt
MTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLAorICAgICAgICAgICAgICAgIG0yMSA9IHRlWyAx
IF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sCisgICAgICAgICAgICAgICAgbTMxID0g
dGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF07CisKKyAgICAgICAgICAgIGlm
ICggKCBNYXRoLmFicyggbTEyIC0gbTIxICkgPCBlcHNpbG9uICkgJiYKKyAgICAgICAgICAgICAg
ICAgKCBNYXRoLmFicyggbTEzIC0gbTMxICkgPCBlcHNpbG9uICkgJiYKKyAgICAgICAgICAgICAg
ICAgKCBNYXRoLmFicyggbTIzIC0gbTMyICkgPCBlcHNpbG9uICkgKSB7CisKKyAgICAgICAgICAg
ICAgICAvLyBzaW5ndWxhcml0eSBmb3VuZAorICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNoZWNr
IGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXMKKyAg
ICAgICAgICAgICAgICAvLyBpbiBsZWFkaW5nIGRpYWdvbmFsIGFuZCB6ZXJvIGluIG90aGVyIHRl
cm1zCisKKyAgICAgICAgICAgICAgICBpZiAoICggTWF0aC5hYnMoIG0xMiArIG0yMSApIDwgZXBz
aWxvbjIgKSAmJgorICAgICAgICAgICAgICAgICAgICAgKCBNYXRoLmFicyggbTEzICsgbTMxICkg
PCBlcHNpbG9uMiApICYmCisgICAgICAgICAgICAgICAgICAgICAoIE1hdGguYWJzKCBtMjMgKyBt
MzIgKSA8IGVwc2lsb24yICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICggTWF0aC5hYnMoIG0x
MSArIG0yMiArIG0zMyAtIDMgKSA8IGVwc2lsb24yICkgKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgLy8gdGhpcyBzaW5ndWxhcml0eSBpcyBpZGVudGl0eSBtYXRyaXggc28gYW5nbGUgPSAwCisK
KyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoIDEsIDAsIDAsIDAgKTsKKworICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gemVybyBhbmdsZSwgYXJiaXRyYXJ5IGF4aXMKKwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGlzIHNp
bmd1bGFyaXR5IGlzIGFuZ2xlID0gMTgwCisKKyAgICAgICAgICAgICAgICBhbmdsZSA9IE1hdGgu
UEk7CisKKyAgICAgICAgICAgICAgICB2YXIgeHggPSAoIG0xMSArIDEgKSAvIDI7CisgICAgICAg
ICAgICAgICAgdmFyIHl5ID0gKCBtMjIgKyAxICkgLyAyOworICAgICAgICAgICAgICAgIHZhciB6
eiA9ICggbTMzICsgMSApIC8gMjsKKyAgICAgICAgICAgICAgICB2YXIgeHkgPSAoIG0xMiArIG0y
MSApIC8gNDsKKyAgICAgICAgICAgICAgICB2YXIgeHogPSAoIG0xMyArIG0zMSApIC8gNDsKKyAg
ICAgICAgICAgICAgICB2YXIgeXogPSAoIG0yMyArIG0zMiApIC8gNDsKKworICAgICAgICAgICAg
ICAgIGlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgLy8gbTExIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm0KKworICAgICAgICAgICAg
ICAgICAgICBpZiAoIHh4IDwgZXBzaWxvbiApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
eCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMC43MDcxMDY3ODE7CisgICAgICAg
ICAgICAgICAgICAgICAgICB6ID0gMC43MDcxMDY3ODE7CisKKyAgICAgICAgICAgICAgICAgICAg
fSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IE1hdGguc3FydCggeHggKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB4eSAvIHg7CisgICAgICAgICAgICAgICAgICAg
ICAgICB6ID0geHogLyB4OworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIH0gZWxzZSBpZiAoIHl5ID4genogKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbTIy
IGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm0KKworICAgICAgICAgICAgICAgICAgICBpZiAo
IHl5IDwgZXBzaWxvbiApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDAuNzA3MTA2
NzgxOworICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDA7CisgICAgICAgICAgICAgICAgICAg
ICAgICB6ID0gMC43MDcxMDY3ODE7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgeSA9IE1hdGguc3FydCggeXkgKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHggPSB4eSAvIHk7CisgICAgICAgICAgICAgICAgICAgICAgICB6ID0geXog
LyB5OworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7
CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbTMzIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRl
cm0gc28gYmFzZSByZXN1bHQgb24gdGhpcworCisgICAgICAgICAgICAgICAgICAgIGlmICggenog
PCBlcHNpbG9uICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMC43MDcxMDY3ODE7
CisgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMC43MDcxMDY3ODE7CisgICAgICAgICAgICAg
ICAgICAgICAgICB6ID0gMDsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICB6ID0gTWF0aC5zcXJ0KCB6eiApOworICAgICAgICAgICAgICAg
ICAgICAgICAgeCA9IHh6IC8gejsKKyAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5eiAvIHo7
CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgdGhpcy5zZXQoIHgsIHksIHosIGFuZ2xlICk7CisKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gdGhpczsgLy8gcmV0dXJuIDE4MCBkZWcgcm90YXRpb24KKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAvLyBhcyB3ZSBoYXZlIHJlYWNoZWQgaGVyZSB0aGVyZSBhcmUgbm8gc2lu
Z3VsYXJpdGllcyBzbyB3ZSBjYW4gaGFuZGxlIG5vcm1hbGx5CisKKyAgICAgICAgICAgIHZhciBz
ID0gTWF0aC5zcXJ0KCAoIG0zMiAtIG0yMyApICogKCBtMzIgLSBtMjMgKSArCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKCBtMTMgLSBtMzEgKSAqICggbTEzIC0gbTMxICkgKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICggbTIxIC0gbTEyICkgKiAoIG0yMSAtIG0xMiAp
ICk7IC8vIHVzZWQgdG8gbm9ybWFsaXplCisKKyAgICAgICAgICAgIGlmICggTWF0aC5hYnMoIHMg
KSA8IDAuMDAxICkgcyA9IDE7CisKKyAgICAgICAgICAgIC8vIHByZXZlbnQgZGl2aWRlIGJ5IHpl
cm8sIHNob3VsZCBub3QgaGFwcGVuIGlmIG1hdHJpeCBpcyBvcnRob2dvbmFsIGFuZCBzaG91bGQg
YmUKKyAgICAgICAgICAgIC8vIGNhdWdodCBieSBzaW5ndWxhcml0eSB0ZXN0IGFib3ZlLCBidXQg
SSd2ZSBsZWZ0IGl0IGluIGp1c3QgaW4gY2FzZQorCisgICAgICAgICAgICB0aGlzLnggPSAoIG0z
MiAtIG0yMyApIC8gczsKKyAgICAgICAgICAgIHRoaXMueSA9ICggbTEzIC0gbTMxICkgLyBzOwor
ICAgICAgICAgICAgdGhpcy56ID0gKCBtMjEgLSBtMTIgKSAvIHM7CisgICAgICAgICAgICB0aGlz
LncgPSBNYXRoLmFjb3MoICggbTExICsgbTIyICsgbTMzIC0gMSApIC8gMiApOworCisgICAgICAg
ICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIG1pbjogZnVuY3Rpb24g
KCB2ICkgeworCisgICAgICAgICAgICB0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTsK
KyAgICAgICAgICAgIHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApOworICAgICAgICAg
ICAgdGhpcy56ID0gTWF0aC5taW4oIHRoaXMueiwgdi56ICk7CisgICAgICAgICAgICB0aGlzLncg
PSBNYXRoLm1pbiggdGhpcy53LCB2LncgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisK
KyAgICAgICAgfSwKKworICAgICAgICBtYXg6IGZ1bmN0aW9uICggdiApIHsKKworICAgICAgICAg
ICAgdGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7CisgICAgICAgICAgICB0aGlzLnkg
PSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTsKKyAgICAgICAgICAgIHRoaXMueiA9IE1hdGgubWF4
KCB0aGlzLnosIHYueiApOworICAgICAgICAgICAgdGhpcy53ID0gTWF0aC5tYXgoIHRoaXMudywg
di53ICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAg
ICAgY2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7CisKKyAgICAgICAgICAgIC8vIGFzc3Vt
ZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlCisKKyAgICAgICAgICAgIHRoaXMueCA9IE1hdGgu
bWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApOworICAgICAgICAgICAgdGhp
cy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7CisgICAg
ICAgICAgICB0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56
ICkgKTsKKyAgICAgICAgICAgIHRoaXMudyA9IE1hdGgubWF4KCBtaW4udywgTWF0aC5taW4oIG1h
eC53LCB0aGlzLncgKSApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9
LAorCisgICAgICAgIGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZh
ciBtaW4sIG1heDsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBt
aW5WYWwsIG1heFZhbCApIHsKKworICAgICAgICAgICAgICAgIGlmICggbWluID09PSB1bmRlZmlu
ZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgbWluID0gbmV3IFZlY3RvcjQoKTsKKyAgICAg
ICAgICAgICAgICAgICAgbWF4ID0gbmV3IFZlY3RvcjQoKTsKKworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIG1pbi5zZXQoIG1pblZhbCwgbWluVmFsLCBtaW5WYWwsIG1pblZh
bCApOworICAgICAgICAgICAgICAgIG1heC5zZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwsIG1h
eFZhbCApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7
CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIGNsYW1wTGVuZ3Ro
OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkgeworCisgICAgICAgICAgICB2YXIgbGVuZ3RoID0gdGhp
cy5sZW5ndGgoKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5n
dGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBs
ZW5ndGggKSApICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBmbG9vcjogZnVuY3Rpb24gKCkg
eworCisgICAgICAgICAgICB0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTsKKyAgICAgICAg
ICAgIHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApOworICAgICAgICAgICAgdGhpcy56ID0g
TWF0aC5mbG9vciggdGhpcy56ICk7CisgICAgICAgICAgICB0aGlzLncgPSBNYXRoLmZsb29yKCB0
aGlzLncgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAg
ICAgICBjZWlsOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHRoaXMueCA9IE1hdGguY2Vp
bCggdGhpcy54ICk7CisgICAgICAgICAgICB0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApOwor
ICAgICAgICAgICAgdGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTsKKyAgICAgICAgICAgIHRo
aXMudyA9IE1hdGguY2VpbCggdGhpcy53ICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgcm91bmQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAg
ICAgdGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7CisgICAgICAgICAgICB0aGlzLnkgPSBN
YXRoLnJvdW5kKCB0aGlzLnkgKTsKKyAgICAgICAgICAgIHRoaXMueiA9IE1hdGgucm91bmQoIHRo
aXMueiApOworICAgICAgICAgICAgdGhpcy53ID0gTWF0aC5yb3VuZCggdGhpcy53ICk7CisKKyAg
ICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgcm91bmRUb1pl
cm86IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdGhpcy54ID0gKCB0aGlzLnggPCAwICkg
PyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7CisgICAgICAgICAg
ICB0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZs
b29yKCB0aGlzLnkgKTsKKyAgICAgICAgICAgIHRoaXMueiA9ICggdGhpcy56IDwgMCApID8gTWF0
aC5jZWlsKCB0aGlzLnogKSA6IE1hdGguZmxvb3IoIHRoaXMueiApOworICAgICAgICAgICAgdGhp
cy53ID0gKCB0aGlzLncgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMudyApIDogTWF0aC5mbG9vcigg
dGhpcy53ICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgbmVnYXRlOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHRoaXMueCA9IC0gdGhp
cy54OworICAgICAgICAgICAgdGhpcy55ID0gLSB0aGlzLnk7CisgICAgICAgICAgICB0aGlzLnog
PSAtIHRoaXMuejsKKyAgICAgICAgICAgIHRoaXMudyA9IC0gdGhpcy53OworCisgICAgICAgICAg
ICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGRvdDogZnVuY3Rpb24gKCB2
ICkgeworCisgICAgICAgICAgICByZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsg
dGhpcy56ICogdi56ICsgdGhpcy53ICogdi53OworCisgICAgICAgIH0sCisKKyAgICAgICAgbGVu
Z3RoU3E6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMueCAqIHRoaXMu
eCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudzsK
KworICAgICAgICB9LAorCisgICAgICAgIGxlbmd0aDogZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICByZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkg
KyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLncgKTsKKworICAgICAgICB9LAorCisg
ICAgICAgIGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICByZXR1
cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRo
aXMueiApICsgTWF0aC5hYnMoIHRoaXMudyApOworCisgICAgICAgIH0sCisKKyAgICAgICAgbm9y
bWFsaXplOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmRpdmlkZVNj
YWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRM
ZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkgeworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5u
b3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7CisKKyAgICAgICAgfSwKKworICAg
ICAgICBsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkgeworCisgICAgICAgICAgICB0aGlzLngg
Kz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhOworICAgICAgICAgICAgdGhpcy55ICs9ICggdi55
IC0gdGhpcy55ICkgKiBhbHBoYTsKKyAgICAgICAgICAgIHRoaXMueiArPSAoIHYueiAtIHRoaXMu
eiApICogYWxwaGE7CisgICAgICAgICAgICB0aGlzLncgKz0gKCB2LncgLSB0aGlzLncgKSAqIGFs
cGhhOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAg
IGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSAp
LmFkZCggdjEgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGVxdWFsczogZnVuY3Rpb24gKCB2
ICkgeworCisgICAgICAgICAgICByZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2Lnkg
PT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSAmJiAoIHYudyA9PT0gdGhpcy53ICkg
KTsKKworICAgICAgICB9LAorCisgICAgICAgIGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwg
b2Zmc2V0ICkgeworCisgICAgICAgICAgICBpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zm
c2V0ID0gMDsKKworICAgICAgICAgICAgdGhpcy54ID0gYXJyYXlbIG9mZnNldCBdOworICAgICAg
ICAgICAgdGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTsKKyAgICAgICAgICAgIHRoaXMueiA9
IGFycmF5WyBvZmZzZXQgKyAyIF07CisgICAgICAgICAgICB0aGlzLncgPSBhcnJheVsgb2Zmc2V0
ICsgMyBdOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAg
ICAgIHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKKworICAgICAgICAgICAg
aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKKyAgICAgICAgICAgIGlmICgg
b2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisgICAgICAgICAgICBhcnJheVsg
b2Zmc2V0IF0gPSB0aGlzLng7CisgICAgICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhp
cy55OworICAgICAgICAgICAgYXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejsKKyAgICAgICAg
ICAgIGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLnc7CisKKyAgICAgICAgICAgIHJldHVybiBh
cnJheTsKKworICAgICAgICB9LAorCisgICAgICAgIGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0
aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgeworCisgICAgICAgICAgICBpZiAoIG9m
ZnNldCAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAn
VEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0
dHJpYnV0ZSgpLicgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnggPSBh
dHRyaWJ1dGUuZ2V0WCggaW5kZXggKTsKKyAgICAgICAgICAgIHRoaXMueSA9IGF0dHJpYnV0ZS5n
ZXRZKCBpbmRleCApOworICAgICAgICAgICAgdGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4
ICk7CisgICAgICAgICAgICB0aGlzLncgPSBhdHRyaWJ1dGUuZ2V0VyggaW5kZXggKTsKKworICAg
ICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoq
CisgICAgICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrLworICAg
ICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAgICog
QGF1dGhvciBNYXJpdXMgS2ludGVsIC8gaHR0cHM6Ly9naXRodWIuY29tL2tpbnRlbAorICAgICAq
LworCisgICAgLyoKKyAgICAgSW4gb3B0aW9ucywgd2UgY2FuIHNwZWNpZnk6CisgICAgICogVGV4
dHVyZSBwYXJhbWV0ZXJzIGZvciBhbiBhdXRvLWdlbmVyYXRlZCB0YXJnZXQgdGV4dHVyZQorICAg
ICAqIGRlcHRoQnVmZmVyL3N0ZW5jaWxCdWZmZXI6IEJvb2xlYW5zIHRvIGluZGljYXRlIGlmIHdl
IHNob3VsZCBnZW5lcmF0ZSB0aGVzZSBidWZmZXJzCisgICAgKi8KKyAgICBmdW5jdGlvbiBXZWJH
TFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHsKKworICAgICAgICB0aGlz
LnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKKworICAgICAgICB0aGlzLndpZHRoID0gd2lk
dGg7CisgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OworCisgICAgICAgIHRoaXMuc2Npc3Nv
ciA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7CisgICAgICAgIHRoaXMuc2Np
c3NvclRlc3QgPSBmYWxzZTsKKworICAgICAgICB0aGlzLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQo
IDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKKworICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7
fTsKKworICAgICAgICBpZiAoIG9wdGlvbnMubWluRmlsdGVyID09PSB1bmRlZmluZWQgKSBvcHRp
b25zLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjsKKworICAgICAgICB0aGlzLnRleHR1cmUgPSBu
ZXcgVGV4dHVyZSggdW5kZWZpbmVkLCB1bmRlZmluZWQsIG9wdGlvbnMud3JhcFMsIG9wdGlvbnMu
d3JhcFQsIG9wdGlvbnMubWFnRmlsdGVyLCBvcHRpb25zLm1pbkZpbHRlciwgb3B0aW9ucy5mb3Jt
YXQsIG9wdGlvbnMudHlwZSwgb3B0aW9ucy5hbmlzb3Ryb3B5LCBvcHRpb25zLmVuY29kaW5nICk7
CisKKyAgICAgICAgdGhpcy5kZXB0aEJ1ZmZlciA9IG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVu
ZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhCdWZmZXIgOiB0cnVlOworICAgICAgICB0aGlzLnN0ZW5j
aWxCdWZmZXIgPSBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMu
c3RlbmNpbEJ1ZmZlciA6IHRydWU7CisgICAgICAgIHRoaXMuZGVwdGhUZXh0dXJlID0gb3B0aW9u
cy5kZXB0aFRleHR1cmUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhUZXh0dXJlIDogbnVs
bDsKKworICAgIH0KKworICAgIE9iamVjdC5hc3NpZ24oIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3Rv
dHlwZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwgeworCisgICAgICAgIGlzV2ViR0xSZW5k
ZXJUYXJnZXQ6IHRydWUsCisKKyAgICAgICAgc2V0U2l6ZTogZnVuY3Rpb24gKCB3aWR0aCwgaGVp
Z2h0ICkgeworCisgICAgICAgICAgICBpZiAoIHRoaXMud2lkdGggIT09IHdpZHRoIHx8IHRoaXMu
aGVpZ2h0ICE9PSBoZWlnaHQgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gd2lk
dGg7CisgICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgICAg
ICAgICB0aGlzLmRpc3Bvc2UoKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlz
LnZpZXdwb3J0LnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApOworICAgICAgICAgICAgdGhpcy5z
Y2lzc29yLnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApOworCisgICAgICAgIH0sCisKKyAgICAg
ICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNv
bnN0cnVjdG9yKCkuY29weSggdGhpcyApOworCisgICAgICAgIH0sCisKKyAgICAgICAgY29weTog
ZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKyAgICAgICAgICAgIHRoaXMud2lkdGggPSBzb3VyY2Uu
d2lkdGg7CisgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7CisKKyAgICAg
ICAgICAgIHRoaXMudmlld3BvcnQuY29weSggc291cmNlLnZpZXdwb3J0ICk7CisKKyAgICAgICAg
ICAgIHRoaXMudGV4dHVyZSA9IHNvdXJjZS50ZXh0dXJlLmNsb25lKCk7CisKKyAgICAgICAgICAg
IHRoaXMuZGVwdGhCdWZmZXIgPSBzb3VyY2UuZGVwdGhCdWZmZXI7CisgICAgICAgICAgICB0aGlz
LnN0ZW5jaWxCdWZmZXIgPSBzb3VyY2Uuc3RlbmNpbEJ1ZmZlcjsKKyAgICAgICAgICAgIHRoaXMu
ZGVwdGhUZXh0dXJlID0gc291cmNlLmRlcHRoVGV4dHVyZTsKKworICAgICAgICAgICAgcmV0dXJu
IHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7CisK
KyAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApOwor
CisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgYWx0ZXJl
ZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFdl
YkdMUmVuZGVyVGFyZ2V0Q3ViZSggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHsKKworICAgICAg
ICBXZWJHTFJlbmRlclRhcmdldC5jYWxsKCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7
CisKKyAgICAgICAgdGhpcy5hY3RpdmVDdWJlRmFjZSA9IDA7IC8vIFBYIDAsIE5YIDEsIFBZIDIs
IE5ZIDMsIFBaIDQsIE5aIDUKKyAgICAgICAgdGhpcy5hY3RpdmVNaXBNYXBMZXZlbCA9IDA7CisK
KyAgICB9CisKKyAgICBXZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlID0gT2JqZWN0LmNy
ZWF0ZSggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlICk7CisgICAgV2ViR0xSZW5kZXJUYXJn
ZXRDdWJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZTsKKwor
ICAgIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUuaXNXZWJHTFJlbmRlclRhcmdldEN1
YmUgPSB0cnVlOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBo
dHRwOi8vZ29tby5zZS8KKyAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRx
dWFsaWEuY29tLworICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNv
bS9XZXN0TGFuZ2xleQorICAgICAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8K
KyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFF1YXRlcm5pb24oIHgsIHksIHosIHcgKSB7CisKKyAg
ICAgICAgdGhpcy5feCA9IHggfHwgMDsKKyAgICAgICAgdGhpcy5feSA9IHkgfHwgMDsKKyAgICAg
ICAgdGhpcy5feiA9IHogfHwgMDsKKyAgICAgICAgdGhpcy5fdyA9ICggdyAhPT0gdW5kZWZpbmVk
ICkgPyB3IDogMTsKKworICAgIH0KKworICAgIE9iamVjdC5hc3NpZ24oIFF1YXRlcm5pb24sIHsK
KworICAgICAgICBzbGVycDogZnVuY3Rpb24gKCBxYSwgcWIsIHFtLCB0ICkgeworCisgICAgICAg
ICAgICByZXR1cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTsKKworICAgICAgICB9LAor
CisgICAgICAgIHNsZXJwRmxhdDogZnVuY3Rpb24gKCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3Jj
T2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSwgdCApIHsKKworICAgICAgICAgICAgLy8gZnV6ei1m
cmVlLCBhcnJheS1iYXNlZCBRdWF0ZXJuaW9uIFNMRVJQIG9wZXJhdGlvbgorCisgICAgICAgICAg
ICB2YXIgeDAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMCBdLAorICAgICAgICAgICAgICAgIHkwID0g
c3JjMFsgc3JjT2Zmc2V0MCArIDEgXSwKKyAgICAgICAgICAgICAgICB6MCA9IHNyYzBbIHNyY09m
ZnNldDAgKyAyIF0sCisgICAgICAgICAgICAgICAgdzAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMyBd
LAorCisgICAgICAgICAgICAgICAgeDEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMCBdLAorICAgICAg
ICAgICAgICAgIHkxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDEgXSwKKyAgICAgICAgICAgICAgICB6
MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF0sCisgICAgICAgICAgICAgICAgdzEgPSBzcmMxWyBz
cmNPZmZzZXQxICsgMyBdOworCisgICAgICAgICAgICBpZiAoIHcwICE9PSB3MSB8fCB4MCAhPT0g
eDEgfHwgeTAgIT09IHkxIHx8IHowICE9PSB6MSApIHsKKworICAgICAgICAgICAgICAgIHZhciBz
ID0gMSAtIHQsCisKKyAgICAgICAgICAgICAgICAgICAgY29zID0geDAgKiB4MSArIHkwICogeTEg
KyB6MCAqIHoxICsgdzAgKiB3MSwKKworICAgICAgICAgICAgICAgICAgICBkaXIgPSAoIGNvcyA+
PSAwID8gMSA6IC0gMSApLAorICAgICAgICAgICAgICAgICAgICBzcXJTaW4gPSAxIC0gY29zICog
Y29zOworCisgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMg
dG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczoKKyAgICAgICAgICAgICAgICBpZiAoIHNxclNpbiA+
IE51bWJlci5FUFNJTE9OICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBzaW4gPSBNYXRo
LnNxcnQoIHNxclNpbiApLAorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gTWF0aC5hdGFu
Miggc2luLCBjb3MgKiBkaXIgKTsKKworICAgICAgICAgICAgICAgICAgICBzID0gTWF0aC5zaW4o
IHMgKiBsZW4gKSAvIHNpbjsKKyAgICAgICAgICAgICAgICAgICAgdCA9IE1hdGguc2luKCB0ICog
bGVuICkgLyBzaW47CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIg
dERpciA9IHQgKiBkaXI7CisKKyAgICAgICAgICAgICAgICB4MCA9IHgwICogcyArIHgxICogdERp
cjsKKyAgICAgICAgICAgICAgICB5MCA9IHkwICogcyArIHkxICogdERpcjsKKyAgICAgICAgICAg
ICAgICB6MCA9IHowICogcyArIHoxICogdERpcjsKKyAgICAgICAgICAgICAgICB3MCA9IHcwICog
cyArIHcxICogdERpcjsKKworICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBpbiBjYXNlIHdl
IGp1c3QgZGlkIGEgbGVycDoKKyAgICAgICAgICAgICAgICBpZiAoIHMgPT09IDEgLSB0ICkgewor
CisgICAgICAgICAgICAgICAgICAgIHZhciBmID0gMSAvIE1hdGguc3FydCggeDAgKiB4MCArIHkw
ICogeTAgKyB6MCAqIHowICsgdzAgKiB3MCApOworCisgICAgICAgICAgICAgICAgICAgIHgwICo9
IGY7CisgICAgICAgICAgICAgICAgICAgIHkwICo9IGY7CisgICAgICAgICAgICAgICAgICAgIHow
ICo9IGY7CisgICAgICAgICAgICAgICAgICAgIHcwICo9IGY7CisKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0WyBkc3RPZmZzZXQgXSA9IHgwOwor
ICAgICAgICAgICAgZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDsKKyAgICAgICAgICAgIGRzdFsg
ZHN0T2Zmc2V0ICsgMiBdID0gejA7CisgICAgICAgICAgICBkc3RbIGRzdE9mZnNldCArIDMgXSA9
IHcwOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0
aWVzKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwgeworCisgICAgICAgIHg6IHsKKworICAgICAgICAg
ICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5feDsK
KworICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkg
eworCisgICAgICAgICAgICAgICAgdGhpcy5feCA9IHZhbHVlOworICAgICAgICAgICAgICAgIHRo
aXMub25DaGFuZ2VDYWxsYmFjaygpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSwKKwor
ICAgICAgICB5OiB7CisKKyAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuX3k7CisKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAg
IHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuX3kgPSB2
YWx1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworICAgICAg
ICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAgejogeworCisgICAgICAgICAgICBnZXQ6
IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96OworCisgICAg
ICAgICAgICB9LAorCisgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAg
ICAgICAgICAgICAgICB0aGlzLl96ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgdGhpcy5vbkNo
YW5nZUNhbGxiYWNrKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAorCisgICAgICAg
IHc6IHsKKworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgICAg
ICByZXR1cm4gdGhpcy5fdzsKKworICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgc2V0OiBm
dW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5fdyA9IHZhbHVlOwor
ICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgT2JqZWN0LmFzc2lnbiggUXVhdGVybmlv
bi5wcm90b3R5cGUsIHsKKworICAgICAgICBzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHsK
KworICAgICAgICAgICAgdGhpcy5feCA9IHg7CisgICAgICAgICAgICB0aGlzLl95ID0geTsKKyAg
ICAgICAgICAgIHRoaXMuX3ogPSB6OworICAgICAgICAgICAgdGhpcy5fdyA9IHc7CisKKyAgICAg
ICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisgICAgICAgICAgICByZXR1cm4gdGhp
czsKKworICAgICAgICB9LAorCisgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CisKKyAgICAg
ICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhp
cy5feiwgdGhpcy5fdyApOworCisgICAgICAgIH0sCisKKyAgICAgICAgY29weTogZnVuY3Rpb24g
KCBxdWF0ZXJuaW9uICkgeworCisgICAgICAgICAgICB0aGlzLl94ID0gcXVhdGVybmlvbi54Owor
ICAgICAgICAgICAgdGhpcy5feSA9IHF1YXRlcm5pb24ueTsKKyAgICAgICAgICAgIHRoaXMuX3og
PSBxdWF0ZXJuaW9uLno7CisgICAgICAgICAgICB0aGlzLl93ID0gcXVhdGVybmlvbi53OworCisg
ICAgICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworICAgICAgICAgICAgcmV0dXJu
IHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRGcm9tRXVsZXI6IGZ1bmN0aW9uICgg
ZXVsZXIsIHVwZGF0ZSApIHsKKworICAgICAgICAgICAgaWYgKCAhICggZXVsZXIgJiYgZXVsZXIu
aXNFdWxlciApICkgeworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUu
UXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9u
IHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApOworCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIHZhciB4ID0gZXVsZXIuX3gsIHkgPSBldWxlci5feSwgeiA9IGV1bGVyLl96
LCBvcmRlciA9IGV1bGVyLm9yZGVyOworCisgICAgICAgICAgICAvLyBodHRwOi8vd3d3Lm1hdGh3
b3Jrcy5jb20vbWF0bGFiY2VudHJhbC9maWxlZXhjaGFuZ2UvCisgICAgICAgICAgICAvLyAgMjA2
OTYtZnVuY3Rpb24tdG8tY29udmVydC1iZXR3ZWVuLWRjbS1ldWxlci1hbmdsZXMtcXVhdGVybmlv
bnMtYW5kLWV1bGVyLXZlY3RvcnMvCisgICAgICAgICAgICAvLyAgY29udGVudC9TcGluQ2FsYy5t
CisKKyAgICAgICAgICAgIHZhciBjb3MgPSBNYXRoLmNvczsKKyAgICAgICAgICAgIHZhciBzaW4g
PSBNYXRoLnNpbjsKKworICAgICAgICAgICAgdmFyIGMxID0gY29zKCB4IC8gMiApOworICAgICAg
ICAgICAgdmFyIGMyID0gY29zKCB5IC8gMiApOworICAgICAgICAgICAgdmFyIGMzID0gY29zKCB6
IC8gMiApOworCisgICAgICAgICAgICB2YXIgczEgPSBzaW4oIHggLyAyICk7CisgICAgICAgICAg
ICB2YXIgczIgPSBzaW4oIHkgLyAyICk7CisgICAgICAgICAgICB2YXIgczMgPSBzaW4oIHogLyAy
ICk7CisKKyAgICAgICAgICAgIGlmICggb3JkZXIgPT09ICdYWVonICkgeworCisgICAgICAgICAg
ICAgICAgdGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMzsKKyAgICAgICAgICAg
ICAgICB0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzOworICAgICAgICAgICAg
ICAgIHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7CisgICAgICAgICAgICAg
ICAgdGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMzsKKworICAgICAgICAgICAg
fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5f
eCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMzsKKyAgICAgICAgICAgICAgICB0aGlzLl95
ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzOworICAgICAgICAgICAgICAgIHRoaXMuX3og
PSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7CisgICAgICAgICAgICAgICAgdGhpcy5fdyA9
IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMzsKKworICAgICAgICAgICAgfSBlbHNlIGlmICgg
b3JkZXIgPT09ICdaWFknICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5feCA9IHMxICogYzIg
KiBjMyAtIGMxICogczIgKiBzMzsKKyAgICAgICAgICAgICAgICB0aGlzLl95ID0gYzEgKiBzMiAq
IGMzICsgczEgKiBjMiAqIHMzOworICAgICAgICAgICAgICAgIHRoaXMuX3ogPSBjMSAqIGMyICog
czMgKyBzMSAqIHMyICogYzM7CisgICAgICAgICAgICAgICAgdGhpcy5fdyA9IGMxICogYzIgKiBj
MyAtIHMxICogczIgKiBzMzsKKworICAgICAgICAgICAgfSBlbHNlIGlmICggb3JkZXIgPT09ICda
WVgnICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICog
czIgKiBzMzsKKyAgICAgICAgICAgICAgICB0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBj
MiAqIHMzOworICAgICAgICAgICAgICAgIHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMy
ICogYzM7CisgICAgICAgICAgICAgICAgdGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIg
KiBzMzsKKworICAgICAgICAgICAgfSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkgeworCisg
ICAgICAgICAgICAgICAgdGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMzsKKyAg
ICAgICAgICAgICAgICB0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzOworICAg
ICAgICAgICAgICAgIHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7CisgICAg
ICAgICAgICAgICAgdGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMzsKKworICAg
ICAgICAgICAgfSBlbHNlIGlmICggb3JkZXIgPT09ICdYWlknICkgeworCisgICAgICAgICAgICAg
ICAgdGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMzsKKyAgICAgICAgICAgICAg
ICB0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzOworICAgICAgICAgICAgICAg
IHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7CisgICAgICAgICAgICAgICAg
dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMzsKKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLm9uQ2hhbmdlQ2FsbGJh
Y2soKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAg
ICBzZXRGcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkgeworCisgICAgICAg
ICAgICAvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3Rh
dGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtCisKKyAgICAgICAg
ICAgIC8vIGFzc3VtZXMgYXhpcyBpcyBub3JtYWxpemVkCisKKyAgICAgICAgICAgIHZhciBoYWxm
QW5nbGUgPSBhbmdsZSAvIDIsIHMgPSBNYXRoLnNpbiggaGFsZkFuZ2xlICk7CisKKyAgICAgICAg
ICAgIHRoaXMuX3ggPSBheGlzLnggKiBzOworICAgICAgICAgICAgdGhpcy5feSA9IGF4aXMueSAq
IHM7CisgICAgICAgICAgICB0aGlzLl96ID0gYXhpcy56ICogczsKKyAgICAgICAgICAgIHRoaXMu
X3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7CisKKyAgICAgICAgICAgIHRoaXMub25DaGFuZ2VD
YWxsYmFjaygpOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisg
ICAgICAgIHNldEZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtICkgeworCisgICAgICAg
ICAgICAvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3Rh
dGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bQorCisgICAgICAg
ICAgICAvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0
cml4IChpLmUsIHVuc2NhbGVkKQorCisgICAgICAgICAgICB2YXIgdGUgPSBtLmVsZW1lbnRzLAor
CisgICAgICAgICAgICAgICAgbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVb
IDggXSwKKyAgICAgICAgICAgICAgICBtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMg
PSB0ZVsgOSBdLAorICAgICAgICAgICAgICAgIG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0s
IG0zMyA9IHRlWyAxMCBdLAorCisgICAgICAgICAgICAgICAgdHJhY2UgPSBtMTEgKyBtMjIgKyBt
MzMsCisgICAgICAgICAgICAgICAgczsKKworICAgICAgICAgICAgaWYgKCB0cmFjZSA+IDAgKSB7
CisKKyAgICAgICAgICAgICAgICBzID0gMC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApOwor
CisgICAgICAgICAgICAgICAgdGhpcy5fdyA9IDAuMjUgLyBzOworICAgICAgICAgICAgICAgIHRo
aXMuX3ggPSAoIG0zMiAtIG0yMyApICogczsKKyAgICAgICAgICAgICAgICB0aGlzLl95ID0gKCBt
MTMgLSBtMzEgKSAqIHM7CisgICAgICAgICAgICAgICAgdGhpcy5feiA9ICggbTIxIC0gbTEyICkg
KiBzOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtMTEgPiBtMjIgJiYgbTExID4gbTMzICkg
eworCisgICAgICAgICAgICAgICAgcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTExIC0gbTIy
IC0gbTMzICk7CisKKyAgICAgICAgICAgICAgICB0aGlzLl93ID0gKCBtMzIgLSBtMjMgKSAvIHM7
CisgICAgICAgICAgICAgICAgdGhpcy5feCA9IDAuMjUgKiBzOworICAgICAgICAgICAgICAgIHRo
aXMuX3kgPSAoIG0xMiArIG0yMSApIC8gczsKKyAgICAgICAgICAgICAgICB0aGlzLl96ID0gKCBt
MTMgKyBtMzEgKSAvIHM7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIG0yMiA+IG0zMyApIHsK
KworICAgICAgICAgICAgICAgIHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0yMiAtIG0xMSAt
IG0zMyApOworCisgICAgICAgICAgICAgICAgdGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzOwor
ICAgICAgICAgICAgICAgIHRoaXMuX3ggPSAoIG0xMiArIG0yMSApIC8gczsKKyAgICAgICAgICAg
ICAgICB0aGlzLl95ID0gMC4yNSAqIHM7CisgICAgICAgICAgICAgICAgdGhpcy5feiA9ICggbTIz
ICsgbTMyICkgLyBzOworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAg
cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7CisKKyAgICAgICAg
ICAgICAgICB0aGlzLl93ID0gKCBtMjEgLSBtMTIgKSAvIHM7CisgICAgICAgICAgICAgICAgdGhp
cy5feCA9ICggbTEzICsgbTMxICkgLyBzOworICAgICAgICAgICAgICAgIHRoaXMuX3kgPSAoIG0y
MyArIG0zMiApIC8gczsKKyAgICAgICAgICAgICAgICB0aGlzLl96ID0gMC4yNSAqIHM7CisKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CisKKyAg
ICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0RnJvbVVu
aXRWZWN0b3JzOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8vIGFzc3VtZXMgZGlyZWN0
aW9uIHZlY3RvcnMgdkZyb20gYW5kIHZUbyBhcmUgbm9ybWFsaXplZAorCisgICAgICAgICAgICB2
YXIgdjEgPSBuZXcgVmVjdG9yMygpOworICAgICAgICAgICAgdmFyIHI7CisKKyAgICAgICAgICAg
IHZhciBFUFMgPSAwLjAwMDAwMTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldEZy
b21Vbml0VmVjdG9ycyggdkZyb20sIHZUbyApIHsKKworICAgICAgICAgICAgICAgIGlmICggdjEg
PT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTsKKworICAgICAgICAgICAgICAgIHIg
PSB2RnJvbS5kb3QoIHZUbyApICsgMTsKKworICAgICAgICAgICAgICAgIGlmICggciA8IEVQUyAp
IHsKKworICAgICAgICAgICAgICAgICAgICByID0gMDsKKworICAgICAgICAgICAgICAgICAgICBp
ZiAoIE1hdGguYWJzKCB2RnJvbS54ICkgPiBNYXRoLmFicyggdkZyb20ueiApICkgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICB2MS5zZXQoIC0gdkZyb20ueSwgdkZyb20ueCwgMCApOworCisg
ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHYx
LnNldCggMCwgLSB2RnJvbS56LCB2RnJvbS55ICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICB2MS5jcm9z
c1ZlY3RvcnMoIHZGcm9tLCB2VG8gKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIHRoaXMuX3ggPSB2MS54OworICAgICAgICAgICAgICAgIHRoaXMuX3kgPSB2MS55Owor
ICAgICAgICAgICAgICAgIHRoaXMuX3ogPSB2MS56OworICAgICAgICAgICAgICAgIHRoaXMuX3cg
PSByOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKCk7CisKKyAgICAg
ICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIGludmVyc2U6IGZ1bmN0aW9uICgp
IHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uanVnYXRlKCkubm9ybWFsaXplKCk7CisK
KyAgICAgICAgfSwKKworICAgICAgICBjb25qdWdhdGU6IGZ1bmN0aW9uICgpIHsKKworICAgICAg
ICAgICAgdGhpcy5feCAqPSAtIDE7CisgICAgICAgICAgICB0aGlzLl95ICo9IC0gMTsKKyAgICAg
ICAgICAgIHRoaXMuX3ogKj0gLSAxOworCisgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJh
Y2soKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAg
ICBkb3Q6IGZ1bmN0aW9uICggdiApIHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ggKiB2
Ll94ICsgdGhpcy5feSAqIHYuX3kgKyB0aGlzLl96ICogdi5feiArIHRoaXMuX3cgKiB2Ll93Owor
CisgICAgICAgIH0sCisKKyAgICAgICAgbGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHsKKworICAgICAg
ICAgICAgcmV0dXJuIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlz
Ll96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93OworCisgICAgICAgIH0sCisKKyAgICAg
ICAgbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQo
IHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5f
eiArIHRoaXMuX3cgKiB0aGlzLl93ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBub3JtYWxp
emU6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIGwgPSB0aGlzLmxlbmd0aCgpOwor
CisgICAgICAgICAgICBpZiAoIGwgPT09IDAgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLl94
ID0gMDsKKyAgICAgICAgICAgICAgICB0aGlzLl95ID0gMDsKKyAgICAgICAgICAgICAgICB0aGlz
Ll96ID0gMDsKKyAgICAgICAgICAgICAgICB0aGlzLl93ID0gMTsKKworICAgICAgICAgICAgfSBl
bHNlIHsKKworICAgICAgICAgICAgICAgIGwgPSAxIC8gbDsKKworICAgICAgICAgICAgICAgIHRo
aXMuX3ggPSB0aGlzLl94ICogbDsKKyAgICAgICAgICAgICAgICB0aGlzLl95ID0gdGhpcy5feSAq
IGw7CisgICAgICAgICAgICAgICAgdGhpcy5feiA9IHRoaXMuX3ogKiBsOworICAgICAgICAgICAg
ICAgIHRoaXMuX3cgPSB0aGlzLl93ICogbDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisK
KyAgICAgICAgfSwKKworICAgICAgICBtdWx0aXBseTogZnVuY3Rpb24gKCBxLCBwICkgeworCisg
ICAgICAgICAgICBpZiAoIHAgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIGNv
bnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2Vw
dHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFk
LicgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBx
LCBwICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlw
bHlRdWF0ZXJuaW9ucyggdGhpcywgcSApOworCisgICAgICAgIH0sCisKKyAgICAgICAgcHJlbXVs
dGlwbHk6IGZ1bmN0aW9uICggcSApIHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlw
bHlRdWF0ZXJuaW9ucyggcSwgdGhpcyApOworCisgICAgICAgIH0sCisKKyAgICAgICAgbXVsdGlw
bHlRdWF0ZXJuaW9uczogZnVuY3Rpb24gKCBhLCBiICkgeworCisgICAgICAgICAgICAvLyBmcm9t
IGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFs
Z2VicmEvcXVhdGVybmlvbnMvY29kZS9pbmRleC5odG0KKworICAgICAgICAgICAgdmFyIHFheCA9
IGEuX3gsIHFheSA9IGEuX3ksIHFheiA9IGEuX3osIHFhdyA9IGEuX3c7CisgICAgICAgICAgICB2
YXIgcWJ4ID0gYi5feCwgcWJ5ID0gYi5feSwgcWJ6ID0gYi5feiwgcWJ3ID0gYi5fdzsKKworICAg
ICAgICAgICAgdGhpcy5feCA9IHFheCAqIHFidyArIHFhdyAqIHFieCArIHFheSAqIHFieiAtIHFh
eiAqIHFieTsKKyAgICAgICAgICAgIHRoaXMuX3kgPSBxYXkgKiBxYncgKyBxYXcgKiBxYnkgKyBx
YXogKiBxYnggLSBxYXggKiBxYno7CisgICAgICAgICAgICB0aGlzLl96ID0gcWF6ICogcWJ3ICsg
cWF3ICogcWJ6ICsgcWF4ICogcWJ5IC0gcWF5ICogcWJ4OworICAgICAgICAgICAgdGhpcy5fdyA9
IHFhdyAqIHFidyAtIHFheCAqIHFieCAtIHFheSAqIHFieSAtIHFheiAqIHFiejsKKworICAgICAg
ICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlz
OworCisgICAgICAgIH0sCisKKyAgICAgICAgc2xlcnA6IGZ1bmN0aW9uICggcWIsIHQgKSB7CisK
KyAgICAgICAgICAgIGlmICggdCA9PT0gMCApIHJldHVybiB0aGlzOworICAgICAgICAgICAgaWYg
KCB0ID09PSAxICkgcmV0dXJuIHRoaXMuY29weSggcWIgKTsKKworICAgICAgICAgICAgdmFyIHgg
PSB0aGlzLl94LCB5ID0gdGhpcy5feSwgeiA9IHRoaXMuX3osIHcgPSB0aGlzLl93OworCisgICAg
ICAgICAgICAvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3Jl
YWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL3NsZXJwLworCisgICAgICAgICAgICB2YXIgY29z
SGFsZlRoZXRhID0gdyAqIHFiLl93ICsgeCAqIHFiLl94ICsgeSAqIHFiLl95ICsgeiAqIHFiLl96
OworCisgICAgICAgICAgICBpZiAoIGNvc0hhbGZUaGV0YSA8IDAgKSB7CisKKyAgICAgICAgICAg
ICAgICB0aGlzLl93ID0gLSBxYi5fdzsKKyAgICAgICAgICAgICAgICB0aGlzLl94ID0gLSBxYi5f
eDsKKyAgICAgICAgICAgICAgICB0aGlzLl95ID0gLSBxYi5feTsKKyAgICAgICAgICAgICAgICB0
aGlzLl96ID0gLSBxYi5fejsKKworICAgICAgICAgICAgICAgIGNvc0hhbGZUaGV0YSA9IC0gY29z
SGFsZlRoZXRhOworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgdGhp
cy5jb3B5KCBxYiApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggY29zSGFs
ZlRoZXRhID49IDEuMCApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuX3cgPSB3OworICAgICAg
ICAgICAgICAgIHRoaXMuX3ggPSB4OworICAgICAgICAgICAgICAgIHRoaXMuX3kgPSB5OworICAg
ICAgICAgICAgICAgIHRoaXMuX3ogPSB6OworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHNpbkhhbGZUaGV0YSA9IE1hdGgu
c3FydCggMS4wIC0gY29zSGFsZlRoZXRhICogY29zSGFsZlRoZXRhICk7CisKKyAgICAgICAgICAg
IGlmICggTWF0aC5hYnMoIHNpbkhhbGZUaGV0YSApIDwgMC4wMDEgKSB7CisKKyAgICAgICAgICAg
ICAgICB0aGlzLl93ID0gMC41ICogKCB3ICsgdGhpcy5fdyApOworICAgICAgICAgICAgICAgIHRo
aXMuX3ggPSAwLjUgKiAoIHggKyB0aGlzLl94ICk7CisgICAgICAgICAgICAgICAgdGhpcy5feSA9
IDAuNSAqICggeSArIHRoaXMuX3kgKTsKKyAgICAgICAgICAgICAgICB0aGlzLl96ID0gMC41ICog
KCB6ICsgdGhpcy5feiApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGhhbGZUaGV0YSA9IE1hdGguYXRhbjIoIHNpbkhh
bGZUaGV0YSwgY29zSGFsZlRoZXRhICk7CisgICAgICAgICAgICB2YXIgcmF0aW9BID0gTWF0aC5z
aW4oICggMSAtIHQgKSAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhLAorICAgICAgICAgICAg
ICAgIHJhdGlvQiA9IE1hdGguc2luKCB0ICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGE7CisK
KyAgICAgICAgICAgIHRoaXMuX3cgPSAoIHcgKiByYXRpb0EgKyB0aGlzLl93ICogcmF0aW9CICk7
CisgICAgICAgICAgICB0aGlzLl94ID0gKCB4ICogcmF0aW9BICsgdGhpcy5feCAqIHJhdGlvQiAp
OworICAgICAgICAgICAgdGhpcy5feSA9ICggeSAqIHJhdGlvQSArIHRoaXMuX3kgKiByYXRpb0Ig
KTsKKyAgICAgICAgICAgIHRoaXMuX3ogPSAoIHogKiByYXRpb0EgKyB0aGlzLl96ICogcmF0aW9C
ICk7CisKKyAgICAgICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisgICAgICAgICAg
ICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGVxdWFsczogZnVuY3Rpb24g
KCBxdWF0ZXJuaW9uICkgeworCisgICAgICAgICAgICByZXR1cm4gKCBxdWF0ZXJuaW9uLl94ID09
PSB0aGlzLl94ICkgJiYgKCBxdWF0ZXJuaW9uLl95ID09PSB0aGlzLl95ICkgJiYgKCBxdWF0ZXJu
aW9uLl96ID09PSB0aGlzLl96ICkgJiYgKCBxdWF0ZXJuaW9uLl93ID09PSB0aGlzLl93ICk7CisK
KyAgICAgICAgfSwKKworICAgICAgICBmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNl
dCApIHsKKworICAgICAgICAgICAgaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9
IDA7CisKKyAgICAgICAgICAgIHRoaXMuX3ggPSBhcnJheVsgb2Zmc2V0IF07CisgICAgICAgICAg
ICB0aGlzLl95ID0gYXJyYXlbIG9mZnNldCArIDEgXTsKKyAgICAgICAgICAgIHRoaXMuX3ogPSBh
cnJheVsgb2Zmc2V0ICsgMiBdOworICAgICAgICAgICAgdGhpcy5fdyA9IGFycmF5WyBvZmZzZXQg
KyAzIF07CisKKyAgICAgICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisgICAgICAg
ICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHRvQXJyYXk6IGZ1bmN0
aW9uICggYXJyYXksIG9mZnNldCApIHsKKworICAgICAgICAgICAgaWYgKCBhcnJheSA9PT0gdW5k
ZWZpbmVkICkgYXJyYXkgPSBbXTsKKyAgICAgICAgICAgIGlmICggb2Zmc2V0ID09PSB1bmRlZmlu
ZWQgKSBvZmZzZXQgPSAwOworCisgICAgICAgICAgICBhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94
OworICAgICAgICAgICAgYXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7CisgICAgICAgICAg
ICBhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejsKKyAgICAgICAgICAgIGFycmF5WyBvZmZz
ZXQgKyAzIF0gPSB0aGlzLl93OworCisgICAgICAgICAgICByZXR1cm4gYXJyYXk7CisKKyAgICAg
ICAgfSwKKworICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKKworICAg
ICAgICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgb25DaGFuZ2VDYWxsYmFjazog
ZnVuY3Rpb24gKCkge30KKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJk
b29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1dGhvciBraWxlIC8gaHR0cDovL2tp
bGUuc3RyYXZhZ2FuemEub3JnLworICAgICAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9n
LnRoZWppdC5vcmcvCisgICAgICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29t
by5zZS8KKyAgICAgKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tLwor
ICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xl
eQorICAgICAqLworCisgICAgZnVuY3Rpb24gVmVjdG9yMyggeCwgeSwgeiApIHsKKworICAgICAg
ICB0aGlzLnggPSB4IHx8IDA7CisgICAgICAgIHRoaXMueSA9IHkgfHwgMDsKKyAgICAgICAgdGhp
cy56ID0geiB8fCAwOworCisgICAgfQorCisgICAgT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90
b3R5cGUsIHsKKworICAgICAgICBpc1ZlY3RvcjM6IHRydWUsCisKKyAgICAgICAgc2V0OiBmdW5j
dGlvbiAoIHgsIHksIHogKSB7CisKKyAgICAgICAgICAgIHRoaXMueCA9IHg7CisgICAgICAgICAg
ICB0aGlzLnkgPSB5OworICAgICAgICAgICAgdGhpcy56ID0gejsKKworICAgICAgICAgICAgcmV0
dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRTY2FsYXI6IGZ1bmN0aW9uICgg
c2NhbGFyICkgeworCisgICAgICAgICAgICB0aGlzLnggPSBzY2FsYXI7CisgICAgICAgICAgICB0
aGlzLnkgPSBzY2FsYXI7CisgICAgICAgICAgICB0aGlzLnogPSBzY2FsYXI7CisKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0WDogZnVuY3Rpb24g
KCB4ICkgeworCisgICAgICAgICAgICB0aGlzLnggPSB4OworCisgICAgICAgICAgICByZXR1cm4g
dGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNldFk6IGZ1bmN0aW9uICggeSApIHsKKwor
ICAgICAgICAgICAgdGhpcy55ID0geTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBzZXRaOiBmdW5jdGlvbiAoIHogKSB7CisKKyAgICAgICAgICAg
IHRoaXMueiA9IHo7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisK
KyAgICAgICAgc2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHsKKworICAg
ICAgICAgICAgc3dpdGNoICggaW5kZXggKSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHRo
aXMueCA9IHZhbHVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IHRoaXMueSA9IHZh
bHVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVh
azsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBv
dXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0Q29tcG9uZW50OiBmdW5j
dGlvbiAoIGluZGV4ICkgeworCisgICAgICAgICAgICBzd2l0Y2ggKCBpbmRleCApIHsKKworICAg
ICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIHRoaXMueDsKKyAgICAgICAgICAgICAgICBjYXNl
IDE6IHJldHVybiB0aGlzLnk7CisgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gdGhpcy56
OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91
dCBvZiByYW5nZTogJyArIGluZGV4ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAor
CisgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcg
dGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiApOworCisgICAgICAgIH0s
CisKKyAgICAgICAgY29weTogZnVuY3Rpb24gKCB2ICkgeworCisgICAgICAgICAgICB0aGlzLngg
PSB2Lng7CisgICAgICAgICAgICB0aGlzLnkgPSB2Lnk7CisgICAgICAgICAgICB0aGlzLnogPSB2
Lno7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAg
YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7CisKKyAgICAgICAgICAgIGlmICggdyAhPT0gdW5kZWZp
bmVkICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzog
LmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEs
IGIgKSBpbnN0ZWFkLicgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZGRWZWN0b3Jz
KCB2LCB3ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy54ICs9IHYueDsK
KyAgICAgICAgICAgIHRoaXMueSArPSB2Lnk7CisgICAgICAgICAgICB0aGlzLnogKz0gdi56Owor
CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGFkZFNj
YWxhcjogZnVuY3Rpb24gKCBzICkgeworCisgICAgICAgICAgICB0aGlzLnggKz0gczsKKyAgICAg
ICAgICAgIHRoaXMueSArPSBzOworICAgICAgICAgICAgdGhpcy56ICs9IHM7CisKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgYWRkVmVjdG9yczogZnVu
Y3Rpb24gKCBhLCBiICkgeworCisgICAgICAgICAgICB0aGlzLnggPSBhLnggKyBiLng7CisgICAg
ICAgICAgICB0aGlzLnkgPSBhLnkgKyBiLnk7CisgICAgICAgICAgICB0aGlzLnogPSBhLnogKyBi
Lno7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAg
YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7CisKKyAgICAgICAgICAgIHRoaXMu
eCArPSB2LnggKiBzOworICAgICAgICAgICAgdGhpcy55ICs9IHYueSAqIHM7CisgICAgICAgICAg
ICB0aGlzLnogKz0gdi56ICogczsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAg
ICAgfSwKKworICAgICAgICBzdWI6IGZ1bmN0aW9uICggdiwgdyApIHsKKworICAgICAgICAgICAg
aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4o
ICdUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVz
ZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOworICAgICAgICAgICAgICAgIHJldHVy
biB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICB0aGlzLnggLT0gdi54OworICAgICAgICAgICAgdGhpcy55IC09IHYueTsKKyAgICAgICAgICAg
IHRoaXMueiAtPSB2Lno7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0s
CisKKyAgICAgICAgc3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CisKKyAgICAgICAgICAgIHRo
aXMueCAtPSBzOworICAgICAgICAgICAgdGhpcy55IC09IHM7CisgICAgICAgICAgICB0aGlzLnog
LT0gczsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAg
ICBzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CisKKyAgICAgICAgICAgIHRoaXMueCA9
IGEueCAtIGIueDsKKyAgICAgICAgICAgIHRoaXMueSA9IGEueSAtIGIueTsKKyAgICAgICAgICAg
IHRoaXMueiA9IGEueiAtIGIuejsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAg
ICAgfSwKKworICAgICAgICBtdWx0aXBseTogZnVuY3Rpb24gKCB2LCB3ICkgeworCisgICAgICAg
ICAgICBpZiAoIHcgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUu
d2FybiggJ1RIUkVFLlZlY3RvcjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFy
Z3VtZW50LiBVc2UgLm11bHRpcGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOworICAgICAg
ICAgICAgICAgIHJldHVybiB0aGlzLm11bHRpcGx5VmVjdG9ycyggdiwgdyApOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIHRoaXMueCAqPSB2Lng7CisgICAgICAgICAgICB0aGlzLnkg
Kj0gdi55OworICAgICAgICAgICAgdGhpcy56ICo9IHYuejsKKworICAgICAgICAgICAgcmV0dXJu
IHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24g
KCBzY2FsYXIgKSB7CisKKyAgICAgICAgICAgIHRoaXMueCAqPSBzY2FsYXI7CisgICAgICAgICAg
ICB0aGlzLnkgKj0gc2NhbGFyOworICAgICAgICAgICAgdGhpcy56ICo9IHNjYWxhcjsKKworICAg
ICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBtdWx0aXBseVZl
Y3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHsKKworICAgICAgICAgICAgdGhpcy54ID0gYS54ICog
Yi54OworICAgICAgICAgICAgdGhpcy55ID0gYS55ICogYi55OworICAgICAgICAgICAgdGhpcy56
ID0gYS56ICogYi56OworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAor
CisgICAgICAgIGFwcGx5RXVsZXI6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIHF1
YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rp
b24gYXBwbHlFdWxlciggZXVsZXIgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoICEgKCBldWxl
ciAmJiBldWxlci5pc0V1bGVyICkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5l
cnJvciggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIg
cm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7CisKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24o
IHF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciApICk7CisKKyAgICAgICAgICAgIH07CisK
KyAgICAgICAgfSgpLAorCisgICAgICAgIGFwcGx5QXhpc0FuZ2xlOiBmdW5jdGlvbiAoKSB7CisK
KyAgICAgICAgICAgIHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTsKKworICAgICAg
ICAgICAgcmV0dXJuIGZ1bmN0aW9uIGFwcGx5QXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApIHsKKwor
ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbi5z
ZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApICk7CisKKyAgICAgICAgICAgIH07CisKKyAg
ICAgICAgfSgpLAorCisgICAgICAgIGFwcGx5TWF0cml4MzogZnVuY3Rpb24gKCBtICkgeworCisg
ICAgICAgICAgICB2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejsKKyAgICAg
ICAgICAgIHZhciBlID0gbS5lbGVtZW50czsKKworICAgICAgICAgICAgdGhpcy54ID0gZVsgMCBd
ICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF0gKiB6OworICAgICAgICAgICAgdGhpcy55ID0gZVsg
MSBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA3IF0gKiB6OworICAgICAgICAgICAgdGhpcy56ID0g
ZVsgMiBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA4IF0gKiB6OworCisgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGFwcGx5TWF0cml4NDogZnVuY3Rpb24g
KCBtICkgeworCisgICAgICAgICAgICB2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRo
aXMuejsKKyAgICAgICAgICAgIHZhciBlID0gbS5lbGVtZW50czsKKworICAgICAgICAgICAgdmFy
IHcgPSAxIC8gKCBlWyAzIF0gKiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUg
XSApOworCisgICAgICAgICAgICB0aGlzLnggPSAoIGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsg
ZVsgOCBdICAqIHogKyBlWyAxMiBdICkgKiB3OworICAgICAgICAgICAgdGhpcy55ID0gKCBlWyAx
IF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAgKiB6ICsgZVsgMTMgXSApICogdzsKKyAgICAg
ICAgICAgIHRoaXMueiA9ICggZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiAr
IGVbIDE0IF0gKSAqIHc7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0s
CisKKyAgICAgICAgYXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7CisKKyAgICAgICAg
ICAgIHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56OworICAgICAgICAgICAg
dmFyIHF4ID0gcS54LCBxeSA9IHEueSwgcXogPSBxLnosIHF3ID0gcS53OworCisgICAgICAgICAg
ICAvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY3RvcgorCisgICAgICAgICAgICB2YXIgaXggPSAgcXcg
KiB4ICsgcXkgKiB6IC0gcXogKiB5OworICAgICAgICAgICAgdmFyIGl5ID0gIHF3ICogeSArIHF6
ICogeCAtIHF4ICogejsKKyAgICAgICAgICAgIHZhciBpeiA9ICBxdyAqIHogKyBxeCAqIHkgLSBx
eSAqIHg7CisgICAgICAgICAgICB2YXIgaXcgPSAtIHF4ICogeCAtIHF5ICogeSAtIHF6ICogejsK
KworICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdAorCisgICAg
ICAgICAgICB0aGlzLnggPSBpeCAqIHF3ICsgaXcgKiAtIHF4ICsgaXkgKiAtIHF6IC0gaXogKiAt
IHF5OworICAgICAgICAgICAgdGhpcy55ID0gaXkgKiBxdyArIGl3ICogLSBxeSArIGl6ICogLSBx
eCAtIGl4ICogLSBxejsKKyAgICAgICAgICAgIHRoaXMueiA9IGl6ICogcXcgKyBpdyAqIC0gcXog
KyBpeCAqIC0gcXkgLSBpeSAqIC0gcXg7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisg
ICAgICAgIH0sCisKKyAgICAgICAgcHJvamVjdDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAg
ICB2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0
aW9uIHByb2plY3QoIGNhbWVyYSApIHsKKworICAgICAgICAgICAgICAgIG1hdHJpeC5tdWx0aXBs
eU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgbWF0cml4LmdldEludmVyc2UoIGNh
bWVyYS5tYXRyaXhXb3JsZCApICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlN
YXRyaXg0KCBtYXRyaXggKTsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9KCksCisKKyAg
ICAgICAgdW5wcm9qZWN0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciBtYXRyaXgg
PSBuZXcgTWF0cml4NCgpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gdW5wcm9qZWN0
KCBjYW1lcmEgKSB7CisKKyAgICAgICAgICAgICAgICBtYXRyaXgubXVsdGlwbHlNYXRyaWNlcygg
Y2FtZXJhLm1hdHJpeFdvcmxkLCBtYXRyaXguZ2V0SW52ZXJzZSggY2FtZXJhLnByb2plY3Rpb25N
YXRyaXggKSApOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbWF0
cml4ICk7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIHRyYW5z
Zm9ybURpcmVjdGlvbjogZnVuY3Rpb24gKCBtICkgeworCisgICAgICAgICAgICAvLyBpbnB1dDog
VEhSRUUuTWF0cml4NCBhZmZpbmUgbWF0cml4CisgICAgICAgICAgICAvLyB2ZWN0b3IgaW50ZXJw
cmV0ZWQgYXMgYSBkaXJlY3Rpb24KKworICAgICAgICAgICAgdmFyIHggPSB0aGlzLngsIHkgPSB0
aGlzLnksIHogPSB0aGlzLno7CisgICAgICAgICAgICB2YXIgZSA9IG0uZWxlbWVudHM7CisKKyAg
ICAgICAgICAgIHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICAqIHo7
CisgICAgICAgICAgICB0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAg
KiB6OworICAgICAgICAgICAgdGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAx
MCBdICogejsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKCk7CisKKyAgICAg
ICAgfSwKKworICAgICAgICBkaXZpZGU6IGZ1bmN0aW9uICggdiApIHsKKworICAgICAgICAgICAg
dGhpcy54IC89IHYueDsKKyAgICAgICAgICAgIHRoaXMueSAvPSB2Lnk7CisgICAgICAgICAgICB0
aGlzLnogLz0gdi56OworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAor
CisgICAgICAgIGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CisKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7CisKKyAgICAgICAg
fSwKKworICAgICAgICBtaW46IGZ1bmN0aW9uICggdiApIHsKKworICAgICAgICAgICAgdGhpcy54
ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7CisgICAgICAgICAgICB0aGlzLnkgPSBNYXRoLm1p
biggdGhpcy55LCB2LnkgKTsKKyAgICAgICAgICAgIHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnos
IHYueiApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAg
ICAgIG1heDogZnVuY3Rpb24gKCB2ICkgeworCisgICAgICAgICAgICB0aGlzLnggPSBNYXRoLm1h
eCggdGhpcy54LCB2LnggKTsKKyAgICAgICAgICAgIHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnks
IHYueSApOworICAgICAgICAgICAgdGhpcy56ID0gTWF0aC5tYXgoIHRoaXMueiwgdi56ICk7CisK
KyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgY2xhbXA6
IGZ1bmN0aW9uICggbWluLCBtYXggKSB7CisKKyAgICAgICAgICAgIC8vIGFzc3VtZXMgbWluIDwg
bWF4LCBjb21wb25lbnR3aXNlCisKKyAgICAgICAgICAgIHRoaXMueCA9IE1hdGgubWF4KCBtaW4u
eCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApOworICAgICAgICAgICAgdGhpcy55ID0gTWF0
aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7CisgICAgICAgICAgICB0
aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTsKKwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBjbGFtcFNj
YWxhcjogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgbWluID0gbmV3IFZlY3RvcjMo
KTsKKyAgICAgICAgICAgIHZhciBtYXggPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICBy
ZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkgeworCisgICAgICAg
ICAgICAgICAgbWluLnNldCggbWluVmFsLCBtaW5WYWwsIG1pblZhbCApOworICAgICAgICAgICAg
ICAgIG1heC5zZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTsKKworICAgICAgICAgICAgICAg
IHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApOworCisgICAgICAgICAgICB9OworCisgICAg
ICAgIH0oKSwKKworICAgICAgICBjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHsK
KworICAgICAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhcigg
TWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApOworCisgICAgICAgIH0s
CisKKyAgICAgICAgZmxvb3I6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdGhpcy54ID0g
TWF0aC5mbG9vciggdGhpcy54ICk7CisgICAgICAgICAgICB0aGlzLnkgPSBNYXRoLmZsb29yKCB0
aGlzLnkgKTsKKyAgICAgICAgICAgIHRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApOworCisg
ICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGNlaWw6IGZ1
bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTsK
KyAgICAgICAgICAgIHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7CisgICAgICAgICAgICB0
aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsK
KworICAgICAgICB9LAorCisgICAgICAgIHJvdW5kOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAg
ICAgIHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApOworICAgICAgICAgICAgdGhpcy55ID0g
TWF0aC5yb3VuZCggdGhpcy55ICk7CisgICAgICAgICAgICB0aGlzLnogPSBNYXRoLnJvdW5kKCB0
aGlzLnogKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAg
ICAgICByb3VuZFRvWmVybzogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB0aGlzLnggPSAo
IHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLngg
KTsKKyAgICAgICAgICAgIHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlz
LnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApOworICAgICAgICAgICAgdGhpcy56ID0gKCB0aGlz
LnogPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueiApIDogTWF0aC5mbG9vciggdGhpcy56ICk7CisK
KyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgbmVnYXRl
OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHRoaXMueCA9IC0gdGhpcy54OworICAgICAg
ICAgICAgdGhpcy55ID0gLSB0aGlzLnk7CisgICAgICAgICAgICB0aGlzLnogPSAtIHRoaXMuejsK
KworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBkb3Q6
IGZ1bmN0aW9uICggdiApIHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMueCAqIHYueCArIHRo
aXMueSAqIHYueSArIHRoaXMueiAqIHYuejsKKworICAgICAgICB9LAorCisgICAgICAgIC8vIFRP
RE8gbGVuZ3RoU3F1YXJlZD8KKworICAgICAgICBsZW5ndGhTcTogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICByZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhp
cy56ICogdGhpcy56OworCisgICAgICAgIH0sCisKKyAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbiAo
KSB7CisKKyAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRo
aXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiApOworCisgICAgICAgIH0sCisKKyAgICAg
ICAgbGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBN
YXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56
ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBub3JtYWxpemU6IGZ1bmN0aW9uICgpIHsKKwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEg
KTsKKworICAgICAgICB9LAorCisgICAgICAgIHNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGgg
KSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFy
KCBsZW5ndGggKTsKKworICAgICAgICB9LAorCisgICAgICAgIGxlcnA6IGZ1bmN0aW9uICggdiwg
YWxwaGEgKSB7CisKKyAgICAgICAgICAgIHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxw
aGE7CisgICAgICAgICAgICB0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhOworICAg
ICAgICAgICAgdGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTsKKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBsZXJwVmVjdG9yczogZnVu
Y3Rpb24gKCB2MSwgdjIsIGFscGhhICkgeworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5zdWJW
ZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBjcm9zczogZnVuY3Rpb24gKCB2LCB3ICkgeworCisgICAgICAg
ICAgICBpZiAoIHcgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUu
d2FybiggJ1RIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3Vt
ZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOworICAgICAgICAgICAg
ICAgIHJldHVybiB0aGlzLmNyb3NzVmVjdG9ycyggdiwgdyApOworCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56OworCisg
ICAgICAgICAgICB0aGlzLnggPSB5ICogdi56IC0geiAqIHYueTsKKyAgICAgICAgICAgIHRoaXMu
eSA9IHogKiB2LnggLSB4ICogdi56OworICAgICAgICAgICAgdGhpcy56ID0geCAqIHYueSAtIHkg
KiB2Lng7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAg
ICAgY3Jvc3NWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CisKKyAgICAgICAgICAgIHZhciBh
eCA9IGEueCwgYXkgPSBhLnksIGF6ID0gYS56OworICAgICAgICAgICAgdmFyIGJ4ID0gYi54LCBi
eSA9IGIueSwgYnogPSBiLno7CisKKyAgICAgICAgICAgIHRoaXMueCA9IGF5ICogYnogLSBheiAq
IGJ5OworICAgICAgICAgICAgdGhpcy55ID0gYXogKiBieCAtIGF4ICogYno7CisgICAgICAgICAg
ICB0aGlzLnogPSBheCAqIGJ5IC0gYXkgKiBieDsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7
CisKKyAgICAgICAgfSwKKworICAgICAgICBwcm9qZWN0T25WZWN0b3I6IGZ1bmN0aW9uICggdmVj
dG9yICkgeworCisgICAgICAgICAgICB2YXIgc2NhbGFyID0gdmVjdG9yLmRvdCggdGhpcyApIC8g
dmVjdG9yLmxlbmd0aFNxKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmNvcHkoIHZlY3Rv
ciApLm11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKTsKKworICAgICAgICB9LAorCisgICAgICAgIHBy
b2plY3RPblBsYW5lOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciB2MSA9IG5ldyBW
ZWN0b3IzKCk7CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwcm9qZWN0T25QbGFuZSgg
cGxhbmVOb3JtYWwgKSB7CisKKyAgICAgICAgICAgICAgICB2MS5jb3B5KCB0aGlzICkucHJvamVj
dE9uVmVjdG9yKCBwbGFuZU5vcm1hbCApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMu
c3ViKCB2MSApOworCisgICAgICAgICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICBy
ZWZsZWN0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8vIHJlZmxlY3QgaW5jaWRlbnQg
dmVjdG9yIG9mZiBwbGFuZSBvcnRob2dvbmFsIHRvIG5vcm1hbAorICAgICAgICAgICAgLy8gbm9y
bWFsIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aAorCisgICAgICAgICAgICB2YXIgdjEg
PSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcmVmbGVjdCgg
bm9ybWFsICkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3ViKCB2MS5jb3B5KCBu
b3JtYWwgKS5tdWx0aXBseVNjYWxhciggMiAqIHRoaXMuZG90KCBub3JtYWwgKSApICk7CisKKyAg
ICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIGFuZ2xlVG86IGZ1bmN0aW9u
ICggdiApIHsKKworICAgICAgICAgICAgdmFyIHRoZXRhID0gdGhpcy5kb3QoIHYgKSAvICggTWF0
aC5zcXJ0KCB0aGlzLmxlbmd0aFNxKCkgKiB2Lmxlbmd0aFNxKCkgKSApOworCisgICAgICAgICAg
ICAvLyBjbGFtcCwgdG8gaGFuZGxlIG51bWVyaWNhbCBwcm9ibGVtcworCisgICAgICAgICAgICBy
ZXR1cm4gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGhldGEsIC0gMSwgMSApICk7CisKKyAgICAg
ICAgfSwKKworICAgICAgICBkaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7CisKKyAgICAgICAg
ICAgIHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApOworCisg
ICAgICAgIH0sCisKKyAgICAgICAgZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1bmN0aW9uICggdiApIHsK
KworICAgICAgICAgICAgdmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwg
ZHogPSB0aGlzLnogLSB2Lno7CisKKyAgICAgICAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBk
eSArIGR6ICogZHo7CisKKyAgICAgICAgfSwKKworICAgICAgICBkaXN0YW5jZVRvTWFuaGF0dGFu
OiBmdW5jdGlvbiAoIHYgKSB7CisKKyAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyggdGhpcy54
IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICkgKyBNYXRoLmFicyggdGhpcy56IC0g
di56ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRGcm9tU3BoZXJpY2FsOiBmdW5jdGlv
biAoIHMgKSB7CisKKyAgICAgICAgICAgIHZhciBzaW5QaGlSYWRpdXMgPSBNYXRoLnNpbiggcy5w
aGkgKSAqIHMucmFkaXVzOworCisgICAgICAgICAgICB0aGlzLnggPSBzaW5QaGlSYWRpdXMgKiBN
YXRoLnNpbiggcy50aGV0YSApOworICAgICAgICAgICAgdGhpcy55ID0gTWF0aC5jb3MoIHMucGhp
ICkgKiBzLnJhZGl1czsKKyAgICAgICAgICAgIHRoaXMueiA9IHNpblBoaVJhZGl1cyAqIE1hdGgu
Y29zKCBzLnRoZXRhICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0s
CisKKyAgICAgICAgc2V0RnJvbUN5bGluZHJpY2FsOiBmdW5jdGlvbiAoIGMgKSB7CisKKyAgICAg
ICAgICAgIHRoaXMueCA9IGMucmFkaXVzICogTWF0aC5zaW4oIGMudGhldGEgKTsKKyAgICAgICAg
ICAgIHRoaXMueSA9IGMueTsKKyAgICAgICAgICAgIHRoaXMueiA9IGMucmFkaXVzICogTWF0aC5j
b3MoIGMudGhldGEgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwK
KworICAgICAgICBzZXRGcm9tTWF0cml4UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHsKKworICAg
ICAgICAgICAgdmFyIGUgPSBtLmVsZW1lbnRzOworCisgICAgICAgICAgICB0aGlzLnggPSBlWyAx
MiBdOworICAgICAgICAgICAgdGhpcy55ID0gZVsgMTMgXTsKKyAgICAgICAgICAgIHRoaXMueiA9
IGVbIDE0IF07CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgc2V0RnJvbU1hdHJpeFNjYWxlOiBmdW5jdGlvbiAoIG0gKSB7CisKKyAgICAgICAgICAg
IHZhciBzeCA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpOworICAg
ICAgICAgICAgdmFyIHN5ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3Ro
KCk7CisgICAgICAgICAgICB2YXIgc3ogPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIg
KS5sZW5ndGgoKTsKKworICAgICAgICAgICAgdGhpcy54ID0gc3g7CisgICAgICAgICAgICB0aGlz
LnkgPSBzeTsKKyAgICAgICAgICAgIHRoaXMueiA9IHN6OworCisgICAgICAgICAgICByZXR1cm4g
dGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNldEZyb21NYXRyaXhDb2x1bW46IGZ1bmN0
aW9uICggbSwgaW5kZXggKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmZyb21BcnJheSgg
bS5lbGVtZW50cywgaW5kZXggKiA0ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBlcXVhbHM6
IGZ1bmN0aW9uICggdiApIHsKKworICAgICAgICAgICAgcmV0dXJuICggKCB2LnggPT09IHRoaXMu
eCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgKTsKKworICAg
ICAgICB9LAorCisgICAgICAgIGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkg
eworCisgICAgICAgICAgICBpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsK
KworICAgICAgICAgICAgdGhpcy54ID0gYXJyYXlbIG9mZnNldCBdOworICAgICAgICAgICAgdGhp
cy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTsKKyAgICAgICAgICAgIHRoaXMueiA9IGFycmF5WyBv
ZmZzZXQgKyAyIF07CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisK
KyAgICAgICAgdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgeworCisgICAgICAg
ICAgICBpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOworICAgICAgICAgICAg
aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CisKKyAgICAgICAgICAgIGFy
cmF5WyBvZmZzZXQgXSA9IHRoaXMueDsKKyAgICAgICAgICAgIGFycmF5WyBvZmZzZXQgKyAxIF0g
PSB0aGlzLnk7CisgICAgICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56OworCisg
ICAgICAgICAgICByZXR1cm4gYXJyYXk7CisKKyAgICAgICAgfSwKKworICAgICAgICBmcm9tQnVm
ZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHsKKwor
ICAgICAgICAgICAgaWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAg
ICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVk
IGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgdGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7CisgICAgICAgICAgICB0
aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTsKKyAgICAgICAgICAgIHRoaXMueiA9IGF0
dHJpYnV0ZS5nZXRaKCBpbmRleCApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAg
ICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0
dHA6Ly9tcmRvb2IuY29tLworICAgICAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3
dy5wYXVsYnJ1bnQuY28udWsvCisgICAgICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cu
dGhlaml0Lm9yZy8KKyAgICAgKiBAYXV0aG9yIGpvcmRpX3JvcyAvIGh0dHA6Ly9wbGF0dHNvZnQu
Y29tCisgICAgICogQGF1dGhvciBEMXBsbzFkIC8gaHR0cDovL2dpdGh1Yi5jb20vRDFwbG8xZAor
ICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAg
ICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KKyAgICAgKiBAYXV0
aG9yIHRpbWtuaXAgLyBodHRwOi8vd3d3LmZsb29ycGxhbm5lci5jb20vCisgICAgICogQGF1dGhv
ciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkg
LyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorICAgICAqLworCisgICAgZnVuY3Rpb24g
TWF0cml4NCgpIHsKKworICAgICAgICB0aGlzLmVsZW1lbnRzID0gWworCisgICAgICAgICAgICAx
LCAwLCAwLCAwLAorICAgICAgICAgICAgMCwgMSwgMCwgMCwKKyAgICAgICAgICAgIDAsIDAsIDEs
IDAsCisgICAgICAgICAgICAwLCAwLCAwLCAxCisKKyAgICAgICAgXTsKKworICAgICAgICBpZiAo
IGFyZ3VtZW50cy5sZW5ndGggPiAwICkgeworCisgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAn
VEhSRUUuTWF0cml4NDogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMu
IHVzZSAuc2V0KCkgaW5zdGVhZC4nICk7CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgT2Jq
ZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHsKKworICAgICAgICBpc01hdHJpeDQ6IHRy
dWUsCisKKyAgICAgICAgc2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4xNCwgbjIxLCBu
MjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMsIG40NCApIHsK
KworICAgICAgICAgICAgdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworICAgICAgICAgICAgdGVb
IDAgXSA9IG4xMTsgdGVbIDQgXSA9IG4xMjsgdGVbIDggXSA9IG4xMzsgdGVbIDEyIF0gPSBuMTQ7
CisgICAgICAgICAgICB0ZVsgMSBdID0gbjIxOyB0ZVsgNSBdID0gbjIyOyB0ZVsgOSBdID0gbjIz
OyB0ZVsgMTMgXSA9IG4yNDsKKyAgICAgICAgICAgIHRlWyAyIF0gPSBuMzE7IHRlWyA2IF0gPSBu
MzI7IHRlWyAxMCBdID0gbjMzOyB0ZVsgMTQgXSA9IG4zNDsKKyAgICAgICAgICAgIHRlWyAzIF0g
PSBuNDE7IHRlWyA3IF0gPSBuNDI7IHRlWyAxMSBdID0gbjQzOyB0ZVsgMTUgXSA9IG40NDsKKwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBpZGVudGl0
eTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB0aGlzLnNldCgKKworICAgICAgICAgICAg
ICAgIDEsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgMCwgMSwgMCwgMCwKKyAgICAgICAgICAg
ICAgICAwLCAwLCAxLCAwLAorICAgICAgICAgICAgICAgIDAsIDAsIDAsIDEKKworICAgICAgICAg
ICAgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAg
ICBjbG9uZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICByZXR1cm4gbmV3IE1hdHJpeDQo
KS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGNv
cHk6IGZ1bmN0aW9uICggbSApIHsKKworICAgICAgICAgICAgdmFyIHRlID0gdGhpcy5lbGVtZW50
czsKKyAgICAgICAgICAgIHZhciBtZSA9IG0uZWxlbWVudHM7CisKKyAgICAgICAgICAgIHRlWyAw
IF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07IHRlWyAz
IF0gPSBtZVsgMyBdOworICAgICAgICAgICAgdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBt
ZVsgNSBdOyB0ZVsgNiBdID0gbWVbIDYgXTsgdGVbIDcgXSA9IG1lWyA3IF07CisgICAgICAgICAg
ICB0ZVsgOCBdID0gbWVbIDggXTsgdGVbIDkgXSA9IG1lWyA5IF07IHRlWyAxMCBdID0gbWVbIDEw
IF07IHRlWyAxMSBdID0gbWVbIDExIF07CisgICAgICAgICAgICB0ZVsgMTIgXSA9IG1lWyAxMiBd
OyB0ZVsgMTMgXSA9IG1lWyAxMyBdOyB0ZVsgMTQgXSA9IG1lWyAxNCBdOyB0ZVsgMTUgXSA9IG1l
WyAxNSBdOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAg
ICAgIGNvcHlQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkgeworCisgICAgICAgICAgICB2YXIgdGUg
PSB0aGlzLmVsZW1lbnRzLCBtZSA9IG0uZWxlbWVudHM7CisKKyAgICAgICAgICAgIHRlWyAxMiBd
ID0gbWVbIDEyIF07CisgICAgICAgICAgICB0ZVsgMTMgXSA9IG1lWyAxMyBdOworICAgICAgICAg
ICAgdGVbIDE0IF0gPSBtZVsgMTQgXTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBleHRyYWN0QmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlz
LCB6QXhpcyApIHsKKworICAgICAgICAgICAgeEF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhp
cywgMCApOworICAgICAgICAgICAgeUF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMSAp
OworICAgICAgICAgICAgekF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMiApOworCisg
ICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIG1ha2VCYXNp
czogZnVuY3Rpb24gKCB4QXhpcywgeUF4aXMsIHpBeGlzICkgeworCisgICAgICAgICAgICB0aGlz
LnNldCgKKyAgICAgICAgICAgICAgICB4QXhpcy54LCB5QXhpcy54LCB6QXhpcy54LCAwLAorICAg
ICAgICAgICAgICAgIHhBeGlzLnksIHlBeGlzLnksIHpBeGlzLnksIDAsCisgICAgICAgICAgICAg
ICAgeEF4aXMueiwgeUF4aXMueiwgekF4aXMueiwgMCwKKyAgICAgICAgICAgICAgICAwLCAgICAg
ICAwLCAgICAgICAwLCAgICAgICAxCisgICAgICAgICAgICApOworCisgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGV4dHJhY3RSb3RhdGlvbjogZnVuY3Rp
b24gKCkgeworCisgICAgICAgICAgICB2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAg
ICAgICByZXR1cm4gZnVuY3Rpb24gZXh0cmFjdFJvdGF0aW9uKCBtICkgeworCisgICAgICAgICAg
ICAgICAgdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKyAgICAgICAgICAgICAgICB2YXIgbWUgPSBt
LmVsZW1lbnRzOworCisgICAgICAgICAgICAgICAgdmFyIHNjYWxlWCA9IDEgLyB2MS5zZXRGcm9t
TWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgdmFyIHNjYWxl
WSA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7CisgICAgICAg
ICAgICAgICAgdmFyIHNjYWxlWiA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICku
bGVuZ3RoKCk7CisKKyAgICAgICAgICAgICAgICB0ZVsgMCBdID0gbWVbIDAgXSAqIHNjYWxlWDsK
KyAgICAgICAgICAgICAgICB0ZVsgMSBdID0gbWVbIDEgXSAqIHNjYWxlWDsKKyAgICAgICAgICAg
ICAgICB0ZVsgMiBdID0gbWVbIDIgXSAqIHNjYWxlWDsKKworICAgICAgICAgICAgICAgIHRlWyA0
IF0gPSBtZVsgNCBdICogc2NhbGVZOworICAgICAgICAgICAgICAgIHRlWyA1IF0gPSBtZVsgNSBd
ICogc2NhbGVZOworICAgICAgICAgICAgICAgIHRlWyA2IF0gPSBtZVsgNiBdICogc2NhbGVZOwor
CisgICAgICAgICAgICAgICAgdGVbIDggXSA9IG1lWyA4IF0gKiBzY2FsZVo7CisgICAgICAgICAg
ICAgICAgdGVbIDkgXSA9IG1lWyA5IF0gKiBzY2FsZVo7CisgICAgICAgICAgICAgICAgdGVbIDEw
IF0gPSBtZVsgMTAgXSAqIHNjYWxlWjsKKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwor
CisgICAgICAgICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICBtYWtlUm90YXRpb25G
cm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7CisKKyAgICAgICAgICAgIGlmICggISAoIGV1
bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJy
b3IoICdUSFJFRS5NYXRyaXg6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBh
IEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApOworCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisKKyAg
ICAgICAgICAgIHZhciB4ID0gZXVsZXIueCwgeSA9IGV1bGVyLnksIHogPSBldWxlci56OworICAg
ICAgICAgICAgdmFyIGEgPSBNYXRoLmNvcyggeCApLCBiID0gTWF0aC5zaW4oIHggKTsKKyAgICAg
ICAgICAgIHZhciBjID0gTWF0aC5jb3MoIHkgKSwgZCA9IE1hdGguc2luKCB5ICk7CisgICAgICAg
ICAgICB2YXIgZSA9IE1hdGguY29zKCB6ICksIGYgPSBNYXRoLnNpbiggeiApOworCisgICAgICAg
ICAgICBpZiAoIGV1bGVyLm9yZGVyID09PSAnWFlaJyApIHsKKworICAgICAgICAgICAgICAgIHZh
ciBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmOworCisgICAg
ICAgICAgICAgICAgdGVbIDAgXSA9IGMgKiBlOworICAgICAgICAgICAgICAgIHRlWyA0IF0gPSAt
IGMgKiBmOworICAgICAgICAgICAgICAgIHRlWyA4IF0gPSBkOworCisgICAgICAgICAgICAgICAg
dGVbIDEgXSA9IGFmICsgYmUgKiBkOworICAgICAgICAgICAgICAgIHRlWyA1IF0gPSBhZSAtIGJm
ICogZDsKKyAgICAgICAgICAgICAgICB0ZVsgOSBdID0gLSBiICogYzsKKworICAgICAgICAgICAg
ICAgIHRlWyAyIF0gPSBiZiAtIGFlICogZDsKKyAgICAgICAgICAgICAgICB0ZVsgNiBdID0gYmUg
KyBhZiAqIGQ7CisgICAgICAgICAgICAgICAgdGVbIDEwIF0gPSBhICogYzsKKworICAgICAgICAg
ICAgfSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWFonICkgeworCisgICAgICAgICAgICAg
ICAgdmFyIGNlID0gYyAqIGUsIGNmID0gYyAqIGYsIGRlID0gZCAqIGUsIGRmID0gZCAqIGY7CisK
KyAgICAgICAgICAgICAgICB0ZVsgMCBdID0gY2UgKyBkZiAqIGI7CisgICAgICAgICAgICAgICAg
dGVbIDQgXSA9IGRlICogYiAtIGNmOworICAgICAgICAgICAgICAgIHRlWyA4IF0gPSBhICogZDsK
KworICAgICAgICAgICAgICAgIHRlWyAxIF0gPSBhICogZjsKKyAgICAgICAgICAgICAgICB0ZVsg
NSBdID0gYSAqIGU7CisgICAgICAgICAgICAgICAgdGVbIDkgXSA9IC0gYjsKKworICAgICAgICAg
ICAgICAgIHRlWyAyIF0gPSBjZiAqIGIgLSBkZTsKKyAgICAgICAgICAgICAgICB0ZVsgNiBdID0g
ZGYgKyBjZSAqIGI7CisgICAgICAgICAgICAgICAgdGVbIDEwIF0gPSBhICogYzsKKworICAgICAg
ICAgICAgfSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWFknICkgeworCisgICAgICAgICAg
ICAgICAgdmFyIGNlID0gYyAqIGUsIGNmID0gYyAqIGYsIGRlID0gZCAqIGUsIGRmID0gZCAqIGY7
CisKKyAgICAgICAgICAgICAgICB0ZVsgMCBdID0gY2UgLSBkZiAqIGI7CisgICAgICAgICAgICAg
ICAgdGVbIDQgXSA9IC0gYSAqIGY7CisgICAgICAgICAgICAgICAgdGVbIDggXSA9IGRlICsgY2Yg
KiBiOworCisgICAgICAgICAgICAgICAgdGVbIDEgXSA9IGNmICsgZGUgKiBiOworICAgICAgICAg
ICAgICAgIHRlWyA1IF0gPSBhICogZTsKKyAgICAgICAgICAgICAgICB0ZVsgOSBdID0gZGYgLSBj
ZSAqIGI7CisKKyAgICAgICAgICAgICAgICB0ZVsgMiBdID0gLSBhICogZDsKKyAgICAgICAgICAg
ICAgICB0ZVsgNiBdID0gYjsKKyAgICAgICAgICAgICAgICB0ZVsgMTAgXSA9IGEgKiBjOworCisg
ICAgICAgICAgICB9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pZWCcgKSB7CisKKyAgICAg
ICAgICAgICAgICB2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBi
ICogZjsKKworICAgICAgICAgICAgICAgIHRlWyAwIF0gPSBjICogZTsKKyAgICAgICAgICAgICAg
ICB0ZVsgNCBdID0gYmUgKiBkIC0gYWY7CisgICAgICAgICAgICAgICAgdGVbIDggXSA9IGFlICog
ZCArIGJmOworCisgICAgICAgICAgICAgICAgdGVbIDEgXSA9IGMgKiBmOworICAgICAgICAgICAg
ICAgIHRlWyA1IF0gPSBiZiAqIGQgKyBhZTsKKyAgICAgICAgICAgICAgICB0ZVsgOSBdID0gYWYg
KiBkIC0gYmU7CisKKyAgICAgICAgICAgICAgICB0ZVsgMiBdID0gLSBkOworICAgICAgICAgICAg
ICAgIHRlWyA2IF0gPSBiICogYzsKKyAgICAgICAgICAgICAgICB0ZVsgMTAgXSA9IGEgKiBjOwor
CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1laWCcgKSB7CisKKyAg
ICAgICAgICAgICAgICB2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQg
PSBiICogZDsKKworICAgICAgICAgICAgICAgIHRlWyAwIF0gPSBjICogZTsKKyAgICAgICAgICAg
ICAgICB0ZVsgNCBdID0gYmQgLSBhYyAqIGY7CisgICAgICAgICAgICAgICAgdGVbIDggXSA9IGJj
ICogZiArIGFkOworCisgICAgICAgICAgICAgICAgdGVbIDEgXSA9IGY7CisgICAgICAgICAgICAg
ICAgdGVbIDUgXSA9IGEgKiBlOworICAgICAgICAgICAgICAgIHRlWyA5IF0gPSAtIGIgKiBlOwor
CisgICAgICAgICAgICAgICAgdGVbIDIgXSA9IC0gZCAqIGU7CisgICAgICAgICAgICAgICAgdGVb
IDYgXSA9IGFkICogZiArIGJjOworICAgICAgICAgICAgICAgIHRlWyAxMCBdID0gYWMgLSBiZCAq
IGY7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWFpZJyApIHsK
KworICAgICAgICAgICAgICAgIHZhciBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBj
LCBiZCA9IGIgKiBkOworCisgICAgICAgICAgICAgICAgdGVbIDAgXSA9IGMgKiBlOworICAgICAg
ICAgICAgICAgIHRlWyA0IF0gPSAtIGY7CisgICAgICAgICAgICAgICAgdGVbIDggXSA9IGQgKiBl
OworCisgICAgICAgICAgICAgICAgdGVbIDEgXSA9IGFjICogZiArIGJkOworICAgICAgICAgICAg
ICAgIHRlWyA1IF0gPSBhICogZTsKKyAgICAgICAgICAgICAgICB0ZVsgOSBdID0gYWQgKiBmIC0g
YmM7CisKKyAgICAgICAgICAgICAgICB0ZVsgMiBdID0gYmMgKiBmIC0gYWQ7CisgICAgICAgICAg
ICAgICAgdGVbIDYgXSA9IGIgKiBlOworICAgICAgICAgICAgICAgIHRlWyAxMCBdID0gYmQgKiBm
ICsgYWM7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbGFzdCBjb2x1bW4KKyAg
ICAgICAgICAgIHRlWyAzIF0gPSAwOworICAgICAgICAgICAgdGVbIDcgXSA9IDA7CisgICAgICAg
ICAgICB0ZVsgMTEgXSA9IDA7CisKKyAgICAgICAgICAgIC8vIGJvdHRvbSByb3cKKyAgICAgICAg
ICAgIHRlWyAxMiBdID0gMDsKKyAgICAgICAgICAgIHRlWyAxMyBdID0gMDsKKyAgICAgICAgICAg
IHRlWyAxNCBdID0gMDsKKyAgICAgICAgICAgIHRlWyAxNSBdID0gMTsKKworICAgICAgICAgICAg
cmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBtYWtlUm90YXRpb25Gcm9tUXVh
dGVybmlvbjogZnVuY3Rpb24gKCBxICkgeworCisgICAgICAgICAgICB2YXIgdGUgPSB0aGlzLmVs
ZW1lbnRzOworCisgICAgICAgICAgICB2YXIgeCA9IHEuX3gsIHkgPSBxLl95LCB6ID0gcS5feiwg
dyA9IHEuX3c7CisgICAgICAgICAgICB2YXIgeDIgPSB4ICsgeCwgeTIgPSB5ICsgeSwgejIgPSB6
ICsgejsKKyAgICAgICAgICAgIHZhciB4eCA9IHggKiB4MiwgeHkgPSB4ICogeTIsIHh6ID0geCAq
IHoyOworICAgICAgICAgICAgdmFyIHl5ID0geSAqIHkyLCB5eiA9IHkgKiB6MiwgenogPSB6ICog
ejI7CisgICAgICAgICAgICB2YXIgd3ggPSB3ICogeDIsIHd5ID0gdyAqIHkyLCB3eiA9IHcgKiB6
MjsKKworICAgICAgICAgICAgdGVbIDAgXSA9IDEgLSAoIHl5ICsgenogKTsKKyAgICAgICAgICAg
IHRlWyA0IF0gPSB4eSAtIHd6OworICAgICAgICAgICAgdGVbIDggXSA9IHh6ICsgd3k7CisKKyAg
ICAgICAgICAgIHRlWyAxIF0gPSB4eSArIHd6OworICAgICAgICAgICAgdGVbIDUgXSA9IDEgLSAo
IHh4ICsgenogKTsKKyAgICAgICAgICAgIHRlWyA5IF0gPSB5eiAtIHd4OworCisgICAgICAgICAg
ICB0ZVsgMiBdID0geHogLSB3eTsKKyAgICAgICAgICAgIHRlWyA2IF0gPSB5eiArIHd4OworICAg
ICAgICAgICAgdGVbIDEwIF0gPSAxIC0gKCB4eCArIHl5ICk7CisKKyAgICAgICAgICAgIC8vIGxh
c3QgY29sdW1uCisgICAgICAgICAgICB0ZVsgMyBdID0gMDsKKyAgICAgICAgICAgIHRlWyA3IF0g
PSAwOworICAgICAgICAgICAgdGVbIDExIF0gPSAwOworCisgICAgICAgICAgICAvLyBib3R0b20g
cm93CisgICAgICAgICAgICB0ZVsgMTIgXSA9IDA7CisgICAgICAgICAgICB0ZVsgMTMgXSA9IDA7
CisgICAgICAgICAgICB0ZVsgMTQgXSA9IDA7CisgICAgICAgICAgICB0ZVsgMTUgXSA9IDE7CisK
KyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgbG9va0F0
OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IFZlY3RvcjMoKTsKKyAg
ICAgICAgICAgIHZhciB5ID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAgIHZhciB6ID0gbmV3
IFZlY3RvcjMoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggZXllLCB0
YXJnZXQsIHVwICkgeworCisgICAgICAgICAgICAgICAgdmFyIHRlID0gdGhpcy5lbGVtZW50czsK
KworICAgICAgICAgICAgICAgIHouc3ViVmVjdG9ycyggZXllLCB0YXJnZXQgKTsKKworICAgICAg
ICAgICAgICAgIGlmICggei5sZW5ndGhTcSgpID09PSAwICkgeworCisgICAgICAgICAgICAgICAg
ICAgIC8vIGV5ZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvbgorCisgICAgICAg
ICAgICAgICAgICAgIHoueiA9IDE7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICB6Lm5vcm1hbGl6ZSgpOworICAgICAgICAgICAgICAgIHguY3Jvc3NWZWN0b3JzKCB1cCwg
eiApOworCisgICAgICAgICAgICAgICAgaWYgKCB4Lmxlbmd0aFNxKCkgPT09IDAgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgLy8gdXAgYW5kIHogYXJlIHBhcmFsbGVsCisKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKCBNYXRoLmFicyggdXAueiApID09PSAxICkgeworCisgICAgICAgICAgICAg
ICAgICAgICAgICB6LnggKz0gMC4wMDAxOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHoueiArPSAwLjAwMDE7CisKKyAgICAgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHoubm9ybWFsaXplKCk7CisgICAgICAg
ICAgICAgICAgICAgIHguY3Jvc3NWZWN0b3JzKCB1cCwgeiApOworCisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgeC5ub3JtYWxpemUoKTsKKyAgICAgICAgICAgICAgICB5LmNy
b3NzVmVjdG9ycyggeiwgeCApOworCisgICAgICAgICAgICAgICAgdGVbIDAgXSA9IHgueDsgdGVb
IDQgXSA9IHkueDsgdGVbIDggXSA9IHoueDsKKyAgICAgICAgICAgICAgICB0ZVsgMSBdID0geC55
OyB0ZVsgNSBdID0geS55OyB0ZVsgOSBdID0gei55OworICAgICAgICAgICAgICAgIHRlWyAyIF0g
PSB4Lno7IHRlWyA2IF0gPSB5Lno7IHRlWyAxMCBdID0gei56OworCisgICAgICAgICAgICAgICAg
cmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAg
IG11bHRpcGx5OiBmdW5jdGlvbiAoIG0sIG4gKSB7CisKKyAgICAgICAgICAgIGlmICggbiAhPT0g
dW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuTWF0
cml4NDogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVs
dGlwbHlNYXRyaWNlcyggYSwgYiApIGluc3RlYWQuJyApOworICAgICAgICAgICAgICAgIHJldHVy
biB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIG4gKTsKKworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7CisKKyAgICAg
ICAgfSwKKworICAgICAgICBwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBtICkgeworCisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7CisKKyAgICAgICAg
fSwKKworICAgICAgICBtdWx0aXBseU1hdHJpY2VzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CisKKyAg
ICAgICAgICAgIHZhciBhZSA9IGEuZWxlbWVudHM7CisgICAgICAgICAgICB2YXIgYmUgPSBiLmVs
ZW1lbnRzOworICAgICAgICAgICAgdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworICAgICAgICAg
ICAgdmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyA0IF0sIGExMyA9IGFlWyA4IF0sIGExNCA9
IGFlWyAxMiBdOworICAgICAgICAgICAgdmFyIGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA1IF0s
IGEyMyA9IGFlWyA5IF0sIGEyNCA9IGFlWyAxMyBdOworICAgICAgICAgICAgdmFyIGEzMSA9IGFl
WyAyIF0sIGEzMiA9IGFlWyA2IF0sIGEzMyA9IGFlWyAxMCBdLCBhMzQgPSBhZVsgMTQgXTsKKyAg
ICAgICAgICAgIHZhciBhNDEgPSBhZVsgMyBdLCBhNDIgPSBhZVsgNyBdLCBhNDMgPSBhZVsgMTEg
XSwgYTQ0ID0gYWVbIDE1IF07CisKKyAgICAgICAgICAgIHZhciBiMTEgPSBiZVsgMCBdLCBiMTIg
PSBiZVsgNCBdLCBiMTMgPSBiZVsgOCBdLCBiMTQgPSBiZVsgMTIgXTsKKyAgICAgICAgICAgIHZh
ciBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNSBdLCBiMjMgPSBiZVsgOSBdLCBiMjQgPSBiZVsg
MTMgXTsKKyAgICAgICAgICAgIHZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNiBdLCBiMzMg
PSBiZVsgMTAgXSwgYjM0ID0gYmVbIDE0IF07CisgICAgICAgICAgICB2YXIgYjQxID0gYmVbIDMg
XSwgYjQyID0gYmVbIDcgXSwgYjQzID0gYmVbIDExIF0sIGI0NCA9IGJlWyAxNSBdOworCisgICAg
ICAgICAgICB0ZVsgMCBdID0gYTExICogYjExICsgYTEyICogYjIxICsgYTEzICogYjMxICsgYTE0
ICogYjQxOworICAgICAgICAgICAgdGVbIDQgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGEx
MyAqIGIzMiArIGExNCAqIGI0MjsKKyAgICAgICAgICAgIHRlWyA4IF0gPSBhMTEgKiBiMTMgKyBh
MTIgKiBiMjMgKyBhMTMgKiBiMzMgKyBhMTQgKiBiNDM7CisgICAgICAgICAgICB0ZVsgMTIgXSA9
IGExMSAqIGIxNCArIGExMiAqIGIyNCArIGExMyAqIGIzNCArIGExNCAqIGI0NDsKKworICAgICAg
ICAgICAgdGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAq
IGI0MTsKKyAgICAgICAgICAgIHRlWyA1IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMg
KiBiMzIgKyBhMjQgKiBiNDI7CisgICAgICAgICAgICB0ZVsgOSBdID0gYTIxICogYjEzICsgYTIy
ICogYjIzICsgYTIzICogYjMzICsgYTI0ICogYjQzOworICAgICAgICAgICAgdGVbIDEzIF0gPSBh
MjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7CisKKyAgICAgICAg
ICAgIHRlWyAyIF0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMgKiBiMzEgKyBhMzQgKiBi
NDE7CisgICAgICAgICAgICB0ZVsgNiBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICog
YjMyICsgYTM0ICogYjQyOworICAgICAgICAgICAgdGVbIDEwIF0gPSBhMzEgKiBiMTMgKyBhMzIg
KiBiMjMgKyBhMzMgKiBiMzMgKyBhMzQgKiBiNDM7CisgICAgICAgICAgICB0ZVsgMTQgXSA9IGEz
MSAqIGIxNCArIGEzMiAqIGIyNCArIGEzMyAqIGIzNCArIGEzNCAqIGI0NDsKKworICAgICAgICAg
ICAgdGVbIDMgXSA9IGE0MSAqIGIxMSArIGE0MiAqIGIyMSArIGE0MyAqIGIzMSArIGE0NCAqIGI0
MTsKKyAgICAgICAgICAgIHRlWyA3IF0gPSBhNDEgKiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBi
MzIgKyBhNDQgKiBiNDI7CisgICAgICAgICAgICB0ZVsgMTEgXSA9IGE0MSAqIGIxMyArIGE0MiAq
IGIyMyArIGE0MyAqIGIzMyArIGE0NCAqIGI0MzsKKyAgICAgICAgICAgIHRlWyAxNSBdID0gYTQx
ICogYjE0ICsgYTQyICogYjI0ICsgYTQzICogYjM0ICsgYTQ0ICogYjQ0OworCisgICAgICAgICAg
ICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIG11bHRpcGx5U2NhbGFyOiBm
dW5jdGlvbiAoIHMgKSB7CisKKyAgICAgICAgICAgIHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisK
KyAgICAgICAgICAgIHRlWyAwIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgOCBdICo9IHM7IHRl
WyAxMiBdICo9IHM7CisgICAgICAgICAgICB0ZVsgMSBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVb
IDkgXSAqPSBzOyB0ZVsgMTMgXSAqPSBzOworICAgICAgICAgICAgdGVbIDIgXSAqPSBzOyB0ZVsg
NiBdICo9IHM7IHRlWyAxMCBdICo9IHM7IHRlWyAxNCBdICo9IHM7CisgICAgICAgICAgICB0ZVsg
MyBdICo9IHM7IHRlWyA3IF0gKj0gczsgdGVbIDExIF0gKj0gczsgdGVbIDE1IF0gKj0gczsKKwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBhcHBseVRv
QnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciB2MSA9IG5l
dyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBhcHBseVRvQnVmZmVy
QXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9
IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkgeworCisgICAgICAgICAgICAg
ICAgICAgIHYxLnggPSBhdHRyaWJ1dGUuZ2V0WCggaSApOworICAgICAgICAgICAgICAgICAgICB2
MS55ID0gYXR0cmlidXRlLmdldFkoIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgdjEueiA9IGF0
dHJpYnV0ZS5nZXRaKCBpICk7CisKKyAgICAgICAgICAgICAgICAgICAgdjEuYXBwbHlNYXRyaXg0
KCB0aGlzICk7CisKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnNldFhZWiggaSwgdjEu
eCwgdjEueSwgdjEueiApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
cmV0dXJuIGF0dHJpYnV0ZTsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9KCksCisKKyAg
ICAgICAgZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIHRlID0g
dGhpcy5lbGVtZW50czsKKworICAgICAgICAgICAgdmFyIG4xMSA9IHRlWyAwIF0sIG4xMiA9IHRl
WyA0IF0sIG4xMyA9IHRlWyA4IF0sIG4xNCA9IHRlWyAxMiBdOworICAgICAgICAgICAgdmFyIG4y
MSA9IHRlWyAxIF0sIG4yMiA9IHRlWyA1IF0sIG4yMyA9IHRlWyA5IF0sIG4yNCA9IHRlWyAxMyBd
OworICAgICAgICAgICAgdmFyIG4zMSA9IHRlWyAyIF0sIG4zMiA9IHRlWyA2IF0sIG4zMyA9IHRl
WyAxMCBdLCBuMzQgPSB0ZVsgMTQgXTsKKyAgICAgICAgICAgIHZhciBuNDEgPSB0ZVsgMyBdLCBu
NDIgPSB0ZVsgNyBdLCBuNDMgPSB0ZVsgMTEgXSwgbjQ0ID0gdGVbIDE1IF07CisKKyAgICAgICAg
ICAgIC8vVE9ETzogbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50CisgICAgICAgICAgICAvLyggYmFz
ZWQgb24gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9tYXRyaXgv
ZnVuY3Rpb25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtICkKKworICAgICAgICAgICAgcmV0dXJu
ICgKKyAgICAgICAgICAgICAgICBuNDEgKiAoCisgICAgICAgICAgICAgICAgICAgICsgbjE0ICog
bjIzICogbjMyCisgICAgICAgICAgICAgICAgICAgICAtIG4xMyAqIG4yNCAqIG4zMgorICAgICAg
ICAgICAgICAgICAgICAgLSBuMTQgKiBuMjIgKiBuMzMKKyAgICAgICAgICAgICAgICAgICAgICsg
bjEyICogbjI0ICogbjMzCisgICAgICAgICAgICAgICAgICAgICArIG4xMyAqIG4yMiAqIG4zNAor
ICAgICAgICAgICAgICAgICAgICAgLSBuMTIgKiBuMjMgKiBuMzQKKyAgICAgICAgICAgICAgICAp
ICsKKyAgICAgICAgICAgICAgICBuNDIgKiAoCisgICAgICAgICAgICAgICAgICAgICsgbjExICog
bjIzICogbjM0CisgICAgICAgICAgICAgICAgICAgICAtIG4xMSAqIG4yNCAqIG4zMworICAgICAg
ICAgICAgICAgICAgICAgKyBuMTQgKiBuMjEgKiBuMzMKKyAgICAgICAgICAgICAgICAgICAgIC0g
bjEzICogbjIxICogbjM0CisgICAgICAgICAgICAgICAgICAgICArIG4xMyAqIG4yNCAqIG4zMQor
ICAgICAgICAgICAgICAgICAgICAgLSBuMTQgKiBuMjMgKiBuMzEKKyAgICAgICAgICAgICAgICAp
ICsKKyAgICAgICAgICAgICAgICBuNDMgKiAoCisgICAgICAgICAgICAgICAgICAgICsgbjExICog
bjI0ICogbjMyCisgICAgICAgICAgICAgICAgICAgICAtIG4xMSAqIG4yMiAqIG4zNAorICAgICAg
ICAgICAgICAgICAgICAgLSBuMTQgKiBuMjEgKiBuMzIKKyAgICAgICAgICAgICAgICAgICAgICsg
bjEyICogbjIxICogbjM0CisgICAgICAgICAgICAgICAgICAgICArIG4xNCAqIG4yMiAqIG4zMQor
ICAgICAgICAgICAgICAgICAgICAgLSBuMTIgKiBuMjQgKiBuMzEKKyAgICAgICAgICAgICAgICAp
ICsKKyAgICAgICAgICAgICAgICBuNDQgKiAoCisgICAgICAgICAgICAgICAgICAgIC0gbjEzICog
bjIyICogbjMxCisgICAgICAgICAgICAgICAgICAgICAtIG4xMSAqIG4yMyAqIG4zMgorICAgICAg
ICAgICAgICAgICAgICAgKyBuMTEgKiBuMjIgKiBuMzMKKyAgICAgICAgICAgICAgICAgICAgICsg
bjEzICogbjIxICogbjMyCisgICAgICAgICAgICAgICAgICAgICAtIG4xMiAqIG4yMSAqIG4zMwor
ICAgICAgICAgICAgICAgICAgICAgKyBuMTIgKiBuMjMgKiBuMzEKKyAgICAgICAgICAgICAgICAp
CisKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgfSwKKworICAgICAgICB0cmFuc3Bvc2U6IGZ1
bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKyAgICAg
ICAgICAgIHZhciB0bXA7CisKKyAgICAgICAgICAgIHRtcCA9IHRlWyAxIF07IHRlWyAxIF0gPSB0
ZVsgNCBdOyB0ZVsgNCBdID0gdG1wOworICAgICAgICAgICAgdG1wID0gdGVbIDIgXTsgdGVbIDIg
XSA9IHRlWyA4IF07IHRlWyA4IF0gPSB0bXA7CisgICAgICAgICAgICB0bXAgPSB0ZVsgNiBdOyB0
ZVsgNiBdID0gdGVbIDkgXTsgdGVbIDkgXSA9IHRtcDsKKworICAgICAgICAgICAgdG1wID0gdGVb
IDMgXTsgdGVbIDMgXSA9IHRlWyAxMiBdOyB0ZVsgMTIgXSA9IHRtcDsKKyAgICAgICAgICAgIHRt
cCA9IHRlWyA3IF07IHRlWyA3IF0gPSB0ZVsgMTMgXTsgdGVbIDEzIF0gPSB0bXA7CisgICAgICAg
ICAgICB0bXAgPSB0ZVsgMTEgXTsgdGVbIDExIF0gPSB0ZVsgMTQgXTsgdGVbIDE0IF0gPSB0bXA7
CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0
UG9zaXRpb246IGZ1bmN0aW9uICggdiApIHsKKworICAgICAgICAgICAgdmFyIHRlID0gdGhpcy5l
bGVtZW50czsKKworICAgICAgICAgICAgdGVbIDEyIF0gPSB2Lng7CisgICAgICAgICAgICB0ZVsg
MTMgXSA9IHYueTsKKyAgICAgICAgICAgIHRlWyAxNCBdID0gdi56OworCisgICAgICAgICAgICBy
ZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGdldEludmVyc2U6IGZ1bmN0aW9u
ICggbSwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7CisKKyAgICAgICAgICAgIC8vIGJhc2VkIG9uIGh0
dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9u
cy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bQorICAgICAgICAgICAgdmFyIHRlID0gdGhpcy5lbGVt
ZW50cywKKyAgICAgICAgICAgICAgICBtZSA9IG0uZWxlbWVudHMsCisKKyAgICAgICAgICAgICAg
ICBuMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLCBuNDEgPSBtZVsg
MyBdLAorICAgICAgICAgICAgICAgIG4xMiA9IG1lWyA0IF0sIG4yMiA9IG1lWyA1IF0sIG4zMiA9
IG1lWyA2IF0sIG40MiA9IG1lWyA3IF0sCisgICAgICAgICAgICAgICAgbjEzID0gbWVbIDggXSwg
bjIzID0gbWVbIDkgXSwgbjMzID0gbWVbIDEwIF0sIG40MyA9IG1lWyAxMSBdLAorICAgICAgICAg
ICAgICAgIG4xNCA9IG1lWyAxMiBdLCBuMjQgPSBtZVsgMTMgXSwgbjM0ID0gbWVbIDE0IF0sIG40
NCA9IG1lWyAxNSBdLAorCisgICAgICAgICAgICAgICAgdDExID0gbjIzICogbjM0ICogbjQyIC0g
bjI0ICogbjMzICogbjQyICsgbjI0ICogbjMyICogbjQzIC0gbjIyICogbjM0ICogbjQzIC0gbjIz
ICogbjMyICogbjQ0ICsgbjIyICogbjMzICogbjQ0LAorICAgICAgICAgICAgICAgIHQxMiA9IG4x
NCAqIG4zMyAqIG40MiAtIG4xMyAqIG4zNCAqIG40MiAtIG4xNCAqIG4zMiAqIG40MyArIG4xMiAq
IG4zNCAqIG40MyArIG4xMyAqIG4zMiAqIG40NCAtIG4xMiAqIG4zMyAqIG40NCwKKyAgICAgICAg
ICAgICAgICB0MTMgPSBuMTMgKiBuMjQgKiBuNDIgLSBuMTQgKiBuMjMgKiBuNDIgKyBuMTQgKiBu
MjIgKiBuNDMgLSBuMTIgKiBuMjQgKiBuNDMgLSBuMTMgKiBuMjIgKiBuNDQgKyBuMTIgKiBuMjMg
KiBuNDQsCisgICAgICAgICAgICAgICAgdDE0ID0gbjE0ICogbjIzICogbjMyIC0gbjEzICogbjI0
ICogbjMyIC0gbjE0ICogbjIyICogbjMzICsgbjEyICogbjI0ICogbjMzICsgbjEzICogbjIyICog
bjM0IC0gbjEyICogbjIzICogbjM0OworCisgICAgICAgICAgICB2YXIgZGV0ID0gbjExICogdDEx
ICsgbjIxICogdDEyICsgbjMxICogdDEzICsgbjQxICogdDE0OworCisgICAgICAgICAgICBpZiAo
IGRldCA9PT0gMCApIHsKKworICAgICAgICAgICAgICAgIHZhciBtc2cgPSAiVEhSRUUuTWF0cml4
NC5nZXRJbnZlcnNlKCk6IGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiOwor
CisgICAgICAgICAgICAgICAgaWYgKCB0aHJvd09uRGVnZW5lcmF0ZSA9PT0gdHJ1ZSApIHsKKwor
ICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIG1zZyApOworCisgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIG1zZyAp
OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWRl
bnRpdHkoKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZGV0SW52ID0gMSAv
IGRldDsKKworICAgICAgICAgICAgdGVbIDAgXSA9IHQxMSAqIGRldEludjsKKyAgICAgICAgICAg
IHRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4z
MSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAq
IG40NCApICogZGV0SW52OworICAgICAgICAgICAgdGVbIDIgXSA9ICggbjIyICogbjM0ICogbjQx
IC0gbjI0ICogbjMyICogbjQxICsgbjI0ICogbjMxICogbjQyIC0gbjIxICogbjM0ICogbjQyIC0g
bjIyICogbjMxICogbjQ0ICsgbjIxICogbjMyICogbjQ0ICkgKiBkZXRJbnY7CisgICAgICAgICAg
ICB0ZVsgMyBdID0gKCBuMjMgKiBuMzIgKiBuNDEgLSBuMjIgKiBuMzMgKiBuNDEgLSBuMjMgKiBu
MzEgKiBuNDIgKyBuMjEgKiBuMzMgKiBuNDIgKyBuMjIgKiBuMzEgKiBuNDMgLSBuMjEgKiBuMzIg
KiBuNDMgKSAqIGRldEludjsKKworICAgICAgICAgICAgdGVbIDQgXSA9IHQxMiAqIGRldEludjsK
KyAgICAgICAgICAgIHRlWyA1IF0gPSAoIG4xMyAqIG4zNCAqIG40MSAtIG4xNCAqIG4zMyAqIG40
MSArIG4xNCAqIG4zMSAqIG40MyAtIG4xMSAqIG4zNCAqIG40MyAtIG4xMyAqIG4zMSAqIG40NCAr
IG4xMSAqIG4zMyAqIG40NCApICogZGV0SW52OworICAgICAgICAgICAgdGVbIDYgXSA9ICggbjE0
ICogbjMyICogbjQxIC0gbjEyICogbjM0ICogbjQxIC0gbjE0ICogbjMxICogbjQyICsgbjExICog
bjM0ICogbjQyICsgbjEyICogbjMxICogbjQ0IC0gbjExICogbjMyICogbjQ0ICkgKiBkZXRJbnY7
CisgICAgICAgICAgICB0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBu
NDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMg
KyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjsKKworICAgICAgICAgICAgdGVbIDggXSA9IHQx
MyAqIGRldEludjsKKyAgICAgICAgICAgIHRlWyA5IF0gPSAoIG4xNCAqIG4yMyAqIG40MSAtIG4x
MyAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMSAqIG40MyArIG4xMSAqIG4yNCAqIG40MyArIG4xMyAq
IG4yMSAqIG40NCAtIG4xMSAqIG4yMyAqIG40NCApICogZGV0SW52OworICAgICAgICAgICAgdGVb
IDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAq
IG40MiAtIG4xMSAqIG4yNCAqIG40MiAtIG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40
NCApICogZGV0SW52OworICAgICAgICAgICAgdGVbIDExIF0gPSAoIG4xMyAqIG4yMiAqIG40MSAt
IG4xMiAqIG4yMyAqIG40MSAtIG4xMyAqIG4yMSAqIG40MiArIG4xMSAqIG4yMyAqIG40MiArIG4x
MiAqIG4yMSAqIG40MyAtIG4xMSAqIG4yMiAqIG40MyApICogZGV0SW52OworCisgICAgICAgICAg
ICB0ZVsgMTIgXSA9IHQxNCAqIGRldEludjsKKyAgICAgICAgICAgIHRlWyAxMyBdID0gKCBuMTMg
KiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBu
MjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjsK
KyAgICAgICAgICAgIHRlWyAxNCBdID0gKCBuMTQgKiBuMjIgKiBuMzEgLSBuMTIgKiBuMjQgKiBu
MzEgLSBuMTQgKiBuMjEgKiBuMzIgKyBuMTEgKiBuMjQgKiBuMzIgKyBuMTIgKiBuMjEgKiBuMzQg
LSBuMTEgKiBuMjIgKiBuMzQgKSAqIGRldEludjsKKyAgICAgICAgICAgIHRlWyAxNSBdID0gKCBu
MTIgKiBuMjMgKiBuMzEgLSBuMTMgKiBuMjIgKiBuMzEgKyBuMTMgKiBuMjEgKiBuMzIgLSBuMTEg
KiBuMjMgKiBuMzIgLSBuMTIgKiBuMjEgKiBuMzMgKyBuMTEgKiBuMjIgKiBuMzMgKSAqIGRldElu
djsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBz
Y2FsZTogZnVuY3Rpb24gKCB2ICkgeworCisgICAgICAgICAgICB2YXIgdGUgPSB0aGlzLmVsZW1l
bnRzOworICAgICAgICAgICAgdmFyIHggPSB2LngsIHkgPSB2LnksIHogPSB2Lno7CisKKyAgICAg
ICAgICAgIHRlWyAwIF0gKj0geDsgdGVbIDQgXSAqPSB5OyB0ZVsgOCBdICo9IHo7CisgICAgICAg
ICAgICB0ZVsgMSBdICo9IHg7IHRlWyA1IF0gKj0geTsgdGVbIDkgXSAqPSB6OworICAgICAgICAg
ICAgdGVbIDIgXSAqPSB4OyB0ZVsgNiBdICo9IHk7IHRlWyAxMCBdICo9IHo7CisgICAgICAgICAg
ICB0ZVsgMyBdICo9IHg7IHRlWyA3IF0gKj0geTsgdGVbIDExIF0gKj0gejsKKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBnZXRNYXhTY2FsZU9uQXhp
czogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwor
CisgICAgICAgICAgICB2YXIgc2NhbGVYU3EgPSB0ZVsgMCBdICogdGVbIDAgXSArIHRlWyAxIF0g
KiB0ZVsgMSBdICsgdGVbIDIgXSAqIHRlWyAyIF07CisgICAgICAgICAgICB2YXIgc2NhbGVZU3Eg
PSB0ZVsgNCBdICogdGVbIDQgXSArIHRlWyA1IF0gKiB0ZVsgNSBdICsgdGVbIDYgXSAqIHRlWyA2
IF07CisgICAgICAgICAgICB2YXIgc2NhbGVaU3EgPSB0ZVsgOCBdICogdGVbIDggXSArIHRlWyA5
IF0gKiB0ZVsgOSBdICsgdGVbIDEwIF0gKiB0ZVsgMTAgXTsKKworICAgICAgICAgICAgcmV0dXJu
IE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgbWFrZVRyYW5zbGF0aW9uOiBmdW5jdGlvbiAoIHgsIHks
IHogKSB7CisKKyAgICAgICAgICAgIHRoaXMuc2V0KAorCisgICAgICAgICAgICAgICAgMSwgMCwg
MCwgeCwKKyAgICAgICAgICAgICAgICAwLCAxLCAwLCB5LAorICAgICAgICAgICAgICAgIDAsIDAs
IDEsIHosCisgICAgICAgICAgICAgICAgMCwgMCwgMCwgMQorCisgICAgICAgICAgICApOworCisg
ICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIG1ha2VSb3Rh
dGlvblg6IGZ1bmN0aW9uICggdGhldGEgKSB7CisKKyAgICAgICAgICAgIHZhciBjID0gTWF0aC5j
b3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTsKKworICAgICAgICAgICAgdGhpcy5z
ZXQoCisKKyAgICAgICAgICAgICAgICAxLCAwLCAgMCwgMCwKKyAgICAgICAgICAgICAgICAwLCBj
LCAtIHMsIDAsCisgICAgICAgICAgICAgICAgMCwgcywgIGMsIDAsCisgICAgICAgICAgICAgICAg
MCwgMCwgIDAsIDEKKworICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7
CisKKyAgICAgICAgfSwKKworICAgICAgICBtYWtlUm90YXRpb25ZOiBmdW5jdGlvbiAoIHRoZXRh
ICkgeworCisgICAgICAgICAgICB2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5z
aW4oIHRoZXRhICk7CisKKyAgICAgICAgICAgIHRoaXMuc2V0KAorCisgICAgICAgICAgICAgICAg
IGMsIDAsIHMsIDAsCisgICAgICAgICAgICAgICAgIDAsIDEsIDAsIDAsCisgICAgICAgICAgICAg
ICAgLSBzLCAwLCBjLCAwLAorICAgICAgICAgICAgICAgICAwLCAwLCAwLCAxCisKKyAgICAgICAg
ICAgICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAg
ICAgbWFrZVJvdGF0aW9uWjogZnVuY3Rpb24gKCB0aGV0YSApIHsKKworICAgICAgICAgICAgdmFy
IGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApOworCisgICAgICAg
ICAgICB0aGlzLnNldCgKKworICAgICAgICAgICAgICAgIGMsIC0gcywgMCwgMCwKKyAgICAgICAg
ICAgICAgICBzLCAgYywgMCwgMCwKKyAgICAgICAgICAgICAgICAwLCAgMCwgMSwgMCwKKyAgICAg
ICAgICAgICAgICAwLCAgMCwgMCwgMQorCisgICAgICAgICAgICApOworCisgICAgICAgICAgICBy
ZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIG1ha2VSb3RhdGlvbkF4aXM6IGZ1
bmN0aW9uICggYXhpcywgYW5nbGUgKSB7CisKKyAgICAgICAgICAgIC8vIEJhc2VkIG9uIGh0dHA6
Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcAorCisg
ICAgICAgICAgICB2YXIgYyA9IE1hdGguY29zKCBhbmdsZSApOworICAgICAgICAgICAgdmFyIHMg
PSBNYXRoLnNpbiggYW5nbGUgKTsKKyAgICAgICAgICAgIHZhciB0ID0gMSAtIGM7CisgICAgICAg
ICAgICB2YXIgeCA9IGF4aXMueCwgeSA9IGF4aXMueSwgeiA9IGF4aXMuejsKKyAgICAgICAgICAg
IHZhciB0eCA9IHQgKiB4LCB0eSA9IHQgKiB5OworCisgICAgICAgICAgICB0aGlzLnNldCgKKwor
ICAgICAgICAgICAgICAgIHR4ICogeCArIGMsIHR4ICogeSAtIHMgKiB6LCB0eCAqIHogKyBzICog
eSwgMCwKKyAgICAgICAgICAgICAgICB0eCAqIHkgKyBzICogeiwgdHkgKiB5ICsgYywgdHkgKiB6
IC0gcyAqIHgsIDAsCisgICAgICAgICAgICAgICAgdHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMg
KiB4LCB0ICogeiAqIHogKyBjLCAwLAorICAgICAgICAgICAgICAgIDAsIDAsIDAsIDEKKworICAg
ICAgICAgICAgKTsKKworICAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisK
KyAgICAgICAgbWFrZVNjYWxlOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7CisKKyAgICAgICAgICAg
IHRoaXMuc2V0KAorCisgICAgICAgICAgICAgICAgeCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAg
ICAwLCB5LCAwLCAwLAorICAgICAgICAgICAgICAgIDAsIDAsIHosIDAsCisgICAgICAgICAgICAg
ICAgMCwgMCwgMCwgMQorCisgICAgICAgICAgICApOworCisgICAgICAgICAgICByZXR1cm4gdGhp
czsKKworICAgICAgICB9LAorCisgICAgICAgIG1ha2VTaGVhcjogZnVuY3Rpb24gKCB4LCB5LCB6
ICkgeworCisgICAgICAgICAgICB0aGlzLnNldCgKKworICAgICAgICAgICAgICAgIDEsIHksIHos
IDAsCisgICAgICAgICAgICAgICAgeCwgMSwgeiwgMCwKKyAgICAgICAgICAgICAgICB4LCB5LCAx
LCAwLAorICAgICAgICAgICAgICAgIDAsIDAsIDAsIDEKKworICAgICAgICAgICAgKTsKKworICAg
ICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBjb21wb3NlOiBm
dW5jdGlvbiAoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHsKKworICAgICAgICAgICAg
dGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiApOworICAgICAgICAg
ICAgdGhpcy5zY2FsZSggc2NhbGUgKTsKKyAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oIHBv
c2l0aW9uICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgZGVjb21wb3NlOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciB2ZWN0b3Ig
PSBuZXcgVmVjdG9yMygpOworICAgICAgICAgICAgdmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7
CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBkZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0
ZXJuaW9uLCBzY2FsZSApIHsKKworICAgICAgICAgICAgICAgIHZhciB0ZSA9IHRoaXMuZWxlbWVu
dHM7CisKKyAgICAgICAgICAgICAgICB2YXIgc3ggPSB2ZWN0b3Iuc2V0KCB0ZVsgMCBdLCB0ZVsg
MSBdLCB0ZVsgMiBdICkubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgdmFyIHN5ID0gdmVjdG9y
LnNldCggdGVbIDQgXSwgdGVbIDUgXSwgdGVbIDYgXSApLmxlbmd0aCgpOworICAgICAgICAgICAg
ICAgIHZhciBzeiA9IHZlY3Rvci5zZXQoIHRlWyA4IF0sIHRlWyA5IF0sIHRlWyAxMCBdICkubGVu
Z3RoKCk7CisKKyAgICAgICAgICAgICAgICAvLyBpZiBkZXRlcm1pbmUgaXMgbmVnYXRpdmUsIHdl
IG5lZWQgdG8gaW52ZXJ0IG9uZSBzY2FsZQorICAgICAgICAgICAgICAgIHZhciBkZXQgPSB0aGlz
LmRldGVybWluYW50KCk7CisgICAgICAgICAgICAgICAgaWYgKCBkZXQgPCAwICkgc3ggPSAtIHN4
OworCisgICAgICAgICAgICAgICAgcG9zaXRpb24ueCA9IHRlWyAxMiBdOworICAgICAgICAgICAg
ICAgIHBvc2l0aW9uLnkgPSB0ZVsgMTMgXTsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbi56ID0g
dGVbIDE0IF07CisKKyAgICAgICAgICAgICAgICAvLyBzY2FsZSB0aGUgcm90YXRpb24gcGFydAor
ICAgICAgICAgICAgICAgIG1hdHJpeC5jb3B5KCB0aGlzICk7CisKKyAgICAgICAgICAgICAgICB2
YXIgaW52U1ggPSAxIC8gc3g7CisgICAgICAgICAgICAgICAgdmFyIGludlNZID0gMSAvIHN5Owor
ICAgICAgICAgICAgICAgIHZhciBpbnZTWiA9IDEgLyBzejsKKworICAgICAgICAgICAgICAgIG1h
dHJpeC5lbGVtZW50c1sgMCBdICo9IGludlNYOworICAgICAgICAgICAgICAgIG1hdHJpeC5lbGVt
ZW50c1sgMSBdICo9IGludlNYOworICAgICAgICAgICAgICAgIG1hdHJpeC5lbGVtZW50c1sgMiBd
ICo9IGludlNYOworCisgICAgICAgICAgICAgICAgbWF0cml4LmVsZW1lbnRzWyA0IF0gKj0gaW52
U1k7CisgICAgICAgICAgICAgICAgbWF0cml4LmVsZW1lbnRzWyA1IF0gKj0gaW52U1k7CisgICAg
ICAgICAgICAgICAgbWF0cml4LmVsZW1lbnRzWyA2IF0gKj0gaW52U1k7CisKKyAgICAgICAgICAg
ICAgICBtYXRyaXguZWxlbWVudHNbIDggXSAqPSBpbnZTWjsKKyAgICAgICAgICAgICAgICBtYXRy
aXguZWxlbWVudHNbIDkgXSAqPSBpbnZTWjsKKyAgICAgICAgICAgICAgICBtYXRyaXguZWxlbWVu
dHNbIDEwIF0gKj0gaW52U1o7CisKKyAgICAgICAgICAgICAgICBxdWF0ZXJuaW9uLnNldEZyb21S
b3RhdGlvbk1hdHJpeCggbWF0cml4ICk7CisKKyAgICAgICAgICAgICAgICBzY2FsZS54ID0gc3g7
CisgICAgICAgICAgICAgICAgc2NhbGUueSA9IHN5OworICAgICAgICAgICAgICAgIHNjYWxlLnog
PSBzejsKKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgICAgICB9Owor
CisgICAgICAgIH0oKSwKKworICAgICAgICBtYWtlUGVyc3BlY3RpdmU6IGZ1bmN0aW9uICggbGVm
dCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7CisKKyAgICAgICAgICAgIGlmICgg
ZmFyID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdU
SFJFRS5NYXRyaXg0OiAubWFrZVBlcnNwZWN0aXZlKCkgaGFzIGJlZW4gcmVkZWZpbmVkIGFuZCBo
YXMgYSBuZXcgc2lnbmF0dXJlLiBQbGVhc2UgY2hlY2sgdGhlIGRvY3MuJyApOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CisgICAgICAgICAg
ICB2YXIgeCA9IDIgKiBuZWFyIC8gKCByaWdodCAtIGxlZnQgKTsKKyAgICAgICAgICAgIHZhciB5
ID0gMiAqIG5lYXIgLyAoIHRvcCAtIGJvdHRvbSApOworCisgICAgICAgICAgICB2YXIgYSA9ICgg
cmlnaHQgKyBsZWZ0ICkgLyAoIHJpZ2h0IC0gbGVmdCApOworICAgICAgICAgICAgdmFyIGIgPSAo
IHRvcCArIGJvdHRvbSApIC8gKCB0b3AgLSBib3R0b20gKTsKKyAgICAgICAgICAgIHZhciBjID0g
LSAoIGZhciArIG5lYXIgKSAvICggZmFyIC0gbmVhciApOworICAgICAgICAgICAgdmFyIGQgPSAt
IDIgKiBmYXIgKiBuZWFyIC8gKCBmYXIgLSBuZWFyICk7CisKKyAgICAgICAgICAgIHRlWyAwIF0g
PSB4OyAgICB0ZVsgNCBdID0gMDsgICAgdGVbIDggXSA9IGE7ICAgIHRlWyAxMiBdID0gMDsKKyAg
ICAgICAgICAgIHRlWyAxIF0gPSAwOyAgICB0ZVsgNSBdID0geTsgICAgdGVbIDkgXSA9IGI7ICAg
IHRlWyAxMyBdID0gMDsKKyAgICAgICAgICAgIHRlWyAyIF0gPSAwOyAgICB0ZVsgNiBdID0gMDsg
ICAgdGVbIDEwIF0gPSBjOyAgIHRlWyAxNCBdID0gZDsKKyAgICAgICAgICAgIHRlWyAzIF0gPSAw
OyAgICB0ZVsgNyBdID0gMDsgICAgdGVbIDExIF0gPSAtIDE7IHRlWyAxNSBdID0gMDsKKworICAg
ICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBtYWtlT3J0aG9n
cmFwaGljOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkg
eworCisgICAgICAgICAgICB2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOworICAgICAgICAgICAgdmFy
IHcgPSAxLjAgLyAoIHJpZ2h0IC0gbGVmdCApOworICAgICAgICAgICAgdmFyIGggPSAxLjAgLyAo
IHRvcCAtIGJvdHRvbSApOworICAgICAgICAgICAgdmFyIHAgPSAxLjAgLyAoIGZhciAtIG5lYXIg
KTsKKworICAgICAgICAgICAgdmFyIHggPSAoIHJpZ2h0ICsgbGVmdCApICogdzsKKyAgICAgICAg
ICAgIHZhciB5ID0gKCB0b3AgKyBib3R0b20gKSAqIGg7CisgICAgICAgICAgICB2YXIgeiA9ICgg
ZmFyICsgbmVhciApICogcDsKKworICAgICAgICAgICAgdGVbIDAgXSA9IDIgKiB3OyAgICB0ZVsg
NCBdID0gMDsgICAgdGVbIDggXSA9IDA7ICAgIHRlWyAxMiBdID0gLSB4OworICAgICAgICAgICAg
dGVbIDEgXSA9IDA7ICAgIHRlWyA1IF0gPSAyICogaDsgICAgdGVbIDkgXSA9IDA7ICAgIHRlWyAx
MyBdID0gLSB5OworICAgICAgICAgICAgdGVbIDIgXSA9IDA7ICAgIHRlWyA2IF0gPSAwOyAgICB0
ZVsgMTAgXSA9IC0gMiAqIHA7IHRlWyAxNCBdID0gLSB6OworICAgICAgICAgICAgdGVbIDMgXSA9
IDA7ICAgIHRlWyA3IF0gPSAwOyAgICB0ZVsgMTEgXSA9IDA7ICAgdGVbIDE1IF0gPSAxOworCisg
ICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGVxdWFsczog
ZnVuY3Rpb24gKCBtYXRyaXggKSB7CisKKyAgICAgICAgICAgIHZhciB0ZSA9IHRoaXMuZWxlbWVu
dHM7CisgICAgICAgICAgICB2YXIgbWUgPSBtYXRyaXguZWxlbWVudHM7CisKKyAgICAgICAgICAg
IGZvciAoIHZhciBpID0gMDsgaSA8IDE2OyBpICsrICkgeworCisgICAgICAgICAgICAgICAgaWYg
KCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIH0sCisKKyAgICAgICAgZnJvbUFy
cmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAgIGlmICggb2Zm
c2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisgICAgICAgICAgICBmb3IgKCB2YXIg
aSA9IDA7IGkgPCAxNjsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudHNb
IGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICB0b0FycmF5OiBmdW5jdGlv
biAoIGFycmF5LCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAgIGlmICggYXJyYXkgPT09IHVuZGVm
aW5lZCApIGFycmF5ID0gW107CisgICAgICAgICAgICBpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVk
ICkgb2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKwor
ICAgICAgICAgICAgYXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTsKKyAgICAgICAgICAgIGFycmF5
WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdOworICAgICAgICAgICAgYXJyYXlbIG9mZnNldCArIDIg
XSA9IHRlWyAyIF07CisgICAgICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTsK
KworICAgICAgICAgICAgYXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07CisgICAgICAgICAg
ICBhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTsKKyAgICAgICAgICAgIGFycmF5WyBvZmZz
ZXQgKyA2IF0gPSB0ZVsgNiBdOworICAgICAgICAgICAgYXJyYXlbIG9mZnNldCArIDcgXSA9IHRl
WyA3IF07CisKKyAgICAgICAgICAgIGFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdOworICAg
ICAgICAgICAgYXJyYXlbIG9mZnNldCArIDkgXSA9IHRlWyA5IF07CisgICAgICAgICAgICBhcnJh
eVsgb2Zmc2V0ICsgMTAgXSA9IHRlWyAxMCBdOworICAgICAgICAgICAgYXJyYXlbIG9mZnNldCAr
IDExIF0gPSB0ZVsgMTEgXTsKKworICAgICAgICAgICAgYXJyYXlbIG9mZnNldCArIDEyIF0gPSB0
ZVsgMTIgXTsKKyAgICAgICAgICAgIGFycmF5WyBvZmZzZXQgKyAxMyBdID0gdGVbIDEzIF07Cisg
ICAgICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMTQgXSA9IHRlWyAxNCBdOworICAgICAgICAgICAg
YXJyYXlbIG9mZnNldCArIDE1IF0gPSB0ZVsgMTUgXTsKKworICAgICAgICAgICAgcmV0dXJuIGFy
cmF5OworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3Ig
YWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAgICovCisKKyAgICBmdW5j
dGlvbiBEYXRhVGV4dHVyZSggZGF0YSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBtYXBw
aW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBlbmNv
ZGluZyApIHsKKworICAgICAgICBUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwsIG1hcHBpbmcsIHdy
YXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9w
eSwgZW5jb2RpbmcgKTsKKworICAgICAgICB0aGlzLmltYWdlID0geyBkYXRhOiBkYXRhLCB3aWR0
aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07CisKKyAgICAgICAgdGhpcy5tYWdGaWx0ZXIgPSBt
YWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7CisgICAg
ICAgIHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIg
OiBOZWFyZXN0RmlsdGVyOworCisgICAgICAgIHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7
CisgICAgICAgIHRoaXMuZmxpcFkgPSBmYWxzZTsKKyAgICAgICAgdGhpcy51bnBhY2tBbGlnbm1l
bnQgPSAxOworCisgICAgfQorCisgICAgRGF0YVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNy
ZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTsKKyAgICBEYXRhVGV4dHVyZS5wcm90b3R5cGUuY29u
c3RydWN0b3IgPSBEYXRhVGV4dHVyZTsKKworICAgIERhdGFUZXh0dXJlLnByb3RvdHlwZS5pc0Rh
dGFUZXh0dXJlID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0
cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBDdWJlVGV4dHVyZSggaW1h
Z2VzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQs
IHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkgeworCisgICAgICAgIGltYWdlcyA9IGltYWdl
cyAhPT0gdW5kZWZpbmVkID8gaW1hZ2VzIDogW107CisgICAgICAgIG1hcHBpbmcgPSBtYXBwaW5n
ICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOworCisgICAg
ICAgIFRleHR1cmUuY2FsbCggdGhpcywgaW1hZ2VzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1h
Z0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7
CisKKyAgICAgICAgdGhpcy5mbGlwWSA9IGZhbHNlOworCisgICAgfQorCisgICAgQ3ViZVRleHR1
cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTsKKyAgICBD
dWJlVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJlVGV4dHVyZTsKKworICAgIEN1
YmVUZXh0dXJlLnByb3RvdHlwZS5pc0N1YmVUZXh0dXJlID0gdHJ1ZTsKKworICAgIE9iamVjdC5k
ZWZpbmVQcm9wZXJ0eSggQ3ViZVRleHR1cmUucHJvdG90eXBlLCAnaW1hZ2VzJywgeworCisgICAg
ICAgIGdldDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5pbWFnZTsK
KworICAgICAgICB9LAorCisgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAg
ICAgICAgICAgdGhpcy5pbWFnZSA9IHZhbHVlOworCisgICAgICAgIH0KKworICAgIH0gKTsKKwor
ICAgIC8qKgorICAgICAqIEBhdXRob3IgdHNjaHcKKyAgICAgKgorICAgICAqIFVuaWZvcm1zIG9m
IGEgcHJvZ3JhbS4KKyAgICAgKiBUaG9zZSBmb3JtIGEgdHJlZSBzdHJ1Y3R1cmUgd2l0aCBhIHNw
ZWNpYWwgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgdGhlIHJvb3QsCisgICAgICogd2hpY2ggeW91
IGdldCBieSBjYWxsaW5nICduZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVy
ICknLgorICAgICAqCisgICAgICoKKyAgICAgKiBQcm9wZXJ0aWVzIG9mIGlubmVyIG5vZGVzIGlu
Y2x1ZGluZyB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjoKKyAgICAgKgorICAgICAqIC5zZXEgLSBh
cnJheSBvZiBuZXN0ZWQgdW5pZm9ybXMKKyAgICAgKiAubWFwIC0gbmVzdGVkIHVuaWZvcm1zIGJ5
IG5hbWUKKyAgICAgKgorICAgICAqCisgICAgICogTWV0aG9kcyBvZiBhbGwgbm9kZXMgZXhjZXB0
IHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyOgorICAgICAqCisgICAgICogLnNldFZhbHVlKCBnbCwg
dmFsdWUsIFtyZW5kZXJlcl0gKQorICAgICAqCisgICAgICogICAgICB1cGxvYWRzIGEgdW5pZm9y
bSB2YWx1ZShzKQorICAgICAqICAgICAgdGhlICdyZW5kZXJlcicgcGFyYW1ldGVyIGlzIG5lZWRl
ZCBmb3Igc2FtcGxlciB1bmlmb3JtcworICAgICAqCisgICAgICoKKyAgICAgKiBTdGF0aWMgbWV0
aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAocmVuZGVyZXIgZmFjdG9yaXphdGlvbnMp
OgorICAgICAqCisgICAgICogLnVwbG9hZCggZ2wsIHNlcSwgdmFsdWVzLCByZW5kZXJlciApCisg
ICAgICoKKyAgICAgKiAgICAgIHNldHMgdW5pZm9ybXMgaW4gJ3NlcScgdG8gJ3ZhbHVlc1tpZF0u
dmFsdWUnCisgICAgICoKKyAgICAgKiAuc2VxV2l0aFZhbHVlKCBzZXEsIHZhbHVlcyApIDogZmls
dGVyZWRTZXEKKyAgICAgKgorICAgICAqICAgICAgZmlsdGVycyAnc2VxJyBlbnRyaWVzIHdpdGgg
Y29ycmVzcG9uZGluZyBlbnRyeSBpbiB2YWx1ZXMKKyAgICAgKgorICAgICAqCisgICAgICogTWV0
aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAocmVuZGVyZXIgZmFjdG9yaXphdGlvbnMp
OgorICAgICAqCisgICAgICogLnNldFZhbHVlKCBnbCwgbmFtZSwgdmFsdWUgKQorICAgICAqCisg
ICAgICogICAgICBzZXRzIHVuaWZvcm0gd2l0aCAgbmFtZSAnbmFtZScgdG8gJ3ZhbHVlJworICAg
ICAqCisgICAgICogLnNldCggZ2wsIG9iaiwgcHJvcCApCisgICAgICoKKyAgICAgKiAgICAgIHNl
dHMgdW5pZm9ybSBmcm9tIG9iamVjdCBhbmQgcHJvcGVydHkgd2l0aCBzYW1lIG5hbWUgdGhhbiB1
bmlmb3JtCisgICAgICoKKyAgICAgKiAuc2V0T3B0aW9uYWwoIGdsLCBvYmosIHByb3AgKQorICAg
ICAqCisgICAgICogICAgICBsaWtlIC5zZXQgZm9yIGFuIG9wdGlvbmFsIHByb3BlcnR5IG9mIHRo
ZSBvYmplY3QKKyAgICAgKgorICAgICAqLworCisgICAgdmFyIGVtcHR5VGV4dHVyZSA9IG5ldyBU
ZXh0dXJlKCk7CisgICAgdmFyIGVtcHR5Q3ViZVRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTsK
KworICAgIC8vIC0tLSBCYXNlIGZvciBpbm5lciBub2RlcyAoaW5jbHVkaW5nIHRoZSByb290KSAt
LS0KKworICAgIGZ1bmN0aW9uIFVuaWZvcm1Db250YWluZXIoKSB7CisKKyAgICAgICAgdGhpcy5z
ZXEgPSBbXTsKKyAgICAgICAgdGhpcy5tYXAgPSB7fTsKKworICAgIH0KKworICAgIC8vIC0tLSBV
dGlsaXRpZXMgLS0tCisKKyAgICAvLyBBcnJheSBDYWNoZXMgKHByb3ZpZGUgdHlwZWQgYXJyYXlz
IGZvciB0ZW1wb3JhcnkgYnkgc2l6ZSkKKworICAgIHZhciBhcnJheUNhY2hlRjMyID0gW107Cisg
ICAgdmFyIGFycmF5Q2FjaGVJMzIgPSBbXTsKKworICAgIC8vIEZsb2F0MzJBcnJheSBjYWNoZXMg
dXNlZCBmb3IgdXBsb2FkaW5nIE1hdHJpeCB1bmlmb3JtcworCisgICAgdmFyIG1hdDRhcnJheSA9
IG5ldyBGbG9hdDMyQXJyYXkoIDE2ICk7CisgICAgdmFyIG1hdDNhcnJheSA9IG5ldyBGbG9hdDMy
QXJyYXkoIDkgKTsKKworICAgIC8vIEZsYXR0ZW5pbmcgZm9yIGFycmF5cyBvZiB2ZWN0b3JzIGFu
ZCBtYXRyaWNlcworCisgICAgZnVuY3Rpb24gZmxhdHRlbiggYXJyYXksIG5CbG9ja3MsIGJsb2Nr
U2l6ZSApIHsKKworICAgICAgICB2YXIgZmlyc3RFbGVtID0gYXJyYXlbIDAgXTsKKworICAgICAg
ICBpZiAoIGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDAgKSByZXR1cm4gYXJyYXk7Cisg
ICAgICAgIC8vIHVub3B0aW1pemVkOiAhIGlzTmFOKCBmaXJzdEVsZW0gKQorICAgICAgICAvLyBz
ZWUgaHR0cDovL2phY2tzb25kdW5zdGFuLmNvbS9hcnRpY2xlcy85ODMKKworICAgICAgICB2YXIg
biA9IG5CbG9ja3MgKiBibG9ja1NpemUsCisgICAgICAgICAgICByID0gYXJyYXlDYWNoZUYzMlsg
biBdOworCisgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICBy
ID0gbmV3IEZsb2F0MzJBcnJheSggbiApOworICAgICAgICAgICAgYXJyYXlDYWNoZUYzMlsgbiBd
ID0gcjsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBuQmxvY2tzICE9PSAwICkgeworCisg
ICAgICAgICAgICBmaXJzdEVsZW0udG9BcnJheSggciwgMCApOworCisgICAgICAgICAgICBmb3Ig
KCB2YXIgaSA9IDEsIG9mZnNldCA9IDA7IGkgIT09IG5CbG9ja3M7ICsrIGkgKSB7CisKKyAgICAg
ICAgICAgICAgICBvZmZzZXQgKz0gYmxvY2tTaXplOworICAgICAgICAgICAgICAgIGFycmF5WyBp
IF0udG9BcnJheSggciwgb2Zmc2V0ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisK
KyAgICAgICAgcmV0dXJuIHI7CisKKyAgICB9CisKKyAgICAvLyBUZXh0dXJlIHVuaXQgYWxsb2Nh
dGlvbgorCisgICAgZnVuY3Rpb24gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKSB7CisKKyAg
ICAgICAgdmFyIHIgPSBhcnJheUNhY2hlSTMyWyBuIF07CisKKyAgICAgICAgaWYgKCByID09PSB1
bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgIHIgPSBuZXcgSW50MzJBcnJheSggbiApOworICAg
ICAgICAgICAgYXJyYXlDYWNoZUkzMlsgbiBdID0gcjsKKworICAgICAgICB9CisKKyAgICAgICAg
Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkKKyAgICAgICAgICAgIHJbIGkgXSA9IHJl
bmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTsKKworICAgICAgICByZXR1cm4gcjsKKworICAgIH0K
KworICAgIC8vIC0tLSBTZXR0ZXJzIC0tLQorCisgICAgLy8gTm90ZTogRGVmaW5pbmcgdGhlc2Ug
bWV0aG9kcyBleHRlcm5hbGx5LCBiZWNhdXNlIHRoZXkgY29tZSBpbiBhIGJ1bmNoCisgICAgLy8g
YW5kIHRoaXMgd2F5IHRoZWlyIG5hbWVzIG1pbmlmeS4KKworICAgIC8vIFNpbmdsZSBzY2FsYXIK
KworICAgIGZ1bmN0aW9uIHNldFZhbHVlMWYoIGdsLCB2ICkgeyBnbC51bmlmb3JtMWYoIHRoaXMu
YWRkciwgdiApOyB9CisgICAgZnVuY3Rpb24gc2V0VmFsdWUxaSggZ2wsIHYgKSB7IGdsLnVuaWZv
cm0xaSggdGhpcy5hZGRyLCB2ICk7IH0KKworICAgIC8vIFNpbmdsZSBmbG9hdCB2ZWN0b3IgKGZy
b20gZmxhdCBhcnJheSBvciBUSFJFRS5WZWN0b3JOKQorCisgICAgZnVuY3Rpb24gc2V0VmFsdWUy
ZnYoIGdsLCB2ICkgeworCisgICAgICAgIGlmICggdi54ID09PSB1bmRlZmluZWQgKSBnbC51bmlm
b3JtMmZ2KCB0aGlzLmFkZHIsIHYgKTsKKyAgICAgICAgZWxzZSBnbC51bmlmb3JtMmYoIHRoaXMu
YWRkciwgdi54LCB2LnkgKTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIHNldFZhbHVlM2Z2KCBn
bCwgdiApIHsKKworICAgICAgICBpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkKKyAgICAgICAgICAg
IGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56ICk7CisgICAgICAgIGVsc2Ug
aWYgKCB2LnIgIT09IHVuZGVmaW5lZCApCisgICAgICAgICAgICBnbC51bmlmb3JtM2YoIHRoaXMu
YWRkciwgdi5yLCB2LmcsIHYuYiApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnbC51bmlm
b3JtM2Z2KCB0aGlzLmFkZHIsIHYgKTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIHNldFZhbHVl
NGZ2KCBnbCwgdiApIHsKKworICAgICAgICBpZiAoIHYueCA9PT0gdW5kZWZpbmVkICkgZ2wudW5p
Zm9ybTRmdiggdGhpcy5hZGRyLCB2ICk7CisgICAgICAgIGVsc2UgZ2wudW5pZm9ybTRmKCB0aGlz
LmFkZHIsIHYueCwgdi55LCB2LnosIHYudyApOworCisgICAgfQorCisgICAgLy8gU2luZ2xlIG1h
dHJpeCAoZnJvbSBmbGF0IGFycmF5IG9yIE1hdHJpeE4pCisKKyAgICBmdW5jdGlvbiBzZXRWYWx1
ZTJmbSggZ2wsIHYgKSB7CisKKyAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRy
LCBmYWxzZSwgdi5lbGVtZW50cyB8fCB2ICk7CisKKyAgICB9CisKKyAgICBmdW5jdGlvbiBzZXRW
YWx1ZTNmbSggZ2wsIHYgKSB7CisKKyAgICAgICAgaWYgKCB2LmVsZW1lbnRzID09PSB1bmRlZmlu
ZWQgKSB7CisKKyAgICAgICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFs
c2UsIHYgKTsKKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBtYXQzYXJyYXkuc2V0
KCB2LmVsZW1lbnRzICk7CisgICAgICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFk
ZHIsIGZhbHNlLCBtYXQzYXJyYXkgKTsKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICBmdW5j
dGlvbiBzZXRWYWx1ZTRmbSggZ2wsIHYgKSB7CisKKyAgICAgICAgaWYgKCB2LmVsZW1lbnRzID09
PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMu
YWRkciwgZmFsc2UsIHYgKTsKKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBtYXQ0
YXJyYXkuc2V0KCB2LmVsZW1lbnRzICk7CisgICAgICAgICAgICBnbC51bmlmb3JtTWF0cml4NGZ2
KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQ0YXJyYXkgKTsKKworICAgICAgICB9CisKKyAgICB9CisK
KyAgICAvLyBTaW5nbGUgdGV4dHVyZSAoMkQgLyBDdWJlKQorCisgICAgZnVuY3Rpb24gc2V0VmFs
dWVUMSggZ2wsIHYsIHJlbmRlcmVyICkgeworCisgICAgICAgIHZhciB1bml0ID0gcmVuZGVyZXIu
YWxsb2NUZXh0dXJlVW5pdCgpOworICAgICAgICBnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5p
dCApOworICAgICAgICByZW5kZXJlci5zZXRUZXh0dXJlMkQoIHYgfHwgZW1wdHlUZXh0dXJlLCB1
bml0ICk7CisKKyAgICB9CisKKyAgICBmdW5jdGlvbiBzZXRWYWx1ZVQ2KCBnbCwgdiwgcmVuZGVy
ZXIgKSB7CisKKyAgICAgICAgdmFyIHVuaXQgPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7
CisgICAgICAgIGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB1bml0ICk7CisgICAgICAgIHJlbmRl
cmVyLnNldFRleHR1cmVDdWJlKCB2IHx8IGVtcHR5Q3ViZVRleHR1cmUsIHVuaXQgKTsKKworICAg
IH0KKworICAgIC8vIEludGVnZXIgLyBCb29sZWFuIHZlY3RvcnMgb3IgYXJyYXlzIHRoZXJlb2Yg
KGFsd2F5cyBmbGF0IGFycmF5cykKKworICAgIGZ1bmN0aW9uIHNldFZhbHVlMml2KCBnbCwgdiAp
IHsgZ2wudW5pZm9ybTJpdiggdGhpcy5hZGRyLCB2ICk7IH0KKyAgICBmdW5jdGlvbiBzZXRWYWx1
ZTNpdiggZ2wsIHYgKSB7IGdsLnVuaWZvcm0zaXYoIHRoaXMuYWRkciwgdiApOyB9CisgICAgZnVu
Y3Rpb24gc2V0VmFsdWU0aXYoIGdsLCB2ICkgeyBnbC51bmlmb3JtNGl2KCB0aGlzLmFkZHIsIHYg
KTsgfQorCisgICAgLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgdGhlIHNp
bmd1bGFyIGNhc2UKKworICAgIGZ1bmN0aW9uIGdldFNpbmd1bGFyU2V0dGVyKCB0eXBlICkgewor
CisgICAgICAgIHN3aXRjaCAoIHR5cGUgKSB7CisKKyAgICAgICAgICAgIGNhc2UgMHgxNDA2OiBy
ZXR1cm4gc2V0VmFsdWUxZjsgLy8gRkxPQVQKKyAgICAgICAgICAgIGNhc2UgMHg4YjUwOiByZXR1
cm4gc2V0VmFsdWUyZnY7IC8vIF9WRUMyCisgICAgICAgICAgICBjYXNlIDB4OGI1MTogcmV0dXJu
IHNldFZhbHVlM2Z2OyAvLyBfVkVDMworICAgICAgICAgICAgY2FzZSAweDhiNTI6IHJldHVybiBz
ZXRWYWx1ZTRmdjsgLy8gX1ZFQzQKKworICAgICAgICAgICAgY2FzZSAweDhiNWE6IHJldHVybiBz
ZXRWYWx1ZTJmbTsgLy8gX01BVDIKKyAgICAgICAgICAgIGNhc2UgMHg4YjViOiByZXR1cm4gc2V0
VmFsdWUzZm07IC8vIF9NQVQzCisgICAgICAgICAgICBjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZh
bHVlNGZtOyAvLyBfTUFUNAorCisgICAgICAgICAgICBjYXNlIDB4OGI1ZTogY2FzZSAweDhkNjY6
IHJldHVybiBzZXRWYWx1ZVQxOyAvLyBTQU1QTEVSXzJELCBTQU1QTEVSX0VYVEVSTkFMX09FUwor
ICAgICAgICAgICAgY2FzZSAweDhiNjA6IHJldHVybiBzZXRWYWx1ZVQ2OyAvLyBTQU1QTEVSX0NV
QkUKKworICAgICAgICAgICAgY2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFs
dWUxaTsgLy8gSU5ULCBCT09MCisgICAgICAgICAgICBjYXNlIDB4OGI1MzogY2FzZSAweDhiNTc6
IHJldHVybiBzZXRWYWx1ZTJpdjsgLy8gX1ZFQzIKKyAgICAgICAgICAgIGNhc2UgMHg4YjU0OiBj
YXNlIDB4OGI1ODogcmV0dXJuIHNldFZhbHVlM2l2OyAvLyBfVkVDMworICAgICAgICAgICAgY2Fz
ZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0CisKKyAg
ICAgICAgfQorCisgICAgfQorCisgICAgLy8gQXJyYXkgb2Ygc2NhbGFycworCisgICAgZnVuY3Rp
b24gc2V0VmFsdWUxZnYoIGdsLCB2ICkgeyBnbC51bmlmb3JtMWZ2KCB0aGlzLmFkZHIsIHYgKTsg
fQorICAgIGZ1bmN0aW9uIHNldFZhbHVlMWl2KCBnbCwgdiApIHsgZ2wudW5pZm9ybTFpdiggdGhp
cy5hZGRyLCB2ICk7IH0KKworICAgIC8vIEFycmF5IG9mIHZlY3RvcnMgKGZsYXQgb3IgZnJvbSBU
SFJFRSBjbGFzc2VzKQorCisgICAgZnVuY3Rpb24gc2V0VmFsdWVWMmEoIGdsLCB2ICkgeworCisg
ICAgICAgIGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAy
ICkgKTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIHNldFZhbHVlVjNhKCBnbCwgdiApIHsKKwor
ICAgICAgICBnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwg
MyApICk7CisKKyAgICB9CisKKyAgICBmdW5jdGlvbiBzZXRWYWx1ZVY0YSggZ2wsIHYgKSB7CisK
KyAgICAgICAgZ2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUs
IDQgKSApOworCisgICAgfQorCisgICAgLy8gQXJyYXkgb2YgbWF0cmljZXMgKGZsYXQgb3IgZnJv
bSBUSFJFRSBjbGFzZXMpCisKKyAgICBmdW5jdGlvbiBzZXRWYWx1ZU0yYSggZ2wsIHYgKSB7CisK
KyAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbigg
diwgdGhpcy5zaXplLCA0ICkgKTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIHNldFZhbHVlTTNh
KCBnbCwgdiApIHsKKworICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZh
bHNlLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDkgKSApOworCisgICAgfQorCisgICAgZnVuY3Rp
b24gc2V0VmFsdWVNNGEoIGdsLCB2ICkgeworCisgICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYo
IHRoaXMuYWRkciwgZmFsc2UsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMTYgKSApOworCisgICAg
fQorCisgICAgLy8gQXJyYXkgb2YgdGV4dHVyZXMgKDJEIC8gQ3ViZSkKKworICAgIGZ1bmN0aW9u
IHNldFZhbHVlVDFhKCBnbCwgdiwgcmVuZGVyZXIgKSB7CisKKyAgICAgICAgdmFyIG4gPSB2Lmxl
bmd0aCwKKyAgICAgICAgICAgIHVuaXRzID0gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKTsK
KworICAgICAgICBnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7CisKKyAgICAgICAg
Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkgeworCisgICAgICAgICAgICByZW5kZXJl
ci5zZXRUZXh0dXJlMkQoIHZbIGkgXSB8fCBlbXB0eVRleHR1cmUsIHVuaXRzWyBpIF0gKTsKKwor
ICAgICAgICB9CisKKyAgICB9CisKKyAgICBmdW5jdGlvbiBzZXRWYWx1ZVQ2YSggZ2wsIHYsIHJl
bmRlcmVyICkgeworCisgICAgICAgIHZhciBuID0gdi5sZW5ndGgsCisgICAgICAgICAgICB1bml0
cyA9IGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICk7CisKKyAgICAgICAgZ2wudW5pZm9ybTFp
diggdGhpcy5hZGRyLCB1bml0cyApOworCisgICAgICAgIGZvciAoIHZhciBpID0gMDsgaSAhPT0g
bjsgKysgaSApIHsKKworICAgICAgICAgICAgcmVuZGVyZXIuc2V0VGV4dHVyZUN1YmUoIHZbIGkg
XSB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0c1sgaSBdICk7CisKKyAgICAgICAgfQorCisgICAg
fQorCisgICAgLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgYSBwdXJlIChi
b3R0b20tbGV2ZWwpIGFycmF5CisKKyAgICBmdW5jdGlvbiBnZXRQdXJlQXJyYXlTZXR0ZXIoIHR5
cGUgKSB7CisKKyAgICAgICAgc3dpdGNoICggdHlwZSApIHsKKworICAgICAgICAgICAgY2FzZSAw
eDE0MDY6IHJldHVybiBzZXRWYWx1ZTFmdjsgLy8gRkxPQVQKKyAgICAgICAgICAgIGNhc2UgMHg4
YjUwOiByZXR1cm4gc2V0VmFsdWVWMmE7IC8vIF9WRUMyCisgICAgICAgICAgICBjYXNlIDB4OGI1
MTogcmV0dXJuIHNldFZhbHVlVjNhOyAvLyBfVkVDMworICAgICAgICAgICAgY2FzZSAweDhiNTI6
IHJldHVybiBzZXRWYWx1ZVY0YTsgLy8gX1ZFQzQKKworICAgICAgICAgICAgY2FzZSAweDhiNWE6
IHJldHVybiBzZXRWYWx1ZU0yYTsgLy8gX01BVDIKKyAgICAgICAgICAgIGNhc2UgMHg4YjViOiBy
ZXR1cm4gc2V0VmFsdWVNM2E7IC8vIF9NQVQzCisgICAgICAgICAgICBjYXNlIDB4OGI1YzogcmV0
dXJuIHNldFZhbHVlTTRhOyAvLyBfTUFUNAorCisgICAgICAgICAgICBjYXNlIDB4OGI1ZTogcmV0
dXJuIHNldFZhbHVlVDFhOyAvLyBTQU1QTEVSXzJECisgICAgICAgICAgICBjYXNlIDB4OGI2MDog
cmV0dXJuIHNldFZhbHVlVDZhOyAvLyBTQU1QTEVSX0NVQkUKKworICAgICAgICAgICAgY2FzZSAw
eDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWUxaXY7IC8vIElOVCwgQk9PTAorICAg
ICAgICAgICAgY2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8v
IF9WRUMyCisgICAgICAgICAgICBjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRW
YWx1ZTNpdjsgLy8gX1ZFQzMKKyAgICAgICAgICAgIGNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTog
cmV0dXJuIHNldFZhbHVlNGl2OyAvLyBfVkVDNAorCisgICAgICAgIH0KKworICAgIH0KKworICAg
IC8vIC0tLSBVbmlmb3JtIENsYXNzZXMgLS0tCisKKyAgICBmdW5jdGlvbiBTaW5nbGVVbmlmb3Jt
KCBpZCwgYWN0aXZlSW5mbywgYWRkciApIHsKKworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAg
ICAgIHRoaXMuYWRkciA9IGFkZHI7CisgICAgICAgIHRoaXMuc2V0VmFsdWUgPSBnZXRTaW5ndWxh
clNldHRlciggYWN0aXZlSW5mby50eXBlICk7CisKKyAgICAgICAgLy8gdGhpcy5wYXRoID0gYWN0
aXZlSW5mby5uYW1lOyAvLyBERUJVRworCisgICAgfQorCisgICAgZnVuY3Rpb24gUHVyZUFycmF5
VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7CisKKyAgICAgICAgdGhpcy5pZCA9IGlk
OworICAgICAgICB0aGlzLmFkZHIgPSBhZGRyOworICAgICAgICB0aGlzLnNpemUgPSBhY3RpdmVJ
bmZvLnNpemU7CisgICAgICAgIHRoaXMuc2V0VmFsdWUgPSBnZXRQdXJlQXJyYXlTZXR0ZXIoIGFj
dGl2ZUluZm8udHlwZSApOworCisgICAgICAgIC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFt
ZTsgLy8gREVCVUcKKworICAgIH0KKworICAgIGZ1bmN0aW9uIFN0cnVjdHVyZWRVbmlmb3JtKCBp
ZCApIHsKKworICAgICAgICB0aGlzLmlkID0gaWQ7CisKKyAgICAgICAgVW5pZm9ybUNvbnRhaW5l
ci5jYWxsKCB0aGlzICk7IC8vIG1peC1pbgorCisgICAgfQorCisgICAgU3RydWN0dXJlZFVuaWZv
cm0ucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKCBnbCwgdmFsdWUgKSB7CisKKyAgICAg
ICAgLy8gTm90ZTogRG9uJ3QgbmVlZCBhbiBleHRyYSAncmVuZGVyZXInIHBhcmFtZXRlciwgc2lu
Y2Ugc2FtcGxlcnMKKyAgICAgICAgLy8gYXJlIG5vdCBhbGxvd2VkIGluIHN0cnVjdHVyZWQgdW5p
Zm9ybXMuCisKKyAgICAgICAgdmFyIHNlcSA9IHRoaXMuc2VxOworCisgICAgICAgIGZvciAoIHZh
ciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKyAgICAgICAgICAg
IHZhciB1ID0gc2VxWyBpIF07CisgICAgICAgICAgICB1LnNldFZhbHVlKCBnbCwgdmFsdWVbIHUu
aWQgXSApOworCisgICAgICAgIH0KKworICAgIH07CisKKyAgICAvLyAtLS0gVG9wLWxldmVsIC0t
LQorCisgICAgLy8gUGFyc2VyIC0gYnVpbGRzIHVwIHRoZSBwcm9wZXJ0eSB0cmVlIGZyb20gdGhl
IHBhdGggc3RyaW5ncworCisgICAgdmFyIFJlUGF0aFBhcnQgPSAvKFtcd1xkX10rKShcXSk/KFxb
fFwuKT8vZzsKKworICAgIC8vIGV4dHJhY3RzCisgICAgLy8gIC0gdGhlIGlkZW50aWZpZXIgKG1l
bWJlciBuYW1lIG9yIGFycmF5IGluZGV4KQorICAgIC8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlv
bmFsIHJpZ2h0IGJyYWNrZXQgKGZvdW5kIHdoZW4gYXJyYXkgaW5kZXgpCisgICAgLy8gIC0gZm9s
bG93ZWQgYnkgYW4gb3B0aW9uYWwgbGVmdCBicmFja2V0IG9yIGRvdCAodHlwZSBvZiBzdWJzY3Jp
cHQpCisgICAgLy8KKyAgICAvLyBOb3RlOiBUaGVzZSBwb3J0aW9ucyBjYW4gYmUgcmVhZCBpbiBh
IG5vbi1vdmVybGFwcGluZyBmYXNoaW9uIGFuZAorICAgIC8vIGFsbG93IHN0cmFpZ2h0Zm9yd2Fy
ZCBwYXJzaW5nIG9mIHRoZSBoaWVyYXJjaHkgdGhhdCBXZWJHTCBlbmNvZGVzCisgICAgLy8gaW4g
dGhlIHVuaWZvcm0gbmFtZXMuCisKKyAgICBmdW5jdGlvbiBhZGRVbmlmb3JtKCBjb250YWluZXIs
IHVuaWZvcm1PYmplY3QgKSB7CisKKyAgICAgICAgY29udGFpbmVyLnNlcS5wdXNoKCB1bmlmb3Jt
T2JqZWN0ICk7CisgICAgICAgIGNvbnRhaW5lci5tYXBbIHVuaWZvcm1PYmplY3QuaWQgXSA9IHVu
aWZvcm1PYmplY3Q7CisKKyAgICB9CisKKyAgICBmdW5jdGlvbiBwYXJzZVVuaWZvcm0oIGFjdGl2
ZUluZm8sIGFkZHIsIGNvbnRhaW5lciApIHsKKworICAgICAgICB2YXIgcGF0aCA9IGFjdGl2ZUlu
Zm8ubmFtZSwKKyAgICAgICAgICAgIHBhdGhMZW5ndGggPSBwYXRoLmxlbmd0aDsKKworICAgICAg
ICAvLyByZXNldCBSZWdFeHAgb2JqZWN0LCBiZWNhdXNlIG9mIHRoZSBlYXJseSBleGl0IG9mIGEg
cHJldmlvdXMgcnVuCisgICAgICAgIFJlUGF0aFBhcnQubGFzdEluZGV4ID0gMDsKKworICAgICAg
ICBmb3IgKCA7IDsgKSB7CisKKyAgICAgICAgICAgIHZhciBtYXRjaCA9IFJlUGF0aFBhcnQuZXhl
YyggcGF0aCApLAorICAgICAgICAgICAgICAgIG1hdGNoRW5kID0gUmVQYXRoUGFydC5sYXN0SW5k
ZXgsCisKKyAgICAgICAgICAgICAgICBpZCA9IG1hdGNoWyAxIF0sCisgICAgICAgICAgICAgICAg
aWRJc0luZGV4ID0gbWF0Y2hbIDIgXSA9PT0gJ10nLAorICAgICAgICAgICAgICAgIHN1YnNjcmlw
dCA9IG1hdGNoWyAzIF07CisKKyAgICAgICAgICAgIGlmICggaWRJc0luZGV4ICkgaWQgPSBpZCB8
IDA7IC8vIGNvbnZlcnQgdG8gaW50ZWdlcgorCisgICAgICAgICAgICBpZiAoIHN1YnNjcmlwdCA9
PT0gdW5kZWZpbmVkIHx8IHN1YnNjcmlwdCA9PT0gJ1snICYmIG1hdGNoRW5kICsgMiA9PT0gcGF0
aExlbmd0aCApIHsKKworICAgICAgICAgICAgICAgIC8vIGJhcmUgbmFtZSBvciAicHVyZSIgYm90
dG9tLWxldmVsIGFycmF5ICJbMF0iIHN1ZmZpeAorCisgICAgICAgICAgICAgICAgYWRkVW5pZm9y
bSggY29udGFpbmVyLCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCA/CisgICAgICAgICAgICAgICAg
ICAgICAgICBuZXcgU2luZ2xlVW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSA6CisgICAg
ICAgICAgICAgICAgICAgICAgICBuZXcgUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8s
IGFkZHIgKSApOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0gZWxz
ZSB7CisKKyAgICAgICAgICAgICAgICAvLyBzdGVwIGludG8gaW5uZXIgbm9kZSAvIGNyZWF0ZSBp
dCBpbiBjYXNlIGl0IGRvZXNuJ3QgZXhpc3QKKworICAgICAgICAgICAgICAgIHZhciBtYXAgPSBj
b250YWluZXIubWFwLCBuZXh0ID0gbWFwWyBpZCBdOworCisgICAgICAgICAgICAgICAgaWYgKCBu
ZXh0ID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG5ldyBT
dHJ1Y3R1cmVkVW5pZm9ybSggaWQgKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkVW5pZm9ybSgg
Y29udGFpbmVyLCBuZXh0ICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICBjb250YWluZXIgPSBuZXh0OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAg
fQorCisgICAgLy8gUm9vdCBDb250YWluZXIKKworICAgIGZ1bmN0aW9uIFdlYkdMVW5pZm9ybXMo
IGdsLCBwcm9ncmFtLCByZW5kZXJlciApIHsKKworICAgICAgICBVbmlmb3JtQ29udGFpbmVyLmNh
bGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7CisKKyAgICAg
ICAgdmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5BQ1RJVkVfVU5J
Rk9STVMgKTsKKworICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyArKyBpICkgeworCisg
ICAgICAgICAgICB2YXIgaW5mbyA9IGdsLmdldEFjdGl2ZVVuaWZvcm0oIHByb2dyYW0sIGkgKSwK
KyAgICAgICAgICAgICAgICBwYXRoID0gaW5mby5uYW1lLAorICAgICAgICAgICAgICAgIGFkZHIg
PSBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sIHBhdGggKTsKKworICAgICAgICAgICAg
cGFyc2VVbmlmb3JtKCBpbmZvLCBhZGRyLCB0aGlzICk7CisKKyAgICAgICAgfQorCisgICAgfQor
CisgICAgV2ViR0xVbmlmb3Jtcy5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCBu
YW1lLCB2YWx1ZSApIHsKKworICAgICAgICB2YXIgdSA9IHRoaXMubWFwWyBuYW1lIF07CisKKyAg
ICAgICAgaWYgKCB1ICE9PSB1bmRlZmluZWQgKSB1LnNldFZhbHVlKCBnbCwgdmFsdWUsIHRoaXMu
cmVuZGVyZXIgKTsKKworICAgIH07CisKKyAgICBXZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRP
cHRpb25hbCA9IGZ1bmN0aW9uICggZ2wsIG9iamVjdCwgbmFtZSApIHsKKworICAgICAgICB2YXIg
diA9IG9iamVjdFsgbmFtZSBdOworCisgICAgICAgIGlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhp
cy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTsKKworICAgIH07CisKKworICAgIC8vIFN0YXRpYyBp
bnRlcmZhY2UKKworICAgIFdlYkdMVW5pZm9ybXMudXBsb2FkID0gZnVuY3Rpb24gKCBnbCwgc2Vx
LCB2YWx1ZXMsIHJlbmRlcmVyICkgeworCisgICAgICAgIGZvciAoIHZhciBpID0gMCwgbiA9IHNl
cS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKyAgICAgICAgICAgIHZhciB1ID0gc2VxWyBp
IF0sCisgICAgICAgICAgICAgICAgdiA9IHZhbHVlc1sgdS5pZCBdOworCisgICAgICAgICAgICBp
ZiAoIHYubmVlZHNVcGRhdGUgIT09IGZhbHNlICkgeworCisgICAgICAgICAgICAgICAgLy8gbm90
ZTogYWx3YXlzIHVwZGF0aW5nIHdoZW4gLm5lZWRzVXBkYXRlIGlzIHVuZGVmaW5lZAorICAgICAg
ICAgICAgICAgIHUuc2V0VmFsdWUoIGdsLCB2LnZhbHVlLCByZW5kZXJlciApOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgfQorCisgICAgfTsKKworICAgIFdlYkdMVW5pZm9ybXMuc2VxV2l0
aFZhbHVlID0gZnVuY3Rpb24gKCBzZXEsIHZhbHVlcyApIHsKKworICAgICAgICB2YXIgciA9IFtd
OworCisgICAgICAgIGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsr
IGkgKSB7CisKKyAgICAgICAgICAgIHZhciB1ID0gc2VxWyBpIF07CisgICAgICAgICAgICBpZiAo
IHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7CisKKyAgICAgICAgfQorCisgICAgICAgIHJl
dHVybiByOworCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0
cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICB2YXIgQ29sb3JLZXl3b3JkcyA9IHsgJ2Fs
aWNlYmx1ZSc6IDB4RjBGOEZGLCAnYW50aXF1ZXdoaXRlJzogMHhGQUVCRDcsICdhcXVhJzogMHgw
MEZGRkYsICdhcXVhbWFyaW5lJzogMHg3RkZGRDQsICdhenVyZSc6IDB4RjBGRkZGLAorICAgICAg
ICAnYmVpZ2UnOiAweEY1RjVEQywgJ2Jpc3F1ZSc6IDB4RkZFNEM0LCAnYmxhY2snOiAweDAwMDAw
MCwgJ2JsYW5jaGVkYWxtb25kJzogMHhGRkVCQ0QsICdibHVlJzogMHgwMDAwRkYsICdibHVldmlv
bGV0JzogMHg4QTJCRTIsCisgICAgICAgICdicm93bic6IDB4QTUyQTJBLCAnYnVybHl3b29kJzog
MHhERUI4ODcsICdjYWRldGJsdWUnOiAweDVGOUVBMCwgJ2NoYXJ0cmV1c2UnOiAweDdGRkYwMCwg
J2Nob2NvbGF0ZSc6IDB4RDI2OTFFLCAnY29yYWwnOiAweEZGN0Y1MCwKKyAgICAgICAgJ2Nvcm5m
bG93ZXJibHVlJzogMHg2NDk1RUQsICdjb3Juc2lsayc6IDB4RkZGOERDLCAnY3JpbXNvbic6IDB4
REMxNDNDLCAnY3lhbic6IDB4MDBGRkZGLCAnZGFya2JsdWUnOiAweDAwMDA4QiwgJ2RhcmtjeWFu
JzogMHgwMDhCOEIsCisgICAgICAgICdkYXJrZ29sZGVucm9kJzogMHhCODg2MEIsICdkYXJrZ3Jh
eSc6IDB4QTlBOUE5LCAnZGFya2dyZWVuJzogMHgwMDY0MDAsICdkYXJrZ3JleSc6IDB4QTlBOUE5
LCAnZGFya2toYWtpJzogMHhCREI3NkIsICdkYXJrbWFnZW50YSc6IDB4OEIwMDhCLAorICAgICAg
ICAnZGFya29saXZlZ3JlZW4nOiAweDU1NkIyRiwgJ2RhcmtvcmFuZ2UnOiAweEZGOEMwMCwgJ2Rh
cmtvcmNoaWQnOiAweDk5MzJDQywgJ2RhcmtyZWQnOiAweDhCMDAwMCwgJ2RhcmtzYWxtb24nOiAw
eEU5OTY3QSwgJ2RhcmtzZWFncmVlbic6IDB4OEZCQzhGLAorICAgICAgICAnZGFya3NsYXRlYmx1
ZSc6IDB4NDgzRDhCLCAnZGFya3NsYXRlZ3JheSc6IDB4MkY0RjRGLCAnZGFya3NsYXRlZ3JleSc6
IDB4MkY0RjRGLCAnZGFya3R1cnF1b2lzZSc6IDB4MDBDRUQxLCAnZGFya3Zpb2xldCc6IDB4OTQw
MEQzLAorICAgICAgICAnZGVlcHBpbmsnOiAweEZGMTQ5MywgJ2RlZXBza3libHVlJzogMHgwMEJG
RkYsICdkaW1ncmF5JzogMHg2OTY5NjksICdkaW1ncmV5JzogMHg2OTY5NjksICdkb2RnZXJibHVl
JzogMHgxRTkwRkYsICdmaXJlYnJpY2snOiAweEIyMjIyMiwKKyAgICAgICAgJ2Zsb3JhbHdoaXRl
JzogMHhGRkZBRjAsICdmb3Jlc3RncmVlbic6IDB4MjI4QjIyLCAnZnVjaHNpYSc6IDB4RkYwMEZG
LCAnZ2FpbnNib3JvJzogMHhEQ0RDREMsICdnaG9zdHdoaXRlJzogMHhGOEY4RkYsICdnb2xkJzog
MHhGRkQ3MDAsCisgICAgICAgICdnb2xkZW5yb2QnOiAweERBQTUyMCwgJ2dyYXknOiAweDgwODA4
MCwgJ2dyZWVuJzogMHgwMDgwMDAsICdncmVlbnllbGxvdyc6IDB4QURGRjJGLCAnZ3JleSc6IDB4
ODA4MDgwLCAnaG9uZXlkZXcnOiAweEYwRkZGMCwgJ2hvdHBpbmsnOiAweEZGNjlCNCwKKyAgICAg
ICAgJ2luZGlhbnJlZCc6IDB4Q0Q1QzVDLCAnaW5kaWdvJzogMHg0QjAwODIsICdpdm9yeSc6IDB4
RkZGRkYwLCAna2hha2knOiAweEYwRTY4QywgJ2xhdmVuZGVyJzogMHhFNkU2RkEsICdsYXZlbmRl
cmJsdXNoJzogMHhGRkYwRjUsICdsYXduZ3JlZW4nOiAweDdDRkMwMCwKKyAgICAgICAgJ2xlbW9u
Y2hpZmZvbic6IDB4RkZGQUNELCAnbGlnaHRibHVlJzogMHhBREQ4RTYsICdsaWdodGNvcmFsJzog
MHhGMDgwODAsICdsaWdodGN5YW4nOiAweEUwRkZGRiwgJ2xpZ2h0Z29sZGVucm9keWVsbG93Jzog
MHhGQUZBRDIsICdsaWdodGdyYXknOiAweEQzRDNEMywKKyAgICAgICAgJ2xpZ2h0Z3JlZW4nOiAw
eDkwRUU5MCwgJ2xpZ2h0Z3JleSc6IDB4RDNEM0QzLCAnbGlnaHRwaW5rJzogMHhGRkI2QzEsICds
aWdodHNhbG1vbic6IDB4RkZBMDdBLCAnbGlnaHRzZWFncmVlbic6IDB4MjBCMkFBLCAnbGlnaHRz
a3libHVlJzogMHg4N0NFRkEsCisgICAgICAgICdsaWdodHNsYXRlZ3JheSc6IDB4Nzc4ODk5LCAn
bGlnaHRzbGF0ZWdyZXknOiAweDc3ODg5OSwgJ2xpZ2h0c3RlZWxibHVlJzogMHhCMEM0REUsICds
aWdodHllbGxvdyc6IDB4RkZGRkUwLCAnbGltZSc6IDB4MDBGRjAwLCAnbGltZWdyZWVuJzogMHgz
MkNEMzIsCisgICAgICAgICdsaW5lbic6IDB4RkFGMEU2LCAnbWFnZW50YSc6IDB4RkYwMEZGLCAn
bWFyb29uJzogMHg4MDAwMDAsICdtZWRpdW1hcXVhbWFyaW5lJzogMHg2NkNEQUEsICdtZWRpdW1i
bHVlJzogMHgwMDAwQ0QsICdtZWRpdW1vcmNoaWQnOiAweEJBNTVEMywKKyAgICAgICAgJ21lZGl1
bXB1cnBsZSc6IDB4OTM3MERCLCAnbWVkaXVtc2VhZ3JlZW4nOiAweDNDQjM3MSwgJ21lZGl1bXNs
YXRlYmx1ZSc6IDB4N0I2OEVFLCAnbWVkaXVtc3ByaW5nZ3JlZW4nOiAweDAwRkE5QSwgJ21lZGl1
bXR1cnF1b2lzZSc6IDB4NDhEMUNDLAorICAgICAgICAnbWVkaXVtdmlvbGV0cmVkJzogMHhDNzE1
ODUsICdtaWRuaWdodGJsdWUnOiAweDE5MTk3MCwgJ21pbnRjcmVhbSc6IDB4RjVGRkZBLCAnbWlz
dHlyb3NlJzogMHhGRkU0RTEsICdtb2NjYXNpbic6IDB4RkZFNEI1LCAnbmF2YWpvd2hpdGUnOiAw
eEZGREVBRCwKKyAgICAgICAgJ25hdnknOiAweDAwMDA4MCwgJ29sZGxhY2UnOiAweEZERjVFNiwg
J29saXZlJzogMHg4MDgwMDAsICdvbGl2ZWRyYWInOiAweDZCOEUyMywgJ29yYW5nZSc6IDB4RkZB
NTAwLCAnb3JhbmdlcmVkJzogMHhGRjQ1MDAsICdvcmNoaWQnOiAweERBNzBENiwKKyAgICAgICAg
J3BhbGVnb2xkZW5yb2QnOiAweEVFRThBQSwgJ3BhbGVncmVlbic6IDB4OThGQjk4LCAncGFsZXR1
cnF1b2lzZSc6IDB4QUZFRUVFLCAncGFsZXZpb2xldHJlZCc6IDB4REI3MDkzLCAncGFwYXlhd2hp
cCc6IDB4RkZFRkQ1LCAncGVhY2hwdWZmJzogMHhGRkRBQjksCisgICAgICAgICdwZXJ1JzogMHhD
RDg1M0YsICdwaW5rJzogMHhGRkMwQ0IsICdwbHVtJzogMHhEREEwREQsICdwb3dkZXJibHVlJzog
MHhCMEUwRTYsICdwdXJwbGUnOiAweDgwMDA4MCwgJ3JlZCc6IDB4RkYwMDAwLCAncm9zeWJyb3du
JzogMHhCQzhGOEYsCisgICAgICAgICdyb3lhbGJsdWUnOiAweDQxNjlFMSwgJ3NhZGRsZWJyb3du
JzogMHg4QjQ1MTMsICdzYWxtb24nOiAweEZBODA3MiwgJ3NhbmR5YnJvd24nOiAweEY0QTQ2MCwg
J3NlYWdyZWVuJzogMHgyRThCNTcsICdzZWFzaGVsbCc6IDB4RkZGNUVFLAorICAgICAgICAnc2ll
bm5hJzogMHhBMDUyMkQsICdzaWx2ZXInOiAweEMwQzBDMCwgJ3NreWJsdWUnOiAweDg3Q0VFQiwg
J3NsYXRlYmx1ZSc6IDB4NkE1QUNELCAnc2xhdGVncmF5JzogMHg3MDgwOTAsICdzbGF0ZWdyZXkn
OiAweDcwODA5MCwgJ3Nub3cnOiAweEZGRkFGQSwKKyAgICAgICAgJ3NwcmluZ2dyZWVuJzogMHgw
MEZGN0YsICdzdGVlbGJsdWUnOiAweDQ2ODJCNCwgJ3Rhbic6IDB4RDJCNDhDLCAndGVhbCc6IDB4
MDA4MDgwLCAndGhpc3RsZSc6IDB4RDhCRkQ4LCAndG9tYXRvJzogMHhGRjYzNDcsICd0dXJxdW9p
c2UnOiAweDQwRTBEMCwKKyAgICAgICAgJ3Zpb2xldCc6IDB4RUU4MkVFLCAnd2hlYXQnOiAweEY1
REVCMywgJ3doaXRlJzogMHhGRkZGRkYsICd3aGl0ZXNtb2tlJzogMHhGNUY1RjUsICd5ZWxsb3cn
OiAweEZGRkYwMCwgJ3llbGxvd2dyZWVuJzogMHg5QUNEMzIgfTsKKworICAgIGZ1bmN0aW9uIENv
bG9yKCByLCBnLCBiICkgeworCisgICAgICAgIGlmICggZyA9PT0gdW5kZWZpbmVkICYmIGIgPT09
IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgLy8gciBpcyBUSFJFRS5Db2xvciwgaGV4IG9y
IHN0cmluZworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0KCByICk7CisKKyAgICAgICAgfQor
CisgICAgICAgIHJldHVybiB0aGlzLnNldFJHQiggciwgZywgYiApOworCisgICAgfQorCisgICAg
T2JqZWN0LmFzc2lnbiggQ29sb3IucHJvdG90eXBlLCB7CisKKyAgICAgICAgaXNDb2xvcjogdHJ1
ZSwKKworICAgICAgICByOiAxLCBnOiAxLCBiOiAxLAorCisgICAgICAgIHNldDogZnVuY3Rpb24g
KCB2YWx1ZSApIHsKKworICAgICAgICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0NvbG9yICkg
eworCisgICAgICAgICAgICAgICAgdGhpcy5jb3B5KCB2YWx1ZSApOworCisgICAgICAgICAgICB9
IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkgeworCisgICAgICAgICAgICAg
ICAgdGhpcy5zZXRIZXgoIHZhbHVlICk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVv
ZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLnNldFN0eWxl
KCB2YWx1ZSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgc2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHsK
KworICAgICAgICAgICAgdGhpcy5yID0gc2NhbGFyOworICAgICAgICAgICAgdGhpcy5nID0gc2Nh
bGFyOworICAgICAgICAgICAgdGhpcy5iID0gc2NhbGFyOworCisgICAgICAgICAgICByZXR1cm4g
dGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNldEhleDogZnVuY3Rpb24gKCBoZXggKSB7
CisKKyAgICAgICAgICAgIGhleCA9IE1hdGguZmxvb3IoIGhleCApOworCisgICAgICAgICAgICB0
aGlzLnIgPSAoIGhleCA+PiAxNiAmIDI1NSApIC8gMjU1OworICAgICAgICAgICAgdGhpcy5nID0g
KCBoZXggPj4gOCAmIDI1NSApIC8gMjU1OworICAgICAgICAgICAgdGhpcy5iID0gKCBoZXggJiAy
NTUgKSAvIDI1NTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKwor
ICAgICAgICBzZXRSR0I6IGZ1bmN0aW9uICggciwgZywgYiApIHsKKworICAgICAgICAgICAgdGhp
cy5yID0gcjsKKyAgICAgICAgICAgIHRoaXMuZyA9IGc7CisgICAgICAgICAgICB0aGlzLmIgPSBi
OworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNl
dEhTTDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBmdW5jdGlvbiBodWUycmdiKCBwLCBx
LCB0ICkgeworCisgICAgICAgICAgICAgICAgaWYgKCB0IDwgMCApIHQgKz0gMTsKKyAgICAgICAg
ICAgICAgICBpZiAoIHQgPiAxICkgdCAtPSAxOworICAgICAgICAgICAgICAgIGlmICggdCA8IDEg
LyA2ICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogdDsKKyAgICAgICAgICAgICAgICBpZiAo
IHQgPCAxIC8gMiApIHJldHVybiBxOworICAgICAgICAgICAgICAgIGlmICggdCA8IDIgLyAzICkg
cmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogKCAyIC8gMyAtIHQgKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gcDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rp
b24gc2V0SFNMKCBoLCBzLCBsICkgeworCisgICAgICAgICAgICAgICAgLy8gaCxzLGwgcmFuZ2Vz
IGFyZSBpbiAwLjAgLSAxLjAKKyAgICAgICAgICAgICAgICBoID0gX01hdGguZXVjbGlkZWFuTW9k
dWxvKCBoLCAxICk7CisgICAgICAgICAgICAgICAgcyA9IF9NYXRoLmNsYW1wKCBzLCAwLCAxICk7
CisgICAgICAgICAgICAgICAgbCA9IF9NYXRoLmNsYW1wKCBsLCAwLCAxICk7CisKKyAgICAgICAg
ICAgICAgICBpZiAoIHMgPT09IDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yID0g
dGhpcy5nID0gdGhpcy5iID0gbDsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgdmFyIHAgPSBsIDw9IDAuNSA/IGwgKiAoIDEgKyBzICkgOiBsICsgcyAt
ICggbCAqIHMgKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSAoIDIgKiBsICkgLSBwOwor
CisgICAgICAgICAgICAgICAgICAgIHRoaXMuciA9IGh1ZTJyZ2IoIHEsIHAsIGggKyAxIC8gMyAp
OworICAgICAgICAgICAgICAgICAgICB0aGlzLmcgPSBodWUycmdiKCBxLCBwLCBoICk7CisgICAg
ICAgICAgICAgICAgICAgIHRoaXMuYiA9IGh1ZTJyZ2IoIHEsIHAsIGggLSAxIC8gMyApOworCisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAg
ICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIHNldFN0eWxlOiBmdW5jdGlvbiAo
IHN0eWxlICkgeworCisgICAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVBbHBoYSggc3RyaW5nICkg
eworCisgICAgICAgICAgICAgICAgaWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjsK
KworICAgICAgICAgICAgICAgIGlmICggcGFyc2VGbG9hdCggc3RyaW5nICkgPCAxICkgeworCisg
ICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiBBbHBoYSBjb21w
b25lbnQgb2YgJyArIHN0eWxlICsgJyB3aWxsIGJlIGlnbm9yZWQuJyApOworCisgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgdmFyIG07CisKKyAgICAg
ICAgICAgIGlmICggbSA9IC9eKCg/OnJnYnxoc2wpYT8pXChccyooW15cKV0qKVwpLy5leGVjKCBz
dHlsZSApICkgeworCisgICAgICAgICAgICAgICAgLy8gcmdiIC8gaHNsCisKKyAgICAgICAgICAg
ICAgICB2YXIgY29sb3I7CisgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBtWyAxIF07CisgICAg
ICAgICAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBtWyAyIF07CisKKyAgICAgICAgICAgICAgICBz
d2l0Y2ggKCBuYW1lICkgeworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JnYic6CisgICAg
ICAgICAgICAgICAgICAgIGNhc2UgJ3JnYmEnOgorCisgICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoIGNvbG9yID0gL14oXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKigsXHMqKFswLTld
KlwuP1swLTldKylccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIHJnYigyNTUsMCwwKSByZ2JhKDI1NSwwLDAsMC41KQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHRoaXMuciA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBj
b2xvclsgMSBdLCAxMCApICkgLyAyNTU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhp
cy5nID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDI1NTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmIgPSBNYXRoLm1pbiggMjU1LCBwYXJz
ZUludCggY29sb3JbIDMgXSwgMTAgKSApIC8gMjU1OworCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggY29sb3IgPSAvXihcZCspXCVccyosXHMqKFxkKylcJVxz
KixccyooXGQrKVwlXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyggY29tcG9u
ZW50cyApICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmdiKDEwMCUsMCUs
MCUpIHJnYmEoMTAwJSwwJSwwJSwwLjUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhp
cy5yID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkgKSAvIDEwMDsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmcgPSBNYXRoLm1pbiggMTAwLCBwYXJz
ZUludCggY29sb3JbIDIgXSwgMTAgKSApIC8gMTAwOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHRoaXMuYiA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkg
LyAxMDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVBbHBoYSggY29sb3Jb
IDUgXSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaHNsJzoKKyAgICAgICAgICAgICAgICAgICAg
Y2FzZSAnaHNsYSc6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY29sb3IgPSAvXihb
MC05XSpcLj9bMC05XSspXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKigsXHMqKFswLTld
KlwuP1swLTldKylccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGhzbCgxMjAsNTAlLDUwJSkgaHNsYSgxMjAsNTAlLDUwJSwwLjUp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBwYXJzZUZsb2F0KCBjb2xvclsg
MSBdICkgLyAzNjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBwYXJzZUlu
dCggY29sb3JbIDIgXSwgMTAgKSAvIDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2
YXIgbCA9IHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApIC8gMTAwOworCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldEhTTCggaCwgcywgbCApOworCisgICAgICAg
ICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtID0gL15cIyhbQS1G
YS1mMC05XSspJC8uZXhlYyggc3R5bGUgKSApIHsKKworICAgICAgICAgICAgICAgIC8vIGhleCBj
b2xvcgorCisgICAgICAgICAgICAgICAgdmFyIGhleCA9IG1bIDEgXTsKKyAgICAgICAgICAgICAg
ICB2YXIgc2l6ZSA9IGhleC5sZW5ndGg7CisKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT09
IDMgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gI2ZmMAorICAgICAgICAgICAgICAgICAg
ICB0aGlzLnIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMCApICsgaGV4LmNoYXJBdCggMCApLCAx
NiApIC8gMjU1OworICAgICAgICAgICAgICAgICAgICB0aGlzLmcgPSBwYXJzZUludCggaGV4LmNo
YXJBdCggMSApICsgaGV4LmNoYXJBdCggMSApLCAxNiApIC8gMjU1OworICAgICAgICAgICAgICAg
ICAgICB0aGlzLmIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMiApICsgaGV4LmNoYXJBdCggMiAp
LCAxNiApIC8gMjU1OworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAg
ICAgICAgICAgICAgfSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHsKKworICAgICAgICAgICAgICAg
ICAgICAvLyAjZmYwMDAwCisgICAgICAgICAgICAgICAgICAgIHRoaXMuciA9IHBhcnNlSW50KCBo
ZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7CisgICAgICAgICAg
ICAgICAgICAgIHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0
KCAzICksIDE2ICkgLyAyNTU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYiA9IHBhcnNlSW50
KCBoZXguY2hhckF0KCA0ICkgKyBoZXguY2hhckF0KCA1ICksIDE2ICkgLyAyNTU7CisKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdHlsZSAmJiBzdHlsZS5sZW5ndGggPiAwICkg
eworCisgICAgICAgICAgICAgICAgLy8gY29sb3Iga2V5d29yZHMKKyAgICAgICAgICAgICAgICB2
YXIgaGV4ID0gQ29sb3JLZXl3b3Jkc1sgc3R5bGUgXTsKKworICAgICAgICAgICAgICAgIGlmICgg
aGV4ICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVkCisgICAg
ICAgICAgICAgICAgICAgIHRoaXMuc2V0SGV4KCBoZXggKTsKKworICAgICAgICAgICAgICAgIH0g
ZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdW5rbm93biBjb2xvcgorICAgICAgICAg
ICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAnICsg
c3R5bGUgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGNsb25lOiBmdW5jdGlv
biAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5y
LCB0aGlzLmcsIHRoaXMuYiApOworCisgICAgICAgIH0sCisKKyAgICAgICAgY29weTogZnVuY3Rp
b24gKCBjb2xvciApIHsKKworICAgICAgICAgICAgdGhpcy5yID0gY29sb3IucjsKKyAgICAgICAg
ICAgIHRoaXMuZyA9IGNvbG9yLmc7CisgICAgICAgICAgICB0aGlzLmIgPSBjb2xvci5iOworCisg
ICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGNvcHlHYW1t
YVRvTGluZWFyOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHsKKworICAgICAgICAg
ICAgaWYgKCBnYW1tYUZhY3RvciA9PT0gdW5kZWZpbmVkICkgZ2FtbWFGYWN0b3IgPSAyLjA7CisK
KyAgICAgICAgICAgIHRoaXMuciA9IE1hdGgucG93KCBjb2xvci5yLCBnYW1tYUZhY3RvciApOwor
ICAgICAgICAgICAgdGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIGdhbW1hRmFjdG9yICk7Cisg
ICAgICAgICAgICB0aGlzLmIgPSBNYXRoLnBvdyggY29sb3IuYiwgZ2FtbWFGYWN0b3IgKTsKKwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBjb3B5TGlu
ZWFyVG9HYW1tYTogZnVuY3Rpb24gKCBjb2xvciwgZ2FtbWFGYWN0b3IgKSB7CisKKyAgICAgICAg
ICAgIGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wOwor
CisgICAgICAgICAgICB2YXIgc2FmZUludmVyc2UgPSAoIGdhbW1hRmFjdG9yID4gMCApID8gKCAx
LjAgLyBnYW1tYUZhY3RvciApIDogMS4wOworCisgICAgICAgICAgICB0aGlzLnIgPSBNYXRoLnBv
dyggY29sb3Iuciwgc2FmZUludmVyc2UgKTsKKyAgICAgICAgICAgIHRoaXMuZyA9IE1hdGgucG93
KCBjb2xvci5nLCBzYWZlSW52ZXJzZSApOworICAgICAgICAgICAgdGhpcy5iID0gTWF0aC5wb3co
IGNvbG9yLmIsIHNhZmVJbnZlcnNlICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisg
ICAgICAgIH0sCisKKyAgICAgICAgY29udmVydEdhbW1hVG9MaW5lYXI6IGZ1bmN0aW9uICgpIHsK
KworICAgICAgICAgICAgdmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7CisK
KyAgICAgICAgICAgIHRoaXMuciA9IHIgKiByOworICAgICAgICAgICAgdGhpcy5nID0gZyAqIGc7
CisgICAgICAgICAgICB0aGlzLmIgPSBiICogYjsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7
CisKKyAgICAgICAgfSwKKworICAgICAgICBjb252ZXJ0TGluZWFyVG9HYW1tYTogZnVuY3Rpb24g
KCkgeworCisgICAgICAgICAgICB0aGlzLnIgPSBNYXRoLnNxcnQoIHRoaXMuciApOworICAgICAg
ICAgICAgdGhpcy5nID0gTWF0aC5zcXJ0KCB0aGlzLmcgKTsKKyAgICAgICAgICAgIHRoaXMuYiA9
IE1hdGguc3FydCggdGhpcy5iICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgZ2V0SGV4OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJl
dHVybiAoIHRoaXMuciAqIDI1NSApIDw8IDE2IF4gKCB0aGlzLmcgKiAyNTUgKSA8PCA4IF4gKCB0
aGlzLmIgKiAyNTUgKSA8PCAwOworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0SGV4U3RyaW5n
OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiAoICcwMDAwMDAnICsgdGhpcy5n
ZXRIZXgoKS50b1N0cmluZyggMTYgKSApLnNsaWNlKCAtIDYgKTsKKworICAgICAgICB9LAorCisg
ICAgICAgIGdldEhTTDogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworICAgICAgICAg
ICAgLy8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjAKKworICAgICAgICAgICAgdmFyIGhz
bCA9IG9wdGlvbmFsVGFyZ2V0IHx8IHsgaDogMCwgczogMCwgbDogMCB9OworCisgICAgICAgICAg
ICB2YXIgciA9IHRoaXMuciwgZyA9IHRoaXMuZywgYiA9IHRoaXMuYjsKKworICAgICAgICAgICAg
dmFyIG1heCA9IE1hdGgubWF4KCByLCBnLCBiICk7CisgICAgICAgICAgICB2YXIgbWluID0gTWF0
aC5taW4oIHIsIGcsIGIgKTsKKworICAgICAgICAgICAgdmFyIGh1ZSwgc2F0dXJhdGlvbjsKKyAg
ICAgICAgICAgIHZhciBsaWdodG5lc3MgPSAoIG1pbiArIG1heCApIC8gMi4wOworCisgICAgICAg
ICAgICBpZiAoIG1pbiA9PT0gbWF4ICkgeworCisgICAgICAgICAgICAgICAgaHVlID0gMDsKKyAg
ICAgICAgICAgICAgICBzYXR1cmF0aW9uID0gMDsKKworICAgICAgICAgICAgfSBlbHNlIHsKKwor
ICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IG1heCAtIG1pbjsKKworICAgICAgICAgICAgICAg
IHNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAoIG1heCArIG1pbiApIDog
ZGVsdGEgLyAoIDIgLSBtYXggLSBtaW4gKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoIG1h
eCApIHsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIHI6IGh1ZSA9ICggZyAtIGIgKSAvIGRl
bHRhICsgKCBnIDwgYiA/IDYgOiAwICk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNl
IGc6IGh1ZSA9ICggYiAtIHIgKSAvIGRlbHRhICsgMjsgYnJlYWs7CisgICAgICAgICAgICAgICAg
ICAgIGNhc2UgYjogaHVlID0gKCByIC0gZyApIC8gZGVsdGEgKyA0OyBicmVhazsKKworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGh1ZSAvPSA2OworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGhzbC5oID0gaHVlOworICAgICAgICAgICAgaHNsLnMgPSBzYXR1cmF0
aW9uOworICAgICAgICAgICAgaHNsLmwgPSBsaWdodG5lc3M7CisKKyAgICAgICAgICAgIHJldHVy
biBoc2w7CisKKyAgICAgICAgfSwKKworICAgICAgICBnZXRTdHlsZTogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICByZXR1cm4gJ3JnYignICsgKCAoIHRoaXMuciAqIDI1NSApIHwgMCApICsg
JywnICsgKCAoIHRoaXMuZyAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuYiAqIDI1NSAp
IHwgMCApICsgJyknOworCisgICAgICAgIH0sCisKKyAgICAgICAgb2Zmc2V0SFNMOiBmdW5jdGlv
biAoIGgsIHMsIGwgKSB7CisKKyAgICAgICAgICAgIHZhciBoc2wgPSB0aGlzLmdldEhTTCgpOwor
CisgICAgICAgICAgICBoc2wuaCArPSBoOyBoc2wucyArPSBzOyBoc2wubCArPSBsOworCisgICAg
ICAgICAgICB0aGlzLnNldEhTTCggaHNsLmgsIGhzbC5zLCBoc2wubCApOworCisgICAgICAgICAg
ICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGFkZDogZnVuY3Rpb24gKCBj
b2xvciApIHsKKworICAgICAgICAgICAgdGhpcy5yICs9IGNvbG9yLnI7CisgICAgICAgICAgICB0
aGlzLmcgKz0gY29sb3IuZzsKKyAgICAgICAgICAgIHRoaXMuYiArPSBjb2xvci5iOworCisgICAg
ICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGFkZENvbG9yczog
ZnVuY3Rpb24gKCBjb2xvcjEsIGNvbG9yMiApIHsKKworICAgICAgICAgICAgdGhpcy5yID0gY29s
b3IxLnIgKyBjb2xvcjIucjsKKyAgICAgICAgICAgIHRoaXMuZyA9IGNvbG9yMS5nICsgY29sb3Iy
Lmc7CisgICAgICAgICAgICB0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iOworCisgICAgICAg
ICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGFkZFNjYWxhcjogZnVu
Y3Rpb24gKCBzICkgeworCisgICAgICAgICAgICB0aGlzLnIgKz0gczsKKyAgICAgICAgICAgIHRo
aXMuZyArPSBzOworICAgICAgICAgICAgdGhpcy5iICs9IHM7CisKKyAgICAgICAgICAgIHJldHVy
biB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc3ViOiBmdW5jdGlvbiggY29sb3IgKSB7
CisKKyAgICAgICAgICAgIHRoaXMuciA9IE1hdGgubWF4KCAwLCB0aGlzLnIgLSBjb2xvci5yICk7
CisgICAgICAgICAgICB0aGlzLmcgPSBNYXRoLm1heCggMCwgdGhpcy5nIC0gY29sb3IuZyApOwor
ICAgICAgICAgICAgdGhpcy5iID0gTWF0aC5tYXgoIDAsIHRoaXMuYiAtIGNvbG9yLmIgKTsKKwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBtdWx0aXBs
eTogZnVuY3Rpb24gKCBjb2xvciApIHsKKworICAgICAgICAgICAgdGhpcy5yICo9IGNvbG9yLnI7
CisgICAgICAgICAgICB0aGlzLmcgKj0gY29sb3IuZzsKKyAgICAgICAgICAgIHRoaXMuYiAqPSBj
b2xvci5iOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAg
ICAgIG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CisKKyAgICAgICAgICAgIHRoaXMu
ciAqPSBzOworICAgICAgICAgICAgdGhpcy5nICo9IHM7CisgICAgICAgICAgICB0aGlzLmIgKj0g
czsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBs
ZXJwOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHsKKworICAgICAgICAgICAgdGhpcy5yICs9
ICggY29sb3IuciAtIHRoaXMuciApICogYWxwaGE7CisgICAgICAgICAgICB0aGlzLmcgKz0gKCBj
b2xvci5nIC0gdGhpcy5nICkgKiBhbHBoYTsKKyAgICAgICAgICAgIHRoaXMuYiArPSAoIGNvbG9y
LmIgLSB0aGlzLmIgKSAqIGFscGhhOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAg
ICAgICB9LAorCisgICAgICAgIGVxdWFsczogZnVuY3Rpb24gKCBjICkgeworCisgICAgICAgICAg
ICByZXR1cm4gKCBjLnIgPT09IHRoaXMuciApICYmICggYy5nID09PSB0aGlzLmcgKSAmJiAoIGMu
YiA9PT0gdGhpcy5iICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBmcm9tQXJyYXk6IGZ1bmN0
aW9uICggYXJyYXksIG9mZnNldCApIHsKKworICAgICAgICAgICAgaWYgKCBvZmZzZXQgPT09IHVu
ZGVmaW5lZCApIG9mZnNldCA9IDA7CisKKyAgICAgICAgICAgIHRoaXMuciA9IGFycmF5WyBvZmZz
ZXQgXTsKKyAgICAgICAgICAgIHRoaXMuZyA9IGFycmF5WyBvZmZzZXQgKyAxIF07CisgICAgICAg
ICAgICB0aGlzLmIgPSBhcnJheVsgb2Zmc2V0ICsgMiBdOworCisgICAgICAgICAgICByZXR1cm4g
dGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXks
IG9mZnNldCApIHsKKworICAgICAgICAgICAgaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJy
YXkgPSBbXTsKKyAgICAgICAgICAgIGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQg
PSAwOworCisgICAgICAgICAgICBhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLnI7CisgICAgICAgICAg
ICBhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5nOworICAgICAgICAgICAgYXJyYXlbIG9mZnNl
dCArIDIgXSA9IHRoaXMuYjsKKworICAgICAgICAgICAgcmV0dXJuIGFycmF5OworCisgICAgICAg
IH0sCisKKyAgICAgICAgdG9KU09OOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVy
biB0aGlzLmdldEhleCgpOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgorICAg
ICAqIFVuaWZvcm1zIGxpYnJhcnkgZm9yIHNoYXJlZCB3ZWJnbCBzaGFkZXJzCisgICAgICovCisK
KyAgICB2YXIgVW5pZm9ybXNMaWIgPSB7CisKKyAgICAgICAgY29tbW9uOiB7CisKKyAgICAgICAg
ICAgIGRpZmZ1c2U6IHsgdmFsdWU6IG5ldyBDb2xvciggMHhlZWVlZWUgKSB9LAorICAgICAgICAg
ICAgb3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sCisKKyAgICAgICAgICAgIG1hcDogeyB2YWx1ZTog
bnVsbCB9LAorICAgICAgICAgICAgb2Zmc2V0UmVwZWF0OiB7IHZhbHVlOiBuZXcgVmVjdG9yNCgg
MCwgMCwgMSwgMSApIH0sCisKKyAgICAgICAgICAgIHNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxs
IH0sCisgICAgICAgICAgICBhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LAorCisgICAgICAgICAg
ICBlbnZNYXA6IHsgdmFsdWU6IG51bGwgfSwKKyAgICAgICAgICAgIGZsaXBFbnZNYXA6IHsgdmFs
dWU6IC0gMSB9LAorICAgICAgICAgICAgcmVmbGVjdGl2aXR5OiB7IHZhbHVlOiAxLjAgfSwKKyAg
ICAgICAgICAgIHJlZnJhY3Rpb25SYXRpbzogeyB2YWx1ZTogMC45OCB9CisKKyAgICAgICAgfSwK
KworICAgICAgICBhb21hcDogeworCisgICAgICAgICAgICBhb01hcDogeyB2YWx1ZTogbnVsbCB9
LAorICAgICAgICAgICAgYW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfQorCisgICAgICAgIH0s
CisKKyAgICAgICAgbGlnaHRtYXA6IHsKKworICAgICAgICAgICAgbGlnaHRNYXA6IHsgdmFsdWU6
IG51bGwgfSwKKyAgICAgICAgICAgIGxpZ2h0TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH0KKwor
ICAgICAgICB9LAorCisgICAgICAgIGVtaXNzaXZlbWFwOiB7CisKKyAgICAgICAgICAgIGVtaXNz
aXZlTWFwOiB7IHZhbHVlOiBudWxsIH0KKworICAgICAgICB9LAorCisgICAgICAgIGJ1bXBtYXA6
IHsKKworICAgICAgICAgICAgYnVtcE1hcDogeyB2YWx1ZTogbnVsbCB9LAorICAgICAgICAgICAg
YnVtcFNjYWxlOiB7IHZhbHVlOiAxIH0KKworICAgICAgICB9LAorCisgICAgICAgIG5vcm1hbG1h
cDogeworCisgICAgICAgICAgICBub3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSwKKyAgICAgICAg
ICAgIG5vcm1hbFNjYWxlOiB7IHZhbHVlOiBuZXcgVmVjdG9yMiggMSwgMSApIH0KKworICAgICAg
ICB9LAorCisgICAgICAgIGRpc3BsYWNlbWVudG1hcDogeworCisgICAgICAgICAgICBkaXNwbGFj
ZW1lbnRNYXA6IHsgdmFsdWU6IG51bGwgfSwKKyAgICAgICAgICAgIGRpc3BsYWNlbWVudFNjYWxl
OiB7IHZhbHVlOiAxIH0sCisgICAgICAgICAgICBkaXNwbGFjZW1lbnRCaWFzOiB7IHZhbHVlOiAw
IH0KKworICAgICAgICB9LAorCisgICAgICAgIHJvdWdobmVzc21hcDogeworCisgICAgICAgICAg
ICByb3VnaG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfQorCisgICAgICAgIH0sCisKKyAgICAgICAg
bWV0YWxuZXNzbWFwOiB7CisKKyAgICAgICAgICAgIG1ldGFsbmVzc01hcDogeyB2YWx1ZTogbnVs
bCB9CisKKyAgICAgICAgfSwKKworICAgICAgICBncmFkaWVudG1hcDogeworCisgICAgICAgICAg
ICBncmFkaWVudE1hcDogeyB2YWx1ZTogbnVsbCB9CisKKyAgICAgICAgfSwKKworICAgICAgICBm
b2c6IHsKKworICAgICAgICAgICAgZm9nRGVuc2l0eTogeyB2YWx1ZTogMC4wMDAyNSB9LAorICAg
ICAgICAgICAgZm9nTmVhcjogeyB2YWx1ZTogMSB9LAorICAgICAgICAgICAgZm9nRmFyOiB7IHZh
bHVlOiAyMDAwIH0sCisgICAgICAgICAgICBmb2dDb2xvcjogeyB2YWx1ZTogbmV3IENvbG9yKCAw
eGZmZmZmZiApIH0KKworICAgICAgICB9LAorCisgICAgICAgIGxpZ2h0czogeworCisgICAgICAg
ICAgICBhbWJpZW50TGlnaHRDb2xvcjogeyB2YWx1ZTogW10gfSwKKworICAgICAgICAgICAgZGly
ZWN0aW9uYWxMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7CisgICAgICAgICAgICAg
ICAgZGlyZWN0aW9uOiB7fSwKKyAgICAgICAgICAgICAgICBjb2xvcjoge30sCisKKyAgICAgICAg
ICAgICAgICBzaGFkb3c6IHt9LAorICAgICAgICAgICAgICAgIHNoYWRvd0JpYXM6IHt9LAorICAg
ICAgICAgICAgICAgIHNoYWRvd1JhZGl1czoge30sCisgICAgICAgICAgICAgICAgc2hhZG93TWFw
U2l6ZToge30KKyAgICAgICAgICAgIH0gfSwKKworICAgICAgICAgICAgZGlyZWN0aW9uYWxTaGFk
b3dNYXA6IHsgdmFsdWU6IFtdIH0sCisgICAgICAgICAgICBkaXJlY3Rpb25hbFNoYWRvd01hdHJp
eDogeyB2YWx1ZTogW10gfSwKKworICAgICAgICAgICAgc3BvdExpZ2h0czogeyB2YWx1ZTogW10s
IHByb3BlcnRpZXM6IHsKKyAgICAgICAgICAgICAgICBjb2xvcjoge30sCisgICAgICAgICAgICAg
ICAgcG9zaXRpb246IHt9LAorICAgICAgICAgICAgICAgIGRpcmVjdGlvbjoge30sCisgICAgICAg
ICAgICAgICAgZGlzdGFuY2U6IHt9LAorICAgICAgICAgICAgICAgIGNvbmVDb3M6IHt9LAorICAg
ICAgICAgICAgICAgIHBlbnVtYnJhQ29zOiB7fSwKKyAgICAgICAgICAgICAgICBkZWNheToge30s
CisKKyAgICAgICAgICAgICAgICBzaGFkb3c6IHt9LAorICAgICAgICAgICAgICAgIHNoYWRvd0Jp
YXM6IHt9LAorICAgICAgICAgICAgICAgIHNoYWRvd1JhZGl1czoge30sCisgICAgICAgICAgICAg
ICAgc2hhZG93TWFwU2l6ZToge30KKyAgICAgICAgICAgIH0gfSwKKworICAgICAgICAgICAgc3Bv
dFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSwKKyAgICAgICAgICAgIHNwb3RTaGFkb3dNYXRyaXg6
IHsgdmFsdWU6IFtdIH0sCisKKyAgICAgICAgICAgIHBvaW50TGlnaHRzOiB7IHZhbHVlOiBbXSwg
cHJvcGVydGllczogeworICAgICAgICAgICAgICAgIGNvbG9yOiB7fSwKKyAgICAgICAgICAgICAg
ICBwb3NpdGlvbjoge30sCisgICAgICAgICAgICAgICAgZGVjYXk6IHt9LAorICAgICAgICAgICAg
ICAgIGRpc3RhbmNlOiB7fSwKKworICAgICAgICAgICAgICAgIHNoYWRvdzoge30sCisgICAgICAg
ICAgICAgICAgc2hhZG93Qmlhczoge30sCisgICAgICAgICAgICAgICAgc2hhZG93UmFkaXVzOiB7
fSwKKyAgICAgICAgICAgICAgICBzaGFkb3dNYXBTaXplOiB7fQorICAgICAgICAgICAgfSB9LAor
CisgICAgICAgICAgICBwb2ludFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSwKKyAgICAgICAgICAg
IHBvaW50U2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LAorCisgICAgICAgICAgICBoZW1pc3Bo
ZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczogeworICAgICAgICAgICAgICAgIGRp
cmVjdGlvbjoge30sCisgICAgICAgICAgICAgICAgc2t5Q29sb3I6IHt9LAorICAgICAgICAgICAg
ICAgIGdyb3VuZENvbG9yOiB7fQorICAgICAgICAgICAgfSB9LAorCisgICAgICAgICAgICAvLyBU
T0RPIChhYmVsbmF0aW9uKTogUmVjdEFyZWFMaWdodCBCUkRGIGRhdGEgbmVlZHMgdG8gYmUgbW92
ZWQgZnJvbSBleGFtcGxlIHRvIG1haW4gc3JjCisgICAgICAgICAgICByZWN0QXJlYUxpZ2h0czog
eyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHsKKyAgICAgICAgICAgICAgICBjb2xvcjoge30sCisg
ICAgICAgICAgICAgICAgcG9zaXRpb246IHt9LAorICAgICAgICAgICAgICAgIHdpZHRoOiB7fSwK
KyAgICAgICAgICAgICAgICBoZWlnaHQ6IHt9CisgICAgICAgICAgICB9IH0KKworICAgICAgICB9
LAorCisgICAgICAgIHBvaW50czogeworCisgICAgICAgICAgICBkaWZmdXNlOiB7IHZhbHVlOiBu
ZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSwKKyAgICAgICAgICAgIG9wYWNpdHk6IHsgdmFsdWU6IDEu
MCB9LAorICAgICAgICAgICAgc2l6ZTogeyB2YWx1ZTogMS4wIH0sCisgICAgICAgICAgICBzY2Fs
ZTogeyB2YWx1ZTogMS4wIH0sCisgICAgICAgICAgICBtYXA6IHsgdmFsdWU6IG51bGwgfSwKKyAg
ICAgICAgICAgIG9mZnNldFJlcGVhdDogeyB2YWx1ZTogbmV3IFZlY3RvcjQoIDAsIDAsIDEsIDEg
KSB9CisKKyAgICAgICAgfQorCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFVuaWZvcm0gVXRp
bGl0aWVzCisgICAgICovCisKKyAgICB2YXIgVW5pZm9ybXNVdGlscyA9IHsKKworICAgICAgICBt
ZXJnZTogZnVuY3Rpb24gKCB1bmlmb3JtcyApIHsKKworICAgICAgICAgICAgdmFyIG1lcmdlZCA9
IHt9OworCisgICAgICAgICAgICBmb3IgKCB2YXIgdSA9IDA7IHUgPCB1bmlmb3Jtcy5sZW5ndGg7
IHUgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgdG1wID0gdGhpcy5jbG9uZSggdW5pZm9y
bXNbIHUgXSApOworCisgICAgICAgICAgICAgICAgZm9yICggdmFyIHAgaW4gdG1wICkgeworCisg
ICAgICAgICAgICAgICAgICAgIG1lcmdlZFsgcCBdID0gdG1wWyBwIF07CisKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDsKKwor
ICAgICAgICB9LAorCisgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoIHVuaWZvcm1zX3NyYyApIHsK
KworICAgICAgICAgICAgdmFyIHVuaWZvcm1zX2RzdCA9IHt9OworCisgICAgICAgICAgICBmb3Ig
KCB2YXIgdSBpbiB1bmlmb3Jtc19zcmMgKSB7CisKKyAgICAgICAgICAgICAgICB1bmlmb3Jtc19k
c3RbIHUgXSA9IHt9OworCisgICAgICAgICAgICAgICAgZm9yICggdmFyIHAgaW4gdW5pZm9ybXNf
c3JjWyB1IF0gKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlcl9zcmMgPSB1
bmlmb3Jtc19zcmNbIHUgXVsgcCBdOworCisgICAgICAgICAgICAgICAgICAgIGlmICggcGFyYW1l
dGVyX3NyYyAmJiAoIHBhcmFtZXRlcl9zcmMuaXNDb2xvciB8fAorICAgICAgICAgICAgICAgICAg
ICAgICAgcGFyYW1ldGVyX3NyYy5pc01hdHJpeDMgfHwgcGFyYW1ldGVyX3NyYy5pc01hdHJpeDQg
fHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IyIHx8IHBh
cmFtZXRlcl9zcmMuaXNWZWN0b3IzIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3I0IHx8CisgICAg
ICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfc3JjLmlzVGV4dHVyZSApICkgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3Ny
Yy5jbG9uZSgpOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIEFycmF5LmlzQXJy
YXkoIHBhcmFtZXRlcl9zcmMgKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9y
bXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmMuc2xpY2UoKTsKKworICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc19kc3Rb
IHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYzsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHVu
aWZvcm1zX2RzdDsKKworICAgICAgICB9CisKKyAgICB9OworCisgICAgdmFyIGFscGhhbWFwX2Zy
YWdtZW50ID0gIiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVy
ZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcbiNlbmRpZlxuIjsKKworICAgIHZhciBhbHBoYW1hcF9w
YXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQg
YWxwaGFNYXA7XG4jZW5kaWZcbiI7CisKKyAgICB2YXIgYWxwaGF0ZXN0X2ZyYWdtZW50ID0gIiNp
ZmRlZiBBTFBIQVRFU1Rcblx0aWYgKCBkaWZmdXNlQ29sb3IuYSA8IEFMUEhBVEVTVCApIGRpc2Nh
cmQ7XG4jZW5kaWZcbiI7CisKKyAgICB2YXIgYW9tYXBfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9B
T01BUFxuXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uID0gKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYy
ICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XG5cdHJlZmxlY3RlZExpZ2h0Lmlu
ZGlyZWN0RGlmZnVzZSAqPSBhbWJpZW50T2NjbHVzaW9uO1xuXHQjaWYgZGVmaW5lZCggVVNFX0VO
Vk1BUCApICYmIGRlZmluZWQoIFBIWVNJQ0FMIClcblx0XHRmbG9hdCBkb3ROViA9IHNhdHVyYXRl
KCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVj
dGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRv
dE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHQj
ZW5kaWZcbiNlbmRpZlxuIjsKKworICAgIHZhciBhb21hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRl
ZiBVU0VfQU9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7XG5cdHVuaWZvcm0gZmxvYXQg
YW9NYXBJbnRlbnNpdHk7XG4jZW5kaWYiOworCisgICAgdmFyIGJlZ2luX3ZlcnRleCA9ICJcbnZl
YzMgdHJhbnNmb3JtZWQgPSB2ZWMzKCBwb3NpdGlvbiApO1xuIjsKKworICAgIHZhciBiZWdpbm5v
cm1hbF92ZXJ0ZXggPSAiXG52ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApO1xuIjsK
KworICAgIHZhciBic2RmcyA9ICJmbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlh
bmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBj
dXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcblx0aWYoIGRl
Y2F5RXhwb25lbnQgPiAwLjAgKSB7XG4jaWYgZGVmaW5lZCAoIFBIWVNJQ0FMTFlfQ09SUkVDVF9M
SUdIVFMgKVxuXHRcdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiA9IDEuMCAvIG1heCggcG93KCBsaWdo
dERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcblx0XHRmbG9hdCBtYXhEaXN0YW5j
ZUN1dG9mZkZhY3RvciA9IHBvdzIoIHNhdHVyYXRlKCAxLjAgLSBwb3c0KCBsaWdodERpc3RhbmNl
IC8gY3V0b2ZmRGlzdGFuY2UgKSApICk7XG5cdFx0cmV0dXJuIGRpc3RhbmNlRmFsbG9mZiAqIG1h
eERpc3RhbmNlQ3V0b2ZmRmFjdG9yO1xuI2Vsc2Vcblx0XHRyZXR1cm4gcG93KCBzYXR1cmF0ZSgg
LWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7
XG4jZW5kaWZcblx0fVxuXHRyZXR1cm4gMS4wO1xufVxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVy
dCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJ
ICogZGlmZnVzZUNvbG9yO1xufVxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3Vs
YXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XG5cdGZsb2F0IGZyZXNuZWwgPSBleHAy
KCAoIC01LjU1NDczICogZG90TEggLSA2Ljk4MzE2ICkgKiBkb3RMSCApO1xuXHRyZXR1cm4gKCAx
LjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcbn1cbmZsb2F0
IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90Tkws
IGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XG5c
dGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5M
ICkgKTtcblx0ZmxvYXQgZ3YgPSBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93
MiggZG90TlYgKSApO1xuXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XG59XG5mbG9hdCBHX0dH
WF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBk
b3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEg
KTtcblx0ZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93Migg
ZG90TlYgKSApO1xuXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkg
KiBwb3cyKCBkb3ROTCApICk7XG5cdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04g
KTtcbn1cbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQg
ZG90TkggKSB7XG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZGVub20gPSBw
b3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xuXHRyZXR1cm4gUkVDSVBST0NBTF9Q
SSAqIGEyIC8gcG93MiggZGVub20gKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0
IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4
dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBy
b3VnaG5lc3MgKSB7XG5cdGZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7XG5cdHZlYzMg
aGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52
aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFs
LCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUo
IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0ZmxvYXQgZG90
TkggPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9h
dCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGly
ICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRm
bG9hdCBHID0gR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG5c
dGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCAp
O1xufVxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25z
dCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFICA9IDY0LjA7
XG5cdGNvbnN0IGZsb2F0IExVVF9TQ0FMRSA9ICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpF
O1xuXHRjb25zdCBmbG9hdCBMVVRfQklBUyAgPSAwLjUgLyBMVVRfU0laRTtcblx0ZmxvYXQgdGhl
dGEgPSBhY29zKCBkb3QoIE4sIFYgKSApO1xuXHR2ZWMyIHV2ID0gdmVjMihcblx0XHRzcXJ0KCBz
YXR1cmF0ZSggcm91Z2huZXNzICkgKSxcblx0XHRzYXR1cmF0ZSggdGhldGEgLyAoIDAuNSAqIFBJ
ICkgKSApO1xuXHR1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XG5cdHJldHVybiB1djtc
bn1cbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkg
e1xuXHRmbG9hdCBsID0gbGVuZ3RoKCBmICk7XG5cdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnog
KSAvICggbCArIDEuMCApLCAwLjAgKTtcbn1cbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9y
KCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xuXHRmbG9hdCB4ID0gZG90
KCB2MSwgdjIgKTtcblx0ZmxvYXQgeSA9IGFicyggeCApO1xuXHRmbG9hdCBhID0gMC44NjI2NyAr
ICgwLjQ5Nzg4ICsgMC4wMTQzNiAqIHkgKSAqIHk7XG5cdGZsb2F0IGIgPSAzLjQ1MDY4ICsgKDQu
MTg4MTQgKyB5KSAqIHk7XG5cdGZsb2F0IHYgPSBhIC8gYjtcblx0ZmxvYXQgdGhldGFfc2ludGhl
dGEgPSAoeCA+IDAuMCkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIDEuMCAtIHggKiB4ICkgLSB2
O1xuXHRyZXR1cm4gY3Jvc3MoIHYxLCB2MiApICogdGhldGFfc2ludGhldGE7XG59XG52ZWMzIExU
Q19FdmFsdWF0ZSggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIHZl
YzMgUCwgY29uc3QgaW4gbWF0MyBtSW52LCBjb25zdCBpbiB2ZWMzIHJlY3RDb29yZHNbIDQgXSAp
IHtcblx0dmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTtcblx0dmVj
MyB2MiA9IHJlY3RDb29yZHNbIDMgXSAtIHJlY3RDb29yZHNbIDAgXTtcblx0dmVjMyBsaWdodE5v
cm1hbCA9IGNyb3NzKCB2MSwgdjIgKTtcblx0aWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0
Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTtcblx0dmVjMyBUMSwgVDI7
XG5cdFQxID0gbm9ybWFsaXplKCBWIC0gTiAqIGRvdCggViwgTiApICk7XG5cdFQyID0gLSBjcm9z
cyggTiwgVDEgKTtcblx0bWF0MyBtYXQgPSBtSW52ICogdHJhbnNwb3NlKCBtYXQzKCBUMSwgVDIs
IE4gKSApO1xuXHR2ZWMzIGNvb3Jkc1sgNCBdO1xuXHRjb29yZHNbIDAgXSA9IG1hdCAqICggcmVj
dENvb3Jkc1sgMCBdIC0gUCApO1xuXHRjb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sg
MSBdIC0gUCApO1xuXHRjb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCAp
O1xuXHRjb29yZHNbIDMgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApO1xuXHRjb29y
ZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcblx0Y29vcmRzWyAxIF0gPSBub3Jt
YWxpemUoIGNvb3Jkc1sgMSBdICk7XG5cdGNvb3Jkc1sgMiBdID0gbm9ybWFsaXplKCBjb29yZHNb
IDIgXSApO1xuXHRjb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcblx0dmVj
MyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0g
TFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTtcblx0
dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBd
LCBjb29yZHNbIDIgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9y
bUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3Ig
Kz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTtc
blx0dmVjMyByZXN1bHQgPSB2ZWMzKCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3Rv
ckZvcm1GYWN0b3IgKSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudmVjMyBCUkRGX1NwZWN1bGFy
X0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29u
c3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5c
dGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52
aWV3RGlyICkgKTtcblx0Y29uc3QgdmVjNCBjMCA9IHZlYzQoIC0gMSwgLSAwLjAyNzUsIC0gMC41
NzIsIDAuMDIyICk7XG5cdGNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0g
MC4wNCApO1xuXHR2ZWM0IHIgPSByb3VnaG5lc3MgKiBjMCArIGMxO1xuXHRmbG9hdCBhMDA0ID0g
bWluKCByLnggKiByLngsIGV4cDIoIC0gOS4yOCAqIGRvdE5WICkgKSAqIHIueCArIHIueTtcblx0
dmVjMiBBQiA9IHZlYzIoIC0xLjA0LCAxLjA0ICkgKiBhMDA0ICsgci56dztcblx0cmV0dXJuIHNw
ZWN1bGFyQ29sb3IgKiBBQi54ICsgQUIueTtcbn1cbmZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNp
dCggKSB7XG5cdHJldHVybiAwLjI1O1xufVxuZmxvYXQgRF9CbGlublBob25nKCBjb25zdCBpbiBm
bG9hdCBzaGluaW5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xuXHRyZXR1cm4gUkVDSVBS
T0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5l
c3MgKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVu
dExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnks
IGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzICkg
e1xuXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsg
Z2VvbWV0cnkudmlld0RpciApO1xuXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIGdlb21l
dHJ5Lm5vcm1hbCwgaGFsZkRpciApICk7XG5cdGZsb2F0IGRvdExIID0gc2F0dXJhdGUoIGRvdCgg
aW5jaWRlbnRMaWdodC5kaXJlY3Rpb24sIGhhbGZEaXIgKSApO1xuXHR2ZWMzIEYgPSBGX1NjaGxp
Y2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XG5cdGZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1w
bGljaXQoICk7XG5cdGZsb2F0IEQgPSBEX0JsaW5uUGhvbmcoIHNoaW5pbmVzcywgZG90TkggKTtc
blx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XG59XG5mbG9hdCBHR1hSb3VnaG5lc3NUb0JsaW5uRXhw
b25lbnQoIGNvbnN0IGluIGZsb2F0IGdneFJvdWdobmVzcyApIHtcblx0cmV0dXJuICggMi4wIC8g
cG93MiggZ2d4Um91Z2huZXNzICsgMC4wMDAxICkgLSAyLjAgKTtcbn1cbmZsb2F0IEJsaW5uRXhw
b25lbnRUb0dHWFJvdWdobmVzcyggY29uc3QgaW4gZmxvYXQgYmxpbm5FeHBvbmVudCApIHtcblx0
cmV0dXJuIHNxcnQoIDIuMCAvICggYmxpbm5FeHBvbmVudCArIDIuMCApICk7XG59XG4iOworCisg
ICAgdmFyIGJ1bXBtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0JVTVBNQVBcblx0dW5p
Zm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcblx0dW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7XG5cdHZl
YzIgZEhkeHlfZndkKCkge1xuXHRcdHZlYzIgZFNUZHggPSBkRmR4KCB2VXYgKTtcblx0XHR2ZWMy
IGRTVGR5ID0gZEZkeSggdlV2ICk7XG5cdFx0ZmxvYXQgSGxsID0gYnVtcFNjYWxlICogdGV4dHVy
ZTJEKCBidW1wTWFwLCB2VXYgKS54O1xuXHRcdGZsb2F0IGRCeCA9IGJ1bXBTY2FsZSAqIHRleHR1
cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xuXHRcdGZsb2F0IGRCeSA9IGJ1
bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xuXHRc
dHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xuXHR9XG5cdHZlYzMgcGVydHVyYk5vcm1hbEFyYigg
dmVjMyBzdXJmX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgZEhkeHkgKSB7XG5cdFx0dmVjMyB2
U2lnbWFYID0gdmVjMyggZEZkeCggc3VyZl9wb3MueCApLCBkRmR4KCBzdXJmX3Bvcy55ICksIGRG
ZHgoIHN1cmZfcG9zLnogKSApO1xuXHRcdHZlYzMgdlNpZ21hWSA9IHZlYzMoIGRGZHkoIHN1cmZf
cG9zLnggKSwgZEZkeSggc3VyZl9wb3MueSApLCBkRmR5KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2
ZWMzIHZOID0gc3VyZl9ub3JtO1xuXHRcdHZlYzMgUjEgPSBjcm9zcyggdlNpZ21hWSwgdk4gKTtc
blx0XHR2ZWMzIFIyID0gY3Jvc3MoIHZOLCB2U2lnbWFYICk7XG5cdFx0ZmxvYXQgZkRldCA9IGRv
dCggdlNpZ21hWCwgUjEgKTtcblx0XHR2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4
eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZE
ZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XG5cdH1cbiNlbmRpZlxuIjsKKworICAgIHZhciBj
bGlwcGluZ19wbGFuZXNfZnJhZ21lbnQgPSAiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5c
dGZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgKysgaSApIHtcblx0
XHR2ZWM0IHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRpZiAoIGRvdCggdlZpZXdQ
b3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDtcblx0fVxuXHRcdFxuXHQj
aWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIDwgTlVNX0NMSVBQSU5HX1BMQU5FU1xuXHRcdGJvb2wg
Y2xpcHBlZCA9IHRydWU7XG5cdFx0Zm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7
IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyArKyBpICkge1xuXHRcdFx0dmVjNCBwbGFuZSA9IGNs
aXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0XHRjbGlwcGVkID0gKCBkb3QoIHZWaWV3UG9zaXRpb24s
IHBsYW5lLnh5eiApID4gcGxhbmUudyApICYmIGNsaXBwZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xp
cHBlZCApIGRpc2NhcmQ7XG5cdFxuXHQjZW5kaWZcbiNlbmRpZlxuIjsKKworICAgIHZhciBjbGlw
cGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCA9ICIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBc
blx0I2lmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAhIGRlZmluZWQoIFBIT05HIClcblx0XHR2
YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcblx0I2VuZGlmXG5cdHVuaWZvcm0gdmVjNCBjbGlw
cGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xuI2VuZGlmXG4iOworCisgICAgdmFy
IGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleCA9ICIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+
IDAgJiYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxuXHR2YXJ5
aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNlbmRpZlxuIjsKKworICAgIHZhciBjbGlwcGluZ19w
bGFuZXNfdmVydGV4ID0gIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMCAmJiAhIGRlZmluZWQo
IFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXG5cdHZWaWV3UG9zaXRpb24gPSAtIG12
UG9zaXRpb24ueHl6O1xuI2VuZGlmXG4iOworCisgICAgdmFyIGNvbG9yX2ZyYWdtZW50ID0gIiNp
ZmRlZiBVU0VfQ09MT1Jcblx0ZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7XG4jZW5kaWYiOwor
CisgICAgdmFyIGNvbG9yX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9DT0xPUlxuXHR2YXJ5
aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmXG4iOworCisgICAgdmFyIGNvbG9yX3BhcnNfdmVydGV4
ID0gIiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiI7CisK
KyAgICB2YXIgY29sb3JfdmVydGV4ID0gIiNpZmRlZiBVU0VfQ09MT1Jcblx0dkNvbG9yLnh5eiA9
IGNvbG9yLnh5ejtcbiNlbmRpZiI7CisKKyAgICB2YXIgY29tbW9uID0gIiNkZWZpbmUgUEkgMy4x
NDE1OTI2NTM1OVxuI2RlZmluZSBQSTIgNi4yODMxODUzMDcxOFxuI2RlZmluZSBQSV9IQUxGIDEu
NTcwNzk2MzI2Nzk0OVxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcbiNkZWZp
bmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NFxuI2RlZmluZSBMT0cyIDEuNDQyNjk1XG4jZGVm
aW5lIEVQU0lMT04gMWUtNlxuI2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAg
KVxuI2RlZmluZSB3aGl0ZUNvbXBsaW1lbnQoYSkgKCAxLjAgLSBzYXR1cmF0ZSggYSApIClcbmZs
b2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cbmZsb2F0IHBvdzMo
IGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4KngqeDsgfVxuZmxvYXQgcG93NCggY29uc3Qg
aW4gZmxvYXQgeCApIHsgZmxvYXQgeDIgPSB4Kng7IHJldHVybiB4Mip4MjsgfVxuZmxvYXQgYXZl
cmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAu
MzMzMyApICk7IH1cbmhpZ2hwIGZsb2F0IHJhbmQoIGNvbnN0IGluIHZlYzIgdXYgKSB7XG5cdGNv
bnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1Mztc
blx0aGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCgg
ZHQsIFBJICk7XG5cdHJldHVybiBmcmFjdChzaW4oc24pICogYyk7XG59XG5zdHJ1Y3QgSW5jaWRl
bnRMaWdodCB7XG5cdHZlYzMgY29sb3I7XG5cdHZlYzMgZGlyZWN0aW9uO1xuXHRib29sIHZpc2li
bGU7XG59O1xuc3RydWN0IFJlZmxlY3RlZExpZ2h0IHtcblx0dmVjMyBkaXJlY3REaWZmdXNlO1xu
XHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xuXHR2ZWMzIGluZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBp
bmRpcmVjdFNwZWN1bGFyO1xufTtcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcblx0dmVjMyBw
b3NpdGlvbjtcblx0dmVjMyBub3JtYWw7XG5cdHZlYzMgdmlld0Rpcjtcbn07XG52ZWMzIHRyYW5z
Zm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4g
bm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZlYzMg
aW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkg
e1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXog
KTtcbn1cbnZlYzMgcHJvamVjdE9uUGxhbmUoaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9u
UGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdGZsb2F0IGRpc3RhbmNlID0gZG90KCBw
bGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcblx0cmV0dXJuIC0gZGlzdGFuY2Ug
KiBwbGFuZU5vcm1hbCArIHBvaW50O1xufVxuZmxvYXQgc2lkZU9mUGxhbmUoIGluIHZlYzMgcG9p
bnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1
cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xufVxu
dmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGlu
ZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7
XG5cdHJldHVybiBsaW5lRGlyZWN0aW9uICogKCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludE9uUGxh
bmUgLSBwb2ludE9uTGluZSApIC8gZG90KCBwbGFuZU5vcm1hbCwgbGluZURpcmVjdGlvbiApICkg
KyBwb2ludE9uTGluZTtcbn1cbm1hdDMgdHJhbnNwb3NlKCBjb25zdCBpbiBtYXQzIHYgKSB7XG5c
dG1hdDMgdG1wO1xuXHR0bXBbMF0gPSB2ZWMzKHZbMF0ueCwgdlsxXS54LCB2WzJdLngpO1xuXHR0
bXBbMV0gPSB2ZWMzKHZbMF0ueSwgdlsxXS55LCB2WzJdLnkpO1xuXHR0bXBbMl0gPSB2ZWMzKHZb
MF0ueiwgdlsxXS56LCB2WzJdLnopO1xuXHRyZXR1cm4gdG1wO1xufVxuIjsKKworICAgIHZhciBj
dWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQgPSAiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZc
biNkZWZpbmUgY3ViZVVWX3RleHR1cmVTaXplICgxMDI0LjApXG5pbnQgZ2V0RmFjZUZyb21EaXJl
Y3Rpb24odmVjMyBkaXJlY3Rpb24pIHtcblx0dmVjMyBhYnNEaXJlY3Rpb24gPSBhYnMoZGlyZWN0
aW9uKTtcblx0aW50IGZhY2UgPSAtMTtcblx0aWYoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0
aW9uLnogKSB7XG5cdFx0aWYoYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueSApXG5cdFx0
XHRmYWNlID0gZGlyZWN0aW9uLnggPiAwLjAgPyAwIDogMztcblx0XHRlbHNlXG5cdFx0XHRmYWNl
ID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxIDogNDtcblx0fVxuXHRlbHNlIHtcblx0XHRpZihhYnNE
aXJlY3Rpb24ueiA+IGFic0RpcmVjdGlvbi55IClcblx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueiA+
IDAuMCA/IDIgOiA1O1xuXHRcdGVsc2Vcblx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/
IDEgOiA0O1xuXHR9XG5cdHJldHVybiBmYWNlO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczEg
IChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSowLjI1KSAtIDEuMClcbiNkZWZpbmUgY3ViZVVWX3Jh
bmdlQ2xhbXAgKGV4cDIoKDYuMCAtIDEuMCkgKiAyLjApKVxudmVjMiBNaXBMZXZlbEluZm8oIHZl
YzMgdmVjLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9h
dCBzY2FsZSA9IGV4cDIoY3ViZVVWX21heExvZHMxIC0gcm91Z2huZXNzTGV2ZWwpO1xuXHRmbG9h
dCBkeFJvdWdobmVzcyA9IGRGZHgocm91Z2huZXNzKTtcblx0ZmxvYXQgZHlSb3VnaG5lc3MgPSBk
RmR5KHJvdWdobmVzcyk7XG5cdHZlYzMgZHggPSBkRmR4KCB2ZWMgKiBzY2FsZSAqIGR4Um91Z2hu
ZXNzICk7XG5cdHZlYzMgZHkgPSBkRmR5KCB2ZWMgKiBzY2FsZSAqIGR5Um91Z2huZXNzICk7XG5c
dGZsb2F0IGQgPSBtYXgoIGRvdCggZHgsIGR4ICksIGRvdCggZHksIGR5ICkgKTtcblx0ZCA9IGNs
YW1wKGQsIDEuMCwgY3ViZVVWX3JhbmdlQ2xhbXApO1xuXHRmbG9hdCBtaXBMZXZlbCA9IDAuNSAq
IGxvZzIoZCk7XG5cdHJldHVybiB2ZWMyKGZsb29yKG1pcExldmVsKSwgZnJhY3QobWlwTGV2ZWwp
KTtcbn1cbiNkZWZpbmUgY3ViZVVWX21heExvZHMyIChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSow
LjI1KSAtIDIuMClcbiNkZWZpbmUgY3ViZVVWX3JjcFRleHR1cmVTaXplICgxLjAgLyBjdWJlVVZf
dGV4dHVyZVNpemUpXG52ZWMyIGdldEN1YmVVVih2ZWMzIGRpcmVjdGlvbiwgZmxvYXQgcm91Z2hu
ZXNzTGV2ZWwsIGZsb2F0IG1pcExldmVsKSB7XG5cdG1pcExldmVsID0gcm91Z2huZXNzTGV2ZWwg
PiBjdWJlVVZfbWF4TG9kczIgLSAzLjAgPyAwLjAgOiBtaXBMZXZlbDtcblx0ZmxvYXQgYSA9IDE2
LjAgKiBjdWJlVVZfcmNwVGV4dHVyZVNpemU7XG5cdHZlYzIgZXhwMl9wYWNrZWQgPSBleHAyKCB2
ZWMyKCByb3VnaG5lc3NMZXZlbCwgbWlwTGV2ZWwgKSApO1xuXHR2ZWMyIHJjcF9leHAyX3BhY2tl
ZCA9IHZlYzIoIDEuMCApIC8gZXhwMl9wYWNrZWQ7XG5cdGZsb2F0IHBvd1NjYWxlID0gZXhwMl9w
YWNrZWQueCAqIGV4cDJfcGFja2VkLnk7XG5cdGZsb2F0IHNjYWxlID0gcmNwX2V4cDJfcGFja2Vk
LnggKiByY3BfZXhwMl9wYWNrZWQueSAqIDAuMjU7XG5cdGZsb2F0IG1pcE9mZnNldCA9IDAuNzUq
KDEuMCAtIHJjcF9leHAyX3BhY2tlZC55KSAqIHJjcF9leHAyX3BhY2tlZC54O1xuXHRib29sIGJS
ZXMgPSBtaXBMZXZlbCA9PSAwLjA7XG5cdHNjYWxlID0gIGJSZXMgJiYgKHNjYWxlIDwgYSkgPyBh
IDogc2NhbGU7XG5cdHZlYzMgcjtcblx0dmVjMiBvZmZzZXQ7XG5cdGludCBmYWNlID0gZ2V0RmFj
ZUZyb21EaXJlY3Rpb24oZGlyZWN0aW9uKTtcblx0ZmxvYXQgcmNwUG93U2NhbGUgPSAxLjAgLyBw
b3dTY2FsZTtcblx0aWYoIGZhY2UgPT0gMCkge1xuXHRcdHIgPSB2ZWMzKGRpcmVjdGlvbi54LCAt
ZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgPSB2ZWMyKDAuMCttaXBPZmZz
ZXQsMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55
IDwgMi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgPT0gMSkge1xu
XHRcdHIgPSB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnopO1xuXHRc
dG9mZnNldCA9IHZlYzIoc2NhbGUrbWlwT2Zmc2V0LCAwLjc1ICogcmNwUG93U2NhbGUpO1xuXHRc
dG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XG5c
dH1cblx0ZWxzZSBpZiggZmFjZSA9PSAyKSB7XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLnosIGRp
cmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0ID0gdmVjMigyLjAqc2NhbGUrbWlw
T2Zmc2V0LCAwLjc1ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zm
c2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSBpZiggZmFjZSA9PSAz
KSB7XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSk7
XG5cdFx0b2Zmc2V0ID0gdmVjMigwLjArbWlwT2Zmc2V0LDAuNSAqIHJjcFBvd1NjYWxlKTtcblx0
XHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7
XG5cdH1cblx0ZWxzZSBpZiggZmFjZSA9PSA0KSB7XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLnks
IGRpcmVjdGlvbi54LCAtZGlyZWN0aW9uLnopO1xuXHRcdG9mZnNldCA9IHZlYzIoc2NhbGUrbWlw
T2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZz
ZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2Uge1xuXHRcdHIgPSB2
ZWMzKGRpcmVjdGlvbi56LCAtZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQg
PSB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZz
ZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XG5cdH1c
blx0ciA9IG5vcm1hbGl6ZShyKTtcblx0ZmxvYXQgdGV4ZWxPZmZzZXQgPSAwLjUgKiBjdWJlVVZf
cmNwVGV4dHVyZVNpemU7XG5cdHZlYzIgcyA9ICggci55eiAvIGFicyggci54ICkgKyB2ZWMyKCAx
LjAgKSApICogMC41O1xuXHR2ZWMyIGJhc2UgPSBvZmZzZXQgKyB2ZWMyKCB0ZXhlbE9mZnNldCAp
O1xuXHRyZXR1cm4gYmFzZSArIHMgKiAoIHNjYWxlIC0gMi4wICogdGV4ZWxPZmZzZXQgKTtcbn1c
biNkZWZpbmUgY3ViZVVWX21heExvZHMzIChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSowLjI1KSAt
IDMuMClcbnZlYzQgdGV4dHVyZUN1YmVVVih2ZWMzIHJlZmxlY3RlZERpcmVjdGlvbiwgZmxvYXQg
cm91Z2huZXNzICkge1xuXHRmbG9hdCByb3VnaG5lc3NWYWwgPSByb3VnaG5lc3MqIGN1YmVVVl9t
YXhMb2RzMztcblx0ZmxvYXQgcjEgPSBmbG9vcihyb3VnaG5lc3NWYWwpO1xuXHRmbG9hdCByMiA9
IHIxICsgMS4wO1xuXHRmbG9hdCB0ID0gZnJhY3Qocm91Z2huZXNzVmFsKTtcblx0dmVjMiBtaXBJ
bmZvID0gTWlwTGV2ZWxJbmZvKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIHJvdWdobmVzcyk7XG5c
dGZsb2F0IHMgPSBtaXBJbmZvLnk7XG5cdGZsb2F0IGxldmVsMCA9IG1pcEluZm8ueDtcblx0Zmxv
YXQgbGV2ZWwxID0gbGV2ZWwwICsgMS4wO1xuXHRsZXZlbDEgPSBsZXZlbDEgPiA1LjAgPyA1LjAg
OiBsZXZlbDE7XG5cdGxldmVsMCArPSBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xuXHR2
ZWMyIHV2XzEwID0gZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIGxldmVsMCk7XG5c
dHZlYzQgY29sb3IxMCA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZf
MTApKTtcblx0dmVjMiB1dl8yMCA9IGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBs
ZXZlbDApO1xuXHR2ZWM0IGNvbG9yMjAgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChl
bnZNYXAsIHV2XzIwKSk7XG5cdHZlYzQgcmVzdWx0ID0gbWl4KGNvbG9yMTAsIGNvbG9yMjAsIHQp
O1xuXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xufVxuI2VuZGlmXG4iOworCisgICAg
dmFyIGRlZmF1bHRub3JtYWxfdmVydGV4ID0gInZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBub3Jt
YWxNYXRyaXggKiBvYmplY3ROb3JtYWw7XG4jaWZkZWYgRkxJUF9TSURFRFxuXHR0cmFuc2Zvcm1l
ZE5vcm1hbCA9IC0gdHJhbnNmb3JtZWROb3JtYWw7XG4jZW5kaWZcbiI7CisKKyAgICB2YXIgZGlz
cGxhY2VtZW50bWFwX3BhcnNfdmVydGV4ID0gIiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5c
dHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcblx0dW5pZm9ybSBmbG9hdCBkaXNw
bGFjZW1lbnRTY2FsZTtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xuI2VuZGlm
XG4iOworCisgICAgdmFyIGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9ESVNQ
TEFDRU1FTlRNQVBcblx0dHJhbnNmb3JtZWQgKz0gbm9ybWFsaXplKCBvYmplY3ROb3JtYWwgKSAq
ICggdGV4dHVyZTJEKCBkaXNwbGFjZW1lbnRNYXAsIHV2ICkueCAqIGRpc3BsYWNlbWVudFNjYWxl
ICsgZGlzcGxhY2VtZW50QmlhcyApO1xuI2VuZGlmXG4iOworCisgICAgdmFyIGVtaXNzaXZlbWFw
X2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcblx0dmVjNCBlbWlzc2l2ZUNvbG9y
ID0gdGV4dHVyZTJEKCBlbWlzc2l2ZU1hcCwgdlV2ICk7XG5cdGVtaXNzaXZlQ29sb3IucmdiID0g
ZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyKCBlbWlzc2l2ZUNvbG9yICkucmdiO1xuXHR0b3RhbEVt
aXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7XG4jZW5kaWZcbiI7CisKKyAgICB2
YXIgZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5c
dHVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwO1xuI2VuZGlmXG4iOworCisgICAgdmFyIGVu
Y29kaW5nc19mcmFnbWVudCA9ICIgIGdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwo
IGdsX0ZyYWdDb2xvciApO1xuIjsKKworICAgIHZhciBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCA9
ICJcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2YWx1
ZTtcbn1cbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFG
YWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnh5eiwgdmVjMyggZ2FtbWFGYWN0
b3IgKSApLCB2YWx1ZS53ICk7XG59XG52ZWM0IExpbmVhclRvR2FtbWEoIGluIHZlYzQgdmFsdWUs
IGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xuXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS54eXos
IHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUudyApO1xufVxudmVjNCBzUkdCVG9M
aW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUu
cmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICks
IHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdi
LCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLncgKTtcbn1cbnZlYzQgTGluZWFyVG9zUkdC
KCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwg
dmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEy
LjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkg
KSApLCB2YWx1ZS53ICk7XG59XG52ZWM0IFJHQkVUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtc
blx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4w
ICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XG5cdGZs
b2F0IG1heENvbXBvbmVudCA9IG1heCggbWF4KCB2YWx1ZS5yLCB2YWx1ZS5nICksIHZhbHVlLmIg
KTtcblx0ZmxvYXQgZkV4cCA9IGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAt
MTI4LjAsIDEyNy4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICks
ICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xufVxudmVjNCBSR0JNVG9MaW5lYXIoIGluIHZl
YzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUueHl6
ICogdmFsdWUudyAqIG1heFJhbmdlLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2
ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2
YWx1ZS54LCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBNICAgICAgPSBjbGFt
cCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XG5cdE0gICAgICAgICAgICA9IGNlaWwo
IE0gKiAyNTUuMCApIC8gMjU1LjA7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyAoIE0gKiBt
YXhSYW5nZSApLCBNICk7XG59XG52ZWM0IFJHQkRUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4g
ZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoICggbWF4UmFu
Z2UgLyAyNTUuMCApIC8gdmFsdWUuYSApLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JEKCBp
biB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCID0gbWF4
KCB2YWx1ZS54LCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBEICAgICAgPSBt
YXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcblx0RCAgICAgICAgICAgID0gbWluKCBmbG9v
ciggRCApIC8gMjU1LjAsIDEuMCApO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICog
KCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xufVxuY29uc3QgbWF0MyBjTG9nTHV2TSA9IG1h
dDMoIDAuMjIwOSwgMC4zMzkwLCAwLjQxODQsIDAuMTEzOCwgMC42NzgwLCAwLjczMTksIDAuMDEw
MiwgMC4xMTMwLCAwLjI5NjkgKTtcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUg
KSAge1xuXHR2ZWMzIFhwX1lfWFlacCA9IHZhbHVlLnJnYiAqIGNMb2dMdXZNO1xuXHRYcF9ZX1hZ
WnAgPSBtYXgoWHBfWV9YWVpwLCB2ZWMzKDFlLTYsIDFlLTYsIDFlLTYpKTtcblx0dmVjNCB2UmVz
dWx0O1xuXHR2UmVzdWx0Lnh5ID0gWHBfWV9YWVpwLnh5IC8gWHBfWV9YWVpwLno7XG5cdGZsb2F0
IExlID0gMi4wICogbG9nMihYcF9ZX1hZWnAueSkgKyAxMjcuMDtcblx0dlJlc3VsdC53ID0gZnJh
Y3QoTGUpO1xuXHR2UmVzdWx0LnogPSAoTGUgLSAoZmxvb3IodlJlc3VsdC53KjI1NS4wKSkvMjU1
LjApLzI1NS4wO1xuXHRyZXR1cm4gdlJlc3VsdDtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVy
c2VNID0gbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01
Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XG52ZWM0IExvZ0x1dlRvTGluZWFyKCBp
biB2ZWM0IHZhbHVlICkge1xuXHRmbG9hdCBMZSA9IHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7
XG5cdHZlYzMgWHBfWV9YWVpwO1xuXHRYcF9ZX1hZWnAueSA9IGV4cDIoKExlIC0gMTI3LjApIC8g
Mi4wKTtcblx0WHBfWV9YWVpwLnogPSBYcF9ZX1hZWnAueSAvIHZhbHVlLnk7XG5cdFhwX1lfWFla
cC54ID0gdmFsdWUueCAqIFhwX1lfWFlacC56O1xuXHR2ZWMzIHZSR0IgPSBYcF9ZX1hZWnAucmdi
ICogY0xvZ0x1dkludmVyc2VNO1xuXHRyZXR1cm4gdmVjNCggbWF4KHZSR0IsIDAuMCksIDEuMCAp
O1xufVxuIjsKKworICAgIHZhciBlbnZtYXBfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9FTlZNQVBc
blx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCAp
IHx8IGRlZmluZWQoIFBIT05HIClcblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXpl
KCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1h
bCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRc
dCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgPSBy
ZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0
dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCBy
ZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2Vsc2Vcblx0XHR2ZWMzIHJlZmxlY3RW
ZWMgPSB2UmVmbGVjdDtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0
dmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIGZsaXBOb3JtYWwgKiB2ZWMzKCBm
bGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICkgKTtcblx0I2VsaWYgZGVm
aW5lZCggRU5WTUFQX1RZUEVfRVFVSVJFQyApXG5cdFx0dmVjMiBzYW1wbGVVVjtcblx0XHRzYW1w
bGVVVi55ID0gYXNpbiggZmxpcE5vcm1hbCAqIHJlZmxlY3RWZWMueSApICogUkVDSVBST0NBTF9Q
SSArIDAuNTtcblx0XHRzYW1wbGVVVi54ID0gYXRhbiggZmxpcE5vcm1hbCAqIHJlZmxlY3RWZWMu
eiwgZmxpcE5vcm1hbCAqIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5c
dFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xuXHQjZWxp
ZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdHZlYzMgcmVmbGVjdFZpZXcgPSBm
bGlwTm9ybWFsICogbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAw
LjAgKSApLnh5eiArIHZlYzMoIDAuMCwgMC4wLCAxLjAgKSApO1xuXHRcdHZlYzQgZW52Q29sb3Ig
PSB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUgKTtcblx0I2Vs
c2Vcblx0XHR2ZWM0IGVudkNvbG9yID0gdmVjNCggMC4wICk7XG5cdCNlbmRpZlxuXHRlbnZDb2xv
ciA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudkNvbG9yICk7XG5cdCNpZmRlZiBFTlZNQVBfQkxF
TkRJTkdfTVVMVElQTFlcblx0XHRvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBv
dXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2
aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxuXHRcdG91dGdv
aW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJl
bmd0aCAqIHJlZmxlY3Rpdml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdf
QUREIClcblx0XHRvdXRnb2luZ0xpZ2h0ICs9IGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5n
dGggKiByZWZsZWN0aXZpdHk7XG5cdCNlbmRpZlxuI2VuZGlmXG4iOworCisgICAgdmFyIGVudm1h
cF9wYXJzX2ZyYWdtZW50ID0gIiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCgg
UEhZU0lDQUwgKVxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcblx0dW5pZm9ybSBmbG9h
dCBlbnZNYXBJbnRlbnNpdHk7XG4jZW5kaWZcbiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiAhIGRl
ZmluZWQoIFBIWVNJQ0FMICkgJiYgKCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQo
IFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIClcblx0XHR2YXJ5aW5nIHZlYzMg
dldvcmxkUG9zaXRpb247XG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRc
dHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gc2FtcGxl
cjJEIGVudk1hcDtcblx0I2VuZGlmXG5cdHVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDtcblx0I2lm
IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRl
ZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggUEhZU0lDQUwgKVxuXHRcdHVuaWZvcm0gZmxvYXQg
cmVmcmFjdGlvblJhdGlvO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0
I2VuZGlmXG4jZW5kaWZcbiI7CisKKyAgICB2YXIgZW52bWFwX3BhcnNfdmVydGV4ID0gIiNpZmRl
ZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVT
RV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXG5cdFx0dmFyeWluZyB2ZWMzIHZXb3Js
ZFBvc2l0aW9uO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0XHR1bmlm
b3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2VuZGlmXG4jZW5kaWZcbiI7CisKKyAgICB2
YXIgZW52bWFwX3ZlcnRleCA9ICIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWYgZGVmaW5lZCggVVNF
X0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcg
KVxuXHRcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XG5cdCNlbHNlXG5cdFx0
dmVjMyBjYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1l
cmFQb3NpdGlvbiApO1xuXHRcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGly
ZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZN
QVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2UmVmbGVjdCA9IHJlZmxlY3QoIGNhbWVyYVRvVmVy
dGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2UmVmbGVjdCA9IHJlZnJhY3Qo
IGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2Vu
ZGlmXG5cdCNlbmRpZlxuI2VuZGlmXG4iOworCisgICAgdmFyIGZvZ192ZXJ0ZXggPSAiXG4jaWZk
ZWYgVVNFX0ZPR1xuZm9nRGVwdGggPSAtbXZQb3NpdGlvbi56O1xuI2VuZGlmIjsKKworICAgIHZh
ciBmb2dfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9GT0dcbiAgdmFyeWluZyBmbG9hdCBmb2dE
ZXB0aDtcbiNlbmRpZlxuIjsKKworICAgIHZhciBmb2dfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9G
T0dcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0ZmxvYXQgZm9nRmFjdG9yID0gd2hpdGVDb21wbGlt
ZW50KCBleHAyKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZm9nRGVwdGggKiBmb2dEZXB0
aCAqIExPRzIgKSApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAo
IGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvci5y
Z2IgPSBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTtcbiNlbmRp
ZlxuIjsKKworICAgIHZhciBmb2dfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0ZPR1xuXHR1
bmlmb3JtIHZlYzMgZm9nQ29sb3I7XG5cdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XG5cdCNpZmRl
ZiBGT0dfRVhQMlxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRGVuc2l0eTtcblx0I2Vsc2Vcblx0XHR1
bmlmb3JtIGZsb2F0IGZvZ05lYXI7XG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dGYXI7XG5cdCNlbmRp
ZlxuI2VuZGlmXG4iOworCisgICAgdmFyIGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lm
ZGVmIFRPT05cblx0dW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRNYXA7XG5cdHZlYzMgZ2V0R3Jh
ZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHtcblx0
XHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xuXHRcdHZlYzIg
Y29vcmQgPSB2ZWMyKCBkb3ROTCAqIDAuNSArIDAuNSwgMC4wICk7XG5cdFx0I2lmZGVmIFVTRV9H
UkFESUVOVE1BUFxuXHRcdFx0cmV0dXJuIHRleHR1cmUyRCggZ3JhZGllbnRNYXAsIGNvb3JkICku
cmdiO1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gKCBjb29yZC54IDwgMC43ICkgPyB2ZWMzKCAw
LjcgKSA6IHZlYzMoIDEuMCApO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiI7CisKKyAgICB2
YXIgbGlnaHRtYXBfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRyZWZsZWN0ZWRM
aWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gUEkgKiB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICku
eHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG4jZW5kaWZcbiI7CisKKyAgICB2YXIgbGlnaHRtYXBf
cGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJE
IGxpZ2h0TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIjsK
KworICAgIHZhciBsaWdodHNfbGFtYmVydF92ZXJ0ZXggPSAidmVjMyBkaWZmdXNlID0gdmVjMygg
MS4wICk7XG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xuZ2VvbWV0cnkucG9zaXRpb24gPSBt
dlBvc2l0aW9uLnh5ejtcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRO
b3JtYWwgKTtcbmdlb21ldHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIC1tdlBvc2l0aW9uLnh5eiAp
O1xuR2VvbWV0cmljQ29udGV4dCBiYWNrR2VvbWV0cnk7XG5iYWNrR2VvbWV0cnkucG9zaXRpb24g
PSBnZW9tZXRyeS5wb3NpdGlvbjtcbmJhY2tHZW9tZXRyeS5ub3JtYWwgPSAtZ2VvbWV0cnkubm9y
bWFsO1xuYmFja0dlb21ldHJ5LnZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xudkxpZ2h0RnJv
bnQgPSB2ZWMzKCAwLjAgKTtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dkxpZ2h0QmFjayA9IHZl
YzMoIDAuMCApO1xuI2VuZGlmXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xuZmxvYXQgZG90
Tkw7XG52ZWMzIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcbiNpZiBOVU1fUE9JTlRfTElHSFRT
ID4gMFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xu
XHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0c1sgaSBdLCBnZW9t
ZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBk
aXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQ
SSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3RO
TCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURc
blx0XHRcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xv
cl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fU1BPVF9MSUdIVFMg
PiAwXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0
XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5
LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVj
dExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICog
ZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkg
KiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRc
dFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0Rp
ZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxu
XHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRE
aXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodHNbIGkgXSwg
Z2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1h
bCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNl
ID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSgg
ZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJ
REVEXG5cdFx0XHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0
Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX0hFTUlfTElH
SFRTID4gMFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7
XG5cdFx0dkxpZ2h0RnJvbnQgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNw
aGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0
XHRcdHZMaWdodEJhY2sgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVy
ZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4i
OworCisgICAgdmFyIGxpZ2h0c19wYXJzID0gInVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xv
cjtcbnZlYzMgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBhbWJpZW50
TGlnaHRDb2xvciApIHtcblx0dmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7XG5c
dCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKj0gUEk7
XG5cdCNlbmRpZlxuXHRyZXR1cm4gaXJyYWRpYW5jZTtcbn1cbiNpZiBOVU1fRElSX0xJR0hUUyA+
IDBcblx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHQge1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRc
dHZlYzMgY29sb3I7XG5cdFx0aW50IHNoYWRvdztcblx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRc
dGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdH07XG5cdHVu
aWZvcm0gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0c1sgTlVNX0RJUl9MSUdIVFMg
XTtcblx0dm9pZCBnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4g
RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250
ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHRkaXJl
Y3RMaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7XG5cdFx0ZGlyZWN0TGlnaHQu
ZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247XG5cdFx0ZGlyZWN0TGlnaHQu
dmlzaWJsZSA9IHRydWU7XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXG5c
dHN0cnVjdCBQb2ludExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgY29sb3I7
XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdFx0aW50IHNoYWRvdztc
blx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHR2ZWMy
IHNoYWRvd01hcFNpemU7XG5cdH07XG5cdHVuaWZvcm0gUG9pbnRMaWdodCBwb2ludExpZ2h0c1sg
TlVNX1BPSU5UX0xJR0hUUyBdO1xuXHR2b2lkIGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNl
KCBjb25zdCBpbiBQb2ludExpZ2h0IHBvaW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRl
eHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xuXHRcdHZlYzMg
bFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRk
aXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBs
aWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3Ig
PSBwb2ludExpZ2h0LmNvbG9yO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHB1bmN0dWFsTGln
aHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHBvaW50TGlnaHQu
ZGlzdGFuY2UsIHBvaW50TGlnaHQuZGVjYXkgKTtcblx0XHRkaXJlY3RMaWdodC52aXNpYmxlID0g
KCBkaXJlY3RMaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApO1xuXHR9XG4jZW5kaWZcbiNpZiBO
VU1fU1BPVF9MSUdIVFMgPiAwXG5cdHN0cnVjdCBTcG90TGlnaHQge1xuXHRcdHZlYzMgcG9zaXRp
b247XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRmbG9hdCBkaXN0
YW5jZTtcblx0XHRmbG9hdCBkZWNheTtcblx0XHRmbG9hdCBjb25lQ29zO1xuXHRcdGZsb2F0IHBl
bnVtYnJhQ29zO1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRm
bG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHR9O1xuXHR1bmlm
b3JtIFNwb3RMaWdodCBzcG90TGlnaHRzWyBOVU1fU1BPVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRT
cG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBTcG90TGlnaHQgc3BvdExpZ2h0LCBj
b25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJl
Y3RMaWdodCAgKSB7XG5cdFx0dmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2Vv
bWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBs
VmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xu
XHRcdGZsb2F0IGFuZ2xlQ29zID0gZG90KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdo
dC5kaXJlY3Rpb24gKTtcblx0XHRpZiAoIGFuZ2xlQ29zID4gc3BvdExpZ2h0LmNvbmVDb3MgKSB7
XG5cdFx0XHRmbG9hdCBzcG90RWZmZWN0ID0gc21vb3Roc3RlcCggc3BvdExpZ2h0LmNvbmVDb3Ms
IHNwb3RMaWdodC5wZW51bWJyYUNvcywgYW5nbGVDb3MgKTtcblx0XHRcdGRpcmVjdExpZ2h0LmNv
bG9yID0gc3BvdExpZ2h0LmNvbG9yO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gc3BvdEVm
ZmVjdCAqIHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlz
dGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7XG5cdFx0XHRkaXJl
Y3RMaWdodC52aXNpYmxlID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGlyZWN0TGlnaHQu
Y29sb3IgPSB2ZWMzKCAwLjAgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSBmYWxzZTtc
blx0XHR9XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxuXHRzdHJ1
Y3QgUmVjdEFyZWFMaWdodCB7XG5cdFx0dmVjMyBjb2xvcjtcblx0XHR2ZWMzIHBvc2l0aW9uO1xu
XHRcdHZlYzMgaGFsZldpZHRoO1xuXHRcdHZlYzMgaGFsZkhlaWdodDtcblx0fTtcblx0dW5pZm9y
bSBzYW1wbGVyMkQgbHRjTWF0O1x0dW5pZm9ybSBzYW1wbGVyMkQgbHRjTWFnO1xuXHR1bmlmb3Jt
IFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XG4j
ZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXG5cdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQg
e1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgc2t5Q29sb3I7XG5cdFx0dmVjMyBncm91
bmRDb2xvcjtcblx0fTtcblx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0
c1sgTlVNX0hFTUlfTElHSFRTIF07XG5cdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5j
ZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmlj
Q29udGV4dCBnZW9tZXRyeSApIHtcblx0XHRmbG9hdCBkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9y
bWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQg
PSAwLjUgKiBkb3ROTCArIDAuNTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdo
dC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xu
XHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0aXJyYWRpYW5jZSAq
PSBQSTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gaXJyYWRpYW5jZTtcblx0fVxuI2VuZGlmXG4j
aWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFBIWVNJQ0FMIClcblx0dmVjMyBn
ZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0
IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0dmVjMyB3b3JsZE5v
cm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01h
dHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVj
ID0gdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5c
dFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0
ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkg
KTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSgg
ZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbmRpZlxu
XHRcdFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3Ig
KS5yZ2I7XG5cdFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0XHR2
ZWMzIHF1ZXJ5VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9y
bWFsLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggcXVlcnlW
ZWMsIDEuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdmVjNCggMC4w
ICk7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFw
SW50ZW5zaXR5O1xuXHR9XG5cdGZsb2F0IGdldFNwZWN1bGFyTUlQTGV2ZWwoIGNvbnN0IGluIGZs
b2F0IGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtc
blx0XHRmbG9hdCBtYXhNSVBMZXZlbFNjYWxhciA9IGZsb2F0KCBtYXhNSVBMZXZlbCApO1xuXHRc
dGZsb2F0IGRlc2lyZWRNSVBMZXZlbCA9IG1heE1JUExldmVsU2NhbGFyIC0gMC43OTI0OCAtIDAu
NSAqIGxvZzIoIHBvdzIoIGJsaW5uU2hpbmluZXNzRXhwb25lbnQgKSArIDEuMCApO1xuXHRcdHJl
dHVybiBjbGFtcCggZGVzaXJlZE1JUExldmVsLCAwLjAsIG1heE1JUExldmVsU2NhbGFyICk7XG5c
dH1cblx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggY29uc3QgaW4gR2VvbWV0
cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gZmxvYXQgYmxpbm5TaGluaW5lc3NFeHBvbmVu
dCwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9S
RUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCAtZ2VvbWV0cnkudmll
d0RpciwgZ2VvbWV0cnkubm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzMgcmVmbGVjdFZl
YyA9IHJlZnJhY3QoIC1nZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIHJlZnJhY3Rp
b25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHRcdHJlZmxlY3RWZWMgPSBpbnZlcnNlVHJhbnNmb3Jt
RGlyZWN0aW9uKCByZWZsZWN0VmVjLCB2aWV3TWF0cml4ICk7XG5cdFx0ZmxvYXQgc3BlY3VsYXJN
SVBMZXZlbCA9IGdldFNwZWN1bGFyTUlQTGV2ZWwoIGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIG1h
eE1JUExldmVsICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVl
cnlSZWZsZWN0VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZl
Yy55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1h
cENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVj
dWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0g
dGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7
XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5l
YXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NV
QkVfVVYgKVxuXHRcdFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICog
cmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0g
dGV4dHVyZUN1YmVVVihxdWVyeVJlZmxlY3RWZWMsIEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVz
cyhibGlublNoaW5pbmVzc0V4cG9uZW50KSk7XG5cdFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZ
UEVfRVFVSVJFQyApXG5cdFx0XHR2ZWMyIHNhbXBsZVVWO1xuXHRcdFx0c2FtcGxlVVYueSA9IHNh
dHVyYXRlKCByZWZsZWN0VmVjLnkgKiAwLjUgKyAwLjUgKTtcblx0XHRcdHNhbXBsZVVWLnggPSBh
dGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7
XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3Ig
PSB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtc
blx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkQoIGVudk1h
cCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52
TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5c
dFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfU1BIRVJFIClcblx0XHRcdHZlYzMgcmVmbGVj
dFZpZXcgPSBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCAp
ICkueHl6ICsgdmVjMyggMC4wLDAuMCwxLjAgKSApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9E
X0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAs
IHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQj
ZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHJlZmxl
Y3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZc
blx0XHRcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9y
ICkucmdiO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJ
bnRlbnNpdHk7XG5cdH1cbiNlbmRpZlxuIjsKKworICAgIHZhciBsaWdodHNfcGhvbmdfZnJhZ21l
bnQgPSAiQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9y
ID0gZGlmZnVzZUNvbG9yLnJnYjtcbm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjtc
bm1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzID0gc2hpbmluZXNzO1xubWF0ZXJpYWwuc3BlY3Vs
YXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7XG4iOworCisgICAgdmFyIGxpZ2h0c19waG9u
Z19wYXJzX2ZyYWdtZW50ID0gInZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBG
TEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuc3RydWN0IEJsaW5u
UGhvbmdNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0dmVjM1x0c3BlY3VsYXJD
b2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyU2hpbmluZXNzO1xuXHRmbG9hdFx0c3BlY3VsYXJTdHJl
bmd0aDtcbn07XG52b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExp
Z2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25z
dCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJl
ZmxlY3RlZExpZ2h0ICkge1xuXHQjaWZkZWYgVE9PTlxuXHRcdHZlYzMgaXJyYWRpYW5jZSA9IGdl
dEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rp
b24gKSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGRvdE5MID0gc2F0
dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xu
XHRcdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNlbmRp
ZlxuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9
IFBJO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlh
bmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHRy
ZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxh
cl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29s
b3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVu
Z3RoO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVj
MyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBp
biBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxl
Y3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRp
YW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1c
biNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfQmxpbm5QaG9uZ1xuI2RlZmluZSBS
RV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdcbiNkZWZp
bmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVx0KDApXG4iOworCisgICAgdmFy
IGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCA9ICJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xu
bWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxu
ZXNzRmFjdG9yICk7XG5tYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyA9IGNsYW1wKCByb3VnaG5l
c3NGYWN0b3IsIDAuMDQsIDEuMCApO1xuI2lmZGVmIFNUQU5EQVJEXG5cdG1hdGVyaWFsLnNwZWN1
bGFyQ29sb3IgPSBtaXgoIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgZGlm
ZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XG4jZWxzZVxuXHRtYXRlcmlhbC5zcGVj
dWxhckNvbG9yID0gbWl4KCB2ZWMzKCBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UICogcG93
MiggcmVmbGVjdGl2aXR5ICkgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7
XG5cdG1hdGVyaWFsLmNsZWFyQ29hdCA9IHNhdHVyYXRlKCBjbGVhckNvYXQgKTtcdG1hdGVyaWFs
LmNsZWFyQ29hdFJvdWdobmVzcyA9IGNsYW1wKCBjbGVhckNvYXRSb3VnaG5lc3MsIDAuMDQsIDEu
MCApO1xuI2VuZGlmXG4iOworCisgICAgdmFyIGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50
ID0gInN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHtcblx0dmVjM1x0ZGlmZnVzZUNvbG9yO1xuXHRm
bG9hdFx0c3BlY3VsYXJSb3VnaG5lc3M7XG5cdHZlYzNcdHNwZWN1bGFyQ29sb3I7XG5cdCNpZm5k
ZWYgU1RBTkRBUkRcblx0XHRmbG9hdCBjbGVhckNvYXQ7XG5cdFx0ZmxvYXQgY2xlYXJDb2F0Um91
Z2huZXNzO1xuXHQjZW5kaWZcbn07XG4jZGVmaW5lIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lF
TlQgMC4xNlxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcbmZsb2F0
IGNsZWFyQ29hdERIUkFwcHJveCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBm
bG9hdCBkb3ROTCApIHtcblx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAo
IDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3RO
TCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcbn1cbiNpZiBOVU1fUkVD
VF9BUkVBX0xJR0hUUyA+IDBcblx0dm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNv
bnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29u
dGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQg
UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdFx0dmVjMyBub3JtYWwgPSBnZW9t
ZXRyeS5ub3JtYWw7XG5cdFx0dmVjMyB2aWV3RGlyID0gZ2VvbWV0cnkudmlld0Rpcjtcblx0XHR2
ZWMzIHBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0dmVjMyBsaWdodFBvcyA9IHJl
Y3RBcmVhTGlnaHQucG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGggPSByZWN0QXJlYUxpZ2h0
LmhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQgPSByZWN0QXJlYUxpZ2h0LmhhbGZIZWln
aHQ7XG5cdFx0dmVjMyBsaWdodENvbG9yID0gcmVjdEFyZWFMaWdodC5jb2xvcjtcblx0XHRmbG9h
dCByb3VnaG5lc3MgPSBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcztcblx0XHR2ZWMzIHJlY3RD
b29yZHNbIDQgXTtcblx0XHRyZWN0Q29vcmRzWyAwIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCAt
IGhhbGZIZWlnaHQ7XHRcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0g
aGFsZkhlaWdodDtcblx0XHRyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCAr
IGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGgg
KyBoYWxmSGVpZ2h0O1xuXHRcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91
Z2huZXNzICk7XG5cdFx0ZmxvYXQgbm9ybSA9IHRleHR1cmUyRCggbHRjTWFnLCB1diApLmE7XG5c
dFx0dmVjNCB0ID0gdGV4dHVyZTJEKCBsdGNNYXQsIHV2ICk7XG5cdFx0bWF0MyBtSW52ID0gbWF0
Myhcblx0XHRcdHZlYzMoICAgMSwgICAwLCB0LnkgKSxcblx0XHRcdHZlYzMoICAgMCwgdC56LCAg
IDAgKSxcblx0XHRcdHZlYzMoIHQudywgICAwLCB0LnggKVxuXHRcdCk7XG5cdFx0cmVmbGVjdGVk
TGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLnNwZWN1bGFyQ29s
b3IgKiBub3JtICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52
LCByZWN0Q29vcmRzICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBsaWdo
dENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZp
ZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxICksIHJlY3RDb29yZHMgKTtcblx0fVxuI2VuZGlmXG52
b2lkIFJFX0RpcmVjdF9QaHlzaWNhbCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdo
dCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxN
YXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7
XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RM
aWdodC5kaXJlY3Rpb24gKSApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExp
Z2h0LmNvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJh
ZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0I2lmbmRlZiBTVEFOREFSRFxuXHRcdGZsb2F0IGNs
ZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0
ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNs
ZWFyQ29hdERIUiA9IDAuMDtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1
bGFyICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxh
cl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0
ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVz
ZSArPSAoIDEuMCAtIGNsZWFyQ29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9M
YW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcblx0I2lmbmRlZiBTVEFOREFSRFxuXHRc
dHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBtYXRlcmlhbC5j
bGVhckNvYXQgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCB2ZWMz
KCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdo
bmVzcyApO1xuXHQjZW5kaWZcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKCBj
b25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0
cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExp
Z2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2Ug
Kz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29s
b3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVj
MyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhckNvYXRSYWRpYW5jZSwgY29uc3QgaW4gR2Vv
bWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlh
bCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdCNpZm5kZWYgU1RB
TkRBUkRcblx0XHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwg
Z2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0ZmxvYXQgZG90TkwgPSBkb3ROVjtcblx0XHRmbG9h
dCBjbGVhckNvYXRESFIgPSBtYXRlcmlhbC5jbGVhckNvYXQgKiBjbGVhckNvYXRESFJBcHByb3go
IG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcywgZG90TkwgKTtcblx0I2Vsc2Vcblx0XHRmbG9h
dCBjbGVhckNvYXRESFIgPSAwLjA7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVj
dFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiByYWRpYW5jZSAqIEJSREZfU3Bl
Y3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwg
bWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcblx0I2lmbmRlZiBTVEFOREFSRFxuXHRcdHJl
ZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gY2xlYXJDb2F0UmFkaWFuY2UgKiBtYXRl
cmlhbC5jbGVhckNvYXQgKiBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggZ2VvbWV0cnks
IHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJDb2F0
Um91Z2huZXNzICk7XG5cdCNlbmRpZlxufVxuI2RlZmluZSBSRV9EaXJlY3RcdFx0XHRcdFJFX0Rp
cmVjdF9QaHlzaWNhbFxuI2RlZmluZSBSRV9EaXJlY3RfUmVjdEFyZWFcdFx0UkVfRGlyZWN0X1Jl
Y3RBcmVhX1BoeXNpY2FsXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVx0XHRSRV9JbmRpcmVj
dERpZmZ1c2VfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3RTcGVjdWxhclx0XHRSRV9JbmRp
cmVjdFNwZWN1bGFyX1BoeXNpY2FsXG4jZGVmaW5lIE1hdGVyaWFsX0JsaW5uU2hpbmluZXNzRXhw
b25lbnQoIG1hdGVyaWFsICkgICBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIG1hdGVyaWFs
LnNwZWN1bGFyUm91Z2huZXNzIClcbiNkZWZpbmUgTWF0ZXJpYWxfQ2xlYXJDb2F0X0JsaW5uU2hp
bmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICkgICBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQo
IG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyApXG5mbG9hdCBjb21wdXRlU3BlY3VsYXJPY2Ns
dXNpb24oIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCBhbWJpZW50T2NjbHVz
aW9uLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdHJldHVybiBzYXR1cmF0ZSggcG93
KCBkb3ROViArIGFtYmllbnRPY2NsdXNpb24sIGV4cDIoIC0gMTYuMCAqIHJvdWdobmVzcyAtIDEu
MCApICkgLSAxLjAgKyBhbWJpZW50T2NjbHVzaW9uICk7XG59XG4iOworCisgICAgdmFyIGxpZ2h0
c190ZW1wbGF0ZSA9ICJcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3Np
dGlvbiA9IC0gdlZpZXdQb3NpdGlvbjtcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbDtcbmdlb21l
dHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcbkluY2lkZW50TGlnaHQg
ZGlyZWN0TGlnaHQ7XG4jaWYgKCBOVU1fUE9JTlRfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJF
X0RpcmVjdCApXG5cdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcblx0Zm9yICggaW50IGkgPSAwOyBp
IDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRwb2ludExpZ2h0ID0gcG9pbnRMaWdo
dHNbIGkgXTtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodCwg
Z2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0XHRk
aXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBwb2ludExpZ2h0LnNoYWRvdywgZGlyZWN0
TGlnaHQudmlzaWJsZSApICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwg
cG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGln
aHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2Vu
ZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZs
ZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9TUE9UX0xJR0hUUyA+IDAgKSAm
JiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHRmb3IgKCBp
bnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0ID0g
c3BvdExpZ2h0c1sgaSBdO1xuXHRcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RM
aWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmZGVmIFVTRV9TSEFET1dNQVBc
blx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBzcG90TGlnaHQuc2hhZG93LCBk
aXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBz
cG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5z
aGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHRcdCNlbmRpZlxu
XHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVk
TGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgKCBOVU1fRElSX0xJR0hUUyA+IDAgKSAmJiBkZWZp
bmVkKCBSRV9EaXJlY3QgKVxuXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XG5c
dGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGRpcmVj
dGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xuXHRcdGdldERpcmVjdGlvbmFs
RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0
TGlnaHQgKTtcblx0XHQjaWZkZWYgVVNFX1NIQURPV01BUFxuXHRcdGRpcmVjdExpZ2h0LmNvbG9y
ICo9IGFsbCggYnZlYzIoIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNp
YmxlICkgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9u
YWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVj
dGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkg
OiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnks
IG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9SRUNU
X0FSRUFfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdF9SZWN0QXJlYSApXG5cdFJl
Y3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodDtcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JF
Q1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGln
aHRzWyBpIF07XG5cdFx0UkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRy
eSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmIGRlZmluZWQo
IFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdHZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdo
dElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XG5cdCNpZmRlZiBVU0VfTElHSFRNQVBc
blx0XHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIg
KS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVD
VF9MSUdIVFNcblx0XHRcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqPSBQSTtcblx0XHQjZW5kaWZcblx0
XHRpcnJhZGlhbmNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTtcblx0I2VuZGlmXG5cdCNpZiAoIE5V
TV9IRU1JX0xJR0hUUyA+IDAgKVxuXHRcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJ
R0hUUzsgaSArKyApIHtcblx0XHRcdGlycmFkaWFuY2UgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJy
YWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdH1cblx0I2Vu
ZGlmXG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUEhZU0lDQUwgKSAm
JiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRpcnJhZGlhbmNlICs9IGdldExp
Z2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGdlb21ldHJ5LCA4ICk7XG5cdCNlbmRpZlxuXHRS
RV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVj
dGVkTGlnaHQgKTtcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVk
KCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0dmVjMyByYWRpYW5jZSA9IGdldExpZ2h0UHJvYmVJ
bmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeSwgTWF0ZXJpYWxfQmxpbm5TaGluaW5lc3NFeHBvbmVu
dCggbWF0ZXJpYWwgKSwgOCApO1xuXHQjaWZuZGVmIFNUQU5EQVJEXG5cdFx0dmVjMyBjbGVhckNv
YXRSYWRpYW5jZSA9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeSwgTWF0
ZXJpYWxfQ2xlYXJDb2F0X0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIDggKTtc
blx0I2Vsc2Vcblx0XHR2ZWMzIGNsZWFyQ29hdFJhZGlhbmNlID0gdmVjMyggMC4wICk7XG5cdCNl
bmRpZlxuXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgY2xlYXJDb2F0UmFkaWFuY2Us
IGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuIjsKKworICAg
IHZhciBsb2dkZXB0aGJ1Zl9mcmFnbWVudCA9ICIjaWYgZGVmaW5lZChVU0VfTE9HREVQVEhCVUYp
ICYmIGRlZmluZWQoVVNFX0xPR0RFUFRIQlVGX0VYVClcblx0Z2xfRnJhZ0RlcHRoRVhUID0gbG9n
Mih2RnJhZ0RlcHRoKSAqIGxvZ0RlcHRoQnVmRkMgKiAwLjU7XG4jZW5kaWYiOworCisgICAgdmFy
IGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHR1
bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhU
XG5cdFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuXHQjZW5kaWZcbiNlbmRpZlxuIjsKKwor
ICAgIHZhciBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCA9ICIjaWZkZWYgVVNFX0xPR0RFUFRIQlVG
XG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dmFyeWluZyBmbG9hdCB2RnJhZ0Rl
cHRoO1xuXHQjZW5kaWZcblx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xuI2VuZGlmIjsK
KworICAgIHZhciBsb2dkZXB0aGJ1Zl92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxu
XHRnbF9Qb3NpdGlvbi56ID0gbG9nMihtYXgoIEVQU0lMT04sIGdsX1Bvc2l0aW9uLncgKyAxLjAg
KSkgKiBsb2dEZXB0aEJ1ZkZDO1xuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZG
cmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xuXHQjZWxzZVxuXHRcdGdsX1Bvc2l0aW9u
LnogPSAoZ2xfUG9zaXRpb24ueiAtIDEuMCkgKiBnbF9Qb3NpdGlvbi53O1xuXHQjZW5kaWZcbiNl
bmRpZlxuIjsKKworICAgIHZhciBtYXBfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9NQVBcblx0dmVj
NCB0ZXhlbENvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xuXHR0ZXhlbENvbG9yID0gbWFw
VGV4ZWxUb0xpbmVhciggdGV4ZWxDb2xvciApO1xuXHRkaWZmdXNlQ29sb3IgKj0gdGV4ZWxDb2xv
cjtcbiNlbmRpZlxuIjsKKworICAgIHZhciBtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNF
X01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWZcbiI7CisKKyAgICB2YXIgbWFw
X3BhcnRpY2xlX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTUFQXG5cdHZlYzQgbWFwVGV4ZWwgPSB0
ZXh0dXJlMkQoIG1hcCwgdmVjMiggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3Jk
LnkgKSAqIG9mZnNldFJlcGVhdC56dyArIG9mZnNldFJlcGVhdC54eSApO1xuXHRkaWZmdXNlQ29s
b3IgKj0gbWFwVGV4ZWxUb0xpbmVhciggbWFwVGV4ZWwgKTtcbiNlbmRpZlxuIjsKKworICAgIHZh
ciBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3Jt
IHZlYzQgb2Zmc2V0UmVwZWF0O1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWZcbiI7
CisKKyAgICB2YXIgbWV0YWxuZXNzbWFwX2ZyYWdtZW50ID0gImZsb2F0IG1ldGFsbmVzc0ZhY3Rv
ciA9IG1ldGFsbmVzcztcbiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXG5cdHZlYzQgdGV4ZWxNZXRh
bG5lc3MgPSB0ZXh0dXJlMkQoIG1ldGFsbmVzc01hcCwgdlV2ICk7XG5cdG1ldGFsbmVzc0ZhY3Rv
ciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xuI2VuZGlmXG4iOworCisgICAgdmFyIG1ldGFsbmVzc21h
cF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXG5cdHVuaWZvcm0gc2Ft
cGxlcjJEIG1ldGFsbmVzc01hcDtcbiNlbmRpZiI7CisKKyAgICB2YXIgbW9ycGhub3JtYWxfdmVy
dGV4ID0gIiNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdG9iamVjdE5vcm1hbCArPSAoIG1vcnBo
Tm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdG9iamVj
dE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMSAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVu
Y2VzWyAxIF07XG5cdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMiAtIG5vcm1hbCApICog
bW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9y
bWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG4jZW5kaWZcbiI7
CisKKyAgICB2YXIgbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9NT1JQSFRB
UkdFVFNcblx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdHVuaWZvcm0gZmxvYXQgbW9ycGhU
YXJnZXRJbmZsdWVuY2VzWyA4IF07XG5cdCNlbHNlXG5cdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJn
ZXRJbmZsdWVuY2VzWyA0IF07XG5cdCNlbmRpZlxuI2VuZGlmIjsKKworICAgIHZhciBtb3JwaHRh
cmdldF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcblx0dHJhbnNmb3JtZWQgKz0g
KCBtb3JwaFRhcmdldDAgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07
XG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQxIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFy
Z2V0SW5mbHVlbmNlc1sgMSBdO1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MiAtIHBv
c2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0dHJhbnNmb3JtZWQgKz0g
KCBtb3JwaFRhcmdldDMgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07
XG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFy
Z2V0NCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0dHJhbnNm
b3JtZWQgKz0gKCBtb3JwaFRhcmdldDUgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVu
Y2VzWyA1IF07XG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ2IC0gcG9zaXRpb24gKSAq
IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFy
Z2V0NyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDcgXTtcblx0I2VuZGlm
XG4jZW5kaWZcbiI7CisKKyAgICB2YXIgbm9ybWFsX2ZsaXAgPSAiI2lmZGVmIERPVUJMRV9TSURF
RFxuXHRmbG9hdCBmbGlwTm9ybWFsID0gKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAt
IDEuMCApO1xuI2Vsc2Vcblx0ZmxvYXQgZmxpcE5vcm1hbCA9IDEuMDtcbiNlbmRpZlxuIjsKKwor
ICAgIHZhciBub3JtYWxfZnJhZ21lbnQgPSAiI2lmZGVmIEZMQVRfU0hBREVEXG5cdHZlYzMgZmR4
ID0gdmVjMyggZEZkeCggdlZpZXdQb3NpdGlvbi54ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueSAp
LCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIGZkeSA9IHZlYzMoIGRGZHkoIHZW
aWV3UG9zaXRpb24ueCApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeSggdlZpZXdQb3Np
dGlvbi56ICkgKTtcblx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBmZHgsIGZkeSAp
ICk7XG4jZWxzZVxuXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApICogZmxpcE5v
cm1hbDtcbiNlbmRpZlxuI2lmZGVmIFVTRV9OT1JNQUxNQVBcblx0bm9ybWFsID0gcGVydHVyYk5v
cm1hbDJBcmIoIC12Vmlld1Bvc2l0aW9uLCBub3JtYWwgKTtcbiNlbGlmIGRlZmluZWQoIFVTRV9C
VU1QTUFQIClcblx0bm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5v
cm1hbCwgZEhkeHlfZndkKCkgKTtcbiNlbmRpZlxuIjsKKworICAgIHZhciBub3JtYWxtYXBfcGFy
c19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBu
b3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcblx0dmVjMyBwZXJ0dXJiTm9y
bWFsMkFyYiggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSApIHtcblx0XHR2ZWMzIHEwID0g
dmVjMyggZEZkeCggZXllX3Bvcy54ICksIGRGZHgoIGV5ZV9wb3MueSApLCBkRmR4KCBleWVfcG9z
LnogKSApO1xuXHRcdHZlYzMgcTEgPSB2ZWMzKCBkRmR5KCBleWVfcG9zLnggKSwgZEZkeSggZXll
X3Bvcy55ICksIGRGZHkoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMiBzdDAgPSBkRmR4KCB2VXYu
c3QgKTtcblx0XHR2ZWMyIHN0MSA9IGRGZHkoIHZVdi5zdCApO1xuXHRcdHZlYzMgUyA9IG5vcm1h
bGl6ZSggcTAgKiBzdDEudCAtIHExICogc3QwLnQgKTtcblx0XHR2ZWMzIFQgPSBub3JtYWxpemUo
IC1xMCAqIHN0MS5zICsgcTEgKiBzdDAucyApO1xuXHRcdHZlYzMgTiA9IG5vcm1hbGl6ZSggc3Vy
Zl9ub3JtICk7XG5cdFx0dmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5
eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5ID0gbm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRc
dG1hdDMgdHNuID0gbWF0MyggUywgVCwgTiApO1xuXHRcdHJldHVybiBub3JtYWxpemUoIHRzbiAq
IG1hcE4gKTtcblx0fVxuI2VuZGlmXG4iOworCisgICAgdmFyIHBhY2tpbmcgPSAidmVjMyBwYWNr
Tm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xuXHRyZXR1cm4gbm9ybWFsaXpl
KCBub3JtYWwgKSAqIDAuNSArIDAuNTtcbn1cbnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0
IGluIHZlYzMgcmdiICkge1xuXHRyZXR1cm4gMS4wIC0gMi4wICogcmdiLnh5ejtcbn1cbmNvbnN0
IGZsb2F0IFBhY2tVcHNjYWxlID0gMjU2LiAvIDI1NS47Y29uc3QgZmxvYXQgVW5wYWNrRG93bnNj
YWxlID0gMjU1LiAvIDI1Ni47XG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzID0gdmVjMyggMjU2LiAq
IDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgIDI1Ni4gKTtcbmNvbnN0IHZlYzQgVW5wYWNrRmFj
dG9ycyA9IFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xuY29uc3Qg
ZmxvYXQgU2hpZnRSaWdodDggPSAxLiAvIDI1Ni47XG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29u
c3QgaW4gZmxvYXQgdiApIHtcblx0dmVjNCByID0gdmVjNCggZnJhY3QoIHYgKiBQYWNrRmFjdG9y
cyApLCB2ICk7XG5cdHIueXp3IC09IHIueHl6ICogU2hpZnRSaWdodDg7XHRyZXR1cm4gciAqIFBh
Y2tVcHNjYWxlO1xufVxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiAp
IHtcblx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xufVxuZmxvYXQgdmlld1pUb09y
dGhvZ3JhcGhpY0RlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVh
ciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCB2aWV3WiArIG5lYXIgKSAvICgg
bmVhciAtIGZhciApO1xufVxuZmxvYXQgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKCBjb25zdCBp
biBmbG9hdCBsaW5lYXJDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQg
ZmFyICkge1xuXHRyZXR1cm4gbGluZWFyQ2xpcFogKiAoIG5lYXIgLSBmYXIgKSAtIG5lYXI7XG59
XG5mbG9hdCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNv
bnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICgoIG5l
YXIgKyB2aWV3WiApICogZmFyICkgLyAoKCBmYXIgLSBuZWFyICkgKiB2aWV3WiApO1xufVxuZmxv
YXQgcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGludkNsaXBaLCBjb25z
dCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoIG5lYXIg
KiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiBpbnZDbGlwWiAtIGZhciApO1xufVxuIjsKKwor
ICAgIHZhciBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50ID0gIiNpZmRlZiBQUkVNVUxUSVBM
SUVEX0FMUEhBXG5cdGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XG4jZW5kaWZc
biI7CisKKyAgICB2YXIgcHJvamVjdF92ZXJ0ZXggPSAidmVjNCBtdlBvc2l0aW9uID0gbW9kZWxW
aWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuZ2xfUG9zaXRpb24gPSBwcm9q
ZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcbiI7CisKKyAgICB2YXIgZGl0aGVyaW5nX2ZyYWdt
ZW50ID0gIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxuICBnbF9GcmFnQ29sb3IucmdiID0gZGl0
aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWZcbiI7CisKKyAgICB2YXIgZGl0aGVy
aW5nX3BhcnNfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoIERJVEhFUklORyApXG5cdHZlYzMgZGl0
aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRcdGZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBn
bF9GcmFnQ29vcmQueHkgKTtcblx0XHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1
IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xuXHRcdGRpdGhlcl9zaGlm
dF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRf
UkdCLCBncmlkX3Bvc2l0aW9uICk7XG5cdFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JH
Qjtcblx0fVxuI2VuZGlmXG4iOworCisgICAgdmFyIHJvdWdobmVzc21hcF9mcmFnbWVudCA9ICJm
bG9hdCByb3VnaG5lc3NGYWN0b3IgPSByb3VnaG5lc3M7XG4jaWZkZWYgVVNFX1JPVUdITkVTU01B
UFxuXHR2ZWM0IHRleGVsUm91Z2huZXNzID0gdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZVdiAp
O1xuXHRyb3VnaG5lc3NGYWN0b3IgKj0gdGV4ZWxSb3VnaG5lc3MuZztcbiNlbmRpZlxuIjsKKwor
ICAgIHZhciByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX1JPVUdITkVT
U01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XG4jZW5kaWYiOworCisgICAg
dmFyIHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNp
ZiBOVU1fRElSX0xJR0hUUyA+IDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBkaXJlY3Rpb25hbFNo
YWRvd01hcFsgTlVNX0RJUl9MSUdIVFMgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFs
U2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1Rf
TElHSFRTID4gMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHNwb3RTaGFkb3dNYXBbIE5VTV9TUE9U
X0xJR0hUUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9M
SUdIVFMgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxuXHRcdHVuaWZv
cm0gc2FtcGxlcjJEIHBvaW50U2hhZG93TWFwWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdFx0dmFy
eWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdCNlbmRp
ZlxuXHRmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBm
bG9hdCBjb21wYXJlICkge1xuXHRcdHJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9E
ZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApO1xuXHR9XG5cdGZsb2F0IHRleHR1cmUy
RFNoYWRvd0xlcnAoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgc2l6ZSwgdmVjMiB1diwgZmxvYXQg
Y29tcGFyZSApIHtcblx0XHRjb25zdCB2ZWMyIG9mZnNldCA9IHZlYzIoIDAuMCwgMS4wICk7XG5c
dFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNpemU7XG5cdFx0dmVjMiBjZW50cm9p
ZFVWID0gZmxvb3IoIHV2ICogc2l6ZSArIDAuNSApIC8gc2l6ZTtcblx0XHRmbG9hdCBsYiA9IHRl
eHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC54
eCwgY29tcGFyZSApO1xuXHRcdGZsb2F0IGx0ID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBj
ZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh5LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQg
cmIgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBv
ZmZzZXQueXgsIGNvbXBhcmUgKTtcblx0XHRmbG9hdCBydCA9IHRleHR1cmUyRENvbXBhcmUoIGRl
cHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eSwgY29tcGFyZSApO1xuXHRc
dHZlYzIgZiA9IGZyYWN0KCB1diAqIHNpemUgKyAwLjUgKTtcblx0XHRmbG9hdCBhID0gbWl4KCBs
YiwgbHQsIGYueSApO1xuXHRcdGZsb2F0IGIgPSBtaXgoIHJiLCBydCwgZi55ICk7XG5cdFx0Zmxv
YXQgYyA9IG1peCggYSwgYiwgZi54ICk7XG5cdFx0cmV0dXJuIGM7XG5cdH1cblx0ZmxvYXQgZ2V0
U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNo
YWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCApIHtcblx0XHRm
bG9hdCBzaGFkb3cgPSAxLjA7XG5cdFx0c2hhZG93Q29vcmQueHl6IC89IHNoYWRvd0Nvb3JkLnc7
XG5cdFx0c2hhZG93Q29vcmQueiArPSBzaGFkb3dCaWFzO1xuXHRcdGJ2ZWM0IGluRnJ1c3R1bVZl
YyA9IGJ2ZWM0ICggc2hhZG93Q29vcmQueCA+PSAwLjAsIHNoYWRvd0Nvb3JkLnggPD0gMS4wLCBz
aGFkb3dDb29yZC55ID49IDAuMCwgc2hhZG93Q29vcmQueSA8PSAxLjAgKTtcblx0XHRib29sIGlu
RnJ1c3R1bSA9IGFsbCggaW5GcnVzdHVtVmVjICk7XG5cdFx0YnZlYzIgZnJ1c3R1bVRlc3RWZWMg
PSBidmVjMiggaW5GcnVzdHVtLCBzaGFkb3dDb29yZC56IDw9IDEuMCApO1xuXHRcdGJvb2wgZnJ1
c3R1bVRlc3QgPSBhbGwoIGZydXN0dW1UZXN0VmVjICk7XG5cdFx0aWYgKCBmcnVzdHVtVGVzdCAp
IHtcblx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGIClcblx0XHRcdHZlYzIgdGV4
ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgZHgwID0g
LSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MCA9IC0gdGV4ZWxT
aXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICog
c2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1Jh
ZGl1cztcblx0XHRcdHNoYWRvdyA9IChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93
TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSAr
XG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2
ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21w
YXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93
Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dD
b29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRl
eHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnog
KSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkg
KyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRD
b21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hh
ZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFk
b3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRc
dHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEs
IGR5MSApLCBzaGFkb3dDb29yZC56IClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNl
bGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIClcblx0XHRcdHZlYzIgdGV4ZWxT
aXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgZHgwID0gLSB0
ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXpl
LnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hh
ZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1
cztcblx0XHRcdHNoYWRvdyA9IChcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93
TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNo
YWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwg
c2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dD
b29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRv
d01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQu
eiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBT
aXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSAr
XG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwg
c2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRv
d0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBk
eDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJw
KCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBk
eTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hh
ZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICks
IHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01h
cCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFk
b3dDb29yZC56IClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHRz
aGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFk
b3dDb29yZC56ICk7XG5cdFx0I2VuZGlmXG5cdFx0fVxuXHRcdHJldHVybiBzaGFkb3c7XG5cdH1c
blx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xuXHRcdHZlYzMg
YWJzViA9IGFicyggdiApO1xuXHRcdGZsb2F0IHNjYWxlVG9DdWJlID0gMS4wIC8gbWF4KCBhYnNW
LngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xuXHRcdGFic1YgKj0gc2NhbGVUb0N1YmU7XG5c
dFx0diAqPSBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xuXHRcdHZl
YzIgcGxhbmFyID0gdi54eTtcblx0XHRmbG9hdCBhbG1vc3RBVGV4ZWwgPSAxLjUgKiB0ZXhlbFNp
emVZO1xuXHRcdGZsb2F0IGFsbW9zdE9uZSA9IDEuMCAtIGFsbW9zdEFUZXhlbDtcblx0XHRpZiAo
IGFic1YueiA+PSBhbG1vc3RPbmUgKSB7XG5cdFx0XHRpZiAoIHYueiA+IDAuMCApXG5cdFx0XHRc
dHBsYW5hci54ID0gNC4wIC0gdi54O1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueCA+PSBhbG1vc3RP
bmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWCA9IHNpZ24oIHYueCApO1xuXHRcdFx0cGxhbmFyLngg
PSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBh
bG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWSA9IHNpZ24oIHYueSApO1xuXHRcdFx0cGxh
bmFyLnggPSB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcblx0XHRcdHBsYW5hci55ID0gdi56ICog
c2lnblkgLSAyLjA7XG5cdFx0fVxuXHRcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxh
bmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcblx0fVxuXHRmbG9hdCBnZXRQb2ludFNoYWRvdygg
c2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFz
LCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XG5cdFx0dmVjMiB0ZXhl
bFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkg
KTtcblx0XHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcblx0XHR2ZWMz
IGJkM0QgPSBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApO1xuXHRcdGZsb2F0IGRwID0gKCBs
ZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApIC0gc2hhZG93QmlhcyApIC8gMTAwMC4wO1xuXHRcdCNp
ZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQ
RV9QQ0ZfU09GVCApXG5cdFx0XHR2ZWMyIG9mZnNldCA9IHZlYzIoIC0gMSwgMSApICogc2hhZG93
UmFkaXVzICogdGV4ZWxTaXplLnk7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHR0ZXh0dXJlMkRD
b21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXpl
LnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRv
VVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4
dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRl
eGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAs
IGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0
XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6
ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVU
b1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRl
eHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0
ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFw
LCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRc
dFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0
Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0
I2Vsc2Vcblx0XHRcdHJldHVybiB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VW
KCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiI7
CisKKyAgICB2YXIgc2hhZG93bWFwX3BhcnNfdmVydGV4ID0gIiNpZmRlZiBVU0VfU0hBRE9XTUFQ
XG5cdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcblx0XHR1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxT
aGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rp
b25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9T
UE9UX0xJR0hUUyA+IDBcblx0XHR1bmlmb3JtIG1hdDQgc3BvdFNoYWRvd01hdHJpeFsgTlVNX1NQ
T1RfTElHSFRTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9U
X0xJR0hUUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXG5cdFx0dW5p
Zm9ybSBtYXQ0IHBvaW50U2hhZG93TWF0cml4WyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdFx0dmFy
eWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdCNlbmRp
ZlxuI2VuZGlmXG4iOworCisgICAgdmFyIHNoYWRvd21hcF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9T
SEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkg
PCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHR2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsg
aSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1c
blx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXG5cdGZvciAoIGludCBpID0gMDsg
aSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0g
PSBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxu
XHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BP
SU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRT
aGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG4jZW5kaWZc
biI7CisKKyAgICB2YXIgc2hhZG93bWFza19wYXJzX2ZyYWdtZW50ID0gImZsb2F0IGdldFNoYWRv
d01hc2soKSB7XG5cdGZsb2F0IHNoYWRvdyA9IDEuMDtcblx0I2lmZGVmIFVTRV9TSEFET1dNQVBc
blx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxuXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFs
TGlnaHQ7XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xu
XHRcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRv
dyAqPSBib29sKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBkaXJlY3Rp
b25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVj
dGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZE
aXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0fVxuXHQjZW5kaWZcblx0I2lm
IE5VTV9TUE9UX0xJR0hUUyA+IDBcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0Zm9yICggaW50
IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCA9IHNw
b3RMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKj0gYm9vbCggc3BvdExpZ2h0LnNoYWRvdyApID8g
Z2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBz
cG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dD
b29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRT
ID4gMFxuXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5V
TV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBp
IF07XG5cdFx0c2hhZG93ICo9IGJvb2woIHBvaW50TGlnaHQuc2hhZG93ICkgPyBnZXRQb2ludFNo
YWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2lu
dExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dD
b29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNlbmRpZlxuXHRyZXR1cm4gc2hh
ZG93O1xufVxuIjsKKworICAgIHZhciBza2luYmFzZV92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9TS0lO
TklOR1xuXHRtYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcblx0
bWF0NCBib25lTWF0WSA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7XG5cdG1hdDQgYm9u
ZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xuXHRtYXQ0IGJvbmVNYXRXID0g
Z2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcbiNlbmRpZiI7CisKKyAgICB2YXIgc2tpbm5p
bmdfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR1bmlmb3JtIG1hdDQgYmlu
ZE1hdHJpeDtcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xuXHQjaWZkZWYgQk9O
RV9URVhUVVJFXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgYm9uZVRleHR1cmU7XG5cdFx0dW5pZm9y
bSBpbnQgYm9uZVRleHR1cmVTaXplO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4g
ZmxvYXQgaSApIHtcblx0XHRcdGZsb2F0IGogPSBpICogNC4wO1xuXHRcdFx0ZmxvYXQgeCA9IG1v
ZCggaiwgZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCB5ID0gZmxvb3Io
IGogLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcblx0XHRcdGZsb2F0IGR4ID0gMS4wIC8g
ZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0ZmxvYXQgZHkgPSAxLjAgLyBmbG9hdCgg
Ym9uZVRleHR1cmVTaXplICk7XG5cdFx0XHR5ID0gZHkgKiAoIHkgKyAwLjUgKTtcblx0XHRcdHZl
YzQgdjEgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDAuNSApLCB5
ICkgKTtcblx0XHRcdHZlYzQgdjIgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAq
ICggeCArIDEuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjMgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0
dXJlLCB2ZWMyKCBkeCAqICggeCArIDIuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjQgPSB0ZXh0
dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDMuNSApLCB5ICkgKTtcblx0XHRc
dG1hdDQgYm9uZSA9IG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XG5cdFx0XHRyZXR1cm4gYm9uZTtc
blx0XHR9XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBtYXQ0IGJvbmVNYXRyaWNlc1sgTUFYX0JPTkVT
IF07XG5cdFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xuXHRcdFx0
bWF0NCBib25lID0gYm9uZU1hdHJpY2VzWyBpbnQoaSkgXTtcblx0XHRcdHJldHVybiBib25lO1xu
XHRcdH1cblx0I2VuZGlmXG4jZW5kaWZcbiI7CisKKyAgICB2YXIgc2tpbm5pbmdfdmVydGV4ID0g
IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dmVjNCBza2luVmVydGV4ID0gYmluZE1hdHJpeCAqIHZl
YzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcblx0dmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7XG5c
dHNraW5uZWQgKz0gYm9uZU1hdFggKiBza2luVmVydGV4ICogc2tpbldlaWdodC54O1xuXHRza2lu
bmVkICs9IGJvbmVNYXRZICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueTtcblx0c2tpbm5lZCAr
PSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7XG5cdHNraW5uZWQgKz0gYm9u
ZU1hdFcgKiBza2luVmVydGV4ICogc2tpbldlaWdodC53O1xuXHR0cmFuc2Zvcm1lZCA9ICggYmlu
ZE1hdHJpeEludmVyc2UgKiBza2lubmVkICkueHl6O1xuI2VuZGlmXG4iOworCisgICAgdmFyIHNr
aW5ub3JtYWxfdmVydGV4ID0gIiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBza2luTWF0cml4
ID0gbWF0NCggMC4wICk7XG5cdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC54ICogYm9uZU1hdFg7
XG5cdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC55ICogYm9uZU1hdFk7XG5cdHNraW5NYXRyaXgg
Kz0gc2tpbldlaWdodC56ICogYm9uZU1hdFo7XG5cdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC53
ICogYm9uZU1hdFc7XG5cdHNraW5NYXRyaXggID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0
cml4ICogYmluZE1hdHJpeDtcblx0b2JqZWN0Tm9ybWFsID0gdmVjNCggc2tpbk1hdHJpeCAqIHZl
YzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7XG4jZW5kaWZcbiI7CisKKyAgICB2YXIgc3Bl
Y3VsYXJtYXBfZnJhZ21lbnQgPSAiZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcbiNpZmRlZiBVU0Vf
U1BFQ1VMQVJNQVBcblx0dmVjNCB0ZXhlbFNwZWN1bGFyID0gdGV4dHVyZTJEKCBzcGVjdWxhck1h
cCwgdlV2ICk7XG5cdHNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7XG4jZWxzZVxu
XHRzcGVjdWxhclN0cmVuZ3RoID0gMS4wO1xuI2VuZGlmIjsKKworICAgIHZhciBzcGVjdWxhcm1h
cF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dW5pZm9ybSBzYW1w
bGVyMkQgc3BlY3VsYXJNYXA7XG4jZW5kaWYiOworCisgICAgdmFyIHRvbmVtYXBwaW5nX2ZyYWdt
ZW50ID0gIiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxuICBnbF9GcmFnQ29sb3IucmdiID0g
dG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZlxuIjsKKworICAgIHZhciB0
b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50ID0gIiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEs
IDAuMCwgMS4wIClcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTtcbnVuaWZvcm0g
ZmxvYXQgdG9uZU1hcHBpbmdXaGl0ZVBvaW50O1xudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVj
MyBjb2xvciApIHtcblx0cmV0dXJuIHRvbmVNYXBwaW5nRXhwb3N1cmUgKiBjb2xvcjtcbn1cbnZl
YzMgUmVpbmhhcmRUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKj0gdG9uZU1h
cHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCBjb2xvciAvICggdmVjMyggMS4wICkg
KyBjb2xvciApICk7XG59XG4jZGVmaW5lIFVuY2hhcnRlZDJIZWxwZXIoIHggKSBtYXgoICggKCB4
ICogKCAwLjE1ICogeCArIDAuMTAgKiAwLjUwICkgKyAwLjIwICogMC4wMiApIC8gKCB4ICogKCAw
LjE1ICogeCArIDAuNTAgKSArIDAuMjAgKiAwLjMwICkgKSAtIDAuMDIgLyAwLjMwLCB2ZWMzKCAw
LjAgKSApXG52ZWMzIFVuY2hhcnRlZDJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29s
b3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCBVbmNoYXJ0ZWQy
SGVscGVyKCBjb2xvciApIC8gVW5jaGFydGVkMkhlbHBlciggdmVjMyggdG9uZU1hcHBpbmdXaGl0
ZVBvaW50ICkgKSApO1xufVxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBj
b2xvciApIHtcblx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0Y29sb3IgPSBtYXgo
IHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XG5cdHJldHVybiBwb3coICggY29sb3IgKiAo
IDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkg
KyAwLjA2ICksIHZlYzMoIDIuMiApICk7XG59XG4iOworCisgICAgdmFyIHV2X3BhcnNfZnJhZ21l
bnQgPSAiI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8
IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfU1BFQ1VMQVJNQVAgKSB8
fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKSB8fCBkZWZpbmVkKCBVU0VfRU1JU1NJVkVNQVAgKSB8
fCBkZWZpbmVkKCBVU0VfUk9VR0hORVNTTUFQICkgfHwgZGVmaW5lZCggVVNFX01FVEFMTkVTU01B
UCApXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG4jZW5kaWYiOworCisgICAgdmFyIHV2X3BhcnNfdmVy
dGV4ID0gIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8
fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkg
fHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkg
fHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NN
QVAgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2O1xuXHR1bmlmb3JtIHZlYzQgb2Zmc2V0UmVwZWF0O1xu
I2VuZGlmXG4iOworCisgICAgdmFyIHV2X3ZlcnRleCA9ICIjaWYgZGVmaW5lZCggVVNFX01BUCAp
IHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8
IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8
IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAg
KSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcblx0dlV2ID0gdXYgKiBvZmZzZXRSZXBl
YXQuencgKyBvZmZzZXRSZXBlYXQueHk7XG4jZW5kaWYiOworCisgICAgdmFyIHV2Ml9wYXJzX2Zy
YWdtZW50ID0gIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9N
QVAgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiI7CisKKyAgICB2YXIgdXYyX3BhcnNf
dmVydGV4ID0gIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9N
QVAgKVxuXHRhdHRyaWJ1dGUgdmVjMiB1djI7XG5cdHZhcnlpbmcgdmVjMiB2VXYyO1xuI2VuZGlm
IjsKKworICAgIHZhciB1djJfdmVydGV4ID0gIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8
fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2VXYyID0gdXYyO1xuI2VuZGlmIjsKKworICAgIHZh
ciB3b3JsZHBvc192ZXJ0ZXggPSAiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVk
KCBQSE9ORyApIHx8IGRlZmluZWQoIFBIWVNJQ0FMICkgfHwgZGVmaW5lZCggTEFNQkVSVCApIHx8
IGRlZmluZWQgKCBVU0VfU0hBRE9XTUFQIClcblx0dmVjNCB3b3JsZFBvc2l0aW9uID0gbW9kZWxN
YXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG4jZW5kaWZcbiI7CisKKyAgICB2YXIg
Y3ViZV9mcmFnID0gInVuaWZvcm0gc2FtcGxlckN1YmUgdEN1YmU7XG51bmlmb3JtIGZsb2F0IHRG
bGlwO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9u
O1xuI2luY2x1ZGUgPGNvbW1vbj5cbnZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9yID0gdGV4
dHVyZUN1YmUoIHRDdWJlLCB2ZWMzKCB0RmxpcCAqIHZXb3JsZFBvc2l0aW9uLngsIHZXb3JsZFBv
c2l0aW9uLnl6ICkgKTtcblx0Z2xfRnJhZ0NvbG9yLmEgKj0gb3BhY2l0eTtcbn1cbiI7CisKKyAg
ICB2YXIgY3ViZV92ZXJ0ID0gInZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRl
IDxjb21tb24+XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZFBvc2l0aW9uID0gdHJhbnNmb3JtRGly
ZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRl
eD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxufVxuIjsKKworICAgIHZhciBkZXB0aF9m
cmFnID0gIiNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcblx0dW5pZm9ybSBmbG9hdCBvcGFjaXR5
O1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVk
ZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNs
dWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNf
ZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lk
IG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQg
ZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7XG5cdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBc
blx0XHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8bWFw
X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxh
bHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0
I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxuXHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMo
IGdsX0ZyYWdDb29yZC56ICksIG9wYWNpdHkgKTtcblx0I2VsaWYgREVQVEhfUEFDS0lORyA9PSAz
MjAxXG5cdFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBnbF9GcmFnQ29vcmQueiAp
O1xuXHQjZW5kaWZcbn1cbiI7CisKKyAgICB2YXIgZGVwdGhfdmVydCA9ICIjaW5jbHVkZSA8Y29t
bW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1h
cF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNs
dWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3Zl
cnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4o
KSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+
XG5cdCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFs
X3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRl
IDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+
XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192
ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8
cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNs
dWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxufVxuIjsKKworICAgIHZhciBkaXN0YW5jZVJH
QkFfZnJhZyA9ICJ1bmlmb3JtIHZlYzMgbGlnaHRQb3M7XG52YXJ5aW5nIHZlYzQgdldvcmxkUG9z
aXRpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8
Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4gKCkge1xuXHQjaW5jbHVk
ZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhU
b1JHQkEoIGxlbmd0aCggdldvcmxkUG9zaXRpb24ueHl6IC0gbGlnaHRQb3MueHl6ICkgLyAxMDAw
LjAgKTtcbn1cbiI7CisKKyAgICB2YXIgZGlzdGFuY2VSR0JBX3ZlcnQgPSAidmFyeWluZyB2ZWM0
IHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxtb3JwaHRhcmdl
dF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRl
IDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRl
IDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRl
IDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNp
bmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0
I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZXb3JsZFBvc2l0aW9uID0gd29y
bGRQb3NpdGlvbjtcbn1cbiI7CisKKyAgICB2YXIgZXF1aXJlY3RfZnJhZyA9ICJ1bmlmb3JtIHNh
bXBsZXIyRCB0RXF1aXJlY3Q7XG51bmlmb3JtIGZsb2F0IHRGbGlwO1xudmFyeWluZyB2ZWMzIHZX
b3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbnZvaWQgbWFpbigpIHtcblx0dmVjMyBk
aXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uICk7XG5cdHZlYzIgc2FtcGxlVVY7
XG5cdHNhbXBsZVVWLnkgPSBzYXR1cmF0ZSggdEZsaXAgKiBkaXJlY3Rpb24ueSAqIC0wLjUgKyAw
LjUgKTtcblx0c2FtcGxlVVYueCA9IGF0YW4oIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCApICog
UkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggdEVxdWly
ZWN0LCBzYW1wbGVVViApO1xufVxuIjsKKworICAgIHZhciBlcXVpcmVjdF92ZXJ0ID0gInZhcnlp
bmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG52b2lkIG1haW4oKSB7
XG5cdHZXb3JsZFBvc2l0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxN
YXRyaXggKTtcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3Rf
dmVydGV4PlxufVxuIjsKKworICAgIHZhciBsaW5lZGFzaGVkX2ZyYWcgPSAidW5pZm9ybSB2ZWMz
IGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIGZsb2F0IGRhc2hTaXpl
O1xudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7
XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5j
bHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFn
bWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFp
bigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0aWYgKCBtb2Qo
IHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApID4gZGFzaFNpemUgKSB7XG5cdFx0ZGlzY2FyZDtc
blx0fVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNl
Q29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1
Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHRvdXRnb2luZ0xpZ2h0
ID0gZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdo
dCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJh
Z21lbnQ+XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVu
Y29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cbn1cbiI7CisKKyAg
ICB2YXIgbGluZWRhc2hlZF92ZXJ0ID0gInVuaWZvcm0gZmxvYXQgc2NhbGU7XG5hdHRyaWJ1dGUg
ZmxvYXQgbGluZURpc3RhbmNlO1xudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xuI2luY2x1
ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2df
cGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVk
ZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVk
ZSA8Y29sb3JfdmVydGV4PlxuXHR2TGluZURpc3RhbmNlID0gc2NhbGUgKiBsaW5lRGlzdGFuY2U7
XG5cdHZlYzQgbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAx
LjAgKTtcblx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0
I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5l
c192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufVxuIjsKKworICAgIHZhciBtZXNo
YmFzaWNfZnJhZyA9ICJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0
eTtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZc
biNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNs
dWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2lu
Y2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21l
bnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9w
YXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUg
PGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+
XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGlu
Z19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBw
aW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNl
LCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1
ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVk
ZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5c
dCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVj
dGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMz
KCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0I2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRcdHJlZmxl
Y3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICku
eHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5k
aXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGFvbWFw
X2ZyYWdtZW50PlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNv
bG9yLnJnYjtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RE
aWZmdXNlO1xuXHQjaW5jbHVkZSA8bm9ybWFsX2ZsaXA+XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJh
Z21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xv
ci5hICk7XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5j
bHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21l
bnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG59XG4iOworCisgICAgdmFyIG1lc2hiYXNp
Y192ZXJ0ID0gIiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4j
aW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5c
biNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+
XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdf
cGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVk
ZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVk
ZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9y
X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2lmZGVmIFVTRV9FTlZN
QVBcblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBobm9y
bWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8
ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4
PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdf
dmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0
aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxj
bGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cblx0I2lu
Y2x1ZGUgPGZvZ192ZXJ0ZXg+XG59XG4iOworCisgICAgdmFyIG1lc2hsYW1iZXJ0X2ZyYWcgPSAi
dW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZs
b2F0IG9wYWNpdHk7XG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJ
REVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9u
PlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+
XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdt
ZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2Zy
YWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9t
YXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2lu
Y2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNf
ZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XG4jaW5j
bHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21l
bnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1
bGFybWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVu
dD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigp
IHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNl
Q29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxl
Y3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVj
MyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0g
ZW1pc3NpdmU7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUg
PG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8
YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNp
bmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2Zy
YWdtZW50PlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgPSBnZXRBbWJpZW50TGln
aHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHQjaW5jbHVkZSA8bGlnaHRtYXBf
ZnJhZ21lbnQ+XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1
c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5c
dFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZM
aWdodEZyb250IDogdkxpZ2h0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJl
Y3REaWZmdXNlID0gdkxpZ2h0RnJvbnQ7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJl
Y3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBn
ZXRTaGFkb3dNYXNrKCk7XG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cblx0dmVjMyBvdXRn
b2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0
LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgPG5v
cm1hbF9mbGlwPlxuXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxuXHRnbF9GcmFnQ29sb3Ig
PSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9u
ZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNp
bmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2Zy
YWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufVxuIjsKKworICAgIHZh
ciBtZXNobGFtYmVydF92ZXJ0ID0gIiNkZWZpbmUgTEFNQkVSVFxudmFyeWluZyB2ZWMzIHZMaWdo
dEZyb250O1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztc
biNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNp
bmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4Plxu
I2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzPlxuI2luY2x1ZGUgPGNvbG9y
X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3Jw
aHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNp
bmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFy
c192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBt
YWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5c
blx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRl
eD5cblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNl
X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGVm
YXVsdG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRl
IDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNp
bmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5c
blx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBv
c192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8bGlnaHRz
X2xhbWJlcnRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1
ZGUgPGZvZ192ZXJ0ZXg+XG59XG4iOworCisgICAgdmFyIG1lc2hwaG9uZ19mcmFnID0gIiNkZWZp
bmUgUEhPTkdcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xu
dW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XG51bmlmb3Jt
IGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4j
aW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19m
cmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJz
X2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhh
bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNs
dWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNf
ZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Z3Jh
ZGllbnRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNp
bmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFycz5cbiNpbmNsdWRlIDxsaWdodHNf
cGhvbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5c
biNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bm9ybWFsbWFwX3Bh
cnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNs
dWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5l
c19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxh
bmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNp
dHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCgg
dmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0
dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxvZ2Rl
cHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8
Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1
ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50
PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZsaXA+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnQ+
XG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19w
aG9uZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c190ZW1wbGF0ZT5cblx0I2luY2x1ZGUg
PGFvbWFwX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5k
aXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVk
TGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsg
dG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxuXHRn
bF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQj
aW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJh
Z21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBs
aWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufVxu
IjsKKworICAgIHZhciBtZXNocGhvbmdfdmVydCA9ICIjZGVmaW5lIFBIT05HXG52YXJ5aW5nIHZl
YzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZO
b3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0
ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1h
cF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8
Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUg
PG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4
PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1
Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52
b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVy
dGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxf
dmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tp
bmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRl
IDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCA9
IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcbiNlbmRpZlxuXHQjaW5jbHVkZSA8YmVn
aW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8
c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0
I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4
PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0dlZpZXdQb3NpdGlvbiA9
IC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNs
dWRlIDxlbnZtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2lu
Y2x1ZGUgPGZvZ192ZXJ0ZXg+XG59XG4iOworCisgICAgdmFyIG1lc2hwaHlzaWNhbF9mcmFnID0g
IiNkZWZpbmUgUEhZU0lDQUxcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVt
aXNzaXZlO1xudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XG51bmlmb3JtIGZsb2F0IG1ldGFsbmVz
cztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZm5kZWYgU1RBTkRBUkRcblx0dW5pZm9ybSBm
bG9hdCBjbGVhckNvYXQ7XG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJDb2F0Um91Z2huZXNzO1xuI2Vu
ZGlmXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0
dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVk
ZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRl
IDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5j
bHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4j
aW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2Zy
YWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1p
c3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5c
biNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRl
IDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XG4j
aW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93
bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2lu
Y2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHJvdWdobmVzc21hcF9w
YXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PlxuI2lu
Y2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxh
bmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19w
bGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3Bh
Y2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0
KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xu
XHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9n
ZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRl
IDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5j
bHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cm91Z2huZXNzbWFwX2ZyYWdt
ZW50PlxuXHQjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9y
bWFsX2ZsaXA+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbWlz
c2l2ZW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudD5c
blx0I2luY2x1ZGUgPGxpZ2h0c190ZW1wbGF0ZT5cblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50
PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsg
cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3Bl
Y3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJh
ZGlhbmNlO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29s
b3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxl
bmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRl
IDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2Zy
YWdtZW50PlxufVxuIjsKKworICAgIHZhciBtZXNocGh5c2ljYWxfdmVydCA9ICIjZGVmaW5lIFBI
WVNJQ0FMXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURc
blx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5j
bHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1
ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3Zl
cnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRf
cGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8
c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4
PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtc
blx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNs
dWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNp
bmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+
XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3Jt
YWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0
cmFuc2Zvcm1lZE5vcm1hbCApO1xuI2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5c
dCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0
ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJv
amVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRl
IDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9u
Lnh5ejtcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21h
cF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufVxuIjsKKworICAgIHZhciBub3Jt
YWxfZnJhZyA9ICIjZGVmaW5lIE5PUk1BTFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmIGRl
ZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVk
KCBVU0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZc
biNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNp
bmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8
YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50
PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5c
dCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mbGlw
PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50PlxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBw
YWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBvcGFjaXR5ICk7XG59XG4iOworCisgICAgdmFyIG5v
cm1hbF92ZXJ0ID0gIiNkZWZpbmUgTk9STUFMXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8
fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKVxuXHR2
YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNlbmRpZlxuI2lmbmRlZiBGTEFUX1NIQURFRFxu
XHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4
PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3Jw
aHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNp
bmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1
ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1
ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0
I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92
ZXJ0ZXg+XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5z
Zm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2lu
Y2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5c
blx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0
X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cbiNpZiBkZWZpbmVkKCBG
TEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05P
Uk1BTE1BUCApXG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuI2VuZGlmXG59
XG4iOworCisgICAgdmFyIHBvaW50c19mcmFnID0gInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5p
Zm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5n
PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnRpY2xl
X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8
c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFn
bWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFp
bigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjMyBvdXRn
b2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlm
ZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNp
bmNsdWRlIDxtYXBfcGFydGljbGVfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVu
dD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0b3V0Z29pbmdMaWdodCA9IGRp
ZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRp
ZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50
PlxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGlu
Z3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG59XG4iOworCisgICAgdmFy
IHBvaW50c192ZXJ0ID0gInVuaWZvcm0gZmxvYXQgc2l6ZTtcbnVuaWZvcm0gZmxvYXQgc2NhbGU7
XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1
ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG4j
aW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxh
bmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4
PlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+
XG5cdCNpZmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Z2xfUG9pbnRTaXplID0gc2l6ZSAq
ICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xuXHQjZWxzZVxuXHRcdGdsX1BvaW50U2l6ZSA9
IHNpemU7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5j
bHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRl
eD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4
PlxufVxuIjsKKworICAgIHZhciBzaGFkb3dfZnJhZyA9ICJ1bmlmb3JtIGZsb2F0IG9wYWNpdHk7
XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8YnNkZnM+
XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21l
bnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xu
XHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCBvcGFjaXR5ICogKCAxLjAgLSBn
ZXRTaGFkb3dNYXNrKCkgKSApO1xufVxuIjsKKworICAgIHZhciBzaGFkb3dfdmVydCA9ICIjaW5j
bHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8
YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3
b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxufVxuIjsKKwor
ICAgIHZhciBTaGFkZXJDaHVuayA9IHsKKyAgICAgICAgYWxwaGFtYXBfZnJhZ21lbnQ6IGFscGhh
bWFwX2ZyYWdtZW50LAorICAgICAgICBhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiBhbHBoYW1hcF9w
YXJzX2ZyYWdtZW50LAorICAgICAgICBhbHBoYXRlc3RfZnJhZ21lbnQ6IGFscGhhdGVzdF9mcmFn
bWVudCwKKyAgICAgICAgYW9tYXBfZnJhZ21lbnQ6IGFvbWFwX2ZyYWdtZW50LAorICAgICAgICBh
b21hcF9wYXJzX2ZyYWdtZW50OiBhb21hcF9wYXJzX2ZyYWdtZW50LAorICAgICAgICBiZWdpbl92
ZXJ0ZXg6IGJlZ2luX3ZlcnRleCwKKyAgICAgICAgYmVnaW5ub3JtYWxfdmVydGV4OiBiZWdpbm5v
cm1hbF92ZXJ0ZXgsCisgICAgICAgIGJzZGZzOiBic2RmcywKKyAgICAgICAgYnVtcG1hcF9wYXJz
X2ZyYWdtZW50OiBidW1wbWFwX3BhcnNfZnJhZ21lbnQsCisgICAgICAgIGNsaXBwaW5nX3BsYW5l
c19mcmFnbWVudDogY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50LAorICAgICAgICBjbGlwcGluZ19w
bGFuZXNfcGFyc19mcmFnbWVudDogY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQsCisgICAg
ICAgIGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleDogY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVy
dGV4LAorICAgICAgICBjbGlwcGluZ19wbGFuZXNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfdmVy
dGV4LAorICAgICAgICBjb2xvcl9mcmFnbWVudDogY29sb3JfZnJhZ21lbnQsCisgICAgICAgIGNv
bG9yX3BhcnNfZnJhZ21lbnQ6IGNvbG9yX3BhcnNfZnJhZ21lbnQsCisgICAgICAgIGNvbG9yX3Bh
cnNfdmVydGV4OiBjb2xvcl9wYXJzX3ZlcnRleCwKKyAgICAgICAgY29sb3JfdmVydGV4OiBjb2xv
cl92ZXJ0ZXgsCisgICAgICAgIGNvbW1vbjogY29tbW9uLAorICAgICAgICBjdWJlX3V2X3JlZmxl
Y3Rpb25fZnJhZ21lbnQ6IGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCwKKyAgICAgICAgZGVm
YXVsdG5vcm1hbF92ZXJ0ZXg6IGRlZmF1bHRub3JtYWxfdmVydGV4LAorICAgICAgICBkaXNwbGFj
ZW1lbnRtYXBfcGFyc192ZXJ0ZXg6IGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCwKKyAgICAg
ICAgZGlzcGxhY2VtZW50bWFwX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3ZlcnRleCwKKyAgICAg
ICAgZW1pc3NpdmVtYXBfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX2ZyYWdtZW50LAorICAgICAgICBl
bWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OiBlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50LAorICAg
ICAgICBlbmNvZGluZ3NfZnJhZ21lbnQ6IGVuY29kaW5nc19mcmFnbWVudCwKKyAgICAgICAgZW5j
b2RpbmdzX3BhcnNfZnJhZ21lbnQ6IGVuY29kaW5nc19wYXJzX2ZyYWdtZW50LAorICAgICAgICBl
bnZtYXBfZnJhZ21lbnQ6IGVudm1hcF9mcmFnbWVudCwKKyAgICAgICAgZW52bWFwX3BhcnNfZnJh
Z21lbnQ6IGVudm1hcF9wYXJzX2ZyYWdtZW50LAorICAgICAgICBlbnZtYXBfcGFyc192ZXJ0ZXg6
IGVudm1hcF9wYXJzX3ZlcnRleCwKKyAgICAgICAgZW52bWFwX3ZlcnRleDogZW52bWFwX3ZlcnRl
eCwKKyAgICAgICAgZm9nX3ZlcnRleDogZm9nX3ZlcnRleCwKKyAgICAgICAgZm9nX3BhcnNfdmVy
dGV4OiBmb2dfcGFyc192ZXJ0ZXgsCisgICAgICAgIGZvZ19mcmFnbWVudDogZm9nX2ZyYWdtZW50
LAorICAgICAgICBmb2dfcGFyc19mcmFnbWVudDogZm9nX3BhcnNfZnJhZ21lbnQsCisgICAgICAg
IGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ6IGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQsCisg
ICAgICAgIGxpZ2h0bWFwX2ZyYWdtZW50OiBsaWdodG1hcF9mcmFnbWVudCwKKyAgICAgICAgbGln
aHRtYXBfcGFyc19mcmFnbWVudDogbGlnaHRtYXBfcGFyc19mcmFnbWVudCwKKyAgICAgICAgbGln
aHRzX2xhbWJlcnRfdmVydGV4OiBsaWdodHNfbGFtYmVydF92ZXJ0ZXgsCisgICAgICAgIGxpZ2h0
c19wYXJzOiBsaWdodHNfcGFycywKKyAgICAgICAgbGlnaHRzX3Bob25nX2ZyYWdtZW50OiBsaWdo
dHNfcGhvbmdfZnJhZ21lbnQsCisgICAgICAgIGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiBs
aWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCwKKyAgICAgICAgbGlnaHRzX3BoeXNpY2FsX2ZyYWdt
ZW50OiBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQsCisgICAgICAgIGxpZ2h0c19waHlzaWNhbF9w
YXJzX2ZyYWdtZW50OiBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCwKKyAgICAgICAgbGln
aHRzX3RlbXBsYXRlOiBsaWdodHNfdGVtcGxhdGUsCisgICAgICAgIGxvZ2RlcHRoYnVmX2ZyYWdt
ZW50OiBsb2dkZXB0aGJ1Zl9mcmFnbWVudCwKKyAgICAgICAgbG9nZGVwdGhidWZfcGFyc19mcmFn
bWVudDogbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCwKKyAgICAgICAgbG9nZGVwdGhidWZfcGFy
c192ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4LAorICAgICAgICBsb2dkZXB0aGJ1Zl92
ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3ZlcnRleCwKKyAgICAgICAgbWFwX2ZyYWdtZW50OiBtYXBfZnJh
Z21lbnQsCisgICAgICAgIG1hcF9wYXJzX2ZyYWdtZW50OiBtYXBfcGFyc19mcmFnbWVudCwKKyAg
ICAgICAgbWFwX3BhcnRpY2xlX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfZnJhZ21lbnQsCisgICAg
ICAgIG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVu
dCwKKyAgICAgICAgbWV0YWxuZXNzbWFwX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfZnJhZ21lbnQs
CisgICAgICAgIG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfcGFyc19m
cmFnbWVudCwKKyAgICAgICAgbW9ycGhub3JtYWxfdmVydGV4OiBtb3JwaG5vcm1hbF92ZXJ0ZXgs
CisgICAgICAgIG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiBtb3JwaHRhcmdldF9wYXJzX3ZlcnRl
eCwKKyAgICAgICAgbW9ycGh0YXJnZXRfdmVydGV4OiBtb3JwaHRhcmdldF92ZXJ0ZXgsCisgICAg
ICAgIG5vcm1hbF9mbGlwOiBub3JtYWxfZmxpcCwKKyAgICAgICAgbm9ybWFsX2ZyYWdtZW50OiBu
b3JtYWxfZnJhZ21lbnQsCisgICAgICAgIG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiBub3JtYWxt
YXBfcGFyc19mcmFnbWVudCwKKyAgICAgICAgcGFja2luZzogcGFja2luZywKKyAgICAgICAgcHJl
bXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDogcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCwK
KyAgICAgICAgcHJvamVjdF92ZXJ0ZXg6IHByb2plY3RfdmVydGV4LAorICAgICAgICBkaXRoZXJp
bmdfZnJhZ21lbnQ6IGRpdGhlcmluZ19mcmFnbWVudCwKKyAgICAgICAgZGl0aGVyaW5nX3BhcnNf
ZnJhZ21lbnQ6IGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50LAorICAgICAgICByb3VnaG5lc3NtYXBf
ZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9mcmFnbWVudCwKKyAgICAgICAgcm91Z2huZXNzbWFwX3Bh
cnNfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50LAorICAgICAgICBzaGFkb3dt
YXBfcGFyc19mcmFnbWVudDogc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQsCisgICAgICAgIHNoYWRv
d21hcF9wYXJzX3ZlcnRleDogc2hhZG93bWFwX3BhcnNfdmVydGV4LAorICAgICAgICBzaGFkb3dt
YXBfdmVydGV4OiBzaGFkb3dtYXBfdmVydGV4LAorICAgICAgICBzaGFkb3dtYXNrX3BhcnNfZnJh
Z21lbnQ6IHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCwKKyAgICAgICAgc2tpbmJhc2VfdmVydGV4
OiBza2luYmFzZV92ZXJ0ZXgsCisgICAgICAgIHNraW5uaW5nX3BhcnNfdmVydGV4OiBza2lubmlu
Z19wYXJzX3ZlcnRleCwKKyAgICAgICAgc2tpbm5pbmdfdmVydGV4OiBza2lubmluZ192ZXJ0ZXgs
CisgICAgICAgIHNraW5ub3JtYWxfdmVydGV4OiBza2lubm9ybWFsX3ZlcnRleCwKKyAgICAgICAg
c3BlY3VsYXJtYXBfZnJhZ21lbnQ6IHNwZWN1bGFybWFwX2ZyYWdtZW50LAorICAgICAgICBzcGVj
dWxhcm1hcF9wYXJzX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50LAorICAgICAg
ICB0b25lbWFwcGluZ19mcmFnbWVudDogdG9uZW1hcHBpbmdfZnJhZ21lbnQsCisgICAgICAgIHRv
bmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQsCisgICAg
ICAgIHV2X3BhcnNfZnJhZ21lbnQ6IHV2X3BhcnNfZnJhZ21lbnQsCisgICAgICAgIHV2X3BhcnNf
dmVydGV4OiB1dl9wYXJzX3ZlcnRleCwKKyAgICAgICAgdXZfdmVydGV4OiB1dl92ZXJ0ZXgsCisg
ICAgICAgIHV2Ml9wYXJzX2ZyYWdtZW50OiB1djJfcGFyc19mcmFnbWVudCwKKyAgICAgICAgdXYy
X3BhcnNfdmVydGV4OiB1djJfcGFyc192ZXJ0ZXgsCisgICAgICAgIHV2Ml92ZXJ0ZXg6IHV2Ml92
ZXJ0ZXgsCisgICAgICAgIHdvcmxkcG9zX3ZlcnRleDogd29ybGRwb3NfdmVydGV4LAorCisgICAg
ICAgIGN1YmVfZnJhZzogY3ViZV9mcmFnLAorICAgICAgICBjdWJlX3ZlcnQ6IGN1YmVfdmVydCwK
KyAgICAgICAgZGVwdGhfZnJhZzogZGVwdGhfZnJhZywKKyAgICAgICAgZGVwdGhfdmVydDogZGVw
dGhfdmVydCwKKyAgICAgICAgZGlzdGFuY2VSR0JBX2ZyYWc6IGRpc3RhbmNlUkdCQV9mcmFnLAor
ICAgICAgICBkaXN0YW5jZVJHQkFfdmVydDogZGlzdGFuY2VSR0JBX3ZlcnQsCisgICAgICAgIGVx
dWlyZWN0X2ZyYWc6IGVxdWlyZWN0X2ZyYWcsCisgICAgICAgIGVxdWlyZWN0X3ZlcnQ6IGVxdWly
ZWN0X3ZlcnQsCisgICAgICAgIGxpbmVkYXNoZWRfZnJhZzogbGluZWRhc2hlZF9mcmFnLAorICAg
ICAgICBsaW5lZGFzaGVkX3ZlcnQ6IGxpbmVkYXNoZWRfdmVydCwKKyAgICAgICAgbWVzaGJhc2lj
X2ZyYWc6IG1lc2hiYXNpY19mcmFnLAorICAgICAgICBtZXNoYmFzaWNfdmVydDogbWVzaGJhc2lj
X3ZlcnQsCisgICAgICAgIG1lc2hsYW1iZXJ0X2ZyYWc6IG1lc2hsYW1iZXJ0X2ZyYWcsCisgICAg
ICAgIG1lc2hsYW1iZXJ0X3ZlcnQ6IG1lc2hsYW1iZXJ0X3ZlcnQsCisgICAgICAgIG1lc2hwaG9u
Z19mcmFnOiBtZXNocGhvbmdfZnJhZywKKyAgICAgICAgbWVzaHBob25nX3ZlcnQ6IG1lc2hwaG9u
Z192ZXJ0LAorICAgICAgICBtZXNocGh5c2ljYWxfZnJhZzogbWVzaHBoeXNpY2FsX2ZyYWcsCisg
ICAgICAgIG1lc2hwaHlzaWNhbF92ZXJ0OiBtZXNocGh5c2ljYWxfdmVydCwKKyAgICAgICAgbm9y
bWFsX2ZyYWc6IG5vcm1hbF9mcmFnLAorICAgICAgICBub3JtYWxfdmVydDogbm9ybWFsX3ZlcnQs
CisgICAgICAgIHBvaW50c19mcmFnOiBwb2ludHNfZnJhZywKKyAgICAgICAgcG9pbnRzX3ZlcnQ6
IHBvaW50c192ZXJ0LAorICAgICAgICBzaGFkb3dfZnJhZzogc2hhZG93X2ZyYWcsCisgICAgICAg
IHNoYWRvd192ZXJ0OiBzaGFkb3dfdmVydAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBAYXV0
aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworICAgICAqIEBhdXRob3Ig
bXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1dGhvciBtaWthZWwgZW10aW5n
ZXIgLyBodHRwOi8vZ29tby5zZS8KKyAgICAgKi8KKworICAgIHZhciBTaGFkZXJMaWIgPSB7CisK
KyAgICAgICAgYmFzaWM6IHsKKworICAgICAgICAgICAgdW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMu
bWVyZ2UoIFsKKyAgICAgICAgICAgICAgICBVbmlmb3Jtc0xpYi5jb21tb24sCisgICAgICAgICAg
ICAgICAgVW5pZm9ybXNMaWIuYW9tYXAsCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIubGln
aHRtYXAsCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIuZm9nCisgICAgICAgICAgICBdICks
CisKKyAgICAgICAgICAgIHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGJhc2ljX3ZlcnQs
CisgICAgICAgICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGJhc2ljX2ZyYWcK
KworICAgICAgICB9LAorCisgICAgICAgIGxhbWJlcnQ6IHsKKworICAgICAgICAgICAgdW5pZm9y
bXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFsKKyAgICAgICAgICAgICAgICBVbmlmb3Jtc0xpYi5j
b21tb24sCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIuYW9tYXAsCisgICAgICAgICAgICAg
ICAgVW5pZm9ybXNMaWIubGlnaHRtYXAsCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIuZW1p
c3NpdmVtYXAsCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIuZm9nLAorICAgICAgICAgICAg
ICAgIFVuaWZvcm1zTGliLmxpZ2h0cywKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgICAgIGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfQorICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIF0gKSwKKworICAgICAgICAgICAgdmVydGV4U2hhZGVy
OiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF92ZXJ0LAorICAgICAgICAgICAgZnJhZ21lbnRTaGFk
ZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X2ZyYWcKKworICAgICAgICB9LAorCisgICAgICAg
IHBob25nOiB7CisKKyAgICAgICAgICAgIHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBb
CisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIuY29tbW9uLAorICAgICAgICAgICAgICAgIFVu
aWZvcm1zTGliLmFvbWFwLAorICAgICAgICAgICAgICAgIFVuaWZvcm1zTGliLmxpZ2h0bWFwLAor
ICAgICAgICAgICAgICAgIFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLAorICAgICAgICAgICAgICAg
IFVuaWZvcm1zTGliLmJ1bXBtYXAsCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIubm9ybWFs
bWFwLAorICAgICAgICAgICAgICAgIFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCwKKyAgICAg
ICAgICAgICAgICBVbmlmb3Jtc0xpYi5ncmFkaWVudG1hcCwKKyAgICAgICAgICAgICAgICBVbmlm
b3Jtc0xpYi5mb2csCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIubGlnaHRzLAorICAgICAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBD
b2xvciggMHgwMDAwMDAgKSB9LAorICAgICAgICAgICAgICAgICAgICBzcGVjdWxhcjogeyB2YWx1
ZTogbmV3IENvbG9yKCAweDExMTExMSApIH0sCisgICAgICAgICAgICAgICAgICAgIHNoaW5pbmVz
czogeyB2YWx1ZTogMzAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0gKSwKKwor
ICAgICAgICAgICAgdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfdmVydCwKKyAg
ICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfZnJhZworCisg
ICAgICAgIH0sCisKKyAgICAgICAgc3RhbmRhcmQ6IHsKKworICAgICAgICAgICAgdW5pZm9ybXM6
IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFsKKyAgICAgICAgICAgICAgICBVbmlmb3Jtc0xpYi5jb21t
b24sCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIuYW9tYXAsCisgICAgICAgICAgICAgICAg
VW5pZm9ybXNMaWIubGlnaHRtYXAsCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIuZW1pc3Np
dmVtYXAsCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIuYnVtcG1hcCwKKyAgICAgICAgICAg
ICAgICBVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIu
ZGlzcGxhY2VtZW50bWFwLAorICAgICAgICAgICAgICAgIFVuaWZvcm1zTGliLnJvdWdobmVzc21h
cCwKKyAgICAgICAgICAgICAgICBVbmlmb3Jtc0xpYi5tZXRhbG5lc3NtYXAsCisgICAgICAgICAg
ICAgICAgVW5pZm9ybXNMaWIuZm9nLAorICAgICAgICAgICAgICAgIFVuaWZvcm1zTGliLmxpZ2h0
cywKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVtaXNzaXZlOiB7IHZh
bHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSwKKyAgICAgICAgICAgICAgICAgICAgcm91Z2hu
ZXNzOiB7IHZhbHVlOiAwLjUgfSwKKyAgICAgICAgICAgICAgICAgICAgbWV0YWxuZXNzOiB7IHZh
bHVlOiAwLjUgfSwKKyAgICAgICAgICAgICAgICAgICAgZW52TWFwSW50ZW5zaXR5OiB7IHZhbHVl
OiAxIH0gLy8gdGVtcG9yYXJ5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXSApLAor
CisgICAgICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0
LAorICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9m
cmFnCisKKyAgICAgICAgfSwKKworICAgICAgICBwb2ludHM6IHsKKworICAgICAgICAgICAgdW5p
Zm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFsKKyAgICAgICAgICAgICAgICBVbmlmb3Jtc0xp
Yi5wb2ludHMsCisgICAgICAgICAgICAgICAgVW5pZm9ybXNMaWIuZm9nCisgICAgICAgICAgICBd
ICksCisKKyAgICAgICAgICAgIHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsucG9pbnRzX3ZlcnQs
CisgICAgICAgICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsucG9pbnRzX2ZyYWcKKwor
ICAgICAgICB9LAorCisgICAgICAgIGRhc2hlZDogeworCisgICAgICAgICAgICB1bmlmb3Jtczog
VW5pZm9ybXNVdGlscy5tZXJnZSggWworICAgICAgICAgICAgICAgIFVuaWZvcm1zTGliLmNvbW1v
biwKKyAgICAgICAgICAgICAgICBVbmlmb3Jtc0xpYi5mb2csCisgICAgICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgICAgICBzY2FsZTogeyB2YWx1ZTogMSB9LAorICAgICAgICAgICAgICAg
ICAgICBkYXNoU2l6ZTogeyB2YWx1ZTogMSB9LAorICAgICAgICAgICAgICAgICAgICB0b3RhbFNp
emU6IHsgdmFsdWU6IDIgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0gKSwKKwor
ICAgICAgICAgICAgdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX3ZlcnQsCisg
ICAgICAgICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF9mcmFnCisK
KyAgICAgICAgfSwKKworICAgICAgICBkZXB0aDogeworCisgICAgICAgICAgICB1bmlmb3Jtczog
VW5pZm9ybXNVdGlscy5tZXJnZSggWworICAgICAgICAgICAgICAgIFVuaWZvcm1zTGliLmNvbW1v
biwKKyAgICAgICAgICAgICAgICBVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAKKyAgICAgICAg
ICAgIF0gKSwKKworICAgICAgICAgICAgdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92
ZXJ0LAorICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmRlcHRoX2ZyYWcK
KworICAgICAgICB9LAorCisgICAgICAgIG5vcm1hbDogeworCisgICAgICAgICAgICB1bmlmb3Jt
czogVW5pZm9ybXNVdGlscy5tZXJnZSggWworICAgICAgICAgICAgICAgIFVuaWZvcm1zTGliLmNv
bW1vbiwKKyAgICAgICAgICAgICAgICBVbmlmb3Jtc0xpYi5idW1wbWFwLAorICAgICAgICAgICAg
ICAgIFVuaWZvcm1zTGliLm5vcm1hbG1hcCwKKyAgICAgICAgICAgICAgICBVbmlmb3Jtc0xpYi5k
aXNwbGFjZW1lbnRtYXAsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBv
cGFjaXR5OiB7IHZhbHVlOiAxLjAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0g
KSwKKworICAgICAgICAgICAgdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5ub3JtYWxfdmVydCwK
KyAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5ub3JtYWxfZnJhZworCisg
ICAgICAgIH0sCisKKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyAgQ3Vi
ZSBtYXAgc2hhZGVyCisgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAgICAgY3Vi
ZTogeworCisgICAgICAgICAgICB1bmlmb3JtczogeworICAgICAgICAgICAgICAgIHRDdWJlOiB7
IHZhbHVlOiBudWxsIH0sCisgICAgICAgICAgICAgICAgdEZsaXA6IHsgdmFsdWU6IC0gMSB9LAor
ICAgICAgICAgICAgICAgIG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9CisgICAgICAgICAgICB9LAor
CisgICAgICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfdmVydCwKKyAgICAg
ICAgICAgIGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX2ZyYWcKKworICAgICAgICB9
LAorCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gIEN1YmUgbWFwIHNo
YWRlcgorICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgICAgIGVxdWlyZWN0OiB7
CisKKyAgICAgICAgICAgIHVuaWZvcm1zOiB7CisgICAgICAgICAgICAgICAgdEVxdWlyZWN0OiB7
IHZhbHVlOiBudWxsIH0sCisgICAgICAgICAgICAgICAgdEZsaXA6IHsgdmFsdWU6IC0gMSB9Cisg
ICAgICAgICAgICB9LAorCisgICAgICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmVx
dWlyZWN0X3ZlcnQsCisgICAgICAgICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1
aXJlY3RfZnJhZworCisgICAgICAgIH0sCisKKyAgICAgICAgZGlzdGFuY2VSR0JBOiB7CisKKyAg
ICAgICAgICAgIHVuaWZvcm1zOiB7CisgICAgICAgICAgICAgICAgbGlnaHRQb3M6IHsgdmFsdWU6
IG5ldyBWZWN0b3IzKCkgfQorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgdmVydGV4U2hh
ZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfdmVydCwKKyAgICAgICAgICAgIGZyYWdtZW50
U2hhZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfZnJhZworCisgICAgICAgIH0KKworICAg
IH07CisKKyAgICBTaGFkZXJMaWIucGh5c2ljYWwgPSB7CisKKyAgICAgICAgdW5pZm9ybXM6IFVu
aWZvcm1zVXRpbHMubWVyZ2UoIFsKKyAgICAgICAgICAgIFNoYWRlckxpYi5zdGFuZGFyZC51bmlm
b3JtcywKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGVhckNvYXQ6IHsgdmFsdWU6
IDAgfSwKKyAgICAgICAgICAgICAgICBjbGVhckNvYXRSb3VnaG5lc3M6IHsgdmFsdWU6IDAgfQor
ICAgICAgICAgICAgfQorICAgICAgICBdICksCisKKyAgICAgICAgdmVydGV4U2hhZGVyOiBTaGFk
ZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCwKKyAgICAgICAgZnJhZ21lbnRTaGFkZXI6IFNoYWRl
ckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnCisKKyAgICB9OworCisgICAgLyoqCisgICAgICogQGF1
dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworICAgICAqLworCisgICAgZnVuY3Rpb24g
Qm94MiggbWluLCBtYXggKSB7CisKKyAgICAgICAgdGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZp
bmVkICkgPyBtaW4gOiBuZXcgVmVjdG9yMiggKyBJbmZpbml0eSwgKyBJbmZpbml0eSApOworICAg
ICAgICB0aGlzLm1heCA9ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3Iy
KCAtIEluZmluaXR5LCAtIEluZmluaXR5ICk7CisKKyAgICB9CisKKyAgICBPYmplY3QuYXNzaWdu
KCBCb3gyLnByb3RvdHlwZSwgeworCisgICAgICAgIHNldDogZnVuY3Rpb24gKCBtaW4sIG1heCAp
IHsKKworICAgICAgICAgICAgdGhpcy5taW4uY29weSggbWluICk7CisgICAgICAgICAgICB0aGlz
Lm1heC5jb3B5KCBtYXggKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAg
fSwKKworICAgICAgICBzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHsKKworICAg
ICAgICAgICAgdGhpcy5tYWtlRW1wdHkoKTsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAw
LCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAg
IHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNldEZyb21D
ZW50ZXJBbmRTaXplOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciB2MSA9IG5ldyBW
ZWN0b3IyKCk7CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ2VudGVyQW5k
U2l6ZSggY2VudGVyLCBzaXplICkgeworCisgICAgICAgICAgICAgICAgdmFyIGhhbGZTaXplID0g
djEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTsKKyAgICAgICAgICAgICAgICB0
aGlzLm1pbi5jb3B5KCBjZW50ZXIgKS5zdWIoIGhhbGZTaXplICk7CisgICAgICAgICAgICAgICAg
dGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApOworCisgICAgICAgICAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAg
ICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5j
b25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGNvcHk6
IGZ1bmN0aW9uICggYm94ICkgeworCisgICAgICAgICAgICB0aGlzLm1pbi5jb3B5KCBib3gubWlu
ICk7CisgICAgICAgICAgICB0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgbWFrZUVtcHR5OiBmdW5jdGlv
biAoKSB7CisKKyAgICAgICAgICAgIHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gKyBJbmZpbml0
eTsKKyAgICAgICAgICAgIHRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gLSBJbmZpbml0eTsKKwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBpc0VtcHR5
OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBj
aGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdl
dCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzCisKKyAgICAgICAgICAgIHJldHVybiAo
IHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSAp
OworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0Q2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFs
VGFyZ2V0ICkgeworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwg
bmV3IFZlY3RvcjIoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHJlc3Vs
dC5zZXQoIDAsIDAgKSA6IHJlc3VsdC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5t
dWx0aXBseVNjYWxhciggMC41ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBnZXRTaXplOiBm
dW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0g
b3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlz
LmlzRW1wdHkoKSA/IHJlc3VsdC5zZXQoIDAsIDAgKSA6IHJlc3VsdC5zdWJWZWN0b3JzKCB0aGlz
Lm1heCwgdGhpcy5taW4gKTsKKworICAgICAgICB9LAorCisgICAgICAgIGV4cGFuZEJ5UG9pbnQ6
IGZ1bmN0aW9uICggcG9pbnQgKSB7CisKKyAgICAgICAgICAgIHRoaXMubWluLm1pbiggcG9pbnQg
KTsKKyAgICAgICAgICAgIHRoaXMubWF4Lm1heCggcG9pbnQgKTsKKworICAgICAgICAgICAgcmV0
dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBleHBhbmRCeVZlY3RvcjogZnVuY3Rp
b24gKCB2ZWN0b3IgKSB7CisKKyAgICAgICAgICAgIHRoaXMubWluLnN1YiggdmVjdG9yICk7Cisg
ICAgICAgICAgICB0aGlzLm1heC5hZGQoIHZlY3RvciApOworCisgICAgICAgICAgICByZXR1cm4g
dGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGV4cGFuZEJ5U2NhbGFyOiBmdW5jdGlvbiAo
IHNjYWxhciApIHsKKworICAgICAgICAgICAgdGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciAp
OworICAgICAgICAgICAgdGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTsKKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBjb250YWluc1BvaW50OiBm
dW5jdGlvbiAoIHBvaW50ICkgeworCisgICAgICAgICAgICByZXR1cm4gcG9pbnQueCA8IHRoaXMu
bWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHwKKyAgICAgICAgICAgICAgICBwb2ludC55
IDwgdGhpcy5taW4ueSB8fCBwb2ludC55ID4gdGhpcy5tYXgueSA/IGZhbHNlIDogdHJ1ZTsKKwor
ICAgICAgICB9LAorCisgICAgICAgIGNvbnRhaW5zQm94OiBmdW5jdGlvbiAoIGJveCApIHsKKwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8
PSB0aGlzLm1heC54ICYmCisgICAgICAgICAgICAgICAgdGhpcy5taW4ueSA8PSBib3gubWluLnkg
JiYgYm94Lm1heC55IDw9IHRoaXMubWF4Lnk7CisKKyAgICAgICAgfSwKKworICAgICAgICBnZXRQ
YXJhbWV0ZXI6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAg
ICAgICAvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhl
IGJveAorICAgICAgICAgICAgLy8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC4KKworICAgICAg
ICAgICAgdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7CisKKyAg
ICAgICAgICAgIHJldHVybiByZXN1bHQuc2V0KAorICAgICAgICAgICAgICAgICggcG9pbnQueCAt
IHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSwKKyAgICAgICAgICAg
ICAgICAoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55
ICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBpbnRlcnNlY3RzQm94
OiBmdW5jdGlvbiAoIGJveCApIHsKKworICAgICAgICAgICAgLy8gdXNpbmcgNCBzcGxpdHRpbmcg
cGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnMKKworICAgICAgICAgICAgcmV0dXJuIGJv
eC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fAorICAgICAg
ICAgICAgICAgIGJveC5tYXgueSA8IHRoaXMubWluLnkgfHwgYm94Lm1pbi55ID4gdGhpcy5tYXgu
eSA/IGZhbHNlIDogdHJ1ZTsKKworICAgICAgICB9LAorCisgICAgICAgIGNsYW1wUG9pbnQ6IGZ1
bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICB2YXIgcmVz
dWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTsKKyAgICAgICAgICAgIHJldHVy
biByZXN1bHQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHsKKworICAg
ICAgICAgICAgdmFyIHYxID0gbmV3IFZlY3RvcjIoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1
bmN0aW9uIGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIg
Y2xhbXBlZFBvaW50ID0gdjEuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4
ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVu
Z3RoKCk7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIGludGVy
c2VjdDogZnVuY3Rpb24gKCBib3ggKSB7CisKKyAgICAgICAgICAgIHRoaXMubWluLm1heCggYm94
Lm1pbiApOworICAgICAgICAgICAgdGhpcy5tYXgubWluKCBib3gubWF4ICk7CisKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgdW5pb246IGZ1bmN0aW9u
ICggYm94ICkgeworCisgICAgICAgICAgICB0aGlzLm1pbi5taW4oIGJveC5taW4gKTsKKyAgICAg
ICAgICAgIHRoaXMubWF4Lm1heCggYm94Lm1heCApOworCisgICAgICAgICAgICByZXR1cm4gdGhp
czsKKworICAgICAgICB9LAorCisgICAgICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQg
KSB7CisKKyAgICAgICAgICAgIHRoaXMubWluLmFkZCggb2Zmc2V0ICk7CisgICAgICAgICAgICB0
aGlzLm1heC5hZGQoIG9mZnNldCApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAg
ICAgICB9LAorCisgICAgICAgIGVxdWFsczogZnVuY3Rpb24gKCBib3ggKSB7CisKKyAgICAgICAg
ICAgIHJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscygg
dGhpcy5tYXggKTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBA
YXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLworICAgICAqIEBhdXRob3Ig
YWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAgICovCisKKyAgICBmdW5j
dGlvbiBMZW5zRmxhcmVQbHVnaW4oIHJlbmRlcmVyLCBmbGFyZXMgKSB7CisKKyAgICAgICAgdmFy
IGdsID0gcmVuZGVyZXIuY29udGV4dDsKKyAgICAgICAgdmFyIHN0YXRlID0gcmVuZGVyZXIuc3Rh
dGU7CisKKyAgICAgICAgdmFyIHZlcnRleEJ1ZmZlciwgZWxlbWVudEJ1ZmZlcjsKKyAgICAgICAg
dmFyIHNoYWRlciwgcHJvZ3JhbSwgYXR0cmlidXRlcywgdW5pZm9ybXM7CisKKyAgICAgICAgdmFy
IHRlbXBUZXh0dXJlLCBvY2NsdXNpb25UZXh0dXJlOworCisgICAgICAgIGZ1bmN0aW9uIGluaXQo
KSB7CisKKyAgICAgICAgICAgIHZhciB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIFsKKyAg
ICAgICAgICAgICAgICAtIDEsIC0gMSwgIDAsIDAsCisgICAgICAgICAgICAgICAgIDEsIC0gMSwg
IDEsIDAsCisgICAgICAgICAgICAgICAgIDEsICAxLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAt
IDEsICAxLCAgMCwgMQorICAgICAgICAgICAgXSApOworCisgICAgICAgICAgICB2YXIgZmFjZXMg
PSBuZXcgVWludDE2QXJyYXkoIFsKKyAgICAgICAgICAgICAgICAwLCAxLCAyLAorICAgICAgICAg
ICAgICAgIDAsIDIsIDMKKyAgICAgICAgICAgIF0gKTsKKworICAgICAgICAgICAgLy8gYnVmZmVy
cworCisgICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIgICAgID0gZ2wuY3JlYXRlQnVmZmVyKCk7Cisg
ICAgICAgICAgICBlbGVtZW50QnVmZmVyICAgID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisKKyAgICAg
ICAgICAgIGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7Cisg
ICAgICAgICAgICBnbC5idWZmZXJEYXRhKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRpY2VzLCBnbC5T
VEFUSUNfRFJBVyApOworCisgICAgICAgICAgICBnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FS
UkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApOworICAgICAgICAgICAgZ2wuYnVmZmVyRGF0YSgg
Z2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGZhY2VzLCBnbC5TVEFUSUNfRFJBVyApOworCisgICAg
ICAgICAgICAvLyB0ZXh0dXJlcworCisgICAgICAgICAgICB0ZW1wVGV4dHVyZSAgICAgID0gZ2wu
Y3JlYXRlVGV4dHVyZSgpOworICAgICAgICAgICAgb2NjbHVzaW9uVGV4dHVyZSA9IGdsLmNyZWF0
ZVRleHR1cmUoKTsKKworICAgICAgICAgICAgc3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRVUkVf
MkQsIHRlbXBUZXh0dXJlICk7CisgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKCBnbC5URVhUVVJF
XzJELCAwLCBnbC5SR0IsIDE2LCAxNiwgMCwgZ2wuUkdCLCBnbC5VTlNJR05FRF9CWVRFLCBudWxs
ICk7CisgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhU
VVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSApOworICAgICAgICAgICAgZ2wudGV4UGFyYW1l
dGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0Ug
KTsKKyAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRV
UkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApOworICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVy
aSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUICk7CisK
KyAgICAgICAgICAgIHN0YXRlLmJpbmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBvY2NsdXNpb25U
ZXh0dXJlICk7CisgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKCBnbC5URVhUVVJFXzJELCAwLCBn
bC5SR0JBLCAxNiwgMTYsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIG51bGwgKTsKKyAg
ICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JB
UF9TLCBnbC5DTEFNUF9UT19FREdFICk7CisgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKCBn
bC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSApOworICAg
ICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdf
RklMVEVSLCBnbC5ORUFSRVNUICk7CisgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKCBnbC5U
RVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QgKTsKKworICAgICAg
ICAgICAgc2hhZGVyID0geworCisgICAgICAgICAgICAgICAgdmVydGV4U2hhZGVyOiBbCisKKyAg
ICAgICAgICAgICAgICAgICAgInVuaWZvcm0gbG93cCBpbnQgcmVuZGVyVHlwZTsiLAorCisgICAg
ICAgICAgICAgICAgICAgICJ1bmlmb3JtIHZlYzMgc2NyZWVuUG9zaXRpb247IiwKKyAgICAgICAg
ICAgICAgICAgICAgInVuaWZvcm0gdmVjMiBzY2FsZTsiLAorICAgICAgICAgICAgICAgICAgICAi
dW5pZm9ybSBmbG9hdCByb3RhdGlvbjsiLAorCisgICAgICAgICAgICAgICAgICAgICJ1bmlmb3Jt
IHNhbXBsZXIyRCBvY2NsdXNpb25NYXA7IiwKKworICAgICAgICAgICAgICAgICAgICAiYXR0cmli
dXRlIHZlYzIgcG9zaXRpb247IiwKKyAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSB2ZWMy
IHV2OyIsCisKKyAgICAgICAgICAgICAgICAgICAgInZhcnlpbmcgdmVjMiB2VVY7IiwKKyAgICAg
ICAgICAgICAgICAgICAgInZhcnlpbmcgZmxvYXQgdlZpc2liaWxpdHk7IiwKKworICAgICAgICAg
ICAgICAgICAgICAidm9pZCBtYWluKCkgeyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2
VVYgPSB1djsiLAorCisgICAgICAgICAgICAgICAgICAgICAgICAidmVjMiBwb3MgPSBwb3NpdGlv
bjsiLAorCisgICAgICAgICAgICAgICAgICAgICAgICAiaWYgKCByZW5kZXJUeXBlID09IDIgKSB7
IiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZWM0IHZpc2liaWxpdHkgPSB0ZXh0
dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC4xLCAwLjEgKSApOyIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZl
YzIoIDAuNSwgMC4xICkgKTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aXNpYmls
aXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjksIDAuMSApICk7IiwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1
c2lvbk1hcCwgdmVjMiggMC45LCAwLjUgKSApOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuOSwgMC45
ICkgKTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aXNpYmlsaXR5ICs9IHRleHR1
cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjUsIDAuOSApICk7IiwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVj
MiggMC4xLCAwLjkgKSApOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpc2liaWxp
dHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuMSwgMC41ICkgKTsiLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVz
aW9uTWFwLCB2ZWMyKCAwLjUsIDAuNSApICk7IiwKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICJ2VmlzaWJpbGl0eSA9ICAgICAgICB2aXNpYmlsaXR5LnIgLyA5LjA7IiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAidlZpc2liaWxpdHkgKj0gMS4wIC0gdmlzaWJpbGl0eS5nIC8g
OS4wOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZWaXNpYmlsaXR5ICo9ICAgICAg
IHZpc2liaWxpdHkuYiAvIDkuMDsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2Vmlz
aWJpbGl0eSAqPSAxLjAgLSB2aXNpYmlsaXR5LmEgLyA5LjA7IiwKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJwb3MueCA9IGNvcyggcm90YXRpb24gKSAqIHBvc2l0aW9uLnggLSBzaW4o
IHJvdGF0aW9uICkgKiBwb3NpdGlvbi55OyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
InBvcy55ID0gc2luKCByb3RhdGlvbiApICogcG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAq
IHBvc2l0aW9uLnk7IiwKKworICAgICAgICAgICAgICAgICAgICAgICAgIn0iLAorCisgICAgICAg
ICAgICAgICAgICAgICAgICAiZ2xfUG9zaXRpb24gPSB2ZWM0KCAoIHBvcyAqIHNjYWxlICsgc2Ny
ZWVuUG9zaXRpb24ueHkgKS54eSwgc2NyZWVuUG9zaXRpb24ueiwgMS4wICk7IiwKKworICAgICAg
ICAgICAgICAgICAgICAifSIKKworICAgICAgICAgICAgICAgIF0uam9pbiggIlxuIiApLAorCisg
ICAgICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXI6IFsKKworICAgICAgICAgICAgICAgICAgICAi
dW5pZm9ybSBsb3dwIGludCByZW5kZXJUeXBlOyIsCisKKyAgICAgICAgICAgICAgICAgICAgInVu
aWZvcm0gc2FtcGxlcjJEIG1hcDsiLAorICAgICAgICAgICAgICAgICAgICAidW5pZm9ybSBmbG9h
dCBvcGFjaXR5OyIsCisgICAgICAgICAgICAgICAgICAgICJ1bmlmb3JtIHZlYzMgY29sb3I7IiwK
KworICAgICAgICAgICAgICAgICAgICAidmFyeWluZyB2ZWMyIHZVVjsiLAorICAgICAgICAgICAg
ICAgICAgICAidmFyeWluZyBmbG9hdCB2VmlzaWJpbGl0eTsiLAorCisgICAgICAgICAgICAgICAg
ICAgICJ2b2lkIG1haW4oKSB7IiwKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGluayBz
cXVhcmUKKworICAgICAgICAgICAgICAgICAgICAgICAgImlmICggcmVuZGVyVHlwZSA9PSAwICkg
eyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xfRnJhZ0NvbG9yID0gdmVjNCgg
MS4wLCAwLjAsIDEuMCwgMC4wICk7IiwKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVz
dG9yZQorCisgICAgICAgICAgICAgICAgICAgICAgICAifSBlbHNlIGlmICggcmVuZGVyVHlwZSA9
PSAxICkgeyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xfRnJhZ0NvbG9yID0g
dGV4dHVyZTJEKCBtYXAsIHZVViApOyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZs
YXJlCisKKyAgICAgICAgICAgICAgICAgICAgICAgICJ9IGVsc2UgeyIsCisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAidmVjNCB0ZXh0dXJlID0gdGV4dHVyZTJEKCBtYXAsIHZVViApOyIs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHR1cmUuYSAqPSBvcGFjaXR5ICogdlZp
c2liaWxpdHk7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xfRnJhZ0NvbG9yID0g
dGV4dHVyZTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbF9GcmFnQ29sb3Iucmdi
ICo9IGNvbG9yOyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICJ9IiwKKworICAgICAgICAg
ICAgICAgICAgICAifSIKKworICAgICAgICAgICAgICAgIF0uam9pbiggIlxuIiApCisKKyAgICAg
ICAgICAgIH07CisKKyAgICAgICAgICAgIHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKCBzaGFkZXIg
KTsKKworICAgICAgICAgICAgYXR0cmlidXRlcyA9IHsKKyAgICAgICAgICAgICAgICB2ZXJ0ZXg6
IGdsLmdldEF0dHJpYkxvY2F0aW9uICggcHJvZ3JhbSwgInBvc2l0aW9uIiApLAorICAgICAgICAg
ICAgICAgIHV2OiAgICAgZ2wuZ2V0QXR0cmliTG9jYXRpb24gKCBwcm9ncmFtLCAidXYiICkKKyAg
ICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHVuaWZvcm1zID0geworICAgICAgICAgICAgICAg
IHJlbmRlclR5cGU6ICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICJyZW5kZXJU
eXBlIiApLAorICAgICAgICAgICAgICAgIG1hcDogICAgICAgICAgICBnbC5nZXRVbmlmb3JtTG9j
YXRpb24oIHByb2dyYW0sICJtYXAiICksCisgICAgICAgICAgICAgICAgb2NjbHVzaW9uTWFwOiAg
IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgIm9jY2x1c2lvbk1hcCIgKSwKKyAgICAg
ICAgICAgICAgICBvcGFjaXR5OiAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFt
LCAib3BhY2l0eSIgKSwKKyAgICAgICAgICAgICAgICBjb2xvcjogICAgICAgICAgZ2wuZ2V0VW5p
Zm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAiY29sb3IiICksCisgICAgICAgICAgICAgICAgc2NhbGU6
ICAgICAgICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgInNjYWxlIiApLAorICAg
ICAgICAgICAgICAgIHJvdGF0aW9uOiAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dy
YW0sICJyb3RhdGlvbiIgKSwKKyAgICAgICAgICAgICAgICBzY3JlZW5Qb3NpdGlvbjogZ2wuZ2V0
VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAic2NyZWVuUG9zaXRpb24iICkKKyAgICAgICAgICAg
IH07CisKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFJlbmRlciBsZW5zIGZs
YXJlcworICAgICAgICAgKiBNZXRob2Q6IHJlbmRlcnMgMTZ4MTYgMHhmZjAwZmYtY29sb3JlZCBw
b2ludHMgc2NhdHRlcmVkIG92ZXIgdGhlIGxpZ2h0IHNvdXJjZSBhcmVhLAorICAgICAgICAgKiAg
ICAgICAgIHJlYWRzIHRoZXNlIGJhY2sgYW5kIGNhbGN1bGF0ZXMgb2NjbHVzaW9uLgorICAgICAg
ICAgKi8KKworICAgICAgICB0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSwg
dmlld3BvcnQgKSB7CisKKyAgICAgICAgICAgIGlmICggZmxhcmVzLmxlbmd0aCA9PT0gMCApIHJl
dHVybjsKKworICAgICAgICAgICAgdmFyIHRlbXBQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CisK
KyAgICAgICAgICAgIHZhciBpbnZBc3BlY3QgPSB2aWV3cG9ydC53IC8gdmlld3BvcnQueiwKKyAg
ICAgICAgICAgICAgICBoYWxmVmlld3BvcnRXaWR0aCA9IHZpZXdwb3J0LnogKiAwLjUsCisgICAg
ICAgICAgICAgICAgaGFsZlZpZXdwb3J0SGVpZ2h0ID0gdmlld3BvcnQudyAqIDAuNTsKKworICAg
ICAgICAgICAgdmFyIHNpemUgPSAxNiAvIHZpZXdwb3J0LncsCisgICAgICAgICAgICAgICAgc2Nh
bGUgPSBuZXcgVmVjdG9yMiggc2l6ZSAqIGludkFzcGVjdCwgc2l6ZSApOworCisgICAgICAgICAg
ICB2YXIgc2NyZWVuUG9zaXRpb24gPSBuZXcgVmVjdG9yMyggMSwgMSwgMCApLAorICAgICAgICAg
ICAgICAgIHNjcmVlblBvc2l0aW9uUGl4ZWxzID0gbmV3IFZlY3RvcjIoIDEsIDEgKTsKKworICAg
ICAgICAgICAgdmFyIHZhbGlkQXJlYSA9IG5ldyBCb3gyKCk7CisKKyAgICAgICAgICAgIHZhbGlk
QXJlYS5taW4uc2V0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55ICk7CisgICAgICAgICAgICB2YWxp
ZEFyZWEubWF4LnNldCggdmlld3BvcnQueCArICggdmlld3BvcnQueiAtIDE2ICksIHZpZXdwb3J0
LnkgKyAoIHZpZXdwb3J0LncgLSAxNiApICk7CisKKyAgICAgICAgICAgIGlmICggcHJvZ3JhbSA9
PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgaW5pdCgpOworCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGdsLnVzZVByb2dyYW0oIHByb2dyYW0gKTsKKworICAgICAgICAg
ICAgc3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIHN0YXRlLmVuYWJsZUF0dHJp
YnV0ZSggYXR0cmlidXRlcy52ZXJ0ZXggKTsKKyAgICAgICAgICAgIHN0YXRlLmVuYWJsZUF0dHJp
YnV0ZSggYXR0cmlidXRlcy51diApOworICAgICAgICAgICAgc3RhdGUuZGlzYWJsZVVudXNlZEF0
dHJpYnV0ZXMoKTsKKworICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGFsbCBsZW5zIGZsYXJl
cyB0byB1cGRhdGUgdGhlaXIgb2NjbHVzaW9uIGFuZCBwb3NpdGlvbnMKKyAgICAgICAgICAgIC8v
IHNldHVwIGdsIGFuZCBjb21tb24gdXNlZCBhdHRyaWJzL3VuaWZvcm1zCisKKyAgICAgICAgICAg
IGdsLnVuaWZvcm0xaSggdW5pZm9ybXMub2NjbHVzaW9uTWFwLCAwICk7CisgICAgICAgICAgICBn
bC51bmlmb3JtMWkoIHVuaWZvcm1zLm1hcCwgMSApOworCisgICAgICAgICAgICBnbC5iaW5kQnVm
ZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApOworICAgICAgICAgICAgZ2wudmVy
dGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy52ZXJ0ZXgsIDIsIGdsLkZMT0FULCBmYWxzZSwg
MiAqIDgsIDAgKTsKKyAgICAgICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0
ZXMudXYsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDggKTsKKworICAgICAgICAgICAgZ2wu
YmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIgKTsKKwor
ICAgICAgICAgICAgc3RhdGUuZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7CisgICAgICAgICAgICBz
dGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIGZhbHNlICk7CisKKyAgICAgICAgICAgIGZvciAo
IHZhciBpID0gMCwgbCA9IGZsYXJlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisgICAgICAg
ICAgICAgICAgc2l6ZSA9IDE2IC8gdmlld3BvcnQudzsKKyAgICAgICAgICAgICAgICBzY2FsZS5z
ZXQoIHNpemUgKiBpbnZBc3BlY3QsIHNpemUgKTsKKworICAgICAgICAgICAgICAgIC8vIGNhbGMg
b2JqZWN0IHNjcmVlbiBwb3NpdGlvbgorCisgICAgICAgICAgICAgICAgdmFyIGZsYXJlID0gZmxh
cmVzWyBpIF07CisKKyAgICAgICAgICAgICAgICB0ZW1wUG9zaXRpb24uc2V0KCBmbGFyZS5tYXRy
aXhXb3JsZC5lbGVtZW50c1sgMTIgXSwgZmxhcmUubWF0cml4V29ybGQuZWxlbWVudHNbIDEzIF0s
IGZsYXJlLm1hdHJpeFdvcmxkLmVsZW1lbnRzWyAxNCBdICk7CisKKyAgICAgICAgICAgICAgICB0
ZW1wUG9zaXRpb24uYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7Cisg
ICAgICAgICAgICAgICAgdGVtcFBvc2l0aW9uLmFwcGx5TWF0cml4NCggY2FtZXJhLnByb2plY3Rp
b25NYXRyaXggKTsKKworICAgICAgICAgICAgICAgIC8vIHNldHVwIGFycmF5cyBmb3IgZ2wgcHJv
Z3JhbXMKKworICAgICAgICAgICAgICAgIHNjcmVlblBvc2l0aW9uLmNvcHkoIHRlbXBQb3NpdGlv
biApOworCisgICAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgY29vcmRp
bmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHBpeGVscyB0byBjb3B5CisKKyAg
ICAgICAgICAgICAgICBzY3JlZW5Qb3NpdGlvblBpeGVscy54ID0gdmlld3BvcnQueCArICggc2Ny
ZWVuUG9zaXRpb24ueCAqIGhhbGZWaWV3cG9ydFdpZHRoICkgKyBoYWxmVmlld3BvcnRXaWR0aCAt
IDg7CisgICAgICAgICAgICAgICAgc2NyZWVuUG9zaXRpb25QaXhlbHMueSA9IHZpZXdwb3J0Lnkg
KyAoIHNjcmVlblBvc2l0aW9uLnkgKiBoYWxmVmlld3BvcnRIZWlnaHQgKSArIGhhbGZWaWV3cG9y
dEhlaWdodCAtIDg7CisKKyAgICAgICAgICAgICAgICAvLyBzY3JlZW4gY3VsbAorCisgICAgICAg
ICAgICAgICAgaWYgKCB2YWxpZEFyZWEuY29udGFpbnNQb2ludCggc2NyZWVuUG9zaXRpb25QaXhl
bHMgKSA9PT0gdHJ1ZSApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIGN1cnJlbnQg
UkdCIHRvIHRlbXAgdGV4dHVyZQorCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmFjdGl2ZVRl
eHR1cmUoIGdsLlRFWFRVUkUwICk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmJpbmRUZXh0
dXJlKCBnbC5URVhUVVJFXzJELCBudWxsICk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmFj
dGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUxICk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmJp
bmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCB0ZW1wVGV4dHVyZSApOworICAgICAgICAgICAgICAg
ICAgICBnbC5jb3B5VGV4SW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCLCBzY3JlZW5Q
b3NpdGlvblBpeGVscy54LCBzY3JlZW5Qb3NpdGlvblBpeGVscy55LCAxNiwgMTYsIDAgKTsKKwor
CisgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlciBwaW5rIHF1YWQKKworICAgICAgICAgICAg
ICAgICAgICBnbC51bmlmb3JtMWkoIHVuaWZvcm1zLnJlbmRlclR5cGUsIDAgKTsKKyAgICAgICAg
ICAgICAgICAgICAgZ2wudW5pZm9ybTJmKCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUueCwgc2NhbGUu
eSApOworICAgICAgICAgICAgICAgICAgICBnbC51bmlmb3JtM2YoIHVuaWZvcm1zLnNjcmVlblBv
c2l0aW9uLCBzY3JlZW5Qb3NpdGlvbi54LCBzY3JlZW5Qb3NpdGlvbi55LCBzY3JlZW5Qb3NpdGlv
bi56ICk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuZGlzYWJsZSggZ2wuQkxFTkQgKTsK
KyAgICAgICAgICAgICAgICAgICAgc3RhdGUuZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7CisKKyAg
ICAgICAgICAgICAgICAgICAgZ2wuZHJhd0VsZW1lbnRzKCBnbC5UUklBTkdMRVMsIDYsIGdsLlVO
U0lHTkVEX1NIT1JULCAwICk7CisKKworICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IHJlc3Vs
dCB0byBvY2NsdXNpb25NYXAKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5hY3RpdmVUZXh0
dXJlKCBnbC5URVhUVVJFMCApOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5iaW5kVGV4dHVy
ZSggZ2wuVEVYVFVSRV8yRCwgb2NjbHVzaW9uVGV4dHVyZSApOworICAgICAgICAgICAgICAgICAg
ICBnbC5jb3B5VGV4SW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgc2NyZWVuUG9z
aXRpb25QaXhlbHMueCwgc2NyZWVuUG9zaXRpb25QaXhlbHMueSwgMTYsIDE2LCAwICk7CisKKwor
ICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGdyYXBoaWNzCisKKyAgICAgICAgICAgICAg
ICAgICAgZ2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5yZW5kZXJUeXBlLCAxICk7CisgICAgICAgICAg
ICAgICAgICAgIHN0YXRlLmRpc2FibGUoIGdsLkRFUFRIX1RFU1QgKTsKKworICAgICAgICAgICAg
ICAgICAgICBzdGF0ZS5hY3RpdmVUZXh0dXJlKCBnbC5URVhUVVJFMSApOworICAgICAgICAgICAg
ICAgICAgICBzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgdGVtcFRleHR1cmUgKTsK
KyAgICAgICAgICAgICAgICAgICAgZ2wuZHJhd0VsZW1lbnRzKCBnbC5UUklBTkdMRVMsIDYsIGds
LlVOU0lHTkVEX1NIT1JULCAwICk7CisKKworICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUg
b2JqZWN0IHBvc2l0aW9ucworCisgICAgICAgICAgICAgICAgICAgIGZsYXJlLnBvc2l0aW9uU2Ny
ZWVuLmNvcHkoIHNjcmVlblBvc2l0aW9uICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBm
bGFyZS5jdXN0b21VcGRhdGVDYWxsYmFjayApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ZmxhcmUuY3VzdG9tVXBkYXRlQ2FsbGJhY2soIGZsYXJlICk7CisKKyAgICAgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmxhcmUudXBkYXRlTGVuc0Zs
YXJlcygpOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAv
LyByZW5kZXIgZmxhcmVzCisKKyAgICAgICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKCB1bmlm
b3Jtcy5yZW5kZXJUeXBlLCAyICk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVuYWJsZSgg
Z2wuQkxFTkQgKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaiA9IDAsIGpsID0g
ZmxhcmUubGVuc0ZsYXJlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgdmFyIHNwcml0ZSA9IGZsYXJlLmxlbnNGbGFyZXNbIGogXTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCBzcHJpdGUub3BhY2l0eSA+IDAuMDAxICYmIHNwcml0ZS5z
Y2FsZSA+IDAuMDAxICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuUG9z
aXRpb24ueCA9IHNwcml0ZS54OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlblBv
c2l0aW9uLnkgPSBzcHJpdGUueTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5Q
b3NpdGlvbi56ID0gc3ByaXRlLno7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXpl
ID0gc3ByaXRlLnNpemUgKiBzcHJpdGUuc2NhbGUgLyB2aWV3cG9ydC53OworCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc2NhbGUueCA9IHNpemUgKiBpbnZBc3BlY3Q7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc2NhbGUueSA9IHNpemU7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBnbC51bmlmb3JtM2YoIHVuaWZvcm1zLnNjcmVlblBvc2l0aW9uLCBzY3JlZW5Qb3Np
dGlvbi54LCBzY3JlZW5Qb3NpdGlvbi55LCBzY3JlZW5Qb3NpdGlvbi56ICk7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZ2wudW5pZm9ybTJmKCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUueCwg
c2NhbGUueSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZiggdW5p
Zm9ybXMucm90YXRpb24sIHNwcml0ZS5yb3RhdGlvbiApOworCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZ2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5vcGFjaXR5LCBzcHJpdGUub3BhY2l0eSAp
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuY29s
b3IsIHNwcml0ZS5jb2xvci5yLCBzcHJpdGUuY29sb3IuZywgc3ByaXRlLmNvbG9yLmIgKTsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnNldEJsZW5kaW5nKCBzcHJpdGUuYmxl
bmRpbmcsIHNwcml0ZS5ibGVuZEVxdWF0aW9uLCBzcHJpdGUuYmxlbmRTcmMsIHNwcml0ZS5ibGVu
ZERzdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldFRleHR1cmUy
RCggc3ByaXRlLnRleHR1cmUsIDEgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGds
LmRyYXdFbGVtZW50cyggZ2wuVFJJQU5HTEVTLCA2LCBnbC5VTlNJR05FRF9TSE9SVCwgMCApOwor
CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlc3Rv
cmUgZ2wKKworICAgICAgICAgICAgc3RhdGUuZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTsKKyAgICAg
ICAgICAgIHN0YXRlLmVuYWJsZSggZ2wuREVQVEhfVEVTVCApOworICAgICAgICAgICAgc3RhdGUu
YnVmZmVycy5kZXB0aC5zZXRNYXNrKCB0cnVlICk7CisKKyAgICAgICAgICAgIHJlbmRlcmVyLnJl
c2V0R0xTdGF0ZSgpOworCisgICAgICAgIH07CisKKyAgICAgICAgZnVuY3Rpb24gY3JlYXRlUHJv
Z3JhbSggc2hhZGVyICkgeworCisgICAgICAgICAgICB2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVBy
b2dyYW0oKTsKKworICAgICAgICAgICAgdmFyIGZyYWdtZW50U2hhZGVyID0gZ2wuY3JlYXRlU2hh
ZGVyKCBnbC5GUkFHTUVOVF9TSEFERVIgKTsKKyAgICAgICAgICAgIHZhciB2ZXJ0ZXhTaGFkZXIg
PSBnbC5jcmVhdGVTaGFkZXIoIGdsLlZFUlRFWF9TSEFERVIgKTsKKworICAgICAgICAgICAgdmFy
IHByZWZpeCA9ICJwcmVjaXNpb24gIiArIHJlbmRlcmVyLmdldFByZWNpc2lvbigpICsgIiBmbG9h
dDtcbiI7CisKKyAgICAgICAgICAgIGdsLnNoYWRlclNvdXJjZSggZnJhZ21lbnRTaGFkZXIsIHBy
ZWZpeCArIHNoYWRlci5mcmFnbWVudFNoYWRlciApOworICAgICAgICAgICAgZ2wuc2hhZGVyU291
cmNlKCB2ZXJ0ZXhTaGFkZXIsIHByZWZpeCArIHNoYWRlci52ZXJ0ZXhTaGFkZXIgKTsKKworICAg
ICAgICAgICAgZ2wuY29tcGlsZVNoYWRlciggZnJhZ21lbnRTaGFkZXIgKTsKKyAgICAgICAgICAg
IGdsLmNvbXBpbGVTaGFkZXIoIHZlcnRleFNoYWRlciApOworCisgICAgICAgICAgICBnbC5hdHRh
Y2hTaGFkZXIoIHByb2dyYW0sIGZyYWdtZW50U2hhZGVyICk7CisgICAgICAgICAgICBnbC5hdHRh
Y2hTaGFkZXIoIHByb2dyYW0sIHZlcnRleFNoYWRlciApOworCisgICAgICAgICAgICBnbC5saW5r
UHJvZ3JhbSggcHJvZ3JhbSApOworCisgICAgICAgICAgICByZXR1cm4gcHJvZ3JhbTsKKworICAg
ICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdl
ciAvIGh0dHA6Ly9nb21vLnNlLworICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0
ZXJlZHF1YWxpYS5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBTcHJpdGVQbHVnaW4oIHJl
bmRlcmVyLCBzcHJpdGVzICkgeworCisgICAgICAgIHZhciBnbCA9IHJlbmRlcmVyLmNvbnRleHQ7
CisgICAgICAgIHZhciBzdGF0ZSA9IHJlbmRlcmVyLnN0YXRlOworCisgICAgICAgIHZhciB2ZXJ0
ZXhCdWZmZXIsIGVsZW1lbnRCdWZmZXI7CisgICAgICAgIHZhciBwcm9ncmFtLCBhdHRyaWJ1dGVz
LCB1bmlmb3JtczsKKworICAgICAgICB2YXIgdGV4dHVyZTsKKworICAgICAgICAvLyBkZWNvbXBv
c2UgbWF0cml4V29ybGQKKworICAgICAgICB2YXIgc3ByaXRlUG9zaXRpb24gPSBuZXcgVmVjdG9y
MygpOworICAgICAgICB2YXIgc3ByaXRlUm90YXRpb24gPSBuZXcgUXVhdGVybmlvbigpOworICAg
ICAgICB2YXIgc3ByaXRlU2NhbGUgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgIGZ1bmN0aW9u
IGluaXQoKSB7CisKKyAgICAgICAgICAgIHZhciB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXko
IFsKKyAgICAgICAgICAgICAgICAtIDAuNSwgLSAwLjUsICAwLCAwLAorICAgICAgICAgICAgICAg
ICAgMC41LCAtIDAuNSwgIDEsIDAsCisgICAgICAgICAgICAgICAgICAwLjUsICAgMC41LCAgMSwg
MSwKKyAgICAgICAgICAgICAgICAtIDAuNSwgICAwLjUsICAwLCAxCisgICAgICAgICAgICBdICk7
CisKKyAgICAgICAgICAgIHZhciBmYWNlcyA9IG5ldyBVaW50MTZBcnJheSggWworICAgICAgICAg
ICAgICAgIDAsIDEsIDIsCisgICAgICAgICAgICAgICAgMCwgMiwgMworICAgICAgICAgICAgXSAp
OworCisgICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIgID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisgICAg
ICAgICAgICBlbGVtZW50QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisKKyAgICAgICAgICAg
IGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7CisgICAgICAg
ICAgICBnbC5idWZmZXJEYXRhKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRpY2VzLCBnbC5TVEFUSUNf
RFJBVyApOworCisgICAgICAgICAgICBnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JV
RkZFUiwgZWxlbWVudEJ1ZmZlciApOworICAgICAgICAgICAgZ2wuYnVmZmVyRGF0YSggZ2wuRUxF
TUVOVF9BUlJBWV9CVUZGRVIsIGZhY2VzLCBnbC5TVEFUSUNfRFJBVyApOworCisgICAgICAgICAg
ICBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSgpOworCisgICAgICAgICAgICBhdHRyaWJ1dGVzID0g
eworICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgICAgICAgZ2wuZ2V0QXR0cmliTG9jYXRp
b24gKCBwcm9ncmFtLCAncG9zaXRpb24nICksCisgICAgICAgICAgICAgICAgdXY6ICAgICAgICAg
ICAgICAgICBnbC5nZXRBdHRyaWJMb2NhdGlvbiAoIHByb2dyYW0sICd1dicgKQorICAgICAgICAg
ICAgfTsKKworICAgICAgICAgICAgdW5pZm9ybXMgPSB7CisgICAgICAgICAgICAgICAgdXZPZmZz
ZXQ6ICAgICAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICd1dk9mZnNldCcg
KSwKKyAgICAgICAgICAgICAgICB1dlNjYWxlOiAgICAgICAgICAgIGdsLmdldFVuaWZvcm1Mb2Nh
dGlvbiggcHJvZ3JhbSwgJ3V2U2NhbGUnICksCisKKyAgICAgICAgICAgICAgICByb3RhdGlvbjog
ICAgICAgICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3JvdGF0aW9uJyApLAor
ICAgICAgICAgICAgICAgIHNjYWxlOiAgICAgICAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9u
KCBwcm9ncmFtLCAnc2NhbGUnICksCisKKyAgICAgICAgICAgICAgICBjb2xvcjogICAgICAgICAg
ICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2NvbG9yJyApLAorICAgICAgICAg
ICAgICAgIG1hcDogICAgICAgICAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFt
LCAnbWFwJyApLAorICAgICAgICAgICAgICAgIG9wYWNpdHk6ICAgICAgICAgICAgZ2wuZ2V0VW5p
Zm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnb3BhY2l0eScgKSwKKworICAgICAgICAgICAgICAgIG1v
ZGVsVmlld01hdHJpeDogICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnbW9kZWxW
aWV3TWF0cml4JyApLAorICAgICAgICAgICAgICAgIHByb2plY3Rpb25NYXRyaXg6ICAgZ2wuZ2V0
VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAncHJvamVjdGlvbk1hdHJpeCcgKSwKKworICAgICAg
ICAgICAgICAgIGZvZ1R5cGU6ICAgICAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9n
cmFtLCAnZm9nVHlwZScgKSwKKyAgICAgICAgICAgICAgICBmb2dEZW5zaXR5OiAgICAgICAgIGds
LmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0RlbnNpdHknICksCisgICAgICAgICAg
ICAgICAgZm9nTmVhcjogICAgICAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0s
ICdmb2dOZWFyJyApLAorICAgICAgICAgICAgICAgIGZvZ0ZhcjogICAgICAgICAgICAgZ2wuZ2V0
VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nRmFyJyApLAorICAgICAgICAgICAgICAgIGZv
Z0NvbG9yOiAgICAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nQ29s
b3InICksCisKKyAgICAgICAgICAgICAgICBhbHBoYVRlc3Q6ICAgICAgICAgIGdsLmdldFVuaWZv
cm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2FscGhhVGVzdCcgKQorICAgICAgICAgICAgfTsKKworICAg
ICAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93
d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApOworICAgICAgICAgICAgY2FudmFzLndp
ZHRoID0gODsKKyAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSA4OworCisgICAgICAgICAgICB2
YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7CisgICAgICAgICAgICBjb250
ZXh0LmZpbGxTdHlsZSA9ICd3aGl0ZSc7CisgICAgICAgICAgICBjb250ZXh0LmZpbGxSZWN0KCAw
LCAwLCA4LCA4ICk7CisKKyAgICAgICAgICAgIHRleHR1cmUgPSBuZXcgVGV4dHVyZSggY2FudmFz
ICk7CisgICAgICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworICAgICAgICB9
CisKKyAgICAgICAgdGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7CisK
KyAgICAgICAgICAgIGlmICggc3ByaXRlcy5sZW5ndGggPT09IDAgKSByZXR1cm47CisKKyAgICAg
ICAgICAgIC8vIHNldHVwIGdsCisKKyAgICAgICAgICAgIGlmICggcHJvZ3JhbSA9PT0gdW5kZWZp
bmVkICkgeworCisgICAgICAgICAgICAgICAgaW5pdCgpOworCisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGdsLnVzZVByb2dyYW0oIHByb2dyYW0gKTsKKworICAgICAgICAgICAgc3RhdGUu
aW5pdEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggYXR0
cmlidXRlcy5wb3NpdGlvbiApOworICAgICAgICAgICAgc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBh
dHRyaWJ1dGVzLnV2ICk7CisgICAgICAgICAgICBzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRl
cygpOworCisgICAgICAgICAgICBzdGF0ZS5kaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKTsKKyAgICAg
ICAgICAgIHN0YXRlLmVuYWJsZSggZ2wuQkxFTkQgKTsKKworICAgICAgICAgICAgZ2wuYmluZEJ1
ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIgKTsKKyAgICAgICAgICAgIGdsLnZl
cnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMucG9zaXRpb24sIDIsIGdsLkZMT0FULCBmYWxz
ZSwgMiAqIDgsIDAgKTsKKyAgICAgICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJp
YnV0ZXMudXYsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDggKTsKKworICAgICAgICAgICAg
Z2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIgKTsK
KworICAgICAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDRmdiggdW5pZm9ybXMucHJvamVjdGlvbk1h
dHJpeCwgZmFsc2UsIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzICk7CisKKyAgICAg
ICAgICAgIHN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7CisgICAgICAgICAgICBn
bC51bmlmb3JtMWkoIHVuaWZvcm1zLm1hcCwgMCApOworCisgICAgICAgICAgICB2YXIgb2xkRm9n
VHlwZSA9IDA7CisgICAgICAgICAgICB2YXIgc2NlbmVGb2dUeXBlID0gMDsKKyAgICAgICAgICAg
IHZhciBmb2cgPSBzY2VuZS5mb2c7CisKKyAgICAgICAgICAgIGlmICggZm9nICkgeworCisgICAg
ICAgICAgICAgICAgZ2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5mb2dDb2xvciwgZm9nLmNvbG9yLnIs
IGZvZy5jb2xvci5nLCBmb2cuY29sb3IuYiApOworCisgICAgICAgICAgICAgICAgaWYgKCBmb2cu
aXNGb2cgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5m
b2dOZWFyLCBmb2cubmVhciApOworICAgICAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWYoIHVu
aWZvcm1zLmZvZ0ZhciwgZm9nLmZhciApOworCisgICAgICAgICAgICAgICAgICAgIGdsLnVuaWZv
cm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMSApOworICAgICAgICAgICAgICAgICAgICBvbGRGb2dU
eXBlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgc2NlbmVGb2dUeXBlID0gMTsKKworICAgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgZ2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5mb2dEZW5zaXR5LCBmb2cuZGVuc2l0eSApOwor
CisgICAgICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMiAp
OworICAgICAgICAgICAgICAgICAgICBvbGRGb2dUeXBlID0gMjsKKyAgICAgICAgICAgICAgICAg
ICAgc2NlbmVGb2dUeXBlID0gMjsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
fSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlw
ZSwgMCApOworICAgICAgICAgICAgICAgIG9sZEZvZ1R5cGUgPSAwOworICAgICAgICAgICAgICAg
IHNjZW5lRm9nVHlwZSA9IDA7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyB1
cGRhdGUgcG9zaXRpb25zIGFuZCBzb3J0CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwg
bCA9IHNwcml0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHZh
ciBzcHJpdGUgPSBzcHJpdGVzWyBpIF07CisKKyAgICAgICAgICAgICAgICBzcHJpdGUubW9kZWxW
aWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIHNw
cml0ZS5tYXRyaXhXb3JsZCApOworICAgICAgICAgICAgICAgIHNwcml0ZS56ID0gLSBzcHJpdGUu
bW9kZWxWaWV3TWF0cml4LmVsZW1lbnRzWyAxNCBdOworCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIHNwcml0ZXMuc29ydCggcGFpbnRlclNvcnRTdGFibGUgKTsKKworICAgICAgICAgICAg
Ly8gcmVuZGVyIGFsbCBzcHJpdGVzCisKKyAgICAgICAgICAgIHZhciBzY2FsZSA9IFtdOworCisg
ICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBzcHJpdGVzLmxlbmd0aDsgaSA8IGw7IGkg
KysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgc3ByaXRlID0gc3ByaXRlc1sgaSBdOworICAg
ICAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9IHNwcml0ZS5tYXRlcmlhbDsKKworICAgICAgICAg
ICAgICAgIGlmICggbWF0ZXJpYWwudmlzaWJsZSA9PT0gZmFsc2UgKSBjb250aW51ZTsKKworICAg
ICAgICAgICAgICAgIHNwcml0ZS5vbkJlZm9yZVJlbmRlciggcmVuZGVyZXIsIHNjZW5lLCBjYW1l
cmEsIHVuZGVmaW5lZCwgbWF0ZXJpYWwsIHVuZGVmaW5lZCApOworCisgICAgICAgICAgICAgICAg
Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5hbHBoYVRlc3QsIG1hdGVyaWFsLmFscGhhVGVzdCApOwor
ICAgICAgICAgICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHVuaWZvcm1zLm1vZGVsVmlld01h
dHJpeCwgZmFsc2UsIHNwcml0ZS5tb2RlbFZpZXdNYXRyaXguZWxlbWVudHMgKTsKKworICAgICAg
ICAgICAgICAgIHNwcml0ZS5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHNwcml0ZVBvc2l0aW9uLCBz
cHJpdGVSb3RhdGlvbiwgc3ByaXRlU2NhbGUgKTsKKworICAgICAgICAgICAgICAgIHNjYWxlWyAw
IF0gPSBzcHJpdGVTY2FsZS54OworICAgICAgICAgICAgICAgIHNjYWxlWyAxIF0gPSBzcHJpdGVT
Y2FsZS55OworCisgICAgICAgICAgICAgICAgdmFyIGZvZ1R5cGUgPSAwOworCisgICAgICAgICAg
ICAgICAgaWYgKCBzY2VuZS5mb2cgJiYgbWF0ZXJpYWwuZm9nICkgeworCisgICAgICAgICAgICAg
ICAgICAgIGZvZ1R5cGUgPSBzY2VuZUZvZ1R5cGU7CisKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICBpZiAoIG9sZEZvZ1R5cGUgIT09IGZvZ1R5cGUgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgZ2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCBmb2dUeXBlICk7Cisg
ICAgICAgICAgICAgICAgICAgIG9sZEZvZ1R5cGUgPSBmb2dUeXBlOworCisgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgZ2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dk9mZnNldCwgbWF0
ZXJpYWwubWFwLm9mZnNldC54LCBtYXRlcmlhbC5tYXAub2Zmc2V0LnkgKTsKKyAgICAgICAgICAg
ICAgICAgICAgZ2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dlNjYWxlLCBtYXRlcmlhbC5tYXAucmVw
ZWF0LngsIG1hdGVyaWFsLm1hcC5yZXBlYXQueSApOworCisgICAgICAgICAgICAgICAgfSBlbHNl
IHsKKworICAgICAgICAgICAgICAgICAgICBnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2T2Zmc2V0
LCAwLCAwICk7CisgICAgICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZT
Y2FsZSwgMSwgMSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZ2wu
dW5pZm9ybTFmKCB1bmlmb3Jtcy5vcGFjaXR5LCBtYXRlcmlhbC5vcGFjaXR5ICk7CisgICAgICAg
ICAgICAgICAgZ2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5jb2xvciwgbWF0ZXJpYWwuY29sb3Iuciwg
bWF0ZXJpYWwuY29sb3IuZywgbWF0ZXJpYWwuY29sb3IuYiApOworCisgICAgICAgICAgICAgICAg
Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5yb3RhdGlvbiwgbWF0ZXJpYWwucm90YXRpb24gKTsKKyAg
ICAgICAgICAgICAgICBnbC51bmlmb3JtMmZ2KCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUgKTsKKwor
ICAgICAgICAgICAgICAgIHN0YXRlLnNldEJsZW5kaW5nKCBtYXRlcmlhbC5ibGVuZGluZywgbWF0
ZXJpYWwuYmxlbmRFcXVhdGlvbiwgbWF0ZXJpYWwuYmxlbmRTcmMsIG1hdGVyaWFsLmJsZW5kRHN0
LCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uQWxwaGEsIG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEsIG1h
dGVyaWFsLmJsZW5kRHN0QWxwaGEsIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSApOworICAg
ICAgICAgICAgICAgIHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggbWF0ZXJpYWwuZGVwdGhU
ZXN0ICk7CisgICAgICAgICAgICAgICAgc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCBtYXRl
cmlhbC5kZXB0aFdyaXRlICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIG1hdGVyaWFsLm1hcCAp
IHsKKworICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRUZXh0dXJlMkQoIG1hdGVyaWFs
Lm1hcCwgMCApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAg
ICAgICByZW5kZXJlci5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIDAgKTsKKworICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgIGdsLmRyYXdFbGVtZW50cyggZ2wuVFJJQU5HTEVTLCA2
LCBnbC5VTlNJR05FRF9TSE9SVCwgMCApOworCisgICAgICAgICAgICAgICAgc3ByaXRlLm9uQWZ0
ZXJSZW5kZXIoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCB1bmRlZmluZWQsIG1hdGVyaWFsLCB1
bmRlZmluZWQgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZXN0b3JlIGds
CisKKyAgICAgICAgICAgIHN0YXRlLmVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7CisKKyAgICAgICAg
ICAgIHJlbmRlcmVyLnJlc2V0R0xTdGF0ZSgpOworCisgICAgICAgIH07CisKKyAgICAgICAgZnVu
Y3Rpb24gY3JlYXRlUHJvZ3JhbSgpIHsKKworICAgICAgICAgICAgdmFyIHByb2dyYW0gPSBnbC5j
cmVhdGVQcm9ncmFtKCk7CisKKyAgICAgICAgICAgIHZhciB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVh
dGVTaGFkZXIoIGdsLlZFUlRFWF9TSEFERVIgKTsKKyAgICAgICAgICAgIHZhciBmcmFnbWVudFNo
YWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuRlJBR01FTlRfU0hBREVSICk7CisKKyAgICAgICAg
ICAgIGdsLnNoYWRlclNvdXJjZSggdmVydGV4U2hhZGVyLCBbCisKKyAgICAgICAgICAgICAgICAn
cHJlY2lzaW9uICcgKyByZW5kZXJlci5nZXRQcmVjaXNpb24oKSArICcgZmxvYXQ7JywKKworICAg
ICAgICAgICAgICAgICcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyAnU3ByaXRlTWF0ZXJpYWwnLAor
CisgICAgICAgICAgICAgICAgJ3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7JywKKyAgICAg
ICAgICAgICAgICAndW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7JywKKyAgICAgICAgICAg
ICAgICAndW5pZm9ybSBmbG9hdCByb3RhdGlvbjsnLAorICAgICAgICAgICAgICAgICd1bmlmb3Jt
IHZlYzIgc2NhbGU7JywKKyAgICAgICAgICAgICAgICAndW5pZm9ybSB2ZWMyIHV2T2Zmc2V0Oycs
CisgICAgICAgICAgICAgICAgJ3VuaWZvcm0gdmVjMiB1dlNjYWxlOycsCisKKyAgICAgICAgICAg
ICAgICAnYXR0cmlidXRlIHZlYzIgcG9zaXRpb247JywKKyAgICAgICAgICAgICAgICAnYXR0cmli
dXRlIHZlYzIgdXY7JywKKworICAgICAgICAgICAgICAgICd2YXJ5aW5nIHZlYzIgdlVWOycsCisK
KyAgICAgICAgICAgICAgICAndm9pZCBtYWluKCkgeycsCisKKyAgICAgICAgICAgICAgICAgICAg
J3ZVViA9IHV2T2Zmc2V0ICsgdXYgKiB1dlNjYWxlOycsCisKKyAgICAgICAgICAgICAgICAgICAg
J3ZlYzIgYWxpZ25lZFBvc2l0aW9uID0gcG9zaXRpb24gKiBzY2FsZTsnLAorCisgICAgICAgICAg
ICAgICAgICAgICd2ZWMyIHJvdGF0ZWRQb3NpdGlvbjsnLAorICAgICAgICAgICAgICAgICAgICAn
cm90YXRlZFBvc2l0aW9uLnggPSBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAt
IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55OycsCisgICAgICAgICAgICAgICAg
ICAgICdyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlv
bi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7JywKKworICAgICAgICAg
ICAgICAgICAgICAndmVjNCBmaW5hbFBvc2l0aW9uOycsCisKKyAgICAgICAgICAgICAgICAgICAg
J2ZpbmFsUG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAx
LjAgKTsnLAorICAgICAgICAgICAgICAgICAgICAnZmluYWxQb3NpdGlvbi54eSArPSByb3RhdGVk
UG9zaXRpb247JywKKyAgICAgICAgICAgICAgICAgICAgJ2ZpbmFsUG9zaXRpb24gPSBwcm9qZWN0
aW9uTWF0cml4ICogZmluYWxQb3NpdGlvbjsnLAorCisgICAgICAgICAgICAgICAgICAgICdnbF9Q
b3NpdGlvbiA9IGZpbmFsUG9zaXRpb247JywKKworICAgICAgICAgICAgICAgICd9JworCisgICAg
ICAgICAgICBdLmpvaW4oICdcbicgKSApOworCisgICAgICAgICAgICBnbC5zaGFkZXJTb3VyY2Uo
IGZyYWdtZW50U2hhZGVyLCBbCisKKyAgICAgICAgICAgICAgICAncHJlY2lzaW9uICcgKyByZW5k
ZXJlci5nZXRQcmVjaXNpb24oKSArICcgZmxvYXQ7JywKKworICAgICAgICAgICAgICAgICcjZGVm
aW5lIFNIQURFUl9OQU1FICcgKyAnU3ByaXRlTWF0ZXJpYWwnLAorCisgICAgICAgICAgICAgICAg
J3VuaWZvcm0gdmVjMyBjb2xvcjsnLAorICAgICAgICAgICAgICAgICd1bmlmb3JtIHNhbXBsZXIy
RCBtYXA7JywKKyAgICAgICAgICAgICAgICAndW5pZm9ybSBmbG9hdCBvcGFjaXR5OycsCisKKyAg
ICAgICAgICAgICAgICAndW5pZm9ybSBpbnQgZm9nVHlwZTsnLAorICAgICAgICAgICAgICAgICd1
bmlmb3JtIHZlYzMgZm9nQ29sb3I7JywKKyAgICAgICAgICAgICAgICAndW5pZm9ybSBmbG9hdCBm
b2dEZW5zaXR5OycsCisgICAgICAgICAgICAgICAgJ3VuaWZvcm0gZmxvYXQgZm9nTmVhcjsnLAor
ICAgICAgICAgICAgICAgICd1bmlmb3JtIGZsb2F0IGZvZ0ZhcjsnLAorICAgICAgICAgICAgICAg
ICd1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsnLAorCisgICAgICAgICAgICAgICAgJ3Zhcnlpbmcg
dmVjMiB2VVY7JywKKworICAgICAgICAgICAgICAgICd2b2lkIG1haW4oKSB7JywKKworICAgICAg
ICAgICAgICAgICAgICAndmVjNCB0ZXh0dXJlID0gdGV4dHVyZTJEKCBtYXAsIHZVViApOycsCisK
KyAgICAgICAgICAgICAgICAgICAgJ2lmICggdGV4dHVyZS5hIDwgYWxwaGFUZXN0ICkgZGlzY2Fy
ZDsnLAorCisgICAgICAgICAgICAgICAgICAgICdnbF9GcmFnQ29sb3IgPSB2ZWM0KCBjb2xvciAq
IHRleHR1cmUueHl6LCB0ZXh0dXJlLmEgKiBvcGFjaXR5ICk7JywKKworICAgICAgICAgICAgICAg
ICAgICAnaWYgKCBmb2dUeXBlID4gMCApIHsnLAorCisgICAgICAgICAgICAgICAgICAgICAgICAn
ZmxvYXQgZGVwdGggPSBnbF9GcmFnQ29vcmQueiAvIGdsX0ZyYWdDb29yZC53OycsCisgICAgICAg
ICAgICAgICAgICAgICAgICAnZmxvYXQgZm9nRmFjdG9yID0gMC4wOycsCisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICdpZiAoIGZvZ1R5cGUgPT0gMSApIHsnLAorCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgJ2ZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZGVw
dGggKTsnLAorCisgICAgICAgICAgICAgICAgICAgICAgICAnfSBlbHNlIHsnLAorCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJ2NvbnN0IGZsb2F0IExPRzIgPSAxLjQ0MjY5NTsnLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICdmb2dGYWN0b3IgPSBleHAyKCAtIGZvZ0RlbnNpdHkg
KiBmb2dEZW5zaXR5ICogZGVwdGggKiBkZXB0aCAqIExPRzIgKTsnLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICdmb2dGYWN0b3IgPSAxLjAgLSBjbGFtcCggZm9nRmFjdG9yLCAwLjAsIDEu
MCApOycsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICd9JywKKworICAgICAgICAgICAgICAg
ICAgICAgICAgJ2dsX0ZyYWdDb2xvciA9IG1peCggZ2xfRnJhZ0NvbG9yLCB2ZWM0KCBmb2dDb2xv
ciwgZ2xfRnJhZ0NvbG9yLncgKSwgZm9nRmFjdG9yICk7JywKKworICAgICAgICAgICAgICAgICAg
ICAnfScsCisKKyAgICAgICAgICAgICAgICAnfScKKworICAgICAgICAgICAgXS5qb2luKCAnXG4n
ICkgKTsKKworICAgICAgICAgICAgZ2wuY29tcGlsZVNoYWRlciggdmVydGV4U2hhZGVyICk7Cisg
ICAgICAgICAgICBnbC5jb21waWxlU2hhZGVyKCBmcmFnbWVudFNoYWRlciApOworCisgICAgICAg
ICAgICBnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIHZlcnRleFNoYWRlciApOworICAgICAgICAg
ICAgZ2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBmcmFnbWVudFNoYWRlciApOworCisgICAgICAg
ICAgICBnbC5saW5rUHJvZ3JhbSggcHJvZ3JhbSApOworCisgICAgICAgICAgICByZXR1cm4gcHJv
Z3JhbTsKKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUo
IGEsIGIgKSB7CisKKyAgICAgICAgICAgIGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJP
cmRlciApIHsKKworICAgICAgICAgICAgICAgIHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5k
ZXJPcmRlcjsKKworICAgICAgICAgICAgfSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7CisKKyAg
ICAgICAgICAgICAgICByZXR1cm4gYi56IC0gYS56OworCisgICAgICAgICAgICB9IGVsc2Ugewor
CisgICAgICAgICAgICAgICAgcmV0dXJuIGIuaWQgLSBhLmlkOworCisgICAgICAgICAgICB9CisK
KyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBo
dHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVy
ZWRxdWFsaWEuY29tLworICAgICAqLworCisgICAgdmFyIG1hdGVyaWFsSWQgPSAwOworCisgICAg
ZnVuY3Rpb24gTWF0ZXJpYWwoKSB7CisKKyAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCB0
aGlzLCAnaWQnLCB7IHZhbHVlOiBtYXRlcmlhbElkICsrIH0gKTsKKworICAgICAgICB0aGlzLnV1
aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKKworICAgICAgICB0aGlzLm5hbWUgPSAnJzsKKyAg
ICAgICAgdGhpcy50eXBlID0gJ01hdGVyaWFsJzsKKworICAgICAgICB0aGlzLmZvZyA9IHRydWU7
CisgICAgICAgIHRoaXMubGlnaHRzID0gdHJ1ZTsKKworICAgICAgICB0aGlzLmJsZW5kaW5nID0g
Tm9ybWFsQmxlbmRpbmc7CisgICAgICAgIHRoaXMuc2lkZSA9IEZyb250U2lkZTsKKyAgICAgICAg
dGhpcy5zaGFkaW5nID0gU21vb3RoU2hhZGluZzsgLy8gVEhSRUUuRmxhdFNoYWRpbmcsIFRIUkVF
LlNtb290aFNoYWRpbmcKKyAgICAgICAgdGhpcy52ZXJ0ZXhDb2xvcnMgPSBOb0NvbG9yczsgLy8g
VEhSRUUuTm9Db2xvcnMsIFRIUkVFLlZlcnRleENvbG9ycywgVEhSRUUuRmFjZUNvbG9ycworCisg
ICAgICAgIHRoaXMub3BhY2l0eSA9IDE7CisgICAgICAgIHRoaXMudHJhbnNwYXJlbnQgPSBmYWxz
ZTsKKworICAgICAgICB0aGlzLmJsZW5kU3JjID0gU3JjQWxwaGFGYWN0b3I7CisgICAgICAgIHRo
aXMuYmxlbmREc3QgPSBPbmVNaW51c1NyY0FscGhhRmFjdG9yOworICAgICAgICB0aGlzLmJsZW5k
RXF1YXRpb24gPSBBZGRFcXVhdGlvbjsKKyAgICAgICAgdGhpcy5ibGVuZFNyY0FscGhhID0gbnVs
bDsKKyAgICAgICAgdGhpcy5ibGVuZERzdEFscGhhID0gbnVsbDsKKyAgICAgICAgdGhpcy5ibGVu
ZEVxdWF0aW9uQWxwaGEgPSBudWxsOworCisgICAgICAgIHRoaXMuZGVwdGhGdW5jID0gTGVzc0Vx
dWFsRGVwdGg7CisgICAgICAgIHRoaXMuZGVwdGhUZXN0ID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5k
ZXB0aFdyaXRlID0gdHJ1ZTsKKworICAgICAgICB0aGlzLmNsaXBwaW5nUGxhbmVzID0gbnVsbDsK
KyAgICAgICAgdGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gZmFsc2U7CisgICAgICAgIHRoaXMuY2xp
cFNoYWRvd3MgPSBmYWxzZTsKKworICAgICAgICB0aGlzLmNvbG9yV3JpdGUgPSB0cnVlOworCisg
ICAgICAgIHRoaXMucHJlY2lzaW9uID0gbnVsbDsgLy8gb3ZlcnJpZGUgdGhlIHJlbmRlcmVyJ3Mg
ZGVmYXVsdCBwcmVjaXNpb24gZm9yIHRoaXMgbWF0ZXJpYWwKKworICAgICAgICB0aGlzLnBvbHln
b25PZmZzZXQgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gMDsK
KyAgICAgICAgdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSAwOworCisgICAgICAgIHRoaXMuZGl0
aGVyaW5nID0gZmFsc2U7CisKKyAgICAgICAgdGhpcy5hbHBoYVRlc3QgPSAwOworICAgICAgICB0
aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlOworCisgICAgICAgIHRoaXMub3ZlcmRyYXcg
PSAwOyAvLyBPdmVyZHJhd24gcGl4ZWxzICh0eXBpY2FsbHkgYmV0d2VlbiAwIGFuZCAxKSBmb3Ig
Zml4aW5nIGFudGlhbGlhc2luZyBnYXBzIGluIENhbnZhc1JlbmRlcmVyCisKKyAgICAgICAgdGhp
cy52aXNpYmxlID0gdHJ1ZTsKKworICAgICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKwor
ICAgIH0KKworICAgIE9iamVjdC5hc3NpZ24oIE1hdGVyaWFsLnByb3RvdHlwZSwgRXZlbnREaXNw
YXRjaGVyLnByb3RvdHlwZSwgeworCisgICAgICAgIGlzTWF0ZXJpYWw6IHRydWUsCisKKyAgICAg
ICAgb25CZWZvcmVDb21waWxlOiBmdW5jdGlvbiAoKSB7fSwKKworICAgICAgICBzZXRWYWx1ZXM6
IGZ1bmN0aW9uICggdmFsdWVzICkgeworCisgICAgICAgICAgICBpZiAoIHZhbHVlcyA9PT0gdW5k
ZWZpbmVkICkgcmV0dXJuOworCisgICAgICAgICAgICBmb3IgKCB2YXIga2V5IGluIHZhbHVlcyAp
IHsKKworICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHZhbHVlc1sga2V5IF07CisKKyAg
ICAgICAgICAgICAgICBpZiAoIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgY29uc29sZS53YXJuKCAiVEhSRUUuTWF0ZXJpYWw6ICciICsga2V5ICsgIicg
cGFyYW1ldGVyIGlzIHVuZGVmaW5lZC4iICk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1
ZSA9IHRoaXNbIGtleSBdOworCisgICAgICAgICAgICAgICAgaWYgKCBjdXJyZW50VmFsdWUgPT09
IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICJUSFJF
RS4iICsgdGhpcy50eXBlICsgIjogJyIgKyBrZXkgKyAiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0
aGlzIG1hdGVyaWFsLiIgKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJy
ZW50VmFsdWUuaXNDb2xvciApIHsKKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUu
c2V0KCBuZXdWYWx1ZSApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggKCBjdXJyZW50
VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzVmVjdG9yMyApICYmICggbmV3VmFsdWUgJiYgbmV3VmFs
dWUuaXNWZWN0b3IzICkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlLmNv
cHkoIG5ld1ZhbHVlICk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBrZXkgPT09ICdv
dmVyZHJhdycgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIG92ZXJkcmF3IGlz
IGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggbGVnYWN5IGJvb2xlYW4gdHlwZQorICAgICAgICAg
ICAgICAgICAgICB0aGlzWyBrZXkgXSA9IE51bWJlciggbmV3VmFsdWUgKTsKKworICAgICAgICAg
ICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpc1sga2V5IF0gPSBuZXdW
YWx1ZTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0s
CisKKyAgICAgICAgdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CisKKyAgICAgICAgICAgIHZh
ciBpc1Jvb3QgPSBtZXRhID09PSB1bmRlZmluZWQ7CisKKyAgICAgICAgICAgIGlmICggaXNSb290
ICkgeworCisgICAgICAgICAgICAgICAgbWV0YSA9IHsKKyAgICAgICAgICAgICAgICAgICAgdGV4
dHVyZXM6IHt9LAorICAgICAgICAgICAgICAgICAgICBpbWFnZXM6IHt9CisgICAgICAgICAgICAg
ICAgfTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZGF0YSA9IHsKKyAgICAg
ICAgICAgICAgICBtZXRhZGF0YTogeworICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiA0LjUs
CisgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNYXRlcmlhbCcsCisgICAgICAgICAgICAgICAg
ICAgIGdlbmVyYXRvcjogJ01hdGVyaWFsLnRvSlNPTicKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9OworCisgICAgICAgICAgICAvLyBzdGFuZGFyZCBNYXRlcmlhbCBzZXJpYWxpemF0
aW9uCisgICAgICAgICAgICBkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7CisgICAgICAgICAgICBkYXRh
LnR5cGUgPSB0aGlzLnR5cGU7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5uYW1lICE9PSAnJyAp
IGRhdGEubmFtZSA9IHRoaXMubmFtZTsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmNvbG9yICYm
IHRoaXMuY29sb3IuaXNDb2xvciApIGRhdGEuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpOwor
CisgICAgICAgICAgICBpZiAoIHRoaXMucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnJv
dWdobmVzcyA9IHRoaXMucm91Z2huZXNzOworICAgICAgICAgICAgaWYgKCB0aGlzLm1ldGFsbmVz
cyAhPT0gdW5kZWZpbmVkICkgZGF0YS5tZXRhbG5lc3MgPSB0aGlzLm1ldGFsbmVzczsKKworICAg
ICAgICAgICAgaWYgKCB0aGlzLmVtaXNzaXZlICYmIHRoaXMuZW1pc3NpdmUuaXNDb2xvciApIGRh
dGEuZW1pc3NpdmUgPSB0aGlzLmVtaXNzaXZlLmdldEhleCgpOworICAgICAgICAgICAgaWYgKCB0
aGlzLnNwZWN1bGFyICYmIHRoaXMuc3BlY3VsYXIuaXNDb2xvciApIGRhdGEuc3BlY3VsYXIgPSB0
aGlzLnNwZWN1bGFyLmdldEhleCgpOworICAgICAgICAgICAgaWYgKCB0aGlzLnNoaW5pbmVzcyAh
PT0gdW5kZWZpbmVkICkgZGF0YS5zaGluaW5lc3MgPSB0aGlzLnNoaW5pbmVzczsKKyAgICAgICAg
ICAgIGlmICggdGhpcy5jbGVhckNvYXQgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJDb2F0ID0g
dGhpcy5jbGVhckNvYXQ7CisgICAgICAgICAgICBpZiAoIHRoaXMuY2xlYXJDb2F0Um91Z2huZXNz
ICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyQ29hdFJvdWdobmVzcyA9IHRoaXMuY2xlYXJDb2F0
Um91Z2huZXNzOworCisgICAgICAgICAgICBpZiAoIHRoaXMubWFwICYmIHRoaXMubWFwLmlzVGV4
dHVyZSApIGRhdGEubWFwID0gdGhpcy5tYXAudG9KU09OKCBtZXRhICkudXVpZDsKKyAgICAgICAg
ICAgIGlmICggdGhpcy5hbHBoYU1hcCAmJiB0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSApIGRhdGEu
YWxwaGFNYXAgPSB0aGlzLmFscGhhTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CisgICAgICAgICAg
ICBpZiAoIHRoaXMubGlnaHRNYXAgJiYgdGhpcy5saWdodE1hcC5pc1RleHR1cmUgKSBkYXRhLmxp
Z2h0TWFwID0gdGhpcy5saWdodE1hcC50b0pTT04oIG1ldGEgKS51dWlkOworICAgICAgICAgICAg
aWYgKCB0aGlzLmJ1bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSApIHsKKworICAgICAg
ICAgICAgICAgIGRhdGEuYnVtcE1hcCA9IHRoaXMuYnVtcE1hcC50b0pTT04oIG1ldGEgKS51dWlk
OworICAgICAgICAgICAgICAgIGRhdGEuYnVtcFNjYWxlID0gdGhpcy5idW1wU2NhbGU7CisKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggdGhpcy5ub3JtYWxNYXAgJiYgdGhpcy5ub3Jt
YWxNYXAuaXNUZXh0dXJlICkgeworCisgICAgICAgICAgICAgICAgZGF0YS5ub3JtYWxNYXAgPSB0
aGlzLm5vcm1hbE1hcC50b0pTT04oIG1ldGEgKS51dWlkOworICAgICAgICAgICAgICAgIGRhdGEu
bm9ybWFsU2NhbGUgPSB0aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKTsKKworICAgICAgICAgICAg
fQorICAgICAgICAgICAgaWYgKCB0aGlzLmRpc3BsYWNlbWVudE1hcCAmJiB0aGlzLmRpc3BsYWNl
bWVudE1hcC5pc1RleHR1cmUgKSB7CisKKyAgICAgICAgICAgICAgICBkYXRhLmRpc3BsYWNlbWVu
dE1hcCA9IHRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CisgICAgICAg
ICAgICAgICAgZGF0YS5kaXNwbGFjZW1lbnRTY2FsZSA9IHRoaXMuZGlzcGxhY2VtZW50U2NhbGU7
CisgICAgICAgICAgICAgICAgZGF0YS5kaXNwbGFjZW1lbnRCaWFzID0gdGhpcy5kaXNwbGFjZW1l
bnRCaWFzOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHRoaXMucm91Z2huZXNz
TWFwICYmIHRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSApIGRhdGEucm91Z2huZXNzTWFwID0g
dGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDsKKyAgICAgICAgICAgIGlmICgg
dGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5t
ZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkOworCisg
ICAgICAgICAgICBpZiAoIHRoaXMuZW1pc3NpdmVNYXAgJiYgdGhpcy5lbWlzc2l2ZU1hcC5pc1Rl
eHR1cmUgKSBkYXRhLmVtaXNzaXZlTWFwID0gdGhpcy5lbWlzc2l2ZU1hcC50b0pTT04oIG1ldGEg
KS51dWlkOworICAgICAgICAgICAgaWYgKCB0aGlzLnNwZWN1bGFyTWFwICYmIHRoaXMuc3BlY3Vs
YXJNYXAuaXNUZXh0dXJlICkgZGF0YS5zcGVjdWxhck1hcCA9IHRoaXMuc3BlY3VsYXJNYXAudG9K
U09OKCBtZXRhICkudXVpZDsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmVudk1hcCAmJiB0aGlz
LmVudk1hcC5pc1RleHR1cmUgKSB7CisKKyAgICAgICAgICAgICAgICBkYXRhLmVudk1hcCA9IHRo
aXMuZW52TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CisgICAgICAgICAgICAgICAgZGF0YS5yZWZs
ZWN0aXZpdHkgPSB0aGlzLnJlZmxlY3Rpdml0eTsgLy8gU2NhbGUgYmVoaW5kIGVudk1hcAorCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggdGhpcy5ncmFkaWVudE1hcCAmJiB0aGlz
LmdyYWRpZW50TWFwLmlzVGV4dHVyZSApIHsKKworICAgICAgICAgICAgICAgIGRhdGEuZ3JhZGll
bnRNYXAgPSB0aGlzLmdyYWRpZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaWYgKCB0aGlzLnNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEu
c2l6ZSA9IHRoaXMuc2l6ZTsKKyAgICAgICAgICAgIGlmICggdGhpcy5zaXplQXR0ZW51YXRpb24g
IT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZUF0dGVudWF0aW9uID0gdGhpcy5zaXplQXR0ZW51YXRp
b247CisKKyAgICAgICAgICAgIGlmICggdGhpcy5ibGVuZGluZyAhPT0gTm9ybWFsQmxlbmRpbmcg
KSBkYXRhLmJsZW5kaW5nID0gdGhpcy5ibGVuZGluZzsKKyAgICAgICAgICAgIGlmICggdGhpcy5z
aGFkaW5nICE9PSBTbW9vdGhTaGFkaW5nICkgZGF0YS5zaGFkaW5nID0gdGhpcy5zaGFkaW5nOwor
ICAgICAgICAgICAgaWYgKCB0aGlzLnNpZGUgIT09IEZyb250U2lkZSApIGRhdGEuc2lkZSA9IHRo
aXMuc2lkZTsKKyAgICAgICAgICAgIGlmICggdGhpcy52ZXJ0ZXhDb2xvcnMgIT09IE5vQ29sb3Jz
ICkgZGF0YS52ZXJ0ZXhDb2xvcnMgPSB0aGlzLnZlcnRleENvbG9yczsKKworICAgICAgICAgICAg
aWYgKCB0aGlzLm9wYWNpdHkgPCAxICkgZGF0YS5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5OworICAg
ICAgICAgICAgaWYgKCB0aGlzLnRyYW5zcGFyZW50ID09PSB0cnVlICkgZGF0YS50cmFuc3BhcmVu
dCA9IHRoaXMudHJhbnNwYXJlbnQ7CisKKyAgICAgICAgICAgIGRhdGEuZGVwdGhGdW5jID0gdGhp
cy5kZXB0aEZ1bmM7CisgICAgICAgICAgICBkYXRhLmRlcHRoVGVzdCA9IHRoaXMuZGVwdGhUZXN0
OworICAgICAgICAgICAgZGF0YS5kZXB0aFdyaXRlID0gdGhpcy5kZXB0aFdyaXRlOworCisgICAg
ICAgICAgICBpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5h
bHBoYVRlc3Q7CisgICAgICAgICAgICBpZiAoIHRoaXMucHJlbXVsdGlwbGllZEFscGhhID09PSB0
cnVlICkgZGF0YS5wcmVtdWx0aXBsaWVkQWxwaGEgPSB0aGlzLnByZW11bHRpcGxpZWRBbHBoYTsK
KyAgICAgICAgICAgIGlmICggdGhpcy53aXJlZnJhbWUgPT09IHRydWUgKSBkYXRhLndpcmVmcmFt
ZSA9IHRoaXMud2lyZWZyYW1lOworICAgICAgICAgICAgaWYgKCB0aGlzLndpcmVmcmFtZUxpbmV3
aWR0aCA+IDEgKSBkYXRhLndpcmVmcmFtZUxpbmV3aWR0aCA9IHRoaXMud2lyZWZyYW1lTGluZXdp
ZHRoOworICAgICAgICAgICAgaWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcg
KSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7CisgICAgICAg
ICAgICBpZiAoIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gIT09ICdyb3VuZCcgKSBkYXRhLndpcmVm
cmFtZUxpbmVqb2luID0gdGhpcy53aXJlZnJhbWVMaW5lam9pbjsKKworICAgICAgICAgICAgZGF0
YS5za2lubmluZyA9IHRoaXMuc2tpbm5pbmc7CisgICAgICAgICAgICBkYXRhLm1vcnBoVGFyZ2V0
cyA9IHRoaXMubW9ycGhUYXJnZXRzOworCisgICAgICAgICAgICBkYXRhLmRpdGhlcmluZyA9IHRo
aXMuZGl0aGVyaW5nOworCisgICAgICAgICAgICAvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3Qz
RC50b0pTT04KKworICAgICAgICAgICAgZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUg
KSB7CisKKyAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CisKKyAgICAgICAgICAgICAg
ICBmb3IgKCB2YXIga2V5IGluIGNhY2hlICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBk
YXRhID0gY2FjaGVbIGtleSBdOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YS5tZXRh
ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goIGRhdGEgKTsKKworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaWYgKCBpc1Jvb3QgKSB7CisKKyAgICAgICAgICAgICAgICB2
YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7CisgICAgICAg
ICAgICAgICAgdmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7CisK
KyAgICAgICAgICAgICAgICBpZiAoIHRleHR1cmVzLmxlbmd0aCA+IDAgKSBkYXRhLnRleHR1cmVz
ID0gdGV4dHVyZXM7CisgICAgICAgICAgICAgICAgaWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIGRh
dGEuaW1hZ2VzID0gaW1hZ2VzOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVy
biBkYXRhOworCisgICAgICAgIH0sCisKKyAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKKwor
ICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKyAg
ICAgICAgICAgIHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lOworCisgICAgICAgICAgICB0aGlzLmZv
ZyA9IHNvdXJjZS5mb2c7CisgICAgICAgICAgICB0aGlzLmxpZ2h0cyA9IHNvdXJjZS5saWdodHM7
CisKKyAgICAgICAgICAgIHRoaXMuYmxlbmRpbmcgPSBzb3VyY2UuYmxlbmRpbmc7CisgICAgICAg
ICAgICB0aGlzLnNpZGUgPSBzb3VyY2Uuc2lkZTsKKyAgICAgICAgICAgIHRoaXMuc2hhZGluZyA9
IHNvdXJjZS5zaGFkaW5nOworICAgICAgICAgICAgdGhpcy52ZXJ0ZXhDb2xvcnMgPSBzb3VyY2Uu
dmVydGV4Q29sb3JzOworCisgICAgICAgICAgICB0aGlzLm9wYWNpdHkgPSBzb3VyY2Uub3BhY2l0
eTsKKyAgICAgICAgICAgIHRoaXMudHJhbnNwYXJlbnQgPSBzb3VyY2UudHJhbnNwYXJlbnQ7CisK
KyAgICAgICAgICAgIHRoaXMuYmxlbmRTcmMgPSBzb3VyY2UuYmxlbmRTcmM7CisgICAgICAgICAg
ICB0aGlzLmJsZW5kRHN0ID0gc291cmNlLmJsZW5kRHN0OworICAgICAgICAgICAgdGhpcy5ibGVu
ZEVxdWF0aW9uID0gc291cmNlLmJsZW5kRXF1YXRpb247CisgICAgICAgICAgICB0aGlzLmJsZW5k
U3JjQWxwaGEgPSBzb3VyY2UuYmxlbmRTcmNBbHBoYTsKKyAgICAgICAgICAgIHRoaXMuYmxlbmRE
c3RBbHBoYSA9IHNvdXJjZS5ibGVuZERzdEFscGhhOworICAgICAgICAgICAgdGhpcy5ibGVuZEVx
dWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhOworCisgICAgICAgICAgICB0
aGlzLmRlcHRoRnVuYyA9IHNvdXJjZS5kZXB0aEZ1bmM7CisgICAgICAgICAgICB0aGlzLmRlcHRo
VGVzdCA9IHNvdXJjZS5kZXB0aFRlc3Q7CisgICAgICAgICAgICB0aGlzLmRlcHRoV3JpdGUgPSBz
b3VyY2UuZGVwdGhXcml0ZTsKKworICAgICAgICAgICAgdGhpcy5jb2xvcldyaXRlID0gc291cmNl
LmNvbG9yV3JpdGU7CisKKyAgICAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gc291cmNlLnByZWNp
c2lvbjsKKworICAgICAgICAgICAgdGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNlLnBvbHlnb25P
ZmZzZXQ7CisgICAgICAgICAgICB0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBzb3VyY2UucG9s
eWdvbk9mZnNldEZhY3RvcjsKKyAgICAgICAgICAgIHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0g
c291cmNlLnBvbHlnb25PZmZzZXRVbml0czsKKworICAgICAgICAgICAgdGhpcy5kaXRoZXJpbmcg
PSBzb3VyY2UuZGl0aGVyaW5nOworCisgICAgICAgICAgICB0aGlzLmFscGhhVGVzdCA9IHNvdXJj
ZS5hbHBoYVRlc3Q7CisKKyAgICAgICAgICAgIHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gc291
cmNlLnByZW11bHRpcGxpZWRBbHBoYTsKKworICAgICAgICAgICAgdGhpcy5vdmVyZHJhdyA9IHNv
dXJjZS5vdmVyZHJhdzsKKworICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gc291cmNlLnZpc2li
bGU7CisgICAgICAgICAgICB0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzOwor
ICAgICAgICAgICAgdGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gc291cmNlLmNsaXBJbnRlcnNlY3Rp
b247CisKKyAgICAgICAgICAgIHZhciBzcmNQbGFuZXMgPSBzb3VyY2UuY2xpcHBpbmdQbGFuZXMs
CisgICAgICAgICAgICAgICAgZHN0UGxhbmVzID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKCBz
cmNQbGFuZXMgIT09IG51bGwgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgbiA9IHNyY1BsYW5l
cy5sZW5ndGg7CisgICAgICAgICAgICAgICAgZHN0UGxhbmVzID0gbmV3IEFycmF5KCBuICk7CisK
KyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKQorICAgICAg
ICAgICAgICAgICAgICBkc3RQbGFuZXNbIGkgXSA9IHNyY1BsYW5lc1sgaSBdLmNsb25lKCk7CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5jbGlwcGluZ1BsYW5lcyA9IGRzdFBs
YW5lczsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAg
ICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVu
dCggeyB0eXBlOiAnZGlzcG9zZScgfSApOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAg
IC8qKgorICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20v
CisgICAgICoKKyAgICAgKiBwYXJhbWV0ZXJzID0geworICAgICAqICBkZWZpbmVzOiB7ICJsYWJl
bCIgOiAidmFsdWUiIH0sCisgICAgICogIHVuaWZvcm1zOiB7ICJwYXJhbWV0ZXIxIjogeyB2YWx1
ZTogMS4wIH0sICJwYXJhbWV0ZXIyIjogeyB2YWx1ZTI6IDIgfSB9LAorICAgICAqCisgICAgICog
IGZyYWdtZW50U2hhZGVyOiA8c3RyaW5nPiwKKyAgICAgKiAgdmVydGV4U2hhZGVyOiA8c3RyaW5n
PiwKKyAgICAgKgorICAgICAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKKyAgICAgKiAgd2lyZWZy
YW1lTGluZXdpZHRoOiA8ZmxvYXQ+LAorICAgICAqCisgICAgICogIGxpZ2h0czogPGJvb2w+LAor
ICAgICAqCisgICAgICogIHNraW5uaW5nOiA8Ym9vbD4sCisgICAgICogIG1vcnBoVGFyZ2V0czog
PGJvb2w+LAorICAgICAqICBtb3JwaE5vcm1hbHM6IDxib29sPgorICAgICAqIH0KKyAgICAgKi8K
KworICAgIGZ1bmN0aW9uIFNoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisgICAgICAg
IE1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnU2hhZGVyTWF0
ZXJpYWwnOworCisgICAgICAgIHRoaXMuZGVmaW5lcyA9IHt9OworICAgICAgICB0aGlzLnVuaWZv
cm1zID0ge307CisKKyAgICAgICAgdGhpcy52ZXJ0ZXhTaGFkZXIgPSAndm9pZCBtYWluKCkge1xu
XHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0
KCBwb3NpdGlvbiwgMS4wICk7XG59JzsKKyAgICAgICAgdGhpcy5mcmFnbWVudFNoYWRlciA9ICd2
b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCAp
O1xufSc7CisKKyAgICAgICAgdGhpcy5saW5ld2lkdGggPSAxOworCisgICAgICAgIHRoaXMud2ly
ZWZyYW1lID0gZmFsc2U7CisgICAgICAgIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTsKKwor
ICAgICAgICB0aGlzLmZvZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGZvZworICAgICAg
ICB0aGlzLmxpZ2h0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGxpZ2h0cworICAgICAg
ICB0aGlzLmNsaXBwaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2UgdXNlci1kZWZpbmVkIGNsaXBw
aW5nIHBsYW5lcworCisgICAgICAgIHRoaXMuc2tpbm5pbmcgPSBmYWxzZTsgLy8gc2V0IHRvIHVz
ZSBza2lubmluZyBhdHRyaWJ1dGUgc3RyZWFtcworICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0cyA9
IGZhbHNlOyAvLyBzZXQgdG8gdXNlIG1vcnBoIHRhcmdldHMKKyAgICAgICAgdGhpcy5tb3JwaE5v
cm1hbHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCBub3JtYWxzCisKKyAgICAgICAgdGhp
cy5leHRlbnNpb25zID0geworICAgICAgICAgICAgZGVyaXZhdGl2ZXM6IGZhbHNlLCAvLyBzZXQg
dG8gdXNlIGRlcml2YXRpdmVzCisgICAgICAgICAgICBmcmFnRGVwdGg6IGZhbHNlLCAvLyBzZXQg
dG8gdXNlIGZyYWdtZW50IGRlcHRoIHZhbHVlcworICAgICAgICAgICAgZHJhd0J1ZmZlcnM6IGZh
bHNlLCAvLyBzZXQgdG8gdXNlIGRyYXcgYnVmZmVycworICAgICAgICAgICAgc2hhZGVyVGV4dHVy
ZUxPRDogZmFsc2UgLy8gc2V0IHRvIHVzZSBzaGFkZXIgdGV4dHVyZSBMT0QKKyAgICAgICAgfTsK
KworICAgICAgICAvLyBXaGVuIHJlbmRlcmVkIGdlb21ldHJ5IGRvZXNuJ3QgaW5jbHVkZSB0aGVz
ZSBhdHRyaWJ1dGVzIGJ1dCB0aGUgbWF0ZXJpYWwgZG9lcywKKyAgICAgICAgLy8gdXNlIHRoZXNl
IGRlZmF1bHQgdmFsdWVzIGluIFdlYkdMLiBUaGlzIGF2b2lkcyBlcnJvcnMgd2hlbiBidWZmZXIg
ZGF0YSBpcyBtaXNzaW5nLgorICAgICAgICB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgPSB7
CisgICAgICAgICAgICAnY29sb3InOiBbIDEsIDEsIDEgXSwKKyAgICAgICAgICAgICd1dic6IFsg
MCwgMCBdLAorICAgICAgICAgICAgJ3V2Mic6IFsgMCwgMCBdCisgICAgICAgIH07CisKKyAgICAg
ICAgdGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lID0gdW5kZWZpbmVkOworCisgICAgICAgIGlmICgg
cGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICBpZiAoIHBhcmFtZXRl
cnMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgY29uc29s
ZS5lcnJvciggJ1RIUkVFLlNoYWRlck1hdGVyaWFsOiBhdHRyaWJ1dGVzIHNob3VsZCBub3cgYmUg
ZGVmaW5lZCBpbiBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTsKKworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICB0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOworCisgICAg
ICAgIH0KKworICAgIH0KKworICAgIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5j
cmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOworICAgIFNoYWRlck1hdGVyaWFsLnByb3RvdHlw
ZS5jb25zdHJ1Y3RvciA9IFNoYWRlck1hdGVyaWFsOworCisgICAgU2hhZGVyTWF0ZXJpYWwucHJv
dG90eXBlLmlzU2hhZGVyTWF0ZXJpYWwgPSB0cnVlOworCisgICAgU2hhZGVyTWF0ZXJpYWwucHJv
dG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworICAgICAgICBNYXRlcmlhbC5w
cm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworICAgICAgICB0aGlzLmZyYWdt
ZW50U2hhZGVyID0gc291cmNlLmZyYWdtZW50U2hhZGVyOworICAgICAgICB0aGlzLnZlcnRleFNo
YWRlciA9IHNvdXJjZS52ZXJ0ZXhTaGFkZXI7CisKKyAgICAgICAgdGhpcy51bmlmb3JtcyA9IFVu
aWZvcm1zVXRpbHMuY2xvbmUoIHNvdXJjZS51bmlmb3JtcyApOworCisgICAgICAgIHRoaXMuZGVm
aW5lcyA9IHNvdXJjZS5kZWZpbmVzOworCisgICAgICAgIHRoaXMud2lyZWZyYW1lID0gc291cmNl
LndpcmVmcmFtZTsKKyAgICAgICAgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2ly
ZWZyYW1lTGluZXdpZHRoOworCisgICAgICAgIHRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0czsK
KyAgICAgICAgdGhpcy5jbGlwcGluZyA9IHNvdXJjZS5jbGlwcGluZzsKKworICAgICAgICB0aGlz
LnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nOworCisgICAgICAgIHRoaXMubW9ycGhUYXJnZXRz
ID0gc291cmNlLm1vcnBoVGFyZ2V0czsKKyAgICAgICAgdGhpcy5tb3JwaE5vcm1hbHMgPSBzb3Vy
Y2UubW9ycGhOb3JtYWxzOworCisgICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHNvdXJjZS5leHRl
bnNpb25zOworCisgICAgICAgIHJldHVybiB0aGlzOworCisgICAgfTsKKworICAgIFNoYWRlck1h
dGVyaWFsLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIG1ldGEgKSB7CisKKyAgICAgICAg
dmFyIGRhdGEgPSBNYXRlcmlhbC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTsK
KworICAgICAgICBkYXRhLnVuaWZvcm1zID0gdGhpcy51bmlmb3JtczsKKyAgICAgICAgZGF0YS52
ZXJ0ZXhTaGFkZXIgPSB0aGlzLnZlcnRleFNoYWRlcjsKKyAgICAgICAgZGF0YS5mcmFnbWVudFNo
YWRlciA9IHRoaXMuZnJhZ21lbnRTaGFkZXI7CisKKyAgICAgICAgcmV0dXJuIGRhdGE7CisKKyAg
ICB9OworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNv
bS8KKyAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwor
ICAgICAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwczovL2NsYXJhLmlvCisgICAgICogQGF1dGhv
ciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisgICAgICoKKyAg
ICAgKiBwYXJhbWV0ZXJzID0geworICAgICAqCisgICAgICogIG9wYWNpdHk6IDxmbG9hdD4sCisg
ICAgICoKKyAgICAgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorICAgICAq
CisgICAgICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorICAgICAq
CisgICAgICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwK
KyAgICAgKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sCisgICAgICogIGRpc3BsYWNlbWVu
dEJpYXM6IDxmbG9hdD4sCisgICAgICoKKyAgICAgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCisg
ICAgICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PgorICAgICAqIH0KKyAgICAgKi8KKwor
ICAgIGZ1bmN0aW9uIE1lc2hEZXB0aE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisgICAgICAg
IE1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnTWVzaERlcHRo
TWF0ZXJpYWwnOworCisgICAgICAgIHRoaXMuZGVwdGhQYWNraW5nID0gQmFzaWNEZXB0aFBhY2tp
bmc7CisKKyAgICAgICAgdGhpcy5za2lubmluZyA9IGZhbHNlOworICAgICAgICB0aGlzLm1vcnBo
VGFyZ2V0cyA9IGZhbHNlOworCisgICAgICAgIHRoaXMubWFwID0gbnVsbDsKKworICAgICAgICB0
aGlzLmFscGhhTWFwID0gbnVsbDsKKworICAgICAgICB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51
bGw7CisgICAgICAgIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOworICAgICAgICB0aGlzLmRp
c3BsYWNlbWVudEJpYXMgPSAwOworCisgICAgICAgIHRoaXMud2lyZWZyYW1lID0gZmFsc2U7Cisg
ICAgICAgIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTsKKworICAgICAgICB0aGlzLmZvZyA9
IGZhbHNlOworICAgICAgICB0aGlzLmxpZ2h0cyA9IGZhbHNlOworCisgICAgICAgIHRoaXMuc2V0
VmFsdWVzKCBwYXJhbWV0ZXJzICk7CisKKyAgICB9CisKKyAgICBNZXNoRGVwdGhNYXRlcmlhbC5w
cm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKKyAgICBNZXNo
RGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGVwdGhNYXRlcmlhbDsK
KworICAgIE1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsID0g
dHJ1ZTsKKworICAgIE1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24g
KCBzb3VyY2UgKSB7CisKKyAgICAgICAgTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhp
cywgc291cmNlICk7CisKKyAgICAgICAgdGhpcy5kZXB0aFBhY2tpbmcgPSBzb3VyY2UuZGVwdGhQ
YWNraW5nOworCisgICAgICAgIHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7CisgICAg
ICAgIHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0czsKKworICAgICAgICB0
aGlzLm1hcCA9IHNvdXJjZS5tYXA7CisKKyAgICAgICAgdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5h
bHBoYU1hcDsKKworICAgICAgICB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFj
ZW1lbnRNYXA7CisgICAgICAgIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxh
Y2VtZW50U2NhbGU7CisgICAgICAgIHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNw
bGFjZW1lbnRCaWFzOworCisgICAgICAgIHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFt
ZTsKKyAgICAgICAgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGlu
ZXdpZHRoOworCisgICAgICAgIHJldHVybiB0aGlzOworCisgICAgfTsKKworICAgIC8qKgorICAg
ICAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KKyAgICAgKiBAYXV0aG9yIFdl
c3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKyAgICAgKi8KKworICAg
IGZ1bmN0aW9uIEJveDMoIG1pbiwgbWF4ICkgeworCisgICAgICAgIHRoaXMubWluID0gKCBtaW4g
IT09IHVuZGVmaW5lZCApID8gbWluIDogbmV3IFZlY3RvcjMoICsgSW5maW5pdHksICsgSW5maW5p
dHksICsgSW5maW5pdHkgKTsKKyAgICAgICAgdGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVk
ICkgPyBtYXggOiBuZXcgVmVjdG9yMyggLSBJbmZpbml0eSwgLSBJbmZpbml0eSwgLSBJbmZpbml0
eSApOworCisgICAgfQorCisgICAgT2JqZWN0LmFzc2lnbiggQm94My5wcm90b3R5cGUsIHsKKwor
ICAgICAgICBpc0JveDM6IHRydWUsCisKKyAgICAgICAgc2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4
ICkgeworCisgICAgICAgICAgICB0aGlzLm1pbi5jb3B5KCBtaW4gKTsKKyAgICAgICAgICAgIHRo
aXMubWF4LmNvcHkoIG1heCApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAg
ICB9LAorCisgICAgICAgIHNldEZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHsKKworICAg
ICAgICAgICAgdmFyIG1pblggPSArIEluZmluaXR5OworICAgICAgICAgICAgdmFyIG1pblkgPSAr
IEluZmluaXR5OworICAgICAgICAgICAgdmFyIG1pblogPSArIEluZmluaXR5OworCisgICAgICAg
ICAgICB2YXIgbWF4WCA9IC0gSW5maW5pdHk7CisgICAgICAgICAgICB2YXIgbWF4WSA9IC0gSW5m
aW5pdHk7CisgICAgICAgICAgICB2YXIgbWF4WiA9IC0gSW5maW5pdHk7CisKKyAgICAgICAgICAg
IGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHsKKwor
ICAgICAgICAgICAgICAgIHZhciB4ID0gYXJyYXlbIGkgXTsKKyAgICAgICAgICAgICAgICB2YXIg
eSA9IGFycmF5WyBpICsgMSBdOworICAgICAgICAgICAgICAgIHZhciB6ID0gYXJyYXlbIGkgKyAy
IF07CisKKyAgICAgICAgICAgICAgICBpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7CisgICAgICAg
ICAgICAgICAgaWYgKCB5IDwgbWluWSApIG1pblkgPSB5OworICAgICAgICAgICAgICAgIGlmICgg
eiA8IG1pblogKSBtaW5aID0gejsKKworICAgICAgICAgICAgICAgIGlmICggeCA+IG1heFggKSBt
YXhYID0geDsKKyAgICAgICAgICAgICAgICBpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7CisgICAg
ICAgICAgICAgICAgaWYgKCB6ID4gbWF4WiApIG1heFogPSB6OworCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApOworICAgICAgICAg
ICAgdGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7CisKKyAgICAgICAgICAgIHJldHVy
biB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZTog
ZnVuY3Rpb24gKCBhdHRyaWJ1dGUgKSB7CisKKyAgICAgICAgICAgIHZhciBtaW5YID0gKyBJbmZp
bml0eTsKKyAgICAgICAgICAgIHZhciBtaW5ZID0gKyBJbmZpbml0eTsKKyAgICAgICAgICAgIHZh
ciBtaW5aID0gKyBJbmZpbml0eTsKKworICAgICAgICAgICAgdmFyIG1heFggPSAtIEluZmluaXR5
OworICAgICAgICAgICAgdmFyIG1heFkgPSAtIEluZmluaXR5OworICAgICAgICAgICAgdmFyIG1h
eFogPSAtIEluZmluaXR5OworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRy
aWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgdmFyIHggPSBh
dHRyaWJ1dGUuZ2V0WCggaSApOworICAgICAgICAgICAgICAgIHZhciB5ID0gYXR0cmlidXRlLmdl
dFkoIGkgKTsKKyAgICAgICAgICAgICAgICB2YXIgeiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7CisK
KyAgICAgICAgICAgICAgICBpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7CisgICAgICAgICAgICAg
ICAgaWYgKCB5IDwgbWluWSApIG1pblkgPSB5OworICAgICAgICAgICAgICAgIGlmICggeiA8IG1p
blogKSBtaW5aID0gejsKKworICAgICAgICAgICAgICAgIGlmICggeCA+IG1heFggKSBtYXhYID0g
eDsKKyAgICAgICAgICAgICAgICBpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7CisgICAgICAgICAg
ICAgICAgaWYgKCB6ID4gbWF4WiApIG1heFogPSB6OworCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApOworICAgICAgICAgICAgdGhp
cy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlz
OworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2lu
dHMgKSB7CisKKyAgICAgICAgICAgIHRoaXMubWFrZUVtcHR5KCk7CisKKyAgICAgICAgICAgIGZv
ciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKyAg
ICAgICAgICAgICAgICB0aGlzLmV4cGFuZEJ5UG9pbnQoIHBvaW50c1sgaSBdICk7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAg
ICAgICBzZXRGcm9tQ2VudGVyQW5kU2l6ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2
YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gc2V0
RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHsKKworICAgICAgICAgICAgICAgIHZh
ciBoYWxmU2l6ZSA9IHYxLmNvcHkoIHNpemUgKS5tdWx0aXBseVNjYWxhciggMC41ICk7CisKKyAg
ICAgICAgICAgICAgICB0aGlzLm1pbi5jb3B5KCBjZW50ZXIgKS5zdWIoIGhhbGZTaXplICk7Cisg
ICAgICAgICAgICAgICAgdGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApOwor
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgIH07CisKKyAgICAg
ICAgfSgpLAorCisgICAgICAgIHNldEZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkgewor
CisgICAgICAgICAgICB0aGlzLm1ha2VFbXB0eSgpOworCisgICAgICAgICAgICByZXR1cm4gdGhp
cy5leHBhbmRCeU9iamVjdCggb2JqZWN0ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBjbG9u
ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0
b3IoKS5jb3B5KCB0aGlzICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBjb3B5OiBmdW5jdGlv
biAoIGJveCApIHsKKworICAgICAgICAgICAgdGhpcy5taW4uY29weSggYm94Lm1pbiApOworICAg
ICAgICAgICAgdGhpcy5tYXguY29weSggYm94Lm1heCApOworCisgICAgICAgICAgICByZXR1cm4g
dGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIG1ha2VFbXB0eTogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICB0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9IHRoaXMubWluLnogPSArIElu
ZmluaXR5OworICAgICAgICAgICAgdGhpcy5tYXgueCA9IHRoaXMubWF4LnkgPSB0aGlzLm1heC56
ID0gLSBJbmZpbml0eTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwK
KworICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8vIHRoaXMg
aXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVj
YXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzCisKKyAg
ICAgICAgICAgIHJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1h
eC55IDwgdGhpcy5taW4ueSApIHx8ICggdGhpcy5tYXgueiA8IHRoaXMubWluLnogKTsKKworICAg
ICAgICB9LAorCisgICAgICAgIGdldENlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCAp
IHsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0
b3IzKCk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyByZXN1bHQuc2V0KCAw
LCAwLCAwICkgOiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlw
bHlTY2FsYXIoIDAuNSApOworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0U2l6ZTogZnVuY3Rp
b24gKCBvcHRpb25hbFRhcmdldCApIHsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9wdGlv
bmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0Vt
cHR5KCkgPyByZXN1bHQuc2V0KCAwLCAwLCAwICkgOiByZXN1bHQuc3ViVmVjdG9ycyggdGhpcy5t
YXgsIHRoaXMubWluICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBleHBhbmRCeVBvaW50OiBm
dW5jdGlvbiAoIHBvaW50ICkgeworCisgICAgICAgICAgICB0aGlzLm1pbi5taW4oIHBvaW50ICk7
CisgICAgICAgICAgICB0aGlzLm1heC5tYXgoIHBvaW50ICk7CisKKyAgICAgICAgICAgIHJldHVy
biB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9u
ICggdmVjdG9yICkgeworCisgICAgICAgICAgICB0aGlzLm1pbi5zdWIoIHZlY3RvciApOworICAg
ICAgICAgICAgdGhpcy5tYXguYWRkKCB2ZWN0b3IgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRo
aXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBleHBhbmRCeVNjYWxhcjogZnVuY3Rpb24gKCBz
Y2FsYXIgKSB7CisKKyAgICAgICAgICAgIHRoaXMubWluLmFkZFNjYWxhciggLSBzY2FsYXIgKTsK
KyAgICAgICAgICAgIHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZXhwYW5kQnlPYmplY3Q6IGZ1
bmN0aW9uICgpIHsKKworICAgICAgICAgICAgLy8gQ29tcHV0ZXMgdGhlIHdvcmxkLWF4aXMtYWxp
Z25lZCBib3VuZGluZyBib3ggb2YgYW4gb2JqZWN0IChpbmNsdWRpbmcgaXRzIGNoaWxkcmVuKSwK
KyAgICAgICAgICAgIC8vIGFjY291bnRpbmcgZm9yIGJvdGggdGhlIG9iamVjdCdzLCBhbmQgY2hp
bGRyZW4ncywgd29ybGQgdHJhbnNmb3JtcworCisgICAgICAgICAgICB2YXIgdjEgPSBuZXcgVmVj
dG9yMygpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gZXhwYW5kQnlPYmplY3QoIG9i
amVjdCApIHsKKworICAgICAgICAgICAgICAgIHZhciBzY29wZSA9IHRoaXM7CisKKyAgICAgICAg
ICAgICAgICBvYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKKworICAgICAgICAgICAg
ICAgIG9iamVjdC50cmF2ZXJzZSggZnVuY3Rpb24gKCBub2RlICkgeworCisgICAgICAgICAgICAg
ICAgICAgIHZhciBpLCBsOworCisgICAgICAgICAgICAgICAgICAgIHZhciBnZW9tZXRyeSA9IG5v
ZGUuZ2VvbWV0cnk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBnZW9tZXRyeSAhPT0gdW5k
ZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGdlb21ldHJ5LmlzR2Vv
bWV0cnkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmVydGljZXMgPSBn
ZW9tZXRyeS52ZXJ0aWNlczsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIGkg
PSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB2MS5jb3B5KCB2ZXJ0aWNlc1sgaSBdICk7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHYxLmFwcGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCAp
OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmV4cGFuZEJ5UG9pbnQo
IHYxICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmli
dXRlcy5wb3NpdGlvbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYXR0cmli
dXRlICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Zm9yICggaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MS5mcm9tQnVmZmVyQXR0cmlidXRlKCBh
dHRyaWJ1dGUsIGkgKS5hcHBseU1hdHJpeDQoIG5vZGUubWF0cml4V29ybGQgKTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuZXhwYW5kQnlQb2ludCggdjEgKTsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9ICk7CisKKyAgICAgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9KCksCisKKyAgICAgICAgY29u
dGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKKworICAgICAgICAgICAgcmV0dXJuIHBv
aW50LnggPCB0aGlzLm1pbi54IHx8IHBvaW50LnggPiB0aGlzLm1heC54IHx8CisgICAgICAgICAg
ICAgICAgcG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgfHwKKyAg
ICAgICAgICAgICAgICBwb2ludC56IDwgdGhpcy5taW4ueiB8fCBwb2ludC56ID4gdGhpcy5tYXgu
eiA/IGZhbHNlIDogdHJ1ZTsKKworICAgICAgICB9LAorCisgICAgICAgIGNvbnRhaW5zQm94OiBm
dW5jdGlvbiAoIGJveCApIHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMubWluLnggPD0gYm94
Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmCisgICAgICAgICAgICAgICAgdGhp
cy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4LnkgJiYKKyAgICAg
ICAgICAgICAgICB0aGlzLm1pbi56IDw9IGJveC5taW4ueiAmJiBib3gubWF4LnogPD0gdGhpcy5t
YXguejsKKworICAgICAgICB9LAorCisgICAgICAgIGdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBw
b2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CisKKyAgICAgICAgICAgIC8vIFRoaXMgY2FuIHBvdGVu
dGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94CisgICAgICAgICAgICAvLyBo
YXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLgorCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb3B0
aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dC5zZXQoCisgICAgICAgICAgICAgICAgKCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlz
Lm1heC54IC0gdGhpcy5taW4ueCApLAorICAgICAgICAgICAgICAgICggcG9pbnQueSAtIHRoaXMu
bWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKSwKKyAgICAgICAgICAgICAgICAo
IHBvaW50LnogLSB0aGlzLm1pbi56ICkgLyAoIHRoaXMubWF4LnogLSB0aGlzLm1pbi56ICkKKyAg
ICAgICAgICAgICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBpbnRlcnNlY3RzQm94OiBmdW5j
dGlvbiAoIGJveCApIHsKKworICAgICAgICAgICAgLy8gdXNpbmcgNiBzcGxpdHRpbmcgcGxhbmVz
IHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnMuCisgICAgICAgICAgICByZXR1cm4gYm94Lm1heC54
IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8CisgICAgICAgICAgICAg
ICAgYm94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55IHx8Cisg
ICAgICAgICAgICAgICAgYm94Lm1heC56IDwgdGhpcy5taW4ueiB8fCBib3gubWluLnogPiB0aGlz
Lm1heC56ID8gZmFsc2UgOiB0cnVlOworCisgICAgICAgIH0sCisKKyAgICAgICAgaW50ZXJzZWN0
c1NwaGVyZTogKCBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciBjbG9zZXN0UG9pbnQg
PSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0
c1NwaGVyZSggc3BoZXJlICkgeworCisgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgcG9pbnQg
b24gdGhlIEFBQkIgY2xvc2VzdCB0byB0aGUgc3BoZXJlIGNlbnRlci4KKyAgICAgICAgICAgICAg
ICB0aGlzLmNsYW1wUG9pbnQoIHNwaGVyZS5jZW50ZXIsIGNsb3Nlc3RQb2ludCApOworCisgICAg
ICAgICAgICAgICAgLy8gSWYgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgdGhlIEFB
QkIgYW5kIHNwaGVyZSBpbnRlcnNlY3QuCisgICAgICAgICAgICAgICAgcmV0dXJuIGNsb3Nlc3RQ
b2ludC5kaXN0YW5jZVRvU3F1YXJlZCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1
cyAqIHNwaGVyZS5yYWRpdXMgKTsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9ICkoKSwK
KworICAgICAgICBpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7CisKKyAgICAg
ICAgICAgIC8vIFdlIGNvbXB1dGUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZG90IHByb2R1Y3Qg
dmFsdWVzLiBJZiB0aG9zZSB2YWx1ZXMKKyAgICAgICAgICAgIC8vIGFyZSBvbiB0aGUgc2FtZSBz
aWRlIChiYWNrIG9yIGZyb250KSBvZiB0aGUgcGxhbmUsIHRoZW4gdGhlcmUgaXMgbm8gaW50ZXJz
ZWN0aW9uLgorCisgICAgICAgICAgICB2YXIgbWluLCBtYXg7CisKKyAgICAgICAgICAgIGlmICgg
cGxhbmUubm9ybWFsLnggPiAwICkgeworCisgICAgICAgICAgICAgICAgbWluID0gcGxhbmUubm9y
bWFsLnggKiB0aGlzLm1pbi54OworICAgICAgICAgICAgICAgIG1heCA9IHBsYW5lLm5vcm1hbC54
ICogdGhpcy5tYXgueDsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAg
IG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDsKKyAgICAgICAgICAgICAgICBtYXgg
PSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgaWYgKCBwbGFuZS5ub3JtYWwueSA+IDAgKSB7CisKKyAgICAgICAgICAgICAgICBtaW4g
Kz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55OworICAgICAgICAgICAgICAgIG1heCArPSBw
bGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAg
ICAgICAgICAgICAgICBtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55OworICAgICAg
ICAgICAgICAgIG1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWluLnk7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaWYgKCBwbGFuZS5ub3JtYWwueiA+IDAgKSB7CisKKyAgICAg
ICAgICAgICAgICBtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56OworICAgICAgICAg
ICAgICAgIG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7CisKKyAgICAgICAgICAg
IH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICBtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlz
Lm1heC56OworICAgICAgICAgICAgICAgIG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWlu
Lno7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICggbWluIDw9IHBsYW5l
LmNvbnN0YW50ICYmIG1heCA+PSBwbGFuZS5jb25zdGFudCApOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgY2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CisK
KyAgICAgICAgICAgIHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygp
OworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1p
biwgdGhpcy5tYXggKTsKKworICAgICAgICB9LAorCisgICAgICAgIGRpc3RhbmNlVG9Qb2ludDog
ZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCisg
ICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHsKKwor
ICAgICAgICAgICAgICAgIHZhciBjbGFtcGVkUG9pbnQgPSB2MS5jb3B5KCBwb2ludCApLmNsYW1w
KCB0aGlzLm1pbiwgdGhpcy5tYXggKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXBlZFBv
aW50LnN1YiggcG9pbnQgKS5sZW5ndGgoKTsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9
KCksCisKKyAgICAgICAgZ2V0Qm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHsKKworICAgICAg
ICAgICAgdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0
aW9uIGdldEJvdW5kaW5nU3BoZXJlKCBvcHRpb25hbFRhcmdldCApIHsKKworICAgICAgICAgICAg
ICAgIHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgU3BoZXJlKCk7CisKKyAgICAg
ICAgICAgICAgICB0aGlzLmdldENlbnRlciggcmVzdWx0LmNlbnRlciApOworCisgICAgICAgICAg
ICAgICAgcmVzdWx0LnJhZGl1cyA9IHRoaXMuZ2V0U2l6ZSggdjEgKS5sZW5ndGgoKSAqIDAuNTsK
KworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAgICAgIH07CisKKyAg
ICAgICAgfSgpLAorCisgICAgICAgIGludGVyc2VjdDogZnVuY3Rpb24gKCBib3ggKSB7CisKKyAg
ICAgICAgICAgIHRoaXMubWluLm1heCggYm94Lm1pbiApOworICAgICAgICAgICAgdGhpcy5tYXgu
bWluKCBib3gubWF4ICk7CisKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGlmIHRoZXJlIGlz
IG5vIG92ZXJsYXAsIHRoZSByZXN1bHQgaXMgZnVsbHkgZW1wdHksIG5vdCBzbGlnaHRseSBlbXB0
eSB3aXRoIG5vbi1pbmYvK2luZiB2YWx1ZXMgdGhhdCB3aWxsIGNhdXNlIHN1YnNlcXVlbmNlIGlu
dGVyc2VjdHMgdG8gZXJyb25lb3VzbHkgcmV0dXJuIHZhbGlkIHZhbHVlcy4KKyAgICAgICAgICAg
IGlmKCB0aGlzLmlzRW1wdHkoKSApIHRoaXMubWFrZUVtcHR5KCk7CisKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgdW5pb246IGZ1bmN0aW9uICggYm94
ICkgeworCisgICAgICAgICAgICB0aGlzLm1pbi5taW4oIGJveC5taW4gKTsKKyAgICAgICAgICAg
IHRoaXMubWF4Lm1heCggYm94Lm1heCApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKwor
ICAgICAgICB9LAorCisgICAgICAgIGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCkgeworCisgICAg
ICAgICAgICB2YXIgcG9pbnRzID0gWworICAgICAgICAgICAgICAgIG5ldyBWZWN0b3IzKCksCisg
ICAgICAgICAgICAgICAgbmV3IFZlY3RvcjMoKSwKKyAgICAgICAgICAgICAgICBuZXcgVmVjdG9y
MygpLAorICAgICAgICAgICAgICAgIG5ldyBWZWN0b3IzKCksCisgICAgICAgICAgICAgICAgbmV3
IFZlY3RvcjMoKSwKKyAgICAgICAgICAgICAgICBuZXcgVmVjdG9yMygpLAorICAgICAgICAgICAg
ICAgIG5ldyBWZWN0b3IzKCksCisgICAgICAgICAgICAgICAgbmV3IFZlY3RvcjMoKQorICAgICAg
ICAgICAgXTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGFwcGx5TWF0cml4NCggbWF0
cml4ICkgeworCisgICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtIG9mIGVtcHR5IGJveCBpcyBh
biBlbXB0eSBib3guCisgICAgICAgICAgICAgICAgaWYoIHRoaXMuaXNFbXB0eSgpICkgcmV0dXJu
IHRoaXM7CisKKyAgICAgICAgICAgICAgICAvLyBOT1RFOiBJIGFtIHVzaW5nIGEgYmluYXJ5IHBh
dHRlcm4gdG8gc3BlY2lmeSBhbGwgMl4zIGNvbWJpbmF0aW9ucyBiZWxvdworICAgICAgICAgICAg
ICAgIHBvaW50c1sgMCBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiAp
LmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMAorICAgICAgICAgICAgICAgIHBvaW50c1sg
MSBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4
NCggbWF0cml4ICk7IC8vIDAwMQorICAgICAgICAgICAgICAgIHBvaW50c1sgMiBdLnNldCggdGhp
cy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7
IC8vIDAxMAorICAgICAgICAgICAgICAgIHBvaW50c1sgMyBdLnNldCggdGhpcy5taW4ueCwgdGhp
cy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMQorICAg
ICAgICAgICAgICAgIHBvaW50c1sgNCBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhp
cy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMAorICAgICAgICAgICAgICAg
IHBvaW50c1sgNSBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFw
cGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMQorICAgICAgICAgICAgICAgIHBvaW50c1sgNiBd
LnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCgg
bWF0cml4ICk7IC8vIDExMAorICAgICAgICAgICAgICAgIHBvaW50c1sgNyBdLnNldCggdGhpcy5t
YXgueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7ICAg
Ly8gMTExCisKKyAgICAgICAgICAgICAgICB0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApOwor
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgIH07CisKKyAgICAg
ICAgfSgpLAorCisgICAgICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7CisKKyAg
ICAgICAgICAgIHRoaXMubWluLmFkZCggb2Zmc2V0ICk7CisgICAgICAgICAgICB0aGlzLm1heC5h
ZGQoIG9mZnNldCApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAor
CisgICAgICAgIGVxdWFsczogZnVuY3Rpb24gKCBib3ggKSB7CisKKyAgICAgICAgICAgIHJldHVy
biBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXgg
KTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIGJo
b3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8v
bXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFNwaGVyZSggY2VudGVyLCByYWRp
dXMgKSB7CisKKyAgICAgICAgdGhpcy5jZW50ZXIgPSAoIGNlbnRlciAhPT0gdW5kZWZpbmVkICkg
PyBjZW50ZXIgOiBuZXcgVmVjdG9yMygpOworICAgICAgICB0aGlzLnJhZGl1cyA9ICggcmFkaXVz
ICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDA7CisKKyAgICB9CisKKyAgICBPYmplY3QuYXNz
aWduKCBTcGhlcmUucHJvdG90eXBlLCB7CisKKyAgICAgICAgc2V0OiBmdW5jdGlvbiAoIGNlbnRl
ciwgcmFkaXVzICkgeworCisgICAgICAgICAgICB0aGlzLmNlbnRlci5jb3B5KCBjZW50ZXIgKTsK
KyAgICAgICAgICAgIHRoaXMucmFkaXVzID0gcmFkaXVzOworCisgICAgICAgICAgICByZXR1cm4g
dGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICgp
IHsKKworICAgICAgICAgICAgdmFyIGJveCA9IG5ldyBCb3gzKCk7CisKKyAgICAgICAgICAgIHJl
dHVybiBmdW5jdGlvbiBzZXRGcm9tUG9pbnRzKCBwb2ludHMsIG9wdGlvbmFsQ2VudGVyICkgewor
CisgICAgICAgICAgICAgICAgdmFyIGNlbnRlciA9IHRoaXMuY2VudGVyOworCisgICAgICAgICAg
ICAgICAgaWYgKCBvcHRpb25hbENlbnRlciAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAg
ICAgICAgICAgIGNlbnRlci5jb3B5KCBvcHRpb25hbENlbnRlciApOworCisgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICBib3guc2V0RnJvbVBvaW50cyggcG9p
bnRzICkuZ2V0Q2VudGVyKCBjZW50ZXIgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIHZhciBtYXhSYWRpdXNTcSA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2
YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisgICAgICAg
ICAgICAgICAgICAgIG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIu
ZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50c1sgaSBdICkgKTsKKworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSAp
OworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgIH07CisKKyAg
ICAgICAgfSgpLAorCisgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAg
IHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKworICAgICAgICB9
LAorCisgICAgICAgIGNvcHk6IGZ1bmN0aW9uICggc3BoZXJlICkgeworCisgICAgICAgICAgICB0
aGlzLmNlbnRlci5jb3B5KCBzcGhlcmUuY2VudGVyICk7CisgICAgICAgICAgICB0aGlzLnJhZGl1
cyA9IHNwaGVyZS5yYWRpdXM7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAg
IH0sCisKKyAgICAgICAgZW1wdHk6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgcmV0dXJu
ICggdGhpcy5yYWRpdXMgPD0gMCApOworCisgICAgICAgIH0sCisKKyAgICAgICAgY29udGFpbnNQ
b2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKKworICAgICAgICAgICAgcmV0dXJuICggcG9pbnQu
ZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCB0aGlzLnJhZGl1cyAqIHRoaXMu
cmFkaXVzICkgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGRpc3RhbmNlVG9Qb2ludDogZnVu
Y3Rpb24gKCBwb2ludCApIHsKKworICAgICAgICAgICAgcmV0dXJuICggcG9pbnQuZGlzdGFuY2VU
byggdGhpcy5jZW50ZXIgKSAtIHRoaXMucmFkaXVzICk7CisKKyAgICAgICAgfSwKKworICAgICAg
ICBpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHsKKworICAgICAgICAgICAg
dmFyIHJhZGl1c1N1bSA9IHRoaXMucmFkaXVzICsgc3BoZXJlLnJhZGl1czsKKworICAgICAgICAg
ICAgcmV0dXJuIHNwaGVyZS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkg
PD0gKCByYWRpdXNTdW0gKiByYWRpdXNTdW0gKTsKKworICAgICAgICB9LAorCisgICAgICAgIGlu
dGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkgeworCisgICAgICAgICAgICByZXR1cm4gYm94
LmludGVyc2VjdHNTcGhlcmUoIHRoaXMgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGludGVy
c2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHsKKworICAgICAgICAgICAgLy8gV2UgdXNl
IHRoZSBmb2xsb3dpbmcgZXF1YXRpb24gdG8gY29tcHV0ZSB0aGUgc2lnbmVkIGRpc3RhbmNlIGZy
b20KKyAgICAgICAgICAgIC8vIHRoZSBjZW50ZXIgb2YgdGhlIHNwaGVyZSB0byB0aGUgcGxhbmUu
CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZGlzdGFuY2UgPSBxICogbiAtIGQKKyAg
ICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB0aGlzIGRpc3RhbmNlIGlzIGdyZWF0ZXIg
dGhhbiB0aGUgcmFkaXVzIG9mIHRoZSBzcGhlcmUsCisgICAgICAgICAgICAvLyB0aGVuIHRoZXJl
IGlzIG5vIGludGVyc2VjdGlvbi4KKworICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKCB0aGlz
LmNlbnRlci5kb3QoIHBsYW5lLm5vcm1hbCApIC0gcGxhbmUuY29uc3RhbnQgKSA8PSB0aGlzLnJh
ZGl1czsKKworICAgICAgICB9LAorCisgICAgICAgIGNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9p
bnQsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICB2YXIgZGVsdGFMZW5ndGhTcSA9
IHRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApOworCisgICAgICAgICAgICB2
YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKworICAgICAgICAg
ICAgcmVzdWx0LmNvcHkoIHBvaW50ICk7CisKKyAgICAgICAgICAgIGlmICggZGVsdGFMZW5ndGhT
cSA+ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICkgeworCisgICAgICAgICAgICAgICAg
cmVzdWx0LnN1YiggdGhpcy5jZW50ZXIgKS5ub3JtYWxpemUoKTsKKyAgICAgICAgICAgICAgICBy
ZXN1bHQubXVsdGlwbHlTY2FsYXIoIHRoaXMucmFkaXVzICkuYWRkKCB0aGlzLmNlbnRlciApOwor
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAg
fSwKKworICAgICAgICBnZXRCb3VuZGluZ0JveDogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCAp
IHsKKworICAgICAgICAgICAgdmFyIGJveCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBCb3gzKCk7
CisKKyAgICAgICAgICAgIGJveC5zZXQoIHRoaXMuY2VudGVyLCB0aGlzLmNlbnRlciApOworICAg
ICAgICAgICAgYm94LmV4cGFuZEJ5U2NhbGFyKCB0aGlzLnJhZGl1cyApOworCisgICAgICAgICAg
ICByZXR1cm4gYm94OworCisgICAgICAgIH0sCisKKyAgICAgICAgYXBwbHlNYXRyaXg0OiBmdW5j
dGlvbiAoIG1hdHJpeCApIHsKKworICAgICAgICAgICAgdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0
KCBtYXRyaXggKTsKKyAgICAgICAgICAgIHRoaXMucmFkaXVzID0gdGhpcy5yYWRpdXMgKiBtYXRy
aXguZ2V0TWF4U2NhbGVPbkF4aXMoKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAg
ICAgICAgfSwKKworICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkgeworCisg
ICAgICAgICAgICB0aGlzLmNlbnRlci5hZGQoIG9mZnNldCApOworCisgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGVxdWFsczogZnVuY3Rpb24gKCBzcGhl
cmUgKSB7CisKKyAgICAgICAgICAgIHJldHVybiBzcGhlcmUuY2VudGVyLmVxdWFscyggdGhpcy5j
ZW50ZXIgKSAmJiAoIHNwaGVyZS5yYWRpdXMgPT09IHRoaXMucmFkaXVzICk7CisKKyAgICAgICAg
fQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6
Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDov
L2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKyAgICAgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDov
L2NsYXJhLmlvCisgICAgICogQGF1dGhvciB0c2NodworICAgICAqLworCisgICAgZnVuY3Rpb24g
TWF0cml4MygpIHsKKworICAgICAgICB0aGlzLmVsZW1lbnRzID0gWworCisgICAgICAgICAgICAx
LCAwLCAwLAorICAgICAgICAgICAgMCwgMSwgMCwKKyAgICAgICAgICAgIDAsIDAsIDEKKworICAg
ICAgICBdOworCisgICAgICAgIGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7CisKKyAgICAg
ICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8g
bG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTsKKworICAgICAg
ICB9CisKKyAgICB9CisKKyAgICBPYmplY3QuYXNzaWduKCBNYXRyaXgzLnByb3RvdHlwZSwgewor
CisgICAgICAgIGlzTWF0cml4MzogdHJ1ZSwKKworICAgICAgICBzZXQ6IGZ1bmN0aW9uICggbjEx
LCBuMTIsIG4xMywgbjIxLCBuMjIsIG4yMywgbjMxLCBuMzIsIG4zMyApIHsKKworICAgICAgICAg
ICAgdmFyIHRlID0gdGhpcy5lbGVtZW50czsKKworICAgICAgICAgICAgdGVbIDAgXSA9IG4xMTsg
dGVbIDEgXSA9IG4yMTsgdGVbIDIgXSA9IG4zMTsKKyAgICAgICAgICAgIHRlWyAzIF0gPSBuMTI7
IHRlWyA0IF0gPSBuMjI7IHRlWyA1IF0gPSBuMzI7CisgICAgICAgICAgICB0ZVsgNiBdID0gbjEz
OyB0ZVsgNyBdID0gbjIzOyB0ZVsgOCBdID0gbjMzOworCisgICAgICAgICAgICByZXR1cm4gdGhp
czsKKworICAgICAgICB9LAorCisgICAgICAgIGlkZW50aXR5OiBmdW5jdGlvbiAoKSB7CisKKyAg
ICAgICAgICAgIHRoaXMuc2V0KAorCisgICAgICAgICAgICAgICAgMSwgMCwgMCwKKyAgICAgICAg
ICAgICAgICAwLCAxLCAwLAorICAgICAgICAgICAgICAgIDAsIDAsIDEKKworICAgICAgICAgICAg
KTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBj
bG9uZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3Ry
dWN0b3IoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTsKKworICAgICAgICB9LAorCisgICAg
ICAgIGNvcHk6IGZ1bmN0aW9uICggbSApIHsKKworICAgICAgICAgICAgdmFyIHRlID0gdGhpcy5l
bGVtZW50czsKKyAgICAgICAgICAgIHZhciBtZSA9IG0uZWxlbWVudHM7CisKKyAgICAgICAgICAg
IHRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07
CisgICAgICAgICAgICB0ZVsgMyBdID0gbWVbIDMgXTsgdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1
IF0gPSBtZVsgNSBdOworICAgICAgICAgICAgdGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBt
ZVsgNyBdOyB0ZVsgOCBdID0gbWVbIDggXTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisK
KyAgICAgICAgfSwKKworICAgICAgICBzZXRGcm9tTWF0cml4NDogZnVuY3Rpb24gKCBtICkgewor
CisgICAgICAgICAgICB2YXIgbWUgPSBtLmVsZW1lbnRzOworCisgICAgICAgICAgICB0aGlzLnNl
dCgKKworICAgICAgICAgICAgICAgIG1lWyAwIF0sIG1lWyA0IF0sIG1lWyAgOCBdLAorICAgICAg
ICAgICAgICAgIG1lWyAxIF0sIG1lWyA1IF0sIG1lWyAgOSBdLAorICAgICAgICAgICAgICAgIG1l
WyAyIF0sIG1lWyA2IF0sIG1lWyAxMCBdCisKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgYXBwbHlUb0J1ZmZlckF0dHJp
YnV0ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdjEgPSBuZXcgVmVjdG9yMygp
OworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSgg
YXR0cmlidXRlICkgeworCisgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0gYXR0
cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICB2MS54
ID0gYXR0cmlidXRlLmdldFgoIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgdjEueSA9IGF0dHJp
YnV0ZS5nZXRZKCBpICk7CisgICAgICAgICAgICAgICAgICAgIHYxLnogPSBhdHRyaWJ1dGUuZ2V0
WiggaSApOworCisgICAgICAgICAgICAgICAgICAgIHYxLmFwcGx5TWF0cml4MyggdGhpcyApOwor
CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXRYWVooIGksIHYxLngsIHYxLnksIHYx
LnogKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBhdHRy
aWJ1dGU7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIG11bHRp
cGx5OiBmdW5jdGlvbiAoIG0gKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm11bHRpcGx5
TWF0cmljZXMoIHRoaXMsIG0gKTsKKworICAgICAgICB9LAorCisgICAgICAgIHByZW11bHRpcGx5
OiBmdW5jdGlvbiAoIG0gKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm11bHRpcGx5TWF0
cmljZXMoIG0sIHRoaXMgKTsKKworICAgICAgICB9LAorCisgICAgICAgIG11bHRpcGx5TWF0cmlj
ZXM6IGZ1bmN0aW9uICggYSwgYiApIHsKKworICAgICAgICAgICAgdmFyIGFlID0gYS5lbGVtZW50
czsKKyAgICAgICAgICAgIHZhciBiZSA9IGIuZWxlbWVudHM7CisgICAgICAgICAgICB2YXIgdGUg
PSB0aGlzLmVsZW1lbnRzOworCisgICAgICAgICAgICB2YXIgYTExID0gYWVbIDAgXSwgYTEyID0g
YWVbIDMgXSwgYTEzID0gYWVbIDYgXTsKKyAgICAgICAgICAgIHZhciBhMjEgPSBhZVsgMSBdLCBh
MjIgPSBhZVsgNCBdLCBhMjMgPSBhZVsgNyBdOworICAgICAgICAgICAgdmFyIGEzMSA9IGFlWyAy
IF0sIGEzMiA9IGFlWyA1IF0sIGEzMyA9IGFlWyA4IF07CisKKyAgICAgICAgICAgIHZhciBiMTEg
PSBiZVsgMCBdLCBiMTIgPSBiZVsgMyBdLCBiMTMgPSBiZVsgNiBdOworICAgICAgICAgICAgdmFy
IGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA0IF0sIGIyMyA9IGJlWyA3IF07CisgICAgICAgICAg
ICB2YXIgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDUgXSwgYjMzID0gYmVbIDggXTsKKworICAg
ICAgICAgICAgdGVbIDAgXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSArIGExMyAqIGIzMTsKKyAg
ICAgICAgICAgIHRlWyAzIF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzI7Cisg
ICAgICAgICAgICB0ZVsgNiBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzOwor
CisgICAgICAgICAgICB0ZVsgMSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMx
OworICAgICAgICAgICAgdGVbIDQgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIz
MjsKKyAgICAgICAgICAgIHRlWyA3IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBi
MzM7CisKKyAgICAgICAgICAgIHRlWyAyIF0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMg
KiBiMzE7CisgICAgICAgICAgICB0ZVsgNSBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMz
ICogYjMyOworICAgICAgICAgICAgdGVbIDggXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEz
MyAqIGIzMzsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAg
ICAgICBtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkgeworCisgICAgICAgICAgICB2YXIg
dGUgPSB0aGlzLmVsZW1lbnRzOworCisgICAgICAgICAgICB0ZVsgMCBdICo9IHM7IHRlWyAzIF0g
Kj0gczsgdGVbIDYgXSAqPSBzOworICAgICAgICAgICAgdGVbIDEgXSAqPSBzOyB0ZVsgNCBdICo9
IHM7IHRlWyA3IF0gKj0gczsKKyAgICAgICAgICAgIHRlWyAyIF0gKj0gczsgdGVbIDUgXSAqPSBz
OyB0ZVsgOCBdICo9IHM7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0s
CisKKyAgICAgICAgZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFy
IHRlID0gdGhpcy5lbGVtZW50czsKKworICAgICAgICAgICAgdmFyIGEgPSB0ZVsgMCBdLCBiID0g
dGVbIDEgXSwgYyA9IHRlWyAyIF0sCisgICAgICAgICAgICAgICAgZCA9IHRlWyAzIF0sIGUgPSB0
ZVsgNCBdLCBmID0gdGVbIDUgXSwKKyAgICAgICAgICAgICAgICBnID0gdGVbIDYgXSwgaCA9IHRl
WyA3IF0sIGkgPSB0ZVsgOCBdOworCisgICAgICAgICAgICByZXR1cm4gYSAqIGUgKiBpIC0gYSAq
IGYgKiBoIC0gYiAqIGQgKiBpICsgYiAqIGYgKiBnICsgYyAqIGQgKiBoIC0gYyAqIGUgKiBnOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0SW52ZXJzZTogZnVuY3Rpb24gKCBtYXRyaXgsIHRo
cm93T25EZWdlbmVyYXRlICkgeworCisgICAgICAgICAgICBpZiAoIG1hdHJpeCAmJiBtYXRyaXgu
aXNNYXRyaXg0ICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvciggIlRIUkVFLk1h
dHJpeDMuZ2V0SW52ZXJzZSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LiIgKTsK
KworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbWUgPSBtYXRyaXguZWxlbWVudHMs
CisgICAgICAgICAgICAgICAgdGUgPSB0aGlzLmVsZW1lbnRzLAorCisgICAgICAgICAgICAgICAg
bjExID0gbWVbIDAgXSwgbjIxID0gbWVbIDEgXSwgbjMxID0gbWVbIDIgXSwKKyAgICAgICAgICAg
ICAgICBuMTIgPSBtZVsgMyBdLCBuMjIgPSBtZVsgNCBdLCBuMzIgPSBtZVsgNSBdLAorICAgICAg
ICAgICAgICAgIG4xMyA9IG1lWyA2IF0sIG4yMyA9IG1lWyA3IF0sIG4zMyA9IG1lWyA4IF0sCisK
KyAgICAgICAgICAgICAgICB0MTEgPSBuMzMgKiBuMjIgLSBuMzIgKiBuMjMsCisgICAgICAgICAg
ICAgICAgdDEyID0gbjMyICogbjEzIC0gbjMzICogbjEyLAorICAgICAgICAgICAgICAgIHQxMyA9
IG4yMyAqIG4xMiAtIG4yMiAqIG4xMywKKworICAgICAgICAgICAgICAgIGRldCA9IG4xMSAqIHQx
MSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMzsKKworICAgICAgICAgICAgaWYgKCBkZXQgPT09IDAg
KSB7CisKKyAgICAgICAgICAgICAgICB2YXIgbXNnID0gIlRIUkVFLk1hdHJpeDMuZ2V0SW52ZXJz
ZSgpOiBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIjsKKworICAgICAgICAg
ICAgICAgIGlmICggdGhyb3dPbkRlZ2VuZXJhdGUgPT09IHRydWUgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCBtc2cgKTsKKworICAgICAgICAgICAgICAgIH0gZWxz
ZSB7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCBtc2cgKTsKKworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlkZW50aXR5KCk7CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGRldEludiA9IDEgLyBkZXQ7CisKKyAg
ICAgICAgICAgIHRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7CisgICAgICAgICAgICB0ZVsgMSBdID0g
KCBuMzEgKiBuMjMgLSBuMzMgKiBuMjEgKSAqIGRldEludjsKKyAgICAgICAgICAgIHRlWyAyIF0g
PSAoIG4zMiAqIG4yMSAtIG4zMSAqIG4yMiApICogZGV0SW52OworCisgICAgICAgICAgICB0ZVsg
MyBdID0gdDEyICogZGV0SW52OworICAgICAgICAgICAgdGVbIDQgXSA9ICggbjMzICogbjExIC0g
bjMxICogbjEzICkgKiBkZXRJbnY7CisgICAgICAgICAgICB0ZVsgNSBdID0gKCBuMzEgKiBuMTIg
LSBuMzIgKiBuMTEgKSAqIGRldEludjsKKworICAgICAgICAgICAgdGVbIDYgXSA9IHQxMyAqIGRl
dEludjsKKyAgICAgICAgICAgIHRlWyA3IF0gPSAoIG4yMSAqIG4xMyAtIG4yMyAqIG4xMSApICog
ZGV0SW52OworICAgICAgICAgICAgdGVbIDggXSA9ICggbjIyICogbjExIC0gbjIxICogbjEyICkg
KiBkZXRJbnY7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgdHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciB0bXAsIG0g
PSB0aGlzLmVsZW1lbnRzOworCisgICAgICAgICAgICB0bXAgPSBtWyAxIF07IG1bIDEgXSA9IG1b
IDMgXTsgbVsgMyBdID0gdG1wOworICAgICAgICAgICAgdG1wID0gbVsgMiBdOyBtWyAyIF0gPSBt
WyA2IF07IG1bIDYgXSA9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IG1bIDUgXTsgbVsgNSBdID0g
bVsgNyBdOyBtWyA3IF0gPSB0bXA7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgZ2V0Tm9ybWFsTWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeDQgKSB7
CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KCBtYXRyaXg0ICkuZ2V0
SW52ZXJzZSggdGhpcyApLnRyYW5zcG9zZSgpOworCisgICAgICAgIH0sCisKKyAgICAgICAgdHJh
bnNwb3NlSW50b0FycmF5OiBmdW5jdGlvbiAoIHIgKSB7CisKKyAgICAgICAgICAgIHZhciBtID0g
dGhpcy5lbGVtZW50czsKKworICAgICAgICAgICAgclsgMCBdID0gbVsgMCBdOworICAgICAgICAg
ICAgclsgMSBdID0gbVsgMyBdOworICAgICAgICAgICAgclsgMiBdID0gbVsgNiBdOworICAgICAg
ICAgICAgclsgMyBdID0gbVsgMSBdOworICAgICAgICAgICAgclsgNCBdID0gbVsgNCBdOworICAg
ICAgICAgICAgclsgNSBdID0gbVsgNyBdOworICAgICAgICAgICAgclsgNiBdID0gbVsgMiBdOwor
ICAgICAgICAgICAgclsgNyBdID0gbVsgNSBdOworICAgICAgICAgICAgclsgOCBdID0gbVsgOCBd
OworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGVx
dWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7CisKKyAgICAgICAgICAgIHZhciB0ZSA9IHRoaXMu
ZWxlbWVudHM7CisgICAgICAgICAgICB2YXIgbWUgPSBtYXRyaXguZWxlbWVudHM7CisKKyAgICAg
ICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAg
ICBpZiAoIHRlWyBpIF0gIT09IG1lWyBpIF0gKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgfSwKKworICAgICAgICBm
cm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKKworICAgICAgICAgICAgaWYg
KCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CisKKyAgICAgICAgICAgIGZvciAo
IHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLmVsZW1l
bnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdOworCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgdG9BcnJheTogZnVu
Y3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgeworCisgICAgICAgICAgICBpZiAoIGFycmF5ID09PSB1
bmRlZmluZWQgKSBhcnJheSA9IFtdOworICAgICAgICAgICAgaWYgKCBvZmZzZXQgPT09IHVuZGVm
aW5lZCApIG9mZnNldCA9IDA7CisKKyAgICAgICAgICAgIHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7
CisKKyAgICAgICAgICAgIGFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07CisgICAgICAgICAgICBh
cnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTsKKyAgICAgICAgICAgIGFycmF5WyBvZmZzZXQg
KyAyIF0gPSB0ZVsgMiBdOworCisgICAgICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVb
IDMgXTsKKyAgICAgICAgICAgIGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdOworICAgICAg
ICAgICAgYXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07CisKKyAgICAgICAgICAgIGFycmF5
WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdOworICAgICAgICAgICAgYXJyYXlbIG9mZnNldCArIDcg
XSA9IHRlWyA3IF07CisgICAgICAgICAgICBhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTsK
KworICAgICAgICAgICAgcmV0dXJuIGFycmF5OworCisgICAgICAgIH0KKworICAgIH0gKTsKKwor
ICAgIC8qKgorICAgICAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KKyAgICAg
Ki8KKworICAgIGZ1bmN0aW9uIFBsYW5lKCBub3JtYWwsIGNvbnN0YW50ICkgeworCisgICAgICAg
IHRoaXMubm9ybWFsID0gKCBub3JtYWwgIT09IHVuZGVmaW5lZCApID8gbm9ybWFsIDogbmV3IFZl
Y3RvcjMoIDEsIDAsIDAgKTsKKyAgICAgICAgdGhpcy5jb25zdGFudCA9ICggY29uc3RhbnQgIT09
IHVuZGVmaW5lZCApID8gY29uc3RhbnQgOiAwOworCisgICAgfQorCisgICAgT2JqZWN0LmFzc2ln
biggUGxhbmUucHJvdG90eXBlLCB7CisKKyAgICAgICAgc2V0OiBmdW5jdGlvbiAoIG5vcm1hbCwg
Y29uc3RhbnQgKSB7CisKKyAgICAgICAgICAgIHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApOwor
ICAgICAgICAgICAgdGhpcy5jb25zdGFudCA9IGNvbnN0YW50OworCisgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNldENvbXBvbmVudHM6IGZ1bmN0aW9u
ICggeCwgeSwgeiwgdyApIHsKKworICAgICAgICAgICAgdGhpcy5ub3JtYWwuc2V0KCB4LCB5LCB6
ICk7CisgICAgICAgICAgICB0aGlzLmNvbnN0YW50ID0gdzsKKworICAgICAgICAgICAgcmV0dXJu
IHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQ
b2ludDogZnVuY3Rpb24gKCBub3JtYWwsIHBvaW50ICkgeworCisgICAgICAgICAgICB0aGlzLm5v
cm1hbC5jb3B5KCBub3JtYWwgKTsKKyAgICAgICAgICAgIHRoaXMuY29uc3RhbnQgPSAtIHBvaW50
LmRvdCggdGhpcy5ub3JtYWwgKTsgLy8gbXVzdCBiZSB0aGlzLm5vcm1hbCwgbm90IG5vcm1hbCwg
YXMgdGhpcy5ub3JtYWwgaXMgbm9ybWFsaXplZAorCisgICAgICAgICAgICByZXR1cm4gdGhpczsK
KworICAgICAgICB9LAorCisgICAgICAgIHNldEZyb21Db3BsYW5hclBvaW50czogZnVuY3Rpb24g
KCkgeworCisgICAgICAgICAgICB2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworICAgICAgICAgICAg
dmFyIHYyID0gbmV3IFZlY3RvcjMoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNl
dEZyb21Db3BsYW5hclBvaW50cyggYSwgYiwgYyApIHsKKworICAgICAgICAgICAgICAgIHZhciBu
b3JtYWwgPSB2MS5zdWJWZWN0b3JzKCBjLCBiICkuY3Jvc3MoIHYyLnN1YlZlY3RvcnMoIGEsIGIg
KSApLm5vcm1hbGl6ZSgpOworCisgICAgICAgICAgICAgICAgLy8gUTogc2hvdWxkIGFuIGVycm9y
IGJlIHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT8KKwor
ICAgICAgICAgICAgICAgIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoIG5vcm1h
bCwgYSApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgIH07
CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CisKKyAgICAg
ICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKworICAg
ICAgICB9LAorCisgICAgICAgIGNvcHk6IGZ1bmN0aW9uICggcGxhbmUgKSB7CisKKyAgICAgICAg
ICAgIHRoaXMubm9ybWFsLmNvcHkoIHBsYW5lLm5vcm1hbCApOworICAgICAgICAgICAgdGhpcy5j
b25zdGFudCA9IHBsYW5lLmNvbnN0YW50OworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKwor
ICAgICAgICB9LAorCisgICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICAvLyBOb3RlOiB3aWxsIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgcGxhbmUg
aXMgaW52YWxpZC4KKworICAgICAgICAgICAgdmFyIGludmVyc2VOb3JtYWxMZW5ndGggPSAxLjAg
LyB0aGlzLm5vcm1hbC5sZW5ndGgoKTsKKyAgICAgICAgICAgIHRoaXMubm9ybWFsLm11bHRpcGx5
U2NhbGFyKCBpbnZlcnNlTm9ybWFsTGVuZ3RoICk7CisgICAgICAgICAgICB0aGlzLmNvbnN0YW50
ICo9IGludmVyc2VOb3JtYWxMZW5ndGg7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisg
ICAgICAgIH0sCisKKyAgICAgICAgbmVnYXRlOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAg
IHRoaXMuY29uc3RhbnQgKj0gLSAxOworICAgICAgICAgICAgdGhpcy5ub3JtYWwubmVnYXRlKCk7
CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZGlz
dGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgeworCisgICAgICAgICAgICByZXR1cm4g
dGhpcy5ub3JtYWwuZG90KCBwb2ludCApICsgdGhpcy5jb25zdGFudDsKKworICAgICAgICB9LAor
CisgICAgICAgIGRpc3RhbmNlVG9TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkgeworCisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSAtIHNw
aGVyZS5yYWRpdXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBwcm9qZWN0UG9pbnQ6IGZ1bmN0
aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICByZXR1cm4gdGhp
cy5vcnRob1BvaW50KCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKS5zdWIoIHBvaW50ICkubmVnYXRl
KCk7CisKKyAgICAgICAgfSwKKworICAgICAgICBvcnRob1BvaW50OiBmdW5jdGlvbiAoIHBvaW50
LCBvcHRpb25hbFRhcmdldCApIHsKKworICAgICAgICAgICAgdmFyIHBlcnBlbmRpY3VsYXJNYWdu
aXR1ZGUgPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKTsKKworICAgICAgICAgICAgdmFy
IHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIHBlcnBlbmRp
Y3VsYXJNYWduaXR1ZGUgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGludGVyc2VjdExpbmU6
IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKwor
ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdExpbmUoIGxpbmUsIG9wdGlvbmFs
VGFyZ2V0ICkgeworCisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0
IHx8IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gbGlu
ZS5kZWx0YSggdjEgKTsKKworICAgICAgICAgICAgICAgIHZhciBkZW5vbWluYXRvciA9IHRoaXMu
bm9ybWFsLmRvdCggZGlyZWN0aW9uICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGRlbm9taW5h
dG9yID09PSAwICkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgaXMgY29wbGFuYXIs
IHJldHVybiBvcmlnaW4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzLmRpc3RhbmNlVG9Q
b2ludCggbGluZS5zdGFydCApID09PSAwICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0LmNvcHkoIGxpbmUuc3RhcnQgKTsKKworICAgICAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5zdXJlIGlmIHRoaXMgaXMgdGhlIGNvcnJlY3Qg
bWV0aG9kIHRvIGhhbmRsZSB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB1
bmRlZmluZWQ7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgdCA9
IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRl
bm9taW5hdG9yOworCisgICAgICAgICAgICAgICAgaWYgKCB0IDwgMCB8fCB0ID4gMSApIHsKKwor
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworCisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jb3B5KCBkaXJlY3Rpb24gKS5tdWx0
aXBseVNjYWxhciggdCApLmFkZCggbGluZS5zdGFydCApOworCisgICAgICAgICAgICB9OworCisg
ICAgICAgIH0oKSwKKworICAgICAgICBpbnRlcnNlY3RzTGluZTogZnVuY3Rpb24gKCBsaW5lICkg
eworCisgICAgICAgICAgICAvLyBOb3RlOiB0aGlzIHRlc3RzIGlmIGEgbGluZSBpbnRlcnNlY3Rz
IHRoZSBwbGFuZSwgbm90IHdoZXRoZXIgaXQgKG9yIGl0cyBlbmQtcG9pbnRzKSBhcmUgY29wbGFu
YXIgd2l0aCBpdC4KKworICAgICAgICAgICAgdmFyIHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VU
b1BvaW50KCBsaW5lLnN0YXJ0ICk7CisgICAgICAgICAgICB2YXIgZW5kU2lnbiA9IHRoaXMuZGlz
dGFuY2VUb1BvaW50KCBsaW5lLmVuZCApOworCisgICAgICAgICAgICByZXR1cm4gKCBzdGFydFNp
Z24gPCAwICYmIGVuZFNpZ24gPiAwICkgfHwgKCBlbmRTaWduIDwgMCAmJiBzdGFydFNpZ24gPiAw
ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJv
eCApIHsKKworICAgICAgICAgICAgcmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTsK
KworICAgICAgICB9LAorCisgICAgICAgIGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3Bo
ZXJlICkgeworCisgICAgICAgICAgICByZXR1cm4gc3BoZXJlLmludGVyc2VjdHNQbGFuZSggdGhp
cyApOworCisgICAgICAgIH0sCisKKyAgICAgICAgY29wbGFuYXJQb2ludDogZnVuY3Rpb24gKCBv
cHRpb25hbFRhcmdldCApIHsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFy
Z2V0IHx8IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNvcHkoIHRo
aXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApOworCisgICAgICAg
IH0sCisKKyAgICAgICAgYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAg
IHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICB2YXIgbTEgPSBuZXcgTWF0cml4
MygpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXgs
IG9wdGlvbmFsTm9ybWFsTWF0cml4ICkgeworCisgICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5j
ZVBvaW50ID0gdGhpcy5jb3BsYW5hclBvaW50KCB2MSApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7
CisKKyAgICAgICAgICAgICAgICAvLyB0cmFuc2Zvcm0gbm9ybWFsIGJhc2VkIG9uIHRoZW9yeSBo
ZXJlOgorICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cuc29uZ2hvLmNhL29wZW5nbC9nbF9u
b3JtYWx0cmFuc2Zvcm0uaHRtbAorICAgICAgICAgICAgICAgIHZhciBub3JtYWxNYXRyaXggPSBv
cHRpb25hbE5vcm1hbE1hdHJpeCB8fCBtMS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApOworICAg
ICAgICAgICAgICAgIHZhciBub3JtYWwgPSB0aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1h
bE1hdHJpeCApLm5vcm1hbGl6ZSgpOworCisgICAgICAgICAgICAgICAgLy8gcmVjYWxjdWxhdGUg
Y29uc3RhbnQgKGxpa2UgaW4gc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQpCisgICAgICAg
ICAgICAgICAgdGhpcy5jb25zdGFudCA9IC0gcmVmZXJlbmNlUG9pbnQuZG90KCBub3JtYWwgKTsK
KworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgICAgICB9OworCisgICAg
ICAgIH0oKSwKKworICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkgeworCisg
ICAgICAgICAgICB0aGlzLmNvbnN0YW50ID0gdGhpcy5jb25zdGFudCAtIG9mZnNldC5kb3QoIHRo
aXMubm9ybWFsICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisK
KyAgICAgICAgZXF1YWxzOiBmdW5jdGlvbiAoIHBsYW5lICkgeworCisgICAgICAgICAgICByZXR1
cm4gcGxhbmUubm9ybWFsLmVxdWFscyggdGhpcy5ub3JtYWwgKSAmJiAoIHBsYW5lLmNvbnN0YW50
ID09PSB0aGlzLmNvbnN0YW50ICk7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoq
CisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKiBAYXV0
aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworICAgICAqIEBhdXRob3Ig
YmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIEZydXN0
dW0oIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7CisKKyAgICAgICAgdGhpcy5wbGFuZXMgPSBb
CisKKyAgICAgICAgICAgICggcDAgIT09IHVuZGVmaW5lZCApID8gcDAgOiBuZXcgUGxhbmUoKSwK
KyAgICAgICAgICAgICggcDEgIT09IHVuZGVmaW5lZCApID8gcDEgOiBuZXcgUGxhbmUoKSwKKyAg
ICAgICAgICAgICggcDIgIT09IHVuZGVmaW5lZCApID8gcDIgOiBuZXcgUGxhbmUoKSwKKyAgICAg
ICAgICAgICggcDMgIT09IHVuZGVmaW5lZCApID8gcDMgOiBuZXcgUGxhbmUoKSwKKyAgICAgICAg
ICAgICggcDQgIT09IHVuZGVmaW5lZCApID8gcDQgOiBuZXcgUGxhbmUoKSwKKyAgICAgICAgICAg
ICggcDUgIT09IHVuZGVmaW5lZCApID8gcDUgOiBuZXcgUGxhbmUoKQorCisgICAgICAgIF07CisK
KyAgICB9CisKKyAgICBPYmplY3QuYXNzaWduKCBGcnVzdHVtLnByb3RvdHlwZSwgeworCisgICAg
ICAgIHNldDogZnVuY3Rpb24gKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkgeworCisgICAgICAg
ICAgICB2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7CisKKyAgICAgICAgICAgIHBsYW5lc1sgMCBd
LmNvcHkoIHAwICk7CisgICAgICAgICAgICBwbGFuZXNbIDEgXS5jb3B5KCBwMSApOworICAgICAg
ICAgICAgcGxhbmVzWyAyIF0uY29weSggcDIgKTsKKyAgICAgICAgICAgIHBsYW5lc1sgMyBdLmNv
cHkoIHAzICk7CisgICAgICAgICAgICBwbGFuZXNbIDQgXS5jb3B5KCBwNCApOworICAgICAgICAg
ICAgcGxhbmVzWyA1IF0uY29weSggcDUgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisK
KyAgICAgICAgfSwKKworICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAg
ICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisKKyAgICAgICAg
fSwKKworICAgICAgICBjb3B5OiBmdW5jdGlvbiAoIGZydXN0dW0gKSB7CisKKyAgICAgICAgICAg
IHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lczsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAw
OyBpIDwgNjsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHBsYW5lc1sgaSBdLmNvcHkoIGZy
dXN0dW0ucGxhbmVzWyBpIF0gKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNldEZyb21NYXRyaXg6IGZ1bmN0aW9u
ICggbSApIHsKKworICAgICAgICAgICAgdmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzOworICAgICAg
ICAgICAgdmFyIG1lID0gbS5lbGVtZW50czsKKyAgICAgICAgICAgIHZhciBtZTAgPSBtZVsgMCBd
LCBtZTEgPSBtZVsgMSBdLCBtZTIgPSBtZVsgMiBdLCBtZTMgPSBtZVsgMyBdOworICAgICAgICAg
ICAgdmFyIG1lNCA9IG1lWyA0IF0sIG1lNSA9IG1lWyA1IF0sIG1lNiA9IG1lWyA2IF0sIG1lNyA9
IG1lWyA3IF07CisgICAgICAgICAgICB2YXIgbWU4ID0gbWVbIDggXSwgbWU5ID0gbWVbIDkgXSwg
bWUxMCA9IG1lWyAxMCBdLCBtZTExID0gbWVbIDExIF07CisgICAgICAgICAgICB2YXIgbWUxMiA9
IG1lWyAxMiBdLCBtZTEzID0gbWVbIDEzIF0sIG1lMTQgPSBtZVsgMTQgXSwgbWUxNSA9IG1lWyAx
NSBdOworCisgICAgICAgICAgICBwbGFuZXNbIDAgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTAs
IG1lNyAtIG1lNCwgbWUxMSAtIG1lOCwgbWUxNSAtIG1lMTIgKS5ub3JtYWxpemUoKTsKKyAgICAg
ICAgICAgIHBsYW5lc1sgMSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMCwgbWU3ICsgbWU0LCBt
ZTExICsgbWU4LCBtZTE1ICsgbWUxMiApLm5vcm1hbGl6ZSgpOworICAgICAgICAgICAgcGxhbmVz
WyAyIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUxLCBtZTcgKyBtZTUsIG1lMTEgKyBtZTksIG1l
MTUgKyBtZTEzICkubm9ybWFsaXplKCk7CisgICAgICAgICAgICBwbGFuZXNbIDMgXS5zZXRDb21w
b25lbnRzKCBtZTMgLSBtZTEsIG1lNyAtIG1lNSwgbWUxMSAtIG1lOSwgbWUxNSAtIG1lMTMgKS5u
b3JtYWxpemUoKTsKKyAgICAgICAgICAgIHBsYW5lc1sgNCBdLnNldENvbXBvbmVudHMoIG1lMyAt
IG1lMiwgbWU3IC0gbWU2LCBtZTExIC0gbWUxMCwgbWUxNSAtIG1lMTQgKS5ub3JtYWxpemUoKTsK
KyAgICAgICAgICAgIHBsYW5lc1sgNSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMiwgbWU3ICsg
bWU2LCBtZTExICsgbWUxMCwgbWUxNSArIG1lMTQgKS5ub3JtYWxpemUoKTsKKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBpbnRlcnNlY3RzT2JqZWN0
OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7
CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzT2JqZWN0KCBvYmplY3Qg
KSB7CisKKyAgICAgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CisK
KyAgICAgICAgICAgICAgICBpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkK
KyAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CisK
KyAgICAgICAgICAgICAgICBzcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKQor
ICAgICAgICAgICAgICAgICAgICAuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTsK
KworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSAp
OworCisgICAgICAgICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICBpbnRlcnNlY3Rz
U3ByaXRlOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciBzcGhlcmUgPSBuZXcgU3Bo
ZXJlKCk7CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzU3ByaXRlKCBz
cHJpdGUgKSB7CisKKyAgICAgICAgICAgICAgICBzcGhlcmUuY2VudGVyLnNldCggMCwgMCwgMCAp
OworICAgICAgICAgICAgICAgIHNwaGVyZS5yYWRpdXMgPSAwLjcwNzEwNjc4MTE4NjU0NzY7Cisg
ICAgICAgICAgICAgICAgc3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7
CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUg
KTsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9KCksCisKKyAgICAgICAgaW50ZXJzZWN0
c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7CisKKyAgICAgICAgICAgIHZhciBwbGFuZXMg
PSB0aGlzLnBsYW5lczsKKyAgICAgICAgICAgIHZhciBjZW50ZXIgPSBzcGhlcmUuY2VudGVyOwor
ICAgICAgICAgICAgdmFyIG5lZ1JhZGl1cyA9IC0gc3BoZXJlLnJhZGl1czsKKworICAgICAgICAg
ICAgZm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHZh
ciBkaXN0YW5jZSA9IHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggY2VudGVyICk7CisKKyAg
ICAgICAgICAgICAgICBpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkgeworCisgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICB9LAorCisgICAgICAg
IGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIHAxID0gbmV3
IFZlY3RvcjMoKSwKKyAgICAgICAgICAgICAgICBwMiA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAg
ICAgICAgIHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzQm94KCBib3ggKSB7CisKKyAgICAgICAg
ICAgICAgICB2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7CisKKyAgICAgICAgICAgICAgICBmb3Ig
KCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBw
bGFuZSA9IHBsYW5lc1sgaSBdOworCisgICAgICAgICAgICAgICAgICAgIHAxLnggPSBwbGFuZS5u
b3JtYWwueCA+IDAgPyBib3gubWluLnggOiBib3gubWF4Lng7CisgICAgICAgICAgICAgICAgICAg
IHAyLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWF4LnggOiBib3gubWluLng7CisgICAg
ICAgICAgICAgICAgICAgIHAxLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWluLnkgOiBi
b3gubWF4Lnk7CisgICAgICAgICAgICAgICAgICAgIHAyLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAg
PyBib3gubWF4LnkgOiBib3gubWluLnk7CisgICAgICAgICAgICAgICAgICAgIHAxLnogPSBwbGFu
ZS5ub3JtYWwueiA+IDAgPyBib3gubWluLnogOiBib3gubWF4Lno7CisgICAgICAgICAgICAgICAg
ICAgIHAyLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWF4LnogOiBib3gubWluLno7CisK
KyAgICAgICAgICAgICAgICAgICAgdmFyIGQxID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBwMSAp
OworICAgICAgICAgICAgICAgICAgICB2YXIgZDIgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHAy
ICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgYm90aCBvdXRzaWRlIHBsYW5lLCBubyBp
bnRlcnNlY3Rpb24KKworICAgICAgICAgICAgICAgICAgICBpZiAoIGQxIDwgMCAmJiBkMiA8IDAg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9KCksCisKKyAgICAgICAgY29u
dGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKKworICAgICAgICAgICAgdmFyIHBsYW5l
cyA9IHRoaXMucGxhbmVzOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBp
ICsrICkgeworCisgICAgICAgICAgICAgICAgaWYgKCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9p
bnQoIHBvaW50ICkgPCAwICkgeworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0
aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworICAgICAqIEBhdXRob3Ig
bXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBXZWJH
TFNoYWRvd01hcCggX3JlbmRlcmVyLCBfbGlnaHRzLCBfb2JqZWN0cywgY2FwYWJpbGl0aWVzICkg
eworCisgICAgICAgIHZhciBfZ2wgPSBfcmVuZGVyZXIuY29udGV4dCwKKyAgICAgICAgICAgIF9z
dGF0ZSA9IF9yZW5kZXJlci5zdGF0ZSwKKyAgICAgICAgICAgIF9mcnVzdHVtID0gbmV3IEZydXN0
dW0oKSwKKyAgICAgICAgICAgIF9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSwKKwor
ICAgICAgICAgICAgX2xpZ2h0U2hhZG93cyA9IF9saWdodHMuc2hhZG93cywKKworICAgICAgICAg
ICAgX3NoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMigpLAorICAgICAgICAgICAgX21heFNoYWRv
d01hcFNpemUgPSBuZXcgVmVjdG9yMiggY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplLCBjYXBh
YmlsaXRpZXMubWF4VGV4dHVyZVNpemUgKSwKKworICAgICAgICAgICAgX2xvb2tUYXJnZXQgPSBu
ZXcgVmVjdG9yMygpLAorICAgICAgICAgICAgX2xpZ2h0UG9zaXRpb25Xb3JsZCA9IG5ldyBWZWN0
b3IzKCksCisKKyAgICAgICAgICAgIF9Nb3JwaGluZ0ZsYWcgPSAxLAorICAgICAgICAgICAgX1Nr
aW5uaW5nRmxhZyA9IDIsCisKKyAgICAgICAgICAgIF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMg
PSAoIF9Nb3JwaGluZ0ZsYWcgfCBfU2tpbm5pbmdGbGFnICkgKyAxLAorCisgICAgICAgICAgICBf
ZGVwdGhNYXRlcmlhbHMgPSBuZXcgQXJyYXkoIF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgKSwK
KyAgICAgICAgICAgIF9kaXN0YW5jZU1hdGVyaWFscyA9IG5ldyBBcnJheSggX051bWJlck9mTWF0
ZXJpYWxWYXJpYW50cyApLAorCisgICAgICAgICAgICBfbWF0ZXJpYWxDYWNoZSA9IHt9OworCisg
ICAgICAgIHZhciBjdWJlRGlyZWN0aW9ucyA9IFsKKyAgICAgICAgICAgIG5ldyBWZWN0b3IzKCAx
LCAwLCAwICksIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEg
KSwKKyAgICAgICAgICAgIG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSwgbmV3IFZlY3RvcjMoIDAs
IDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIC0gMSwgMCApCisgICAgICAgIF07CisKKyAgICAgICAg
dmFyIGN1YmVVcHMgPSBbCisgICAgICAgICAgICBuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcg
VmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLAorICAgICAgICAgICAg
bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSwgbmV3IFZlY3Rv
cjMoIDAsIDAsIC0gMSApCisgICAgICAgIF07CisKKyAgICAgICAgdmFyIGN1YmUyRFZpZXdQb3J0
cyA9IFsKKyAgICAgICAgICAgIG5ldyBWZWN0b3I0KCksIG5ldyBWZWN0b3I0KCksIG5ldyBWZWN0
b3I0KCksCisgICAgICAgICAgICBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVj
dG9yNCgpCisgICAgICAgIF07CisKKyAgICAgICAgLy8gaW5pdAorCisgICAgICAgIHZhciBkZXB0
aE1hdGVyaWFsVGVtcGxhdGUgPSBuZXcgTWVzaERlcHRoTWF0ZXJpYWwoKTsKKyAgICAgICAgZGVw
dGhNYXRlcmlhbFRlbXBsYXRlLmRlcHRoUGFja2luZyA9IFJHQkFEZXB0aFBhY2tpbmc7CisgICAg
ICAgIGRlcHRoTWF0ZXJpYWxUZW1wbGF0ZS5jbGlwcGluZyA9IHRydWU7CisKKyAgICAgICAgdmFy
IGRpc3RhbmNlU2hhZGVyID0gU2hhZGVyTGliWyAiZGlzdGFuY2VSR0JBIiBdOworICAgICAgICB2
YXIgZGlzdGFuY2VVbmlmb3JtcyA9IFVuaWZvcm1zVXRpbHMuY2xvbmUoIGRpc3RhbmNlU2hhZGVy
LnVuaWZvcm1zICk7CisKKyAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpICE9PSBfTnVtYmVyT2ZN
YXRlcmlhbFZhcmlhbnRzOyArKyBpICkgeworCisgICAgICAgICAgICB2YXIgdXNlTW9ycGhpbmcg
PSAoIGkgJiBfTW9ycGhpbmdGbGFnICkgIT09IDA7CisgICAgICAgICAgICB2YXIgdXNlU2tpbm5p
bmcgPSAoIGkgJiBfU2tpbm5pbmdGbGFnICkgIT09IDA7CisKKyAgICAgICAgICAgIHZhciBkZXB0
aE1hdGVyaWFsID0gZGVwdGhNYXRlcmlhbFRlbXBsYXRlLmNsb25lKCk7CisgICAgICAgICAgICBk
ZXB0aE1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9IHVzZU1vcnBoaW5nOworICAgICAgICAgICAgZGVw
dGhNYXRlcmlhbC5za2lubmluZyA9IHVzZVNraW5uaW5nOworCisgICAgICAgICAgICBfZGVwdGhN
YXRlcmlhbHNbIGkgXSA9IGRlcHRoTWF0ZXJpYWw7CisKKyAgICAgICAgICAgIHZhciBkaXN0YW5j
ZU1hdGVyaWFsID0gbmV3IFNoYWRlck1hdGVyaWFsKCB7CisgICAgICAgICAgICAgICAgZGVmaW5l
czogeworICAgICAgICAgICAgICAgICAgICAnVVNFX1NIQURPV01BUCc6ICcnCisgICAgICAgICAg
ICAgICAgfSwKKyAgICAgICAgICAgICAgICB1bmlmb3JtczogZGlzdGFuY2VVbmlmb3JtcywKKyAg
ICAgICAgICAgICAgICB2ZXJ0ZXhTaGFkZXI6IGRpc3RhbmNlU2hhZGVyLnZlcnRleFNoYWRlciwK
KyAgICAgICAgICAgICAgICBmcmFnbWVudFNoYWRlcjogZGlzdGFuY2VTaGFkZXIuZnJhZ21lbnRT
aGFkZXIsCisgICAgICAgICAgICAgICAgbW9ycGhUYXJnZXRzOiB1c2VNb3JwaGluZywKKyAgICAg
ICAgICAgICAgICBza2lubmluZzogdXNlU2tpbm5pbmcsCisgICAgICAgICAgICAgICAgY2xpcHBp
bmc6IHRydWUKKyAgICAgICAgICAgIH0gKTsKKworICAgICAgICAgICAgX2Rpc3RhbmNlTWF0ZXJp
YWxzWyBpIF0gPSBkaXN0YW5jZU1hdGVyaWFsOworCisgICAgICAgIH0KKworICAgICAgICAvLwor
CisgICAgICAgIHZhciBzY29wZSA9IHRoaXM7CisKKyAgICAgICAgdGhpcy5lbmFibGVkID0gZmFs
c2U7CisKKyAgICAgICAgdGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5uZWVk
c1VwZGF0ZSA9IGZhbHNlOworCisgICAgICAgIHRoaXMudHlwZSA9IFBDRlNoYWRvd01hcDsKKwor
ICAgICAgICB0aGlzLnJlbmRlclJldmVyc2VTaWRlZCA9IHRydWU7CisgICAgICAgIHRoaXMucmVu
ZGVyU2luZ2xlU2lkZWQgPSB0cnVlOworCisgICAgICAgIHRoaXMucmVuZGVyID0gZnVuY3Rpb24g
KCBzY2VuZSwgY2FtZXJhICkgeworCisgICAgICAgICAgICBpZiAoIHNjb3BlLmVuYWJsZWQgPT09
IGZhbHNlICkgcmV0dXJuOworICAgICAgICAgICAgaWYgKCBzY29wZS5hdXRvVXBkYXRlID09PSBm
YWxzZSAmJiBzY29wZS5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47CisKKyAgICAgICAg
ICAgIGlmICggX2xpZ2h0U2hhZG93cy5sZW5ndGggPT09IDAgKSByZXR1cm47CisKKyAgICAgICAg
ICAgIC8vIFNldCBHTCBzdGF0ZSBmb3IgZGVwdGggbWFwLgorICAgICAgICAgICAgX3N0YXRlLmRp
c2FibGUoIF9nbC5CTEVORCApOworICAgICAgICAgICAgX3N0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0
Q2xlYXIoIDEsIDEsIDEsIDEgKTsKKyAgICAgICAgICAgIF9zdGF0ZS5idWZmZXJzLmRlcHRoLnNl
dFRlc3QoIHRydWUgKTsKKyAgICAgICAgICAgIF9zdGF0ZS5zZXRTY2lzc29yVGVzdCggZmFsc2Ug
KTsKKworICAgICAgICAgICAgLy8gcmVuZGVyIGRlcHRoIG1hcAorCisgICAgICAgICAgICB2YXIg
ZmFjZUNvdW50OworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGlsID0gX2xpZ2h0U2hh
ZG93cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHZhciBsaWdo
dCA9IF9saWdodFNoYWRvd3NbIGkgXTsKKyAgICAgICAgICAgICAgICB2YXIgc2hhZG93ID0gbGln
aHQuc2hhZG93OworICAgICAgICAgICAgICAgIHZhciBpc1BvaW50TGlnaHQgPSBsaWdodCAmJiBs
aWdodC5pc1BvaW50TGlnaHQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIHNoYWRvdyA9PT0gdW5k
ZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldl
YkdMU2hhZG93TWFwOicsIGxpZ2h0LCAnaGFzIG5vIHNoYWRvdy4nICk7CisgICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
dmFyIHNoYWRvd0NhbWVyYSA9IHNoYWRvdy5jYW1lcmE7CisKKyAgICAgICAgICAgICAgICBfc2hh
ZG93TWFwU2l6ZS5jb3B5KCBzaGFkb3cubWFwU2l6ZSApOworICAgICAgICAgICAgICAgIF9zaGFk
b3dNYXBTaXplLm1pbiggX21heFNoYWRvd01hcFNpemUgKTsKKworICAgICAgICAgICAgICAgIGlm
ICggaXNQb2ludExpZ2h0ICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciB2cFdpZHRoID0g
X3NoYWRvd01hcFNpemUueDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHZwSGVpZ2h0ID0gX3No
YWRvd01hcFNpemUueTsKKworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSB2aWV3cG9ydHMg
bWFwIGEgY3ViZS1tYXAgb250byBhIDJEIHRleHR1cmUgd2l0aCB0aGUKKyAgICAgICAgICAgICAg
ICAgICAgLy8gZm9sbG93aW5nIG9yaWVudGF0aW9uOgorICAgICAgICAgICAgICAgICAgICAvLwor
ICAgICAgICAgICAgICAgICAgICAvLyAgeHpYWgorICAgICAgICAgICAgICAgICAgICAvLyAgIHkg
WQorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBYIC0gUG9z
aXRpdmUgeCBkaXJlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgLy8geCAtIE5lZ2F0aXZlIHgg
ZGlyZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIFkgLSBQb3NpdGl2ZSB5IGRpcmVjdGlv
bgorICAgICAgICAgICAgICAgICAgICAvLyB5IC0gTmVnYXRpdmUgeSBkaXJlY3Rpb24KKyAgICAg
ICAgICAgICAgICAgICAgLy8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uCisgICAgICAgICAgICAg
ICAgICAgIC8vIHogLSBOZWdhdGl2ZSB6IGRpcmVjdGlvbgorCisgICAgICAgICAgICAgICAgICAg
IC8vIHBvc2l0aXZlIFgKKyAgICAgICAgICAgICAgICAgICAgY3ViZTJEVmlld1BvcnRzWyAwIF0u
c2V0KCB2cFdpZHRoICogMiwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7CisgICAgICAg
ICAgICAgICAgICAgIC8vIG5lZ2F0aXZlIFgKKyAgICAgICAgICAgICAgICAgICAgY3ViZTJEVmll
d1BvcnRzWyAxIF0uc2V0KCAwLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gcG9zaXRpdmUgWgorICAgICAgICAgICAgICAgICAgICBjdWJlMkRW
aWV3UG9ydHNbIDIgXS5zZXQoIHZwV2lkdGggKiAzLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWln
aHQgKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgWgorICAgICAgICAgICAgICAg
ICAgICBjdWJlMkRWaWV3UG9ydHNbIDMgXS5zZXQoIHZwV2lkdGgsIHZwSGVpZ2h0LCB2cFdpZHRo
LCB2cEhlaWdodCApOworICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGl2ZSBZCisgICAgICAg
ICAgICAgICAgICAgIGN1YmUyRFZpZXdQb3J0c1sgNCBdLnNldCggdnBXaWR0aCAqIDMsIDAsIHZw
V2lkdGgsIHZwSGVpZ2h0ICk7CisgICAgICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlIFkKKyAg
ICAgICAgICAgICAgICAgICAgY3ViZTJEVmlld1BvcnRzWyA1IF0uc2V0KCB2cFdpZHRoLCAwLCB2
cFdpZHRoLCB2cEhlaWdodCApOworCisgICAgICAgICAgICAgICAgICAgIF9zaGFkb3dNYXBTaXpl
LnggKj0gNC4wOworICAgICAgICAgICAgICAgICAgICBfc2hhZG93TWFwU2l6ZS55ICo9IDIuMDsK
KworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggc2hhZG93Lm1hcCA9
PT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcGFycyA9IHsgbWluRmlsdGVy
OiBOZWFyZXN0RmlsdGVyLCBtYWdGaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsIGZvcm1hdDogUkdCQUZv
cm1hdCB9OworCisgICAgICAgICAgICAgICAgICAgIHNoYWRvdy5tYXAgPSBuZXcgV2ViR0xSZW5k
ZXJUYXJnZXQoIF9zaGFkb3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnksIHBhcnMgKTsKKyAg
ICAgICAgICAgICAgICAgICAgc2hhZG93Lm1hcC50ZXh0dXJlLm5hbWUgPSBsaWdodC5uYW1lICsg
Ii5zaGFkb3dNYXAiOworCisgICAgICAgICAgICAgICAgICAgIHNoYWRvd0NhbWVyYS51cGRhdGVQ
cm9qZWN0aW9uTWF0cml4KCk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICBpZiAoIHNoYWRvdy5pc1Nwb3RMaWdodFNoYWRvdyApIHsKKworICAgICAgICAgICAgICAgICAg
ICBzaGFkb3cudXBkYXRlKCBsaWdodCApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgdmFyIHNoYWRvd01hcCA9IHNoYWRvdy5tYXA7CisgICAgICAgICAgICAgICAgdmFy
IHNoYWRvd01hdHJpeCA9IHNoYWRvdy5tYXRyaXg7CisKKyAgICAgICAgICAgICAgICBfbGlnaHRQ
b3NpdGlvbldvcmxkLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsK
KyAgICAgICAgICAgICAgICBzaGFkb3dDYW1lcmEucG9zaXRpb24uY29weSggX2xpZ2h0UG9zaXRp
b25Xb3JsZCApOworCisgICAgICAgICAgICAgICAgaWYgKCBpc1BvaW50TGlnaHQgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgZmFjZUNvdW50ID0gNjsKKworICAgICAgICAgICAgICAgICAgICAv
LyBmb3IgcG9pbnQgbGlnaHRzIHdlIHNldCB0aGUgc2hhZG93IG1hdHJpeCB0byBiZSBhIHRyYW5z
bGF0aW9uLW9ubHkgbWF0cml4CisgICAgICAgICAgICAgICAgICAgIC8vIGVxdWFsIHRvIGludmVy
c2Ugb2YgdGhlIGxpZ2h0J3MgcG9zaXRpb24KKworICAgICAgICAgICAgICAgICAgICBzaGFkb3dN
YXRyaXgubWFrZVRyYW5zbGF0aW9uKCAtIF9saWdodFBvc2l0aW9uV29ybGQueCwgLSBfbGlnaHRQ
b3NpdGlvbldvcmxkLnksIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC56ICk7CisKKyAgICAgICAgICAg
ICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIGZhY2VDb3VudCA9IDE7CisKKyAg
ICAgICAgICAgICAgICAgICAgX2xvb2tUYXJnZXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdo
dC50YXJnZXQubWF0cml4V29ybGQgKTsKKyAgICAgICAgICAgICAgICAgICAgc2hhZG93Q2FtZXJh
Lmxvb2tBdCggX2xvb2tUYXJnZXQgKTsKKyAgICAgICAgICAgICAgICAgICAgc2hhZG93Q2FtZXJh
LnVwZGF0ZU1hdHJpeFdvcmxkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBz
aGFkb3cgbWF0cml4CisKKyAgICAgICAgICAgICAgICAgICAgc2hhZG93TWF0cml4LnNldCgKKyAg
ICAgICAgICAgICAgICAgICAgICAgIDAuNSwgMC4wLCAwLjAsIDAuNSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIDAuMCwgMC41LCAwLjAsIDAuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAu
MCwgMC4wLCAwLjUsIDAuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAs
IDEuMAorICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgICAgIHNoYWRv
d01hdHJpeC5tdWx0aXBseSggc2hhZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTsKKyAgICAg
ICAgICAgICAgICAgICAgc2hhZG93TWF0cml4Lm11bHRpcGx5KCBzaGFkb3dDYW1lcmEubWF0cml4
V29ybGRJbnZlcnNlICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBf
cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3dNYXAgKTsKKyAgICAgICAgICAgICAgICBf
cmVuZGVyZXIuY2xlYXIoKTsKKworICAgICAgICAgICAgICAgIC8vIHJlbmRlciBzaGFkb3cgbWFw
IGZvciBlYWNoIGN1YmUgZmFjZSAoaWYgb21uaS1kaXJlY3Rpb25hbCkgb3IKKyAgICAgICAgICAg
ICAgICAvLyBydW4gYSBzaW5nbGUgcGFzcyBpZiBub3QKKworICAgICAgICAgICAgICAgIGZvciAo
IHZhciBmYWNlID0gMDsgZmFjZSA8IGZhY2VDb3VudDsgZmFjZSArKyApIHsKKworICAgICAgICAg
ICAgICAgICAgICBpZiAoIGlzUG9pbnRMaWdodCApIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgX2xvb2tUYXJnZXQuY29weSggc2hhZG93Q2FtZXJhLnBvc2l0aW9uICk7CisgICAgICAgICAg
ICAgICAgICAgICAgICBfbG9va1RhcmdldC5hZGQoIGN1YmVEaXJlY3Rpb25zWyBmYWNlIF0gKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0NhbWVyYS51cC5jb3B5KCBjdWJlVXBzWyBm
YWNlIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0NhbWVyYS5sb29rQXQoIF9s
b29rVGFyZ2V0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dDYW1lcmEudXBkYXRl
TWF0cml4V29ybGQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZwRGltZW5zaW9u
cyA9IGN1YmUyRFZpZXdQb3J0c1sgZmFjZSBdOworICAgICAgICAgICAgICAgICAgICAgICAgX3N0
YXRlLnZpZXdwb3J0KCB2cERpbWVuc2lvbnMgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNhbWVyYSBtYXRyaWNlcyBhbmQgZnJ1c3R1
bQorCisgICAgICAgICAgICAgICAgICAgIF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmlj
ZXMoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBzaGFkb3dDYW1lcmEubWF0cml4V29y
bGRJbnZlcnNlICk7CisgICAgICAgICAgICAgICAgICAgIF9mcnVzdHVtLnNldEZyb21NYXRyaXgo
IF9wcm9qU2NyZWVuTWF0cml4ICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9iamVj
dCBtYXRyaWNlcyAmIGZydXN0dW0gY3VsbGluZworCisgICAgICAgICAgICAgICAgICAgIHJlbmRl
ck9iamVjdCggc2NlbmUsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKTsKKwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZXN0
b3JlIEdMIHN0YXRlLgorICAgICAgICAgICAgdmFyIGNsZWFyQ29sb3IgPSBfcmVuZGVyZXIuZ2V0
Q2xlYXJDb2xvcigpOworICAgICAgICAgICAgdmFyIGNsZWFyQWxwaGEgPSBfcmVuZGVyZXIuZ2V0
Q2xlYXJBbHBoYSgpOworICAgICAgICAgICAgX3JlbmRlcmVyLnNldENsZWFyQ29sb3IoIGNsZWFy
Q29sb3IsIGNsZWFyQWxwaGEgKTsKKworICAgICAgICAgICAgc2NvcGUubmVlZHNVcGRhdGUgPSBm
YWxzZTsKKworICAgICAgICB9OworCisgICAgICAgIGZ1bmN0aW9uIGdldERlcHRoTWF0ZXJpYWwo
IG9iamVjdCwgbWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgbGlnaHRQb3NpdGlvbldvcmxkICkgewor
CisgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CisKKyAgICAgICAg
ICAgIHZhciByZXN1bHQgPSBudWxsOworCisgICAgICAgICAgICB2YXIgbWF0ZXJpYWxWYXJpYW50
cyA9IF9kZXB0aE1hdGVyaWFsczsKKyAgICAgICAgICAgIHZhciBjdXN0b21NYXRlcmlhbCA9IG9i
amVjdC5jdXN0b21EZXB0aE1hdGVyaWFsOworCisgICAgICAgICAgICBpZiAoIGlzUG9pbnRMaWdo
dCApIHsKKworICAgICAgICAgICAgICAgIG1hdGVyaWFsVmFyaWFudHMgPSBfZGlzdGFuY2VNYXRl
cmlhbHM7CisgICAgICAgICAgICAgICAgY3VzdG9tTWF0ZXJpYWwgPSBvYmplY3QuY3VzdG9tRGlz
dGFuY2VNYXRlcmlhbDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICEgY3Vz
dG9tTWF0ZXJpYWwgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgdXNlTW9ycGhpbmcgPSBmYWxz
ZTsKKworICAgICAgICAgICAgICAgIGlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzICkgeworCisg
ICAgICAgICAgICAgICAgICAgIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9t
ZXRyeSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdXNlTW9ycGhpbmcgPSBnZW9tZXRy
eS5tb3JwaEF0dHJpYnV0ZXMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICYm
IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGggPiAwOworCisgICAgICAg
ICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9y
cGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwOworCisgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlm
ICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmcgPT09IGZhbHNlICkg
eworCisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93
TWFwOiBUSFJFRS5Ta2lubmVkTWVzaCB3aXRoIG1hdGVyaWFsLnNraW5uaW5nIHNldCB0byBmYWxz
ZTonLCBvYmplY3QgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZh
ciB1c2VTa2lubmluZyA9IG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5n
OworCisgICAgICAgICAgICAgICAgdmFyIHZhcmlhbnRJbmRleCA9IDA7CisKKyAgICAgICAgICAg
ICAgICBpZiAoIHVzZU1vcnBoaW5nICkgdmFyaWFudEluZGV4IHw9IF9Nb3JwaGluZ0ZsYWc7Cisg
ICAgICAgICAgICAgICAgaWYgKCB1c2VTa2lubmluZyApIHZhcmlhbnRJbmRleCB8PSBfU2tpbm5p
bmdGbGFnOworCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWF0ZXJpYWxWYXJpYW50c1sgdmFy
aWFudEluZGV4IF07CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICBy
ZXN1bHQgPSBjdXN0b21NYXRlcmlhbDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBp
ZiAoIF9yZW5kZXJlci5sb2NhbENsaXBwaW5nRW5hYmxlZCAmJgorICAgICAgICAgICAgICAgICAg
ICBtYXRlcmlhbC5jbGlwU2hhZG93cyA9PT0gdHJ1ZSAmJgorICAgICAgICAgICAgICAgICAgICBt
YXRlcmlhbC5jbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IDAgKSB7CisKKyAgICAgICAgICAgICAg
ICAvLyBpbiB0aGlzIGNhc2Ugd2UgbmVlZCBhIHVuaXF1ZSBtYXRlcmlhbCBpbnN0YW5jZSByZWZs
ZWN0aW5nIHRoZQorICAgICAgICAgICAgICAgIC8vIGFwcHJvcHJpYXRlIHN0YXRlCisKKyAgICAg
ICAgICAgICAgICB2YXIga2V5QSA9IHJlc3VsdC51dWlkLCBrZXlCID0gbWF0ZXJpYWwudXVpZDsK
KworICAgICAgICAgICAgICAgIHZhciBtYXRlcmlhbHNGb3JWYXJpYW50ID0gX21hdGVyaWFsQ2Fj
aGVbIGtleUEgXTsKKworICAgICAgICAgICAgICAgIGlmICggbWF0ZXJpYWxzRm9yVmFyaWFudCA9
PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsc0ZvclZhcmlh
bnQgPSB7fTsKKyAgICAgICAgICAgICAgICAgICAgX21hdGVyaWFsQ2FjaGVbIGtleUEgXSA9IG1h
dGVyaWFsc0ZvclZhcmlhbnQ7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICB2YXIgY2FjaGVkTWF0ZXJpYWwgPSBtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF07CisKKyAg
ICAgICAgICAgICAgICBpZiAoIGNhY2hlZE1hdGVyaWFsID09PSB1bmRlZmluZWQgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgY2FjaGVkTWF0ZXJpYWwgPSByZXN1bHQuY2xvbmUoKTsKKyAgICAg
ICAgICAgICAgICAgICAgbWF0ZXJpYWxzRm9yVmFyaWFudFsga2V5QiBdID0gY2FjaGVkTWF0ZXJp
YWw7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjYWNo
ZWRNYXRlcmlhbDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQudmlzaWJs
ZSA9IG1hdGVyaWFsLnZpc2libGU7CisgICAgICAgICAgICByZXN1bHQud2lyZWZyYW1lID0gbWF0
ZXJpYWwud2lyZWZyYW1lOworCisgICAgICAgICAgICB2YXIgc2lkZSA9IG1hdGVyaWFsLnNpZGU7
CisKKyAgICAgICAgICAgIGlmICggc2NvcGUucmVuZGVyU2luZ2xlU2lkZWQgJiYgc2lkZSA9PSBE
b3VibGVTaWRlICkgeworCisgICAgICAgICAgICAgICAgc2lkZSA9IEZyb250U2lkZTsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHNjb3BlLnJlbmRlclJldmVyc2VTaWRlZCAp
IHsKKworICAgICAgICAgICAgICAgIGlmICggc2lkZSA9PT0gRnJvbnRTaWRlICkgc2lkZSA9IEJh
Y2tTaWRlOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaWRlID09PSBCYWNrU2lkZSApIHNp
ZGUgPSBGcm9udFNpZGU7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzdWx0LnNp
ZGUgPSBzaWRlOworCisgICAgICAgICAgICByZXN1bHQuY2xpcFNoYWRvd3MgPSBtYXRlcmlhbC5j
bGlwU2hhZG93czsKKyAgICAgICAgICAgIHJlc3VsdC5jbGlwcGluZ1BsYW5lcyA9IG1hdGVyaWFs
LmNsaXBwaW5nUGxhbmVzOworCisgICAgICAgICAgICByZXN1bHQud2lyZWZyYW1lTGluZXdpZHRo
ID0gbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoOworICAgICAgICAgICAgcmVzdWx0LmxpbmV3
aWR0aCA9IG1hdGVyaWFsLmxpbmV3aWR0aDsKKworICAgICAgICAgICAgaWYgKCBpc1BvaW50TGln
aHQgJiYgcmVzdWx0LnVuaWZvcm1zLmxpZ2h0UG9zICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAg
ICAgICAgICAgICByZXN1bHQudW5pZm9ybXMubGlnaHRQb3MudmFsdWUuY29weSggbGlnaHRQb3Np
dGlvbldvcmxkICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3Qs
IGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKSB7CisKKyAgICAgICAgICAgIGlm
ICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuOworCisgICAgICAgICAgICB2YXIg
dmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApOworCisgICAgICAg
ICAgICBpZiAoIHZpc2libGUgJiYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwg
b2JqZWN0LmlzUG9pbnRzICkgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoIG9iamVjdC5jYXN0
U2hhZG93ICYmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3Rz
T2JqZWN0KCBvYmplY3QgKSApICkgeworCisgICAgICAgICAgICAgICAgICAgIG9iamVjdC5tb2Rl
bFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52
ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdl
b21ldHJ5ID0gX29iamVjdHMudXBkYXRlKCBvYmplY3QgKTsKKyAgICAgICAgICAgICAgICAgICAg
dmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsOworCisgICAgICAgICAgICAgICAgICAgIGlm
ICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgdmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwczsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgZm9yICggdmFyIGsgPSAwLCBrbCA9IGdyb3Vwcy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncm91cCA9IGdyb3Vwc1sgayBdOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxb
IGdyb3VwLm1hdGVyaWFsSW5kZXggXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICggZ3JvdXBNYXRlcmlhbCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlcHRoTWF0ZXJpYWwgPSBnZXREZXB0aE1hdGVy
aWFsKCBvYmplY3QsIGdyb3VwTWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgX2xpZ2h0UG9zaXRpb25X
b3JsZCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVuZGVyZXIucmVuZGVy
QnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFs
LCBvYmplY3QsIGdyb3VwICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYg
KCBtYXRlcmlhbC52aXNpYmxlICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVw
dGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGlzUG9pbnRM
aWdodCwgX2xpZ2h0UG9zaXRpb25Xb3JsZCApOworICAgICAgICAgICAgICAgICAgICAgICAgX3Jl
bmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggc2hhZG93Q2FtZXJhLCBudWxsLCBnZW9tZXRyeSwg
ZGVwdGhNYXRlcmlhbCwgb2JqZWN0LCBudWxsICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBj
aGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAw
LCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAg
IHJlbmRlck9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9p
bnRMaWdodCApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAg
LyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8K
KworICAgIGZ1bmN0aW9uIFdlYkdMQXR0cmlidXRlcyggZ2wgKSB7CisKKyAgICAgICAgdmFyIGJ1
ZmZlcnMgPSB7fTsKKworICAgICAgICBmdW5jdGlvbiBjcmVhdGVCdWZmZXIoIGF0dHJpYnV0ZSwg
YnVmZmVyVHlwZSApIHsKKworICAgICAgICAgICAgdmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5
OworICAgICAgICAgICAgdmFyIHVzYWdlID0gYXR0cmlidXRlLmR5bmFtaWMgPyBnbC5EWU5BTUlD
X0RSQVcgOiBnbC5TVEFUSUNfRFJBVzsKKworICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IGdsLmNy
ZWF0ZUJ1ZmZlcigpOworCisgICAgICAgICAgICBnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBi
dWZmZXIgKTsKKyAgICAgICAgICAgIGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCB1
c2FnZSApOworCisgICAgICAgICAgICBhdHRyaWJ1dGUub25VcGxvYWRDYWxsYmFjaygpOworCisg
ICAgICAgICAgICB2YXIgdHlwZSA9IGdsLkZMT0FUOworCisgICAgICAgICAgICBpZiAoIGFycmF5
IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ICkgeworCisgICAgICAgICAgICAgICAgdHlwZSA9IGds
LkZMT0FUOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0
NjRBcnJheSApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdM
QXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXku
JyApOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFy
cmF5ICkgeworCisgICAgICAgICAgICAgICAgdHlwZSA9IGdsLlVOU0lHTkVEX1NIT1JUOworCisg
ICAgICAgICAgICB9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgKSB7CisK
KyAgICAgICAgICAgICAgICB0eXBlID0gZ2wuU0hPUlQ7CisKKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkgKSB7CisKKyAgICAgICAgICAgICAgICB0
eXBlID0gZ2wuVU5TSUdORURfSU5UOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcnJheSBp
bnN0YW5jZW9mIEludDMyQXJyYXkgKSB7CisKKyAgICAgICAgICAgICAgICB0eXBlID0gZ2wuSU5U
OworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSAp
IHsKKworICAgICAgICAgICAgICAgIHR5cGUgPSBnbC5CWVRFOworCisgICAgICAgICAgICB9IGVs
c2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgKSB7CisKKyAgICAgICAgICAgICAg
ICB0eXBlID0gZ2wuVU5TSUdORURfQllURTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICByZXR1cm4geworICAgICAgICAgICAgICAgIGJ1ZmZlcjogYnVmZmVyLAorICAgICAgICAgICAg
ICAgIHR5cGU6IHR5cGUsCisgICAgICAgICAgICAgICAgYnl0ZXNQZXJFbGVtZW50OiBhcnJheS5C
WVRFU19QRVJfRUxFTUVOVCwKKyAgICAgICAgICAgICAgICB2ZXJzaW9uOiBhdHRyaWJ1dGUudmVy
c2lvbgorICAgICAgICAgICAgfTsKKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gdXBk
YXRlQnVmZmVyKCBidWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHsKKworICAgICAgICAg
ICAgdmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5OworICAgICAgICAgICAgdmFyIHVwZGF0ZVJh
bmdlID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlOworCisgICAgICAgICAgICBnbC5iaW5kQnVmZmVy
KCBidWZmZXJUeXBlLCBidWZmZXIgKTsKKworICAgICAgICAgICAgaWYgKCBhdHRyaWJ1dGUuZHlu
YW1pYyA9PT0gZmFsc2UgKSB7CisKKyAgICAgICAgICAgICAgICBnbC5idWZmZXJEYXRhKCBidWZm
ZXJUeXBlLCBhcnJheSwgZ2wuU1RBVElDX0RSQVcgKTsKKworICAgICAgICAgICAgfSBlbHNlIGlm
ICggdXBkYXRlUmFuZ2UuY291bnQgPT09IC0gMSApIHsKKworICAgICAgICAgICAgICAgIC8vIE5v
dCB1c2luZyB1cGRhdGUgcmFuZ2VzCisKKyAgICAgICAgICAgICAgICBnbC5idWZmZXJTdWJEYXRh
KCBidWZmZXJUeXBlLCAwLCBhcnJheSApOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCB1cGRh
dGVSYW5nZS5jb3VudCA9PT0gMCApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Io
ICdUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0
dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAs
IGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5Licg
KTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGdsLmJ1ZmZlclN1
YkRhdGEoIGJ1ZmZlclR5cGUsIHVwZGF0ZVJhbmdlLm9mZnNldCAqIGFycmF5LkJZVEVTX1BFUl9F
TEVNRU5ULAorICAgICAgICAgICAgICAgICAgICBhcnJheS5zdWJhcnJheSggdXBkYXRlUmFuZ2Uu
b2Zmc2V0LCB1cGRhdGVSYW5nZS5vZmZzZXQgKyB1cGRhdGVSYW5nZS5jb3VudCApICk7CisKKyAg
ICAgICAgICAgICAgICB1cGRhdGVSYW5nZS5jb3VudCA9IC0xOyAvLyByZXNldCByYW5nZQorCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vCisKKyAgICAgICAgZnVuY3Rp
b24gZ2V0KCBhdHRyaWJ1dGUgKSB7CisKKyAgICAgICAgICAgIGlmICggYXR0cmlidXRlLmlzSW50
ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTsKKwor
ICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF07CisKKyAgICAgICAg
fQorCisgICAgICAgIGZ1bmN0aW9uIHJlbW92ZSggYXR0cmlidXRlICkgeworCisgICAgICAgICAg
ICBpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRl
ID0gYXR0cmlidXRlLmRhdGE7CisKKyAgICAgICAgICAgIHZhciBkYXRhID0gYnVmZmVyc1sgYXR0
cmlidXRlLnV1aWQgXTsKKworICAgICAgICAgICAgaWYgKCBkYXRhICkgeworCisgICAgICAgICAg
ICAgICAgZ2wuZGVsZXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciApOworCisgICAgICAgICAgICAgICAg
ZGVsZXRlIGJ1ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF07CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gdXBkYXRlKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUg
KSB7CisKKyAgICAgICAgICAgIGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRy
aWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTsKKworICAgICAgICAgICAgdmFyIGRh
dGEgPSBidWZmZXJzWyBhdHRyaWJ1dGUudXVpZCBdOworCisgICAgICAgICAgICBpZiAoIGRhdGEg
PT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIGJ1ZmZlcnNbIGF0dHJpYnV0ZS51
dWlkIF0gPSBjcmVhdGVCdWZmZXIoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApOworCisgICAgICAg
ICAgICB9IGVsc2UgaWYgKCBkYXRhLnZlcnNpb24gPCBhdHRyaWJ1dGUudmVyc2lvbiApIHsKKwor
ICAgICAgICAgICAgICAgIHVwZGF0ZUJ1ZmZlciggZGF0YS5idWZmZXIsIGF0dHJpYnV0ZSwgYnVm
ZmVyVHlwZSApOworCisgICAgICAgICAgICAgICAgZGF0YS52ZXJzaW9uID0gYXR0cmlidXRlLnZl
cnNpb247CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHsK
KworICAgICAgICAgICAgZ2V0OiBnZXQsCisgICAgICAgICAgICByZW1vdmU6IHJlbW92ZSwKKyAg
ICAgICAgICAgIHVwZGF0ZTogdXBkYXRlCisKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIC8q
KgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1
dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisgICAgICog
QGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworICAgICAqLworCisgICAgZnVuY3Rp
b24gRXVsZXIoIHgsIHksIHosIG9yZGVyICkgeworCisgICAgICAgIHRoaXMuX3ggPSB4IHx8IDA7
CisgICAgICAgIHRoaXMuX3kgPSB5IHx8IDA7CisgICAgICAgIHRoaXMuX3ogPSB6IHx8IDA7Cisg
ICAgICAgIHRoaXMuX29yZGVyID0gb3JkZXIgfHwgRXVsZXIuRGVmYXVsdE9yZGVyOworCisgICAg
fQorCisgICAgRXVsZXIuUm90YXRpb25PcmRlcnMgPSBbICdYWVonLCAnWVpYJywgJ1pYWScsICdY
WlknLCAnWVhaJywgJ1pZWCcgXTsKKworICAgIEV1bGVyLkRlZmF1bHRPcmRlciA9ICdYWVonOwor
CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEV1bGVyLnByb3RvdHlwZSwgeworCisgICAg
ICAgIHg6IHsKKworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAg
ICAgICByZXR1cm4gdGhpcy5feDsKKworICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgc2V0
OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5feCA9IHZhbHVl
OworICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpOworCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgfSwKKworICAgICAgICB5OiB7CisKKyAgICAgICAgICAgIGdldDogZnVu
Y3Rpb24gKCkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3k7CisKKyAgICAgICAg
ICAgIH0sCisKKyAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAg
ICAgICAgICAgIHRoaXMuX3kgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdl
Q2FsbGJhY2soKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAgejog
eworCisgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgIHJl
dHVybiB0aGlzLl96OworCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICBzZXQ6IGZ1bmN0
aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLl96ID0gdmFsdWU7CisgICAg
ICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICB9LAorCisgICAgICAgIG9yZGVyOiB7CisKKyAgICAgICAgICAgIGdldDogZnVuY3Rp
b24gKCkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29yZGVyOworCisgICAgICAg
ICAgICB9LAorCisgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAg
ICAgICAgICAgICB0aGlzLl9vcmRlciA9IHZhbHVlOworICAgICAgICAgICAgICAgIHRoaXMub25D
aGFuZ2VDYWxsYmFjaygpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfSAp
OworCisgICAgT2JqZWN0LmFzc2lnbiggRXVsZXIucHJvdG90eXBlLCB7CisKKyAgICAgICAgaXNF
dWxlcjogdHJ1ZSwKKworICAgICAgICBzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgb3JkZXIgKSB7
CisKKyAgICAgICAgICAgIHRoaXMuX3ggPSB4OworICAgICAgICAgICAgdGhpcy5feSA9IHk7Cisg
ICAgICAgICAgICB0aGlzLl96ID0gejsKKyAgICAgICAgICAgIHRoaXMuX29yZGVyID0gb3JkZXIg
fHwgdGhpcy5fb3JkZXI7CisKKyAgICAgICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpOwor
CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGNsb25l
OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rv
ciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fb3JkZXIgKTsKKworICAgICAgICB9
LAorCisgICAgICAgIGNvcHk6IGZ1bmN0aW9uICggZXVsZXIgKSB7CisKKyAgICAgICAgICAgIHRo
aXMuX3ggPSBldWxlci5feDsKKyAgICAgICAgICAgIHRoaXMuX3kgPSBldWxlci5feTsKKyAgICAg
ICAgICAgIHRoaXMuX3ogPSBldWxlci5fejsKKyAgICAgICAgICAgIHRoaXMuX29yZGVyID0gZXVs
ZXIuX29yZGVyOworCisgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKKworICAg
ICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRGcm9tUm90
YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSwgb3JkZXIsIHVwZGF0ZSApIHsKKworICAgICAgICAg
ICAgdmFyIGNsYW1wID0gX01hdGguY2xhbXA7CisKKyAgICAgICAgICAgIC8vIGFzc3VtZXMgdGhl
IHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQp
CisKKyAgICAgICAgICAgIHZhciB0ZSA9IG0uZWxlbWVudHM7CisgICAgICAgICAgICB2YXIgbTEx
ID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXTsKKyAgICAgICAgICAgIHZh
ciBtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdOworICAgICAgICAg
ICAgdmFyIG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdOworCisg
ICAgICAgICAgICBvcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyOworCisgICAgICAgICAgICBp
ZiAoIG9yZGVyID09PSAnWFlaJyApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuX3kgPSBNYXRo
LmFzaW4oIGNsYW1wKCBtMTMsIC0gMSwgMSApICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIE1h
dGguYWJzKCBtMTMgKSA8IDAuOTk5OTkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5f
eCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5f
eiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMTEgKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7
CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7
CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ogPSAwOworCisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1lYWicgKSB7CisKKyAgICAgICAg
ICAgICAgICB0aGlzLl94ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMjMsIC0gMSwgMSApICk7CisK
KyAgICAgICAgICAgICAgICBpZiAoIE1hdGguYWJzKCBtMjMgKSA8IDAuOTk5OTkgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgdGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7CisgICAg
ICAgICAgICAgICAgICAgIHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0yMiApOworCisgICAg
ICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLl95ID0gTWF0
aC5hdGFuMiggLSBtMzEsIG0xMSApOworICAgICAgICAgICAgICAgICAgICB0aGlzLl96ID0gMDsK
KworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmICggb3JkZXIgPT09
ICdaWFknICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5feCA9IE1hdGguYXNpbiggY2xhbXAo
IG0zMiwgLSAxLCAxICkgKTsKKworICAgICAgICAgICAgICAgIGlmICggTWF0aC5hYnMoIG0zMiAp
IDwgMC45OTk5OSApIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLl95ID0gTWF0aC5hdGFu
MiggLSBtMzEsIG0zMyApOworICAgICAgICAgICAgICAgICAgICB0aGlzLl96ID0gTWF0aC5hdGFu
MiggLSBtMTIsIG0yMiApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAg
ICAgICAgICAgICB0aGlzLl95ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5feiA9IE1h
dGguYXRhbjIoIG0yMSwgbTExICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllYJyApIHsKKworICAgICAgICAgICAgICAgIHRoaXMu
X3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwgLSAxLCAxICkgKTsKKworICAgICAgICAgICAg
ICAgIGlmICggTWF0aC5hYnMoIG0zMSApIDwgMC45OTk5OSApIHsKKworICAgICAgICAgICAgICAg
ICAgICB0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMzMgKTsKKyAgICAgICAgICAgICAgICAg
ICAgdGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7CisKKyAgICAgICAgICAgICAgICB9
IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ggPSAwOworICAgICAgICAgICAg
ICAgICAgICB0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApOworCisgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1laWCcgKSB7CisK
KyAgICAgICAgICAgICAgICB0aGlzLl96ID0gTWF0aC5hc2luKCBjbGFtcCggbTIxLCAtIDEsIDEg
KSApOworCisgICAgICAgICAgICAgICAgaWYgKCBNYXRoLmFicyggbTIxICkgPCAwLjk5OTk5ICkg
eworCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTIy
ICk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTEx
ICk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIHRo
aXMuX3ggPSAwOworICAgICAgICAgICAgICAgICAgICB0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEz
LCBtMzMgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmICgg
b3JkZXIgPT09ICdYWlknICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5feiA9IE1hdGguYXNp
biggLSBjbGFtcCggbTEyLCAtIDEsIDEgKSApOworCisgICAgICAgICAgICAgICAgaWYgKCBNYXRo
LmFicyggbTEyICkgPCAwLjk5OTk5ICkgeworCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3gg
PSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApOworICAgICAgICAgICAgICAgICAgICB0aGlzLl95ID0g
TWF0aC5hdGFuMiggbTEzLCBtMTEgKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgdGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTsKKyAg
ICAgICAgICAgICAgICAgICAgdGhpcy5feSA9IDA7CisKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJF
RS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVy
OiAnICsgb3JkZXIgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLl9vcmRl
ciA9IG9yZGVyOworCisgICAgICAgICAgICBpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLm9u
Q2hhbmdlQ2FsbGJhY2soKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAg
fSwKKworICAgICAgICBzZXRGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICB2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1
bmN0aW9uIHNldEZyb21RdWF0ZXJuaW9uKCBxLCBvcmRlciwgdXBkYXRlICkgeworCisgICAgICAg
ICAgICAgICAgbWF0cml4Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7CisKKyAgICAg
ICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG1hdHJpeCwgb3Jk
ZXIsIHVwZGF0ZSApOworCisgICAgICAgICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAg
ICBzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24gKCB2LCBvcmRlciApIHsKKworICAgICAgICAgICAg
cmV0dXJuIHRoaXMuc2V0KCB2LngsIHYueSwgdi56LCBvcmRlciB8fCB0aGlzLl9vcmRlciApOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgcmVvcmRlcjogZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICAvLyBXQVJOSU5HOiB0aGlzIGRpc2NhcmRzIHJldm9sdXRpb24gaW5mb3JtYXRpb24gLWJo
b3VzdG9uCisKKyAgICAgICAgICAgIHZhciBxID0gbmV3IFF1YXRlcm5pb24oKTsKKworICAgICAg
ICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlb3JkZXIoIG5ld09yZGVyICkgeworCisgICAgICAgICAg
ICAgICAgcS5zZXRGcm9tRXVsZXIoIHRoaXMgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0
aGlzLnNldEZyb21RdWF0ZXJuaW9uKCBxLCBuZXdPcmRlciApOworCisgICAgICAgICAgICB9Owor
CisgICAgICAgIH0oKSwKKworICAgICAgICBlcXVhbHM6IGZ1bmN0aW9uICggZXVsZXIgKSB7CisK
KyAgICAgICAgICAgIHJldHVybiAoIGV1bGVyLl94ID09PSB0aGlzLl94ICkgJiYgKCBldWxlci5f
eSA9PT0gdGhpcy5feSApICYmICggZXVsZXIuX3ogPT09IHRoaXMuX3ogKSAmJiAoIGV1bGVyLl9v
cmRlciA9PT0gdGhpcy5fb3JkZXIgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGZyb21BcnJh
eTogZnVuY3Rpb24gKCBhcnJheSApIHsKKworICAgICAgICAgICAgdGhpcy5feCA9IGFycmF5WyAw
IF07CisgICAgICAgICAgICB0aGlzLl95ID0gYXJyYXlbIDEgXTsKKyAgICAgICAgICAgIHRoaXMu
X3ogPSBhcnJheVsgMiBdOworICAgICAgICAgICAgaWYgKCBhcnJheVsgMyBdICE9PSB1bmRlZmlu
ZWQgKSB0aGlzLl9vcmRlciA9IGFycmF5WyAzIF07CisKKyAgICAgICAgICAgIHRoaXMub25DaGFu
Z2VDYWxsYmFjaygpOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAor
CisgICAgICAgIHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKKworICAgICAg
ICAgICAgaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKKyAgICAgICAgICAg
IGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisgICAgICAgICAgICBh
cnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94OworICAgICAgICAgICAgYXJyYXlbIG9mZnNldCArIDEg
XSA9IHRoaXMuX3k7CisgICAgICAgICAgICBhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejsK
KyAgICAgICAgICAgIGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl9vcmRlcjsKKworICAgICAg
ICAgICAgcmV0dXJuIGFycmF5OworCisgICAgICAgIH0sCisKKyAgICAgICAgdG9WZWN0b3IzOiBm
dW5jdGlvbiAoIG9wdGlvbmFsUmVzdWx0ICkgeworCisgICAgICAgICAgICBpZiAoIG9wdGlvbmFs
UmVzdWx0ICkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbmFsUmVzdWx0LnNldCgg
dGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApOworCisgICAgICAgICAgICB9IGVsc2UgeworCisg
ICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKCB0aGlzLl94LCB0aGlzLl95LCB0aGlz
Ll96ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAorCisgICAgICAgIG9uQ2hhbmdl
OiBmdW5jdGlvbiAoIGNhbGxiYWNrICkgeworCisgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlQ2Fs
bGJhY2sgPSBjYWxsYmFjazsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAg
fSwKKworICAgICAgICBvbkNoYW5nZUNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fQorCisgICAgfSAp
OworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8K
KyAgICAgKi8KKworICAgIGZ1bmN0aW9uIExheWVycygpIHsKKworICAgICAgICB0aGlzLm1hc2sg
PSAxIHwgMDsKKworICAgIH0KKworICAgIE9iamVjdC5hc3NpZ24oIExheWVycy5wcm90b3R5cGUs
IHsKKworICAgICAgICBzZXQ6IGZ1bmN0aW9uICggY2hhbm5lbCApIHsKKworICAgICAgICAgICAg
dGhpcy5tYXNrID0gMSA8PCBjaGFubmVsIHwgMDsKKworICAgICAgICB9LAorCisgICAgICAgIGVu
YWJsZTogZnVuY3Rpb24gKCBjaGFubmVsICkgeworCisgICAgICAgICAgICB0aGlzLm1hc2sgfD0g
MSA8PCBjaGFubmVsIHwgMDsKKworICAgICAgICB9LAorCisgICAgICAgIHRvZ2dsZTogZnVuY3Rp
b24gKCBjaGFubmVsICkgeworCisgICAgICAgICAgICB0aGlzLm1hc2sgXj0gMSA8PCBjaGFubmVs
IHwgMDsKKworICAgICAgICB9LAorCisgICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uICggY2hhbm5l
bCApIHsKKworICAgICAgICAgICAgdGhpcy5tYXNrICY9IH4gKCAxIDw8IGNoYW5uZWwgfCAwICk7
CisKKyAgICAgICAgfSwKKworICAgICAgICB0ZXN0OiBmdW5jdGlvbiAoIGxheWVycyApIHsKKwor
ICAgICAgICAgICAgcmV0dXJuICggdGhpcy5tYXNrICYgbGF5ZXJzLm1hc2sgKSAhPT0gMDsKKwor
ICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAv
IGh0dHA6Ly9tcmRvb2IuY29tLworICAgICAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0
cDovL2dvbW8uc2UvCisgICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVh
bGlhLmNvbS8KKyAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20v
V2VzdExhbmdsZXkKKyAgICAgKiBAYXV0aG9yIGVsZXBoYW50YXR3b3JrIC8gd3d3LmVsZXBoYW50
YXR3b3JrLmNoCisgICAgICovCisKKyAgICB2YXIgb2JqZWN0M0RJZCA9IDA7CisKKyAgICBmdW5j
dGlvbiBPYmplY3QzRCgpIHsKKworICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMs
ICdpZCcsIHsgdmFsdWU6IG9iamVjdDNESWQgKysgfSApOworCisgICAgICAgIHRoaXMudXVpZCA9
IF9NYXRoLmdlbmVyYXRlVVVJRCgpOworCisgICAgICAgIHRoaXMubmFtZSA9ICcnOworICAgICAg
ICB0aGlzLnR5cGUgPSAnT2JqZWN0M0QnOworCisgICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDsK
KyAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOworCisgICAgICAgIHRoaXMudXAgPSBPYmplY3Qz
RC5EZWZhdWx0VXAuY2xvbmUoKTsKKworICAgICAgICB2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9y
MygpOworICAgICAgICB2YXIgcm90YXRpb24gPSBuZXcgRXVsZXIoKTsKKyAgICAgICAgdmFyIHF1
YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOworICAgICAgICB2YXIgc2NhbGUgPSBuZXcgVmVj
dG9yMyggMSwgMSwgMSApOworCisgICAgICAgIGZ1bmN0aW9uIG9uUm90YXRpb25DaGFuZ2UoKSB7
CisKKyAgICAgICAgICAgIHF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCByb3RhdGlvbiwgZmFsc2Ug
KTsKKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gb25RdWF0ZXJuaW9uQ2hhbmdlKCkg
eworCisgICAgICAgICAgICByb3RhdGlvbi5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwg
dW5kZWZpbmVkLCBmYWxzZSApOworCisgICAgICAgIH0KKworICAgICAgICByb3RhdGlvbi5vbkNo
YW5nZSggb25Sb3RhdGlvbkNoYW5nZSApOworICAgICAgICBxdWF0ZXJuaW9uLm9uQ2hhbmdlKCBv
blF1YXRlcm5pb25DaGFuZ2UgKTsKKworICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcygg
dGhpcywgeworICAgICAgICAgICAgcG9zaXRpb246IHsKKyAgICAgICAgICAgICAgICBlbnVtZXJh
YmxlOiB0cnVlLAorICAgICAgICAgICAgICAgIHZhbHVlOiBwb3NpdGlvbgorICAgICAgICAgICAg
fSwKKyAgICAgICAgICAgIHJvdGF0aW9uOiB7CisgICAgICAgICAgICAgICAgZW51bWVyYWJsZTog
dHJ1ZSwKKyAgICAgICAgICAgICAgICB2YWx1ZTogcm90YXRpb24KKyAgICAgICAgICAgIH0sCisg
ICAgICAgICAgICBxdWF0ZXJuaW9uOiB7CisgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1
ZSwKKyAgICAgICAgICAgICAgICB2YWx1ZTogcXVhdGVybmlvbgorICAgICAgICAgICAgfSwKKyAg
ICAgICAgICAgIHNjYWxlOiB7CisgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKKyAg
ICAgICAgICAgICAgICB2YWx1ZTogc2NhbGUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBt
b2RlbFZpZXdNYXRyaXg6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IE1hdHJpeDQoKQor
ICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5vcm1hbE1hdHJpeDogeworICAgICAgICAgICAg
ICAgIHZhbHVlOiBuZXcgTWF0cml4MygpCisgICAgICAgICAgICB9CisgICAgICAgIH0gKTsKKwor
ICAgICAgICB0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CisgICAgICAgIHRoaXMubWF0cml4
V29ybGQgPSBuZXcgTWF0cml4NCgpOworCisgICAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9
IE9iamVjdDNELkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlOworICAgICAgICB0aGlzLm1hdHJpeFdv
cmxkTmVlZHNVcGRhdGUgPSBmYWxzZTsKKworICAgICAgICB0aGlzLmxheWVycyA9IG5ldyBMYXll
cnMoKTsKKyAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTsKKworICAgICAgICB0aGlzLmNhc3RT
aGFkb3cgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5yZWNlaXZlU2hhZG93ID0gZmFsc2U7CisKKyAg
ICAgICAgdGhpcy5mcnVzdHVtQ3VsbGVkID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5yZW5kZXJPcmRl
ciA9IDA7CisKKyAgICAgICAgdGhpcy51c2VyRGF0YSA9IHt9OworICAgIH0KKworICAgIE9iamVj
dDNELkRlZmF1bHRVcCA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7CisgICAgT2JqZWN0M0QuRGVm
YXVsdE1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlOworCisgICAgT2JqZWN0LmFzc2lnbiggT2JqZWN0
M0QucHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7CisKKyAgICAgICAgaXNP
YmplY3QzRDogdHJ1ZSwKKworICAgICAgICBvbkJlZm9yZVJlbmRlcjogZnVuY3Rpb24gKCkge30s
CisgICAgICAgIG9uQWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LAorCisgICAgICAgIGFwcGx5
TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKKworICAgICAgICAgICAgdGhpcy5tYXRyaXgu
bXVsdGlwbHlNYXRyaWNlcyggbWF0cml4LCB0aGlzLm1hdHJpeCApOworCisgICAgICAgICAgICB0
aGlzLm1hdHJpeC5kZWNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhp
cy5zY2FsZSApOworCisgICAgICAgIH0sCisKKyAgICAgICAgYXBwbHlRdWF0ZXJuaW9uOiBmdW5j
dGlvbiAoIHEgKSB7CisKKyAgICAgICAgICAgIHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSgg
cSApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAg
IHNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZTogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHsKKwor
ICAgICAgICAgICAgLy8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWQKKworICAgICAgICAgICAg
dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7CisKKyAgICAg
ICAgfSwKKworICAgICAgICBzZXRSb3RhdGlvbkZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciAp
IHsKKworICAgICAgICAgICAgdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIsIHRy
dWUgKTsKKworICAgICAgICB9LAorCisgICAgICAgIHNldFJvdGF0aW9uRnJvbU1hdHJpeDogZnVu
Y3Rpb24gKCBtICkgeworCisgICAgICAgICAgICAvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2Yg
bSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKQorCisgICAgICAgICAg
ICB0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtICk7CisKKyAgICAgICAg
fSwKKworICAgICAgICBzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7
CisKKyAgICAgICAgICAgIC8vIGFzc3VtZXMgcSBpcyBub3JtYWxpemVkCisKKyAgICAgICAgICAg
IHRoaXMucXVhdGVybmlvbi5jb3B5KCBxICk7CisKKyAgICAgICAgfSwKKworICAgICAgICByb3Rh
dGVPbkF4aXM6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgLy8gcm90YXRlIG9iamVjdCBv
biBheGlzIGluIG9iamVjdCBzcGFjZQorICAgICAgICAgICAgLy8gYXhpcyBpcyBhc3N1bWVkIHRv
IGJlIG5vcm1hbGl6ZWQKKworICAgICAgICAgICAgdmFyIHExID0gbmV3IFF1YXRlcm5pb24oKTsK
KworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZU9uQXhpcyggYXhpcywgYW5nbGUg
KSB7CisKKyAgICAgICAgICAgICAgICBxMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSAp
OworCisgICAgICAgICAgICAgICAgdGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KCBxMSApOworCisg
ICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAg
fSgpLAorCisgICAgICAgIHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFy
IHYxID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0
aW9uIHJvdGF0ZVgoIGFuZ2xlICkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucm90
YXRlT25BeGlzKCB2MSwgYW5nbGUgKTsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9KCks
CisKKyAgICAgICAgcm90YXRlWTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdjEg
PSBuZXcgVmVjdG9yMyggMCwgMSwgMCApOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24g
cm90YXRlWSggYW5nbGUgKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb3RhdGVP
bkF4aXMoIHYxLCBhbmdsZSApOworCisgICAgICAgICAgICB9OworCisgICAgICAgIH0oKSwKKwor
ICAgICAgICByb3RhdGVaOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciB2MSA9IG5l
dyBWZWN0b3IzKCAwLCAwLCAxICk7CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiByb3Rh
dGVaKCBhbmdsZSApIHsKKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJvdGF0ZU9uQXhp
cyggdjEsIGFuZ2xlICk7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAg
ICAgIHRyYW5zbGF0ZU9uQXhpczogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAvLyB0cmFu
c2xhdGUgb2JqZWN0IGJ5IGRpc3RhbmNlIGFsb25nIGF4aXMgaW4gb2JqZWN0IHNwYWNlCisgICAg
ICAgICAgICAvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZAorCisgICAgICAgICAg
ICB2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24g
dHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIHsKKworICAgICAgICAgICAgICAgIHYx
LmNvcHkoIGF4aXMgKS5hcHBseVF1YXRlcm5pb24oIHRoaXMucXVhdGVybmlvbiApOworCisgICAg
ICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi5hZGQoIHYxLm11bHRpcGx5U2NhbGFyKCBkaXN0YW5j
ZSApICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICAgICAgfTsK
KworICAgICAgICB9KCksCisKKyAgICAgICAgdHJhbnNsYXRlWDogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICB2YXIgdjEgPSBuZXcgVmVjdG9yMyggMSwgMCwgMCApOworCisgICAgICAgICAg
ICByZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWCggZGlzdGFuY2UgKSB7CisKKyAgICAgICAgICAg
ICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApOworCisgICAg
ICAgICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICB0cmFuc2xhdGVZOiBmdW5jdGlv
biAoKSB7CisKKyAgICAgICAgICAgIHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7CisK
KyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVZKCBkaXN0YW5jZSApIHsKKwor
ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNl
ICk7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIHRyYW5zbGF0
ZVo6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIHYxID0gbmV3IFZlY3RvcjMoIDAs
IDAsIDEgKTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVooIGRpc3Rh
bmNlICkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2
MSwgZGlzdGFuY2UgKTsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9KCksCisKKyAgICAg
ICAgbG9jYWxUb1dvcmxkOiBmdW5jdGlvbiAoIHZlY3RvciApIHsKKworICAgICAgICAgICAgcmV0
dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsKKworICAgICAgICB9
LAorCisgICAgICAgIHdvcmxkVG9Mb2NhbDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2
YXIgbTEgPSBuZXcgTWF0cml4NCgpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gd29y
bGRUb0xvY2FsKCB2ZWN0b3IgKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdmVjdG9yLmFw
cGx5TWF0cml4NCggbTEuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApICk7CisKKyAgICAg
ICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIGxvb2tBdDogZnVuY3Rpb24gKCkg
eworCisgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IG9iamVjdHMg
d2l0aCByb3RhdGVkIGFuZC9vciB0cmFuc2xhdGVkIHBhcmVudChzKQorCisgICAgICAgICAgICB2
YXIgbTEgPSBuZXcgTWF0cml4NCgpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gbG9v
a0F0KCB2ZWN0b3IgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoIHRoaXMuaXNDYW1lcmEgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgbTEubG9va0F0KCB0aGlzLnBvc2l0aW9uLCB2ZWN0b3Is
IHRoaXMudXAgKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgbTEubG9va0F0KCB2ZWN0b3IsIHRoaXMucG9zaXRpb24sIHRoaXMudXAgKTsKKworICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMucXVhdGVybmlvbi5zZXRGcm9t
Um90YXRpb25NYXRyaXgoIG0xICk7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAor
CisgICAgICAgIGFkZDogZnVuY3Rpb24gKCBvYmplY3QgKSB7CisKKyAgICAgICAgICAgIGlmICgg
YXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9
IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgICAg
IHRoaXMuYWRkKCBhcmd1bWVudHNbIGkgXSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
aWYgKCBvYmplY3QgPT09IHRoaXMgKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9y
KCAiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBv
ZiBpdHNlbGYuIiwgb2JqZWN0ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoIG9iamVjdCAmJiBvYmplY3QuaXNPYmpl
Y3QzRCApICkgeworCisgICAgICAgICAgICAgICAgaWYgKCBvYmplY3QucGFyZW50ICE9PSBudWxs
ICkgeworCisgICAgICAgICAgICAgICAgICAgIG9iamVjdC5wYXJlbnQucmVtb3ZlKCBvYmplY3Qg
KTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9iamVjdC5wYXJlbnQg
PSB0aGlzOworICAgICAgICAgICAgICAgIG9iamVjdC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdh
ZGRlZCcgfSApOworCisgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKCBvYmplY3Qg
KTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJy
b3IoICJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUu
T2JqZWN0M0QuIiwgb2JqZWN0ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0
dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICByZW1vdmU6IGZ1bmN0aW9uICggb2Jq
ZWN0ICkgeworCisgICAgICAgICAgICBpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkgeworCisg
ICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSAr
KyApIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZSggYXJndW1lbnRzWyBpIF0g
KTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwor
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuY2hpbGRyZW4u
aW5kZXhPZiggb2JqZWN0ICk7CisKKyAgICAgICAgICAgIGlmICggaW5kZXggIT09IC0gMSApIHsK
KworICAgICAgICAgICAgICAgIG9iamVjdC5wYXJlbnQgPSBudWxsOworCisgICAgICAgICAgICAg
ICAgb2JqZWN0LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ3JlbW92ZWQnIH0gKTsKKworICAgICAg
ICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKCBpbmRleCwgMSApOworCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAg
Z2V0T2JqZWN0QnlJZDogZnVuY3Rpb24gKCBpZCApIHsKKworICAgICAgICAgICAgcmV0dXJuIHRo
aXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ2lkJywgaWQgKTsKKworICAgICAgICB9LAorCisgICAg
ICAgIGdldE9iamVjdEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkgeworCisgICAgICAgICAgICBy
ZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCAnbmFtZScsIG5hbWUgKTsKKworICAgICAg
ICB9LAorCisgICAgICAgIGdldE9iamVjdEJ5UHJvcGVydHk6IGZ1bmN0aW9uICggbmFtZSwgdmFs
dWUgKSB7CisKKyAgICAgICAgICAgIGlmICggdGhpc1sgbmFtZSBdID09PSB2YWx1ZSApIHJldHVy
biB0aGlzOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmNoaWxkcmVu
Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0
aGlzLmNoaWxkcmVuWyBpIF07CisgICAgICAgICAgICAgICAgdmFyIG9iamVjdCA9IGNoaWxkLmdl
dE9iamVjdEJ5UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7CisKKyAgICAgICAgICAgICAgICBpZiAo
IG9iamVjdCAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBv
YmplY3Q7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgcmV0dXJuIHVuZGVmaW5lZDsKKworICAgICAgICB9LAorCisgICAgICAgIGdldFdvcmxkUG9z
aXRpb246IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CisKKyAgICAgICAgICAgIHZhciBy
ZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICB0
aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7CisKKyAgICAgICAgICAgIHJldHVybiByZXN1
bHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7CisKKyAgICAgICAg
fSwKKworICAgICAgICBnZXRXb3JsZFF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHsKKworICAgICAg
ICAgICAgdmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAgIHZhciBzY2Fs
ZSA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBnZXRXb3Js
ZFF1YXRlcm5pb24oIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICAgICAgdmFyIHJl
c3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBRdWF0ZXJuaW9uKCk7CisKKyAgICAgICAgICAg
ICAgICB0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7CisKKyAgICAgICAgICAgICAgICB0
aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHJlc3VsdCwgc2NhbGUgKTsKKwor
ICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAgICAgIH07CisKKyAgICAg
ICAgfSgpLAorCisgICAgICAgIGdldFdvcmxkUm90YXRpb246IGZ1bmN0aW9uICgpIHsKKworICAg
ICAgICAgICAgdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOworCisgICAgICAgICAg
ICByZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRSb3RhdGlvbiggb3B0aW9uYWxUYXJnZXQgKSB7CisK
KyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IEV1bGVy
KCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlv
biApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5zZXRGcm9tUXVhdGVybmlvbigg
cXVhdGVybmlvbiwgdGhpcy5yb3RhdGlvbi5vcmRlciwgZmFsc2UgKTsKKworICAgICAgICAgICAg
fTsKKworICAgICAgICB9KCksCisKKyAgICAgICAgZ2V0V29ybGRTY2FsZTogZnVuY3Rpb24gKCkg
eworCisgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpOworICAgICAgICAg
ICAgdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOworCisgICAgICAgICAgICByZXR1
cm4gZnVuY3Rpb24gZ2V0V29ybGRTY2FsZSggb3B0aW9uYWxUYXJnZXQgKSB7CisKKyAgICAgICAg
ICAgICAgICB2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKwor
ICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKKworICAgICAg
ICAgICAgICAgIHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlv
biwgcmVzdWx0ICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgICAg
ICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICBnZXRXb3JsZERpcmVjdGlvbjogZnVu
Y3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9u
KCk7CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggb3B0
aW9uYWxUYXJnZXQgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb3B0aW9uYWxU
YXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKworICAgICAgICAgICAgICAgIHRoaXMuZ2V0V29ybGRR
dWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0
LnNldCggMCwgMCwgMSApLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApOworCisgICAgICAg
ICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICByYXljYXN0OiBmdW5jdGlvbiAoKSB7
fSwKKworICAgICAgICB0cmF2ZXJzZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKKworICAgICAg
ICAgICAgY2FsbGJhY2soIHRoaXMgKTsKKworICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhp
cy5jaGlsZHJlbjsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4u
bGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIGNoaWxkcmVuWyBpIF0u
dHJhdmVyc2UoIGNhbGxiYWNrICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAorCisg
ICAgICAgIHRyYXZlcnNlVmlzaWJsZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKKworICAgICAg
ICAgICAgaWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuOworCisgICAgICAgICAg
ICBjYWxsYmFjayggdGhpcyApOworCisgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNo
aWxkcmVuOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5n
dGg7IGkgPCBsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgY2hpbGRyZW5bIGkgXS50cmF2
ZXJzZVZpc2libGUoIGNhbGxiYWNrICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAor
CisgICAgICAgIHRyYXZlcnNlQW5jZXN0b3JzOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkgeworCisg
ICAgICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CisKKyAgICAgICAgICAgIGlmICgg
cGFyZW50ICE9PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgY2FsbGJhY2soIHBhcmVudCAp
OworCisgICAgICAgICAgICAgICAgcGFyZW50LnRyYXZlcnNlQW5jZXN0b3JzKCBjYWxsYmFjayAp
OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSwKKworICAgICAgICB1cGRhdGVNYXRyaXg6
IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdGhpcy5tYXRyaXguY29tcG9zZSggdGhpcy5w
b3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7CisKKyAgICAgICAgICAgIHRo
aXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7CisKKyAgICAgICAgfSwKKworICAgICAg
ICB1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHsKKworICAgICAgICAgICAg
aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgKSB0aGlzLnVwZGF0ZU1hdHJpeCgpOworCisgICAg
ICAgICAgICBpZiAoIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSApIHsKKwor
ICAgICAgICAgICAgICAgIGlmICggdGhpcy5wYXJlbnQgPT09IG51bGwgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgdGhpcy5tYXRyaXhXb3JsZC5jb3B5KCB0aGlzLm1hdHJpeCApOworCisgICAg
ICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdHJpeFdv
cmxkLm11bHRpcGx5TWF0cmljZXMoIHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJp
eCApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy5tYXRyaXhX
b3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBmb3JjZSA9IHRydWU7
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdXBkYXRlIGNoaWxkcmVuCisKKyAg
ICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CisKKyAgICAgICAgICAgIGZv
ciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAg
ICAgICAgICAgICAgICBjaGlsZHJlblsgaSBdLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApOwor
CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSwKKworICAgICAgICB0b0pTT046IGZ1bmN0aW9u
ICggbWV0YSApIHsKKworICAgICAgICAgICAgLy8gbWV0YSBpcyAnJyB3aGVuIGNhbGxlZCBmcm9t
IEpTT04uc3RyaW5naWZ5CisgICAgICAgICAgICB2YXIgaXNSb290T2JqZWN0ID0gKCBtZXRhID09
PSB1bmRlZmluZWQgfHwgbWV0YSA9PT0gJycgKTsKKworICAgICAgICAgICAgdmFyIG91dHB1dCA9
IHt9OworCisgICAgICAgICAgICAvLyBtZXRhIGlzIGEgaGFzaCB1c2VkIHRvIGNvbGxlY3QgZ2Vv
bWV0cmllcywgbWF0ZXJpYWxzLgorICAgICAgICAgICAgLy8gbm90IHByb3ZpZGluZyBpdCBpbXBs
aWVzIHRoYXQgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3QKKyAgICAgICAgICAgIC8vIGJlaW5nIHNl
cmlhbGl6ZWQuCisgICAgICAgICAgICBpZiAoIGlzUm9vdE9iamVjdCApIHsKKworICAgICAgICAg
ICAgICAgIC8vIGluaXRpYWxpemUgbWV0YSBvYmoKKyAgICAgICAgICAgICAgICBtZXRhID0gewor
ICAgICAgICAgICAgICAgICAgICBnZW9tZXRyaWVzOiB7fSwKKyAgICAgICAgICAgICAgICAgICAg
bWF0ZXJpYWxzOiB7fSwKKyAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXM6IHt9LAorICAgICAg
ICAgICAgICAgICAgICBpbWFnZXM6IHt9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAg
ICAgICAgIG91dHB1dC5tZXRhZGF0YSA9IHsKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjog
NC41LAorICAgICAgICAgICAgICAgICAgICB0eXBlOiAnT2JqZWN0JywKKyAgICAgICAgICAgICAg
ICAgICAgZ2VuZXJhdG9yOiAnT2JqZWN0M0QudG9KU09OJworICAgICAgICAgICAgICAgIH07CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3RhbmRhcmQgT2JqZWN0M0Qgc2VyaWFs
aXphdGlvbgorCisgICAgICAgICAgICB2YXIgb2JqZWN0ID0ge307CisKKyAgICAgICAgICAgIG9i
amVjdC51dWlkID0gdGhpcy51dWlkOworICAgICAgICAgICAgb2JqZWN0LnR5cGUgPSB0aGlzLnR5
cGU7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5uYW1lICE9PSAnJyApIG9iamVjdC5uYW1lID0g
dGhpcy5uYW1lOworICAgICAgICAgICAgaWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0
YSApICE9PSAne30nICkgb2JqZWN0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTsKKyAgICAgICAg
ICAgIGlmICggdGhpcy5jYXN0U2hhZG93ID09PSB0cnVlICkgb2JqZWN0LmNhc3RTaGFkb3cgPSB0
cnVlOworICAgICAgICAgICAgaWYgKCB0aGlzLnJlY2VpdmVTaGFkb3cgPT09IHRydWUgKSBvYmpl
Y3QucmVjZWl2ZVNoYWRvdyA9IHRydWU7CisgICAgICAgICAgICBpZiAoIHRoaXMudmlzaWJsZSA9
PT0gZmFsc2UgKSBvYmplY3QudmlzaWJsZSA9IGZhbHNlOworCisgICAgICAgICAgICBvYmplY3Qu
bWF0cml4ID0gdGhpcy5tYXRyaXgudG9BcnJheSgpOworCisgICAgICAgICAgICAvLworCisgICAg
ICAgICAgICBmdW5jdGlvbiBzZXJpYWxpemUoIGxpYnJhcnksIGVsZW1lbnQgKSB7CisKKyAgICAg
ICAgICAgICAgICBpZiAoIGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID09PSB1bmRlZmluZWQgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgbGlicmFyeVsgZWxlbWVudC51dWlkIF0gPSBlbGVtZW50
LnRvSlNPTiggbWV0YSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
cmV0dXJuIGVsZW1lbnQudXVpZDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAo
IHRoaXMuZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIG9iamVj
dC5nZW9tZXRyeSA9IHNlcmlhbGl6ZSggbWV0YS5nZW9tZXRyaWVzLCB0aGlzLmdlb21ldHJ5ICk7
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB0aGlzLm1hdGVyaWFsICE9PSB1
bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMu
bWF0ZXJpYWwgKSApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdXVpZHMgPSBbXTsKKwor
ICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLm1hdGVyaWFsLmxl
bmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHV1aWRzLnB1
c2goIHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWxbIGkgXSApICk7CisK
KyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG9iamVjdC5tYXRl
cmlhbCA9IHV1aWRzOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAg
ICAgICAgICBvYmplY3QubWF0ZXJpYWwgPSBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlz
Lm1hdGVyaWFsICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8KKworICAgICAgICAgICAgaWYgKCB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDAg
KSB7CisKKyAgICAgICAgICAgICAgICBvYmplY3QuY2hpbGRyZW4gPSBbXTsKKworICAgICAgICAg
ICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkg
eworCisgICAgICAgICAgICAgICAgICAgIG9iamVjdC5jaGlsZHJlbi5wdXNoKCB0aGlzLmNoaWxk
cmVuWyBpIF0udG9KU09OKCBtZXRhICkub2JqZWN0ICk7CisKKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBpc1Jvb3RPYmplY3QgKSB7CisKKyAg
ICAgICAgICAgICAgICB2YXIgZ2VvbWV0cmllcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuZ2Vv
bWV0cmllcyApOworICAgICAgICAgICAgICAgIHZhciBtYXRlcmlhbHMgPSBleHRyYWN0RnJvbUNh
Y2hlKCBtZXRhLm1hdGVyaWFscyApOworICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlcyA9IGV4
dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTsKKyAgICAgICAgICAgICAgICB2YXIgaW1h
Z2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTsKKworICAgICAgICAgICAgICAg
IGlmICggZ2VvbWV0cmllcy5sZW5ndGggPiAwICkgb3V0cHV0Lmdlb21ldHJpZXMgPSBnZW9tZXRy
aWVzOworICAgICAgICAgICAgICAgIGlmICggbWF0ZXJpYWxzLmxlbmd0aCA+IDAgKSBvdXRwdXQu
bWF0ZXJpYWxzID0gbWF0ZXJpYWxzOworICAgICAgICAgICAgICAgIGlmICggdGV4dHVyZXMubGVu
Z3RoID4gMCApIG91dHB1dC50ZXh0dXJlcyA9IHRleHR1cmVzOworICAgICAgICAgICAgICAgIGlm
ICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBvdXRwdXQuaW1hZ2VzID0gaW1hZ2VzOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIG91dHB1dC5vYmplY3QgPSBvYmplY3Q7CisKKyAgICAgICAg
ICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICAgICAgICAgIC8vIGV4dHJhY3QgZGF0YSBmcm9tIHRo
ZSBjYWNoZSBoYXNoCisgICAgICAgICAgICAvLyByZW1vdmUgbWV0YWRhdGEgb24gZWFjaCBpdGVt
CisgICAgICAgICAgICAvLyBhbmQgcmV0dXJuIGFzIGFycmF5CisgICAgICAgICAgICBmdW5jdGlv
biBleHRyYWN0RnJvbUNhY2hlKCBjYWNoZSApIHsKKworICAgICAgICAgICAgICAgIHZhciB2YWx1
ZXMgPSBbXTsKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIga2V5IGluIGNhY2hlICkgeworCisg
ICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gY2FjaGVbIGtleSBdOworICAgICAgICAgICAg
ICAgICAgICBkZWxldGUgZGF0YS5tZXRhZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVz
LnB1c2goIGRhdGEgKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1
cm4gdmFsdWVzOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSwKKworICAgICAgICBjbG9u
ZTogZnVuY3Rpb24gKCByZWN1cnNpdmUgKSB7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgdGhp
cy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMsIHJlY3Vyc2l2ZSApOworCisgICAgICAgIH0sCisK
KyAgICAgICAgY29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHsKKworICAgICAg
ICAgICAgaWYgKCByZWN1cnNpdmUgPT09IHVuZGVmaW5lZCApIHJlY3Vyc2l2ZSA9IHRydWU7CisK
KyAgICAgICAgICAgIHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lOworCisgICAgICAgICAgICB0aGlz
LnVwLmNvcHkoIHNvdXJjZS51cCApOworCisgICAgICAgICAgICB0aGlzLnBvc2l0aW9uLmNvcHko
IHNvdXJjZS5wb3NpdGlvbiApOworICAgICAgICAgICAgdGhpcy5xdWF0ZXJuaW9uLmNvcHkoIHNv
dXJjZS5xdWF0ZXJuaW9uICk7CisgICAgICAgICAgICB0aGlzLnNjYWxlLmNvcHkoIHNvdXJjZS5z
Y2FsZSApOworCisgICAgICAgICAgICB0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7
CisgICAgICAgICAgICB0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZCAp
OworCisgICAgICAgICAgICB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0
b1VwZGF0ZTsKKyAgICAgICAgICAgIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJj
ZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlOworCisgICAgICAgICAgICB0aGlzLmxheWVycy5tYXNr
ID0gc291cmNlLmxheWVycy5tYXNrOworICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gc291cmNl
LnZpc2libGU7CisKKyAgICAgICAgICAgIHRoaXMuY2FzdFNoYWRvdyA9IHNvdXJjZS5jYXN0U2hh
ZG93OworICAgICAgICAgICAgdGhpcy5yZWNlaXZlU2hhZG93ID0gc291cmNlLnJlY2VpdmVTaGFk
b3c7CisKKyAgICAgICAgICAgIHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHNvdXJjZS5mcnVzdHVtQ3Vs
bGVkOworICAgICAgICAgICAgdGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjsK
KworICAgICAgICAgICAgdGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5
KCBzb3VyY2UudXNlckRhdGEgKSApOworCisgICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSA9PT0g
dHJ1ZSApIHsKKworICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IHNvdXJjZS5j
aGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxk
ID0gc291cmNlLmNoaWxkcmVuWyBpIF07CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkKCBj
aGlsZC5jbG9uZSgpICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAg
LyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKiBA
YXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLworICAgICAqIEBhdXRob3Ig
V2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorICAgICovCisKKyAg
ICBmdW5jdGlvbiBDYW1lcmEoKSB7CisKKyAgICAgICAgT2JqZWN0M0QuY2FsbCggdGhpcyApOwor
CisgICAgICAgIHRoaXMudHlwZSA9ICdDYW1lcmEnOworCisgICAgICAgIHRoaXMubWF0cml4V29y
bGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTsKKyAgICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4
ID0gbmV3IE1hdHJpeDQoKTsKKworICAgIH0KKworICAgIENhbWVyYS5wcm90b3R5cGUgPSBPYmpl
Y3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgeworCisgICAg
ICAgIGNvbnN0cnVjdG9yOiBDYW1lcmEsCisKKyAgICAgICAgaXNDYW1lcmE6IHRydWUsCisKKyAg
ICAgICAgY29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHsKKworICAgICAgICAg
ICAgT2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUg
KTsKKworICAgICAgICAgICAgdGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSggc291cmNlLm1h
dHJpeFdvcmxkSW52ZXJzZSApOworICAgICAgICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4LmNv
cHkoIHNvdXJjZS5wcm9qZWN0aW9uTWF0cml4ICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlz
OworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgp
IHsKKworICAgICAgICAgICAgdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOworCisg
ICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGREaXJlY3Rpb24oIG9wdGlvbmFsVGFy
Z2V0ICkgeworCisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8
IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmdldFdvcmxkUXVhdGVybmlv
biggcXVhdGVybmlvbiApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5zZXQoIDAs
IDAsIC0gMSApLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApOworCisgICAgICAgICAgICB9
OworCisgICAgICAgIH0oKSwKKworICAgICAgICB1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24g
KCBmb3JjZSApIHsKKworICAgICAgICAgICAgT2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJp
eFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CisKKyAgICAgICAgICAgIHRoaXMubWF0cml4V29y
bGRJbnZlcnNlLmdldEludmVyc2UoIHRoaXMubWF0cml4V29ybGQgKTsKKworICAgICAgICB9LAor
CisgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcg
dGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKworICAgICAgICB9CisKKyAgICB9ICk7
CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFs
aWEuY29tLworICAgICAqIEBhdXRob3IgYXJvc2UgLyBodHRwOi8vZ2l0aHViLmNvbS9hcm9zZQor
ICAgICAqLworCisgICAgZnVuY3Rpb24gT3J0aG9ncmFwaGljQ2FtZXJhKCBsZWZ0LCByaWdodCwg
dG9wLCBib3R0b20sIG5lYXIsIGZhciApIHsKKworICAgICAgICBDYW1lcmEuY2FsbCggdGhpcyAp
OworCisgICAgICAgIHRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnOworCisgICAgICAg
IHRoaXMuem9vbSA9IDE7CisgICAgICAgIHRoaXMudmlldyA9IG51bGw7CisKKyAgICAgICAgdGhp
cy5sZWZ0ID0gbGVmdDsKKyAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0OworICAgICAgICB0aGlz
LnRvcCA9IHRvcDsKKyAgICAgICAgdGhpcy5ib3R0b20gPSBib3R0b207CisKKyAgICAgICAgdGhp
cy5uZWFyID0gKCBuZWFyICE9PSB1bmRlZmluZWQgKSA/IG5lYXIgOiAwLjE7CisgICAgICAgIHRo
aXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMjAwMDsKKworICAgICAgICB0
aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKKworICAgIH0KKworICAgIE9ydGhvZ3JhcGhp
Y0NhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDYW1lcmEu
cHJvdG90eXBlICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogT3J0aG9ncmFwaGljQ2FtZXJh
LAorCisgICAgICAgIGlzT3J0aG9ncmFwaGljQ2FtZXJhOiB0cnVlLAorCisgICAgICAgIGNvcHk6
IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7CisKKyAgICAgICAgICAgIENhbWVyYS5w
cm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApOworCisgICAgICAg
ICAgICB0aGlzLmxlZnQgPSBzb3VyY2UubGVmdDsKKyAgICAgICAgICAgIHRoaXMucmlnaHQgPSBz
b3VyY2UucmlnaHQ7CisgICAgICAgICAgICB0aGlzLnRvcCA9IHNvdXJjZS50b3A7CisgICAgICAg
ICAgICB0aGlzLmJvdHRvbSA9IHNvdXJjZS5ib3R0b207CisgICAgICAgICAgICB0aGlzLm5lYXIg
PSBzb3VyY2UubmVhcjsKKyAgICAgICAgICAgIHRoaXMuZmFyID0gc291cmNlLmZhcjsKKworICAg
ICAgICAgICAgdGhpcy56b29tID0gc291cmNlLnpvb207CisgICAgICAgICAgICB0aGlzLnZpZXcg
PSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNl
LnZpZXcgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAg
ICAgICBzZXRWaWV3T2Zmc2V0OiBmdW5jdGlvbiggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5
LCB3aWR0aCwgaGVpZ2h0ICkgeworCisgICAgICAgICAgICB0aGlzLnZpZXcgPSB7CisgICAgICAg
ICAgICAgICAgZnVsbFdpZHRoOiBmdWxsV2lkdGgsCisgICAgICAgICAgICAgICAgZnVsbEhlaWdo
dDogZnVsbEhlaWdodCwKKyAgICAgICAgICAgICAgICBvZmZzZXRYOiB4LAorICAgICAgICAgICAg
ICAgIG9mZnNldFk6IHksCisgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLAorICAgICAgICAg
ICAgICAgIGhlaWdodDogaGVpZ2h0CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlz
LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKKworICAgICAgICB9LAorCisgICAgICAgIGNsZWFy
Vmlld09mZnNldDogZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIHRoaXMudmlldyA9IG51bGw7
CisgICAgICAgICAgICB0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKKworICAgICAgICB9
LAorCisgICAgICAgIHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHsKKworICAg
ICAgICAgICAgdmFyIGR4ID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyAoIDIgKiB0aGlz
Lnpvb20gKTsKKyAgICAgICAgICAgIHZhciBkeSA9ICggdGhpcy50b3AgLSB0aGlzLmJvdHRvbSAp
IC8gKCAyICogdGhpcy56b29tICk7CisgICAgICAgICAgICB2YXIgY3ggPSAoIHRoaXMucmlnaHQg
KyB0aGlzLmxlZnQgKSAvIDI7CisgICAgICAgICAgICB2YXIgY3kgPSAoIHRoaXMudG9wICsgdGhp
cy5ib3R0b20gKSAvIDI7CisKKyAgICAgICAgICAgIHZhciBsZWZ0ID0gY3ggLSBkeDsKKyAgICAg
ICAgICAgIHZhciByaWdodCA9IGN4ICsgZHg7CisgICAgICAgICAgICB2YXIgdG9wID0gY3kgKyBk
eTsKKyAgICAgICAgICAgIHZhciBib3R0b20gPSBjeSAtIGR5OworCisgICAgICAgICAgICBpZiAo
IHRoaXMudmlldyAhPT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgIHZhciB6b29tVyA9IHRo
aXMuem9vbSAvICggdGhpcy52aWV3LndpZHRoIC8gdGhpcy52aWV3LmZ1bGxXaWR0aCApOworICAg
ICAgICAgICAgICAgIHZhciB6b29tSCA9IHRoaXMuem9vbSAvICggdGhpcy52aWV3LmhlaWdodCAv
IHRoaXMudmlldy5mdWxsSGVpZ2h0ICk7CisgICAgICAgICAgICAgICAgdmFyIHNjYWxlVyA9ICgg
dGhpcy5yaWdodCAtIHRoaXMubGVmdCApIC8gdGhpcy52aWV3LndpZHRoOworICAgICAgICAgICAg
ICAgIHZhciBzY2FsZUggPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvIHRoaXMudmlldy5o
ZWlnaHQ7CisKKyAgICAgICAgICAgICAgICBsZWZ0ICs9IHNjYWxlVyAqICggdGhpcy52aWV3Lm9m
ZnNldFggLyB6b29tVyApOworICAgICAgICAgICAgICAgIHJpZ2h0ID0gbGVmdCArIHNjYWxlVyAq
ICggdGhpcy52aWV3LndpZHRoIC8gem9vbVcgKTsKKyAgICAgICAgICAgICAgICB0b3AgLT0gc2Nh
bGVIICogKCB0aGlzLnZpZXcub2Zmc2V0WSAvIHpvb21IICk7CisgICAgICAgICAgICAgICAgYm90
dG9tID0gdG9wIC0gc2NhbGVIICogKCB0aGlzLnZpZXcuaGVpZ2h0IC8gem9vbUggKTsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhv
Z3JhcGhpYyggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7
CisKKyAgICAgICAgfSwKKworICAgICAgICB0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKKwor
ICAgICAgICAgICAgdmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRo
aXMsIG1ldGEgKTsKKworICAgICAgICAgICAgZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTsK
KyAgICAgICAgICAgIGRhdGEub2JqZWN0LmxlZnQgPSB0aGlzLmxlZnQ7CisgICAgICAgICAgICBk
YXRhLm9iamVjdC5yaWdodCA9IHRoaXMucmlnaHQ7CisgICAgICAgICAgICBkYXRhLm9iamVjdC50
b3AgPSB0aGlzLnRvcDsKKyAgICAgICAgICAgIGRhdGEub2JqZWN0LmJvdHRvbSA9IHRoaXMuYm90
dG9tOworICAgICAgICAgICAgZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjsKKyAgICAgICAg
ICAgIGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyOworCisgICAgICAgICAgICBpZiAoIHRoaXMu
dmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhp
cy52aWV3ICk7CisKKyAgICAgICAgICAgIHJldHVybiBkYXRhOworCisgICAgICAgIH0KKworICAg
IH0gKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5j
b20vCisgICAgICogQGF1dGhvciBncmVnZ21hbiAvIGh0dHA6Ly9nYW1lcy5ncmVnZ21hbi5jb20v
CisgICAgICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxv
ZworICAgICAqIEBhdXRob3IgdHNjaHcKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFBlcnNwZWN0
aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICkgeworCisgICAgICAgIENhbWVyYS5j
YWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhpcy50eXBlID0gJ1BlcnNwZWN0aXZlQ2FtZXJhJzsK
KworICAgICAgICB0aGlzLmZvdiA9IGZvdiAhPT0gdW5kZWZpbmVkID8gZm92IDogNTA7CisgICAg
ICAgIHRoaXMuem9vbSA9IDE7CisKKyAgICAgICAgdGhpcy5uZWFyID0gbmVhciAhPT0gdW5kZWZp
bmVkID8gbmVhciA6IDAuMTsKKyAgICAgICAgdGhpcy5mYXIgPSBmYXIgIT09IHVuZGVmaW5lZCA/
IGZhciA6IDIwMDA7CisgICAgICAgIHRoaXMuZm9jdXMgPSAxMDsKKworICAgICAgICB0aGlzLmFz
cGVjdCA9IGFzcGVjdCAhPT0gdW5kZWZpbmVkID8gYXNwZWN0IDogMTsKKyAgICAgICAgdGhpcy52
aWV3ID0gbnVsbDsKKworICAgICAgICB0aGlzLmZpbG1HYXVnZSA9IDM1OyAgICAvLyB3aWR0aCBv
ZiB0aGUgZmlsbSAoZGVmYXVsdCBpbiBtaWxsaW1ldGVycykKKyAgICAgICAgdGhpcy5maWxtT2Zm
c2V0ID0gMDsgICAgLy8gaG9yaXpvbnRhbCBmaWxtIG9mZnNldCAoc2FtZSB1bml0IGFzIGdhdWdl
KQorCisgICAgICAgIHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOworCisgICAgfQorCisg
ICAgUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNy
ZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7CisKKyAgICAgICAgY29uc3RydWN0b3I6IFBlcnNw
ZWN0aXZlQ2FtZXJhLAorCisgICAgICAgIGlzUGVyc3BlY3RpdmVDYW1lcmE6IHRydWUsCisKKyAg
ICAgICAgY29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHsKKworICAgICAgICAg
ICAgQ2FtZXJhLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7
CisKKyAgICAgICAgICAgIHRoaXMuZm92ID0gc291cmNlLmZvdjsKKyAgICAgICAgICAgIHRoaXMu
em9vbSA9IHNvdXJjZS56b29tOworCisgICAgICAgICAgICB0aGlzLm5lYXIgPSBzb3VyY2UubmVh
cjsKKyAgICAgICAgICAgIHRoaXMuZmFyID0gc291cmNlLmZhcjsKKyAgICAgICAgICAgIHRoaXMu
Zm9jdXMgPSBzb3VyY2UuZm9jdXM7CisKKyAgICAgICAgICAgIHRoaXMuYXNwZWN0ID0gc291cmNl
LmFzcGVjdDsKKyAgICAgICAgICAgIHRoaXMudmlldyA9IHNvdXJjZS52aWV3ID09PSBudWxsID8g
bnVsbCA6IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UudmlldyApOworCisgICAgICAgICAgICB0
aGlzLmZpbG1HYXVnZSA9IHNvdXJjZS5maWxtR2F1Z2U7CisgICAgICAgICAgICB0aGlzLmZpbG1P
ZmZzZXQgPSBzb3VyY2UuZmlsbU9mZnNldDsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisK
KyAgICAgICAgfSwKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgRk9WIGJ5IGZv
Y2FsIGxlbmd0aCBpbiByZXNwZWN0IHRvIHRoZSBjdXJyZW50IC5maWxtR2F1Z2UuCisgICAgICAg
ICAqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IGZpbG0gZ2F1Z2UgaXMgMzUsIHNvIHRoYXQgdGhl
IGZvY2FsIGxlbmd0aCBjYW4gYmUgc3BlY2lmaWVkIGZvcgorICAgICAgICAgKiBhIDM1bW0gKGZ1
bGwgZnJhbWUpIGNhbWVyYS4KKyAgICAgICAgICoKKyAgICAgICAgICogVmFsdWVzIGZvciBmb2Nh
bCBsZW5ndGggYW5kIGZpbG0gZ2F1Z2UgbXVzdCBoYXZlIHRoZSBzYW1lIHVuaXQuCisgICAgICAg
ICAqLworICAgICAgICBzZXRGb2NhbExlbmd0aDogZnVuY3Rpb24gKCBmb2NhbExlbmd0aCApIHsK
KworICAgICAgICAgICAgLy8gc2VlIGh0dHA6Ly93d3cuYm9iYXRraW5zLmNvbS9waG90b2dyYXBo
eS90ZWNobmljYWwvZmllbGRfb2Zfdmlldy5odG1sCisgICAgICAgICAgICB2YXIgdkV4dGVudFNs
b3BlID0gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyBmb2NhbExlbmd0aDsKKworICAgICAg
ICAgICAgdGhpcy5mb3YgPSBfTWF0aC5SQUQyREVHICogMiAqIE1hdGguYXRhbiggdkV4dGVudFNs
b3BlICk7CisgICAgICAgICAgICB0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKKworICAg
ICAgICB9LAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxjdWxhdGVzIHRoZSBmb2NhbCBs
ZW5ndGggZnJvbSB0aGUgY3VycmVudCAuZm92IGFuZCAuZmlsbUdhdWdlLgorICAgICAgICAgKi8K
KyAgICAgICAgZ2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFy
IHZFeHRlbnRTbG9wZSA9IE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3Yg
KTsKKworICAgICAgICAgICAgcmV0dXJuIDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gdkV4
dGVudFNsb3BlOworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0RWZmZWN0aXZlRk9WOiBmdW5j
dGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBfTWF0aC5SQUQyREVHICogMiAqIE1hdGgu
YXRhbigKKyAgICAgICAgICAgICAgICAgICAgTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiAwLjUg
KiB0aGlzLmZvdiApIC8gdGhpcy56b29tICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBnZXRG
aWxtV2lkdGg6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgLy8gZmlsbSBub3QgY29tcGxl
dGVseSBjb3ZlcmVkIGluIHBvcnRyYWl0IGZvcm1hdCAoYXNwZWN0IDwgMSkKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKCB0aGlzLmFzcGVjdCwgMSApOworCisg
ICAgICAgIH0sCisKKyAgICAgICAgZ2V0RmlsbUhlaWdodDogZnVuY3Rpb24gKCkgeworCisgICAg
ICAgICAgICAvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gbGFuZHNjYXBlIGZvcm1h
dCAoYXNwZWN0ID4gMSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbG1HYXVnZSAvIE1hdGgu
bWF4KCB0aGlzLmFzcGVjdCwgMSApOworCisgICAgICAgIH0sCisKKyAgICAgICAgLyoqCisgICAg
ICAgICAqIFNldHMgYW4gb2Zmc2V0IGluIGEgbGFyZ2VyIGZydXN0dW0uIFRoaXMgaXMgdXNlZnVs
IGZvciBtdWx0aS13aW5kb3cgb3IKKyAgICAgICAgICogbXVsdGktbW9uaXRvci9tdWx0aS1tYWNo
aW5lIHNldHVwcy4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBo
YXZlIDN4MiBtb25pdG9ycyBhbmQgZWFjaCBtb25pdG9yIGlzIDE5MjB4MTA4MCBhbmQKKyAgICAg
ICAgICogdGhlIG1vbml0b3JzIGFyZSBpbiBncmlkIGxpa2UgdGhpcworICAgICAgICAgKgorICAg
ICAgICAgKiAgICstLS0rLS0tKy0tLSsKKyAgICAgICAgICogICB8IEEgfCBCIHwgQyB8CisgICAg
ICAgICAqICAgKy0tLSstLS0rLS0tKworICAgICAgICAgKiAgIHwgRCB8IEUgfCBGIHwKKyAgICAg
ICAgICogICArLS0tKy0tLSstLS0rCisgICAgICAgICAqCisgICAgICAgICAqIHRoZW4gZm9yIGVh
Y2ggbW9uaXRvciB5b3Ugd291bGQgY2FsbCBpdCBsaWtlIHRoaXMKKyAgICAgICAgICoKKyAgICAg
ICAgICogICB2YXIgdyA9IDE5MjA7CisgICAgICAgICAqICAgdmFyIGggPSAxMDgwOworICAgICAg
ICAgKiAgIHZhciBmdWxsV2lkdGggPSB3ICogMzsKKyAgICAgICAgICogICB2YXIgZnVsbEhlaWdo
dCA9IGggKiAyOworICAgICAgICAgKgorICAgICAgICAgKiAgIC0tQS0tCisgICAgICAgICAqICAg
Y2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMCwgaCAqIDAsIHcs
IGggKTsKKyAgICAgICAgICogICAtLUItLQorICAgICAgICAgKiAgIGNhbWVyYS5zZXRPZmZzZXQo
IGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAwLCB3LCBoICk7CisgICAgICAgICAq
ICAgLS1DLS0KKyAgICAgICAgICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxI
ZWlnaHQsIHcgKiAyLCBoICogMCwgdywgaCApOworICAgICAgICAgKiAgIC0tRC0tCisgICAgICAg
ICAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMCwgaCAq
IDEsIHcsIGggKTsKKyAgICAgICAgICogICAtLUUtLQorICAgICAgICAgKiAgIGNhbWVyYS5zZXRP
ZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAxLCB3LCBoICk7CisgICAg
ICAgICAqICAgLS1GLS0KKyAgICAgICAgICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgs
IGZ1bGxIZWlnaHQsIHcgKiAyLCBoICogMSwgdywgaCApOworICAgICAgICAgKgorICAgICAgICAg
KiAgIE5vdGUgdGhlcmUgaXMgbm8gcmVhc29uIG1vbml0b3JzIGhhdmUgdG8gYmUgdGhlIHNhbWUg
c2l6ZSBvciBpbiBhIGdyaWQuCisgICAgICAgICAqLworICAgICAgICBzZXRWaWV3T2Zmc2V0OiBm
dW5jdGlvbiAoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHsK
KworICAgICAgICAgICAgdGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0OworCisg
ICAgICAgICAgICB0aGlzLnZpZXcgPSB7CisgICAgICAgICAgICAgICAgZnVsbFdpZHRoOiBmdWxs
V2lkdGgsCisgICAgICAgICAgICAgICAgZnVsbEhlaWdodDogZnVsbEhlaWdodCwKKyAgICAgICAg
ICAgICAgICBvZmZzZXRYOiB4LAorICAgICAgICAgICAgICAgIG9mZnNldFk6IHksCisgICAgICAg
ICAgICAgICAgd2lkdGg6IHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0Cisg
ICAgICAgICAgICB9OworCisgICAgICAgICAgICB0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgo
KTsKKworICAgICAgICB9LAorCisgICAgICAgIGNsZWFyVmlld09mZnNldDogZnVuY3Rpb24gKCkg
eworCisgICAgICAgICAgICB0aGlzLnZpZXcgPSBudWxsOworICAgICAgICAgICAgdGhpcy51cGRh
dGVQcm9qZWN0aW9uTWF0cml4KCk7CisKKyAgICAgICAgfSwKKworICAgICAgICB1cGRhdGVQcm9q
ZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciBuZWFyID0gdGhp
cy5uZWFyLAorICAgICAgICAgICAgICAgIHRvcCA9IG5lYXIgKiBNYXRoLnRhbigKKyAgICAgICAg
ICAgICAgICAgICAgICAgIF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56
b29tLAorICAgICAgICAgICAgICAgIGhlaWdodCA9IDIgKiB0b3AsCisgICAgICAgICAgICAgICAg
d2lkdGggPSB0aGlzLmFzcGVjdCAqIGhlaWdodCwKKyAgICAgICAgICAgICAgICBsZWZ0ID0gLSAw
LjUgKiB3aWR0aCwKKyAgICAgICAgICAgICAgICB2aWV3ID0gdGhpcy52aWV3OworCisgICAgICAg
ICAgICBpZiAoIHZpZXcgIT09IG51bGwgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgZnVsbFdp
ZHRoID0gdmlldy5mdWxsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGZ1bGxIZWlnaHQgPSB2
aWV3LmZ1bGxIZWlnaHQ7CisKKyAgICAgICAgICAgICAgICBsZWZ0ICs9IHZpZXcub2Zmc2V0WCAq
IHdpZHRoIC8gZnVsbFdpZHRoOworICAgICAgICAgICAgICAgIHRvcCAtPSB2aWV3Lm9mZnNldFkg
KiBoZWlnaHQgLyBmdWxsSGVpZ2h0OworICAgICAgICAgICAgICAgIHdpZHRoICo9IHZpZXcud2lk
dGggLyBmdWxsV2lkdGg7CisgICAgICAgICAgICAgICAgaGVpZ2h0ICo9IHZpZXcuaGVpZ2h0IC8g
ZnVsbEhlaWdodDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc2tldyA9IHRo
aXMuZmlsbU9mZnNldDsKKyAgICAgICAgICAgIGlmICggc2tldyAhPT0gMCApIGxlZnQgKz0gbmVh
ciAqIHNrZXcgLyB0aGlzLmdldEZpbG1XaWR0aCgpOworCisgICAgICAgICAgICB0aGlzLnByb2pl
Y3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCBsZWZ0ICsgd2lkdGgsIHRvcCwgdG9w
IC0gaGVpZ2h0LCBuZWFyLCB0aGlzLmZhciApOworCisgICAgICAgIH0sCisKKyAgICAgICAgdG9K
U09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CisKKyAgICAgICAgICAgIHZhciBkYXRhID0gT2JqZWN0
M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CisKKyAgICAgICAgICAgIGRh
dGEub2JqZWN0LmZvdiA9IHRoaXMuZm92OworICAgICAgICAgICAgZGF0YS5vYmplY3Quem9vbSA9
IHRoaXMuem9vbTsKKworICAgICAgICAgICAgZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjsK
KyAgICAgICAgICAgIGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyOworICAgICAgICAgICAgZGF0
YS5vYmplY3QuZm9jdXMgPSB0aGlzLmZvY3VzOworCisgICAgICAgICAgICBkYXRhLm9iamVjdC5h
c3BlY3QgPSB0aGlzLmFzcGVjdDsKKworICAgICAgICAgICAgaWYgKCB0aGlzLnZpZXcgIT09IG51
bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApOwor
CisgICAgICAgICAgICBkYXRhLm9iamVjdC5maWxtR2F1Z2UgPSB0aGlzLmZpbG1HYXVnZTsKKyAg
ICAgICAgICAgIGRhdGEub2JqZWN0LmZpbG1PZmZzZXQgPSB0aGlzLmZpbG1PZmZzZXQ7CisKKyAg
ICAgICAgICAgIHJldHVybiBkYXRhOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8q
KgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1
dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKi8KKworICAg
IGZ1bmN0aW9uIEZhY2UzKCBhLCBiLCBjLCBub3JtYWwsIGNvbG9yLCBtYXRlcmlhbEluZGV4ICkg
eworCisgICAgICAgIHRoaXMuYSA9IGE7CisgICAgICAgIHRoaXMuYiA9IGI7CisgICAgICAgIHRo
aXMuYyA9IGM7CisKKyAgICAgICAgdGhpcy5ub3JtYWwgPSAoIG5vcm1hbCAmJiBub3JtYWwuaXNW
ZWN0b3IzICkgPyBub3JtYWwgOiBuZXcgVmVjdG9yMygpOworICAgICAgICB0aGlzLnZlcnRleE5v
cm1hbHMgPSBBcnJheS5pc0FycmF5KCBub3JtYWwgKSA/IG5vcm1hbCA6IFtdOworCisgICAgICAg
IHRoaXMuY29sb3IgPSAoIGNvbG9yICYmIGNvbG9yLmlzQ29sb3IgKSA/IGNvbG9yIDogbmV3IENv
bG9yKCk7CisgICAgICAgIHRoaXMudmVydGV4Q29sb3JzID0gQXJyYXkuaXNBcnJheSggY29sb3Ig
KSA/IGNvbG9yIDogW107CisKKyAgICAgICAgdGhpcy5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJ
bmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDA7CisKKyAgICB9CisKKyAgICBP
YmplY3QuYXNzaWduKCBGYWNlMy5wcm90b3R5cGUsIHsKKworICAgICAgICBjbG9uZTogZnVuY3Rp
b24gKCkgeworCisgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5
KCB0aGlzICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBjb3B5OiBmdW5jdGlvbiAoIHNvdXJj
ZSApIHsKKworICAgICAgICAgICAgdGhpcy5hID0gc291cmNlLmE7CisgICAgICAgICAgICB0aGlz
LmIgPSBzb3VyY2UuYjsKKyAgICAgICAgICAgIHRoaXMuYyA9IHNvdXJjZS5jOworCisgICAgICAg
ICAgICB0aGlzLm5vcm1hbC5jb3B5KCBzb3VyY2Uubm9ybWFsICk7CisgICAgICAgICAgICB0aGlz
LmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworCisgICAgICAgICAgICB0aGlzLm1hdGVyaWFs
SW5kZXggPSBzb3VyY2UubWF0ZXJpYWxJbmRleDsKKworICAgICAgICAgICAgZm9yICggdmFyIGkg
PSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewor
CisgICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhOb3JtYWxzWyBpIF0gPSBzb3VyY2UudmVydGV4
Tm9ybWFsc1sgaSBdLmNsb25lKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9y
ICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkg
KysgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLnZlcnRleENvbG9yc1sgaSBdID0gc291cmNl
LnZlcnRleENvbG9yc1sgaSBdLmNsb25lKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAg
ICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKiBAYXV0aG9yIGtp
bGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvCisgICAgICogQGF1dGhvciBhbHRlcmVk
cSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKiBAYXV0aG9yIG1pa2FlbCBlbXRp
bmdlciAvIGh0dHA6Ly9nb21vLnNlLworICAgICAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cu
bGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKKyAgICAgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDov
L2NsYXJhLmlvCisgICAgICovCisKKyAgICB2YXIgY291bnQgPSAwOworICAgIGZ1bmN0aW9uIEdl
b21ldHJ5SWRDb3VudCgpIHsgcmV0dXJuIGNvdW50Kys7IH0KKworICAgIGZ1bmN0aW9uIEdlb21l
dHJ5KCkgeworCisgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2
YWx1ZTogR2VvbWV0cnlJZENvdW50KCkgfSApOworCisgICAgICAgIHRoaXMudXVpZCA9IF9NYXRo
LmdlbmVyYXRlVVVJRCgpOworCisgICAgICAgIHRoaXMubmFtZSA9ICcnOworICAgICAgICB0aGlz
LnR5cGUgPSAnR2VvbWV0cnknOworCisgICAgICAgIHRoaXMudmVydGljZXMgPSBbXTsKKyAgICAg
ICAgdGhpcy5jb2xvcnMgPSBbXTsKKyAgICAgICAgdGhpcy5mYWNlcyA9IFtdOworICAgICAgICB0
aGlzLmZhY2VWZXJ0ZXhVdnMgPSBbW11dOworCisgICAgICAgIHRoaXMubW9ycGhUYXJnZXRzID0g
W107CisgICAgICAgIHRoaXMubW9ycGhOb3JtYWxzID0gW107CisKKyAgICAgICAgdGhpcy5za2lu
V2VpZ2h0cyA9IFtdOworICAgICAgICB0aGlzLnNraW5JbmRpY2VzID0gW107CisKKyAgICAgICAg
dGhpcy5saW5lRGlzdGFuY2VzID0gW107CisKKyAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IG51
bGw7CisgICAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOworCisgICAgICAgIC8vIHVw
ZGF0ZSBmbGFncworCisgICAgICAgIHRoaXMuZWxlbWVudHNOZWVkVXBkYXRlID0gZmFsc2U7Cisg
ICAgICAgIHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7CisgICAgICAgIHRoaXMudXZz
TmVlZFVwZGF0ZSA9IGZhbHNlOworICAgICAgICB0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZmFs
c2U7CisgICAgICAgIHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlOworICAgICAgICB0aGlz
LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gZmFsc2U7CisgICAgICAgIHRoaXMuZ3JvdXBzTmVl
ZFVwZGF0ZSA9IGZhbHNlOworCisgICAgfQorCisgICAgT2JqZWN0LmFzc2lnbiggR2VvbWV0cnku
cHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7CisKKyAgICAgICAgaXNHZW9t
ZXRyeTogdHJ1ZSwKKworICAgICAgICBhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7
CisKKyAgICAgICAgICAgIHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1h
bE1hdHJpeCggbWF0cml4ICk7CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwgaWwgPSB0
aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAg
dmFyIHZlcnRleCA9IHRoaXMudmVydGljZXNbIGkgXTsKKyAgICAgICAgICAgICAgICB2ZXJ0ZXgu
YXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBm
b3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsK
KworICAgICAgICAgICAgICAgIHZhciBmYWNlID0gdGhpcy5mYWNlc1sgaSBdOworICAgICAgICAg
ICAgICAgIGZhY2Uubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXpl
KCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhO
b3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIGZh
Y2UudmVydGV4Tm9ybWFsc1sgaiBdLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFs
aXplKCk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkgeworCisgICAgICAgICAgICAgICAg
dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CisKKyAgICAgICAgICAgICAg
ICB0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOworCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMu
bm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKwor
ICAgICAgICB9LAorCisgICAgICAgIHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAg
ICAgLy8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXMKKworICAgICAgICAgICAg
dmFyIG0xID0gbmV3IE1hdHJpeDQoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJv
dGF0ZVgoIGFuZ2xlICkgeworCisgICAgICAgICAgICAgICAgbTEubWFrZVJvdGF0aW9uWCggYW5n
bGUgKTsKKworICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7CisKKyAgICAg
ICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9KCks
CisKKyAgICAgICAgcm90YXRlWTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAvLyByb3Rh
dGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHktYXhpcworCisgICAgICAgICAgICB2YXIgbTEgPSBu
ZXcgTWF0cml4NCgpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5n
bGUgKSB7CisKKyAgICAgICAgICAgICAgICBtMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApOworCisg
ICAgICAgICAgICAgICAgdGhpcy5hcHBseU1hdHJpeCggbTEgKTsKKworICAgICAgICAgICAgICAg
IHJldHVybiB0aGlzOworCisgICAgICAgICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAg
ICByb3RhdGVaOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8vIHJvdGF0ZSBnZW9tZXRy
eSBhcm91bmQgd29ybGQgei1heGlzCisKKyAgICAgICAgICAgIHZhciBtMSA9IG5ldyBNYXRyaXg0
KCk7CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHsKKwor
ICAgICAgICAgICAgICAgIG0xLm1ha2VSb3RhdGlvblooIGFuZ2xlICk7CisKKyAgICAgICAgICAg
ICAgICB0aGlzLmFwcGx5TWF0cml4KCBtMSApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRo
aXM7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIHRyYW5zbGF0
ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAvLyB0cmFuc2xhdGUgZ2VvbWV0cnkKKwor
ICAgICAgICAgICAgdmFyIG0xID0gbmV3IE1hdHJpeDQoKTsKKworICAgICAgICAgICAgcmV0dXJu
IGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiApIHsKKworICAgICAgICAgICAgICAgIG0xLm1h
a2VUcmFuc2xhdGlvbiggeCwgeSwgeiApOworCisgICAgICAgICAgICAgICAgdGhpcy5hcHBseU1h
dHJpeCggbTEgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgICAg
ICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICBzY2FsZTogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICAvLyBzY2FsZSBnZW9tZXRyeQorCisgICAgICAgICAgICB2YXIgbTEgPSBuZXcg
TWF0cml4NCgpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gc2NhbGUoIHgsIHksIHog
KSB7CisKKyAgICAgICAgICAgICAgICBtMS5tYWtlU2NhbGUoIHgsIHksIHogKTsKKworICAgICAg
ICAgICAgICAgIHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7CisKKyAgICAgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9KCksCisKKyAgICAgICAgbG9v
a0F0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciBvYmogPSBuZXcgT2JqZWN0M0Qo
KTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkgeworCisg
ICAgICAgICAgICAgICAgb2JqLmxvb2tBdCggdmVjdG9yICk7CisKKyAgICAgICAgICAgICAgICBv
YmoudXBkYXRlTWF0cml4KCk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmFwcGx5TWF0cml4KCBv
YmoubWF0cml4ICk7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAg
IGZyb21CdWZmZXJHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHsKKworICAgICAgICAg
ICAgdmFyIHNjb3BlID0gdGhpczsKKworICAgICAgICAgICAgdmFyIGluZGljZXMgPSBnZW9tZXRy
eS5pbmRleCAhPT0gbnVsbCA/IGdlb21ldHJ5LmluZGV4LmFycmF5IDogdW5kZWZpbmVkOworICAg
ICAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOworCisgICAgICAg
ICAgICB2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTsKKyAgICAgICAg
ICAgIHZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZCA/IGF0dHJp
YnV0ZXMubm9ybWFsLmFycmF5IDogdW5kZWZpbmVkOworICAgICAgICAgICAgdmFyIGNvbG9ycyA9
IGF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMuY29sb3IuYXJyYXkg
OiB1bmRlZmluZWQ7CisgICAgICAgICAgICB2YXIgdXZzID0gYXR0cmlidXRlcy51diAhPT0gdW5k
ZWZpbmVkID8gYXR0cmlidXRlcy51di5hcnJheSA6IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIHZh
ciB1dnMyID0gYXR0cmlidXRlcy51djIgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMudXYyLmFy
cmF5IDogdW5kZWZpbmVkOworCisgICAgICAgICAgICBpZiAoIHV2czIgIT09IHVuZGVmaW5lZCAp
IHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdID0gW107CisKKyAgICAgICAgICAgIHZhciB0ZW1wTm9y
bWFscyA9IFtdOworICAgICAgICAgICAgdmFyIHRlbXBVVnMgPSBbXTsKKyAgICAgICAgICAgIHZh
ciB0ZW1wVVZzMiA9IFtdOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBp
IDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAzLCBqICs9IDIgKSB7CisKKyAgICAgICAgICAgICAg
ICBzY29wZS52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9zaXRpb25zWyBpIF0sIHBvc2l0
aW9uc1sgaSArIDEgXSwgcG9zaXRpb25zWyBpICsgMiBdICkgKTsKKworICAgICAgICAgICAgICAg
IGlmICggbm9ybWFscyAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIHRl
bXBOb3JtYWxzLnB1c2goIG5ldyBWZWN0b3IzKCBub3JtYWxzWyBpIF0sIG5vcm1hbHNbIGkgKyAx
IF0sIG5vcm1hbHNbIGkgKyAyIF0gKSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgaWYgKCBjb2xvcnMgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAg
ICAgICBzY29wZS5jb2xvcnMucHVzaCggbmV3IENvbG9yKCBjb2xvcnNbIGkgXSwgY29sb3JzWyBp
ICsgMSBdLCBjb2xvcnNbIGkgKyAyIF0gKSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgaWYgKCB1dnMgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAg
ICAgICB0ZW1wVVZzLnB1c2goIG5ldyBWZWN0b3IyKCB1dnNbIGogXSwgdXZzWyBqICsgMSBdICkg
KTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggdXZzMiAhPT0g
dW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIHRlbXBVVnMyLnB1c2goIG5ldyBW
ZWN0b3IyKCB1dnMyWyBqIF0sIHV2czJbIGogKyAxIF0gKSApOworCisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIGFkZEZhY2UoIGEsIGIs
IGMsIG1hdGVyaWFsSW5kZXggKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgdmVydGV4Tm9ybWFs
cyA9IG5vcm1hbHMgIT09IHVuZGVmaW5lZCA/IFsgdGVtcE5vcm1hbHNbIGEgXS5jbG9uZSgpLCB0
ZW1wTm9ybWFsc1sgYiBdLmNsb25lKCksIHRlbXBOb3JtYWxzWyBjIF0uY2xvbmUoKSBdIDogW107
CisgICAgICAgICAgICAgICAgdmFyIHZlcnRleENvbG9ycyA9IGNvbG9ycyAhPT0gdW5kZWZpbmVk
ID8gWyBzY29wZS5jb2xvcnNbIGEgXS5jbG9uZSgpLCBzY29wZS5jb2xvcnNbIGIgXS5jbG9uZSgp
LCBzY29wZS5jb2xvcnNbIGMgXS5jbG9uZSgpIF0gOiBbXTsKKworICAgICAgICAgICAgICAgIHZh
ciBmYWNlID0gbmV3IEZhY2UzKCBhLCBiLCBjLCB2ZXJ0ZXhOb3JtYWxzLCB2ZXJ0ZXhDb2xvcnMs
IG1hdGVyaWFsSW5kZXggKTsKKworICAgICAgICAgICAgICAgIHNjb3BlLmZhY2VzLnB1c2goIGZh
Y2UgKTsKKworICAgICAgICAgICAgICAgIGlmICggdXZzICE9PSB1bmRlZmluZWQgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgc2NvcGUuZmFjZVZlcnRleFV2c1sgMCBdLnB1c2goIFsgdGVtcFVW
c1sgYSBdLmNsb25lKCksIHRlbXBVVnNbIGIgXS5jbG9uZSgpLCB0ZW1wVVZzWyBjIF0uY2xvbmUo
KSBdICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIHV2czIg
IT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICBzY29wZS5mYWNlVmVydGV4
VXZzWyAxIF0ucHVzaCggWyB0ZW1wVVZzMlsgYSBdLmNsb25lKCksIHRlbXBVVnMyWyBiIF0uY2xv
bmUoKSwgdGVtcFVWczJbIGMgXS5jbG9uZSgpIF0gKTsKKworICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBz
OworCisgICAgICAgICAgICBpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkgeworCisgICAgICAgICAg
ICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSArKyApIHsKKworICAg
ICAgICAgICAgICAgICAgICB2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTsKKworICAgICAgICAgICAg
ICAgICAgICB2YXIgc3RhcnQgPSBncm91cC5zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgdmFy
IGNvdW50ID0gZ3JvdXAuY291bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGog
PSBzdGFydCwgamwgPSBzdGFydCArIGNvdW50OyBqIDwgamw7IGogKz0gMyApIHsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCBpbmRpY2VzICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBhZGRGYWNlKCBpbmRpY2VzWyBqIF0sIGluZGljZXNbIGog
KyAxIF0sIGluZGljZXNbIGogKyAyIF0sIGdyb3VwLm1hdGVyaWFsSW5kZXggKTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGFkZEZhY2UoIGosIGogKyAxLCBqICsgMiwgZ3JvdXAubWF0ZXJpYWxJbmRleCApOworCisgICAg
ICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgaWYg
KCBpbmRpY2VzICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICgg
dmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMyApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgYWRkRmFjZSggaW5kaWNlc1sgaSBdLCBpbmRpY2VzWyBpICsgMSBdLCBpbmRp
Y2VzWyBpICsgMiBdICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBw
b3NpdGlvbnMubGVuZ3RoIC8gMzsgaSArPSAzICkgeworCisgICAgICAgICAgICAgICAgICAgICAg
ICBhZGRGYWNlKCBpLCBpICsgMSwgaSArIDIgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5j
b21wdXRlRmFjZU5vcm1hbHMoKTsKKworICAgICAgICAgICAgaWYgKCBnZW9tZXRyeS5ib3VuZGlu
Z0JveCAhPT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuYm91bmRpbmdCb3ggPSBn
ZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CisKKyAgICAgICAg
ICAgICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xv
bmUoKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAg
ICAgICB9LAorCisgICAgICAgIGNlbnRlcjogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB0
aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpOworCisgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhp
cy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoKS5uZWdhdGUoKTsKKworICAgICAgICAgICAgdGhpcy50
cmFuc2xhdGUoIG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnogKTsKKworICAgICAgICAgICAg
cmV0dXJuIG9mZnNldDsKKworICAgICAgICB9LAorCisgICAgICAgIG5vcm1hbGl6ZTogZnVuY3Rp
b24gKCkgeworCisgICAgICAgICAgICB0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOworCisg
ICAgICAgICAgICB2YXIgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7CisgICAg
ICAgICAgICB2YXIgcmFkaXVzID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM7CisKKyAgICAg
ICAgICAgIHZhciBzID0gcmFkaXVzID09PSAwID8gMSA6IDEuMCAvIHJhZGl1czsKKworICAgICAg
ICAgICAgdmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CisgICAgICAgICAgICBtYXRyaXguc2V0
KAorICAgICAgICAgICAgICAgIHMsIDAsIDAsIC0gcyAqIGNlbnRlci54LAorICAgICAgICAgICAg
ICAgIDAsIHMsIDAsIC0gcyAqIGNlbnRlci55LAorICAgICAgICAgICAgICAgIDAsIDAsIHMsIC0g
cyAqIGNlbnRlci56LAorICAgICAgICAgICAgICAgIDAsIDAsIDAsIDEKKyAgICAgICAgICAgICk7
CisKKyAgICAgICAgICAgIHRoaXMuYXBwbHlNYXRyaXgoIG1hdHJpeCApOworCisgICAgICAgICAg
ICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGNvbXB1dGVGYWNlTm9ybWFs
czogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBh
YiA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgIGZvciAoIHZhciBmID0gMCwgZmwgPSB0
aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgeworCisgICAgICAgICAgICAgICAgdmFy
IGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07CisKKyAgICAgICAgICAgICAgICB2YXIgdkEgPSB0aGlz
LnZlcnRpY2VzWyBmYWNlLmEgXTsKKyAgICAgICAgICAgICAgICB2YXIgdkIgPSB0aGlzLnZlcnRp
Y2VzWyBmYWNlLmIgXTsKKyAgICAgICAgICAgICAgICB2YXIgdkMgPSB0aGlzLnZlcnRpY2VzWyBm
YWNlLmMgXTsKKworICAgICAgICAgICAgICAgIGNiLnN1YlZlY3RvcnMoIHZDLCB2QiApOworICAg
ICAgICAgICAgICAgIGFiLnN1YlZlY3RvcnMoIHZBLCB2QiApOworICAgICAgICAgICAgICAgIGNi
LmNyb3NzKCBhYiApOworCisgICAgICAgICAgICAgICAgY2Iubm9ybWFsaXplKCk7CisKKyAgICAg
ICAgICAgICAgICBmYWNlLm5vcm1hbC5jb3B5KCBjYiApOworCisgICAgICAgICAgICB9CisKKyAg
ICAgICAgfSwKKworICAgICAgICBjb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCBhcmVh
V2VpZ2h0ZWQgKSB7CisKKyAgICAgICAgICAgIGlmICggYXJlYVdlaWdodGVkID09PSB1bmRlZmlu
ZWQgKSBhcmVhV2VpZ2h0ZWQgPSB0cnVlOworCisgICAgICAgICAgICB2YXIgdiwgdmwsIGYsIGZs
LCBmYWNlLCB2ZXJ0aWNlczsKKworICAgICAgICAgICAgdmVydGljZXMgPSBuZXcgQXJyYXkoIHRo
aXMudmVydGljZXMubGVuZ3RoICk7CisKKyAgICAgICAgICAgIGZvciAoIHYgPSAwLCB2bCA9IHRo
aXMudmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2
ZXJ0aWNlc1sgdiBdID0gbmV3IFZlY3RvcjMoKTsKKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAoIGFyZWFXZWlnaHRlZCApIHsKKworICAgICAgICAgICAgICAgIC8vIHZlcnRleCBu
b3JtYWxzIHdlaWdodGVkIGJ5IHRyaWFuZ2xlIGFyZWFzCisgICAgICAgICAgICAgICAgLy8gaHR0
cDovL3d3dy5pcXVpbGV6bGVzLm9yZy93d3cvYXJ0aWNsZXMvbm9ybWFscy9ub3JtYWxzLmh0bQor
CisgICAgICAgICAgICAgICAgdmFyIHZBLCB2QiwgdkM7CisgICAgICAgICAgICAgICAgdmFyIGNi
ID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICAgICAg
Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKKwor
ICAgICAgICAgICAgICAgICAgICBmYWNlID0gdGhpcy5mYWNlc1sgZiBdOworCisgICAgICAgICAg
ICAgICAgICAgIHZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07CisgICAgICAgICAgICAgICAg
ICAgIHZCID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5iIF07CisgICAgICAgICAgICAgICAgICAgIHZD
ID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5jIF07CisKKyAgICAgICAgICAgICAgICAgICAgY2Iuc3Vi
VmVjdG9ycyggdkMsIHZCICk7CisgICAgICAgICAgICAgICAgICAgIGFiLnN1YlZlY3RvcnMoIHZB
LCB2QiApOworICAgICAgICAgICAgICAgICAgICBjYi5jcm9zcyggYWIgKTsKKworICAgICAgICAg
ICAgICAgICAgICB2ZXJ0aWNlc1sgZmFjZS5hIF0uYWRkKCBjYiApOworICAgICAgICAgICAgICAg
ICAgICB2ZXJ0aWNlc1sgZmFjZS5iIF0uYWRkKCBjYiApOworICAgICAgICAgICAgICAgICAgICB2
ZXJ0aWNlc1sgZmFjZS5jIF0uYWRkKCBjYiApOworCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlRmFjZU5vcm1h
bHMoKTsKKworICAgICAgICAgICAgICAgIGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVu
Z3RoOyBmIDwgZmw7IGYgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHRoaXMu
ZmFjZXNbIGYgXTsKKworICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlc1sgZmFjZS5hIF0uYWRk
KCBmYWNlLm5vcm1hbCApOworICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlc1sgZmFjZS5iIF0u
YWRkKCBmYWNlLm5vcm1hbCApOworICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlc1sgZmFjZS5j
IF0uYWRkKCBmYWNlLm5vcm1hbCApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGZvciAoIHYgPSAwLCB2bCA9IHRoaXMudmVydGljZXMubGVuZ3Ro
OyB2IDwgdmw7IHYgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2ZXJ0aWNlc1sgdiBdLm5vcm1h
bGl6ZSgpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoIGYgPSAwLCBmbCA9
IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CisKKyAgICAgICAgICAgICAgICBm
YWNlID0gdGhpcy5mYWNlc1sgZiBdOworCisgICAgICAgICAgICAgICAgdmFyIHZlcnRleE5vcm1h
bHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7CisKKyAgICAgICAgICAgICAgICBpZiAoIHZlcnRleE5v
cm1hbHMubGVuZ3RoID09PSAzICkgeworCisgICAgICAgICAgICAgICAgICAgIHZlcnRleE5vcm1h
bHNbIDAgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5hIF0gKTsKKyAgICAgICAgICAgICAgICAgICAg
dmVydGV4Tm9ybWFsc1sgMSBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmIgXSApOworICAgICAgICAg
ICAgICAgICAgICB2ZXJ0ZXhOb3JtYWxzWyAyIF0uY29weSggdmVydGljZXNbIGZhY2UuYyBdICk7
CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIHZlcnRl
eE5vcm1hbHNbIDAgXSA9IHZlcnRpY2VzWyBmYWNlLmEgXS5jbG9uZSgpOworICAgICAgICAgICAg
ICAgICAgICB2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSB2ZXJ0aWNlc1sgZmFjZS5iIF0uY2xvbmUoKTsK
KyAgICAgICAgICAgICAgICAgICAgdmVydGV4Tm9ybWFsc1sgMiBdID0gdmVydGljZXNbIGZhY2Uu
YyBdLmNsb25lKCk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgaWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7CisKKyAgICAgICAgICAgICAg
ICB0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTsKKworICAgICAgICAgICAgfQorCisgICAg
ICAgIH0sCisKKyAgICAgICAgY29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7
CisKKyAgICAgICAgICAgIHZhciBmLCBmbCwgZmFjZTsKKworICAgICAgICAgICAgdGhpcy5jb21w
dXRlRmFjZU5vcm1hbHMoKTsKKworICAgICAgICAgICAgZm9yICggZiA9IDAsIGZsID0gdGhpcy5m
YWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKKworICAgICAgICAgICAgICAgIGZhY2UgPSB0
aGlzLmZhY2VzWyBmIF07CisKKyAgICAgICAgICAgICAgICB2YXIgdmVydGV4Tm9ybWFscyA9IGZh
Y2UudmVydGV4Tm9ybWFsczsKKworICAgICAgICAgICAgICAgIGlmICggdmVydGV4Tm9ybWFscy5s
ZW5ndGggPT09IDMgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmVydGV4Tm9ybWFsc1sgMCBd
LmNvcHkoIGZhY2Uubm9ybWFsICk7CisgICAgICAgICAgICAgICAgICAgIHZlcnRleE5vcm1hbHNb
IDEgXS5jb3B5KCBmYWNlLm5vcm1hbCApOworICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhOb3Jt
YWxzWyAyIF0uY29weSggZmFjZS5ub3JtYWwgKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7
CisKKyAgICAgICAgICAgICAgICAgICAgdmVydGV4Tm9ybWFsc1sgMCBdID0gZmFjZS5ub3JtYWwu
Y2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgdmVydGV4Tm9ybWFsc1sgMSBdID0gZmFjZS5u
b3JtYWwuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgdmVydGV4Tm9ybWFsc1sgMiBdID0g
ZmFjZS5ub3JtYWwuY2xvbmUoKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBpZiAoIHRoaXMuZmFjZXMubGVuZ3RoID4gMCApIHsKKworICAgICAg
ICAgICAgICAgIHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgfSwKKworICAgICAgICBjb21wdXRlTW9ycGhOb3JtYWxzOiBmdW5jdGlvbiAo
KSB7CisKKyAgICAgICAgICAgIHZhciBpLCBpbCwgZiwgZmwsIGZhY2U7CisKKyAgICAgICAgICAg
IC8vIHNhdmUgb3JpZ2luYWwgbm9ybWFscworICAgICAgICAgICAgLy8gLSBjcmVhdGUgdGVtcCB2
YXJpYWJsZXMgb24gZmlyc3QgYWNjZXNzCisgICAgICAgICAgICAvLyAgIG90aGVyd2lzZSBqdXN0
IGNvcHkgKGZvciBmYXN0ZXIgcmVwZWF0ZWQgY2FsbHMpCisKKyAgICAgICAgICAgIGZvciAoIGYg
PSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CisKKyAgICAgICAg
ICAgICAgICBmYWNlID0gdGhpcy5mYWNlc1sgZiBdOworCisgICAgICAgICAgICAgICAgaWYgKCAh
IGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZmFj
ZS5fX29yaWdpbmFsRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmNsb25lKCk7CisKKyAgICAgICAg
ICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIGZhY2UuX19vcmlnaW5hbEZh
Y2VOb3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIGlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzICkgZmFjZS5f
X29yaWdpbmFsVmVydGV4Tm9ybWFscyA9IFtdOworCisgICAgICAgICAgICAgICAgZm9yICggaSA9
IDAsIGlsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisg
ICAgICAgICAgICAgICAgICAgIGlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBp
IF0gKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UuX19vcmlnaW5hbFZlcnRleE5v
cm1hbHNbIGkgXSA9IGZhY2UudmVydGV4Tm9ybWFsc1sgaSBdLmNsb25lKCk7CisKKyAgICAgICAg
ICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS5fX29y
aWdpbmFsVmVydGV4Tm9ybWFsc1sgaSBdLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgaSBdICk7
CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIC8vIHVzZSB0ZW1wIGdlb21ldHJ5IHRvIGNvbXB1dGUgZmFj
ZSBhbmQgdmVydGV4IG5vcm1hbHMgZm9yIGVhY2ggbW9ycGgKKworICAgICAgICAgICAgdmFyIHRt
cEdlbyA9IG5ldyBHZW9tZXRyeSgpOworICAgICAgICAgICAgdG1wR2VvLmZhY2VzID0gdGhpcy5m
YWNlczsKKworICAgICAgICAgICAgZm9yICggaSA9IDAsIGlsID0gdGhpcy5tb3JwaFRhcmdldHMu
bGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgb24g
Zmlyc3QgYWNjZXNzCisKKyAgICAgICAgICAgICAgICBpZiAoICEgdGhpcy5tb3JwaE5vcm1hbHNb
IGkgXSApIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdID0g
e307CisgICAgICAgICAgICAgICAgICAgIHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1h
bHMgPSBbXTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0
ZXhOb3JtYWxzID0gW107CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRzdE5vcm1hbHNGYWNl
ID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFsczsKKyAgICAgICAgICAgICAgICAg
ICAgdmFyIGRzdE5vcm1hbHNWZXJ0ZXggPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5v
cm1hbHM7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZhY2VOb3JtYWwsIHZlcnRleE5vcm1h
bHM7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5s
ZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmFjZU5v
cm1hbCA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhOb3Jt
YWxzID0geyBhOiBuZXcgVmVjdG9yMygpLCBiOiBuZXcgVmVjdG9yMygpLCBjOiBuZXcgVmVjdG9y
MygpIH07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdE5vcm1hbHNGYWNlLnB1c2goIGZh
Y2VOb3JtYWwgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdE5vcm1hbHNWZXJ0ZXgucHVz
aCggdmVydGV4Tm9ybWFscyApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBtb3JwaE5vcm1hbHMgPSB0aGlzLm1vcnBo
Tm9ybWFsc1sgaSBdOworCisgICAgICAgICAgICAgICAgLy8gc2V0IHZlcnRpY2VzIHRvIG1vcnBo
IHRhcmdldAorCisgICAgICAgICAgICAgICAgdG1wR2VvLnZlcnRpY2VzID0gdGhpcy5tb3JwaFRh
cmdldHNbIGkgXS52ZXJ0aWNlczsKKworICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgbW9ycGgg
bm9ybWFscworCisgICAgICAgICAgICAgICAgdG1wR2VvLmNvbXB1dGVGYWNlTm9ybWFscygpOwor
ICAgICAgICAgICAgICAgIHRtcEdlby5jb21wdXRlVmVydGV4Tm9ybWFscygpOworCisgICAgICAg
ICAgICAgICAgLy8gc3RvcmUgbW9ycGggbm9ybWFscworCisgICAgICAgICAgICAgICAgdmFyIGZh
Y2VOb3JtYWwsIHZlcnRleE5vcm1hbHM7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBmID0gMCwg
ZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgeworCisgICAgICAgICAgICAg
ICAgICAgIGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07CisKKyAgICAgICAgICAgICAgICAgICAgZmFj
ZU5vcm1hbCA9IG1vcnBoTm9ybWFscy5mYWNlTm9ybWFsc1sgZiBdOworICAgICAgICAgICAgICAg
ICAgICB2ZXJ0ZXhOb3JtYWxzID0gbW9ycGhOb3JtYWxzLnZlcnRleE5vcm1hbHNbIGYgXTsKKwor
ICAgICAgICAgICAgICAgICAgICBmYWNlTm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7CisKKyAg
ICAgICAgICAgICAgICAgICAgdmVydGV4Tm9ybWFscy5hLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFs
c1sgMCBdICk7CisgICAgICAgICAgICAgICAgICAgIHZlcnRleE5vcm1hbHMuYi5jb3B5KCBmYWNl
LnZlcnRleE5vcm1hbHNbIDEgXSApOworICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhOb3JtYWxz
LmMuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAyIF0gKTsKKworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZXN0b3JlIG9yaWdpbmFsIG5vcm1h
bHMKKworICAgICAgICAgICAgZm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYg
PCBmbDsgZiArKyApIHsKKworICAgICAgICAgICAgICAgIGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07
CisKKyAgICAgICAgICAgICAgICBmYWNlLm5vcm1hbCA9IGZhY2UuX19vcmlnaW5hbEZhY2VOb3Jt
YWw7CisgICAgICAgICAgICAgICAgZmFjZS52ZXJ0ZXhOb3JtYWxzID0gZmFjZS5fX29yaWdpbmFs
VmVydGV4Tm9ybWFsczsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAg
Y29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIGQg
PSAwOworICAgICAgICAgICAgdmFyIHZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlczsKKworICAgICAg
ICAgICAgZm9yICggdmFyIGkgPSAwLCBpbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsr
ICkgeworCisgICAgICAgICAgICAgICAgaWYgKCBpID4gMCApIHsKKworICAgICAgICAgICAgICAg
ICAgICBkICs9IHZlcnRpY2VzWyBpIF0uZGlzdGFuY2VUbyggdmVydGljZXNbIGkgLSAxIF0gKTsK
KworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMubGluZURpc3RhbmNl
c1sgaSBdID0gZDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAgY29t
cHV0ZUJvdW5kaW5nQm94OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5i
b3VuZGluZ0JveCA9PT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuYm91bmRpbmdC
b3ggPSBuZXcgQm94MygpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuYm91
bmRpbmdCb3guc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApOworCisgICAgICAgIH0sCisK
KyAgICAgICAgY29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAg
ICAgIGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHsKKworICAgICAgICAgICAg
ICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7CisKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZS5zZXRGcm9tUG9pbnRzKCB0aGlzLnZl
cnRpY2VzICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBtZXJnZTogZnVuY3Rpb24gKCBnZW9t
ZXRyeSwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgeworCisgICAgICAgICAgICBpZiAo
ICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgKSB7CisKKyAgICAgICAgICAg
ICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUuR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90
IGFuIGluc3RhbmNlIG9mIFRIUkVFLkdlb21ldHJ5LicsIGdlb21ldHJ5ICk7CisgICAgICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBub3JtYWxN
YXRyaXgsCisgICAgICAgICAgICAgICAgdmVydGV4T2Zmc2V0ID0gdGhpcy52ZXJ0aWNlcy5sZW5n
dGgsCisgICAgICAgICAgICAgICAgdmVydGljZXMxID0gdGhpcy52ZXJ0aWNlcywKKyAgICAgICAg
ICAgICAgICB2ZXJ0aWNlczIgPSBnZW9tZXRyeS52ZXJ0aWNlcywKKyAgICAgICAgICAgICAgICBm
YWNlczEgPSB0aGlzLmZhY2VzLAorICAgICAgICAgICAgICAgIGZhY2VzMiA9IGdlb21ldHJ5LmZh
Y2VzLAorICAgICAgICAgICAgICAgIHV2czEgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXSwKKyAg
ICAgICAgICAgICAgICB1dnMyID0gZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgMCBdLAorICAgICAg
ICAgICAgICAgIGNvbG9yczEgPSB0aGlzLmNvbG9ycywKKyAgICAgICAgICAgICAgICBjb2xvcnMy
ID0gZ2VvbWV0cnkuY29sb3JzOworCisgICAgICAgICAgICBpZiAoIG1hdGVyaWFsSW5kZXhPZmZz
ZXQgPT09IHVuZGVmaW5lZCApIG1hdGVyaWFsSW5kZXhPZmZzZXQgPSAwOworCisgICAgICAgICAg
ICBpZiAoIG1hdHJpeCAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgbm9ybWFs
TWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApOworCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHZlcnRpY2VzCisKKyAgICAgICAgICAgIGZvciAo
IHZhciBpID0gMCwgaWwgPSB2ZXJ0aWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKyAg
ICAgICAgICAgICAgICB2YXIgdmVydGV4ID0gdmVydGljZXMyWyBpIF07CisKKyAgICAgICAgICAg
ICAgICB2YXIgdmVydGV4Q29weSA9IHZlcnRleC5jbG9uZSgpOworCisgICAgICAgICAgICAgICAg
aWYgKCBtYXRyaXggIT09IHVuZGVmaW5lZCApIHZlcnRleENvcHkuYXBwbHlNYXRyaXg0KCBtYXRy
aXggKTsKKworICAgICAgICAgICAgICAgIHZlcnRpY2VzMS5wdXNoKCB2ZXJ0ZXhDb3B5ICk7CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29sb3JzCisKKyAgICAgICAgICAgIGZv
ciAoIHZhciBpID0gMCwgaWwgPSBjb2xvcnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisg
ICAgICAgICAgICAgICAgY29sb3JzMS5wdXNoKCBjb2xvcnMyWyBpIF0uY2xvbmUoKSApOworCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZhY2VzCisKKyAgICAgICAgICAgIGZvciAo
IGkgPSAwLCBpbCA9IGZhY2VzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworICAgICAgICAg
ICAgICAgIHZhciBmYWNlID0gZmFjZXMyWyBpIF0sIGZhY2VDb3B5LCBub3JtYWwsIGNvbG9yLAor
ICAgICAgICAgICAgICAgICAgICBmYWNlVmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFs
cywKKyAgICAgICAgICAgICAgICAgICAgZmFjZVZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29s
b3JzOworCisgICAgICAgICAgICAgICAgZmFjZUNvcHkgPSBuZXcgRmFjZTMoIGZhY2UuYSArIHZl
cnRleE9mZnNldCwgZmFjZS5iICsgdmVydGV4T2Zmc2V0LCBmYWNlLmMgKyB2ZXJ0ZXhPZmZzZXQg
KTsKKyAgICAgICAgICAgICAgICBmYWNlQ29weS5ub3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTsK
KworICAgICAgICAgICAgICAgIGlmICggbm9ybWFsTWF0cml4ICE9PSB1bmRlZmluZWQgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgZmFjZUNvcHkubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFs
TWF0cml4ICkubm9ybWFsaXplKCk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICBmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZVZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwg
amw7IGogKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgbm9ybWFsID0gZmFjZVZlcnRleE5v
cm1hbHNbIGogXS5jbG9uZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggbm9ybWFsTWF0
cml4ICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbC5h
cHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOworCisgICAgICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmYWNlQ29weS52ZXJ0ZXhOb3JtYWxzLnB1
c2goIG5vcm1hbCApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmFj
ZUNvcHkuY29sb3IuY29weSggZmFjZS5jb2xvciApOworCisgICAgICAgICAgICAgICAgZm9yICgg
dmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhDb2xvcnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBmYWNlVmVydGV4Q29sb3JzWyBqIF07Cisg
ICAgICAgICAgICAgICAgICAgIGZhY2VDb3B5LnZlcnRleENvbG9ycy5wdXNoKCBjb2xvci5jbG9u
ZSgpICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmYWNlQ29weS5t
YXRlcmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4ICsgbWF0ZXJpYWxJbmRleE9mZnNldDsK
KworICAgICAgICAgICAgICAgIGZhY2VzMS5wdXNoKCBmYWNlQ29weSApOworCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIC8vIHV2cworCisgICAgICAgICAgICBmb3IgKCBpID0gMCwgaWwg
PSB1dnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgdmFyIHV2
ID0gdXZzMlsgaSBdLCB1dkNvcHkgPSBbXTsKKworICAgICAgICAgICAgICAgIGlmICggdXYgPT09
IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoIHZhciBqID0gMCwgamwgPSB1di5s
ZW5ndGg7IGogPCBqbDsgaiArKyApIHsKKworICAgICAgICAgICAgICAgICAgICB1dkNvcHkucHVz
aCggdXZbIGogXS5jbG9uZSgpICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICB1dnMxLnB1c2goIHV2Q29weSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSwK
KworICAgICAgICBtZXJnZU1lc2g6IGZ1bmN0aW9uICggbWVzaCApIHsKKworICAgICAgICAgICAg
aWYgKCAhICggbWVzaCAmJiBtZXNoLmlzTWVzaCApICkgeworCisgICAgICAgICAgICAgICAgY29u
c29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5Lm1lcmdlTWVzaCgpOiBtZXNoIG5vdCBhbiBpbnN0
YW5jZSBvZiBUSFJFRS5NZXNoLicsIG1lc2ggKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVzaC5tYXRyaXhBdXRvVXBkYXRlICYmIG1l
c2gudXBkYXRlTWF0cml4KCk7CisKKyAgICAgICAgICAgIHRoaXMubWVyZ2UoIG1lc2guZ2VvbWV0
cnksIG1lc2gubWF0cml4ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICAvKgorICAgICAgICAg
KiBDaGVja3MgZm9yIGR1cGxpY2F0ZSB2ZXJ0aWNlcyB3aXRoIGhhc2htYXAuCisgICAgICAgICAq
IER1cGxpY2F0ZWQgdmVydGljZXMgYXJlIHJlbW92ZWQKKyAgICAgICAgICogYW5kIGZhY2VzJyB2
ZXJ0aWNlcyBhcmUgdXBkYXRlZC4KKyAgICAgICAgICovCisKKyAgICAgICAgbWVyZ2VWZXJ0aWNl
czogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdmVydGljZXNNYXAgPSB7fTsgLy8g
SGFzaG1hcCBmb3IgbG9va2luZyB1cCB2ZXJ0aWNlcyBieSBwb3NpdGlvbiBjb29yZGluYXRlcyAo
YW5kIG1ha2luZyBzdXJlIHRoZXkgYXJlIHVuaXF1ZSkKKyAgICAgICAgICAgIHZhciB1bmlxdWUg
PSBbXSwgY2hhbmdlcyA9IFtdOworCisgICAgICAgICAgICB2YXIgdiwga2V5OworICAgICAgICAg
ICAgdmFyIHByZWNpc2lvblBvaW50cyA9IDQ7IC8vIG51bWJlciBvZiBkZWNpbWFsIHBvaW50cywg
ZS5nLiA0IGZvciBlcHNpbG9uIG9mIDAuMDAwMQorICAgICAgICAgICAgdmFyIHByZWNpc2lvbiA9
IE1hdGgucG93KCAxMCwgcHJlY2lzaW9uUG9pbnRzICk7CisgICAgICAgICAgICB2YXIgaSwgaWws
IGZhY2U7CisgICAgICAgICAgICB2YXIgaW5kaWNlcywgaiwgamw7CisKKyAgICAgICAgICAgIGZv
ciAoIGkgPSAwLCBpbCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisK
KyAgICAgICAgICAgICAgICB2ID0gdGhpcy52ZXJ0aWNlc1sgaSBdOworICAgICAgICAgICAgICAg
IGtleSA9IE1hdGgucm91bmQoIHYueCAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCgg
di55ICogcHJlY2lzaW9uICkgKyAnXycgKyBNYXRoLnJvdW5kKCB2LnogKiBwcmVjaXNpb24gKTsK
KworICAgICAgICAgICAgICAgIGlmICggdmVydGljZXNNYXBbIGtleSBdID09PSB1bmRlZmluZWQg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmVydGljZXNNYXBbIGtleSBdID0gaTsKKyAgICAg
ICAgICAgICAgICAgICAgdW5pcXVlLnB1c2goIHRoaXMudmVydGljZXNbIGkgXSApOworICAgICAg
ICAgICAgICAgICAgICBjaGFuZ2VzWyBpIF0gPSB1bmlxdWUubGVuZ3RoIC0gMTsKKworICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygn
RHVwbGljYXRlIHZlcnRleCBmb3VuZC4gJywgaSwgJyBjb3VsZCBiZSB1c2luZyAnLCB2ZXJ0aWNl
c01hcFtrZXldKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1sgaSBdID0gY2hhbmdlc1sg
dmVydGljZXNNYXBbIGtleSBdIF07CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IH0KKworCisgICAgICAgICAgICAvLyBpZiBmYWNlcyBhcmUgY29tcGxldGVseSBkZWdlbmVyYXRl
IGFmdGVyIG1lcmdpbmcgdmVydGljZXMsIHdlCisgICAgICAgICAgICAvLyBoYXZlIHRvIHJlbW92
ZSB0aGVtIGZyb20gdGhlIGdlb21ldHJ5LgorICAgICAgICAgICAgdmFyIGZhY2VJbmRpY2VzVG9S
ZW1vdmUgPSBbXTsKKworICAgICAgICAgICAgZm9yICggaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5s
ZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIGZhY2UgPSB0aGlzLmZh
Y2VzWyBpIF07CisKKyAgICAgICAgICAgICAgICBmYWNlLmEgPSBjaGFuZ2VzWyBmYWNlLmEgXTsK
KyAgICAgICAgICAgICAgICBmYWNlLmIgPSBjaGFuZ2VzWyBmYWNlLmIgXTsKKyAgICAgICAgICAg
ICAgICBmYWNlLmMgPSBjaGFuZ2VzWyBmYWNlLmMgXTsKKworICAgICAgICAgICAgICAgIGluZGlj
ZXMgPSBbIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgXTsKKworICAgICAgICAgICAgICAgIC8vIGlm
IGFueSBkdXBsaWNhdGUgdmVydGljZXMgYXJlIGZvdW5kIGluIGEgRmFjZTMKKyAgICAgICAgICAg
ICAgICAvLyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgZmFjZSBhcyBub3RoaW5nIGNhbiBiZSBzYXZl
ZAorICAgICAgICAgICAgICAgIGZvciAoIHZhciBuID0gMDsgbiA8IDM7IG4gKysgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCBpbmRpY2VzWyBuIF0gPT09IGluZGljZXNbICggbiArIDEg
KSAlIDMgXSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmFjZUluZGljZXNUb1JlbW92
ZS5wdXNoKCBpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgZm9yICggaSA9IGZhY2VJbmRpY2VzVG9SZW1vdmUubGVuZ3RoIC0gMTsgaSA+PSAw
OyBpIC0tICkgeworCisgICAgICAgICAgICAgICAgdmFyIGlkeCA9IGZhY2VJbmRpY2VzVG9SZW1v
dmVbIGkgXTsKKworICAgICAgICAgICAgICAgIHRoaXMuZmFjZXMuc3BsaWNlKCBpZHgsIDEgKTsK
KworICAgICAgICAgICAgICAgIGZvciAoIGogPSAwLCBqbCA9IHRoaXMuZmFjZVZlcnRleFV2cy5s
ZW5ndGg7IGogPCBqbDsgaiArKyApIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLmZhY2VW
ZXJ0ZXhVdnNbIGogXS5zcGxpY2UoIGlkeCwgMSApOworCisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVzZSB1bmlxdWUgc2V0IG9mIHZlcnRpY2Vz
CisKKyAgICAgICAgICAgIHZhciBkaWZmID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGggLSB1bmlxdWUu
bGVuZ3RoOworICAgICAgICAgICAgdGhpcy52ZXJ0aWNlcyA9IHVuaXF1ZTsKKyAgICAgICAgICAg
IHJldHVybiBkaWZmOworCisgICAgICAgIH0sCisKKyAgICAgICAgc29ydEZhY2VzQnlNYXRlcmlh
bEluZGV4OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciBmYWNlcyA9IHRoaXMuZmFj
ZXM7CisgICAgICAgICAgICB2YXIgbGVuZ3RoID0gZmFjZXMubGVuZ3RoOworCisgICAgICAgICAg
ICAvLyB0YWcgZmFjZXMKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3Ro
OyBpICsrICkgeworCisgICAgICAgICAgICAgICAgZmFjZXNbIGkgXS5faWQgPSBpOworCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNvcnQgZmFjZXMKKworICAgICAgICAgICAgZnVu
Y3Rpb24gbWF0ZXJpYWxJbmRleFNvcnQoIGEsIGIgKSB7CisKKyAgICAgICAgICAgICAgICByZXR1
cm4gYS5tYXRlcmlhbEluZGV4IC0gYi5tYXRlcmlhbEluZGV4OworCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGZhY2VzLnNvcnQoIG1hdGVyaWFsSW5kZXhTb3J0ICk7CisKKyAgICAgICAg
ICAgIC8vIHNvcnQgdXZzCisKKyAgICAgICAgICAgIHZhciB1dnMxID0gdGhpcy5mYWNlVmVydGV4
VXZzWyAwIF07CisgICAgICAgICAgICB2YXIgdXZzMiA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMSBd
OworCisgICAgICAgICAgICB2YXIgbmV3VXZzMSwgbmV3VXZzMjsKKworICAgICAgICAgICAgaWYg
KCB1dnMxICYmIHV2czEubGVuZ3RoID09PSBsZW5ndGggKSBuZXdVdnMxID0gW107CisgICAgICAg
ICAgICBpZiAoIHV2czIgJiYgdXZzMi5sZW5ndGggPT09IGxlbmd0aCApIG5ld1V2czIgPSBbXTsK
KworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkgeworCisg
ICAgICAgICAgICAgICAgdmFyIGlkID0gZmFjZXNbIGkgXS5faWQ7CisKKyAgICAgICAgICAgICAg
ICBpZiAoIG5ld1V2czEgKSBuZXdVdnMxLnB1c2goIHV2czFbIGlkIF0gKTsKKyAgICAgICAgICAg
ICAgICBpZiAoIG5ld1V2czIgKSBuZXdVdnMyLnB1c2goIHV2czJbIGlkIF0gKTsKKworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBpZiAoIG5ld1V2czEgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNb
IDAgXSA9IG5ld1V2czE7CisgICAgICAgICAgICBpZiAoIG5ld1V2czIgKSB0aGlzLmZhY2VWZXJ0
ZXhVdnNbIDEgXSA9IG5ld1V2czI7CisKKyAgICAgICAgfSwKKworICAgICAgICB0b0pTT046IGZ1
bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIGRhdGEgPSB7CisgICAgICAgICAgICAgICAg
bWV0YWRhdGE6IHsKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogNC41LAorICAgICAgICAg
ICAgICAgICAgICB0eXBlOiAnR2VvbWV0cnknLAorICAgICAgICAgICAgICAgICAgICBnZW5lcmF0
b3I6ICdHZW9tZXRyeS50b0pTT04nCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsK
KworICAgICAgICAgICAgLy8gc3RhbmRhcmQgR2VvbWV0cnkgc2VyaWFsaXphdGlvbgorCisgICAg
ICAgICAgICBkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7CisgICAgICAgICAgICBkYXRhLnR5cGUgPSB0
aGlzLnR5cGU7CisgICAgICAgICAgICBpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUg
PSB0aGlzLm5hbWU7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRl
ZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1l
dGVyczsKKworICAgICAgICAgICAgICAgIGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHsK
KworICAgICAgICAgICAgICAgICAgICBpZiAoIHBhcmFtZXRlcnNbIGtleSBdICE9PSB1bmRlZmlu
ZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdOworCisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgdmFyIHZlcnRpY2VzID0gW107CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0g
MDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpICsrICkgeworCisgICAgICAgICAgICAgICAg
dmFyIHZlcnRleCA9IHRoaXMudmVydGljZXNbIGkgXTsKKyAgICAgICAgICAgICAgICB2ZXJ0aWNl
cy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CisKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgdmFyIGZhY2VzID0gW107CisgICAgICAgICAgICB2YXIgbm9ybWFscyA9
IFtdOworICAgICAgICAgICAgdmFyIG5vcm1hbHNIYXNoID0ge307CisgICAgICAgICAgICB2YXIg
Y29sb3JzID0gW107CisgICAgICAgICAgICB2YXIgY29sb3JzSGFzaCA9IHt9OworICAgICAgICAg
ICAgdmFyIHV2cyA9IFtdOworICAgICAgICAgICAgdmFyIHV2c0hhc2ggPSB7fTsKKworICAgICAg
ICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5mYWNlcy5sZW5ndGg7IGkgKysgKSB7CisK
KyAgICAgICAgICAgICAgICB2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTsKKworICAgICAgICAg
ICAgICAgIHZhciBoYXNNYXRlcmlhbCA9IHRydWU7CisgICAgICAgICAgICAgICAgdmFyIGhhc0Zh
Y2VVdiA9IGZhbHNlOyAvLyBkZXByZWNhdGVkCisgICAgICAgICAgICAgICAgdmFyIGhhc0ZhY2VW
ZXJ0ZXhVdiA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF0gIT09IHVuZGVmaW5lZDsKKyAg
ICAgICAgICAgICAgICB2YXIgaGFzRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmxlbmd0aCgpID4g
MDsKKyAgICAgICAgICAgICAgICB2YXIgaGFzRmFjZVZlcnRleE5vcm1hbCA9IGZhY2UudmVydGV4
Tm9ybWFscy5sZW5ndGggPiAwOworICAgICAgICAgICAgICAgIHZhciBoYXNGYWNlQ29sb3IgPSBm
YWNlLmNvbG9yLnIgIT09IDEgfHwgZmFjZS5jb2xvci5nICE9PSAxIHx8IGZhY2UuY29sb3IuYiAh
PT0gMTsKKyAgICAgICAgICAgICAgICB2YXIgaGFzRmFjZVZlcnRleENvbG9yID0gZmFjZS52ZXJ0
ZXhDb2xvcnMubGVuZ3RoID4gMDsKKworICAgICAgICAgICAgICAgIHZhciBmYWNlVHlwZSA9IDA7
CisKKyAgICAgICAgICAgICAgICBmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDAsIDAgKTsg
Ly8gaXNRdWFkCisgICAgICAgICAgICAgICAgZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAx
LCBoYXNNYXRlcmlhbCApOworICAgICAgICAgICAgICAgIGZhY2VUeXBlID0gc2V0Qml0KCBmYWNl
VHlwZSwgMiwgaGFzRmFjZVV2ICk7CisgICAgICAgICAgICAgICAgZmFjZVR5cGUgPSBzZXRCaXQo
IGZhY2VUeXBlLCAzLCBoYXNGYWNlVmVydGV4VXYgKTsKKyAgICAgICAgICAgICAgICBmYWNlVHlw
ZSA9IHNldEJpdCggZmFjZVR5cGUsIDQsIGhhc0ZhY2VOb3JtYWwgKTsKKyAgICAgICAgICAgICAg
ICBmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDUsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKTsK
KyAgICAgICAgICAgICAgICBmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDYsIGhhc0ZhY2VD
b2xvciApOworICAgICAgICAgICAgICAgIGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNywg
aGFzRmFjZVZlcnRleENvbG9yICk7CisKKyAgICAgICAgICAgICAgICBmYWNlcy5wdXNoKCBmYWNl
VHlwZSApOworICAgICAgICAgICAgICAgIGZhY2VzLnB1c2goIGZhY2UuYSwgZmFjZS5iLCBmYWNl
LmMgKTsKKyAgICAgICAgICAgICAgICBmYWNlcy5wdXNoKCBmYWNlLm1hdGVyaWFsSW5kZXggKTsK
KworICAgICAgICAgICAgICAgIGlmICggaGFzRmFjZVZlcnRleFV2ICkgeworCisgICAgICAgICAg
ICAgICAgICAgIHZhciBmYWNlVmVydGV4VXZzID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF1bIGkg
XTsKKworICAgICAgICAgICAgICAgICAgICBmYWNlcy5wdXNoKAorICAgICAgICAgICAgICAgICAg
ICAgICAgZ2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMCBdICksCisgICAgICAgICAgICAgICAg
ICAgICAgICBnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAxIF0gKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGdldFV2SW5kZXgoIGZhY2VWZXJ0ZXhVdnNbIDIgXSApCisgICAgICAgICAgICAg
ICAgICAgICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGhh
c0ZhY2VOb3JtYWwgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZmFjZXMucHVzaCggZ2V0Tm9y
bWFsSW5kZXgoIGZhY2Uubm9ybWFsICkgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHsKKworICAgICAgICAgICAgICAg
ICAgICB2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFsczsKKworICAgICAgICAg
ICAgICAgICAgICBmYWNlcy5wdXNoKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9ybWFs
SW5kZXgoIHZlcnRleE5vcm1hbHNbIDAgXSApLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0
Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDEgXSApLAorICAgICAgICAgICAgICAgICAgICAg
ICAgZ2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDIgXSApCisgICAgICAgICAgICAgICAg
ICAgICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGhhc0Zh
Y2VDb2xvciApIHsKKworICAgICAgICAgICAgICAgICAgICBmYWNlcy5wdXNoKCBnZXRDb2xvcklu
ZGV4KCBmYWNlLmNvbG9yICkgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIGlmICggaGFzRmFjZVZlcnRleENvbG9yICkgeworCisgICAgICAgICAgICAgICAgICAgIHZh
ciB2ZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9yczsKKworICAgICAgICAgICAgICAgICAg
ICBmYWNlcy5wdXNoKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29sb3JJbmRleCggdmVy
dGV4Q29sb3JzWyAwIF0gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbG9ySW5kZXgo
IHZlcnRleENvbG9yc1sgMSBdICksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb2xvcklu
ZGV4KCB2ZXJ0ZXhDb2xvcnNbIDIgXSApCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnVuY3Rpb24gc2V0
Qml0KCB2YWx1ZSwgcG9zaXRpb24sIGVuYWJsZWQgKSB7CisKKyAgICAgICAgICAgICAgICByZXR1
cm4gZW5hYmxlZCA/IHZhbHVlIHwgKCAxIDw8IHBvc2l0aW9uICkgOiB2YWx1ZSAmICggfiAoIDEg
PDwgcG9zaXRpb24gKSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0aW9u
IGdldE5vcm1hbEluZGV4KCBub3JtYWwgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgaGFzaCA9
IG5vcm1hbC54LnRvU3RyaW5nKCkgKyBub3JtYWwueS50b1N0cmluZygpICsgbm9ybWFsLnoudG9T
dHJpbmcoKTsKKworICAgICAgICAgICAgICAgIGlmICggbm9ybWFsc0hhc2hbIGhhc2ggXSAhPT0g
dW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxzSGFzaFsg
aGFzaCBdOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbm9ybWFsc0hh
c2hbIGhhc2ggXSA9IG5vcm1hbHMubGVuZ3RoIC8gMzsKKyAgICAgICAgICAgICAgICBub3JtYWxz
LnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTsKKworICAgICAgICAgICAgICAg
IHJldHVybiBub3JtYWxzSGFzaFsgaGFzaCBdOworCisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGZ1bmN0aW9uIGdldENvbG9ySW5kZXgoIGNvbG9yICkgeworCisgICAgICAgICAgICAgICAg
dmFyIGhhc2ggPSBjb2xvci5yLnRvU3RyaW5nKCkgKyBjb2xvci5nLnRvU3RyaW5nKCkgKyBjb2xv
ci5iLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGNvbG9yc0hhc2hbIGhhc2gg
XSAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcnNI
YXNoWyBoYXNoIF07CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb2xv
cnNIYXNoWyBoYXNoIF0gPSBjb2xvcnMubGVuZ3RoOworICAgICAgICAgICAgICAgIGNvbG9ycy5w
dXNoKCBjb2xvci5nZXRIZXgoKSApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yc0hh
c2hbIGhhc2ggXTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdW5jdGlvbiBnZXRV
dkluZGV4KCB1diApIHsKKworICAgICAgICAgICAgICAgIHZhciBoYXNoID0gdXYueC50b1N0cmlu
ZygpICsgdXYueS50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgaWYgKCB1dnNIYXNoWyBo
YXNoIF0gIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXZz
SGFzaFsgaGFzaCBdOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdXZz
SGFzaFsgaGFzaCBdID0gdXZzLmxlbmd0aCAvIDI7CisgICAgICAgICAgICAgICAgdXZzLnB1c2go
IHV2LngsIHV2LnkgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB1dnNIYXNoWyBoYXNoIF07
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGF0YS5kYXRhID0ge307CisKKyAgICAg
ICAgICAgIGRhdGEuZGF0YS52ZXJ0aWNlcyA9IHZlcnRpY2VzOworICAgICAgICAgICAgZGF0YS5k
YXRhLm5vcm1hbHMgPSBub3JtYWxzOworICAgICAgICAgICAgaWYgKCBjb2xvcnMubGVuZ3RoID4g
MCApIGRhdGEuZGF0YS5jb2xvcnMgPSBjb2xvcnM7CisgICAgICAgICAgICBpZiAoIHV2cy5sZW5n
dGggPiAwICkgZGF0YS5kYXRhLnV2cyA9IFsgdXZzIF07IC8vIHRlbXBvcmFsIGJhY2t3YXJkIGNv
bXBhdGliaWxpdHkKKyAgICAgICAgICAgIGRhdGEuZGF0YS5mYWNlcyA9IGZhY2VzOworCisgICAg
ICAgICAgICByZXR1cm4gZGF0YTsKKworICAgICAgICB9LAorCisgICAgICAgIGNsb25lOiBmdW5j
dGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgLy8gSGFuZGxlIHByaW1p
dGl2ZXMKKworICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzOwor
CisgICAgICAgICAgICAgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAg
ICAgICAgICB2YXIgdmFsdWVzID0gW107CisKKyAgICAgICAgICAgICBmb3IgKCB2YXIga2V5IGlu
IHBhcmFtZXRlcnMgKSB7CisKKyAgICAgICAgICAgICB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sg
a2V5IF0gKTsKKworICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIHZhciBnZW9tZXRyeSA9
IE9iamVjdC5jcmVhdGUoIHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlICk7CisgICAgICAgICAg
ICAgdGhpcy5jb25zdHJ1Y3Rvci5hcHBseSggZ2VvbWV0cnksIHZhbHVlcyApOworICAgICAgICAg
ICAgIHJldHVybiBnZW9tZXRyeTsKKworICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIHJl
dHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKKyAgICAgICAgICAgICAq
LworCisgICAgICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5KCkuY29weSggdGhpcyApOworCisg
ICAgICAgIH0sCisKKyAgICAgICAgY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKyAgICAg
ICAgICAgIHZhciBpLCBpbCwgaiwgamwsIGssIGtsOworCisgICAgICAgICAgICAvLyByZXNldAor
CisgICAgICAgICAgICB0aGlzLnZlcnRpY2VzID0gW107CisgICAgICAgICAgICB0aGlzLmNvbG9y
cyA9IFtdOworICAgICAgICAgICAgdGhpcy5mYWNlcyA9IFtdOworICAgICAgICAgICAgdGhpcy5m
YWNlVmVydGV4VXZzID0gW1tdXTsKKyAgICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXRzID0gW107
CisgICAgICAgICAgICB0aGlzLm1vcnBoTm9ybWFscyA9IFtdOworICAgICAgICAgICAgdGhpcy5z
a2luV2VpZ2h0cyA9IFtdOworICAgICAgICAgICAgdGhpcy5za2luSW5kaWNlcyA9IFtdOworICAg
ICAgICAgICAgdGhpcy5saW5lRGlzdGFuY2VzID0gW107CisgICAgICAgICAgICB0aGlzLmJvdW5k
aW5nQm94ID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOwor
CisgICAgICAgICAgICAvLyBuYW1lCisKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IHNvdXJjZS5u
YW1lOworCisgICAgICAgICAgICAvLyB2ZXJ0aWNlcworCisgICAgICAgICAgICB2YXIgdmVydGlj
ZXMgPSBzb3VyY2UudmVydGljZXM7CisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwLCBpbCA9IHZl
cnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgdGhpcy52
ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgaSBdLmNsb25lKCkgKTsKKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAvLyBjb2xvcnMKKworICAgICAgICAgICAgdmFyIGNvbG9ycyA9IHNvdXJj
ZS5jb2xvcnM7CisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwLCBpbCA9IGNvbG9ycy5sZW5ndGg7
IGkgPCBpbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuY29sb3JzLnB1c2goIGNv
bG9yc1sgaSBdLmNsb25lKCkgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBm
YWNlcworCisgICAgICAgICAgICB2YXIgZmFjZXMgPSBzb3VyY2UuZmFjZXM7CisKKyAgICAgICAg
ICAgIGZvciAoIGkgPSAwLCBpbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisg
ICAgICAgICAgICAgICAgdGhpcy5mYWNlcy5wdXNoKCBmYWNlc1sgaSBdLmNsb25lKCkgKTsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmYWNlIHZlcnRleCB1dnMKKworICAgICAg
ICAgICAgZm9yICggaSA9IDAsIGlsID0gc291cmNlLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBpIDwg
aWw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgZmFjZVZlcnRleFV2cyA9IHNvdXJj
ZS5mYWNlVmVydGV4VXZzWyBpIF07CisKKyAgICAgICAgICAgICAgICBpZiAoIHRoaXMuZmFjZVZl
cnRleFV2c1sgaSBdID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGhp
cy5mYWNlVmVydGV4VXZzWyBpIF0gPSBbXTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIGZvciAoIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7
IGogKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHV2cyA9IGZhY2VWZXJ0ZXhVdnNb
IGogXSwgdXZzQ29weSA9IFtdOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoIGsgPSAwLCBr
bCA9IHV2cy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgdmFyIHV2ID0gdXZzWyBrIF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHV2c0NvcHku
cHVzaCggdXYuY2xvbmUoKSApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgICAgICB0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXS5wdXNoKCB1dnNDb3B5ICk7CisKKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbW9ycGgg
dGFyZ2V0cworCisgICAgICAgICAgICB2YXIgbW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFy
Z2V0czsKKworICAgICAgICAgICAgZm9yICggaSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0
aDsgaSA8IGlsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgdmFyIG1vcnBoVGFyZ2V0ID0g
e307CisgICAgICAgICAgICAgICAgbW9ycGhUYXJnZXQubmFtZSA9IG1vcnBoVGFyZ2V0c1sgaSBd
Lm5hbWU7CisKKyAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNlcworCisgICAgICAgICAgICAgICAg
aWYgKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyAhPT0gdW5kZWZpbmVkICkgeworCisgICAg
ICAgICAgICAgICAgICAgIG1vcnBoVGFyZ2V0LnZlcnRpY2VzID0gW107CisKKyAgICAgICAgICAg
ICAgICAgICAgZm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMubGVu
Z3RoOyBqIDwgamw7IGogKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoVGFy
Z2V0LnZlcnRpY2VzLnB1c2goIG1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzWyBqIF0uY2xvbmUo
KSApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIC8vIG5vcm1hbHMKKworICAgICAgICAgICAgICAgIGlmICggbW9ycGhUYXJn
ZXRzWyBpIF0ubm9ybWFscyAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAg
IG1vcnBoVGFyZ2V0Lm5vcm1hbHMgPSBbXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCBq
ID0gMCwgamwgPSBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsr
ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBtb3JwaFRhcmdldC5ub3JtYWxzLnB1c2go
IG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHNbIGogXS5jbG9uZSgpICk7CisKKyAgICAgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy5t
b3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTsKKworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAvLyBtb3JwaCBub3JtYWxzCisKKyAgICAgICAgICAgIHZhciBtb3JwaE5vcm1hbHMg
PSBzb3VyY2UubW9ycGhOb3JtYWxzOworCisgICAgICAgICAgICBmb3IgKCBpID0gMCwgaWwgPSBt
b3JwaE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2
YXIgbW9ycGhOb3JtYWwgPSB7fTsKKworICAgICAgICAgICAgICAgIC8vIHZlcnRleCBub3JtYWxz
CisKKyAgICAgICAgICAgICAgICBpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMg
IT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICBtb3JwaE5vcm1hbC52ZXJ0
ZXhOb3JtYWxzID0gW107CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IDAsIGpsID0g
bW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNyY1ZlcnRleE5vcm1hbCA9IG1vcnBoTm9y
bWFsc1sgaSBdLnZlcnRleE5vcm1hbHNbIGogXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZh
ciBkZXN0VmVydGV4Tm9ybWFsID0ge307CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RW
ZXJ0ZXhOb3JtYWwuYSA9IHNyY1ZlcnRleE5vcm1hbC5hLmNsb25lKCk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBkZXN0VmVydGV4Tm9ybWFsLmIgPSBzcmNWZXJ0ZXhOb3JtYWwuYi5jbG9uZSgp
OworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFZlcnRleE5vcm1hbC5jID0gc3JjVmVydGV4
Tm9ybWFsLmMuY2xvbmUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhOb3JtYWwu
dmVydGV4Tm9ybWFscy5wdXNoKCBkZXN0VmVydGV4Tm9ybWFsICk7CisKKyAgICAgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZmFjZSBu
b3JtYWxzCisKKyAgICAgICAgICAgICAgICBpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3Jt
YWxzICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgbW9ycGhOb3JtYWwu
ZmFjZU5vcm1hbHMgPSBbXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCBqID0gMCwgamwg
PSBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMucHVzaCgg
bW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHNbIGogXS5jbG9uZSgpICk7CisKKyAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhp
cy5tb3JwaE5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWwgKTsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAvLyBza2luIHdlaWdodHMKKworICAgICAgICAgICAgdmFyIHNraW5XZWlnaHRz
ID0gc291cmNlLnNraW5XZWlnaHRzOworCisgICAgICAgICAgICBmb3IgKCBpID0gMCwgaWwgPSBz
a2luV2VpZ2h0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHRo
aXMuc2tpbldlaWdodHMucHVzaCggc2tpbldlaWdodHNbIGkgXS5jbG9uZSgpICk7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2tpbiBpbmRpY2VzCisKKyAgICAgICAgICAgIHZh
ciBza2luSW5kaWNlcyA9IHNvdXJjZS5za2luSW5kaWNlczsKKworICAgICAgICAgICAgZm9yICgg
aSA9IDAsIGlsID0gc2tpbkluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKyAgICAg
ICAgICAgICAgICB0aGlzLnNraW5JbmRpY2VzLnB1c2goIHNraW5JbmRpY2VzWyBpIF0uY2xvbmUo
KSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxpbmUgZGlzdGFuY2VzCisK
KyAgICAgICAgICAgIHZhciBsaW5lRGlzdGFuY2VzID0gc291cmNlLmxpbmVEaXN0YW5jZXM7CisK
KyAgICAgICAgICAgIGZvciAoIGkgPSAwLCBpbCA9IGxpbmVEaXN0YW5jZXMubGVuZ3RoOyBpIDwg
aWw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLmxpbmVEaXN0YW5jZXMucHVzaCgg
bGluZURpc3RhbmNlc1sgaSBdICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8g
Ym91bmRpbmcgYm94CisKKyAgICAgICAgICAgIHZhciBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3Vu
ZGluZ0JveDsKKworICAgICAgICAgICAgaWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKKwor
ICAgICAgICAgICAgICAgIHRoaXMuYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveC5jbG9uZSgpOwor
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGJvdW5kaW5nIHNwaGVyZQorCisgICAg
ICAgICAgICB2YXIgYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmU7CisKKyAg
ICAgICAgICAgIGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CisKKyAgICAgICAgICAg
ICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlID0gYm91bmRpbmdTcGhlcmUuY2xvbmUoKTsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB1cGRhdGUgZmxhZ3MKKworICAgICAgICAgICAg
dGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBzb3VyY2UuZWxlbWVudHNOZWVkVXBkYXRlOworICAg
ICAgICAgICAgdGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBzb3VyY2UudmVydGljZXNOZWVkVXBk
YXRlOworICAgICAgICAgICAgdGhpcy51dnNOZWVkVXBkYXRlID0gc291cmNlLnV2c05lZWRVcGRh
dGU7CisgICAgICAgICAgICB0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gc291cmNlLm5vcm1hbHNO
ZWVkVXBkYXRlOworICAgICAgICAgICAgdGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gc291cmNlLmNv
bG9yc05lZWRVcGRhdGU7CisgICAgICAgICAgICB0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRl
ID0gc291cmNlLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlOworICAgICAgICAgICAgdGhpcy5ncm91
cHNOZWVkVXBkYXRlID0gc291cmNlLmdyb3Vwc05lZWRVcGRhdGU7CisKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZGlzcG9zZTogZnVuY3Rpb24gKCkg
eworCisgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0g
KTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1y
ZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworICAgICAqLworCisgICAgZnVuY3Rpb24gQnVmZmVy
QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7CisKKyAgICAgICAgaWYg
KCBBcnJheS5pc0FycmF5KCBhcnJheSApICkgeworCisgICAgICAgICAgICB0aHJvdyBuZXcgVHlw
ZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBB
cnJheS4nICk7CisKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudXVpZCA9IF9NYXRoLmdlbmVy
YXRlVVVJRCgpOworICAgICAgICB0aGlzLm5hbWUgPSAnJzsKKworICAgICAgICB0aGlzLmFycmF5
ID0gYXJyYXk7CisgICAgICAgIHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTsKKyAgICAgICAgdGhp
cy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyBpdGVtU2l6ZSA6
IDA7CisgICAgICAgIHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7CisKKyAg
ICAgICAgdGhpcy5keW5hbWljID0gZmFsc2U7CisgICAgICAgIHRoaXMudXBkYXRlUmFuZ2UgPSB7
IG9mZnNldDogMCwgY291bnQ6IC0gMSB9OworCisgICAgICAgIHRoaXMub25VcGxvYWRDYWxsYmFj
ayA9IGZ1bmN0aW9uICgpIHt9OworCisgICAgICAgIHRoaXMudmVyc2lvbiA9IDA7CisKKyAgICB9
CisKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUs
ICduZWVkc1VwZGF0ZScsIHsKKworICAgICAgICBzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisK
KyAgICAgICAgICAgIGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7CisKKyAg
ICAgICAgfQorCisgICAgfSApOworCisgICAgT2JqZWN0LmFzc2lnbiggQnVmZmVyQXR0cmlidXRl
LnByb3RvdHlwZSwgeworCisgICAgICAgIGlzQnVmZmVyQXR0cmlidXRlOiB0cnVlLAorCisgICAg
ICAgIHNldEFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkgeworCisgICAgICAgICAgICBpZiAoIEFy
cmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlw
ZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBB
cnJheS4nICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5jb3VudCA9IGFy
cmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLml0ZW1TaXplIDogMDsKKyAg
ICAgICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKKworICAgICAgICB9LAorCisgICAgICAgIHNl
dER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAgIHRoaXMuZHluYW1p
YyA9IHZhbHVlOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisg
ICAgICAgIGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisgICAgICAgICAgICB0aGlzLmFy
cmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7CisgICAg
ICAgICAgICB0aGlzLml0ZW1TaXplID0gc291cmNlLml0ZW1TaXplOworICAgICAgICAgICAgdGhp
cy5jb3VudCA9IHNvdXJjZS5jb3VudDsKKyAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZCA9IHNv
dXJjZS5ub3JtYWxpemVkOworCisgICAgICAgICAgICB0aGlzLmR5bmFtaWMgPSBzb3VyY2UuZHlu
YW1pYzsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAg
ICBjb3B5QXQ6IGZ1bmN0aW9uICggaW5kZXgxLCBhdHRyaWJ1dGUsIGluZGV4MiApIHsKKworICAg
ICAgICAgICAgaW5kZXgxICo9IHRoaXMuaXRlbVNpemU7CisgICAgICAgICAgICBpbmRleDIgKj0g
YXR0cmlidXRlLml0ZW1TaXplOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSB0
aGlzLml0ZW1TaXplOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuYXJy
YXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsgaSBdOworCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgY29weUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkgeworCisgICAgICAgICAgICB0aGlz
LmFycmF5LnNldCggYXJyYXkgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAg
ICAgfSwKKworICAgICAgICBjb3B5Q29sb3JzQXJyYXk6IGZ1bmN0aW9uICggY29sb3JzICkgewor
CisgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwOworCisgICAg
ICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyAp
IHsKKworICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IGNvbG9yc1sgaSBdOworCisgICAgICAg
ICAgICAgICAgaWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAg
ICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXko
KTogY29sb3IgaXMgdW5kZWZpbmVkJywgaSApOworICAgICAgICAgICAgICAgICAgICBjb2xvciA9
IG5ldyBDb2xvcigpOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXJy
YXlbIG9mZnNldCArKyBdID0gY29sb3IucjsKKyAgICAgICAgICAgICAgICBhcnJheVsgb2Zmc2V0
ICsrIF0gPSBjb2xvci5nOworICAgICAgICAgICAgICAgIGFycmF5WyBvZmZzZXQgKysgXSA9IGNv
bG9yLmI7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBjb3B5SW5kaWNlc0FycmF5OiBmdW5jdGlvbiAoIGluZGljZXMg
KSB7CisKKyAgICAgICAgICAgIHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7CisK
KyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsg
aSArKyApIHsKKworICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGluZGljZXNbIGkgXTsKKwor
ICAgICAgICAgICAgICAgIGFycmF5WyBvZmZzZXQgKysgXSA9IGluZGV4LmE7CisgICAgICAgICAg
ICAgICAgYXJyYXlbIG9mZnNldCArKyBdID0gaW5kZXguYjsKKyAgICAgICAgICAgICAgICBhcnJh
eVsgb2Zmc2V0ICsrIF0gPSBpbmRleC5jOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgY29weVZlY3RvcjJzQXJyYXk6
IGZ1bmN0aW9uICggdmVjdG9ycyApIHsKKworICAgICAgICAgICAgdmFyIGFycmF5ID0gdGhpcy5h
cnJheSwgb2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0gdmVj
dG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgdmFyIHZlY3Rv
ciA9IHZlY3RvcnNbIGkgXTsKKworICAgICAgICAgICAgICAgIGlmICggdmVjdG9yID09PSB1bmRl
ZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuQnVm
ZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBp
ICk7CisgICAgICAgICAgICAgICAgICAgIHZlY3RvciA9IG5ldyBWZWN0b3IyKCk7CisKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0
b3IueDsKKyAgICAgICAgICAgICAgICBhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAor
CisgICAgICAgIGNvcHlWZWN0b3Izc0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7CisKKyAg
ICAgICAgICAgIHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7CisKKyAgICAgICAg
ICAgIGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsK
KworICAgICAgICAgICAgICAgIHZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07CisKKyAgICAgICAg
ICAgICAgICBpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAg
ICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJh
eSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApOworICAgICAgICAgICAgICAgICAgICB2ZWN0
b3IgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgYXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7CisgICAgICAgICAgICAgICAgYXJyYXlb
IG9mZnNldCArKyBdID0gdmVjdG9yLnk7CisgICAgICAgICAgICAgICAgYXJyYXlbIG9mZnNldCAr
KyBdID0gdmVjdG9yLno7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRo
aXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBjb3B5VmVjdG9yNHNBcnJheTogZnVuY3Rpb24g
KCB2ZWN0b3JzICkgeworCisgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZz
ZXQgPSAwOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0
aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgdmVjdG9yID0gdmVjdG9y
c1sgaSBdOworCisgICAgICAgICAgICAgICAgaWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHsK
KworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1
dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTsKKyAgICAg
ICAgICAgICAgICAgICAgdmVjdG9yID0gbmV3IFZlY3RvcjQoKTsKKworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54OworICAg
ICAgICAgICAgICAgIGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55OworICAgICAgICAgICAg
ICAgIGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56OworICAgICAgICAgICAgICAgIGFycmF5
WyBvZmZzZXQgKysgXSA9IHZlY3Rvci53OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHZh
bHVlLCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAgIGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQg
KSBvZmZzZXQgPSAwOworCisgICAgICAgICAgICB0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNl
dCApOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAg
IGdldFg6IGZ1bmN0aW9uICggaW5kZXggKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmFy
cmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTsKKworICAgICAgICB9LAorCisgICAgICAgIHNl
dFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7CisKKyAgICAgICAgICAgIHRoaXMuYXJyYXlbIGlu
ZGV4ICogdGhpcy5pdGVtU2l6ZSBdID0geDsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisK
KyAgICAgICAgfSwKKworICAgICAgICBnZXRZOiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgc2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHsKKwor
ICAgICAgICAgICAgdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdID0geTsK
KworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBnZXRa
OiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5hcnJheVsg
aW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0
WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHsKKworICAgICAgICAgICAgdGhpcy5hcnJheVsgaW5k
ZXggKiB0aGlzLml0ZW1TaXplICsgMiBdID0gejsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7
CisKKyAgICAgICAgfSwKKworICAgICAgICBnZXRXOiBmdW5jdGlvbiAoIGluZGV4ICkgeworCisg
ICAgICAgICAgICByZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBd
OworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHsK
KworICAgICAgICAgICAgdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdID0g
dzsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBz
ZXRYWTogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSApIHsKKworICAgICAgICAgICAgaW5kZXggKj0g
dGhpcy5pdGVtU2l6ZTsKKworICAgICAgICAgICAgdGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4
OworICAgICAgICAgICAgdGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5OworCisgICAgICAgICAg
ICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNldFhZWjogZnVuY3Rpb24g
KCBpbmRleCwgeCwgeSwgeiApIHsKKworICAgICAgICAgICAgaW5kZXggKj0gdGhpcy5pdGVtU2l6
ZTsKKworICAgICAgICAgICAgdGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4OworICAgICAgICAg
ICAgdGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5OworICAgICAgICAgICAgdGhpcy5hcnJheVsg
aW5kZXggKyAyIF0gPSB6OworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9
LAorCisgICAgICAgIHNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7CisK
KyAgICAgICAgICAgIGluZGV4ICo9IHRoaXMuaXRlbVNpemU7CisKKyAgICAgICAgICAgIHRoaXMu
YXJyYXlbIGluZGV4ICsgMCBdID0geDsKKyAgICAgICAgICAgIHRoaXMuYXJyYXlbIGluZGV4ICsg
MSBdID0geTsKKyAgICAgICAgICAgIHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejsKKyAgICAg
ICAgICAgIHRoaXMuYXJyYXlbIGluZGV4ICsgMyBdID0gdzsKKworICAgICAgICAgICAgcmV0dXJu
IHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxs
YmFjayApIHsKKworICAgICAgICAgICAgdGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7
CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgY2xv
bmU6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVj
dG9yKCB0aGlzLmFycmF5LCB0aGlzLml0ZW1TaXplICkuY29weSggdGhpcyApOworCisgICAgICAg
IH0KKworICAgIH0gKTsKKworICAgIC8vCisKKyAgICBmdW5jdGlvbiBJbnQ4QnVmZmVyQXR0cmli
dXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKyAgICAgICAgQnVmZmVyQXR0cmlidXRlLmNhbGwo
IHRoaXMsIG5ldyBJbnQ4QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7CisKKyAgICB9CisKKyAg
ICBJbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0
dHJpYnV0ZS5wcm90b3R5cGUgKTsKKyAgICBJbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IEludDhCdWZmZXJBdHRyaWJ1dGU7CisKKworICAgIGZ1bmN0aW9uIFVpbnQ4
QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKyAgICAgICAgQnVmZmVyQXR0
cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApOwor
CisgICAgfQorCisgICAgVWludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNy
ZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApOworICAgIFVpbnQ4QnVmZmVyQXR0cmli
dXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQ4QnVmZmVyQXR0cmlidXRlOworCisKKyAg
ICBmdW5jdGlvbiBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSAp
IHsKKworICAgICAgICBCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQ4Q2xhbXBl
ZEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApOworCisgICAgfQorCisgICAgVWludDhDbGFtcGVk
QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0
ZS5wcm90b3R5cGUgKTsKKyAgICBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBl
LmNvbnN0cnVjdG9yID0gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlOworCisKKyAgICBmdW5j
dGlvbiBJbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisgICAgICAg
IEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50MTZBcnJheSggYXJyYXkgKSwgaXRl
bVNpemUgKTsKKworICAgIH0KKworICAgIEludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9
IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTsKKyAgICBJbnQxNkJ1
ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQxNkJ1ZmZlckF0dHJpYnV0
ZTsKKworCisgICAgZnVuY3Rpb24gVWludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNp
emUgKSB7CisKKyAgICAgICAgQnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MTZB
cnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTsKKworICAgIH0KKworICAgIFVpbnQxNkJ1ZmZlckF0
dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90
eXBlICk7CisgICAgVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9
IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTsKKworCisgICAgZnVuY3Rpb24gSW50MzJCdWZmZXJBdHRy
aWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworICAgICAgICBCdWZmZXJBdHRyaWJ1dGUuY2Fs
bCggdGhpcywgbmV3IEludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7CisKKyAgICB9CisK
KyAgICBJbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZm
ZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7CisgICAgSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90
eXBlLmNvbnN0cnVjdG9yID0gSW50MzJCdWZmZXJBdHRyaWJ1dGU7CisKKworICAgIGZ1bmN0aW9u
IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisgICAgICAgIEJ1
ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1T
aXplICk7CisKKyAgICB9CisKKyAgICBVaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0g
T2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApOworICAgIFVpbnQzMkJ1
ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50MzJCdWZmZXJBdHRyaWJ1
dGU7CisKKworICAgIGZ1bmN0aW9uIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVt
U2l6ZSApIHsKKworICAgICAgICBCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0
MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTsKKworICAgIH0KKworICAgIEZsb2F0MzJCdWZm
ZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnBy
b3RvdHlwZSApOworICAgIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVj
dG9yID0gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTsKKworCisgICAgZnVuY3Rpb24gRmxvYXQ2NEJ1
ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisgICAgICAgIEJ1ZmZlckF0dHJp
YnV0ZS5jYWxsKCB0aGlzLCBuZXcgRmxvYXQ2NEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApOwor
CisgICAgfQorCisgICAgRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3Qu
Y3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7CisgICAgRmxvYXQ2NEJ1ZmZlckF0
dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGbG9hdDY0QnVmZmVyQXR0cmlidXRlOwor
CisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAg
ICAgKi8KKworICAgIGZ1bmN0aW9uIERpcmVjdEdlb21ldHJ5KCkgeworCisgICAgICAgIHRoaXMu
aW5kaWNlcyA9IFtdOworICAgICAgICB0aGlzLnZlcnRpY2VzID0gW107CisgICAgICAgIHRoaXMu
bm9ybWFscyA9IFtdOworICAgICAgICB0aGlzLmNvbG9ycyA9IFtdOworICAgICAgICB0aGlzLnV2
cyA9IFtdOworICAgICAgICB0aGlzLnV2czIgPSBbXTsKKworICAgICAgICB0aGlzLmdyb3VwcyA9
IFtdOworCisgICAgICAgIHRoaXMubW9ycGhUYXJnZXRzID0ge307CisKKyAgICAgICAgdGhpcy5z
a2luV2VpZ2h0cyA9IFtdOworICAgICAgICB0aGlzLnNraW5JbmRpY2VzID0gW107CisKKyAgICAg
ICAgLy8gdGhpcy5saW5lRGlzdGFuY2VzID0gW107CisKKyAgICAgICAgdGhpcy5ib3VuZGluZ0Jv
eCA9IG51bGw7CisgICAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOworCisgICAgICAg
IC8vIHVwZGF0ZSBmbGFncworCisgICAgICAgIHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZmFs
c2U7CisgICAgICAgIHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTsKKyAgICAgICAgdGhp
cy5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7CisgICAgICAgIHRoaXMudXZzTmVlZFVwZGF0ZSA9
IGZhbHNlOworICAgICAgICB0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTsKKworICAgIH0K
KworICAgIE9iamVjdC5hc3NpZ24oIERpcmVjdEdlb21ldHJ5LnByb3RvdHlwZSwgeworCisgICAg
ICAgIGNvbXB1dGVHcm91cHM6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7CisKKyAgICAgICAgICAg
IHZhciBncm91cDsKKyAgICAgICAgICAgIHZhciBncm91cHMgPSBbXTsKKyAgICAgICAgICAgIHZh
ciBtYXRlcmlhbEluZGV4ID0gdW5kZWZpbmVkOworCisgICAgICAgICAgICB2YXIgZmFjZXMgPSBn
ZW9tZXRyeS5mYWNlczsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgZmFjZXMu
bGVuZ3RoOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgdmFyIGZhY2UgPSBmYWNlc1sgaSBd
OworCisgICAgICAgICAgICAgICAgLy8gbWF0ZXJpYWxzCisKKyAgICAgICAgICAgICAgICBpZiAo
IGZhY2UubWF0ZXJpYWxJbmRleCAhPT0gbWF0ZXJpYWxJbmRleCApIHsKKworICAgICAgICAgICAg
ICAgICAgICBtYXRlcmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4OworCisgICAgICAgICAg
ICAgICAgICAgIGlmICggZ3JvdXAgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgZ3JvdXAuY291bnQgPSAoIGkgKiAzICkgLSBncm91cC5zdGFydDsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGdyb3Vwcy5wdXNoKCBncm91cCApOworCisgICAgICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgICAgICBncm91cCA9IHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHN0YXJ0OiBpICogMywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsSW5k
ZXg6IG1hdGVyaWFsSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGdyb3VwICE9PSB1bmRl
ZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICBncm91cC5jb3VudCA9ICggaSAqIDMgKSAtIGdy
b3VwLnN0YXJ0OworICAgICAgICAgICAgICAgIGdyb3Vwcy5wdXNoKCBncm91cCApOworCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOworCisgICAgICAg
IH0sCisKKyAgICAgICAgZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkgeworCisg
ICAgICAgICAgICB2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlczsKKyAgICAgICAgICAgIHZhciB2
ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOworICAgICAgICAgICAgdmFyIGZhY2VWZXJ0ZXhV
dnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzOworCisgICAgICAgICAgICB2YXIgaGFzRmFjZVZl
cnRleFV2ID0gZmFjZVZlcnRleFV2c1sgMCBdICYmIGZhY2VWZXJ0ZXhVdnNbIDAgXS5sZW5ndGgg
PiAwOworICAgICAgICAgICAgdmFyIGhhc0ZhY2VWZXJ0ZXhVdjIgPSBmYWNlVmVydGV4VXZzWyAx
IF0gJiYgZmFjZVZlcnRleFV2c1sgMSBdLmxlbmd0aCA+IDA7CisKKyAgICAgICAgICAgIC8vIG1v
cnBocworCisgICAgICAgICAgICB2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJn
ZXRzOworICAgICAgICAgICAgdmFyIG1vcnBoVGFyZ2V0c0xlbmd0aCA9IG1vcnBoVGFyZ2V0cy5s
ZW5ndGg7CisKKyAgICAgICAgICAgIHZhciBtb3JwaFRhcmdldHNQb3NpdGlvbjsKKworICAgICAg
ICAgICAgaWYgKCBtb3JwaFRhcmdldHNMZW5ndGggPiAwICkgeworCisgICAgICAgICAgICAgICAg
bW9ycGhUYXJnZXRzUG9zaXRpb24gPSBbXTsKKworICAgICAgICAgICAgICAgIGZvciAoIHZhciBp
ID0gMDsgaSA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaSArKyApIHsKKworICAgICAgICAgICAgICAg
ICAgICBtb3JwaFRhcmdldHNQb3NpdGlvblsgaSBdID0gW107CisKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0cy5wb3NpdGlvbiA9IG1vcnBoVGFy
Z2V0c1Bvc2l0aW9uOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBtb3JwaE5v
cm1hbHMgPSBnZW9tZXRyeS5tb3JwaE5vcm1hbHM7CisgICAgICAgICAgICB2YXIgbW9ycGhOb3Jt
YWxzTGVuZ3RoID0gbW9ycGhOb3JtYWxzLmxlbmd0aDsKKworICAgICAgICAgICAgdmFyIG1vcnBo
VGFyZ2V0c05vcm1hbDsKKworICAgICAgICAgICAgaWYgKCBtb3JwaE5vcm1hbHNMZW5ndGggPiAw
ICkgeworCisgICAgICAgICAgICAgICAgbW9ycGhUYXJnZXRzTm9ybWFsID0gW107CisKKyAgICAg
ICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGkgKysg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgbW9ycGhUYXJnZXRzTm9ybWFsWyBpIF0gPSBbXTsK
KworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXRz
Lm5vcm1hbCA9IG1vcnBoVGFyZ2V0c05vcm1hbDsKKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAvLyBza2lucworCisgICAgICAgICAgICB2YXIgc2tpbkluZGljZXMgPSBnZW9tZXRyeS5z
a2luSW5kaWNlczsKKyAgICAgICAgICAgIHZhciBza2luV2VpZ2h0cyA9IGdlb21ldHJ5LnNraW5X
ZWlnaHRzOworCisgICAgICAgICAgICB2YXIgaGFzU2tpbkluZGljZXMgPSBza2luSW5kaWNlcy5s
ZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDsKKyAgICAgICAgICAgIHZhciBoYXNTa2luV2VpZ2h0
cyA9IHNraW5XZWlnaHRzLmxlbmd0aCA9PT0gdmVydGljZXMubGVuZ3RoOworCisgICAgICAgICAg
ICAvLworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBmYWNlcy5sZW5ndGg7IGkg
KysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgZmFjZSA9IGZhY2VzWyBpIF07CisKKyAgICAg
ICAgICAgICAgICB0aGlzLnZlcnRpY2VzLnB1c2goIHZlcnRpY2VzWyBmYWNlLmEgXSwgdmVydGlj
ZXNbIGZhY2UuYiBdLCB2ZXJ0aWNlc1sgZmFjZS5jIF0gKTsKKworICAgICAgICAgICAgICAgIHZh
ciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzOworCisgICAgICAgICAgICAgICAg
aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHsKKworICAgICAgICAgICAgICAgICAg
ICB0aGlzLm5vcm1hbHMucHVzaCggdmVydGV4Tm9ybWFsc1sgMCBdLCB2ZXJ0ZXhOb3JtYWxzWyAx
IF0sIHZlcnRleE5vcm1hbHNbIDIgXSApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwor
ICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsID0gZmFjZS5ub3JtYWw7CisKKyAgICAgICAg
ICAgICAgICAgICAgdGhpcy5ub3JtYWxzLnB1c2goIG5vcm1hbCwgbm9ybWFsLCBub3JtYWwgKTsK
KworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB2ZXJ0ZXhDb2xvcnMg
PSBmYWNlLnZlcnRleENvbG9yczsKKworICAgICAgICAgICAgICAgIGlmICggdmVydGV4Q29sb3Jz
Lmxlbmd0aCA9PT0gMyApIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbG9ycy5wdXNo
KCB2ZXJ0ZXhDb2xvcnNbIDAgXSwgdmVydGV4Q29sb3JzWyAxIF0sIHZlcnRleENvbG9yc1sgMiBd
ICk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIHZh
ciBjb2xvciA9IGZhY2UuY29sb3I7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xvcnMu
cHVzaCggY29sb3IsIGNvbG9yLCBjb2xvciApOworCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgaWYgKCBoYXNGYWNlVmVydGV4VXYgPT09IHRydWUgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgdmFyIHZlcnRleFV2cyA9IGZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdOworCisg
ICAgICAgICAgICAgICAgICAgIGlmICggdmVydGV4VXZzICE9PSB1bmRlZmluZWQgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXZzLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0
ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVs
c2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5EaXJl
Y3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICcsIGkgKTsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dnMucHVzaCggbmV3IFZlY3RvcjIoKSwgbmV3
IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSApOworCisgICAgICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggaGFzRmFjZVZlcnRleFV2
MiA9PT0gdHJ1ZSApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdmVydGV4VXZzID0gZmFj
ZVZlcnRleFV2c1sgMSBdWyBpIF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB2ZXJ0ZXhV
dnMgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dnMy
LnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTsK
KworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5k
ZWZpbmVkIHZlcnRleFV2MiAnLCBpICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMu
dXZzMi5wdXNoKCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpICk7
CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgLy8gbW9ycGhzCisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaiA9IDA7IGog
PCBtb3JwaFRhcmdldHNMZW5ndGg7IGogKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFy
IG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBqIF0udmVydGljZXM7CisKKyAgICAgICAgICAg
ICAgICAgICAgbW9ycGhUYXJnZXRzUG9zaXRpb25bIGogXS5wdXNoKCBtb3JwaFRhcmdldFsgZmFj
ZS5hIF0sIG1vcnBoVGFyZ2V0WyBmYWNlLmIgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYyBdICk7CisK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaiA9IDA7IGog
PCBtb3JwaE5vcm1hbHNMZW5ndGg7IGogKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFy
IG1vcnBoTm9ybWFsID0gbW9ycGhOb3JtYWxzWyBqIF0udmVydGV4Tm9ybWFsc1sgaSBdOworCisg
ICAgICAgICAgICAgICAgICAgIG1vcnBoVGFyZ2V0c05vcm1hbFsgaiBdLnB1c2goIG1vcnBoTm9y
bWFsLmEsIG1vcnBoTm9ybWFsLmIsIG1vcnBoTm9ybWFsLmMgKTsKKworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIC8vIHNraW5zCisKKyAgICAgICAgICAgICAgICBpZiAoIGhh
c1NraW5JbmRpY2VzICkgeworCisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpbkluZGljZXMu
cHVzaCggc2tpbkluZGljZXNbIGZhY2UuYSBdLCBza2luSW5kaWNlc1sgZmFjZS5iIF0sIHNraW5J
bmRpY2VzWyBmYWNlLmMgXSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgaWYgKCBoYXNTa2luV2VpZ2h0cyApIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLnNr
aW5XZWlnaHRzLnB1c2goIHNraW5XZWlnaHRzWyBmYWNlLmEgXSwgc2tpbldlaWdodHNbIGZhY2Uu
YiBdLCBza2luV2VpZ2h0c1sgZmFjZS5jIF0gKTsKKworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmNvbXB1dGVHcm91cHMoIGdlb21ldHJ5ICk7
CisKKyAgICAgICAgICAgIHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGlj
ZXNOZWVkVXBkYXRlOworICAgICAgICAgICAgdGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IGdlb21l
dHJ5Lm5vcm1hbHNOZWVkVXBkYXRlOworICAgICAgICAgICAgdGhpcy5jb2xvcnNOZWVkVXBkYXRl
ID0gZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZTsKKyAgICAgICAgICAgIHRoaXMudXZzTmVlZFVw
ZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7CisgICAgICAgICAgICB0aGlzLmdyb3Vwc05l
ZWRVcGRhdGUgPSBnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlOworCisgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICBmdW5jdGlvbiBhcnJheU1h
eCggYXJyYXkgKSB7CisKKyAgICAgICAgaWYgKCBhcnJheS5sZW5ndGggPT09IDAgKSByZXR1cm4g
LSBJbmZpbml0eTsKKworICAgICAgICB2YXIgbWF4ID0gYXJyYXlbIDAgXTsKKworICAgICAgICBm
b3IgKCB2YXIgaSA9IDEsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyArKyBpICkgeworCisgICAg
ICAgICAgICBpZiAoIGFycmF5WyBpIF0gPiBtYXggKSBtYXggPSBhcnJheVsgaSBdOworCisgICAg
ICAgIH0KKworICAgICAgICByZXR1cm4gbWF4OworCisgICAgfQorCisgICAgLyoqCisgICAgICog
QGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKiBAYXV0
aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworICAgICAqLworCisgICAgZnVuY3Rpb24g
QnVmZmVyR2VvbWV0cnkoKSB7CisKKyAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlz
LCAnaWQnLCB7IHZhbHVlOiBHZW9tZXRyeUlkQ291bnQoKSB9ICk7CisKKyAgICAgICAgdGhpcy51
dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CisKKyAgICAgICAgdGhpcy5uYW1lID0gJyc7Cisg
ICAgICAgIHRoaXMudHlwZSA9ICdCdWZmZXJHZW9tZXRyeSc7CisKKyAgICAgICAgdGhpcy5pbmRl
eCA9IG51bGw7CisgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9OworCisgICAgICAgIHRoaXMu
bW9ycGhBdHRyaWJ1dGVzID0ge307CisKKyAgICAgICAgdGhpcy5ncm91cHMgPSBbXTsKKworICAg
ICAgICB0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDsKKyAgICAgICAgdGhpcy5ib3VuZGluZ1NwaGVy
ZSA9IG51bGw7CisKKyAgICAgICAgdGhpcy5kcmF3UmFuZ2UgPSB7IHN0YXJ0OiAwLCBjb3VudDog
SW5maW5pdHkgfTsKKworICAgIH0KKworICAgIEJ1ZmZlckdlb21ldHJ5Lk1heEluZGV4ID0gNjU1
MzU7CisKKyAgICBPYmplY3QuYXNzaWduKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUsIEV2ZW50
RGlzcGF0Y2hlci5wcm90b3R5cGUsIHsKKworICAgICAgICBpc0J1ZmZlckdlb21ldHJ5OiB0cnVl
LAorCisgICAgICAgIGdldEluZGV4OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVy
biB0aGlzLmluZGV4OworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0SW5kZXg6IGZ1bmN0aW9u
ICggaW5kZXggKSB7CisKKyAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheSggaW5kZXggKSAp
IHsKKworICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSBuZXcgKCBhcnJheU1heCggaW5kZXgg
KSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRl
ICkoIGluZGV4LCAxICk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAg
ICB0aGlzLmluZGV4ID0gaW5kZXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAorCisg
ICAgICAgIGFkZEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lLCBhdHRyaWJ1dGUgKSB7CisKKyAg
ICAgICAgICAgIGlmICggISAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuaXNCdWZmZXJBdHRyaWJ1
dGUgKSAmJiAhICggYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0
cmlidXRlICkgKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5CdWZm
ZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0cmlidXRl
ICkuJyApOworCisgICAgICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIG5ldyBC
dWZmZXJBdHRyaWJ1dGUoIGFyZ3VtZW50c1sgMSBdLCBhcmd1bWVudHNbIDIgXSApICk7CisKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYg
KCBuYW1lID09PSAnaW5kZXgnICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAn
VEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGlu
ZGV4IGF0dHJpYnV0ZS4nICk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXRJbmRleCggYXR0cmli
dXRlICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gPSBhdHRyaWJ1dGU7CisKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0QXR0cmlidXRlOiBm
dW5jdGlvbiAoIG5hbWUgKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNb
IG5hbWUgXTsKKworICAgICAgICB9LAorCisgICAgICAgIHJlbW92ZUF0dHJpYnV0ZTogZnVuY3Rp
b24gKCBuYW1lICkgeworCisgICAgICAgICAgICBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzWyBuYW1l
IF07CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAg
YWRkR3JvdXA6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50LCBtYXRlcmlhbEluZGV4ICkgeworCisg
ICAgICAgICAgICB0aGlzLmdyb3Vwcy5wdXNoKCB7CisKKyAgICAgICAgICAgICAgICBzdGFydDog
c3RhcnQsCisgICAgICAgICAgICAgICAgY291bnQ6IGNvdW50LAorICAgICAgICAgICAgICAgIG1h
dGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXggIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsSW5kZXgg
OiAwCisKKyAgICAgICAgICAgIH0gKTsKKworICAgICAgICB9LAorCisgICAgICAgIGNsZWFyR3Jv
dXBzOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gW107CisKKyAg
ICAgICAgfSwKKworICAgICAgICBzZXREcmF3UmFuZ2U6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50
ICkgeworCisgICAgICAgICAgICB0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHN0YXJ0OworICAgICAg
ICAgICAgdGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDsKKworICAgICAgICB9LAorCisgICAg
ICAgIGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKKworICAgICAgICAgICAgdmFy
IHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uOworCisgICAgICAgICAgICBpZiAo
IHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICBtYXRyaXguYXBw
bHlUb0J1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTsKKyAgICAgICAgICAgICAgICBwb3NpdGlv
bi5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFy
IG5vcm1hbCA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7CisKKyAgICAgICAgICAgIGlmICggbm9y
bWFsICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgbm9ybWFsTWF0cml4
ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApOworCisgICAgICAgICAg
ICAgICAgbm9ybWFsTWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbCApOworICAg
ICAgICAgICAgICAgIG5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgaWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkgeworCisgICAg
ICAgICAgICAgICAgdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTsKKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CisKKyAg
ICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOworCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAg
cm90YXRlWDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAvLyByb3RhdGUgZ2VvbWV0cnkg
YXJvdW5kIHdvcmxkIHgtYXhpcworCisgICAgICAgICAgICB2YXIgbTEgPSBuZXcgTWF0cml4NCgp
OworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5nbGUgKSB7CisKKyAg
ICAgICAgICAgICAgICBtMS5tYWtlUm90YXRpb25YKCBhbmdsZSApOworCisgICAgICAgICAgICAg
ICAgdGhpcy5hcHBseU1hdHJpeCggbTEgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlz
OworCisgICAgICAgICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICByb3RhdGVZOiBm
dW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29y
bGQgeS1heGlzCisKKyAgICAgICAgICAgIHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7CisKKyAgICAg
ICAgICAgIHJldHVybiBmdW5jdGlvbiByb3RhdGVZKCBhbmdsZSApIHsKKworICAgICAgICAgICAg
ICAgIG0xLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmFw
cGx5TWF0cml4KCBtMSApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAg
ICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIHJvdGF0ZVo6IGZ1bmN0aW9uICgp
IHsKKworICAgICAgICAgICAgLy8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXMK
KworICAgICAgICAgICAgdmFyIG0xID0gbmV3IE1hdHJpeDQoKTsKKworICAgICAgICAgICAgcmV0
dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkgeworCisgICAgICAgICAgICAgICAgbTEubWFr
ZVJvdGF0aW9uWiggYW5nbGUgKTsKKworICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlNYXRyaXgo
IG0xICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICAgICAgfTsK
KworICAgICAgICB9KCksCisKKyAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7CisKKyAg
ICAgICAgICAgIC8vIHRyYW5zbGF0ZSBnZW9tZXRyeQorCisgICAgICAgICAgICB2YXIgbTEgPSBu
ZXcgTWF0cml4NCgpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlKCB4
LCB5LCB6ICkgeworCisgICAgICAgICAgICAgICAgbTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6
ICk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmFwcGx5TWF0cml4KCBtMSApOworCisgICAgICAg
ICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAor
CisgICAgICAgIHNjYWxlOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8vIHNjYWxlIGdl
b21ldHJ5CisKKyAgICAgICAgICAgIHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7CisKKyAgICAgICAg
ICAgIHJldHVybiBmdW5jdGlvbiBzY2FsZSggeCwgeSwgeiApIHsKKworICAgICAgICAgICAgICAg
IG0xLm1ha2VTY2FsZSggeCwgeSwgeiApOworCisgICAgICAgICAgICAgICAgdGhpcy5hcHBseU1h
dHJpeCggbTEgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgICAg
ICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICBsb29rQXQ6IGZ1bmN0aW9uICgpIHsKKwor
ICAgICAgICAgICAgdmFyIG9iaiA9IG5ldyBPYmplY3QzRCgpOworCisgICAgICAgICAgICByZXR1
cm4gZnVuY3Rpb24gbG9va0F0KCB2ZWN0b3IgKSB7CisKKyAgICAgICAgICAgICAgICBvYmoubG9v
a0F0KCB2ZWN0b3IgKTsKKworICAgICAgICAgICAgICAgIG9iai51cGRhdGVNYXRyaXgoKTsKKwor
ICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlNYXRyaXgoIG9iai5tYXRyaXggKTsKKworICAgICAg
ICAgICAgfTsKKworICAgICAgICB9KCksCisKKyAgICAgICAgY2VudGVyOiBmdW5jdGlvbiAoKSB7
CisKKyAgICAgICAgICAgIHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7CisKKyAgICAgICAgICAg
IHZhciBvZmZzZXQgPSB0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcigpLm5lZ2F0ZSgpOworCisg
ICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZSggb2Zmc2V0LngsIG9mZnNldC55LCBvZmZzZXQueiAp
OworCisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworCisgICAgICAgIH0sCisKKyAgICAgICAg
c2V0RnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7CisKKyAgICAgICAgICAgIC8vIGNv
bnNvbGUubG9nKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuc2V0RnJvbU9iamVjdCgpLiBDb252ZXJ0
aW5nJywgb2JqZWN0LCB0aGlzICk7CisKKyAgICAgICAgICAgIHZhciBnZW9tZXRyeSA9IG9iamVj
dC5nZW9tZXRyeTsKKworICAgICAgICAgICAgaWYgKCBvYmplY3QuaXNQb2ludHMgfHwgb2JqZWN0
LmlzTGluZSApIHsKKworICAgICAgICAgICAgICAgIHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQz
MkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICogMywgMyApOworICAg
ICAgICAgICAgICAgIHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2Vv
bWV0cnkuY29sb3JzLmxlbmd0aCAqIDMsIDMgKTsKKworICAgICAgICAgICAgICAgIHRoaXMuYWRk
QXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMuY29weVZlY3RvcjNzQXJyYXkoIGdlb21l
dHJ5LnZlcnRpY2VzICkgKTsKKyAgICAgICAgICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZSggJ2Nv
bG9yJywgY29sb3JzLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICkgKTsKKworICAg
ICAgICAgICAgICAgIGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlcyAmJiBnZW9tZXRyeS5saW5l
RGlzdGFuY2VzLmxlbmd0aCA9PT0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkgeworCisgICAg
ICAgICAgICAgICAgICAgIHZhciBsaW5lRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRy
aWJ1dGUoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMubGVuZ3RoLCAxICk7CisKKyAgICAgICAgICAg
ICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBsaW5lRGlzdGFuY2Vz
LmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApICk7CisKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBu
dWxsICkgeworCisgICAgICAgICAgICAgICAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9t
ZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpOworCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgaWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKKworICAg
ICAgICAgICAgICAgICAgICB0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3gu
Y2xvbmUoKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmICgg
b2JqZWN0LmlzTWVzaCApIHsKKworICAgICAgICAgICAgICAgIGlmICggZ2VvbWV0cnkgJiYgZ2Vv
bWV0cnkuaXNHZW9tZXRyeSApIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLmZyb21HZW9t
ZXRyeSggZ2VvbWV0cnkgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHVwZGF0
ZUZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkgeworCisgICAgICAgICAgICB2YXIgZ2Vv
bWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CisKKyAgICAgICAgICAgIGlmICggb2JqZWN0LmlzTWVz
aCApIHsKKworICAgICAgICAgICAgICAgIHZhciBkaXJlY3QgPSBnZW9tZXRyeS5fX2RpcmVjdEdl
b21ldHJ5OworCisgICAgICAgICAgICAgICAgaWYgKCBnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRh
dGUgPT09IHRydWUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0ID0gdW5kZWZpbmVk
OworICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxz
ZTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggZGlyZWN0ID09
PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnJvbUdl
b21ldHJ5KCBnZW9tZXRyeSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgZGlyZWN0LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0
ZTsKKyAgICAgICAgICAgICAgICBkaXJlY3Qubm9ybWFsc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5u
b3JtYWxzTmVlZFVwZGF0ZTsKKyAgICAgICAgICAgICAgICBkaXJlY3QuY29sb3JzTmVlZFVwZGF0
ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7CisgICAgICAgICAgICAgICAgZGlyZWN0LnV2
c05lZWRVcGRhdGUgPSBnZW9tZXRyeS51dnNOZWVkVXBkYXRlOworICAgICAgICAgICAgICAgIGRp
cmVjdC5ncm91cHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZTsKKworICAg
ICAgICAgICAgICAgIGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlOworICAgICAg
ICAgICAgICAgIGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7CisgICAgICAgICAg
ICAgICAgZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAg
IGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBnZW9tZXRy
eS5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBnZW9tZXRyeSA9
IGRpcmVjdDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYXR0cmlidXRlOwor
CisgICAgICAgICAgICBpZiAoIGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSAp
IHsKKworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlv
bjsKKworICAgICAgICAgICAgICAgIGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRy
eS52ZXJ0aWNlcyApOworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUubmVlZHNVcGRhdGUg
PSB0cnVlOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZ2VvbWV0cnku
dmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaWYgKCBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHsKKworICAgICAg
ICAgICAgICAgIGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7CisKKyAgICAgICAg
ICAgICAgICBpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAg
ICAgICAgIGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkubm9ybWFscyApOwor
ICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlOworCisgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRh
dGUgPSBmYWxzZTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGdlb21ldHJ5
LmNvbG9yc05lZWRVcGRhdGUgPT09IHRydWUgKSB7CisKKyAgICAgICAgICAgICAgICBhdHRyaWJ1
dGUgPSB0aGlzLmF0dHJpYnV0ZXMuY29sb3I7CisKKyAgICAgICAgICAgICAgICBpZiAoIGF0dHJp
YnV0ZSAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5j
b3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApOworICAgICAgICAgICAgICAgICAgICBh
dHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGlmICggZ2VvbWV0cnkudXZzTmVlZFVwZGF0ZSApIHsKKwor
ICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy51djsKKworICAgICAg
ICAgICAgICAgIGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgYXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMgKTsKKyAg
ICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBm
YWxzZTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGdlb21ldHJ5LmxpbmVE
aXN0YW5jZXNOZWVkVXBkYXRlICkgeworCisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gdGhp
cy5hdHRyaWJ1dGVzLmxpbmVEaXN0YW5jZTsKKworICAgICAgICAgICAgICAgIGlmICggYXR0cmli
dXRlICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmNv
cHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApOworICAgICAgICAgICAgICAgICAgICBh
dHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRh
dGUgKSB7CisKKyAgICAgICAgICAgICAgICBnZW9tZXRyeS5jb21wdXRlR3JvdXBzKCBvYmplY3Qu
Z2VvbWV0cnkgKTsKKyAgICAgICAgICAgICAgICB0aGlzLmdyb3VwcyA9IGdlb21ldHJ5Lmdyb3Vw
czsKKworICAgICAgICAgICAgICAgIGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTsK
KworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9
LAorCisgICAgICAgIGZyb21HZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHsKKworICAg
ICAgICAgICAgZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSA9IG5ldyBEaXJlY3RHZW9tZXRyeSgp
LmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnJv
bURpcmVjdEdlb21ldHJ5KCBnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5ICk7CisKKyAgICAgICAg
fSwKKworICAgICAgICBmcm9tRGlyZWN0R2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7
CisKKyAgICAgICAgICAgIHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRy
eS52ZXJ0aWNlcy5sZW5ndGggKiAzICk7CisgICAgICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZSgg
J3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkuY29weVZlY3Rv
cjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICkgKTsKKworICAgICAgICAgICAgaWYgKCBnZW9t
ZXRyeS5ub3JtYWxzLmxlbmd0aCA+IDAgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgbm9ybWFs
cyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMubGVuZ3RoICogMyApOworICAg
ICAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJp
YnV0ZSggbm9ybWFscywgMyApLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS5ub3JtYWxzICkg
KTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGdlb21ldHJ5LmNvbG9ycy5s
ZW5ndGggPiAwICkgeworCisgICAgICAgICAgICAgICAgdmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMy
QXJyYXkoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzICk7CisgICAgICAgICAgICAgICAgdGhp
cy5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyAp
LmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICkgKTsKKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBpZiAoIGdlb21ldHJ5LnV2cy5sZW5ndGggPiAwICkgeworCisgICAgICAg
ICAgICAgICAgdmFyIHV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnV2cy5sZW5ndGgg
KiAyICk7CisgICAgICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBCdWZm
ZXJBdHRyaWJ1dGUoIHV2cywgMiApLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMgKSAp
OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZ2VvbWV0cnkudXZzMi5sZW5n
dGggPiAwICkgeworCisgICAgICAgICAgICAgICAgdmFyIHV2czIgPSBuZXcgRmxvYXQzMkFycmF5
KCBnZW9tZXRyeS51dnMyLmxlbmd0aCAqIDIgKTsKKyAgICAgICAgICAgICAgICB0aGlzLmFkZEF0
dHJpYnV0ZSggJ3V2MicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2czIsIDIgKS5jb3B5VmVjdG9y
MnNBcnJheSggZ2VvbWV0cnkudXZzMiApICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaWYgKCBnZW9tZXRyeS5pbmRpY2VzLmxlbmd0aCA+IDAgKSB7CisKKyAgICAgICAgICAgICAg
ICB2YXIgVHlwZUFycmF5ID0gYXJyYXlNYXgoIGdlb21ldHJ5LmluZGljZXMgKSA+IDY1NTM1ID8g
VWludDMyQXJyYXkgOiBVaW50MTZBcnJheTsKKyAgICAgICAgICAgICAgICB2YXIgaW5kaWNlcyA9
IG5ldyBUeXBlQXJyYXkoIGdlb21ldHJ5LmluZGljZXMubGVuZ3RoICogMyApOworICAgICAgICAg
ICAgICAgIHRoaXMuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEgKS5j
b3B5SW5kaWNlc0FycmF5KCBnZW9tZXRyeS5pbmRpY2VzICkgKTsKKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAvLyBncm91cHMKKworICAgICAgICAgICAgdGhpcy5ncm91cHMgPSBnZW9t
ZXRyeS5ncm91cHM7CisKKyAgICAgICAgICAgIC8vIG1vcnBocworCisgICAgICAgICAgICBmb3Ig
KCB2YXIgbmFtZSBpbiBnZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7CisKKyAgICAgICAgICAgICAg
ICB2YXIgYXJyYXkgPSBbXTsKKyAgICAgICAgICAgICAgICB2YXIgbW9ycGhUYXJnZXRzID0gZ2Vv
bWV0cnkubW9ycGhUYXJnZXRzWyBuYW1lIF07CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIg
aSA9IDAsIGwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAg
ICAgICAgICAgICAgICB2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTsKKworICAg
ICAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1
dGUoIG1vcnBoVGFyZ2V0Lmxlbmd0aCAqIDMsIDMgKTsKKworICAgICAgICAgICAgICAgICAgICBh
cnJheS5wdXNoKCBhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIG1vcnBoVGFyZ2V0ICkgKTsK
KworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMubW9ycGhBdHRyaWJ1
dGVzWyBuYW1lIF0gPSBhcnJheTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBz
a2lubmluZworCisgICAgICAgICAgICBpZiAoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCA+
IDAgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgc2tpbkluZGljZXMgPSBuZXcgRmxvYXQzMkJ1
ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICogNCwgNCApOworICAg
ICAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAnc2tpbkluZGV4Jywgc2tpbkluZGljZXMu
Y29weVZlY3RvcjRzQXJyYXkoIGdlb21ldHJ5LnNraW5JbmRpY2VzICkgKTsKKworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCA+IDAg
KSB7CisKKyAgICAgICAgICAgICAgICB2YXIgc2tpbldlaWdodHMgPSBuZXcgRmxvYXQzMkJ1ZmZl
ckF0dHJpYnV0ZSggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICogNCwgNCApOworICAgICAg
ICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAnc2tpbldlaWdodCcsIHNraW5XZWlnaHRzLmNv
cHlWZWN0b3I0c0FycmF5KCBnZW9tZXRyeS5za2luV2VpZ2h0cyApICk7CisKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgLy8KKworICAgICAgICAgICAgaWYgKCBnZW9tZXRyeS5ib3VuZGlu
Z1NwaGVyZSAhPT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuYm91bmRpbmdTcGhl
cmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpOworCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7CisKKyAg
ICAgICAgICAgICAgICB0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xv
bmUoKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAg
ICAgICB9LAorCisgICAgICAgIGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICBpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7CisKKyAgICAgICAg
ICAgICAgICB0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTsKKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247CisK
KyAgICAgICAgICAgIGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAg
ICAgICAgIHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24g
KTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIHRoaXMuYm91bmRp
bmdCb3gubWFrZUVtcHR5KCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBp
c05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueCApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94
Lm1pbi55ICkgfHwgaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnogKSApIHsKKworICAgICAg
ICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91
bmRpbmdCb3g6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9u
IiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7CisKKyAg
ICAgICAgICAgIH0KKworICAgICAgICB9LAorCisgICAgICAgIGNvbXB1dGVCb3VuZGluZ1NwaGVy
ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgYm94ID0gbmV3IEJveDMoKTsKKyAg
ICAgICAgICAgIHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICByZXR1
cm4gZnVuY3Rpb24gY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkgeworCisgICAgICAgICAgICAgICAg
aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgeworCisgICAgICAgICAgICAgICAg
ICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7CisKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9z
aXRpb247CisKKyAgICAgICAgICAgICAgICBpZiAoIHBvc2l0aW9uICkgeworCisgICAgICAgICAg
ICAgICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjsKKworICAg
ICAgICAgICAgICAgICAgICBib3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTsK
KyAgICAgICAgICAgICAgICAgICAgYm94LmdldENlbnRlciggY2VudGVyICk7CisKKyAgICAgICAg
ICAgICAgICAgICAgLy8gaG9waW5nIHRvIGZpbmQgYSBib3VuZGluZ1NwaGVyZSB3aXRoIGEgcmFk
aXVzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gYm91bmRpbmdTcGhl
cmUgb2YgdGhlIGJvdW5kaW5nQm94OiBzcXJ0KDMpIHNtYWxsZXIgaW4gdGhlIGJlc3QgY2FzZQor
CisgICAgICAgICAgICAgICAgICAgIHZhciBtYXhSYWRpdXNTcSA9IDA7CisKKyAgICAgICAgICAg
ICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBpbCA9IHBvc2l0aW9uLmNvdW50OyBpIDwgaWw7IGkg
KysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvci54ID0gcG9zaXRpb24uZ2V0
WCggaSApOworICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yLnkgPSBwb3NpdGlvbi5nZXRZ
KCBpICk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IueiA9IHBvc2l0aW9uLmdldFoo
IGkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1h
eFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHZlY3RvciApICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRoaXMuYm91bmRpbmdTcGhl
cmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApOworCisgICAgICAgICAgICAgICAg
ICAgIGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzICkgKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5j
b21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3Np
dGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApOwor
CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgfTsKKworICAgICAgICB9KCksCisKKyAgICAgICAgY29tcHV0ZUZhY2VOb3JtYWxzOiBmdW5j
dGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisKKyAg
ICAgICAgfSwKKworICAgICAgICBjb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4OworICAgICAgICAgICAgdmFyIGF0
dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7CisgICAgICAgICAgICB2YXIgZ3JvdXBzID0gdGhp
cy5ncm91cHM7CisKKyAgICAgICAgICAgIGlmICggYXR0cmlidXRlcy5wb3NpdGlvbiApIHsKKwor
ICAgICAgICAgICAgICAgIHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5
OworCisgICAgICAgICAgICAgICAgaWYgKCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVk
ICkgeworCisgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywg
bmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb25zLmxlbmd0aCAp
LCAzICkgKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgLy8gcmVzZXQgZXhpc3Rpbmcgbm9ybWFscyB0byB6ZXJvCisKKyAgICAgICAgICAgICAgICAg
ICAgdmFyIGFycmF5ID0gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXk7CisKKyAgICAgICAgICAgICAg
ICAgICAgZm9yICggdmFyIGkgPSAwLCBpbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkg
eworCisgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVsgaSBdID0gMDsKKworICAgICAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIg
bm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5OworCisgICAgICAgICAgICAgICAgdmFy
IHZBLCB2QiwgdkM7CisgICAgICAgICAgICAgICAgdmFyIHBBID0gbmV3IFZlY3RvcjMoKSwgcEIg
PSBuZXcgVmVjdG9yMygpLCBwQyA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICAgICAgdmFy
IGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICAg
ICAgLy8gaW5kZXhlZCBlbGVtZW50cworCisgICAgICAgICAgICAgICAgaWYgKCBpbmRleCApIHsK
KworICAgICAgICAgICAgICAgICAgICB2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5OworCisgICAg
ICAgICAgICAgICAgICAgIGlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgdGhpcy5hZGRHcm91cCggMCwgaW5kaWNlcy5sZW5ndGggKTsKKworICAg
ICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGogPSAw
LCBqbCA9IGdyb3Vwcy5sZW5ndGg7IGogPCBqbDsgKysgaiApIHsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgdmFyIGdyb3VwID0gZ3JvdXBzWyBqIF07CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHZhciBzdGFydCA9IGdyb3VwLnN0YXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgdmFy
IGNvdW50ID0gZ3JvdXAuY291bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIHZh
ciBpID0gc3RhcnQsIGlsID0gc3RhcnQgKyBjb3VudDsgaSA8IGlsOyBpICs9IDMgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB2QSA9IGluZGljZXNbIGkgKyAwIF0gKiAzOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHZCID0gaW5kaWNlc1sgaSArIDEgXSAqIDM7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdkMgPSBpbmRpY2VzWyBpICsgMiBdICogMzsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHBBLmZyb21BcnJheSggcG9zaXRpb25zLCB2QSApOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCLmZyb21BcnJheSggcG9zaXRpb25zLCB2QiAp
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLmZyb21BcnJheSggcG9zaXRpb25zLCB2
QyApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Iuc3ViVmVjdG9ycyggcEMsIHBC
ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWIuc3ViVmVjdG9ycyggcEEsIHBCICk7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IuY3Jvc3MoIGFiICk7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBub3JtYWxzWyB2QSBdICs9IGNiLng7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbm9ybWFsc1sgdkEgKyAxIF0gKz0gY2IueTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBub3JtYWxzWyB2QSArIDIgXSArPSBjYi56OworCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbm9ybWFsc1sgdkIgXSArPSBjYi54OworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG5vcm1hbHNbIHZCICsgMSBdICs9IGNiLnk7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbm9ybWFsc1sgdkIgKyAyIF0gKz0gY2IuejsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG5vcm1hbHNbIHZDIF0gKz0gY2IueDsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBub3JtYWxzWyB2QyArIDEgXSArPSBjYi55OworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG5vcm1hbHNbIHZDICsgMiBdICs9IGNiLno7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2Ugewor
CisgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1pbmRleGVkIGVsZW1lbnRzICh1bmNvbm5lY3Rl
ZCB0cmlhbmdsZSBzb3VwKQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwg
aWwgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgaWw7IGkgKz0gOSApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgcEEuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHBCLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgMyApOworICAgICAgICAgICAg
ICAgICAgICAgICAgcEMuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKyA2ICk7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGNiLnN1YlZlY3RvcnMoIHBDLCBwQiApOworICAgICAgICAgICAgICAg
ICAgICAgICAgYWIuc3ViVmVjdG9ycyggcEEsIHBCICk7CisgICAgICAgICAgICAgICAgICAgICAg
ICBjYi5jcm9zcyggYWIgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsc1sgaSBd
ID0gY2IueDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbHNbIGkgKyAxIF0gPSBjYi55
OworICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsc1sgaSArIDIgXSA9IGNiLno7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbHNbIGkgKyAzIF0gPSBjYi54OworICAgICAgICAg
ICAgICAgICAgICAgICAgbm9ybWFsc1sgaSArIDQgXSA9IGNiLnk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBub3JtYWxzWyBpICsgNSBdID0gY2IuejsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgbm9ybWFsc1sgaSArIDYgXSA9IGNiLng7CisgICAgICAgICAgICAgICAgICAgICAgICBub3Jt
YWxzWyBpICsgNyBdID0gY2IueTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbHNbIGkg
KyA4IF0gPSBjYi56OworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplTm9ybWFscygpOworCisgICAgICAg
ICAgICAgICAgYXR0cmlidXRlcy5ub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgfSwKKworICAgICAgICBtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRy
eSwgb2Zmc2V0ICkgeworCisgICAgICAgICAgICBpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRy
eS5pc0J1ZmZlckdlb21ldHJ5ICkgKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9y
KCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNl
IG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LicsIGdlb21ldHJ5ICk7CisgICAgICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggb2Zmc2V0ID09PSB1
bmRlZmluZWQgKSBvZmZzZXQgPSAwOworCisgICAgICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHRo
aXMuYXR0cmlidXRlczsKKworICAgICAgICAgICAgZm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVz
ICkgeworCisgICAgICAgICAgICAgICAgaWYgKCBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXSA9
PT0gdW5kZWZpbmVkICkgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRl
MSA9IGF0dHJpYnV0ZXNbIGtleSBdOworICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVBcnJh
eTEgPSBhdHRyaWJ1dGUxLmFycmF5OworCisgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZTIg
PSBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXTsKKyAgICAgICAgICAgICAgICB2YXIgYXR0cmli
dXRlQXJyYXkyID0gYXR0cmlidXRlMi5hcnJheTsKKworICAgICAgICAgICAgICAgIHZhciBhdHRy
aWJ1dGVTaXplID0gYXR0cmlidXRlMi5pdGVtU2l6ZTsKKworICAgICAgICAgICAgICAgIGZvciAo
IHZhciBpID0gMCwgaiA9IGF0dHJpYnV0ZVNpemUgKiBvZmZzZXQ7IGkgPCBhdHRyaWJ1dGVBcnJh
eTIubGVuZ3RoOyBpICsrLCBqICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0
ZUFycmF5MVsgaiBdID0gYXR0cmlidXRlQXJyYXkyWyBpIF07CisKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAg
fSwKKworICAgICAgICBub3JtYWxpemVOb3JtYWxzOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAg
ICAgIHZhciBub3JtYWxzID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDsKKworICAgICAgICAgICAg
dmFyIHgsIHksIHosIG47CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwgaWwgPSBub3Jt
YWxzLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB4ID0gbm9ybWFs
cy5nZXRYKCBpICk7CisgICAgICAgICAgICAgICAgeSA9IG5vcm1hbHMuZ2V0WSggaSApOworICAg
ICAgICAgICAgICAgIHogPSBub3JtYWxzLmdldFooIGkgKTsKKworICAgICAgICAgICAgICAgIG4g
PSAxLjAgLyBNYXRoLnNxcnQoIHggKiB4ICsgeSAqIHkgKyB6ICogeiApOworCisgICAgICAgICAg
ICAgICAgbm9ybWFscy5zZXRYWVooIGksIHggKiBuLCB5ICogbiwgeiAqIG4gKTsKKworICAgICAg
ICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAgdG9Ob25JbmRleGVkOiBmdW5jdGlvbiAo
KSB7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5pbmRleCA9PT0gbnVsbCApIHsKKworICAgICAg
ICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhl
ZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLicgKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gdGhpczsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZ2VvbWV0
cnkyID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisKKyAgICAgICAgICAgIHZhciBpbmRpY2VzID0g
dGhpcy5pbmRleC5hcnJheTsKKyAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRy
aWJ1dGVzOworCisgICAgICAgICAgICBmb3IgKCB2YXIgbmFtZSBpbiBhdHRyaWJ1dGVzICkgewor
CisgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTsKKwor
ICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTsKKyAgICAgICAgICAg
ICAgICB2YXIgaXRlbVNpemUgPSBhdHRyaWJ1dGUuaXRlbVNpemU7CisKKyAgICAgICAgICAgICAg
ICB2YXIgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0
ZW1TaXplICk7CisKKyAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSAwLCBpbmRleDIgPSAwOwor
CisgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGg7IGkg
PCBsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1sgaSBd
ICogaXRlbVNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGogPSAwOyBqIDwg
aXRlbVNpemU7IGogKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5MlsgaW5k
ZXgyICsrIF0gPSBhcnJheVsgaW5kZXggKysgXTsKKworICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBnZW9tZXRyeTIuYWRkQXR0cmli
dXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheTIsIGl0ZW1TaXplICkgKTsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnkyOworCisgICAgICAg
IH0sCisKKyAgICAgICAgdG9KU09OOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciBk
YXRhID0geworICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7CisgICAgICAgICAgICAgICAgICAg
IHZlcnNpb246IDQuNSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0J1ZmZlckdlb21ldHJ5
JywKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnQnVmZmVyR2VvbWV0cnkudG9KU09O
JworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIHN0
YW5kYXJkIEJ1ZmZlckdlb21ldHJ5IHNlcmlhbGl6YXRpb24KKworICAgICAgICAgICAgZGF0YS51
dWlkID0gdGhpcy51dWlkOworICAgICAgICAgICAgZGF0YS50eXBlID0gdGhpcy50eXBlOworICAg
ICAgICAgICAgaWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lOwor
CisgICAgICAgICAgICBpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkgeworCisg
ICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7CisKKyAgICAg
ICAgICAgICAgICBmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5
IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIHJldHVybiBkYXRhOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRhdGEu
ZGF0YSA9IHsgYXR0cmlidXRlczoge30gfTsKKworICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhp
cy5pbmRleDsKKworICAgICAgICAgICAgaWYgKCBpbmRleCAhPT0gbnVsbCApIHsKKworICAgICAg
ICAgICAgICAgIHZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBpbmRleC5h
cnJheSApOworCisgICAgICAgICAgICAgICAgZGF0YS5kYXRhLmluZGV4ID0geworICAgICAgICAg
ICAgICAgICAgICB0eXBlOiBpbmRleC5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLAorICAgICAgICAg
ICAgICAgICAgICBhcnJheTogYXJyYXkKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzOworCisg
ICAgICAgICAgICBmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7CisKKyAgICAgICAgICAg
ICAgICB2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07CisKKyAgICAgICAgICAgICAg
ICB2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXR0cmlidXRlLmFycmF5
ICk7CisKKyAgICAgICAgICAgICAgICBkYXRhLmRhdGEuYXR0cmlidXRlc1sga2V5IF0gPSB7Cisg
ICAgICAgICAgICAgICAgICAgIGl0ZW1TaXplOiBhdHRyaWJ1dGUuaXRlbVNpemUsCisgICAgICAg
ICAgICAgICAgICAgIHR5cGU6IGF0dHJpYnV0ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLAorICAg
ICAgICAgICAgICAgICAgICBhcnJheTogYXJyYXksCisgICAgICAgICAgICAgICAgICAgIG5vcm1h
bGl6ZWQ6IGF0dHJpYnV0ZS5ub3JtYWxpemVkCisgICAgICAgICAgICAgICAgfTsKKworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICB2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7CisKKyAgICAg
ICAgICAgIGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7CisKKyAgICAgICAgICAgICAgICBkYXRh
LmRhdGEuZ3JvdXBzID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIGdyb3VwcyApICk7CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJvdW5kaW5nU3BoZXJlID0gdGhpcy5i
b3VuZGluZ1NwaGVyZTsKKworICAgICAgICAgICAgaWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVs
bCApIHsKKworICAgICAgICAgICAgICAgIGRhdGEuZGF0YS5ib3VuZGluZ1NwaGVyZSA9IHsKKyAg
ICAgICAgICAgICAgICAgICAgY2VudGVyOiBib3VuZGluZ1NwaGVyZS5jZW50ZXIudG9BcnJheSgp
LAorICAgICAgICAgICAgICAgICAgICByYWRpdXM6IGJvdW5kaW5nU3BoZXJlLnJhZGl1cworICAg
ICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGRh
dGE7CisKKyAgICAgICAgfSwKKworICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkgeworCisgICAg
ICAgICAgICAvKgorICAgICAgICAgICAgIC8vIEhhbmRsZSBwcmltaXRpdmVzCisKKyAgICAgICAg
ICAgICB2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVyczsKKworICAgICAgICAgICAgIGlm
ICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgdmFyIHZhbHVl
cyA9IFtdOworCisgICAgICAgICAgICAgZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkgewor
CisgICAgICAgICAgICAgdmFsdWVzLnB1c2goIHBhcmFtZXRlcnNbIGtleSBdICk7CisKKyAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0
aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApOworICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0
b3IuYXBwbHkoIGdlb21ldHJ5LCB2YWx1ZXMgKTsKKyAgICAgICAgICAgICByZXR1cm4gZ2VvbWV0
cnk7CisKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29u
c3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAg
cmV0dXJuIG5ldyBCdWZmZXJHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTsKKworICAgICAgICB9LAor
CisgICAgICAgIGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisgICAgICAgICAgICB2YXIg
bmFtZSwgaSwgbDsKKworICAgICAgICAgICAgLy8gcmVzZXQKKworICAgICAgICAgICAgdGhpcy5p
bmRleCA9IG51bGw7CisgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAg
ICAgIHRoaXMubW9ycGhBdHRyaWJ1dGVzID0ge307CisgICAgICAgICAgICB0aGlzLmdyb3VwcyA9
IFtdOworICAgICAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CisgICAgICAgICAgICB0
aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDsKKworICAgICAgICAgICAgLy8gbmFtZQorCisgICAg
ICAgICAgICB0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTsKKworICAgICAgICAgICAgLy8gaW5kZXgK
KworICAgICAgICAgICAgdmFyIGluZGV4ID0gc291cmNlLmluZGV4OworCisgICAgICAgICAgICBp
ZiAoIGluZGV4ICE9PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5zZXRJbmRleCgg
aW5kZXguY2xvbmUoKSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGF0dHJp
YnV0ZXMKKworICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzb3VyY2UuYXR0cmlidXRlczsK
KworICAgICAgICAgICAgZm9yICggbmFtZSBpbiBhdHRyaWJ1dGVzICkgeworCisgICAgICAgICAg
ICAgICAgdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTsKKyAgICAgICAgICAgICAg
ICB0aGlzLmFkZEF0dHJpYnV0ZSggbmFtZSwgYXR0cmlidXRlLmNsb25lKCkgKTsKKworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAvLyBtb3JwaCBhdHRyaWJ1dGVzCisKKyAgICAgICAgICAg
IHZhciBtb3JwaEF0dHJpYnV0ZXMgPSBzb3VyY2UubW9ycGhBdHRyaWJ1dGVzOworCisgICAgICAg
ICAgICBmb3IgKCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHsKKworICAgICAgICAgICAgICAg
IHZhciBhcnJheSA9IFtdOworICAgICAgICAgICAgICAgIHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1v
cnBoQXR0cmlidXRlc1sgbmFtZSBdOyAvLyBtb3JwaEF0dHJpYnV0ZTogYXJyYXkgb2YgRmxvYXQz
MkJ1ZmZlckF0dHJpYnV0ZXMKKworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwLCBsID0gbW9y
cGhBdHRyaWJ1dGUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAg
ICBhcnJheS5wdXNoKCBtb3JwaEF0dHJpYnV0ZVsgaSBdLmNsb25lKCkgKTsKKworICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0g
PSBhcnJheTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBncm91cHMKKworICAg
ICAgICAgICAgdmFyIGdyb3VwcyA9IHNvdXJjZS5ncm91cHM7CisKKyAgICAgICAgICAgIGZvciAo
IGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAg
ICAgICB2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTsKKyAgICAgICAgICAgICAgICB0aGlzLmFkZEdy
b3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBib3VuZGluZyBib3gKKworICAgICAgICAg
ICAgdmFyIGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94OworCisgICAgICAgICAgICBp
ZiAoIGJvdW5kaW5nQm94ICE9PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5ib3Vu
ZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgLy8gYm91bmRpbmcgc3BoZXJlCisKKyAgICAgICAgICAgIHZhciBib3VuZGluZ1NwaGVy
ZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTsKKworICAgICAgICAgICAgaWYgKCBib3VuZGluZ1Nw
aGVyZSAhPT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUg
PSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IC8vIGRyYXcgcmFuZ2UKKworICAgICAgICAgICAgdGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzb3Vy
Y2UuZHJhd1JhbmdlLnN0YXJ0OworICAgICAgICAgICAgdGhpcy5kcmF3UmFuZ2UuY291bnQgPSBz
b3VyY2UuZHJhd1JhbmdlLmNvdW50OworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAg
ICAgICB9LAorCisgICAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAg
dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7CisKKyAgICAgICAgfQor
CisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJk
b29iLmNvbS8KKyAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVn
ZW44NworICAgICAqLworCisgICAgLy8gQm94R2VvbWV0cnkKKworICAgIGZ1bmN0aW9uIEJveEdl
b21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVu
dHMsIGRlcHRoU2VnbWVudHMgKSB7CisKKyAgICAgICAgR2VvbWV0cnkuY2FsbCggdGhpcyApOwor
CisgICAgICAgIHRoaXMudHlwZSA9ICdCb3hHZW9tZXRyeSc7CisKKyAgICAgICAgdGhpcy5wYXJh
bWV0ZXJzID0geworICAgICAgICAgICAgd2lkdGg6IHdpZHRoLAorICAgICAgICAgICAgaGVpZ2h0
OiBoZWlnaHQsCisgICAgICAgICAgICBkZXB0aDogZGVwdGgsCisgICAgICAgICAgICB3aWR0aFNl
Z21lbnRzOiB3aWR0aFNlZ21lbnRzLAorICAgICAgICAgICAgaGVpZ2h0U2VnbWVudHM6IGhlaWdo
dFNlZ21lbnRzLAorICAgICAgICAgICAgZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50cworICAg
ICAgICB9OworCisgICAgICAgIHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQm94QnVmZmVy
R2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdt
ZW50cywgZGVwdGhTZWdtZW50cyApICk7CisgICAgICAgIHRoaXMubWVyZ2VWZXJ0aWNlcygpOwor
CisgICAgfQorCisgICAgQm94R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2Vv
bWV0cnkucHJvdG90eXBlICk7CisgICAgQm94R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9y
ID0gQm94R2VvbWV0cnk7CisKKyAgICAvLyBCb3hCdWZmZXJHZW9tZXRyeQorCisgICAgZnVuY3Rp
b24gQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRz
LCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHsKKworICAgICAgICBCdWZmZXJHZW9t
ZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhpcy50eXBlID0gJ0JveEJ1ZmZlckdlb21l
dHJ5JzsKKworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CisgICAgICAgICAgICB3aWR0aDog
d2lkdGgsCisgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCwKKyAgICAgICAgICAgIGRlcHRoOiBk
ZXB0aCwKKyAgICAgICAgICAgIHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsCisgICAgICAg
ICAgICBoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCisgICAgICAgICAgICBkZXB0aFNl
Z21lbnRzOiBkZXB0aFNlZ21lbnRzCisgICAgICAgIH07CisKKyAgICAgICAgdmFyIHNjb3BlID0g
dGhpczsKKworICAgICAgICAvLyBzZWdtZW50cworCisgICAgICAgIHdpZHRoU2VnbWVudHMgPSBN
YXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgMTsKKyAgICAgICAgaGVpZ2h0U2VnbWVudHMg
PSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7CisgICAgICAgIGRlcHRoU2VnbWVu
dHMgPSBNYXRoLmZsb29yKCBkZXB0aFNlZ21lbnRzICkgfHwgMTsKKworICAgICAgICAvLyBidWZm
ZXJzCisKKyAgICAgICAgdmFyIGluZGljZXMgPSBbXTsKKyAgICAgICAgdmFyIHZlcnRpY2VzID0g
W107CisgICAgICAgIHZhciBub3JtYWxzID0gW107CisgICAgICAgIHZhciB1dnMgPSBbXTsKKwor
ICAgICAgICAvLyBoZWxwZXIgdmFyaWFibGVzCisKKyAgICAgICAgdmFyIG51bWJlck9mVmVydGlj
ZXMgPSAwOworICAgICAgICB2YXIgZ3JvdXBTdGFydCA9IDA7CisKKyAgICAgICAgLy8gYnVpbGQg
ZWFjaCBzaWRlIG9mIHRoZSBib3ggZ2VvbWV0cnkKKworICAgICAgICBidWlsZFBsYW5lKCAneics
ICd5JywgJ3gnLCAtIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgICB3aWR0aCwgIGRlcHRoU2VnbWVu
dHMsIGhlaWdodFNlZ21lbnRzLCAwICk7IC8vIHB4CisgICAgICAgIGJ1aWxkUGxhbmUoICd6Jywg
J3knLCAneCcsICAgMSwgLSAxLCBkZXB0aCwgaGVpZ2h0LCAtIHdpZHRoLCAgZGVwdGhTZWdtZW50
cywgaGVpZ2h0U2VnbWVudHMsIDEgKTsgLy8gbngKKyAgICAgICAgYnVpbGRQbGFuZSggJ3gnLCAn
eicsICd5JywgICAxLCAgIDEsIHdpZHRoLCBkZXB0aCwgICAgaGVpZ2h0LCB3aWR0aFNlZ21lbnRz
LCBkZXB0aFNlZ21lbnRzLCAgMiApOyAvLyBweQorICAgICAgICBidWlsZFBsYW5lKCAneCcsICd6
JywgJ3knLCAgIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAgLSBoZWlnaHQsIHdpZHRoU2VnbWVudHMs
IGRlcHRoU2VnbWVudHMsICAzICk7IC8vIG55CisgICAgICAgIGJ1aWxkUGxhbmUoICd4JywgJ3kn
LCAneicsICAgMSwgLSAxLCB3aWR0aCwgaGVpZ2h0LCAgIGRlcHRoLCAgd2lkdGhTZWdtZW50cywg
aGVpZ2h0U2VnbWVudHMsIDQgKTsgLy8gcHoKKyAgICAgICAgYnVpbGRQbGFuZSggJ3gnLCAneScs
ICd6JywgLSAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIC0gZGVwdGgsICB3aWR0aFNlZ21lbnRzLCBo
ZWlnaHRTZWdtZW50cywgNSApOyAvLyBuegorCisgICAgICAgIC8vIGJ1aWxkIGdlb21ldHJ5CisK
KyAgICAgICAgdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOworICAgICAgICB0aGlzLmFkZEF0dHJp
YnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAz
ICkgKTsKKyAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1
ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CisgICAgICAgIHRoaXMuYWRkQXR0cmlidXRl
KCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKKworICAgICAg
ICBmdW5jdGlvbiBidWlsZFBsYW5lKCB1LCB2LCB3LCB1ZGlyLCB2ZGlyLCB3aWR0aCwgaGVpZ2h0
LCBkZXB0aCwgZ3JpZFgsIGdyaWRZLCBtYXRlcmlhbEluZGV4ICkgeworCisgICAgICAgICAgICB2
YXIgc2VnbWVudFdpZHRoID0gd2lkdGggLyBncmlkWDsKKyAgICAgICAgICAgIHZhciBzZWdtZW50
SGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7CisKKyAgICAgICAgICAgIHZhciB3aWR0aEhhbGYgPSB3
aWR0aCAvIDI7CisgICAgICAgICAgICB2YXIgaGVpZ2h0SGFsZiA9IGhlaWdodCAvIDI7CisgICAg
ICAgICAgICB2YXIgZGVwdGhIYWxmID0gZGVwdGggLyAyOworCisgICAgICAgICAgICB2YXIgZ3Jp
ZFgxID0gZ3JpZFggKyAxOworICAgICAgICAgICAgdmFyIGdyaWRZMSA9IGdyaWRZICsgMTsKKwor
ICAgICAgICAgICAgdmFyIHZlcnRleENvdW50ZXIgPSAwOworICAgICAgICAgICAgdmFyIGdyb3Vw
Q291bnQgPSAwOworCisgICAgICAgICAgICB2YXIgaXgsIGl5OworCisgICAgICAgICAgICB2YXIg
dmVjdG9yID0gbmV3IFZlY3RvcjMoKTsKKworICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdmVydGlj
ZXMsIG5vcm1hbHMgYW5kIHV2cworCisgICAgICAgICAgICBmb3IgKCBpeSA9IDA7IGl5IDwgZ3Jp
ZFkxOyBpeSArKyApIHsKKworICAgICAgICAgICAgICAgIHZhciB5ID0gaXkgKiBzZWdtZW50SGVp
Z2h0IC0gaGVpZ2h0SGFsZjsKKworICAgICAgICAgICAgICAgIGZvciAoIGl4ID0gMDsgaXggPCBn
cmlkWDE7IGl4ICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gaXggKiBzZWdt
ZW50V2lkdGggLSB3aWR0aEhhbGY7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHZhbHVl
cyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnQKKworICAgICAgICAgICAgICAgICAgICB2ZWN0
b3JbIHUgXSA9IHggKiB1ZGlyOworICAgICAgICAgICAgICAgICAgICB2ZWN0b3JbIHYgXSA9IHkg
KiB2ZGlyOworICAgICAgICAgICAgICAgICAgICB2ZWN0b3JbIHcgXSA9IGRlcHRoSGFsZjsKKwor
ICAgICAgICAgICAgICAgICAgICAvLyBub3cgYXBwbHkgdmVjdG9yIHRvIHZlcnRleCBidWZmZXIK
KworICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnks
IHZlY3Rvci56ICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHZhbHVlcyB0byBjb3Jy
ZWN0IHZlY3RvciBjb21wb25lbnQKKworICAgICAgICAgICAgICAgICAgICB2ZWN0b3JbIHUgXSA9
IDA7CisgICAgICAgICAgICAgICAgICAgIHZlY3RvclsgdiBdID0gMDsKKyAgICAgICAgICAgICAg
ICAgICAgdmVjdG9yWyB3IF0gPSBkZXB0aCA+IDAgPyAxIDogLSAxOworCisgICAgICAgICAgICAg
ICAgICAgIC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gbm9ybWFsIGJ1ZmZlcgorCisgICAgICAgICAg
ICAgICAgICAgIG5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApOwor
CisgICAgICAgICAgICAgICAgICAgIC8vIHV2cworCisgICAgICAgICAgICAgICAgICAgIHV2cy5w
dXNoKCBpeCAvIGdyaWRYICk7CisgICAgICAgICAgICAgICAgICAgIHV2cy5wdXNoKCAxIC0gKCBp
eSAvIGdyaWRZICkgKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBjb3VudGVycworCisgICAg
ICAgICAgICAgICAgICAgIHZlcnRleENvdW50ZXIgKz0gMTsKKworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpbmRpY2VzCisKKyAgICAgICAgICAg
IC8vIDEuIHlvdSBuZWVkIHRocmVlIGluZGljZXMgdG8gZHJhdyBhIHNpbmdsZSBmYWNlCisgICAg
ICAgICAgICAvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlcworICAg
ICAgICAgICAgLy8gMy4gc28gd2UgbmVlZCB0byBnZW5lcmF0ZSBzaXggKDIqMykgaW5kaWNlcyBw
ZXIgc2VnbWVudAorCisgICAgICAgICAgICBmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsr
ICkgeworCisgICAgICAgICAgICAgICAgZm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyAp
IHsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG51bWJlck9mVmVydGljZXMgKyBpeCAr
IGdyaWRYMSAqIGl5OworICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG51bWJlck9mVmVydGlj
ZXMgKyBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7CisgICAgICAgICAgICAgICAgICAgIHZhciBj
ID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApOwor
ICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSAp
ICsgZ3JpZFgxICogaXk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFjZXMKKworICAgICAg
ICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKKyAgICAgICAgICAgICAgICAg
ICAgaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5j
cmVhc2UgY291bnRlcgorCisgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnQgKz0gNjsKKwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhZGQg
YSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwg
c3VwcG9ydAorCisgICAgICAgICAgICBzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBD
b3VudCwgbWF0ZXJpYWxJbmRleCApOworCisgICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmV3IHN0
YXJ0IHZhbHVlIGZvciBncm91cHMKKworICAgICAgICAgICAgZ3JvdXBTdGFydCArPSBncm91cENv
dW50OworCisgICAgICAgICAgICAvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzCisK
KyAgICAgICAgICAgIG51bWJlck9mVmVydGljZXMgKz0gdmVydGV4Q291bnRlcjsKKworICAgICAg
ICB9CisKKyAgICB9CisKKyAgICBCb3hCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3Qu
Y3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKyAgICBCb3hCdWZmZXJHZW9tZXRy
eS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hCdWZmZXJHZW9tZXRyeTsKKworICAgIC8qKgor
ICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1dGhv
ciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKyAgICAgKi8KKworICAgIC8v
IFBsYW5lR2VvbWV0cnkKKworICAgIGZ1bmN0aW9uIFBsYW5lR2VvbWV0cnkoIHdpZHRoLCBoZWln
aHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkgeworCisgICAgICAgIEdlb21ldHJ5
LmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnUGxhbmVHZW9tZXRyeSc7CisK
KyAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0geworICAgICAgICAgICAgd2lkdGg6IHdpZHRoLAor
ICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsCisgICAgICAgICAgICB3aWR0aFNlZ21lbnRzOiB3
aWR0aFNlZ21lbnRzLAorICAgICAgICAgICAgaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRz
CisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBQbGFu
ZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdt
ZW50cyApICk7CisgICAgICAgIHRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisgICAgfQorCisgICAg
UGxhbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5
cGUgKTsKKyAgICBQbGFuZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBsYW5lR2Vv
bWV0cnk7CisKKyAgICAvLyBQbGFuZUJ1ZmZlckdlb21ldHJ5CisKKyAgICBmdW5jdGlvbiBQbGFu
ZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdt
ZW50cyApIHsKKworICAgICAgICBCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAg
ICAgdGhpcy50eXBlID0gJ1BsYW5lQnVmZmVyR2VvbWV0cnknOworCisgICAgICAgIHRoaXMucGFy
YW1ldGVycyA9IHsKKyAgICAgICAgICAgIHdpZHRoOiB3aWR0aCwKKyAgICAgICAgICAgIGhlaWdo
dDogaGVpZ2h0LAorICAgICAgICAgICAgd2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cywKKyAg
ICAgICAgICAgIGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cworICAgICAgICB9OworCisg
ICAgICAgIHZhciB3aWR0aF9oYWxmID0gd2lkdGggLyAyOworICAgICAgICB2YXIgaGVpZ2h0X2hh
bGYgPSBoZWlnaHQgLyAyOworCisgICAgICAgIHZhciBncmlkWCA9IE1hdGguZmxvb3IoIHdpZHRo
U2VnbWVudHMgKSB8fCAxOworICAgICAgICB2YXIgZ3JpZFkgPSBNYXRoLmZsb29yKCBoZWlnaHRT
ZWdtZW50cyApIHx8IDE7CisKKyAgICAgICAgdmFyIGdyaWRYMSA9IGdyaWRYICsgMTsKKyAgICAg
ICAgdmFyIGdyaWRZMSA9IGdyaWRZICsgMTsKKworICAgICAgICB2YXIgc2VnbWVudF93aWR0aCA9
IHdpZHRoIC8gZ3JpZFg7CisgICAgICAgIHZhciBzZWdtZW50X2hlaWdodCA9IGhlaWdodCAvIGdy
aWRZOworCisgICAgICAgIHZhciBpeCwgaXk7CisKKyAgICAgICAgLy8gYnVmZmVycworCisgICAg
ICAgIHZhciBpbmRpY2VzID0gW107CisgICAgICAgIHZhciB2ZXJ0aWNlcyA9IFtdOworICAgICAg
ICB2YXIgbm9ybWFscyA9IFtdOworICAgICAgICB2YXIgdXZzID0gW107CisKKyAgICAgICAgLy8g
Z2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2cworCisgICAgICAgIGZvciAoIGl5ID0g
MDsgaXkgPCBncmlkWTE7IGl5ICsrICkgeworCisgICAgICAgICAgICB2YXIgeSA9IGl5ICogc2Vn
bWVudF9oZWlnaHQgLSBoZWlnaHRfaGFsZjsKKworICAgICAgICAgICAgZm9yICggaXggPSAwOyBp
eCA8IGdyaWRYMTsgaXggKysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgeCA9IGl4ICogc2Vn
bWVudF93aWR0aCAtIHdpZHRoX2hhbGY7CisKKyAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNo
KCB4LCAtIHksIDAgKTsKKworICAgICAgICAgICAgICAgIG5vcm1hbHMucHVzaCggMCwgMCwgMSAp
OworCisgICAgICAgICAgICAgICAgdXZzLnB1c2goIGl4IC8gZ3JpZFggKTsKKyAgICAgICAgICAg
ICAgICB1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gaW5kaWNlcworCisgICAgICAgIGZvciAoIGl5ID0gMDsg
aXkgPCBncmlkWTsgaXkgKysgKSB7CisKKyAgICAgICAgICAgIGZvciAoIGl4ID0gMDsgaXggPCBn
cmlkWDsgaXggKysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgYSA9IGl4ICsgZ3JpZFgxICog
aXk7CisgICAgICAgICAgICAgICAgdmFyIGIgPSBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7Cisg
ICAgICAgICAgICAgICAgdmFyIGMgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTsK
KyAgICAgICAgICAgICAgICB2YXIgZCA9ICggaXggKyAxICkgKyBncmlkWDEgKiBpeTsKKworICAg
ICAgICAgICAgICAgIC8vIGZhY2VzCisKKyAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goIGEs
IGIsIGQgKTsKKyAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCBnZW9tZXRyeQorCisg
ICAgICAgIHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKKyAgICAgICAgdGhpcy5hZGRBdHRyaWJ1
dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyAp
ICk7CisgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZm
ZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOworICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZSgg
J3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CisKKyAgICB9CisK
KyAgICBQbGFuZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZl
ckdlb21ldHJ5LnByb3RvdHlwZSApOworICAgIFBsYW5lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBl
LmNvbnN0cnVjdG9yID0gUGxhbmVCdWZmZXJHZW9tZXRyeTsKKworICAgIC8qKgorICAgICAqIEBh
dXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1dGhvciBhbHRlcmVk
cSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKgorICAgICAqIHBhcmFtZXRlcnMg
PSB7CisgICAgICogIGNvbG9yOiA8aGV4PiwKKyAgICAgKiAgb3BhY2l0eTogPGZsb2F0PiwKKyAg
ICAgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorICAgICAqCisgICAgICog
IGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorICAgICAqICBsaWdodE1h
cEludGVuc2l0eTogPGZsb2F0PgorICAgICAqCisgICAgICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4
dHVyZSggPEltYWdlPiApLAorICAgICAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PgorICAgICAq
CisgICAgICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorICAg
ICAqCisgICAgICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorICAg
ICAqCisgICAgICogIGVudk1hcDogbmV3IFRIUkVFLlRleHR1cmVDdWJlKCBbcG9zeCwgbmVneCwg
cG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSwKKyAgICAgKiAgY29tYmluZTogVEhSRUUuTXVsdGlw
bHksCisgICAgICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PiwKKyAgICAgKiAgcmVmcmFjdGlvblJh
dGlvOiA8ZmxvYXQ+LAorICAgICAqCisgICAgICogIHNoYWRpbmc6IFRIUkVFLlNtb290aFNoYWRp
bmcsCisgICAgICogIGRlcHRoVGVzdDogPGJvb2w+LAorICAgICAqICBkZXB0aFdyaXRlOiA8Ym9v
bD4sCisgICAgICoKKyAgICAgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCisgICAgICogIHdpcmVm
cmFtZUxpbmV3aWR0aDogPGZsb2F0PiwKKyAgICAgKgorICAgICAqICBza2lubmluZzogPGJvb2w+
LAorICAgICAqICBtb3JwaFRhcmdldHM6IDxib29sPgorICAgICAqIH0KKyAgICAgKi8KKworICAg
IGZ1bmN0aW9uIE1lc2hCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisgICAgICAgIE1h
dGVyaWFsLmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnTWVzaEJhc2ljTWF0
ZXJpYWwnOworCisgICAgICAgIHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8v
IGVtaXNzaXZlCisKKyAgICAgICAgdGhpcy5tYXAgPSBudWxsOworCisgICAgICAgIHRoaXMubGln
aHRNYXAgPSBudWxsOworICAgICAgICB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wOworCisg
ICAgICAgIHRoaXMuYW9NYXAgPSBudWxsOworICAgICAgICB0aGlzLmFvTWFwSW50ZW5zaXR5ID0g
MS4wOworCisgICAgICAgIHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsOworCisgICAgICAgIHRoaXMu
YWxwaGFNYXAgPSBudWxsOworCisgICAgICAgIHRoaXMuZW52TWFwID0gbnVsbDsKKyAgICAgICAg
dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247CisgICAgICAgIHRoaXMucmVmbGVjdGl2
aXR5ID0gMTsKKyAgICAgICAgdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4OworCisgICAgICAg
IHRoaXMud2lyZWZyYW1lID0gZmFsc2U7CisgICAgICAgIHRoaXMud2lyZWZyYW1lTGluZXdpZHRo
ID0gMTsKKyAgICAgICAgdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJzsKKyAgICAgICAg
dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CisKKyAgICAgICAgdGhpcy5za2lubmlu
ZyA9IGZhbHNlOworICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOworCisgICAgICAg
IHRoaXMubGlnaHRzID0gZmFsc2U7CisKKyAgICAgICAgdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRl
cnMgKTsKKworICAgIH0KKworICAgIE1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVj
dC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOworICAgIE1lc2hCYXNpY01hdGVyaWFsLnBy
b3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hCYXNpY01hdGVyaWFsOworCisgICAgTWVzaEJhc2lj
TWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaEJhc2ljTWF0ZXJpYWwgPSB0cnVlOworCisgICAgTWVz
aEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKwor
ICAgICAgICBNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKwor
ICAgICAgICB0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworCisgICAgICAgIHRoaXMu
bWFwID0gc291cmNlLm1hcDsKKworICAgICAgICB0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0
TWFwOworICAgICAgICB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50
ZW5zaXR5OworCisgICAgICAgIHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7CisgICAgICAgIHRo
aXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7CisKKyAgICAgICAgdGhp
cy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKKworICAgICAgICB0aGlzLmFscGhh
TWFwID0gc291cmNlLmFscGhhTWFwOworCisgICAgICAgIHRoaXMuZW52TWFwID0gc291cmNlLmVu
dk1hcDsKKyAgICAgICAgdGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7CisgICAgICAgIHRo
aXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTsKKyAgICAgICAgdGhpcy5yZWZy
YWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvOworCisgICAgICAgIHRoaXMud2ly
ZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKKyAgICAgICAgdGhpcy53aXJlZnJhbWVMaW5ld2lk
dGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoOworICAgICAgICB0aGlzLndpcmVmcmFtZUxp
bmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDsKKyAgICAgICAgdGhpcy53aXJlZnJhbWVM
aW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKKworICAgICAgICB0aGlzLnNraW5u
aW5nID0gc291cmNlLnNraW5uaW5nOworICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJj
ZS5tb3JwaFRhcmdldHM7CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICB9OworCisgICAg
LyoqCisgICAgICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworICAgICAqLwor
CisgICAgZnVuY3Rpb24gUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApIHsKKworICAgICAgICB0aGlz
Lm9yaWdpbiA9ICggb3JpZ2luICE9PSB1bmRlZmluZWQgKSA/IG9yaWdpbiA6IG5ldyBWZWN0b3Iz
KCk7CisgICAgICAgIHRoaXMuZGlyZWN0aW9uID0gKCBkaXJlY3Rpb24gIT09IHVuZGVmaW5lZCAp
ID8gZGlyZWN0aW9uIDogbmV3IFZlY3RvcjMoKTsKKworICAgIH0KKworICAgIE9iamVjdC5hc3Np
Z24oIFJheS5wcm90b3R5cGUsIHsKKworICAgICAgICBzZXQ6IGZ1bmN0aW9uICggb3JpZ2luLCBk
aXJlY3Rpb24gKSB7CisKKyAgICAgICAgICAgIHRoaXMub3JpZ2luLmNvcHkoIG9yaWdpbiApOwor
ICAgICAgICAgICAgdGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7CisKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgY2xvbmU6IGZ1bmN0aW9u
ICgpIHsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSgg
dGhpcyApOworCisgICAgICAgIH0sCisKKyAgICAgICAgY29weTogZnVuY3Rpb24gKCByYXkgKSB7
CisKKyAgICAgICAgICAgIHRoaXMub3JpZ2luLmNvcHkoIHJheS5vcmlnaW4gKTsKKyAgICAgICAg
ICAgIHRoaXMuZGlyZWN0aW9uLmNvcHkoIHJheS5kaXJlY3Rpb24gKTsKKworICAgICAgICAgICAg
cmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBhdDogZnVuY3Rpb24gKCB0LCBv
cHRpb25hbFRhcmdldCApIHsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFy
Z2V0IHx8IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuY29weSgg
dGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5vcmlnaW4gKTsK
KworICAgICAgICB9LAorCisgICAgICAgIGxvb2tBdDogZnVuY3Rpb24gKCB2ICkgeworCisgICAg
ICAgICAgICB0aGlzLmRpcmVjdGlvbi5jb3B5KCB2ICkuc3ViKCB0aGlzLm9yaWdpbiApLm5vcm1h
bGl6ZSgpOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAg
ICAgIHJlY2FzdDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdjEgPSBuZXcgVmVj
dG9yMygpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcmVjYXN0KCB0ICkgeworCisg
ICAgICAgICAgICAgICAgdGhpcy5vcmlnaW4uY29weSggdGhpcy5hdCggdCwgdjEgKSApOworCisg
ICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAg
fSgpLAorCisgICAgICAgIGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9w
dGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJn
ZXQgfHwgbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdWJWZWN0b3JzKCBwb2lu
dCwgdGhpcy5vcmlnaW4gKTsKKyAgICAgICAgICAgIHZhciBkaXJlY3Rpb25EaXN0YW5jZSA9IHJl
c3VsdC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7CisKKyAgICAgICAgICAgIGlmICggZGlyZWN0aW9u
RGlzdGFuY2UgPCAwICkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jb3B5KCB0
aGlzLm9yaWdpbiApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1
bHQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFu
Y2UgKS5hZGQoIHRoaXMub3JpZ2luICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBkaXN0YW5j
ZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CisKKyAgICAgICAgICAgIHJldHVybiBNYXRo
LnNxcnQoIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkgKTsKKworICAgICAgICB9LAor
CisgICAgICAgIGRpc3RhbmNlU3FUb1BvaW50OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAg
IHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBk
aXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgZGlyZWN0
aW9uRGlzdGFuY2UgPSB2MS5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5vcmlnaW4gKS5kb3QoIHRo
aXMuZGlyZWN0aW9uICk7CisKKyAgICAgICAgICAgICAgICAvLyBwb2ludCBiZWhpbmQgdGhlIHJh
eQorCisgICAgICAgICAgICAgICAgaWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKCBw
b2ludCApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdjEuY29weSgg
dGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQo
IHRoaXMub3JpZ2luICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdjEuZGlzdGFuY2VUb1Nx
dWFyZWQoIHBvaW50ICk7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAg
ICAgIGRpc3RhbmNlU3FUb1NlZ21lbnQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFy
IHNlZ0NlbnRlciA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICB2YXIgc2VnRGlyID0gbmV3
IFZlY3RvcjMoKTsKKyAgICAgICAgICAgIHZhciBkaWZmID0gbmV3IFZlY3RvcjMoKTsKKworICAg
ICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlU3FUb1NlZ21lbnQoIHYwLCB2MSwgb3B0
aW9uYWxQb2ludE9uUmF5LCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkgeworCisgICAgICAgICAg
ICAgICAgLy8gZnJvbSBodHRwOi8vd3d3Lmdlb21ldHJpY3Rvb2xzLmNvbS9HVEVuZ2luZS9JbmNs
dWRlL01hdGhlbWF0aWNzL0d0ZURpc3RSYXlTZWdtZW50LmgKKyAgICAgICAgICAgICAgICAvLyBJ
dCByZXR1cm5zIHRoZSBtaW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgcmF5IGFuZCB0aGUgc2VnbWVu
dAorICAgICAgICAgICAgICAgIC8vIGRlZmluZWQgYnkgdjAgYW5kIHYxCisgICAgICAgICAgICAg
ICAgLy8gSXQgY2FuIGFsc28gc2V0IHR3byBvcHRpb25hbCB0YXJnZXRzIDoKKyAgICAgICAgICAg
ICAgICAvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSByYXkKKyAgICAgICAgICAgICAgICAv
LyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBzZWdtZW50CisKKyAgICAgICAgICAgICAgICBz
ZWdDZW50ZXIuY29weSggdjAgKS5hZGQoIHYxICkubXVsdGlwbHlTY2FsYXIoIDAuNSApOworICAg
ICAgICAgICAgICAgIHNlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTsKKyAg
ICAgICAgICAgICAgICBkaWZmLmNvcHkoIHRoaXMub3JpZ2luICkuc3ViKCBzZWdDZW50ZXIgKTsK
KworICAgICAgICAgICAgICAgIHZhciBzZWdFeHRlbnQgPSB2MC5kaXN0YW5jZVRvKCB2MSApICog
MC41OworICAgICAgICAgICAgICAgIHZhciBhMDEgPSAtIHRoaXMuZGlyZWN0aW9uLmRvdCggc2Vn
RGlyICk7CisgICAgICAgICAgICAgICAgdmFyIGIwID0gZGlmZi5kb3QoIHRoaXMuZGlyZWN0aW9u
ICk7CisgICAgICAgICAgICAgICAgdmFyIGIxID0gLSBkaWZmLmRvdCggc2VnRGlyICk7CisgICAg
ICAgICAgICAgICAgdmFyIGMgPSBkaWZmLmxlbmd0aFNxKCk7CisgICAgICAgICAgICAgICAgdmFy
IGRldCA9IE1hdGguYWJzKCAxIC0gYTAxICogYTAxICk7CisgICAgICAgICAgICAgICAgdmFyIHMw
LCBzMSwgc3FyRGlzdCwgZXh0RGV0OworCisgICAgICAgICAgICAgICAgaWYgKCBkZXQgPiAwICkg
eworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByYXkgYW5kIHNlZ21lbnQgYXJlIG5vdCBw
YXJhbGxlbC4KKworICAgICAgICAgICAgICAgICAgICBzMCA9IGEwMSAqIGIxIC0gYjA7CisgICAg
ICAgICAgICAgICAgICAgIHMxID0gYTAxICogYjAgLSBiMTsKKyAgICAgICAgICAgICAgICAgICAg
ZXh0RGV0ID0gc2VnRXh0ZW50ICogZGV0OworCisgICAgICAgICAgICAgICAgICAgIGlmICggczAg
Pj0gMCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzMSA+PSAtIGV4dERldCAp
IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggczEgPD0gZXh0RGV0ICkgewor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lvbiAwCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIE1pbmltdW0gYXQgaW50ZXJpb3IgcG9pbnRzIG9mIHJh
eSBhbmQgc2VnbWVudC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW52
RGV0ID0gMSAvIGRldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczAgKj0gaW52
RGV0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMSAqPSBpbnZEZXQ7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxckRpc3QgPSBzMCAqICggczAgKyBhMDEgKiBz
MSArIDIgKiBiMCApICsgczEgKiAoIGEwMSAqIHMwICsgczEgKyAyICogYjEgKSArIGM7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIHJlZ2lvbiAxCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgczEgPSBzZWdFeHRlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMwID0g
TWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsg
YzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lvbiA1
CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMSA9IC0gc2VnRXh0ZW50OworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIw
ICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcXJEaXN0ID0gLSBzMCAqIHMwICsg
czEgKiAoIHMxICsgMiAqIGIxICkgKyBjOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCBzMSA8PSAtIGV4dERldCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IHJlZ2lvbiA0CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMCA9IE1hdGgubWF4KCAw
LCAtICggLSBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgczEgPSAoIHMwID4gMCApID8gLSBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgo
IC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHMxIDw9IGV4dERldCApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lvbiAzCisKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzMCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEgPSBN
YXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHNxckRpc3QgPSBzMSAqICggczEgKyAyICogYjEgKSAr
IGM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyByZWdpb24gMgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHNlZ0V4dGVudCArIGIwICkgKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzMSA9ICggczAgPiAwICkgPyBzZWdFeHRlbnQgOiBNYXRoLm1p
biggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICog
YjEgKSArIGM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAg
IC8vIFJheSBhbmQgc2VnbWVudCBhcmUgcGFyYWxsZWwuCisKKyAgICAgICAgICAgICAgICAgICAg
czEgPSAoIGEwMSA+IDAgKSA/IC0gc2VnRXh0ZW50IDogc2VnRXh0ZW50OworICAgICAgICAgICAg
ICAgICAgICBzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7CisgICAgICAg
ICAgICAgICAgICAgIHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSAr
IGM7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIG9wdGlvbmFs
UG9pbnRPblJheSApIHsKKworICAgICAgICAgICAgICAgICAgICBvcHRpb25hbFBvaW50T25SYXku
Y29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggczAgKS5hZGQoIHRoaXMub3Jp
Z2luICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIG9wdGlv
bmFsUG9pbnRPblNlZ21lbnQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxQb2lu
dE9uU2VnbWVudC5jb3B5KCBzZWdEaXIgKS5tdWx0aXBseVNjYWxhciggczEgKS5hZGQoIHNlZ0Nl
bnRlciApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHNx
ckRpc3Q7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIGludGVy
c2VjdFNwaGVyZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdjEgPSBuZXcgVmVj
dG9yMygpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0U3BoZXJlKCBz
cGhlcmUsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICAgICAgdjEuc3ViVmVjdG9y
cyggc3BoZXJlLmNlbnRlciwgdGhpcy5vcmlnaW4gKTsKKyAgICAgICAgICAgICAgICB2YXIgdGNh
ID0gdjEuZG90KCB0aGlzLmRpcmVjdGlvbiApOworICAgICAgICAgICAgICAgIHZhciBkMiA9IHYx
LmRvdCggdjEgKSAtIHRjYSAqIHRjYTsKKyAgICAgICAgICAgICAgICB2YXIgcmFkaXVzMiA9IHNw
aGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzOworCisgICAgICAgICAgICAgICAgaWYgKCBkMiA+
IHJhZGl1czIgKSByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIHZhciB0aGMgPSBNYXRo
LnNxcnQoIHJhZGl1czIgLSBkMiApOworCisgICAgICAgICAgICAgICAgLy8gdDAgPSBmaXJzdCBp
bnRlcnNlY3QgcG9pbnQgLSBlbnRyYW5jZSBvbiBmcm9udCBvZiBzcGhlcmUKKyAgICAgICAgICAg
ICAgICB2YXIgdDAgPSB0Y2EgLSB0aGM7CisKKyAgICAgICAgICAgICAgICAvLyB0MSA9IHNlY29u
ZCBpbnRlcnNlY3QgcG9pbnQgLSBleGl0IHBvaW50IG9uIGJhY2sgb2Ygc3BoZXJlCisgICAgICAg
ICAgICAgICAgdmFyIHQxID0gdGNhICsgdGhjOworCisgICAgICAgICAgICAgICAgLy8gdGVzdCB0
byBzZWUgaWYgYm90aCB0MCBhbmQgdDEgYXJlIGJlaGluZCB0aGUgcmF5IC0gaWYgc28sIHJldHVy
biBudWxsCisgICAgICAgICAgICAgICAgaWYgKCB0MCA8IDAgJiYgdDEgPCAwICkgcmV0dXJuIG51
bGw7CisKKyAgICAgICAgICAgICAgICAvLyB0ZXN0IHRvIHNlZSBpZiB0MCBpcyBiZWhpbmQgdGhl
IHJheToKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcywgdGhlIHJheSBpcyBpbnNpZGUgdGhl
IHNwaGVyZSwgc28gcmV0dXJuIHRoZSBzZWNvbmQgZXhpdCBwb2ludCBzY2FsZWQgYnkgdDEsCisg
ICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gYWx3YXlzIHJldHVybiBhbiBpbnRlcnNlY3Qg
cG9pbnQgdGhhdCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LgorICAgICAgICAgICAgICAgIGlmICgg
dDAgPCAwICkgcmV0dXJuIHRoaXMuYXQoIHQxLCBvcHRpb25hbFRhcmdldCApOworCisgICAgICAg
ICAgICAgICAgLy8gZWxzZSB0MCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LCBzbyByZXR1cm4gdGhl
IGZpcnN0IGNvbGxpc2lvbiBwb2ludCBzY2FsZWQgYnkgdDAKKyAgICAgICAgICAgICAgICByZXR1
cm4gdGhpcy5hdCggdDAsIG9wdGlvbmFsVGFyZ2V0ICk7CisKKyAgICAgICAgICAgIH07CisKKyAg
ICAgICAgfSgpLAorCisgICAgICAgIGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJl
ICkgeworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5j
ZW50ZXIgKSA8PSBzcGhlcmUucmFkaXVzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZGlzdGFu
Y2VUb1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkgeworCisgICAgICAgICAgICB2YXIgZGVub21p
bmF0b3IgPSBwbGFuZS5ub3JtYWwuZG90KCB0aGlzLmRpcmVjdGlvbiApOworCisgICAgICAgICAg
ICBpZiAoIGRlbm9taW5hdG9yID09PSAwICkgeworCisgICAgICAgICAgICAgICAgLy8gbGluZSBp
cyBjb3BsYW5hciwgcmV0dXJuIG9yaWdpbgorICAgICAgICAgICAgICAgIGlmICggcGxhbmUuZGlz
dGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApID09PSAwICkgeworCisgICAgICAgICAgICAgICAg
ICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8g
TnVsbCBpcyBwcmVmZXJhYmxlIHRvIHVuZGVmaW5lZCBzaW5jZSB1bmRlZmluZWQgbWVhbnMuLi4u
IGl0IGlzIHVuZGVmaW5lZAorCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHQgPSAtICggdGhpcy5vcmlnaW4uZG90KCBwbGFu
ZS5ub3JtYWwgKSArIHBsYW5lLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjsKKworICAgICAgICAg
ICAgLy8gUmV0dXJuIGlmIHRoZSByYXkgbmV2ZXIgaW50ZXJzZWN0cyB0aGUgcGxhbmUKKworICAg
ICAgICAgICAgcmV0dXJuIHQgPj0gMCA/IHQgOiAgbnVsbDsKKworICAgICAgICB9LAorCisgICAg
ICAgIGludGVyc2VjdFBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lLCBvcHRpb25hbFRhcmdldCApIHsK
KworICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmRpc3RhbmNlVG9QbGFuZSggcGxhbmUgKTsKKwor
ICAgICAgICAgICAgaWYgKCB0ID09PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgcmV0dXJu
IG51bGw7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXQoIHQs
IG9wdGlvbmFsVGFyZ2V0ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBpbnRlcnNlY3RzUGxh
bmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBy
YXkgbGllcyBvbiB0aGUgcGxhbmUgZmlyc3QKKworICAgICAgICAgICAgdmFyIGRpc3RUb1BvaW50
ID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApOworCisgICAgICAgICAgICBp
ZiAoIGRpc3RUb1BvaW50ID09PSAwICkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGRlbm9taW5hdG9yID0gcGxhbmUu
bm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTsKKworICAgICAgICAgICAgaWYgKCBkZW5vbWlu
YXRvciAqIGRpc3RUb1BvaW50IDwgMCApIHsKKworICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJheSBvcmlnaW4gaXMgYmVoaW5k
IHRoZSBwbGFuZSAoYW5kIGlzIHBvaW50aW5nIGJlaGluZCBpdCkKKworICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgIH0sCisKKyAgICAgICAgaW50ZXJzZWN0Qm94OiBmdW5jdGlv
biAoIGJveCwgb3B0aW9uYWxUYXJnZXQgKSB7CisKKyAgICAgICAgICAgIHZhciB0bWluLCB0bWF4
LCB0eW1pbiwgdHltYXgsIHR6bWluLCB0em1heDsKKworICAgICAgICAgICAgdmFyIGludmRpcngg
PSAxIC8gdGhpcy5kaXJlY3Rpb24ueCwKKyAgICAgICAgICAgICAgICBpbnZkaXJ5ID0gMSAvIHRo
aXMuZGlyZWN0aW9uLnksCisgICAgICAgICAgICAgICAgaW52ZGlyeiA9IDEgLyB0aGlzLmRpcmVj
dGlvbi56OworCisgICAgICAgICAgICB2YXIgb3JpZ2luID0gdGhpcy5vcmlnaW47CisKKyAgICAg
ICAgICAgIGlmICggaW52ZGlyeCA+PSAwICkgeworCisgICAgICAgICAgICAgICAgdG1pbiA9ICgg
Ym94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7CisgICAgICAgICAgICAgICAgdG1heCA9
ICggYm94Lm1heC54IC0gb3JpZ2luLnggKSAqIGludmRpcng7CisKKyAgICAgICAgICAgIH0gZWxz
ZSB7CisKKyAgICAgICAgICAgICAgICB0bWluID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICog
aW52ZGlyeDsKKyAgICAgICAgICAgICAgICB0bWF4ID0gKCBib3gubWluLnggLSBvcmlnaW4ueCAp
ICogaW52ZGlyeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGludmRpcnkg
Pj0gMCApIHsKKworICAgICAgICAgICAgICAgIHR5bWluID0gKCBib3gubWluLnkgLSBvcmlnaW4u
eSApICogaW52ZGlyeTsKKyAgICAgICAgICAgICAgICB0eW1heCA9ICggYm94Lm1heC55IC0gb3Jp
Z2luLnkgKSAqIGludmRpcnk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAg
ICAgICB0eW1pbiA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7CisgICAgICAg
ICAgICAgICAgdHltYXggPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5OworCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggKCB0bWluID4gdHltYXggKSB8fCAoIHR5
bWluID4gdG1heCApICkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIC8vIFRoZXNlIGxpbmVz
IGFsc28gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRtaW4gb3IgdG1heCBpcyBOYU4KKyAgICAgICAg
ICAgIC8vIChyZXN1bHQgb2YgMCAqIEluZmluaXR5KS4geCAhPT0geCByZXR1cm5zIHRydWUgaWYg
eCBpcyBOYU4KKworICAgICAgICAgICAgaWYgKCB0eW1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1p
biApIHRtaW4gPSB0eW1pbjsKKworICAgICAgICAgICAgaWYgKCB0eW1heCA8IHRtYXggfHwgdG1h
eCAhPT0gdG1heCApIHRtYXggPSB0eW1heDsKKworICAgICAgICAgICAgaWYgKCBpbnZkaXJ6ID49
IDAgKSB7CisKKyAgICAgICAgICAgICAgICB0em1pbiA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnog
KSAqIGludmRpcno7CisgICAgICAgICAgICAgICAgdHptYXggPSAoIGJveC5tYXgueiAtIG9yaWdp
bi56ICkgKiBpbnZkaXJ6OworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAg
ICAgdHptaW4gPSAoIGJveC5tYXgueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6OworICAgICAgICAg
ICAgICAgIHR6bWF4ID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICggdG1pbiA+IHR6bWF4ICkgfHwgKCB0em1p
biA+IHRtYXggKSApIHJldHVybiBudWxsOworCisgICAgICAgICAgICBpZiAoIHR6bWluID4gdG1p
biB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR6bWluOworCisgICAgICAgICAgICBpZiAoIHR6
bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4ICkgdG1heCA9IHR6bWF4OworCisgICAgICAgICAg
ICAvL3JldHVybiBwb2ludCBjbG9zZXN0IHRvIHRoZSByYXkgKHBvc2l0aXZlIHNpZGUpCisKKyAg
ICAgICAgICAgIGlmICggdG1heCA8IDAgKSByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0
dXJuIHRoaXMuYXQoIHRtaW4gPj0gMCA/IHRtaW4gOiB0bWF4LCBvcHRpb25hbFRhcmdldCApOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgaW50ZXJzZWN0c0JveDogKCBmdW5jdGlvbiAoKSB7CisK
KyAgICAgICAgICAgIHZhciB2ID0gbmV3IFZlY3RvcjMoKTsKKworICAgICAgICAgICAgcmV0dXJu
IGZ1bmN0aW9uIGludGVyc2VjdHNCb3goIGJveCApIHsKKworICAgICAgICAgICAgICAgIHJldHVy
biB0aGlzLmludGVyc2VjdEJveCggYm94LCB2ICkgIT09IG51bGw7CisKKyAgICAgICAgICAgIH07
CisKKyAgICAgICAgfSApKCksCisKKyAgICAgICAgaW50ZXJzZWN0VHJpYW5nbGU6IGZ1bmN0aW9u
ICgpIHsKKworICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgb2Zmc2V0IG9yaWdpbiwgZWRnZXMs
IGFuZCBub3JtYWwuCisgICAgICAgICAgICB2YXIgZGlmZiA9IG5ldyBWZWN0b3IzKCk7CisgICAg
ICAgICAgICB2YXIgZWRnZTEgPSBuZXcgVmVjdG9yMygpOworICAgICAgICAgICAgdmFyIGVkZ2Uy
ID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAgIHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygp
OworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0VHJpYW5nbGUoIGEsIGIs
IGMsIGJhY2tmYWNlQ3VsbGluZywgb3B0aW9uYWxUYXJnZXQgKSB7CisKKyAgICAgICAgICAgICAg
ICAvLyBmcm9tIGh0dHA6Ly93d3cuZ2VvbWV0cmljdG9vbHMuY29tL0dURW5naW5lL0luY2x1ZGUv
TWF0aGVtYXRpY3MvR3RlSW50clJheTNUcmlhbmdsZTMuaAorCisgICAgICAgICAgICAgICAgZWRn
ZTEuc3ViVmVjdG9ycyggYiwgYSApOworICAgICAgICAgICAgICAgIGVkZ2UyLnN1YlZlY3RvcnMo
IGMsIGEgKTsKKyAgICAgICAgICAgICAgICBub3JtYWwuY3Jvc3NWZWN0b3JzKCBlZGdlMSwgZWRn
ZTIgKTsKKworICAgICAgICAgICAgICAgIC8vIFNvbHZlIFEgKyB0KkQgPSBiMSpFMSArIGIyKkUy
IChRID0ga0RpZmYsIEQgPSByYXkgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgIC8vIEUxID0g
a0VkZ2UxLCBFMiA9IGtFZGdlMiwgTiA9IENyb3NzKEUxLEUyKSkgYnkKKyAgICAgICAgICAgICAg
ICAvLyAgIHxEb3QoRCxOKXwqYjEgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9zcyhRLEUyKSkK
KyAgICAgICAgICAgICAgICAvLyAgIHxEb3QoRCxOKXwqYjIgPSBzaWduKERvdChELE4pKSpEb3Qo
RCxDcm9zcyhFMSxRKSkKKyAgICAgICAgICAgICAgICAvLyAgIHxEb3QoRCxOKXwqdCA9IC1zaWdu
KERvdChELE4pKSpEb3QoUSxOKQorICAgICAgICAgICAgICAgIHZhciBEZE4gPSB0aGlzLmRpcmVj
dGlvbi5kb3QoIG5vcm1hbCApOworICAgICAgICAgICAgICAgIHZhciBzaWduOworCisgICAgICAg
ICAgICAgICAgaWYgKCBEZE4gPiAwICkgeworCisgICAgICAgICAgICAgICAgICAgIGlmICggYmFj
a2ZhY2VDdWxsaW5nICkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAx
OworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggRGROIDwgMCApIHsKKworICAgICAgICAg
ICAgICAgICAgICBzaWduID0gLSAxOworICAgICAgICAgICAgICAgICAgICBEZE4gPSAtIERkTjsK
KworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IG51bGw7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkaWZmLnN1YlZl
Y3RvcnMoIHRoaXMub3JpZ2luLCBhICk7CisgICAgICAgICAgICAgICAgdmFyIERkUXhFMiA9IHNp
Z24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIGVkZ2UyLmNyb3NzVmVjdG9ycyggZGlmZiwgZWRnZTIg
KSApOworCisgICAgICAgICAgICAgICAgLy8gYjEgPCAwLCBubyBpbnRlcnNlY3Rpb24KKyAgICAg
ICAgICAgICAgICBpZiAoIERkUXhFMiA8IDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgRGRF
MXhRID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdCggZWRnZTEuY3Jvc3MoIGRpZmYgKSApOwor
CisgICAgICAgICAgICAgICAgLy8gYjIgPCAwLCBubyBpbnRlcnNlY3Rpb24KKyAgICAgICAgICAg
ICAgICBpZiAoIERkRTF4USA8IDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51
bGw7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBiMStiMiA+IDEs
IG5vIGludGVyc2VjdGlvbgorICAgICAgICAgICAgICAgIGlmICggRGRReEUyICsgRGRFMXhRID4g
RGROICkgeworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gTGluZSBpbnRlcnNlY3RzIHRyaWFuZ2xlLCBj
aGVjayBpZiByYXkgZG9lcy4KKyAgICAgICAgICAgICAgICB2YXIgUWROID0gLSBzaWduICogZGlm
Zi5kb3QoIG5vcm1hbCApOworCisgICAgICAgICAgICAgICAgLy8gdCA8IDAsIG5vIGludGVyc2Vj
dGlvbgorICAgICAgICAgICAgICAgIGlmICggUWROIDwgMCApIHsKKworICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IC8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlz
LmF0KCBRZE4gLyBEZE4sIG9wdGlvbmFsVGFyZ2V0ICk7CisKKyAgICAgICAgICAgIH07CisKKyAg
ICAgICAgfSgpLAorCisgICAgICAgIGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXg0ICkg
eworCisgICAgICAgICAgICB0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoIG1hdHJpeDQgKTsKKyAg
ICAgICAgICAgIHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4NCApOwor
CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGVxdWFs
czogZnVuY3Rpb24gKCByYXkgKSB7CisKKyAgICAgICAgICAgIHJldHVybiByYXkub3JpZ2luLmVx
dWFscyggdGhpcy5vcmlnaW4gKSAmJiByYXkuZGlyZWN0aW9uLmVxdWFscyggdGhpcy5kaXJlY3Rp
b24gKTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9y
IGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCisgICAgICovCisKKyAgICBmdW5jdGlvbiBMaW5l
Myggc3RhcnQsIGVuZCApIHsKKworICAgICAgICB0aGlzLnN0YXJ0ID0gKCBzdGFydCAhPT0gdW5k
ZWZpbmVkICkgPyBzdGFydCA6IG5ldyBWZWN0b3IzKCk7CisgICAgICAgIHRoaXMuZW5kID0gKCBl
bmQgIT09IHVuZGVmaW5lZCApID8gZW5kIDogbmV3IFZlY3RvcjMoKTsKKworICAgIH0KKworICAg
IE9iamVjdC5hc3NpZ24oIExpbmUzLnByb3RvdHlwZSwgeworCisgICAgICAgIHNldDogZnVuY3Rp
b24gKCBzdGFydCwgZW5kICkgeworCisgICAgICAgICAgICB0aGlzLnN0YXJ0LmNvcHkoIHN0YXJ0
ICk7CisgICAgICAgICAgICB0aGlzLmVuZC5jb3B5KCBlbmQgKTsKKworICAgICAgICAgICAgcmV0
dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7
CisKKyAgICAgICAgfSwKKworICAgICAgICBjb3B5OiBmdW5jdGlvbiAoIGxpbmUgKSB7CisKKyAg
ICAgICAgICAgIHRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApOworICAgICAgICAgICAgdGhp
cy5lbmQuY29weSggbGluZS5lbmQgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBnZXRDZW50ZXI6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQg
KSB7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVj
dG9yMygpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5hZGRWZWN0b3JzKCB0aGlzLnN0YXJ0
LCB0aGlzLmVuZCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTsKKworICAgICAgICB9LAorCisgICAg
ICAgIGRlbHRhOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICB2
YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAg
IHJldHVybiByZXN1bHQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTsKKworICAg
ICAgICB9LAorCisgICAgICAgIGRpc3RhbmNlU3E6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuZW5kICk7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBkaXN0YW5jZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAg
ICByZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKCB0aGlzLmVuZCApOworCisgICAgICAgIH0s
CisKKyAgICAgICAgYXQ6IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7CisKKyAgICAg
ICAgICAgIHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCisg
ICAgICAgICAgICByZXR1cm4gdGhpcy5kZWx0YSggcmVzdWx0ICkubXVsdGlwbHlTY2FsYXIoIHQg
KS5hZGQoIHRoaXMuc3RhcnQgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGNsb3Nlc3RQb2lu
dFRvUG9pbnRQYXJhbWV0ZXI6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIHN0YXJ0
UCA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICB2YXIgc3RhcnRFbmQgPSBuZXcgVmVjdG9y
MygpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludFBh
cmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICkgeworCisgICAgICAgICAgICAgICAgc3RhcnRQ
LnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLnN0YXJ0ICk7CisgICAgICAgICAgICAgICAgc3RhcnRF
bmQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTsKKworICAgICAgICAgICAgICAg
IHZhciBzdGFydEVuZDIgPSBzdGFydEVuZC5kb3QoIHN0YXJ0RW5kICk7CisgICAgICAgICAgICAg
ICAgdmFyIHN0YXJ0RW5kX3N0YXJ0UCA9IHN0YXJ0RW5kLmRvdCggc3RhcnRQICk7CisKKyAgICAg
ICAgICAgICAgICB2YXIgdCA9IHN0YXJ0RW5kX3N0YXJ0UCAvIHN0YXJ0RW5kMjsKKworICAgICAg
ICAgICAgICAgIGlmICggY2xhbXBUb0xpbmUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdCA9
IF9NYXRoLmNsYW1wKCB0LCAwLCAxICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICByZXR1cm4gdDsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9KCksCisKKyAg
ICAgICAgY2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgY2xhbXBUb0xpbmUs
IG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICB2YXIgdCA9IHRoaXMuY2xvc2VzdFBv
aW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICk7CisKKyAgICAgICAgICAg
IHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOworCisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5kZWx0YSggcmVzdWx0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQo
IHRoaXMuc3RhcnQgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGFwcGx5TWF0cml4NDogZnVu
Y3Rpb24gKCBtYXRyaXggKSB7CisKKyAgICAgICAgICAgIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0
KCBtYXRyaXggKTsKKyAgICAgICAgICAgIHRoaXMuZW5kLmFwcGx5TWF0cml4NCggbWF0cml4ICk7
CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZXF1
YWxzOiBmdW5jdGlvbiAoIGxpbmUgKSB7CisKKyAgICAgICAgICAgIHJldHVybiBsaW5lLnN0YXJ0
LmVxdWFscyggdGhpcy5zdGFydCApICYmIGxpbmUuZW5kLmVxdWFscyggdGhpcy5lbmQgKTsKKwor
ICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIGJob3VzdG9u
IC8gaHR0cDovL2NsYXJhLmlvCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29i
LmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFRyaWFuZ2xlKCBhLCBiLCBjICkgeworCisg
ICAgICAgIHRoaXMuYSA9ICggYSAhPT0gdW5kZWZpbmVkICkgPyBhIDogbmV3IFZlY3RvcjMoKTsK
KyAgICAgICAgdGhpcy5iID0gKCBiICE9PSB1bmRlZmluZWQgKSA/IGIgOiBuZXcgVmVjdG9yMygp
OworICAgICAgICB0aGlzLmMgPSAoIGMgIT09IHVuZGVmaW5lZCApID8gYyA6IG5ldyBWZWN0b3Iz
KCk7CisKKyAgICB9CisKKyAgICBPYmplY3QuYXNzaWduKCBUcmlhbmdsZSwgeworCisgICAgICAg
IG5vcm1hbDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdjAgPSBuZXcgVmVjdG9y
MygpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gbm9ybWFsKCBhLCBiLCBjLCBvcHRp
b25hbFRhcmdldCApIHsKKworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBvcHRpb25hbFRh
cmdldCB8fCBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICAgICAgcmVzdWx0LnN1YlZlY3Rv
cnMoIGMsIGIgKTsKKyAgICAgICAgICAgICAgICB2MC5zdWJWZWN0b3JzKCBhLCBiICk7CisgICAg
ICAgICAgICAgICAgcmVzdWx0LmNyb3NzKCB2MCApOworCisgICAgICAgICAgICAgICAgdmFyIHJl
c3VsdExlbmd0aFNxID0gcmVzdWx0Lmxlbmd0aFNxKCk7CisgICAgICAgICAgICAgICAgaWYgKCBy
ZXN1bHRMZW5ndGhTcSA+IDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dC5tdWx0aXBseVNjYWxhciggMSAvIE1hdGguc3FydCggcmVzdWx0TGVuZ3RoU3EgKSApOworCisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5zZXQoIDAs
IDAsIDAgKTsKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9KCksCisKKyAgICAgICAgLy8g
c3RhdGljL2luc3RhbmNlIG1ldGhvZCB0byBjYWxjdWxhdGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0
ZXMKKyAgICAgICAgLy8gYmFzZWQgb246IGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9w
b2ludGlucG9seS9kZWZhdWx0Lmh0bWwKKyAgICAgICAgYmFyeWNvb3JkRnJvbVBvaW50OiBmdW5j
dGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciB2MCA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAg
ICAgICB2YXIgdjEgPSBuZXcgVmVjdG9yMygpOworICAgICAgICAgICAgdmFyIHYyID0gbmV3IFZl
Y3RvcjMoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGJhcnljb29yZEZyb21Qb2lu
dCggcG9pbnQsIGEsIGIsIGMsIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICAgICAg
djAuc3ViVmVjdG9ycyggYywgYSApOworICAgICAgICAgICAgICAgIHYxLnN1YlZlY3RvcnMoIGIs
IGEgKTsKKyAgICAgICAgICAgICAgICB2Mi5zdWJWZWN0b3JzKCBwb2ludCwgYSApOworCisgICAg
ICAgICAgICAgICAgdmFyIGRvdDAwID0gdjAuZG90KCB2MCApOworICAgICAgICAgICAgICAgIHZh
ciBkb3QwMSA9IHYwLmRvdCggdjEgKTsKKyAgICAgICAgICAgICAgICB2YXIgZG90MDIgPSB2MC5k
b3QoIHYyICk7CisgICAgICAgICAgICAgICAgdmFyIGRvdDExID0gdjEuZG90KCB2MSApOworICAg
ICAgICAgICAgICAgIHZhciBkb3QxMiA9IHYxLmRvdCggdjIgKTsKKworICAgICAgICAgICAgICAg
IHZhciBkZW5vbSA9ICggZG90MDAgKiBkb3QxMSAtIGRvdDAxICogZG90MDEgKTsKKworICAgICAg
ICAgICAgICAgIHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOwor
CisgICAgICAgICAgICAgICAgLy8gY29sbGluZWFyIG9yIHNpbmd1bGFyIHRyaWFuZ2xlCisgICAg
ICAgICAgICAgICAgaWYgKCBkZW5vbSA9PT0gMCApIHsKKworICAgICAgICAgICAgICAgICAgICAv
LyBhcmJpdHJhcnkgbG9jYXRpb24gb3V0c2lkZSBvZiB0cmlhbmdsZT8KKyAgICAgICAgICAgICAg
ICAgICAgLy8gbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgYmVzdCBpZGVhLCBtYXliZSBzaG91bGQg
YmUgcmV0dXJuaW5nIHVuZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0
LnNldCggLSAyLCAtIDEsIC0gMSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgdmFyIGludkRlbm9tID0gMSAvIGRlbm9tOworICAgICAgICAgICAgICAgIHZhciB1ID0g
KCBkb3QxMSAqIGRvdDAyIC0gZG90MDEgKiBkb3QxMiApICogaW52RGVub207CisgICAgICAgICAg
ICAgICAgdmFyIHYgPSAoIGRvdDAwICogZG90MTIgLSBkb3QwMSAqIGRvdDAyICkgKiBpbnZEZW5v
bTsKKworICAgICAgICAgICAgICAgIC8vIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIG11c3QgYWx3
YXlzIHN1bSB0byAxCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5zZXQoIDEgLSB1IC0g
diwgdiwgdSApOworCisgICAgICAgICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICBj
b250YWluc1BvaW50OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciB2MSA9IG5ldyBW
ZWN0b3IzKCk7CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBjb250YWluc1BvaW50KCBw
b2ludCwgYSwgYiwgYyApIHsKKworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBUcmlhbmds
ZS5iYXJ5Y29vcmRGcm9tUG9pbnQoIHBvaW50LCBhLCBiLCBjLCB2MSApOworCisgICAgICAgICAg
ICAgICAgcmV0dXJuICggcmVzdWx0LnggPj0gMCApICYmICggcmVzdWx0LnkgPj0gMCApICYmICgg
KCByZXN1bHQueCArIHJlc3VsdC55ICkgPD0gMSApOworCisgICAgICAgICAgICB9OworCisgICAg
ICAgIH0oKQorCisgICAgfSApOworCisgICAgT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUucHJvdG90
eXBlLCB7CisKKyAgICAgICAgc2V0OiBmdW5jdGlvbiAoIGEsIGIsIGMgKSB7CisKKyAgICAgICAg
ICAgIHRoaXMuYS5jb3B5KCBhICk7CisgICAgICAgICAgICB0aGlzLmIuY29weSggYiApOworICAg
ICAgICAgICAgdGhpcy5jLmNvcHkoIGMgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisK
KyAgICAgICAgfSwKKworICAgICAgICBzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczogZnVuY3Rpb24g
KCBwb2ludHMsIGkwLCBpMSwgaTIgKSB7CisKKyAgICAgICAgICAgIHRoaXMuYS5jb3B5KCBwb2lu
dHNbIGkwIF0gKTsKKyAgICAgICAgICAgIHRoaXMuYi5jb3B5KCBwb2ludHNbIGkxIF0gKTsKKyAg
ICAgICAgICAgIHRoaXMuYy5jb3B5KCBwb2ludHNbIGkyIF0gKTsKKworICAgICAgICAgICAgcmV0
dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7
CisKKyAgICAgICAgfSwKKworICAgICAgICBjb3B5OiBmdW5jdGlvbiAoIHRyaWFuZ2xlICkgewor
CisgICAgICAgICAgICB0aGlzLmEuY29weSggdHJpYW5nbGUuYSApOworICAgICAgICAgICAgdGhp
cy5iLmNvcHkoIHRyaWFuZ2xlLmIgKTsKKyAgICAgICAgICAgIHRoaXMuYy5jb3B5KCB0cmlhbmds
ZS5jICk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAg
ICAgYXJlYTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdjAgPSBuZXcgVmVjdG9y
MygpOworICAgICAgICAgICAgdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKKworICAgICAgICAgICAg
cmV0dXJuIGZ1bmN0aW9uIGFyZWEoKSB7CisKKyAgICAgICAgICAgICAgICB2MC5zdWJWZWN0b3Jz
KCB0aGlzLmMsIHRoaXMuYiApOworICAgICAgICAgICAgICAgIHYxLnN1YlZlY3RvcnMoIHRoaXMu
YSwgdGhpcy5iICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdjAuY3Jvc3MoIHYxICkubGVu
Z3RoKCkgKiAwLjU7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAg
IG1pZHBvaW50OiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICB2
YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAg
IHJldHVybiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5hLCB0aGlzLmIgKS5hZGQoIHRoaXMuYyAp
Lm11bHRpcGx5U2NhbGFyKCAxIC8gMyApOworCisgICAgICAgIH0sCisKKyAgICAgICAgbm9ybWFs
OiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICByZXR1cm4gVHJp
YW5nbGUubm9ybWFsKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCBvcHRpb25hbFRhcmdldCApOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgcGxhbmU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQg
KSB7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgUGxh
bmUoKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5zZXRGcm9tQ29wbGFuYXJQb2ludHMo
IHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGJhcnlj
b29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CisKKyAg
ICAgICAgICAgIHJldHVybiBUcmlhbmdsZS5iYXJ5Y29vcmRGcm9tUG9pbnQoIHBvaW50LCB0aGlz
LmEsIHRoaXMuYiwgdGhpcy5jLCBvcHRpb25hbFRhcmdldCApOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgY29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKKworICAgICAgICAgICAg
cmV0dXJuIFRyaWFuZ2xlLmNvbnRhaW5zUG9pbnQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhp
cy5jICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5j
dGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciBwbGFuZSA9IG5ldyBQbGFuZSgpOworICAgICAg
ICAgICAgdmFyIGVkZ2VMaXN0ID0gWyBuZXcgTGluZTMoKSwgbmV3IExpbmUzKCksIG5ldyBMaW5l
MygpIF07CisgICAgICAgICAgICB2YXIgcHJvamVjdGVkUG9pbnQgPSBuZXcgVmVjdG9yMygpOwor
ICAgICAgICAgICAgdmFyIGNsb3Nlc3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAg
ICAgIHJldHVybiBmdW5jdGlvbiBjbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCwgb3B0aW9uYWxU
YXJnZXQgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQg
fHwgbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAgICAgICB2YXIgbWluRGlzdGFuY2UgPSBJbmZp
bml0eTsKKworICAgICAgICAgICAgICAgIC8vIHByb2plY3QgdGhlIHBvaW50IG9udG8gdGhlIHBs
YW5lIG9mIHRoZSB0cmlhbmdsZQorCisgICAgICAgICAgICAgICAgcGxhbmUuc2V0RnJvbUNvcGxh
bmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7CisgICAgICAgICAgICAgICAgcGxh
bmUucHJvamVjdFBvaW50KCBwb2ludCwgcHJvamVjdGVkUG9pbnQgKTsKKworICAgICAgICAgICAg
ICAgIC8vIGNoZWNrIGlmIHRoZSBwcm9qZWN0aW9uIGxpZXMgd2l0aGluIHRoZSB0cmlhbmdsZQor
CisgICAgICAgICAgICAgICAgaWYoIHRoaXMuY29udGFpbnNQb2ludCggcHJvamVjdGVkUG9pbnQg
KSA9PT0gdHJ1ZSApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBpZiBzbywgdGhpcyBpcyB0
aGUgY2xvc2VzdCBwb2ludAorCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3B5KCBwcm9q
ZWN0ZWRQb2ludCApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAg
ICAgICAgICAvLyBpZiBub3QsIHRoZSBwb2ludCBmYWxscyBvdXRzaWRlIHRoZSB0cmlhbmdsZS4g
dGhlIHJlc3VsdCBpcyB0aGUgY2xvc2VzdCBwb2ludCB0byB0aGUgdHJpYW5nbGUncyBlZGdlcyBv
ciB2ZXJ0aWNlcworCisgICAgICAgICAgICAgICAgICAgIGVkZ2VMaXN0WyAwIF0uc2V0KCB0aGlz
LmEsIHRoaXMuYiApOworICAgICAgICAgICAgICAgICAgICBlZGdlTGlzdFsgMSBdLnNldCggdGhp
cy5iLCB0aGlzLmMgKTsKKyAgICAgICAgICAgICAgICAgICAgZWRnZUxpc3RbIDIgXS5zZXQoIHRo
aXMuYywgdGhpcy5hICk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB2YXIgaSA9IDA7IGkg
PCBlZGdlTGlzdC5sZW5ndGg7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVk
Z2VMaXN0WyBpIF0uY2xvc2VzdFBvaW50VG9Qb2ludCggcHJvamVjdGVkUG9pbnQsIHRydWUsIGNs
b3Nlc3RQb2ludCApOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBw
cm9qZWN0ZWRQb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggY2xvc2VzdFBvaW50ICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmKCBkaXN0YW5jZSA8IG1pbkRpc3RhbmNlICkgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3B5KCBjbG9zZXN0UG9pbnQgKTsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAg
ICAgIH07CisKKyAgICAgICAgfSgpLAorCisgICAgICAgIGVxdWFsczogZnVuY3Rpb24gKCB0cmlh
bmdsZSApIHsKKworICAgICAgICAgICAgcmV0dXJuIHRyaWFuZ2xlLmEuZXF1YWxzKCB0aGlzLmEg
KSAmJiB0cmlhbmdsZS5iLmVxdWFscyggdGhpcy5iICkgJiYgdHJpYW5nbGUuYy5lcXVhbHMoIHRo
aXMuYyApOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAqIEBhdXRo
b3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1dGhvciBhbHRlcmVkcSAv
IGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdl
ciAvIGh0dHA6Ly9nb21vLnNlLworICAgICAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25v
YnIxLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIE1lc2goIGdlb21ldHJ5LCBtYXRlcmlh
bCApIHsKKworICAgICAgICBPYmplY3QzRC5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhpcy50
eXBlID0gJ01lc2gnOworCisgICAgICAgIHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5k
ZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKyAgICAgICAgdGhpcy5t
YXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBNZXNoQmFz
aWNNYXRlcmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTsKKworICAg
ICAgICB0aGlzLmRyYXdNb2RlID0gVHJpYW5nbGVzRHJhd01vZGU7CisKKyAgICAgICAgdGhpcy51
cGRhdGVNb3JwaFRhcmdldHMoKTsKKworICAgIH0KKworICAgIE1lc2gucHJvdG90eXBlID0gT2Jq
ZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKKworICAg
ICAgICBjb25zdHJ1Y3RvcjogTWVzaCwKKworICAgICAgICBpc01lc2g6IHRydWUsCisKKyAgICAg
ICAgc2V0RHJhd01vZGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAgIHRoaXMu
ZHJhd01vZGUgPSB2YWx1ZTsKKworICAgICAgICB9LAorCisgICAgICAgIGNvcHk6IGZ1bmN0aW9u
ICggc291cmNlICkgeworCisgICAgICAgICAgICBPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxs
KCB0aGlzLCBzb3VyY2UgKTsKKworICAgICAgICAgICAgdGhpcy5kcmF3TW9kZSA9IHNvdXJjZS5k
cmF3TW9kZTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAg
ICAgICB1cGRhdGVNb3JwaFRhcmdldHM6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFy
IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKKyAgICAgICAgICAgIHZhciBtLCBtbCwgbmFtZTsK
KworICAgICAgICAgICAgaWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgeworCisgICAg
ICAgICAgICAgICAgdmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRl
czsKKyAgICAgICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKCBtb3JwaEF0dHJpYnV0
ZXMgKTsKKworICAgICAgICAgICAgICAgIGlmICgga2V5cy5sZW5ndGggPiAwICkgeworCisgICAg
ICAgICAgICAgICAgICAgIHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sga2V5
c1sgMCBdIF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBtb3JwaEF0dHJpYnV0ZSAhPT0g
dW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0
SW5mbHVlbmNlcyA9IFtdOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3JwaFRhcmdl
dERpY3Rpb25hcnkgPSB7fTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggbSA9IDAs
IG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBuYW1lID0gbW9ycGhBdHRyaWJ1dGVbIG0gXS5uYW1lIHx8IFN0
cmluZyggbSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3JwaFRhcmdl
dEluZmx1ZW5jZXMucHVzaCggMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMu
bW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtOworCisgICAgICAgICAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgdmFyIG1vcnBoVGFyZ2V0cyA9
IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0czsKKworICAgICAgICAgICAgICAgIGlmICggbW9ycGhUYXJn
ZXRzICE9PSB1bmRlZmluZWQgJiYgbW9ycGhUYXJnZXRzLmxlbmd0aCA+IDAgKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTsKKyAgICAgICAg
ICAgICAgICAgICAgdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTsKKworICAgICAgICAg
ICAgICAgICAgICBmb3IgKCBtID0gMCwgbWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBtIDwgbWw7
IG0gKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBtb3JwaFRhcmdldHNb
IG0gXS5uYW1lIHx8IFN0cmluZyggbSApOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlz
Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7CisgICAgICAgICAgICAgICAgICAgICAg
ICB0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTsKKworICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICB9LAorCisgICAgICAgIHJheWNhc3Q6ICggZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2
YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CisgICAgICAgICAgICB2YXIgcmF5ID0g
bmV3IFJheSgpOworICAgICAgICAgICAgdmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTsKKworICAg
ICAgICAgICAgdmFyIHZBID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAgIHZhciB2QiA9IG5l
dyBWZWN0b3IzKCk7CisgICAgICAgICAgICB2YXIgdkMgPSBuZXcgVmVjdG9yMygpOworCisgICAg
ICAgICAgICB2YXIgdGVtcEEgPSBuZXcgVmVjdG9yMygpOworICAgICAgICAgICAgdmFyIHRlbXBC
ID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAgIHZhciB0ZW1wQyA9IG5ldyBWZWN0b3IzKCk7
CisKKyAgICAgICAgICAgIHZhciB1dkEgPSBuZXcgVmVjdG9yMigpOworICAgICAgICAgICAgdmFy
IHV2QiA9IG5ldyBWZWN0b3IyKCk7CisgICAgICAgICAgICB2YXIgdXZDID0gbmV3IFZlY3RvcjIo
KTsKKworICAgICAgICAgICAgdmFyIGJhcnljb29yZCA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAg
ICAgICAgIHZhciBpbnRlcnNlY3Rpb25Qb2ludCA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAg
ICB2YXIgaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAg
ICAgIGZ1bmN0aW9uIHV2SW50ZXJzZWN0aW9uKCBwb2ludCwgcDEsIHAyLCBwMywgdXYxLCB1djIs
IHV2MyApIHsKKworICAgICAgICAgICAgICAgIFRyaWFuZ2xlLmJhcnljb29yZEZyb21Qb2ludCgg
cG9pbnQsIHAxLCBwMiwgcDMsIGJhcnljb29yZCApOworCisgICAgICAgICAgICAgICAgdXYxLm11
bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueCApOworICAgICAgICAgICAgICAgIHV2Mi5tdWx0aXBs
eVNjYWxhciggYmFyeWNvb3JkLnkgKTsKKyAgICAgICAgICAgICAgICB1djMubXVsdGlwbHlTY2Fs
YXIoIGJhcnljb29yZC56ICk7CisKKyAgICAgICAgICAgICAgICB1djEuYWRkKCB1djIgKS5hZGQo
IHV2MyApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHV2MS5jbG9uZSgpOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3Qs
IHJheWNhc3RlciwgcmF5LCBwQSwgcEIsIHBDLCBwb2ludCApIHsKKworICAgICAgICAgICAgICAg
IHZhciBpbnRlcnNlY3Q7CisgICAgICAgICAgICAgICAgdmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1h
dGVyaWFsOworCisgICAgICAgICAgICAgICAgaWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lk
ZSApIHsKKworICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJp
YW5nbGUoIHBDLCBwQiwgcEEsIHRydWUsIHBvaW50ICk7CisKKyAgICAgICAgICAgICAgICB9IGVs
c2UgeworCisgICAgICAgICAgICAgICAgICAgIGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlh
bmdsZSggcEEsIHBCLCBwQywgbWF0ZXJpYWwuc2lkZSAhPT0gRG91YmxlU2lkZSwgcG9pbnQgKTsK
KworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggaW50ZXJzZWN0ID09
PSBudWxsICkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25Qb2lu
dFdvcmxkLmNvcHkoIHBvaW50ICk7CisgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uUG9pbnRX
b3JsZC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApOworCisgICAgICAgICAgICAg
ICAgdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJz
ZWN0aW9uUG9pbnRXb3JsZCApOworCisgICAgICAgICAgICAgICAgaWYgKCBkaXN0YW5jZSA8IHJh
eWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybiBudWxsOwor
CisgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2U6
IGRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICBwb2ludDogaW50ZXJzZWN0aW9uUG9pbnRX
b3JsZC5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IG9iamVjdAorICAgICAg
ICAgICAgICAgIH07CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnVuY3Rpb24gY2hl
Y2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggb2JqZWN0LCByYXljYXN0ZXIsIHJheSwgcG9z
aXRpb24sIHV2LCBhLCBiLCBjICkgeworCisgICAgICAgICAgICAgICAgdkEuZnJvbUJ1ZmZlckF0
dHJpYnV0ZSggcG9zaXRpb24sIGEgKTsKKyAgICAgICAgICAgICAgICB2Qi5mcm9tQnVmZmVyQXR0
cmlidXRlKCBwb3NpdGlvbiwgYiApOworICAgICAgICAgICAgICAgIHZDLmZyb21CdWZmZXJBdHRy
aWJ1dGUoIHBvc2l0aW9uLCBjICk7CisKKyAgICAgICAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9u
ID0gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgcmF5Y2FzdGVyLCByYXksIHZBLCB2QiwgdkMs
IGludGVyc2VjdGlvblBvaW50ICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGludGVyc2VjdGlv
biApIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHV2ICkgeworCisgICAgICAgICAgICAg
ICAgICAgICAgICB1dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGEgKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHV2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYiApOworICAgICAgICAg
ICAgICAgICAgICAgICAgdXZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2LCBjICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRl
cnNlY3Rpb25Qb2ludCwgdkEsIHZCLCB2QywgdXZBLCB1dkIsIHV2QyApOworCisgICAgICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb24uZmFjZSA9IG5l
dyBGYWNlMyggYSwgYiwgYywgVHJpYW5nbGUubm9ybWFsKCB2QSwgdkIsIHZDICkgKTsKKyAgICAg
ICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IGE7CisKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9uOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIs
IGludGVyc2VjdHMgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdl
b21ldHJ5OworICAgICAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7Cisg
ICAgICAgICAgICAgICAgdmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDsKKworICAg
ICAgICAgICAgICAgIGlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjsKKworICAg
ICAgICAgICAgICAgIC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheQor
CisgICAgICAgICAgICAgICAgaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCAp
IGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOworCisgICAgICAgICAgICAgICAgc3Bo
ZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7CisgICAgICAgICAgICAgICAgc3Bo
ZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsKKworICAgICAgICAgICAgICAgIGlmICgg
cmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1
cm47CisKKyAgICAgICAgICAgICAgICAvLworCisgICAgICAgICAgICAgICAgaW52ZXJzZU1hdHJp
eC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApOworICAgICAgICAgICAgICAgIHJheS5jb3B5KCBy
YXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBpbnZlcnNlTWF0cml4ICk7CisKKyAgICAgICAg
ICAgICAgICAvLyBDaGVjayBib3VuZGluZ0JveCBiZWZvcmUgY29udGludWluZworCisgICAgICAg
ICAgICAgICAgaWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKKworICAgICAg
ICAgICAgICAgICAgICBpZiAoIHJheS5pbnRlcnNlY3RzQm94KCBnZW9tZXRyeS5ib3VuZGluZ0Jv
eCApID09PSBmYWxzZSApIHJldHVybjsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIHZhciBpbnRlcnNlY3Rpb247CisKKyAgICAgICAgICAgICAgICBpZiAoIGdlb21ldHJ5
LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGEsIGIsIGM7
CisgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4OworICAgICAg
ICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9u
OworICAgICAgICAgICAgICAgICAgICB2YXIgdXYgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2Owor
ICAgICAgICAgICAgICAgICAgICB2YXIgaSwgbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAo
IGluZGV4ICE9PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleGVk
IGJ1ZmZlciBnZW9tZXRyeQorCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMCwg
bCA9IGluZGV4LmNvdW50OyBpIDwgbDsgaSArPSAzICkgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYSA9IGluZGV4LmdldFgoIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBiID0gaW5kZXguZ2V0WCggaSArIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
ID0gaW5kZXguZ2V0WCggaSArIDIgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
dGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNh
c3RlciwgcmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKTsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICggaW50ZXJzZWN0aW9uICkgeworCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBpIC8gMyApOyAv
LyB0cmlhbmdsZSBudW1iZXIgaW4gaW5kaWNlcyBidWZmZXIgc2VtYW50aWNzCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0cnkKKworICAgICAgICAgICAgICAgICAg
ICAgICAgZm9yICggaSA9IDAsIGwgPSBwb3NpdGlvbi5jb3VudDsgaSA8IGw7IGkgKz0gMyApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBpOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGIgPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gaSAr
IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb24gPSBjaGVja0J1
ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24s
IHV2LCBhLCBiLCBjICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGludGVy
c2VjdGlvbiApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3Rp
b24uaW5kZXggPSBhOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gcG9zaXRpb25zIGJ1ZmZlciBzZW1h
bnRpY3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0cy5wdXNoKCBp
bnRlcnNlY3Rpb24gKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgdmFyIGZ2QSwgZnZCLCBmdkM7CisgICAgICAgICAgICAgICAgICAgIHZhciBpc011
bHRpTWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApOworCisgICAgICAgICAgICAg
ICAgICAgIHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOworICAgICAgICAgICAgICAg
ICAgICB2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlczsKKyAgICAgICAgICAgICAgICAgICAgdmFy
IHV2czsKKworICAgICAgICAgICAgICAgICAgICB2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5
LmZhY2VWZXJ0ZXhVdnNbIDAgXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBmYWNlVmVydGV4
VXZzLmxlbmd0aCA+IDAgKSB1dnMgPSBmYWNlVmVydGV4VXZzOworCisgICAgICAgICAgICAgICAg
ICAgIGZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZhY2UgPSBmYWNlc1sgZiBdOworICAgICAg
ICAgICAgICAgICAgICAgICAgdmFyIGZhY2VNYXRlcmlhbCA9IGlzTXVsdGlNYXRlcmlhbCA/IG1h
dGVyaWFsWyBmYWNlLm1hdGVyaWFsSW5kZXggXSA6IG1hdGVyaWFsOworCisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIGZhY2VNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgY29udGludWU7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIGZ2QSA9IHZlcnRpY2VzWyBmYWNlLmEgXTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGZ2QiA9IHZlcnRpY2VzWyBmYWNlLmIgXTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGZ2QyA9IHZlcnRpY2VzWyBmYWNlLmMgXTsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCBmYWNlTWF0ZXJpYWwubW9ycGhUYXJnZXRzID09PSB0cnVlICkgeworCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1v
cnBoVGFyZ2V0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9ycGhJbmZsdWVu
Y2VzID0gdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB2QS5zZXQoIDAsIDAsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2
Qi5zZXQoIDAsIDAsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Qy5zZXQoIDAs
IDAsIDAgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIHZhciB0ID0gMCwg
dGwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyB0IDwgdGw7IHQgKysgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdmFyIGluZmx1ZW5jZSA9IG1vcnBoSW5mbHVlbmNlc1sgdCBd
OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5mbHVlbmNlID09PSAw
ICkgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdl
dHMgPSBtb3JwaFRhcmdldHNbIHQgXS52ZXJ0aWNlczsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB2QS5hZGRTY2FsZWRWZWN0b3IoIHRlbXBBLnN1YlZlY3RvcnMoIHRhcmdldHNb
IGZhY2UuYSBdLCBmdkEgKSwgaW5mbHVlbmNlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHZCLmFkZFNjYWxlZFZlY3RvciggdGVtcEIuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFj
ZS5iIF0sIGZ2QiApLCBpbmZsdWVuY2UgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdkMuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQy5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmMg
XSwgZnZDICksIGluZmx1ZW5jZSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkEuYWRkKCBmdkEgKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB2Qi5hZGQoIGZ2QiApOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHZDLmFkZCggZnZDICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdkEgPSB2
QTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdkIgPSB2QjsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBmdkMgPSB2QzsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb24gPSBjaGVja0ludGVyc2VjdGlvbigg
dGhpcywgcmF5Y2FzdGVyLCByYXksIGZ2QSwgZnZCLCBmdkMsIGludGVyc2VjdGlvblBvaW50ICk7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW50ZXJzZWN0aW9uICkgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB1dnMgJiYgdXZzWyBmIF0gKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHV2c19mID0gdXZzWyBmIF07CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHV2QS5jb3B5KCB1dnNfZlsgMCBdICk7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHV2Qi5jb3B5KCB1dnNfZlsgMSBdICk7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHV2Qy5jb3B5KCB1dnNfZlsgMiBdICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uLnV2ID0gdXZJbnRlcnNlY3Rp
b24oIGludGVyc2VjdGlvblBvaW50LCBmdkEsIGZ2QiwgZnZDLCB1dkEsIHV2QiwgdXZDICk7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IGY7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgfTsKKworICAgICAgICB9KCkgKSwKKworICAgICAgICBjbG9uZTogZnVuY3Rp
b24gKCkgeworCisgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMu
Z2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7CisKKyAgICAgICAgfQorCisg
ICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29i
LmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFdlYkdMQmFja2dyb3VuZCggcmVuZGVyZXIs
IHN0YXRlLCBvYmplY3RzLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7CisKKyAgICAgICAgdmFyIGNs
ZWFyQ29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7CisgICAgICAgIHZhciBjbGVhckFscGhh
ID0gMDsKKworICAgICAgICB2YXIgcGxhbmVDYW1lcmEsIHBsYW5lTWVzaDsKKyAgICAgICAgdmFy
IGJveENhbWVyYSwgYm94TWVzaDsKKworICAgICAgICBmdW5jdGlvbiByZW5kZXIoIHNjZW5lLCBj
YW1lcmEsIGZvcmNlQ2xlYXIgKSB7CisKKyAgICAgICAgICAgIHZhciBiYWNrZ3JvdW5kID0gc2Nl
bmUuYmFja2dyb3VuZDsKKworICAgICAgICAgICAgaWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkg
eworCisgICAgICAgICAgICAgICAgc2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTsK
KworICAgICAgICAgICAgfSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29s
b3IgKSB7CisKKyAgICAgICAgICAgICAgICBzZXRDbGVhciggYmFja2dyb3VuZCwgMSApOworICAg
ICAgICAgICAgICAgIGZvcmNlQ2xlYXIgPSB0cnVlOworCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGlmICggcmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7CisKKyAgICAg
ICAgICAgICAgICByZW5kZXJlci5jbGVhciggcmVuZGVyZXIuYXV0b0NsZWFyQ29sb3IsIHJlbmRl
cmVyLmF1dG9DbGVhckRlcHRoLCByZW5kZXJlci5hdXRvQ2xlYXJTdGVuY2lsICk7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXND
dWJlVGV4dHVyZSApIHsKKworICAgICAgICAgICAgICAgIGlmICggYm94Q2FtZXJhID09PSB1bmRl
ZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgYm94Q2FtZXJhID0gbmV3IFBlcnNwZWN0
aXZlQ2FtZXJhKCk7CisKKyAgICAgICAgICAgICAgICAgICAgYm94TWVzaCA9IG5ldyBNZXNoKAor
ICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJveEJ1ZmZlckdlb21ldHJ5KCA1LCA1LCA1ICks
CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2hhZGVyTWF0ZXJpYWwoIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB1bmlmb3JtczogU2hhZGVyTGliLmN1YmUudW5pZm9ybXMsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS52
ZXJ0ZXhTaGFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXI6
IFNoYWRlckxpYi5jdWJlLmZyYWdtZW50U2hhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHNpZGU6IEJhY2tTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoVGVz
dDogZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhXcml0ZTogZmFsc2Us
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9nOiBmYWxzZQorICAgICAgICAgICAgICAg
ICAgICAgICAgfSApCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICBib3hDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1l
cmEucHJvamVjdGlvbk1hdHJpeCApOworCisgICAgICAgICAgICAgICAgYm94Q2FtZXJhLm1hdHJp
eFdvcmxkLmV4dHJhY3RSb3RhdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7CisgICAgICAgICAg
ICAgICAgYm94Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKCBib3hDYW1lcmEu
bWF0cml4V29ybGQgKTsKKworICAgICAgICAgICAgICAgIGJveE1lc2gubWF0ZXJpYWwudW5pZm9y
bXNbICJ0Q3ViZSIgXS52YWx1ZSA9IGJhY2tncm91bmQ7CisgICAgICAgICAgICAgICAgYm94TWVz
aC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggYm94Q2FtZXJhLm1hdHJpeFdvcmxk
SW52ZXJzZSwgYm94TWVzaC5tYXRyaXhXb3JsZCApOworCisgICAgICAgICAgICAgICAgb2JqZWN0
cy51cGRhdGUoIGJveE1lc2ggKTsKKworICAgICAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlckJ1
ZmZlckRpcmVjdCggYm94Q2FtZXJhLCBudWxsLCBib3hNZXNoLmdlb21ldHJ5LCBib3hNZXNoLm1h
dGVyaWFsLCBib3hNZXNoLCBudWxsICk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIGJhY2tn
cm91bmQgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAo
IHBsYW5lQ2FtZXJhID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcGxh
bmVDYW1lcmEgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCAtIDEsIDEsIDEsIC0gMSwgMCwgMSAp
OworCisgICAgICAgICAgICAgICAgICAgIHBsYW5lTWVzaCA9IG5ldyBNZXNoKAorICAgICAgICAg
ICAgICAgICAgICAgICAgbmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIDIsIDIgKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBkZXB0aFRlc3Q6IGZhbHNl
LCBkZXB0aFdyaXRlOiBmYWxzZSwgZm9nOiBmYWxzZSB9ICkKKyAgICAgICAgICAgICAgICAgICAg
KTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBsYW5lTWVzaC5tYXRl
cmlhbC5tYXAgPSBiYWNrZ3JvdW5kOworCisgICAgICAgICAgICAgICAgb2JqZWN0cy51cGRhdGUo
IHBsYW5lTWVzaCApOworCisgICAgICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyQnVmZmVyRGly
ZWN0KCBwbGFuZUNhbWVyYSwgbnVsbCwgcGxhbmVNZXNoLmdlb21ldHJ5LCBwbGFuZU1lc2gubWF0
ZXJpYWwsIHBsYW5lTWVzaCwgbnVsbCApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQor
CisgICAgICAgIGZ1bmN0aW9uIHNldENsZWFyKCBjb2xvciwgYWxwaGEgKSB7CisKKyAgICAgICAg
ICAgIHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9y
LmIsIGFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKTsKKworICAgICAgICB9CisKKyAgICAgICAg
cmV0dXJuIHsKKworICAgICAgICAgICAgZ2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFyQ29sb3I7CisKKyAgICAgICAgICAgIH0sCisgICAg
ICAgICAgICBzZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHsKKworICAg
ICAgICAgICAgICAgIGNsZWFyQ29sb3Iuc2V0KCBjb2xvciApOworICAgICAgICAgICAgICAgIGNs
ZWFyQWxwaGEgPSBhbHBoYSAhPT0gdW5kZWZpbmVkID8gYWxwaGEgOiAxOworICAgICAgICAgICAg
ICAgIHNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7CisKKyAgICAgICAgICAgIH0s
CisgICAgICAgICAgICBnZXRDbGVhckFscGhhOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAg
ICAgICByZXR1cm4gY2xlYXJBbHBoYTsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHNl
dENsZWFyQWxwaGE6IGZ1bmN0aW9uICggYWxwaGEgKSB7CisKKyAgICAgICAgICAgICAgICBjbGVh
ckFscGhhID0gYWxwaGE7CisgICAgICAgICAgICAgICAgc2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNs
ZWFyQWxwaGEgKTsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHJlbmRlcjogcmVuZGVy
CisKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29i
IC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBwYWludGVyU29y
dFN0YWJsZSggYSwgYiApIHsKKworICAgICAgICBpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVu
ZGVyT3JkZXIgKSB7CisKKyAgICAgICAgICAgIHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5k
ZXJPcmRlcjsKKworICAgICAgICB9IGVsc2UgaWYgKCBhLnByb2dyYW0gJiYgYi5wcm9ncmFtICYm
IGEucHJvZ3JhbSAhPT0gYi5wcm9ncmFtICkgeworCisgICAgICAgICAgICByZXR1cm4gYS5wcm9n
cmFtLmlkIC0gYi5wcm9ncmFtLmlkOworCisgICAgICAgIH0gZWxzZSBpZiAoIGEubWF0ZXJpYWwu
aWQgIT09IGIubWF0ZXJpYWwuaWQgKSB7CisKKyAgICAgICAgICAgIHJldHVybiBhLm1hdGVyaWFs
LmlkIC0gYi5tYXRlcmlhbC5pZDsKKworICAgICAgICB9IGVsc2UgaWYgKCBhLnogIT09IGIueiAp
IHsKKworICAgICAgICAgICAgcmV0dXJuIGEueiAtIGIuejsKKworICAgICAgICB9IGVsc2Ugewor
CisgICAgICAgICAgICByZXR1cm4gYS5pZCAtIGIuaWQ7CisKKyAgICAgICAgfQorCisgICAgfQor
CisgICAgZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkgeworCisgICAg
ICAgIGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHsKKworICAgICAgICAg
ICAgcmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyOworCisgICAgICAgIH0gaWYg
KCBhLnogIT09IGIueiApIHsKKworICAgICAgICAgICAgcmV0dXJuIGIueiAtIGEuejsKKworICAg
ICAgICB9IGVsc2UgeworCisgICAgICAgICAgICByZXR1cm4gYS5pZCAtIGIuaWQ7CisKKyAgICAg
ICAgfQorCisgICAgfQorCisgICAgZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0KCkgeworCisgICAg
ICAgIHZhciBvcGFxdWUgPSBbXTsKKyAgICAgICAgdmFyIG9wYXF1ZUxhc3RJbmRleCA9IC0gMTsK
KworICAgICAgICB2YXIgdHJhbnNwYXJlbnQgPSBbXTsKKyAgICAgICAgdmFyIHRyYW5zcGFyZW50
TGFzdEluZGV4ID0gLSAxOworCisgICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7CisKKyAgICAgICAg
ICAgIG9wYXF1ZUxhc3RJbmRleCA9IC0gMTsKKyAgICAgICAgICAgIHRyYW5zcGFyZW50TGFzdElu
ZGV4ID0gLSAxOworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBwdXNoKCBvYmplY3Qs
IGdlb21ldHJ5LCBtYXRlcmlhbCwgeiwgZ3JvdXAgKSB7CisKKyAgICAgICAgICAgIHZhciBhcnJh
eSwgaW5kZXg7CisKKyAgICAgICAgICAgIC8vIGFsbG9jYXRlIHRoZSBuZXh0IHBvc2l0aW9uIGlu
IHRoZSBhcHByb3ByaWF0ZSBhcnJheQorCisgICAgICAgICAgICBpZiAoIG1hdGVyaWFsLnRyYW5z
cGFyZW50ICkgeworCisgICAgICAgICAgICAgICAgYXJyYXkgPSB0cmFuc3BhcmVudDsKKyAgICAg
ICAgICAgICAgICBpbmRleCA9ICsrIHRyYW5zcGFyZW50TGFzdEluZGV4OworCisgICAgICAgICAg
ICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgYXJyYXkgPSBvcGFxdWU7CisgICAgICAgICAg
ICAgICAgaW5kZXggPSArKyBvcGFxdWVMYXN0SW5kZXg7CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8gcmVjeWNsZSBleGlzdGluZyByZW5kZXIgaXRlbSBvciBncm93IHRoZSBhcnJh
eQorCisgICAgICAgICAgICB2YXIgcmVuZGVySXRlbSA9IGFycmF5WyBpbmRleCBdOworCisgICAg
ICAgICAgICBpZiAoIHJlbmRlckl0ZW0gKSB7CisKKyAgICAgICAgICAgICAgICByZW5kZXJJdGVt
LmlkID0gb2JqZWN0LmlkOworICAgICAgICAgICAgICAgIHJlbmRlckl0ZW0ub2JqZWN0ID0gb2Jq
ZWN0OworICAgICAgICAgICAgICAgIHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTsKKyAg
ICAgICAgICAgICAgICByZW5kZXJJdGVtLm1hdGVyaWFsID0gbWF0ZXJpYWw7CisgICAgICAgICAg
ICAgICAgcmVuZGVySXRlbS5wcm9ncmFtID0gbWF0ZXJpYWwucHJvZ3JhbTsKKyAgICAgICAgICAg
ICAgICByZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyOworICAgICAg
ICAgICAgICAgIHJlbmRlckl0ZW0ueiA9IHo7CisgICAgICAgICAgICAgICAgcmVuZGVySXRlbS5n
cm91cCA9IGdyb3VwOworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAg
cmVuZGVySXRlbSA9IHsKKyAgICAgICAgICAgICAgICAgICAgaWQ6IG9iamVjdC5pZCwKKyAgICAg
ICAgICAgICAgICAgICAgb2JqZWN0OiBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgIGdlb21l
dHJ5OiBnZW9tZXRyeSwKKyAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWw6IG1hdGVyaWFsLAor
ICAgICAgICAgICAgICAgICAgICBwcm9ncmFtOiBtYXRlcmlhbC5wcm9ncmFtLAorICAgICAgICAg
ICAgICAgICAgICByZW5kZXJPcmRlcjogb2JqZWN0LnJlbmRlck9yZGVyLAorICAgICAgICAgICAg
ICAgICAgICB6OiB6LAorICAgICAgICAgICAgICAgICAgICBncm91cDogZ3JvdXAKKyAgICAgICAg
ICAgICAgICB9OworCisgICAgICAgICAgICAgICAgLy8gYXNzZXJ0KCBpbmRleCA9PT0gYXJyYXku
bGVuZ3RoICk7CisgICAgICAgICAgICAgICAgYXJyYXkucHVzaCggcmVuZGVySXRlbSApOworCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHsK
KworICAgICAgICAgICAgb3BhcXVlLmxlbmd0aCA9IG9wYXF1ZUxhc3RJbmRleCArIDE7CisgICAg
ICAgICAgICB0cmFuc3BhcmVudC5sZW5ndGggPSB0cmFuc3BhcmVudExhc3RJbmRleCArIDE7CisK
KyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHNvcnQoKSB7CisKKyAgICAgICAgICAgIG9w
YXF1ZS5zb3J0KCBwYWludGVyU29ydFN0YWJsZSApOworICAgICAgICAgICAgdHJhbnNwYXJlbnQu
c29ydCggcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7CisKKyAgICAgICAgfQorCisgICAgICAg
IHJldHVybiB7CisgICAgICAgICAgICBvcGFxdWU6IG9wYXF1ZSwKKyAgICAgICAgICAgIHRyYW5z
cGFyZW50OiB0cmFuc3BhcmVudCwKKworICAgICAgICAgICAgaW5pdDogaW5pdCwKKyAgICAgICAg
ICAgIHB1c2g6IHB1c2gsCisgICAgICAgICAgICBmaW5pc2g6IGZpbmlzaCwKKworICAgICAgICAg
ICAgc29ydDogc29ydAorICAgICAgICB9OworCisgICAgfQorCisgICAgZnVuY3Rpb24gV2ViR0xS
ZW5kZXJMaXN0cygpIHsKKworICAgICAgICB2YXIgbGlzdHMgPSB7fTsKKworICAgICAgICBmdW5j
dGlvbiBnZXQoIHNjZW5lLCBjYW1lcmEgKSB7CisKKyAgICAgICAgICAgIHZhciBoYXNoID0gc2Nl
bmUuaWQgKyAnLCcgKyBjYW1lcmEuaWQ7CisgICAgICAgICAgICB2YXIgbGlzdCA9IGxpc3RzWyBo
YXNoIF07CisKKyAgICAgICAgICAgIGlmICggbGlzdCA9PT0gdW5kZWZpbmVkICkgeworCisgICAg
ICAgICAgICAgICAgLy8gY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlckxpc3RzOicsIGhh
c2ggKTsKKworICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0KCk7Cisg
ICAgICAgICAgICAgICAgbGlzdHNbIGhhc2ggXSA9IGxpc3Q7CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9u
IGRpc3Bvc2UoKSB7CisKKyAgICAgICAgICAgIGxpc3RzID0ge307CisKKyAgICAgICAgfQorCisg
ICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBnZXQ6IGdldCwKKyAgICAgICAgICAgIGRpc3Bv
c2U6IGRpc3Bvc2UKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEBhdXRo
b3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBX
ZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm9SZW5kZXIgKSB7
CisKKyAgICAgICAgdmFyIG1vZGU7CisKKyAgICAgICAgZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUg
KSB7CisKKyAgICAgICAgICAgIG1vZGUgPSB2YWx1ZTsKKworICAgICAgICB9CisKKyAgICAgICAg
dmFyIHR5cGUsIGJ5dGVzUGVyRWxlbWVudDsKKworICAgICAgICBmdW5jdGlvbiBzZXRJbmRleCgg
dmFsdWUgKSB7CisKKyAgICAgICAgICAgIHR5cGUgPSB2YWx1ZS50eXBlOworICAgICAgICAgICAg
Ynl0ZXNQZXJFbGVtZW50ID0gdmFsdWUuYnl0ZXNQZXJFbGVtZW50OworCisgICAgICAgIH0KKwor
ICAgICAgICBmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHsKKworICAgICAgICAgICAg
Z2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1l
bnQgKTsKKworICAgICAgICAgICAgaW5mb1JlbmRlci5jYWxscyArKzsKKyAgICAgICAgICAgIGlu
Zm9SZW5kZXIudmVydGljZXMgKz0gY291bnQ7CisKKyAgICAgICAgICAgIGlmICggbW9kZSA9PT0g
Z2wuVFJJQU5HTEVTICkgaW5mb1JlbmRlci5mYWNlcyArPSBjb3VudCAvIDM7CisKKyAgICAgICAg
fQorCisgICAgICAgIGZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIHN0YXJ0LCBj
b3VudCApIHsKKworICAgICAgICAgICAgdmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAn
QU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTsKKworICAgICAgICAgICAgaWYgKCBleHRlbnNpb24g
PT09IG51bGwgKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUuV2Vi
R0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21l
dHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5j
ZWRfYXJyYXlzLicgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgZXh0ZW5zaW9uLmRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFKCBtb2Rl
LCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQsIGdlb21ldHJ5Lm1heEluc3Rh
bmNlZENvdW50ICk7CisKKyAgICAgICAgICAgIGluZm9SZW5kZXIuY2FsbHMgKys7CisgICAgICAg
ICAgICBpbmZvUmVuZGVyLnZlcnRpY2VzICs9IGNvdW50ICogZ2VvbWV0cnkubWF4SW5zdGFuY2Vk
Q291bnQ7CisKKyAgICAgICAgICAgIGlmICggbW9kZSA9PT0gZ2wuVFJJQU5HTEVTICkgaW5mb1Jl
bmRlci5mYWNlcyArPSBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCAqIGNvdW50IC8gMzsKKwor
ICAgICAgICB9CisKKyAgICAgICAgLy8KKworICAgICAgICB0aGlzLnNldE1vZGUgPSBzZXRNb2Rl
OworICAgICAgICB0aGlzLnNldEluZGV4ID0gc2V0SW5kZXg7CisgICAgICAgIHRoaXMucmVuZGVy
ID0gcmVuZGVyOworICAgICAgICB0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNl
czsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21y
ZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBXZWJHTEJ1ZmZlclJlbmRlcmVyKCBn
bCwgZXh0ZW5zaW9ucywgaW5mb1JlbmRlciApIHsKKworICAgICAgICB2YXIgbW9kZTsKKworICAg
ICAgICBmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgbW9kZSA9IHZh
bHVlOworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3Vu
dCApIHsKKworICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyggbW9kZSwgc3RhcnQsIGNvdW50ICk7
CisKKyAgICAgICAgICAgIGluZm9SZW5kZXIuY2FsbHMgKys7CisgICAgICAgICAgICBpbmZvUmVu
ZGVyLnZlcnRpY2VzICs9IGNvdW50OworCisgICAgICAgICAgICBpZiAoIG1vZGUgPT09IGdsLlRS
SUFOR0xFUyApIGluZm9SZW5kZXIuZmFjZXMgKz0gY291bnQgLyAzOworCisgICAgICAgIH0KKwor
ICAgICAgICBmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBzdGFydCwgY291bnQg
KSB7CisKKyAgICAgICAgICAgIHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xF
X2luc3RhbmNlZF9hcnJheXMnICk7CisKKyAgICAgICAgICAgIGlmICggZXh0ZW5zaW9uID09PSBu
dWxsICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMQnVm
ZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJk
d2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicg
KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgdmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKKworICAgICAg
ICAgICAgaWYgKCBwb3NpdGlvbi5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgeworCisg
ICAgICAgICAgICAgICAgY291bnQgPSBwb3NpdGlvbi5kYXRhLmNvdW50OworCisgICAgICAgICAg
ICAgICAgZXh0ZW5zaW9uLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSggbW9kZSwgMCwgY291bnQs
IGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisK
KyAgICAgICAgICAgICAgICBleHRlbnNpb24uZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFKCBtb2Rl
LCBzdGFydCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaW5mb1JlbmRlci5jYWxscyArKzsKKyAgICAgICAgICAgIGlu
Zm9SZW5kZXIudmVydGljZXMgKz0gY291bnQgKiBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudDsK
KworICAgICAgICAgICAgaWYgKCBtb2RlID09PSBnbC5UUklBTkdMRVMgKSBpbmZvUmVuZGVyLmZh
Y2VzICs9IGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICogY291bnQgLyAzOworCisgICAgICAg
IH0KKworICAgICAgICAvLworCisgICAgICAgIHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7CisgICAg
ICAgIHRoaXMucmVuZGVyID0gcmVuZGVyOworICAgICAgICB0aGlzLnJlbmRlckluc3RhbmNlcyA9
IHJlbmRlckluc3RhbmNlczsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJk
b29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBXZWJHTEdl
b21ldHJpZXMoIGdsLCBhdHRyaWJ1dGVzLCBpbmZvTWVtb3J5ICkgeworCisgICAgICAgIHZhciBn
ZW9tZXRyaWVzID0ge307CisgICAgICAgIHZhciB3aXJlZnJhbWVBdHRyaWJ1dGVzID0ge307CisK
KyAgICAgICAgZnVuY3Rpb24gb25HZW9tZXRyeURpc3Bvc2UoIGV2ZW50ICkgeworCisgICAgICAg
ICAgICB2YXIgZ2VvbWV0cnkgPSBldmVudC50YXJnZXQ7CisgICAgICAgICAgICB2YXIgYnVmZmVy
Z2VvbWV0cnkgPSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdOworCisgICAgICAgICAgICBpZiAo
IGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgYXR0
cmlidXRlcy5yZW1vdmUoIGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICk7CisKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgZm9yICggdmFyIG5hbWUgaW4gYnVmZmVyZ2VvbWV0cnkuYXR0cmlidXRl
cyApIHsKKworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKCBidWZmZXJnZW9tZXRy
eS5hdHRyaWJ1dGVzWyBuYW1lIF0gKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBn
ZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3Nl
ICk7CisKKyAgICAgICAgICAgIGRlbGV0ZSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdOworCisg
ICAgICAgICAgICAvLyBUT0RPIFJlbW92ZSBkdXBsaWNhdGUgY29kZQorCisgICAgICAgICAgICB2
YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTsKKworICAg
ICAgICAgICAgaWYgKCBhdHRyaWJ1dGUgKSB7CisKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVz
LnJlbW92ZSggYXR0cmlidXRlICk7CisgICAgICAgICAgICAgICAgZGVsZXRlIHdpcmVmcmFtZUF0
dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF07CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
YXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgYnVmZmVyZ2VvbWV0cnkuaWQgXTsKKwor
ICAgICAgICAgICAgaWYgKCBhdHRyaWJ1dGUgKSB7CisKKyAgICAgICAgICAgICAgICBhdHRyaWJ1
dGVzLnJlbW92ZSggYXR0cmlidXRlICk7CisgICAgICAgICAgICAgICAgZGVsZXRlIHdpcmVmcmFt
ZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8KKworICAgICAgICAgICAgaW5mb01lbW9yeS5nZW9tZXRyaWVzIC0tOworCisg
ICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBnZXQoIG9iamVjdCwgZ2VvbWV0cnkgKSB7CisK
KyAgICAgICAgICAgIHZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXNbIGdlb21ldHJ5Lmlk
IF07CisKKyAgICAgICAgICAgIGlmICggYnVmZmVyZ2VvbWV0cnkgKSByZXR1cm4gYnVmZmVyZ2Vv
bWV0cnk7CisKKyAgICAgICAgICAgIGdlb21ldHJ5LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3Nl
Jywgb25HZW9tZXRyeURpc3Bvc2UgKTsKKworICAgICAgICAgICAgaWYgKCBnZW9tZXRyeS5pc0J1
ZmZlckdlb21ldHJ5ICkgeworCisgICAgICAgICAgICAgICAgYnVmZmVyZ2VvbWV0cnkgPSBnZW9t
ZXRyeTsKKworICAgICAgICAgICAgfSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsK
KworICAgICAgICAgICAgICAgIGlmICggZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5ID09PSB1bmRl
ZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5
ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbU9iamVjdCggb2JqZWN0ICk7CisKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJ5
Ll9idWZmZXJHZW9tZXRyeTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZW9tZXRy
aWVzWyBnZW9tZXRyeS5pZCBdID0gYnVmZmVyZ2VvbWV0cnk7CisKKyAgICAgICAgICAgIGluZm9N
ZW1vcnkuZ2VvbWV0cmllcyArKzsKKworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcmdlb21ldHJ5
OworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiB1cGRhdGUoIGdlb21ldHJ5ICkgewor
CisgICAgICAgICAgICB2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDsKKyAgICAgICAgICAgIHZh
ciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOworCisgICAgICAgICAg
ICBpZiAoIGluZGV4ICE9PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy51
cGRhdGUoIGluZGV4LCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiApOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5QXR0cmlidXRlcyApIHsK
KworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudXBkYXRlKCBnZW9tZXRyeUF0dHJpYnV0ZXNb
IG5hbWUgXSwgZ2wuQVJSQVlfQlVGRkVSICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgLy8gbW9ycGggdGFyZ2V0cworCisgICAgICAgICAgICB2YXIgbW9ycGhBdHRyaWJ1dGVzID0g
Z2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzOworCisgICAgICAgICAgICBmb3IgKCB2YXIgbmFtZSBp
biBtb3JwaEF0dHJpYnV0ZXMgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBtb3Jw
aEF0dHJpYnV0ZXNbIG5hbWUgXTsKKworICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwg
bCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
YXR0cmlidXRlcy51cGRhdGUoIGFycmF5WyBpIF0sIGdsLkFSUkFZX0JVRkZFUiApOworCisgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1
bmN0aW9uIGdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKSB7CisKKyAgICAgICAgICAg
IHZhciBhdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdOworCisg
ICAgICAgICAgICBpZiAoIGF0dHJpYnV0ZSApIHJldHVybiBhdHRyaWJ1dGU7CisKKyAgICAgICAg
ICAgIHZhciBpbmRpY2VzID0gW107CisKKyAgICAgICAgICAgIHZhciBnZW9tZXRyeUluZGV4ID0g
Z2VvbWV0cnkuaW5kZXg7CisgICAgICAgICAgICB2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2Vv
bWV0cnkuYXR0cmlidXRlczsKKworICAgICAgICAgICAgLy8gY29uc29sZS50aW1lKCAnd2lyZWZy
YW1lJyApOworCisgICAgICAgICAgICBpZiAoIGdlb21ldHJ5SW5kZXggIT09IG51bGwgKSB7CisK
KyAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5OworCisgICAg
ICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSAr
PSAzICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBhID0gYXJyYXlbIGkgKyAwIF07Cisg
ICAgICAgICAgICAgICAgICAgIHZhciBiID0gYXJyYXlbIGkgKyAxIF07CisgICAgICAgICAgICAg
ICAgICAgIHZhciBjID0gYXJyYXlbIGkgKyAyIF07CisKKyAgICAgICAgICAgICAgICAgICAgaW5k
aWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBnZW9tZXRy
eUF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIg
aSA9IDAsIGwgPSAoIGFycmF5Lmxlbmd0aCAvIDMgKSAtIDE7IGkgPCBsOyBpICs9IDMgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBpICsgMDsKKyAgICAgICAgICAgICAgICAgICAg
dmFyIGIgPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBpICsgMjsKKworICAg
ICAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTsKKworICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb25zb2xl
LnRpbWVFbmQoICd3aXJlZnJhbWUnICk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9IG5ldyAo
IGFycmF5TWF4KCBpbmRpY2VzICkgPiA2NTUzNSA/IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA6IFVp
bnQxNkJ1ZmZlckF0dHJpYnV0ZSApKCBpbmRpY2VzLCAxICk7CisKKyAgICAgICAgICAgIGF0dHJp
YnV0ZXMudXBkYXRlKCBhdHRyaWJ1dGUsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7CisKKyAg
ICAgICAgICAgIHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF0gPSBhdHRyaWJ1dGU7
CisKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGU7CisKKyAgICAgICAgfQorCisgICAgICAg
IHJldHVybiB7CisKKyAgICAgICAgICAgIGdldDogZ2V0LAorICAgICAgICAgICAgdXBkYXRlOiB1
cGRhdGUsCisKKyAgICAgICAgICAgIGdldFdpcmVmcmFtZUF0dHJpYnV0ZTogZ2V0V2lyZWZyYW1l
QXR0cmlidXRlCisKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEBhdXRo
b3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBX
ZWJHTExpZ2h0cygpIHsKKworICAgICAgICB2YXIgbGlnaHRzID0ge307CisKKyAgICAgICAgcmV0
dXJuIHsKKworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoIGxpZ2h0ICkgeworCisgICAgICAg
ICAgICAgICAgaWYgKCBsaWdodHNbIGxpZ2h0LmlkIF0gIT09IHVuZGVmaW5lZCApIHsKKworICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gbGlnaHRzWyBsaWdodC5pZCBdOworCisgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHVuaWZvcm1zOworCisgICAgICAgICAgICAg
ICAgc3dpdGNoICggbGlnaHQudHlwZSApIHsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdE
aXJlY3Rpb25hbExpZ2h0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zID0gewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogbmV3IENvbG9yKCksCisKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzaGFkb3c6IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHNoYWRvd0JpYXM6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93
UmFkaXVzOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd01hcFNpemU6IG5l
dyBWZWN0b3IyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdTcG90TGlnaHQnOgor
ICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMgPSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcG9zaXRpb246IG5ldyBWZWN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbG9yOiBuZXcgQ29sb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0
YW5jZTogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25lQ29zOiAwLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBlbnVtYnJhQ29zOiAwLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGRlY2F5OiAwLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93
OiBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dCaWFzOiAwLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd1JhZGl1czogMSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpCisgICAgICAgICAgICAg
ICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAg
ICAgICAgICAgICAgY2FzZSAnUG9pbnRMaWdodCc6CisgICAgICAgICAgICAgICAgICAgICAgICB1
bmlmb3JtcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3IFZl
Y3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogbmV3IENvbG9yKCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZGVjYXk6IDAsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
aGFkb3c6IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0JpYXM6IDAs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93UmFkaXVzOiAxLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAg
ICAgICAgICAgICAgICAgICBjYXNlICdIZW1pc3BoZXJlTGlnaHQnOgorICAgICAgICAgICAgICAg
ICAgICAgICAgdW5pZm9ybXMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0
aW9uOiBuZXcgVmVjdG9yMygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNreUNvbG9y
OiBuZXcgQ29sb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91bmRDb2xvcjog
bmV3IENvbG9yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdSZWN0QXJlYUxpZ2h0
JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zID0geworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbG9yOiBuZXcgQ29sb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBoYWxmV2lkdGg6IG5ldyBWZWN0b3IzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aGFsZkhlaWdodDogbmV3IFZlY3RvcjMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IFRPRE8gKGFiZWxuYXRpb24pOiBzZXQgUmVjdEFyZWFMaWdodCBzaGFkb3cgdW5pZm9ybXMKKyAg
ICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK
KworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxpZ2h0c1sgbGlnaHQuaWQg
XSA9IHVuaWZvcm1zOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHVuaWZvcm1zOworCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEBhdXRo
b3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBX
ZWJHTE9iamVjdHMoIGdsLCBnZW9tZXRyaWVzLCBpbmZvUmVuZGVyICkgeworCisgICAgICAgIHZh
ciB1cGRhdGVMaXN0ID0ge307CisKKyAgICAgICAgZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QgKSB7
CisKKyAgICAgICAgICAgIHZhciBmcmFtZSA9IGluZm9SZW5kZXIuZnJhbWU7CisKKyAgICAgICAg
ICAgIHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTsKKyAgICAgICAgICAgIHZhciBidWZm
ZXJnZW9tZXRyeSA9IGdlb21ldHJpZXMuZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICk7CisKKyAgICAg
ICAgICAgIC8vIFVwZGF0ZSBvbmNlIHBlciBmcmFtZQorCisgICAgICAgICAgICBpZiAoIHVwZGF0
ZUxpc3RbIGJ1ZmZlcmdlb21ldHJ5LmlkIF0gIT09IGZyYW1lICkgeworCisgICAgICAgICAgICAg
ICAgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgeworCisgICAgICAgICAgICAgICAgICAgIGJ1
ZmZlcmdlb21ldHJ5LnVwZGF0ZUZyb21PYmplY3QoIG9iamVjdCApOworCisgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgZ2VvbWV0cmllcy51cGRhdGUoIGJ1ZmZlcmdlb21ldHJ5
ICk7CisKKyAgICAgICAgICAgICAgICB1cGRhdGVMaXN0WyBidWZmZXJnZW9tZXRyeS5pZCBdID0g
ZnJhbWU7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcmdlb21l
dHJ5OworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBjbGVhcigpIHsKKworICAgICAg
ICAgICAgdXBkYXRlTGlzdCA9IHt9OworCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gewor
CisgICAgICAgICAgICB1cGRhdGU6IHVwZGF0ZSwKKyAgICAgICAgICAgIGNsZWFyOiBjbGVhcgor
CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAv
IGh0dHA6Ly9tcmRvb2IuY29tLworICAgICAqLworCisgICAgZnVuY3Rpb24gYWRkTGluZU51bWJl
cnMoIHN0cmluZyApIHsKKworICAgICAgICB2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoICdcbicg
KTsKKworICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkgKysgKSB7
CisKKyAgICAgICAgICAgIGxpbmVzWyBpIF0gPSAoIGkgKyAxICkgKyAnOiAnICsgbGluZXNbIGkg
XTsKKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oICdcbicgKTsKKwor
ICAgIH0KKworICAgIGZ1bmN0aW9uIFdlYkdMU2hhZGVyKCBnbCwgdHlwZSwgc3RyaW5nICkgewor
CisgICAgICAgIHZhciBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIHR5cGUgKTsKKworICAgICAg
ICBnbC5zaGFkZXJTb3VyY2UoIHNoYWRlciwgc3RyaW5nICk7CisgICAgICAgIGdsLmNvbXBpbGVT
aGFkZXIoIHNoYWRlciApOworCisgICAgICAgIGlmICggZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKCBz
aGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTICkgPT09IGZhbHNlICkgeworCisgICAgICAgICAgICBj
b25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTaGFkZXI6IFNoYWRlciBjb3VsZG5cJ3QgY29tcGls
ZS4nICk7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmICggZ2wuZ2V0U2hhZGVySW5mb0xvZygg
c2hhZGVyICkgIT09ICcnICkgeworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5X
ZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpJywgdHlwZSA9PT0gZ2wuVkVSVEVYX1NI
QURFUiA/ICd2ZXJ0ZXgnIDogJ2ZyYWdtZW50JywgZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVy
ICksIGFkZExpbmVOdW1iZXJzKCBzdHJpbmcgKSApOworCisgICAgICAgIH0KKworICAgICAgICAv
LyAtLWVuYWJsZS1wcml2aWxlZ2VkLXdlYmdsLWV4dGVuc2lvbgorICAgICAgICAvLyBjb25zb2xl
LmxvZyggdHlwZSwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRU
cmFuc2xhdGVkU2hhZGVyU291cmNlKCBzaGFkZXIgKSApOworCisgICAgICAgIHJldHVybiBzaGFk
ZXI7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9t
cmRvb2IuY29tLworICAgICAqLworCisgICAgdmFyIHByb2dyYW1JZENvdW50ID0gMDsKKworICAg
IGZ1bmN0aW9uIGdldEVuY29kaW5nQ29tcG9uZW50cyggZW5jb2RpbmcgKSB7CisKKyAgICAgICAg
c3dpdGNoICggZW5jb2RpbmcgKSB7CisKKyAgICAgICAgICAgIGNhc2UgTGluZWFyRW5jb2Rpbmc6
CisgICAgICAgICAgICAgICAgcmV0dXJuIFsgJ0xpbmVhcicsJyggdmFsdWUgKScgXTsKKyAgICAg
ICAgICAgIGNhc2Ugc1JHQkVuY29kaW5nOgorICAgICAgICAgICAgICAgIHJldHVybiBbICdzUkdC
JywnKCB2YWx1ZSApJyBdOworICAgICAgICAgICAgY2FzZSBSR0JFRW5jb2Rpbmc6CisgICAgICAg
ICAgICAgICAgcmV0dXJuIFsgJ1JHQkUnLCcoIHZhbHVlICknIF07CisgICAgICAgICAgICBjYXNl
IFJHQk03RW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFsgJ1JHQk0nLCcoIHZhbHVl
LCA3LjAgKScgXTsKKyAgICAgICAgICAgIGNhc2UgUkdCTTE2RW5jb2Rpbmc6CisgICAgICAgICAg
ICAgICAgcmV0dXJuIFsgJ1JHQk0nLCcoIHZhbHVlLCAxNi4wICknIF07CisgICAgICAgICAgICBj
YXNlIFJHQkRFbmNvZGluZzoKKyAgICAgICAgICAgICAgICByZXR1cm4gWyAnUkdCRCcsJyggdmFs
dWUsIDI1Ni4wICknIF07CisgICAgICAgICAgICBjYXNlIEdhbW1hRW5jb2Rpbmc6CisgICAgICAg
ICAgICAgICAgcmV0dXJuIFsgJ0dhbW1hJywnKCB2YWx1ZSwgZmxvYXQoIEdBTU1BX0ZBQ1RPUiAp
ICknIF07CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBF
cnJvciggJ3Vuc3VwcG9ydGVkIGVuY29kaW5nOiAnICsgZW5jb2RpbmcgKTsKKworICAgICAgICB9
CisKKyAgICB9CisKKyAgICBmdW5jdGlvbiBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oIGZ1bmN0
aW9uTmFtZSwgZW5jb2RpbmcgKSB7CisKKyAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBnZXRFbmNv
ZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7CisgICAgICAgIHJldHVybiAidmVjNCAiICsgZnVu
Y3Rpb25OYW1lICsgIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICIgKyBjb21wb25lbnRzWyAwIF0g
KyAiVG9MaW5lYXIiICsgY29tcG9uZW50c1sgMSBdICsgIjsgfSI7CisKKyAgICB9CisKKyAgICBm
dW5jdGlvbiBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2Rpbmcg
KSB7CisKKyAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVu
Y29kaW5nICk7CisgICAgICAgIHJldHVybiAidmVjNCAiICsgZnVuY3Rpb25OYW1lICsgIiggdmVj
NCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvIiArIGNvbXBvbmVudHNbIDAgXSArIGNvbXBvbmVu
dHNbIDEgXSArICI7IH0iOworCisgICAgfQorCisgICAgZnVuY3Rpb24gZ2V0VG9uZU1hcHBpbmdG
dW5jdGlvbiggZnVuY3Rpb25OYW1lLCB0b25lTWFwcGluZyApIHsKKworICAgICAgICB2YXIgdG9u
ZU1hcHBpbmdOYW1lOworCisgICAgICAgIHN3aXRjaCAoIHRvbmVNYXBwaW5nICkgeworCisgICAg
ICAgICAgICBjYXNlIExpbmVhclRvbmVNYXBwaW5nOgorICAgICAgICAgICAgICAgIHRvbmVNYXBw
aW5nTmFtZSA9ICJMaW5lYXIiOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAg
ICBjYXNlIFJlaW5oYXJkVG9uZU1hcHBpbmc6CisgICAgICAgICAgICAgICAgdG9uZU1hcHBpbmdO
YW1lID0gIlJlaW5oYXJkIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAg
Y2FzZSBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmc6CisgICAgICAgICAgICAgICAgdG9uZU1hcHBpbmdO
YW1lID0gIlVuY2hhcnRlZDIiOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAg
ICBjYXNlIENpbmVvblRvbmVNYXBwaW5nOgorICAgICAgICAgICAgICAgIHRvbmVNYXBwaW5nTmFt
ZSA9ICJPcHRpbWl6ZWRDaW5lb24iOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciggJ3Vuc3VwcG9y
dGVkIHRvbmVNYXBwaW5nOiAnICsgdG9uZU1hcHBpbmcgKTsKKworICAgICAgICB9CisKKyAgICAg
ICAgcmV0dXJuICJ2ZWMzICIgKyBmdW5jdGlvbk5hbWUgKyAiKCB2ZWMzIGNvbG9yICkgeyByZXR1
cm4gIiArIHRvbmVNYXBwaW5nTmFtZSArICJUb25lTWFwcGluZyggY29sb3IgKTsgfSI7CisKKyAg
ICB9CisKKyAgICBmdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoIGV4dGVuc2lvbnMsIHBhcmFt
ZXRlcnMsIHJlbmRlcmVyRXh0ZW5zaW9ucyApIHsKKworICAgICAgICBleHRlbnNpb25zID0gZXh0
ZW5zaW9ucyB8fCB7fTsKKworICAgICAgICB2YXIgY2h1bmtzID0gWworICAgICAgICAgICAgKCBl
eHRlbnNpb25zLmRlcml2YXRpdmVzIHx8IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWIHx8IHBhcmFt
ZXRlcnMuYnVtcE1hcCB8fCBwYXJhbWV0ZXJzLm5vcm1hbE1hcCB8fCBwYXJhbWV0ZXJzLmZsYXRT
aGFkaW5nICkgPyAnI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFi
bGUnIDogJycsCisgICAgICAgICAgICAoIGV4dGVuc2lvbnMuZnJhZ0RlcHRoIHx8IHBhcmFtZXRl
cnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdF
WFRfZnJhZ19kZXB0aCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxl
JyA6ICcnLAorICAgICAgICAgICAgKCBleHRlbnNpb25zLmRyYXdCdWZmZXJzICkgJiYgcmVuZGVy
ZXJFeHRlbnNpb25zLmdldCggJ1dFQkdMX2RyYXdfYnVmZmVycycgKSA/ICcjZXh0ZW5zaW9uIEdM
X0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlJyA6ICcnLAorICAgICAgICAgICAgKCBleHRlbnNp
b25zLnNoYWRlclRleHR1cmVMT0QgfHwgcGFyYW1ldGVycy5lbnZNYXAgKSAmJiByZW5kZXJlckV4
dGVuc2lvbnMuZ2V0KCAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcgKSA/ICcjZXh0ZW5zaW9uIEdM
X0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiBlbmFibGUnIDogJycKKyAgICAgICAgXTsKKworICAg
ICAgICByZXR1cm4gY2h1bmtzLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xuJyAp
OworCisgICAgfQorCisgICAgZnVuY3Rpb24gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICkgewor
CisgICAgICAgIHZhciBjaHVua3MgPSBbXTsKKworICAgICAgICBmb3IgKCB2YXIgbmFtZSBpbiBk
ZWZpbmVzICkgeworCisgICAgICAgICAgICB2YXIgdmFsdWUgPSBkZWZpbmVzWyBuYW1lIF07CisK
KyAgICAgICAgICAgIGlmICggdmFsdWUgPT09IGZhbHNlICkgY29udGludWU7CisKKyAgICAgICAg
ICAgIGNodW5rcy5wdXNoKCAnI2RlZmluZSAnICsgbmFtZSArICcgJyArIHZhbHVlICk7CisKKyAg
ICAgICAgfQorCisgICAgICAgIHJldHVybiBjaHVua3Muam9pbiggJ1xuJyApOworCisgICAgfQor
CisgICAgZnVuY3Rpb24gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtLCBpZGVu
dGlmaWVycyApIHsKKworICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHt9OworCisgICAgICAgIHZh
ciBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZFX0FUVFJJQlVU
RVMgKTsKKworICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyBpICsrICkgeworCisgICAg
ICAgICAgICB2YXIgaW5mbyA9IGdsLmdldEFjdGl2ZUF0dHJpYiggcHJvZ3JhbSwgaSApOworICAg
ICAgICAgICAgdmFyIG5hbWUgPSBpbmZvLm5hbWU7CisKKyAgICAgICAgICAgIC8vIGNvbnNvbGUu
bG9nKCJUSFJFRS5XZWJHTFByb2dyYW06IEFDVElWRSBWRVJURVggQVRUUklCVVRFOiIsIG5hbWUs
IGkgKTsKKworICAgICAgICAgICAgYXR0cmlidXRlc1sgbmFtZSBdID0gZ2wuZ2V0QXR0cmliTG9j
YXRpb24oIHByb2dyYW0sIG5hbWUgKTsKKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGF0
dHJpYnV0ZXM7CisKKyAgICB9CisKKyAgICBmdW5jdGlvbiBmaWx0ZXJFbXB0eUxpbmUoIHN0cmlu
ZyApIHsKKworICAgICAgICByZXR1cm4gc3RyaW5nICE9PSAnJzsKKworICAgIH0KKworICAgIGZ1
bmN0aW9uIHJlcGxhY2VMaWdodE51bXMoIHN0cmluZywgcGFyYW1ldGVycyApIHsKKworICAgICAg
ICByZXR1cm4gc3RyaW5nCisgICAgICAgICAgICAucmVwbGFjZSggL05VTV9ESVJfTElHSFRTL2cs
IHBhcmFtZXRlcnMubnVtRGlyTGlnaHRzICkKKyAgICAgICAgICAgIC5yZXBsYWNlKCAvTlVNX1NQ
T1RfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0cyApCisgICAgICAgICAgICAucmVw
bGFjZSggL05VTV9SRUNUX0FSRUFfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUmVjdEFyZWFMaWdo
dHMgKQorICAgICAgICAgICAgLnJlcGxhY2UoIC9OVU1fUE9JTlRfTElHSFRTL2csIHBhcmFtZXRl
cnMubnVtUG9pbnRMaWdodHMgKQorICAgICAgICAgICAgLnJlcGxhY2UoIC9OVU1fSEVNSV9MSUdI
VFMvZywgcGFyYW1ldGVycy5udW1IZW1pTGlnaHRzICk7CisKKyAgICB9CisKKyAgICBmdW5jdGlv
biBwYXJzZUluY2x1ZGVzKCBzdHJpbmcgKSB7CisKKyAgICAgICAgdmFyIHBhdHRlcm4gPSAvXlsg
XHRdKiNpbmNsdWRlICs8KFtcd1xkLl0rKT4vZ207CisKKyAgICAgICAgZnVuY3Rpb24gcmVwbGFj
ZSggbWF0Y2gsIGluY2x1ZGUgKSB7CisKKyAgICAgICAgICAgIHZhciByZXBsYWNlID0gU2hhZGVy
Q2h1bmtbIGluY2x1ZGUgXTsKKworICAgICAgICAgICAgaWYgKCByZXBsYWNlID09PSB1bmRlZmlu
ZWQgKSB7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoICdDYW4gbm90IHJlc29s
dmUgI2luY2x1ZGUgPCcgKyBpbmNsdWRlICsgJz4nICk7CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgcmV0dXJuIHBhcnNlSW5jbHVkZXMoIHJlcGxhY2UgKTsKKworICAgICAgICB9CisK
KyAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBwYXR0ZXJuLCByZXBsYWNlICk7CisKKyAg
ICB9CisKKyAgICBmdW5jdGlvbiB1bnJvbGxMb29wcyggc3RyaW5nICkgeworCisgICAgICAgIHZh
ciBwYXR0ZXJuID0gL2ZvciBcKCBpbnQgaSBcPSAoXGQrKVw7IGkgPCAoXGQrKVw7IGkgXCtcKyBc
KSBceyhbXHNcU10rPykoPz1cfSlcfS9nOworCisgICAgICAgIGZ1bmN0aW9uIHJlcGxhY2UoIG1h
dGNoLCBzdGFydCwgZW5kLCBzbmlwcGV0ICkgeworCisgICAgICAgICAgICB2YXIgdW5yb2xsID0g
Jyc7CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gcGFyc2VJbnQoIHN0YXJ0ICk7IGkgPCBw
YXJzZUludCggZW5kICk7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB1bnJvbGwgKz0gc25p
cHBldC5yZXBsYWNlKCAvXFsgaSBcXS9nLCAnWyAnICsgaSArICcgXScgKTsKKworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICByZXR1cm4gdW5yb2xsOworCisgICAgICAgIH0KKworICAgICAg
ICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTsKKworICAgIH0KKwor
ICAgIGZ1bmN0aW9uIFdlYkdMUHJvZ3JhbSggcmVuZGVyZXIsIGNvZGUsIG1hdGVyaWFsLCBzaGFk
ZXIsIHBhcmFtZXRlcnMgKSB7CisKKyAgICAgICAgdmFyIGdsID0gcmVuZGVyZXIuY29udGV4dDsK
KworICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IG1hdGVyaWFsLmV4dGVuc2lvbnM7CisgICAgICAg
IHZhciBkZWZpbmVzID0gbWF0ZXJpYWwuZGVmaW5lczsKKworICAgICAgICB2YXIgdmVydGV4U2hh
ZGVyID0gc2hhZGVyLnZlcnRleFNoYWRlcjsKKyAgICAgICAgdmFyIGZyYWdtZW50U2hhZGVyID0g
c2hhZGVyLmZyYWdtZW50U2hhZGVyOworCisgICAgICAgIHZhciBzaGFkb3dNYXBUeXBlRGVmaW5l
ID0gJ1NIQURPV01BUF9UWVBFX0JBU0lDJzsKKworICAgICAgICBpZiAoIHBhcmFtZXRlcnMuc2hh
ZG93TWFwVHlwZSA9PT0gUENGU2hhZG93TWFwICkgeworCisgICAgICAgICAgICBzaGFkb3dNYXBU
eXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRic7CisKKyAgICAgICAgfSBlbHNlIGlmICgg
cGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTb2Z0U2hhZG93TWFwICkgeworCisgICAg
ICAgICAgICBzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRl9TT0ZUJzsK
KworICAgICAgICB9CisKKyAgICAgICAgdmFyIGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZ
UEVfQ1VCRSc7CisgICAgICAgIHZhciBlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JF
RkxFQ1RJT04nOworICAgICAgICB2YXIgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JM
RU5ESU5HX01VTFRJUExZJzsKKworICAgICAgICBpZiAoIHBhcmFtZXRlcnMuZW52TWFwICkgewor
CisgICAgICAgICAgICBzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyApIHsKKworICAg
ICAgICAgICAgICAgIGNhc2UgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOgorICAgICAgICAgICAgICAg
IGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOgorICAgICAgICAgICAgICAgICAgICBlbnZNYXBU
eXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnOworICAgICAgICAgICAgICAgICAgICBicmVh
azsKKworICAgICAgICAgICAgICAgIGNhc2UgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6CisgICAg
ICAgICAgICAgICAgY2FzZSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZzoKKyAgICAgICAgICAgICAg
ICAgICAgZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFX1VWJzsKKyAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEVxdWlyZWN0YW5ndWxh
clJlZmxlY3Rpb25NYXBwaW5nOgorICAgICAgICAgICAgICAgIGNhc2UgRXF1aXJlY3Rhbmd1bGFy
UmVmcmFjdGlvbk1hcHBpbmc6CisgICAgICAgICAgICAgICAgICAgIGVudk1hcFR5cGVEZWZpbmUg
PSAnRU5WTUFQX1RZUEVfRVFVSVJFQyc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgICAgICAgICAgY2FzZSBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzoKKyAgICAgICAg
ICAgICAgICAgICAgZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9TUEhFUkUnOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBz
d2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyApIHsKKworICAgICAgICAgICAgICAgIGNh
c2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOgorICAgICAgICAgICAgICAgIGNhc2UgRXF1aXJlY3Rh
bmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6CisgICAgICAgICAgICAgICAgICAgIGVudk1hcE1vZGVE
ZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGUkFDVElPTic7CisgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoIG1hdGVyaWFsLmNv
bWJpbmUgKSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIE11bHRpcGx5T3BlcmF0aW9uOgorICAg
ICAgICAgICAgICAgICAgICBlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdf
TVVMVElQTFknOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAg
IGNhc2UgTWl4T3BlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICBlbnZNYXBCbGVuZGluZ0Rl
ZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTUlYJzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisKKyAgICAgICAgICAgICAgICBjYXNlIEFkZE9wZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAg
ICAgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX0FERCc7CisgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAg
ICAgIHZhciBnYW1tYUZhY3RvckRlZmluZSA9ICggcmVuZGVyZXIuZ2FtbWFGYWN0b3IgPiAwICkg
PyByZW5kZXJlci5nYW1tYUZhY3RvciA6IDEuMDsKKworICAgICAgICAvLyBjb25zb2xlLmxvZygg
J2J1aWxkaW5nIG5ldyBwcm9ncmFtICcgKTsKKworICAgICAgICAvLworCisgICAgICAgIHZhciBj
dXN0b21FeHRlbnNpb25zID0gZ2VuZXJhdGVFeHRlbnNpb25zKCBleHRlbnNpb25zLCBwYXJhbWV0
ZXJzLCByZW5kZXJlci5leHRlbnNpb25zICk7CisKKyAgICAgICAgdmFyIGN1c3RvbURlZmluZXMg
PSBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKTsKKworICAgICAgICAvLworCisgICAgICAgIHZh
ciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpOworCisgICAgICAgIHZhciBwcmVmaXhWZXJ0
ZXgsIHByZWZpeEZyYWdtZW50OworCisgICAgICAgIGlmICggbWF0ZXJpYWwuaXNSYXdTaGFkZXJN
YXRlcmlhbCApIHsKKworICAgICAgICAgICAgcHJlZml4VmVydGV4ID0gWworCisgICAgICAgICAg
ICAgICAgY3VzdG9tRGVmaW5lcywKKworICAgICAgICAgICAgICAgICdcbicKKworICAgICAgICAg
ICAgXS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcbicgKTsKKworICAgICAgICAg
ICAgcHJlZml4RnJhZ21lbnQgPSBbCisKKyAgICAgICAgICAgICAgICBjdXN0b21FeHRlbnNpb25z
LAorICAgICAgICAgICAgICAgIGN1c3RvbURlZmluZXMsCisKKyAgICAgICAgICAgICAgICAnXG4n
CisKKyAgICAgICAgICAgIF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXG4nICk7
CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgcHJlZml4VmVydGV4ID0gWworCisg
ICAgICAgICAgICAgICAgJ3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZs
b2F0OycsCisgICAgICAgICAgICAgICAgJ3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNp
b24gKyAnIGludDsnLAorCisgICAgICAgICAgICAgICAgJyNkZWZpbmUgU0hBREVSX05BTUUgJyAr
IHNoYWRlci5uYW1lLAorCisgICAgICAgICAgICAgICAgY3VzdG9tRGVmaW5lcywKKworICAgICAg
ICAgICAgICAgIHBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFZF
UlRFWF9URVhUVVJFUycgOiAnJywKKworICAgICAgICAgICAgICAgICcjZGVmaW5lIEdBTU1BX0ZB
Q1RPUiAnICsgZ2FtbWFGYWN0b3JEZWZpbmUsCisKKyAgICAgICAgICAgICAgICAnI2RlZmluZSBN
QVhfQk9ORVMgJyArIHBhcmFtZXRlcnMubWF4Qm9uZXMsCisgICAgICAgICAgICAgICAgKCBwYXJh
bWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAn
JywKKyAgICAgICAgICAgICAgICAoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9n
RXhwICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJywKKworICAgICAgICAgICAgICAgIHBhcmFt
ZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJywKKyAgICAgICAgICAgICAgICBwYXJh
bWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsCisgICAgICAgICAgICAg
ICAgcGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcn
LAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElH
SFRNQVAnIDogJycsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5hb01hcCA/ICcjZGVmaW5l
IFVTRV9BT01BUCcgOiAnJywKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFw
ID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLAorICAgICAgICAgICAgICAgIHBhcmFt
ZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLAorICAgICAgICAgICAg
ICAgIHBhcmFtZXRlcnMubm9ybWFsTWFwID8gJyNkZWZpbmUgVVNFX05PUk1BTE1BUCcgOiAnJywK
KyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcCAmJiBwYXJhbWV0ZXJz
LnN1cHBvcnRzVmVydGV4VGV4dHVyZXMgPyAnI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQJyA6
ICcnLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBV
U0VfU1BFQ1VMQVJNQVAnIDogJycsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5yb3VnaG5l
c3NNYXAgPyAnI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQJyA6ICcnLAorICAgICAgICAgICAgICAg
IHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCcgOiAn
JywKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FM
UEhBTUFQJyA6ICcnLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMudmVydGV4Q29sb3JzID8g
JyNkZWZpbmUgVVNFX0NPTE9SJyA6ICcnLAorCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5m
bGF0U2hhZGluZyA/ICcjZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLAorCisgICAgICAgICAgICAg
ICAgcGFyYW1ldGVycy5za2lubmluZyA/ICcjZGVmaW5lIFVTRV9TS0lOTklORycgOiAnJywKKyAg
ICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnVzZVZlcnRleFRleHR1cmUgPyAnI2RlZmluZSBCT05F
X1RFWFRVUkUnIDogJycsCisKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0
cyA/ICcjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMnIDogJycsCisgICAgICAgICAgICAgICAgcGFy
YW1ldGVycy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2Ug
PyAnI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTJyA6ICcnLAorICAgICAgICAgICAgICAgIHBhcmFt
ZXRlcnMuZG91YmxlU2lkZWQgPyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsCisgICAgICAg
ICAgICAgICAgcGFyYW1ldGVycy5mbGlwU2lkZWQgPyAnI2RlZmluZSBGTElQX1NJREVEJyA6ICcn
LAorCisgICAgICAgICAgICAgICAgJyNkZWZpbmUgTlVNX0NMSVBQSU5HX1BMQU5FUyAnICsgcGFy
YW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcywKKworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMu
c2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsCisgICAgICAg
ICAgICAgICAgcGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgJyArIHNoYWRv
d01hcFR5cGVEZWZpbmUgOiAnJywKKworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2l6ZUF0
dGVudWF0aW9uID8gJyNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTicgOiAnJywKKworICAgICAg
ICAgICAgICAgIHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVT
RV9MT0dERVBUSEJVRicgOiAnJywKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmxvZ2FyaXRo
bWljRGVwdGhCdWZmZXIgJiYgcmVuZGVyZXIuZXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0
aCcgKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsCisKKyAgICAgICAgICAg
ICAgICAndW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OycsCisgICAgICAgICAgICAgICAgJ3VuaWZv
cm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7JywKKyAgICAgICAgICAgICAgICAndW5pZm9ybSBtYXQ0
IHByb2plY3Rpb25NYXRyaXg7JywKKyAgICAgICAgICAgICAgICAndW5pZm9ybSBtYXQ0IHZpZXdN
YXRyaXg7JywKKyAgICAgICAgICAgICAgICAndW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsnLAor
ICAgICAgICAgICAgICAgICd1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247JywKKworICAgICAg
ICAgICAgICAgICdhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsnLAorICAgICAgICAgICAgICAgICdh
dHRyaWJ1dGUgdmVjMyBub3JtYWw7JywKKyAgICAgICAgICAgICAgICAnYXR0cmlidXRlIHZlYzIg
dXY7JywKKworICAgICAgICAgICAgICAgICcjaWZkZWYgVVNFX0NPTE9SJywKKworICAgICAgICAg
ICAgICAgICcgICBhdHRyaWJ1dGUgdmVjMyBjb2xvcjsnLAorCisgICAgICAgICAgICAgICAgJyNl
bmRpZicsCisKKyAgICAgICAgICAgICAgICAnI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMnLAorCisg
ICAgICAgICAgICAgICAgJyAgIGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsnLAorICAgICAg
ICAgICAgICAgICcgICBhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDE7JywKKyAgICAgICAgICAg
ICAgICAnICAgYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQyOycsCisgICAgICAgICAgICAgICAg
JyAgIGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsnLAorCisgICAgICAgICAgICAgICAgJyAg
ICNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTJywKKworICAgICAgICAgICAgICAgICcgICAgICAgYXR0
cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwwOycsCisgICAgICAgICAgICAgICAgJyAgICAgICBhdHRy
aWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDE7JywKKyAgICAgICAgICAgICAgICAnICAgICAgIGF0dHJp
YnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsnLAorICAgICAgICAgICAgICAgICcgICAgICAgYXR0cmli
dXRlIHZlYzMgbW9ycGhOb3JtYWwzOycsCisKKyAgICAgICAgICAgICAgICAnICAgI2Vsc2UnLAor
CisgICAgICAgICAgICAgICAgJyAgICAgICBhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7JywK
KyAgICAgICAgICAgICAgICAnICAgICAgIGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsnLAor
ICAgICAgICAgICAgICAgICcgICAgICAgYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OycsCisg
ICAgICAgICAgICAgICAgJyAgICAgICBhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7JywKKwor
ICAgICAgICAgICAgICAgICcgICAjZW5kaWYnLAorCisgICAgICAgICAgICAgICAgJyNlbmRpZics
CisKKyAgICAgICAgICAgICAgICAnI2lmZGVmIFVTRV9TS0lOTklORycsCisKKyAgICAgICAgICAg
ICAgICAnICAgYXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OycsCisgICAgICAgICAgICAgICAgJyAg
IGF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7JywKKworICAgICAgICAgICAgICAgICcjZW5kaWYn
LAorCisgICAgICAgICAgICAgICAgJ1xuJworCisgICAgICAgICAgICBdLmZpbHRlciggZmlsdGVy
RW1wdHlMaW5lICkuam9pbiggJ1xuJyApOworCisgICAgICAgICAgICBwcmVmaXhGcmFnbWVudCA9
IFsKKworICAgICAgICAgICAgICAgIGN1c3RvbUV4dGVuc2lvbnMsCisKKyAgICAgICAgICAgICAg
ICAncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgZmxvYXQ7JywKKyAgICAg
ICAgICAgICAgICAncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50Oycs
CisKKyAgICAgICAgICAgICAgICAnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgc2hhZGVyLm5hbWUs
CisKKyAgICAgICAgICAgICAgICBjdXN0b21EZWZpbmVzLAorCisgICAgICAgICAgICAgICAgcGFy
YW1ldGVycy5hbHBoYVRlc3QgPyAnI2RlZmluZSBBTFBIQVRFU1QgJyArIHBhcmFtZXRlcnMuYWxw
aGFUZXN0IDogJycsCisKKyAgICAgICAgICAgICAgICAnI2RlZmluZSBHQU1NQV9GQUNUT1IgJyAr
IGdhbW1hRmFjdG9yRGVmaW5lLAorCisgICAgICAgICAgICAgICAgKCBwYXJhbWV0ZXJzLnVzZUZv
ZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJywKKyAgICAgICAg
ICAgICAgICAoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nRXhwICkgPyAnI2Rl
ZmluZSBGT0dfRVhQMicgOiAnJywKKworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMubWFwID8g
JyNkZWZpbmUgVVNFX01BUCcgOiAnJywKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmVudk1h
cCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVy
cy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwVHlwZURlZmluZSA6ICcnLAorICAgICAgICAg
ICAgICAgIHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcE1vZGVEZWZpbmUg
OiAnJywKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBl
bnZNYXBCbGVuZGluZ0RlZmluZSA6ICcnLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMubGln
aHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsCisgICAgICAgICAgICAgICAgcGFy
YW1ldGVycy5hb01hcCA/ICcjZGVmaW5lIFVTRV9BT01BUCcgOiAnJywKKyAgICAgICAgICAgICAg
ICBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcn
LAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1Q
TUFQJyA6ICcnLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMubm9ybWFsTWFwID8gJyNkZWZp
bmUgVVNFX05PUk1BTE1BUCcgOiAnJywKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNwZWN1
bGFyTWFwID8gJyNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQJyA6ICcnLAorICAgICAgICAgICAgICAg
IHBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCcgOiAn
JywKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVT
RV9NRVRBTE5FU1NNQVAnIDogJycsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5hbHBoYU1h
cCA/ICcjZGVmaW5lIFVTRV9BTFBIQU1BUCcgOiAnJywKKyAgICAgICAgICAgICAgICBwYXJhbWV0
ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJywKKworICAgICAgICAg
ICAgICAgIHBhcmFtZXRlcnMuZ3JhZGllbnRNYXAgPyAnI2RlZmluZSBVU0VfR1JBRElFTlRNQVAn
IDogJycsCisKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID8gJyNkZWZp
bmUgRkxBVF9TSEFERUQnIDogJycsCisKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmRvdWJs
ZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLAorICAgICAgICAgICAgICAgIHBh
cmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJywKKworICAgICAg
ICAgICAgICAgICcjZGVmaW5lIE5VTV9DTElQUElOR19QTEFORVMgJyArIHBhcmFtZXRlcnMubnVt
Q2xpcHBpbmdQbGFuZXMsCisgICAgICAgICAgICAgICAgJyNkZWZpbmUgVU5JT05fQ0xJUFBJTkdf
UExBTkVTICcgKyAocGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyAtIHBhcmFtZXRlcnMubnVt
Q2xpcEludGVyc2VjdGlvbiksCisKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNoYWRvd01h
cEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLAorICAgICAgICAgICAgICAg
IHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBl
RGVmaW5lIDogJycsCisKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRB
bHBoYSA/ICIjZGVmaW5lIFBSRU1VTFRJUExJRURfQUxQSEEiIDogJycsCisKKyAgICAgICAgICAg
ICAgICBwYXJhbWV0ZXJzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzID8gIiNkZWZpbmUgUEhZU0lD
QUxMWV9DT1JSRUNUX0xJR0hUUyIgOiAnJywKKworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMu
bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJywK
KyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgJiYgcmVu
ZGVyZXIuZXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZGVmaW5lIFVTRV9M
T0dERVBUSEJVRl9FWFQnIDogJycsCisKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmVudk1h
cCAmJiByZW5kZXJlci5leHRlbnNpb25zLmdldCggJ0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkg
PyAnI2RlZmluZSBURVhUVVJFX0xPRF9FWFQnIDogJycsCisKKyAgICAgICAgICAgICAgICAndW5p
Zm9ybSBtYXQ0IHZpZXdNYXRyaXg7JywKKyAgICAgICAgICAgICAgICAndW5pZm9ybSB2ZWMzIGNh
bWVyYVBvc2l0aW9uOycsCisKKyAgICAgICAgICAgICAgICAoIHBhcmFtZXRlcnMudG9uZU1hcHBp
bmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/ICIjZGVmaW5lIFRPTkVfTUFQUElORyIgOiAnJywKKyAg
ICAgICAgICAgICAgICAoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcg
KSA/IFNoYWRlckNodW5rWyAndG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAgLy8g
dGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB0b25l
TWFwcGluZygpIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3cKKyAgICAgICAgICAgICAgICAoIHBhcmFt
ZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IGdldFRvbmVNYXBwaW5nRnVu
Y3Rpb24oICJ0b25lTWFwcGluZyIsIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgKSA6ICcnLAorCisg
ICAgICAgICAgICAgICAgcGFyYW1ldGVycy5kaXRoZXJpbmcgPyAnI2RlZmluZSBESVRIRVJJTkcn
IDogJycsCisKKyAgICAgICAgICAgICAgICAoIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgfHwg
cGFyYW1ldGVycy5tYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nIHx8IHBh
cmFtZXRlcnMuZW1pc3NpdmVNYXBFbmNvZGluZyApID8gU2hhZGVyQ2h1bmtbICdlbmNvZGluZ3Nf
cGFyc19mcmFnbWVudCcgXSA6ICcnLCAvLyB0aGlzIGNvZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNh
dXNlIGl0IGlzIHVzZWQgYnkgdGhlIHZhcmlvdXMgZW5jb2RpbmcvZGVjb2RpbmcgZnVuY3Rpb24g
ZGVmaW5lZCBiZWxvdworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgPyBn
ZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdtYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5t
YXBFbmNvZGluZyApIDogJycsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5lbnZNYXBFbmNv
ZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ2Vudk1hcFRleGVsVG9MaW5lYXInLCBw
YXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nICkgOiAnJywKKyAgICAgICAgICAgICAgICBwYXJhbWV0
ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbWlz
c2l2ZU1hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA6
ICcnLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgPyBnZXRUZXhl
bEVuY29kaW5nRnVuY3Rpb24oICJsaW5lYXJUb091dHB1dFRleGVsIiwgcGFyYW1ldGVycy5vdXRw
dXRFbmNvZGluZyApIDogJycsCisKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmRlcHRoUGFj
a2luZyA/ICIjZGVmaW5lIERFUFRIX1BBQ0tJTkcgIiArIG1hdGVyaWFsLmRlcHRoUGFja2luZyA6
ICcnLAorCisgICAgICAgICAgICAgICAgJ1xuJworCisgICAgICAgICAgICBdLmZpbHRlciggZmls
dGVyRW1wdHlMaW5lICkuam9pbiggJ1xuJyApOworCisgICAgICAgIH0KKworICAgICAgICB2ZXJ0
ZXhTaGFkZXIgPSBwYXJzZUluY2x1ZGVzKCB2ZXJ0ZXhTaGFkZXIgKTsKKyAgICAgICAgdmVydGV4
U2hhZGVyID0gcmVwbGFjZUxpZ2h0TnVtcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7CisK
KyAgICAgICAgZnJhZ21lbnRTaGFkZXIgPSBwYXJzZUluY2x1ZGVzKCBmcmFnbWVudFNoYWRlciAp
OworICAgICAgICBmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIGZyYWdtZW50U2hh
ZGVyLCBwYXJhbWV0ZXJzICk7CisKKyAgICAgICAgaWYgKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0
ZXJpYWwgKSB7CisKKyAgICAgICAgICAgIHZlcnRleFNoYWRlciA9IHVucm9sbExvb3BzKCB2ZXJ0
ZXhTaGFkZXIgKTsKKyAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyID0gdW5yb2xsTG9vcHMoIGZy
YWdtZW50U2hhZGVyICk7CisKKyAgICAgICAgfQorCisgICAgICAgIHZhciB2ZXJ0ZXhHbHNsID0g
cHJlZml4VmVydGV4ICsgdmVydGV4U2hhZGVyOworICAgICAgICB2YXIgZnJhZ21lbnRHbHNsID0g
cHJlZml4RnJhZ21lbnQgKyBmcmFnbWVudFNoYWRlcjsKKworICAgICAgICAvLyBjb25zb2xlLmxv
ZyggJypWRVJURVgqJywgdmVydGV4R2xzbCApOworICAgICAgICAvLyBjb25zb2xlLmxvZyggJypG
UkFHTUVOVConLCBmcmFnbWVudEdsc2wgKTsKKworICAgICAgICB2YXIgZ2xWZXJ0ZXhTaGFkZXIg
PSBXZWJHTFNoYWRlciggZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleEdsc2wgKTsKKyAgICAg
ICAgdmFyIGdsRnJhZ21lbnRTaGFkZXIgPSBXZWJHTFNoYWRlciggZ2wsIGdsLkZSQUdNRU5UX1NI
QURFUiwgZnJhZ21lbnRHbHNsICk7CisKKyAgICAgICAgZ2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFt
LCBnbFZlcnRleFNoYWRlciApOworICAgICAgICBnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGds
RnJhZ21lbnRTaGFkZXIgKTsKKworICAgICAgICAvLyBGb3JjZSBhIHBhcnRpY3VsYXIgYXR0cmli
dXRlIHRvIGluZGV4IDAuCisKKyAgICAgICAgaWYgKCBtYXRlcmlhbC5pbmRleDBBdHRyaWJ1dGVO
YW1lICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgIGdsLmJpbmRBdHRyaWJMb2NhdGlv
biggcHJvZ3JhbSwgMCwgbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSApOworCisgICAgICAg
IH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID09PSB0cnVlICkgeworCisgICAg
ICAgICAgICAvLyBwcm9ncmFtcyB3aXRoIG1vcnBoVGFyZ2V0cyBkaXNwbGFjZSBwb3NpdGlvbiBv
dXQgb2YgYXR0cmlidXRlIDAKKyAgICAgICAgICAgIGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJv
Z3JhbSwgMCwgJ3Bvc2l0aW9uJyApOworCisgICAgICAgIH0KKworICAgICAgICBnbC5saW5rUHJv
Z3JhbSggcHJvZ3JhbSApOworCisgICAgICAgIHZhciBwcm9ncmFtTG9nID0gZ2wuZ2V0UHJvZ3Jh
bUluZm9Mb2coIHByb2dyYW0gKTsKKyAgICAgICAgdmFyIHZlcnRleExvZyA9IGdsLmdldFNoYWRl
ckluZm9Mb2coIGdsVmVydGV4U2hhZGVyICk7CisgICAgICAgIHZhciBmcmFnbWVudExvZyA9IGds
LmdldFNoYWRlckluZm9Mb2coIGdsRnJhZ21lbnRTaGFkZXIgKTsKKworICAgICAgICB2YXIgcnVu
bmFibGUgPSB0cnVlOworICAgICAgICB2YXIgaGF2ZURpYWdub3N0aWNzID0gdHJ1ZTsKKworICAg
ICAgICAvLyBjb25zb2xlLmxvZyggJyoqVkVSVEVYKionLCBnbC5nZXRFeHRlbnNpb24oICdXRUJH
TF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoIGdsVmVydGV4U2hh
ZGVyICkgKTsKKyAgICAgICAgLy8gY29uc29sZS5sb2coICcqKkZSQUdNRU5UKionLCBnbC5nZXRF
eHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3Vy
Y2UoIGdsRnJhZ21lbnRTaGFkZXIgKSApOworCisgICAgICAgIGlmICggZ2wuZ2V0UHJvZ3JhbVBh
cmFtZXRlciggcHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMgKSA9PT0gZmFsc2UgKSB7CisKKyAgICAg
ICAgICAgIHJ1bm5hYmxlID0gZmFsc2U7CisKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdU
SFJFRS5XZWJHTFByb2dyYW06IHNoYWRlciBlcnJvcjogJywgZ2wuZ2V0RXJyb3IoKSwgJ2dsLlZB
TElEQVRFX1NUQVRVUycsIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLlZBTElE
QVRFX1NUQVRVUyApLCAnZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cnLCBwcm9ncmFtTG9nLCB2ZXJ0ZXhM
b2csIGZyYWdtZW50TG9nICk7CisKKyAgICAgICAgfSBlbHNlIGlmICggcHJvZ3JhbUxvZyAhPT0g
JycgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTog
Z2wuZ2V0UHJvZ3JhbUluZm9Mb2coKScsIHByb2dyYW1Mb2cgKTsKKworICAgICAgICB9IGVsc2Ug
aWYgKCB2ZXJ0ZXhMb2cgPT09ICcnIHx8IGZyYWdtZW50TG9nID09PSAnJyApIHsKKworICAgICAg
ICAgICAgaGF2ZURpYWdub3N0aWNzID0gZmFsc2U7CisKKyAgICAgICAgfQorCisgICAgICAgIGlm
ICggaGF2ZURpYWdub3N0aWNzICkgeworCisgICAgICAgICAgICB0aGlzLmRpYWdub3N0aWNzID0g
eworCisgICAgICAgICAgICAgICAgcnVubmFibGU6IHJ1bm5hYmxlLAorICAgICAgICAgICAgICAg
IG1hdGVyaWFsOiBtYXRlcmlhbCwKKworICAgICAgICAgICAgICAgIHByb2dyYW1Mb2c6IHByb2dy
YW1Mb2csCisKKyAgICAgICAgICAgICAgICB2ZXJ0ZXhTaGFkZXI6IHsKKworICAgICAgICAgICAg
ICAgICAgICBsb2c6IHZlcnRleExvZywKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4OiBwcmVm
aXhWZXJ0ZXgKKworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICBmcmFnbWVu
dFNoYWRlcjogeworCisgICAgICAgICAgICAgICAgICAgIGxvZzogZnJhZ21lbnRMb2csCisgICAg
ICAgICAgICAgICAgICAgIHByZWZpeDogcHJlZml4RnJhZ21lbnQKKworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgfTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gY2xlYW4gdXAK
KworICAgICAgICBnbC5kZWxldGVTaGFkZXIoIGdsVmVydGV4U2hhZGVyICk7CisgICAgICAgIGds
LmRlbGV0ZVNoYWRlciggZ2xGcmFnbWVudFNoYWRlciApOworCisgICAgICAgIC8vIHNldCB1cCBj
YWNoaW5nIGZvciB1bmlmb3JtIGxvY2F0aW9ucworCisgICAgICAgIHZhciBjYWNoZWRVbmlmb3Jt
czsKKworICAgICAgICB0aGlzLmdldFVuaWZvcm1zID0gZnVuY3Rpb24oKSB7CisKKyAgICAgICAg
ICAgIGlmICggY2FjaGVkVW5pZm9ybXMgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAg
ICAgIGNhY2hlZFVuaWZvcm1zID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFdlYkdMVW5pZm9y
bXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIHJldHVybiBjYWNoZWRVbmlmb3JtczsKKworICAgICAgICB9OworCisgICAgICAgIC8vIHNl
dCB1cCBjYWNoaW5nIGZvciBhdHRyaWJ1dGUgbG9jYXRpb25zCisKKyAgICAgICAgdmFyIGNhY2hl
ZEF0dHJpYnV0ZXM7CisKKyAgICAgICAgdGhpcy5nZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7
CisKKyAgICAgICAgICAgIGlmICggY2FjaGVkQXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkICkgewor
CisgICAgICAgICAgICAgICAgY2FjaGVkQXR0cmlidXRlcyA9IGZldGNoQXR0cmlidXRlTG9jYXRp
b25zKCBnbCwgcHJvZ3JhbSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVy
biBjYWNoZWRBdHRyaWJ1dGVzOworCisgICAgICAgIH07CisKKyAgICAgICAgLy8gZnJlZSByZXNv
dXJjZQorCisgICAgICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgeworCisgICAgICAgICAg
ICBnbC5kZWxldGVQcm9ncmFtKCBwcm9ncmFtICk7CisgICAgICAgICAgICB0aGlzLnByb2dyYW0g
PSB1bmRlZmluZWQ7CisKKyAgICAgICAgfTsKKworICAgICAgICAvLyBERVBSRUNBVEVECisKKyAg
ICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHsKKworICAgICAgICAgICAgdW5p
Zm9ybXM6IHsKKyAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgeworCisgICAgICAgICAg
ICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogLnVuaWZvcm1zIGlz
IG5vdyAuZ2V0VW5pZm9ybXMoKS4nICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlz
LmdldFVuaWZvcm1zKCk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorCisg
ICAgICAgICAgICBhdHRyaWJ1dGVzOiB7CisgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigp
IHsKKworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dy
YW06IC5hdHRyaWJ1dGVzIGlzIG5vdyAuZ2V0QXR0cmlidXRlcygpLicgKTsKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpOworCisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gKTsKKworCisgICAgICAgIC8vCisKKyAgICAg
ICAgdGhpcy5pZCA9IHByb2dyYW1JZENvdW50ICsrOworICAgICAgICB0aGlzLmNvZGUgPSBjb2Rl
OworICAgICAgICB0aGlzLnVzZWRUaW1lcyA9IDE7CisgICAgICAgIHRoaXMucHJvZ3JhbSA9IHBy
b2dyYW07CisgICAgICAgIHRoaXMudmVydGV4U2hhZGVyID0gZ2xWZXJ0ZXhTaGFkZXI7CisgICAg
ICAgIHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBnbEZyYWdtZW50U2hhZGVyOworCisgICAgICAgIHJl
dHVybiB0aGlzOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBo
dHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFdlYkdMUHJvZ3JhbXMo
IHJlbmRlcmVyLCBjYXBhYmlsaXRpZXMgKSB7CisKKyAgICAgICAgdmFyIHByb2dyYW1zID0gW107
CisKKyAgICAgICAgdmFyIHNoYWRlcklEcyA9IHsKKyAgICAgICAgICAgIE1lc2hEZXB0aE1hdGVy
aWFsOiAnZGVwdGgnLAorICAgICAgICAgICAgTWVzaE5vcm1hbE1hdGVyaWFsOiAnbm9ybWFsJywK
KyAgICAgICAgICAgIE1lc2hCYXNpY01hdGVyaWFsOiAnYmFzaWMnLAorICAgICAgICAgICAgTWVz
aExhbWJlcnRNYXRlcmlhbDogJ2xhbWJlcnQnLAorICAgICAgICAgICAgTWVzaFBob25nTWF0ZXJp
YWw6ICdwaG9uZycsCisgICAgICAgICAgICBNZXNoVG9vbk1hdGVyaWFsOiAncGhvbmcnLAorICAg
ICAgICAgICAgTWVzaFN0YW5kYXJkTWF0ZXJpYWw6ICdwaHlzaWNhbCcsCisgICAgICAgICAgICBN
ZXNoUGh5c2ljYWxNYXRlcmlhbDogJ3BoeXNpY2FsJywKKyAgICAgICAgICAgIExpbmVCYXNpY01h
dGVyaWFsOiAnYmFzaWMnLAorICAgICAgICAgICAgTGluZURhc2hlZE1hdGVyaWFsOiAnZGFzaGVk
JywKKyAgICAgICAgICAgIFBvaW50c01hdGVyaWFsOiAncG9pbnRzJworICAgICAgICB9OworCisg
ICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lcyA9IFsKKyAgICAgICAgICAgICJwcmVjaXNpb24iLCAi
c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyIsICJtYXAiLCAibWFwRW5jb2RpbmciLCAiZW52TWFwIiwg
ImVudk1hcE1vZGUiLCAiZW52TWFwRW5jb2RpbmciLAorICAgICAgICAgICAgImxpZ2h0TWFwIiwg
ImFvTWFwIiwgImVtaXNzaXZlTWFwIiwgImVtaXNzaXZlTWFwRW5jb2RpbmciLCAiYnVtcE1hcCIs
ICJub3JtYWxNYXAiLCAiZGlzcGxhY2VtZW50TWFwIiwgInNwZWN1bGFyTWFwIiwKKyAgICAgICAg
ICAgICJyb3VnaG5lc3NNYXAiLCAibWV0YWxuZXNzTWFwIiwgImdyYWRpZW50TWFwIiwKKyAgICAg
ICAgICAgICJhbHBoYU1hcCIsICJjb21iaW5lIiwgInZlcnRleENvbG9ycyIsICJmb2ciLCAidXNl
Rm9nIiwgImZvZ0V4cCIsCisgICAgICAgICAgICAiZmxhdFNoYWRpbmciLCAic2l6ZUF0dGVudWF0
aW9uIiwgImxvZ2FyaXRobWljRGVwdGhCdWZmZXIiLCAic2tpbm5pbmciLAorICAgICAgICAgICAg
Im1heEJvbmVzIiwgInVzZVZlcnRleFRleHR1cmUiLCAibW9ycGhUYXJnZXRzIiwgIm1vcnBoTm9y
bWFscyIsCisgICAgICAgICAgICAibWF4TW9ycGhUYXJnZXRzIiwgIm1heE1vcnBoTm9ybWFscyIs
ICJwcmVtdWx0aXBsaWVkQWxwaGEiLAorICAgICAgICAgICAgIm51bURpckxpZ2h0cyIsICJudW1Q
b2ludExpZ2h0cyIsICJudW1TcG90TGlnaHRzIiwgIm51bUhlbWlMaWdodHMiLCAibnVtUmVjdEFy
ZWFMaWdodHMiLAorICAgICAgICAgICAgInNoYWRvd01hcEVuYWJsZWQiLCAic2hhZG93TWFwVHlw
ZSIsICJ0b25lTWFwcGluZyIsICdwaHlzaWNhbGx5Q29ycmVjdExpZ2h0cycsCisgICAgICAgICAg
ICAiYWxwaGFUZXN0IiwgImRvdWJsZVNpZGVkIiwgImZsaXBTaWRlZCIsICJudW1DbGlwcGluZ1Bs
YW5lcyIsICJudW1DbGlwSW50ZXJzZWN0aW9uIiwgImRlcHRoUGFja2luZyIsICJkaXRoZXJpbmci
CisgICAgICAgIF07CisKKworICAgICAgICBmdW5jdGlvbiBhbGxvY2F0ZUJvbmVzKCBvYmplY3Qg
KSB7CisKKyAgICAgICAgICAgIHZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjsKKyAgICAg
ICAgICAgIHZhciBib25lcyA9IHNrZWxldG9uLmJvbmVzOworCisgICAgICAgICAgICBpZiAoIGNh
cGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzICkgeworCisgICAgICAgICAgICAgICAgcmV0
dXJuIDEwMjQ7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvLyBk
ZWZhdWx0IGZvciB3aGVuIG9iamVjdCBpcyBub3Qgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAg
Ly8gKCBmb3IgZXhhbXBsZSB3aGVuIHByZWJ1aWxkaW5nIHNoYWRlciB0byBiZSB1c2VkIHdpdGgg
bXVsdGlwbGUgb2JqZWN0cyApCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAv
LyAgLSBsZWF2ZSBzb21lIGV4dHJhIHNwYWNlIGZvciBvdGhlciB1bmlmb3JtcworICAgICAgICAg
ICAgICAgIC8vICAtIGxpbWl0IGhlcmUgaXMgQU5HTEUncyAyNTQgbWF4IHVuaWZvcm0gdmVjdG9y
cworICAgICAgICAgICAgICAgIC8vICAgICh1cCB0byA1NCBzaG91bGQgYmUgc2FmZSkKKworICAg
ICAgICAgICAgICAgIHZhciBuVmVydGV4VW5pZm9ybXMgPSBjYXBhYmlsaXRpZXMubWF4VmVydGV4
VW5pZm9ybXM7CisgICAgICAgICAgICAgICAgdmFyIG5WZXJ0ZXhNYXRyaWNlcyA9IE1hdGguZmxv
b3IoICggblZlcnRleFVuaWZvcm1zIC0gMjAgKSAvIDQgKTsKKworICAgICAgICAgICAgICAgIHZh
ciBtYXhCb25lcyA9IE1hdGgubWluKCBuVmVydGV4TWF0cmljZXMsIGJvbmVzLmxlbmd0aCApOwor
CisgICAgICAgICAgICAgICAgaWYgKCBtYXhCb25lcyA8IGJvbmVzLmxlbmd0aCApIHsKKworICAg
ICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2Vs
ZXRvbiBoYXMgJyArIGJvbmVzLmxlbmd0aCArICcgYm9uZXMuIFRoaXMgR1BVIHN1cHBvcnRzICcg
KyBtYXhCb25lcyArICcuJyApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBtYXhCb25lczsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBnZXRUZXh0dXJlRW5j
b2RpbmdGcm9tTWFwKCBtYXAsIGdhbW1hT3ZlcnJpZGVMaW5lYXIgKSB7CisKKyAgICAgICAgICAg
IHZhciBlbmNvZGluZzsKKworICAgICAgICAgICAgaWYgKCAhIG1hcCApIHsKKworICAgICAgICAg
ICAgICAgIGVuY29kaW5nID0gTGluZWFyRW5jb2Rpbmc7CisKKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAoIG1hcC5pc1RleHR1cmUgKSB7CisKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IG1hcC5l
bmNvZGluZzsKKworICAgICAgICAgICAgfSBlbHNlIGlmICggbWFwLmlzV2ViR0xSZW5kZXJUYXJn
ZXQgKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICJUSFJFRS5XZWJHTFByb2dy
YW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBh
cyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiApOworICAg
ICAgICAgICAgICAgIGVuY29kaW5nID0gbWFwLnRleHR1cmUuZW5jb2Rpbmc7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgLy8gYWRkIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBX
ZWJHTFJlbmRlcmVyLmdhbW1hSW5wdXQvZ2FtbWFPdXRwdXQgcGFyYW1ldGVyLCBzaG91bGQgcHJv
YmFibHkgYmUgcmVtb3ZlZCBhdCBzb21lIHBvaW50LgorICAgICAgICAgICAgaWYgKCBlbmNvZGlu
ZyA9PT0gTGluZWFyRW5jb2RpbmcgJiYgZ2FtbWFPdmVycmlkZUxpbmVhciApIHsKKworICAgICAg
ICAgICAgICAgIGVuY29kaW5nID0gR2FtbWFFbmNvZGluZzsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7CisKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMu
Z2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIGxpZ2h0cywgZm9nLCBuQ2xpcFBs
YW5lcywgbkNsaXBJbnRlcnNlY3Rpb24sIG9iamVjdCApIHsKKworICAgICAgICAgICAgdmFyIHNo
YWRlcklEID0gc2hhZGVySURzWyBtYXRlcmlhbC50eXBlIF07CisKKyAgICAgICAgICAgIC8vIGhl
dXJpc3RpY3MgdG8gY3JlYXRlIHNoYWRlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBsaWdodHMg
aW4gdGhlIHNjZW5lCisgICAgICAgICAgICAvLyAobm90IHRvIGJsb3cgb3ZlciBtYXhMaWdodHMg
YnVkZ2V0KQorCisgICAgICAgICAgICB2YXIgbWF4Qm9uZXMgPSBvYmplY3QuaXNTa2lubmVkTWVz
aCA/IGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIDogMDsKKyAgICAgICAgICAgIHZhciBwcmVjaXNp
b24gPSByZW5kZXJlci5nZXRQcmVjaXNpb24oKTsKKworICAgICAgICAgICAgaWYgKCBtYXRlcmlh
bC5wcmVjaXNpb24gIT09IG51bGwgKSB7CisKKyAgICAgICAgICAgICAgICBwcmVjaXNpb24gPSBj
YXBhYmlsaXRpZXMuZ2V0TWF4UHJlY2lzaW9uKCBtYXRlcmlhbC5wcmVjaXNpb24gKTsKKworICAg
ICAgICAgICAgICAgIGlmICggcHJlY2lzaW9uICE9PSBtYXRlcmlhbC5wcmVjaXNpb24gKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtLmdl
dFBhcmFtZXRlcnM6JywgbWF0ZXJpYWwucHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcn
LCBwcmVjaXNpb24sICdpbnN0ZWFkLicgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICB2YXIgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVy
LmdldFJlbmRlclRhcmdldCgpOworCisgICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IHsKKwor
ICAgICAgICAgICAgICAgIHNoYWRlcklEOiBzaGFkZXJJRCwKKworICAgICAgICAgICAgICAgIHBy
ZWNpc2lvbjogcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgIHN1cHBvcnRzVmVydGV4VGV4dHVy
ZXM6IGNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcywKKyAgICAgICAgICAgICAgICBvdXRwdXRF
bmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggKCAhIGN1cnJlbnRSZW5kZXJUYXJn
ZXQgKSA/IG51bGwgOiBjdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUsIHJlbmRlcmVyLmdhbW1h
T3V0cHV0ICksCisgICAgICAgICAgICAgICAgbWFwOiAhISBtYXRlcmlhbC5tYXAsCisgICAgICAg
ICAgICAgICAgbWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFs
Lm1hcCwgcmVuZGVyZXIuZ2FtbWFJbnB1dCApLAorICAgICAgICAgICAgICAgIGVudk1hcDogISEg
bWF0ZXJpYWwuZW52TWFwLAorICAgICAgICAgICAgICAgIGVudk1hcE1vZGU6IG1hdGVyaWFsLmVu
dk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAubWFwcGluZywKKyAgICAgICAgICAgICAgICBlbnZNYXBF
bmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW52TWFwLCByZW5k
ZXJlci5nYW1tYUlucHV0ICksCisgICAgICAgICAgICAgICAgZW52TWFwQ3ViZVVWOiAoICEhIG1h
dGVyaWFsLmVudk1hcCApICYmICggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVW
UmVmbGVjdGlvbk1hcHBpbmcgKSB8fCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nID09PSBDdWJl
VVZSZWZyYWN0aW9uTWFwcGluZyApICksCisgICAgICAgICAgICAgICAgbGlnaHRNYXA6ICEhIG1h
dGVyaWFsLmxpZ2h0TWFwLAorICAgICAgICAgICAgICAgIGFvTWFwOiAhISBtYXRlcmlhbC5hb01h
cCwKKyAgICAgICAgICAgICAgICBlbWlzc2l2ZU1hcDogISEgbWF0ZXJpYWwuZW1pc3NpdmVNYXAs
CisgICAgICAgICAgICAgICAgZW1pc3NpdmVNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5n
RnJvbU1hcCggbWF0ZXJpYWwuZW1pc3NpdmVNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSwKKyAg
ICAgICAgICAgICAgICBidW1wTWFwOiAhISBtYXRlcmlhbC5idW1wTWFwLAorICAgICAgICAgICAg
ICAgIG5vcm1hbE1hcDogISEgbWF0ZXJpYWwubm9ybWFsTWFwLAorICAgICAgICAgICAgICAgIGRp
c3BsYWNlbWVudE1hcDogISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwLAorICAgICAgICAgICAg
ICAgIHJvdWdobmVzc01hcDogISEgbWF0ZXJpYWwucm91Z2huZXNzTWFwLAorICAgICAgICAgICAg
ICAgIG1ldGFsbmVzc01hcDogISEgbWF0ZXJpYWwubWV0YWxuZXNzTWFwLAorICAgICAgICAgICAg
ICAgIHNwZWN1bGFyTWFwOiAhISBtYXRlcmlhbC5zcGVjdWxhck1hcCwKKyAgICAgICAgICAgICAg
ICBhbHBoYU1hcDogISEgbWF0ZXJpYWwuYWxwaGFNYXAsCisKKyAgICAgICAgICAgICAgICBncmFk
aWVudE1hcDogISEgbWF0ZXJpYWwuZ3JhZGllbnRNYXAsCisKKyAgICAgICAgICAgICAgICBjb21i
aW5lOiBtYXRlcmlhbC5jb21iaW5lLAorCisgICAgICAgICAgICAgICAgdmVydGV4Q29sb3JzOiBt
YXRlcmlhbC52ZXJ0ZXhDb2xvcnMsCisKKyAgICAgICAgICAgICAgICBmb2c6ICEhIGZvZywKKyAg
ICAgICAgICAgICAgICB1c2VGb2c6IG1hdGVyaWFsLmZvZywKKyAgICAgICAgICAgICAgICBmb2dF
eHA6ICggZm9nICYmIGZvZy5pc0ZvZ0V4cDIgKSwKKworICAgICAgICAgICAgICAgIGZsYXRTaGFk
aW5nOiBtYXRlcmlhbC5zaGFkaW5nID09PSBGbGF0U2hhZGluZywKKworICAgICAgICAgICAgICAg
IHNpemVBdHRlbnVhdGlvbjogbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uLAorICAgICAgICAgICAg
ICAgIGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRo
QnVmZmVyLAorCisgICAgICAgICAgICAgICAgc2tpbm5pbmc6IG1hdGVyaWFsLnNraW5uaW5nICYm
IG1heEJvbmVzID4gMCwKKyAgICAgICAgICAgICAgICBtYXhCb25lczogbWF4Qm9uZXMsCisgICAg
ICAgICAgICAgICAgdXNlVmVydGV4VGV4dHVyZTogY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4
dHVyZXMsCisKKyAgICAgICAgICAgICAgICBtb3JwaFRhcmdldHM6IG1hdGVyaWFsLm1vcnBoVGFy
Z2V0cywKKyAgICAgICAgICAgICAgICBtb3JwaE5vcm1hbHM6IG1hdGVyaWFsLm1vcnBoTm9ybWFs
cywKKyAgICAgICAgICAgICAgICBtYXhNb3JwaFRhcmdldHM6IHJlbmRlcmVyLm1heE1vcnBoVGFy
Z2V0cywKKyAgICAgICAgICAgICAgICBtYXhNb3JwaE5vcm1hbHM6IHJlbmRlcmVyLm1heE1vcnBo
Tm9ybWFscywKKworICAgICAgICAgICAgICAgIG51bURpckxpZ2h0czogbGlnaHRzLmRpcmVjdGlv
bmFsLmxlbmd0aCwKKyAgICAgICAgICAgICAgICBudW1Qb2ludExpZ2h0czogbGlnaHRzLnBvaW50
Lmxlbmd0aCwKKyAgICAgICAgICAgICAgICBudW1TcG90TGlnaHRzOiBsaWdodHMuc3BvdC5sZW5n
dGgsCisgICAgICAgICAgICAgICAgbnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJlYS5s
ZW5ndGgsCisgICAgICAgICAgICAgICAgbnVtSGVtaUxpZ2h0czogbGlnaHRzLmhlbWkubGVuZ3Ro
LAorCisgICAgICAgICAgICAgICAgbnVtQ2xpcHBpbmdQbGFuZXM6IG5DbGlwUGxhbmVzLAorICAg
ICAgICAgICAgICAgIG51bUNsaXBJbnRlcnNlY3Rpb246IG5DbGlwSW50ZXJzZWN0aW9uLAorCisg
ICAgICAgICAgICAgICAgZGl0aGVyaW5nOiBtYXRlcmlhbC5kaXRoZXJpbmcsCisKKyAgICAgICAg
ICAgICAgICBzaGFkb3dNYXBFbmFibGVkOiByZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCAmJiBv
YmplY3QucmVjZWl2ZVNoYWRvdyAmJiBsaWdodHMuc2hhZG93cy5sZW5ndGggPiAwLAorICAgICAg
ICAgICAgICAgIHNoYWRvd01hcFR5cGU6IHJlbmRlcmVyLnNoYWRvd01hcC50eXBlLAorCisgICAg
ICAgICAgICAgICAgdG9uZU1hcHBpbmc6IHJlbmRlcmVyLnRvbmVNYXBwaW5nLAorICAgICAgICAg
ICAgICAgIHBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzOiByZW5kZXJlci5waHlzaWNhbGx5Q29ycmVj
dExpZ2h0cywKKworICAgICAgICAgICAgICAgIHByZW11bHRpcGxpZWRBbHBoYTogbWF0ZXJpYWwu
cHJlbXVsdGlwbGllZEFscGhhLAorCisgICAgICAgICAgICAgICAgYWxwaGFUZXN0OiBtYXRlcmlh
bC5hbHBoYVRlc3QsCisgICAgICAgICAgICAgICAgZG91YmxlU2lkZWQ6IG1hdGVyaWFsLnNpZGUg
PT09IERvdWJsZVNpZGUsCisgICAgICAgICAgICAgICAgZmxpcFNpZGVkOiBtYXRlcmlhbC5zaWRl
ID09PSBCYWNrU2lkZSwKKworICAgICAgICAgICAgICAgIGRlcHRoUGFja2luZzogKCBtYXRlcmlh
bC5kZXB0aFBhY2tpbmcgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwuZGVwdGhQYWNraW5nIDog
ZmFsc2UKKworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7
CisKKyAgICAgICAgfTsKKworICAgICAgICB0aGlzLmdldFByb2dyYW1Db2RlID0gZnVuY3Rpb24g
KCBtYXRlcmlhbCwgcGFyYW1ldGVycyApIHsKKworICAgICAgICAgICAgdmFyIGFycmF5ID0gW107
CisKKyAgICAgICAgICAgIGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHsKKworICAgICAgICAg
ICAgICAgIGFycmF5LnB1c2goIHBhcmFtZXRlcnMuc2hhZGVySUQgKTsKKworICAgICAgICAgICAg
fSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGFycmF5LnB1c2goIG1hdGVyaWFsLmZyYWdtZW50
U2hhZGVyICk7CisgICAgICAgICAgICAgICAgYXJyYXkucHVzaCggbWF0ZXJpYWwudmVydGV4U2hh
ZGVyICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBtYXRlcmlhbC5kZWZp
bmVzICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgbmFtZSBp
biBtYXRlcmlhbC5kZWZpbmVzICkgeworCisgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2go
IG5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCggbWF0ZXJpYWwuZGVmaW5l
c1sgbmFtZSBdICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpICsr
ICkgeworCisgICAgICAgICAgICAgICAgYXJyYXkucHVzaCggcGFyYW1ldGVyc1sgcGFyYW1ldGVy
TmFtZXNbIGkgXSBdICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXJyYXkucHVz
aCggbWF0ZXJpYWwub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCkgKTsKKworICAgICAgICAgICAg
YXJyYXkucHVzaCggcmVuZGVyZXIuZ2FtbWFPdXRwdXQgKTsKKworICAgICAgICAgICAgcmV0dXJu
IGFycmF5LmpvaW4oKTsKKworICAgICAgICB9OworCisgICAgICAgIHRoaXMuYWNxdWlyZVByb2dy
YW0gPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBzaGFkZXIsIHBhcmFtZXRlcnMsIGNvZGUgKSB7CisK
KyAgICAgICAgICAgIHZhciBwcm9ncmFtOworCisgICAgICAgICAgICAvLyBDaGVjayBpZiBjb2Rl
IGhhcyBiZWVuIGFscmVhZHkgY29tcGlsZWQKKyAgICAgICAgICAgIGZvciAoIHZhciBwID0gMCwg
cGwgPSBwcm9ncmFtcy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHsKKworICAgICAgICAgICAgICAg
IHZhciBwcm9ncmFtSW5mbyA9IHByb2dyYW1zWyBwIF07CisKKyAgICAgICAgICAgICAgICBpZiAo
IHByb2dyYW1JbmZvLmNvZGUgPT09IGNvZGUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcHJv
Z3JhbSA9IHByb2dyYW1JbmZvOworICAgICAgICAgICAgICAgICAgICArKyBwcm9ncmFtLnVzZWRU
aW1lczsKKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5l
ZCApIHsKKworICAgICAgICAgICAgICAgIHByb2dyYW0gPSBuZXcgV2ViR0xQcm9ncmFtKCByZW5k
ZXJlciwgY29kZSwgbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycyApOworICAgICAgICAgICAg
ICAgIHByb2dyYW1zLnB1c2goIHByb2dyYW0gKTsKKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICByZXR1cm4gcHJvZ3JhbTsKKworICAgICAgICB9OworCisgICAgICAgIHRoaXMucmVsZWFz
ZVByb2dyYW0gPSBmdW5jdGlvbiAoIHByb2dyYW0gKSB7CisKKyAgICAgICAgICAgIGlmICggLS0g
cHJvZ3JhbS51c2VkVGltZXMgPT09IDAgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUg
ZnJvbSB1bm9yZGVyZWQgc2V0CisgICAgICAgICAgICAgICAgdmFyIGkgPSBwcm9ncmFtcy5pbmRl
eE9mKCBwcm9ncmFtICk7CisgICAgICAgICAgICAgICAgcHJvZ3JhbXNbIGkgXSA9IHByb2dyYW1z
WyBwcm9ncmFtcy5sZW5ndGggLSAxIF07CisgICAgICAgICAgICAgICAgcHJvZ3JhbXMucG9wKCk7
CisKKyAgICAgICAgICAgICAgICAvLyBGcmVlIFdlYkdMIHJlc291cmNlcworICAgICAgICAgICAg
ICAgIHByb2dyYW0uZGVzdHJveSgpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKwor
ICAgICAgICAvLyBFeHBvc2VkIGZvciByZXNvdXJjZSBtb25pdG9yaW5nICYgZXJyb3IgZmVlZGJh
Y2sgdmlhIHJlbmRlcmVyLmluZm86CisgICAgICAgIHRoaXMucHJvZ3JhbXMgPSBwcm9ncmFtczsK
KworICAgIH0KKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9v
Yi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBXZWJHTFRleHR1cmVzKCBfZ2wsIGV4dGVu
c2lvbnMsIHN0YXRlLCBwcm9wZXJ0aWVzLCBjYXBhYmlsaXRpZXMsIHBhcmFtVGhyZWVUb0dMLCBp
bmZvTWVtb3J5ICkgeworCisgICAgICAgIHZhciBfaXNXZWJHTDIgPSAoIHR5cGVvZiBXZWJHTDJS
ZW5kZXJpbmdDb250ZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBfZ2wgaW5zdGFuY2VvZiBXZWJHTDJS
ZW5kZXJpbmdDb250ZXh0ICk7CisKKyAgICAgICAgLy8KKworICAgICAgICBmdW5jdGlvbiBjbGFt
cFRvTWF4U2l6ZSggaW1hZ2UsIG1heFNpemUgKSB7CisKKyAgICAgICAgICAgIGlmICggaW1hZ2Uu
d2lkdGggPiBtYXhTaXplIHx8IGltYWdlLmhlaWdodCA+IG1heFNpemUgKSB7CisKKyAgICAgICAg
ICAgICAgICAvLyBXYXJuaW5nOiBTY2FsaW5nIHRocm91Z2ggdGhlIGNhbnZhcyB3aWxsIG9ubHkg
d29yayB3aXRoIGltYWdlcyB0aGF0IHVzZQorICAgICAgICAgICAgICAgIC8vIHByZW11bHRpcGxp
ZWQgYWxwaGEuCisKKyAgICAgICAgICAgICAgICB2YXIgc2NhbGUgPSBtYXhTaXplIC8gTWF0aC5t
YXgoIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTsKKworICAgICAgICAgICAgICAgIHZhciBj
YW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5
L3hodG1sJywgJ2NhbnZhcycgKTsKKyAgICAgICAgICAgICAgICBjYW52YXMud2lkdGggPSBNYXRo
LmZsb29yKCBpbWFnZS53aWR0aCAqIHNjYWxlICk7CisgICAgICAgICAgICAgICAgY2FudmFzLmhl
aWdodCA9IE1hdGguZmxvb3IoIGltYWdlLmhlaWdodCAqIHNjYWxlICk7CisKKyAgICAgICAgICAg
ICAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7CisgICAgICAgICAg
ICAgICAgY29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2Uu
aGVpZ2h0LCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQgKTsKKworICAgICAgICAg
ICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IGltYWdlIGlzIHRvbyBi
aWcgKCcgKyBpbWFnZS53aWR0aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLiBSZXNpemVkIHRv
ICcgKyBjYW52YXMud2lkdGggKyAneCcgKyBjYW52YXMuaGVpZ2h0LCBpbWFnZSApOworCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICByZXR1cm4gaW1hZ2U7CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGlzUG93ZXJP
ZlR3byggaW1hZ2UgKSB7CisKKyAgICAgICAgICAgIHJldHVybiBfTWF0aC5pc1Bvd2VyT2ZUd28o
IGltYWdlLndpZHRoICkgJiYgX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS5oZWlnaHQgKTsKKwor
ICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gbWFrZVBvd2VyT2ZUd28oIGltYWdlICkgewor
CisgICAgICAgICAgICBpZiAoIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fCBp
bWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkgeworCisgICAgICAgICAgICAgICAg
dmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3Jn
LzE5OTkveGh0bWwnLCAnY2FudmFzJyApOworICAgICAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9
IF9NYXRoLm5lYXJlc3RQb3dlck9mVHdvKCBpbWFnZS53aWR0aCApOworICAgICAgICAgICAgICAg
IGNhbnZhcy5oZWlnaHQgPSBfTWF0aC5uZWFyZXN0UG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7
CisKKyAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQn
ICk7CisgICAgICAgICAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBjYW52
YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQgKTsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fy
biggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IGltYWdlIGlzIG5vdCBwb3dlciBvZiB0d28gKCcgKyBp
bWFnZS53aWR0aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLiBSZXNpemVkIHRvICcgKyBjYW52
YXMud2lkdGggKyAneCcgKyBjYW52YXMuaGVpZ2h0LCBpbWFnZSApOworCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGNhbnZhczsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4g
aW1hZ2U7CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHRleHR1cmVOZWVkc1Bvd2Vy
T2ZUd28oIHRleHR1cmUgKSB7CisKKyAgICAgICAgICAgIHJldHVybiAoIHRleHR1cmUud3JhcFMg
IT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VX
cmFwcGluZyApIHx8CisgICAgICAgICAgICAgICAgKCB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVh
cmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyICk7CisKKyAg
ICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcygg
dGV4dHVyZSwgaXNQb3dlck9mVHdvICkgeworCisgICAgICAgICAgICByZXR1cm4gdGV4dHVyZS5n
ZW5lcmF0ZU1pcG1hcHMgJiYgaXNQb3dlck9mVHdvICYmCisgICAgICAgICAgICAgICAgdGV4dHVy
ZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExp
bmVhckZpbHRlcjsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gRmFsbGJhY2sgZmlsdGVycyBm
b3Igbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXMKKworICAgICAgICBmdW5jdGlvbiBmaWx0ZXJGYWxs
YmFjayggZiApIHsKKworICAgICAgICAgICAgaWYgKCBmID09PSBOZWFyZXN0RmlsdGVyIHx8IGYg
PT09IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyIHx8IGYgPT09IE5lYXJlc3RNaXBNYXBMaW5l
YXJGaWx0ZXIgKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2dsLk5FQVJFU1Q7CisKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIF9nbC5MSU5FQVI7CisKKyAgICAgICAg
fQorCisgICAgICAgIC8vCisKKyAgICAgICAgZnVuY3Rpb24gb25UZXh0dXJlRGlzcG9zZSggZXZl
bnQgKSB7CisKKyAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gZXZlbnQudGFyZ2V0OworCisgICAg
ICAgICAgICB0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJl
RGlzcG9zZSApOworCisgICAgICAgICAgICBkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApOwor
CisgICAgICAgICAgICBpbmZvTWVtb3J5LnRleHR1cmVzIC0tOworCisKKyAgICAgICAgfQorCisg
ICAgICAgIGZ1bmN0aW9uIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSggZXZlbnQgKSB7CisKKyAgICAg
ICAgICAgIHZhciByZW5kZXJUYXJnZXQgPSBldmVudC50YXJnZXQ7CisKKyAgICAgICAgICAgIHJl
bmRlclRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0
RGlzcG9zZSApOworCisgICAgICAgICAgICBkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJU
YXJnZXQgKTsKKworICAgICAgICAgICAgaW5mb01lbW9yeS50ZXh0dXJlcyAtLTsKKworICAgICAg
ICB9CisKKyAgICAgICAgLy8KKworICAgICAgICBmdW5jdGlvbiBkZWFsbG9jYXRlVGV4dHVyZSgg
dGV4dHVyZSApIHsKKworICAgICAgICAgICAgdmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVy
dGllcy5nZXQoIHRleHR1cmUgKTsKKworICAgICAgICAgICAgaWYgKCB0ZXh0dXJlLmltYWdlICYm
IHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKSB7CisKKyAgICAg
ICAgICAgICAgICAvLyBjdWJlIHRleHR1cmUKKworICAgICAgICAgICAgICAgIF9nbC5kZWxldGVU
ZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICk7CisK
KyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvLyAyRCB0ZXh0dXJlCisK
KyAgICAgICAgICAgICAgICBpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID09PSB1
bmRlZmluZWQgKSByZXR1cm47CisKKyAgICAgICAgICAgICAgICBfZ2wuZGVsZXRlVGV4dHVyZSgg
dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAvLyByZW1vdmUgYWxsIHdlYmdsIHByb3BlcnRpZXMKKyAgICAgICAgICAgIHBy
b3BlcnRpZXMucmVtb3ZlKCB0ZXh0dXJlICk7CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0
aW9uIGRlYWxsb2NhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHsKKworICAgICAgICAg
ICAgdmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFy
Z2V0ICk7CisgICAgICAgICAgICB2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdl
dCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTsKKworICAgICAgICAgICAgaWYgKCAhIHJlbmRlclRh
cmdldCApIHJldHVybjsKKworICAgICAgICAgICAgaWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dl
YmdsVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgX2dsLmRlbGV0
ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkgewor
CisgICAgICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5kaXNwb3NlKCk7CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJl
bmRlclRhcmdldEN1YmUgKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkg
PCA2OyBpICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIF9nbC5kZWxldGVGcmFtZWJ1ZmZl
ciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApOworICAg
ICAgICAgICAgICAgICAgICBpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRo
YnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5f
X3dlYmdsRGVwdGhidWZmZXJbIGkgXSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgX2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCBy
ZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApOworICAgICAgICAgICAg
ICAgIGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKSBfZ2wu
ZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1
ZmZlciApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3BlcnRpZXMucmVtb3Zl
KCByZW5kZXJUYXJnZXQudGV4dHVyZSApOworICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUo
IHJlbmRlclRhcmdldCApOworCisgICAgICAgIH0KKworICAgICAgICAvLworCisKKworICAgICAg
ICBmdW5jdGlvbiBzZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7CisKKyAgICAgICAgICAg
IHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7CisKKyAg
ICAgICAgICAgIGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5f
X3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHsKKworICAgICAgICAgICAgICAgIHZhciBp
bWFnZSA9IHRleHR1cmUuaW1hZ2U7CisKKyAgICAgICAgICAgICAgICBpZiAoIGltYWdlID09PSB1
bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUu
V2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgdW5k
ZWZpbmVkJywgdGV4dHVyZSApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggaW1hZ2Uu
Y29tcGxldGUgPT09IGZhbHNlICkgeworCisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fy
biggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGlt
YWdlIGlzIGluY29tcGxldGUnLCB0ZXh0dXJlICk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2Ug
eworCisgICAgICAgICAgICAgICAgICAgIHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVz
LCB0ZXh0dXJlLCBzbG90ICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS5hY3RpdmVU
ZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7CisgICAgICAgICAgICBzdGF0ZS5iaW5kVGV4
dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7
CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJl
LCBzbG90ICkgeworCisgICAgICAgICAgICB2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0
aWVzLmdldCggdGV4dHVyZSApOworCisgICAgICAgICAgICBpZiAoIHRleHR1cmUuaW1hZ2UubGVu
Z3RoID09PSA2ICkgeworCisgICAgICAgICAgICAgICAgaWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAw
ICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkgewor
CisgICAgICAgICAgICAgICAgICAgIGlmICggISB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193
ZWJnbFRleHR1cmVDdWJlICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLmFk
ZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApOworCisgICAgICAg
ICAgICAgICAgICAgICAgICB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVD
dWJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5m
b01lbW9yeS50ZXh0dXJlcyArKzsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApOwor
ICAgICAgICAgICAgICAgICAgICBzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9N
QVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKTsKKworICAg
ICAgICAgICAgICAgICAgICBfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdM
LCB0ZXh0dXJlLmZsaXBZICk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ29tcHJlc3Nl
ZCA9ICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgKTsKKyAgICAgICAg
ICAgICAgICAgICAgdmFyIGlzRGF0YVRleHR1cmUgPSAoIHRleHR1cmUuaW1hZ2VbIDAgXSAmJiB0
ZXh0dXJlLmltYWdlWyAwIF0uaXNEYXRhVGV4dHVyZSApOworCisgICAgICAgICAgICAgICAgICAg
IHZhciBjdWJlSW1hZ2UgPSBbXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9
IDA7IGkgPCA2OyBpICsrICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaXND
b21wcmVzc2VkICYmICEgaXNEYXRhVGV4dHVyZSApIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGN1YmVJbWFnZVsgaSBdID0gY2xhbXBUb01heFNpemUoIHRleHR1cmUuaW1hZ2VbIGkg
XSwgY2FwYWJpbGl0aWVzLm1heEN1YmVtYXBTaXplICk7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdWJlSW1hZ2VbIGkg
XSA9IGlzRGF0YVRleHR1cmUgPyB0ZXh0dXJlLmltYWdlWyBpIF0uaW1hZ2UgOiB0ZXh0dXJlLmlt
YWdlWyBpIF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGltYWdlID0gY3ViZUltYWdlWyAwIF0s
CisgICAgICAgICAgICAgICAgICAgIGlzUG93ZXJPZlR3b0ltYWdlID0gaXNQb3dlck9mVHdvKCBp
bWFnZSApLAorICAgICAgICAgICAgICAgICAgICBnbEZvcm1hdCA9IHBhcmFtVGhyZWVUb0dMKCB0
ZXh0dXJlLmZvcm1hdCApLAorICAgICAgICAgICAgICAgICAgICBnbFR5cGUgPSBwYXJhbVRocmVl
VG9HTCggdGV4dHVyZS50eXBlICk7CisKKyAgICAgICAgICAgICAgICAgICAgc2V0VGV4dHVyZVBh
cmFtZXRlcnMoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFn
ZSApOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBpc0NvbXByZXNzZWQgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlzRGF0YVRleHR1cmUgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRV
UkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIGdsRm9ybWF0LCBjdWJlSW1hZ2VbIGkgXS53
aWR0aCwgY3ViZUltYWdlWyBpIF0uaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1h
Z2VbIGkgXS5kYXRhICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugewor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnRleEltYWdlMkQoIF9nbC5U
RVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGds
VHlwZSwgY3ViZUltYWdlWyBpIF0gKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHZhciBtaXBtYXAsIG1pcG1hcHMgPSBjdWJlSW1hZ2VbIGkgXS5taXBtYXBzOwor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGogPSAwLCBqbCA9IG1pcG1h
cHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbWlwbWFwID0gbWlwbWFwc1sgaiBdOworCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3Jt
YXQgIT09IFJHQkZvcm1hdCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZv
cm1hdCApID4gLSAxICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lU
SVZFX1ggKyBpLCBqLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBt
aXBtYXAuZGF0YSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVs
c2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53
YXJuKCAiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNv
bXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnNldFRleHR1cmVDdWJlKCkiICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwg
aiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGds
VHlwZSwgbWlwbWFwLmRhdGEgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYg
KCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdl
ICkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIF9nbC5nZW5lcmF0ZU1pcG1hcCggX2ds
LlRFWFRVUkVfQ1VCRV9NQVAgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICAgICAgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9u
OworCisgICAgICAgICAgICAgICAgICAgIGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUu
b25VcGRhdGUoIHRleHR1cmUgKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgc3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCAp
OworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VC
RV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKTsKKwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAg
ICBmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZUR5bmFtaWMoIHRleHR1cmUsIHNsb3QgKSB7CisKKyAg
ICAgICAgICAgIHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTsKKyAg
ICAgICAgICAgIHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgcHJvcGVy
dGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSApOworCisgICAgICAgIH0KKworICAg
ICAgICBmdW5jdGlvbiBzZXRUZXh0dXJlUGFyYW1ldGVycyggdGV4dHVyZVR5cGUsIHRleHR1cmUs
IGlzUG93ZXJPZlR3b0ltYWdlICkgeworCisgICAgICAgICAgICB2YXIgZXh0ZW5zaW9uOworCisg
ICAgICAgICAgICBpZiAoIGlzUG93ZXJPZlR3b0ltYWdlICkgeworCisgICAgICAgICAgICAgICAg
X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1MsIHBhcmFt
VGhyZWVUb0dMKCB0ZXh0dXJlLndyYXBTICkgKTsKKyAgICAgICAgICAgICAgICBfZ2wudGV4UGFy
YW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfVCwgcGFyYW1UaHJlZVRvR0wo
IHRleHR1cmUud3JhcFQgKSApOworCisgICAgICAgICAgICAgICAgX2dsLnRleFBhcmFtZXRlcmko
IHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBwYXJhbVRocmVlVG9HTCggdGV4
dHVyZS5tYWdGaWx0ZXIgKSApOworICAgICAgICAgICAgICAgIF9nbC50ZXhQYXJhbWV0ZXJpKCB0
ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgcGFyYW1UaHJlZVRvR0woIHRleHR1
cmUubWluRmlsdGVyICkgKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAg
ICAgIF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9TLCBf
Z2wuQ0xBTVBfVE9fRURHRSApOworICAgICAgICAgICAgICAgIF9nbC50ZXhQYXJhbWV0ZXJpKCB0
ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9ULCBfZ2wuQ0xBTVBfVE9fRURHRSApOworCisg
ICAgICAgICAgICAgICAgaWYgKCB0ZXh0dXJlLndyYXBTICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5n
IHx8IHRleHR1cmUud3JhcFQgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBp
cyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLndyYXBTIGFuZCBUZXh0dXJlLndyYXBUIHNob3Vs
ZCBiZSBzZXQgdG8gVEhSRUUuQ2xhbXBUb0VkZ2VXcmFwcGluZy4nLCB0ZXh0dXJlICk7CisKKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfZ2wudGV4UGFyYW1ldGVyaSggdGV4
dHVyZVR5cGUsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJl
Lm1hZ0ZpbHRlciApICk7CisgICAgICAgICAgICAgICAgX2dsLnRleFBhcmFtZXRlcmkoIHRleHR1
cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5t
aW5GaWx0ZXIgKSApOworCisgICAgICAgICAgICAgICAgaWYgKCB0ZXh0dXJlLm1pbkZpbHRlciAh
PT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyICkg
eworCisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVy
ZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxk
IGJlIHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4nLCB0
ZXh0dXJlICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5p
c290cm9waWMnICk7CisKKyAgICAgICAgICAgIGlmICggZXh0ZW5zaW9uICkgeworCisgICAgICAg
ICAgICAgICAgaWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdl
dCggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKSA9PT0gbnVsbCApIHJldHVybjsKKyAgICAg
ICAgICAgICAgICBpZiAoIHRleHR1cmUudHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNp
b25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApID09PSBudWxsICkgcmV0
dXJuOworCisgICAgICAgICAgICAgICAgaWYgKCB0ZXh0dXJlLmFuaXNvdHJvcHkgPiAxIHx8IHBy
b3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSApIHsKKworICAgICAg
ICAgICAgICAgICAgICBfZ2wudGV4UGFyYW1ldGVyZiggdGV4dHVyZVR5cGUsIGV4dGVuc2lvbi5U
RVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgTWF0aC5taW4oIHRleHR1cmUuYW5pc290cm9weSwg
Y2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKSApICk7CisgICAgICAgICAgICAgICAgICAg
IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSA9IHRleHR1cmUu
YW5pc290cm9weTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAg
ICAgIH0KKworICAgICAgICBmdW5jdGlvbiB1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGll
cywgdGV4dHVyZSwgc2xvdCApIHsKKworICAgICAgICAgICAgaWYgKCB0ZXh0dXJlUHJvcGVydGll
cy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgdGV4dHVy
ZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgdGV4dHVy
ZS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTsKKworICAg
ICAgICAgICAgICAgIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0
ZVRleHR1cmUoKTsKKworICAgICAgICAgICAgICAgIGluZm9NZW1vcnkudGV4dHVyZXMgKys7CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRF
WFRVUkUwICsgc2xvdCApOworICAgICAgICAgICAgc3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhU
VVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApOworCisgICAgICAgICAg
ICBfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZ
ICk7CisgICAgICAgICAgICBfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlf
QUxQSEFfV0VCR0wsIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSApOworICAgICAgICAgICAgX2ds
LnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0FMSUdOTUVOVCwgdGV4dHVyZS51bnBhY2tBbGlnbm1l
bnQgKTsKKworICAgICAgICAgICAgdmFyIGltYWdlID0gY2xhbXBUb01heFNpemUoIHRleHR1cmUu
aW1hZ2UsIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSApOworCisgICAgICAgICAgICBpZiAo
IHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSAmJiBpc1Bvd2VyT2ZUd28oIGltYWdl
ICkgPT09IGZhbHNlICkgeworCisgICAgICAgICAgICAgICAgaW1hZ2UgPSBtYWtlUG93ZXJPZlR3
byggaW1hZ2UgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaXNQb3dlck9m
VHdvSW1hZ2UgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICksCisgICAgICAgICAgICBnbEZvcm1hdCA9
IHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLmZvcm1hdCApLAorICAgICAgICAgICAgZ2xUeXBlID0g
cGFyYW1UaHJlZVRvR0woIHRleHR1cmUudHlwZSApOworCisgICAgICAgICAgICBzZXRUZXh0dXJl
UGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICk7
CisKKyAgICAgICAgICAgIHZhciBtaXBtYXAsIG1pcG1hcHMgPSB0ZXh0dXJlLm1pcG1hcHM7CisK
KyAgICAgICAgICAgIGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHsKKworICAgICAgICAg
ICAgICAgIC8vIHBvcHVsYXRlIGRlcHRoIHRleHR1cmUgd2l0aCBkdW1teSBkYXRhCisKKyAgICAg
ICAgICAgICAgICB2YXIgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UOworCisg
ICAgICAgICAgICAgICAgaWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSApIHsKKworICAg
ICAgICAgICAgICAgICAgICBpZiAoICFfaXNXZWJHTDIgKSB0aHJvdyBuZXcgRXJyb3IoJ0Zsb2F0
IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAnKTsKKyAgICAgICAgICAg
ICAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMzJGOworCisgICAg
ICAgICAgICAgICAgfSBlbHNlIGlmICggX2lzV2ViR0wyICkgeworCisgICAgICAgICAgICAgICAg
ICAgIC8vIFdlYkdMIDIuMCByZXF1aXJlcyBzaWduZWQgaW50ZXJuYWxmb3JtYXQgZm9yIGdsVGV4
SW1hZ2UyRAorICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9D
T01QT05FTlQxNjsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgg
dGV4dHVyZS5mb3JtYXQgPT09IERlcHRoRm9ybWF0ICYmIGludGVybmFsRm9ybWF0ID09PSBfZ2wu
REVQVEhfQ09NUE9ORU5UICkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlcnJvciBJ
TlZBTElEX09QRVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5k
IGludGVybmFsZm9ybWF0IGFyZQorICAgICAgICAgICAgICAgICAgICAvLyBERVBUSF9DT01QT05F
TlQgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX1NIT1JUIG9yIFVOU0lHTkVEX0lOVAorICAgICAg
ICAgICAgICAgICAgICAvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wv
ZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLykKKyAgICAgICAgICAgICAgICAgICAgaWYg
KCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkU2hvcnRUeXBlICYmIHRleHR1cmUudHlwZSAhPT0g
VW5zaWduZWRJbnRUeXBlICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29s
ZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkU2hvcnRUeXBlIG9yIFVu
c2lnbmVkSW50VHlwZSBmb3IgRGVwdGhGb3JtYXQgRGVwdGhUZXh0dXJlLicgKTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgdGV4dHVyZS50eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7CisgICAg
ICAgICAgICAgICAgICAgICAgICBnbFR5cGUgPSBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS50eXBl
ICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgLy8gRGVwdGggc3RlbmNpbCB0ZXh0dXJlcyBuZWVkIHRoZSBERVBUSF9TVEVO
Q0lMIGludGVybmFsIGZvcm1hdAorICAgICAgICAgICAgICAgIC8vIChodHRwczovL3d3dy5raHJv
bm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKQor
ICAgICAgICAgICAgICAgIGlmICggdGV4dHVyZS5mb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1h
dCApIHsKKworICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9T
VEVOQ0lMOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlcnJvciBJTlZBTElEX09QRVJB
VElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFsZm9y
bWF0IGFyZQorICAgICAgICAgICAgICAgICAgICAvLyBERVBUSF9TVEVOQ0lMIGFuZCB0eXBlIGlz
IG5vdCBVTlNJR05FRF9JTlRfMjRfOF9XRUJHTC4KKyAgICAgICAgICAgICAgICAgICAgLy8gKGh0
dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVw
dGhfdGV4dHVyZS8pCisgICAgICAgICAgICAgICAgICAgIGlmICggdGV4dHVyZS50eXBlICE9PSBV
bnNpZ25lZEludDI0OFR5cGUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUu
d2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERl
cHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuJyApOworCisgICAgICAgICAgICAgICAgICAg
ICAgICB0ZXh0dXJlLnR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7CisgICAgICAgICAgICAgICAg
ICAgICAgICBnbFR5cGUgPSBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS50eXBlICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGludGVybmFsRm9ybWF0LCBpbWFn
ZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7CisKKyAg
ICAgICAgICAgIH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZSApIHsKKworICAgICAg
ICAgICAgICAgIC8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlCisg
ICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzCisgICAgICAg
ICAgICAgICAgLy8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0
ZSBvdGhlciBtaXBtYXAgbGV2ZWxzCisKKyAgICAgICAgICAgICAgICBpZiAoIG1pcG1hcHMubGVu
Z3RoID4gMCAmJiBpc1Bvd2VyT2ZUd29JbWFnZSApIHsKKworICAgICAgICAgICAgICAgICAgICBm
b3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgbWlwbWFwID0gbWlwbWFwc1sgaSBdOworICAgICAgICAg
ICAgICAgICAgICAgICAgc3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9y
bWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1p
cG1hcC5kYXRhICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
ICAgIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICB9
IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhU
VVJFXzJELCAwLCBnbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3Jt
YXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICB9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgKSB7CisKKyAgICAg
ICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsg
aSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICBtaXBtYXAgPSBtaXBtYXBzWyBpIF07CisK
KyAgICAgICAgICAgICAgICAgICAgaWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAm
JiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIHN0YXRlLmdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpLmluZGV4T2YoIGds
Rm9ybWF0ICkgPiAtIDEgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5j
b21wcmVzc2VkVGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAu
d2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xl
Lndhcm4oICJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQg
Y29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpIiApOworCisgICAg
ICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQs
IGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBn
bFR5cGUsIG1pcG1hcC5kYXRhICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgLy8g
cmVndWxhciBUZXh0dXJlIChpbWFnZSwgdmlkZW8sIGNhbnZhcykKKworICAgICAgICAgICAgICAg
IC8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlCisgICAgICAgICAg
ICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzCisgICAgICAgICAgICAgICAg
Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBt
aXBtYXAgbGV2ZWxzCisKKyAgICAgICAgICAgICAgICBpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAm
JiBpc1Bvd2VyT2ZUd29JbWFnZSApIHsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIg
aSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgbWlwbWFwID0gbWlwbWFwc1sgaSBdOworICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBnbEZv
cm1hdCwgZ2xUeXBlLCBtaXBtYXAgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICAgICAgdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTsKKworICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUudGV4SW1hZ2Uy
RCggX2dsLlRFWFRVUkVfMkQsIDAsIGdsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZSAp
OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlm
ICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFn
ZSApICkgX2dsLmdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV8yRCApOworCisgICAgICAgICAg
ICB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247CisKKyAgICAg
ICAgICAgIGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUg
KTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVuZGVyIHRhcmdldHMKKworICAgICAgICAv
LyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0
IGZyYW1lYnVmZmVyCisgICAgICAgIGZ1bmN0aW9uIHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCBm
cmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0ICkgewor
CisgICAgICAgICAgICB2YXIgZ2xGb3JtYXQgPSBwYXJhbVRocmVlVG9HTCggcmVuZGVyVGFyZ2V0
LnRleHR1cmUuZm9ybWF0ICk7CisgICAgICAgICAgICB2YXIgZ2xUeXBlID0gcGFyYW1UaHJlZVRv
R0woIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTsKKyAgICAgICAgICAgIHN0YXRlLnRleElt
YWdlMkQoIHRleHR1cmVUYXJnZXQsIDAsIGdsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJl
bmRlclRhcmdldC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTsKKyAgICAgICAg
ICAgIF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTsK
KyAgICAgICAgICAgIF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBh
dHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRl
eHR1cmUgKS5fX3dlYmdsVGV4dHVyZSwgMCApOworICAgICAgICAgICAgX2dsLmJpbmRGcmFtZWJ1
ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBudWxsICk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8v
IFNldHVwIHN0b3JhZ2UgZm9yIGludGVybmFsIGRlcHRoL3N0ZW5jaWwgYnVmZmVycyBhbmQgYmlu
ZCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyCisgICAgICAgIGZ1bmN0aW9uIHNldHVwUmVuZGVyQnVm
ZmVyU3RvcmFnZSggcmVuZGVyYnVmZmVyLCByZW5kZXJUYXJnZXQgKSB7CisKKyAgICAgICAgICAg
IF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTsK
KworICAgICAgICAgICAgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgJiYgISByZW5kZXJU
YXJnZXQuc3RlbmNpbEJ1ZmZlciApIHsKKworICAgICAgICAgICAgICAgIF9nbC5yZW5kZXJidWZm
ZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHJlbmRl
clRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOworICAgICAgICAgICAgICAgIF9n
bC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRU
QUNITUVOVCwgX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyICk7CisKKyAgICAgICAgICAg
IH0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQuc3Rl
bmNpbEJ1ZmZlciApIHsKKworICAgICAgICAgICAgICAgIF9nbC5yZW5kZXJidWZmZXJTdG9yYWdl
KCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTCwgcmVuZGVyVGFyZ2V0LndpZHRo
LCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7CisgICAgICAgICAgICAgICAgX2dsLmZyYW1lYnVmZmVy
UmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1F
TlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApOworCisgICAgICAgICAgICB9IGVs
c2UgeworCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIGRvbid0IHN1cHBvcnQgIWRlcHRo
ICFzdGVuY2lsCisgICAgICAgICAgICAgICAgX2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5S
RU5ERVJCVUZGRVIsIF9nbC5SR0JBNCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQu
aGVpZ2h0ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2dsLmJpbmRSZW5kZXJi
dWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIG51bGwgKTsKKworICAgICAgICB9CisKKyAgICAgICAg
Ly8gU2V0dXAgcmVzb3VyY2VzIGZvciBhIERlcHRoIFRleHR1cmUgZm9yIGEgRkJPIChuZWVkcyBh
biBleHRlbnNpb24pCisgICAgICAgIGZ1bmN0aW9uIHNldHVwRGVwdGhUZXh0dXJlKCBmcmFtZWJ1
ZmZlciwgcmVuZGVyVGFyZ2V0ICkgeworCisgICAgICAgICAgICB2YXIgaXNDdWJlID0gKCByZW5k
ZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICk7CisgICAg
ICAgICAgICBpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvcignRGVwdGggVGV4dHVyZSB3aXRo
IGN1YmUgcmVuZGVyIHRhcmdldHMgaXMgbm90IHN1cHBvcnRlZCEnKTsKKworICAgICAgICAgICAg
X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApOworCisg
ICAgICAgICAgICBpZiAoICEoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgJiYgcmVuZGVyVGFy
Z2V0LmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApICkgeworCisgICAgICAgICAgICAgICAg
dGhyb3cgbmV3IEVycm9yKCdyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlIG11c3QgYmUgYW4gaW5z
dGFuY2Ugb2YgVEhSRUUuRGVwdGhUZXh0dXJlJyk7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgLy8gdXBsb2FkIGFuIGVtcHR5IGRlcHRoIHRleHR1cmUgd2l0aCBmcmFtZWJ1ZmZlciBz
aXplCisgICAgICAgICAgICBpZiAoICFwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRo
VGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlIHx8CisgICAgICAgICAgICAgICAgICAgIHJlbmRlclRh
cmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fAor
ICAgICAgICAgICAgICAgICAgICByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdo
dCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCApIHsKKyAgICAgICAgICAgICAgICByZW5kZXJUYXJn
ZXQuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoID0gcmVuZGVyVGFyZ2V0LndpZHRoOworICAgICAg
ICAgICAgICAgIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gcmVuZGVy
VGFyZ2V0LmhlaWdodDsKKyAgICAgICAgICAgICAgICByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJl
Lm5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0VGV4
dHVyZTJEKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwICk7CisKKyAgICAgICAgICAgIHZh
ciB3ZWJnbERlcHRoVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhU
ZXh0dXJlICkuX193ZWJnbFRleHR1cmU7CisKKyAgICAgICAgICAgIGlmICggcmVuZGVyVGFyZ2V0
LmRlcHRoVGV4dHVyZS5mb3JtYXQgPT09IERlcHRoRm9ybWF0ICkgeworCisgICAgICAgICAgICAg
ICAgX2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9B
VFRBQ0hNRU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTsKKworICAg
ICAgICAgICAgfSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5mb3JtYXQgPT09
IERlcHRoU3RlbmNpbEZvcm1hdCApIHsKKworICAgICAgICAgICAgICAgIF9nbC5mcmFtZWJ1ZmZl
clRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5U
LCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTsKKworICAgICAgICAgICAg
fSBlbHNlIHsKKworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBkZXB0
aFRleHR1cmUgZm9ybWF0JykKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAg
ICAvLyBTZXR1cCBHTCByZXNvdXJjZXMgZm9yIGEgbm9uLXRleHR1cmUgZGVwdGggYnVmZmVyCisg
ICAgICAgIGZ1bmN0aW9uIHNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldCApIHsK
KworICAgICAgICAgICAgdmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdl
dCggcmVuZGVyVGFyZ2V0ICk7CisKKyAgICAgICAgICAgIHZhciBpc0N1YmUgPSAoIHJlbmRlclRh
cmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA9PT0gdHJ1ZSApOworCisgICAgICAgICAgICBp
ZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAo
IGlzQ3ViZSApIHRocm93IG5ldyBFcnJvcigndGFyZ2V0LmRlcHRoVGV4dHVyZSBub3Qgc3VwcG9y
dGVkIGluIEN1YmUgcmVuZGVyIHRhcmdldHMnKTsKKworICAgICAgICAgICAgICAgIHNldHVwRGVw
dGhUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVu
ZGVyVGFyZ2V0ICk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICBp
ZiAoIGlzQ3ViZSApIHsKKworICAgICAgICAgICAgICAgICAgICByZW5kZXJUYXJnZXRQcm9wZXJ0
aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IFtdOworCisgICAgICAgICAgICAgICAgICAgIGZvciAo
IHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIF9n
bC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGll
cy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVu
ZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVS
ZW5kZXJidWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwUmVuZGVyQnVmZmVy
U3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSwg
cmVuZGVyVGFyZ2V0ICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICBfZ2wuYmluZEZyYW1lYnVmZmVyKCBf
Z2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVy
ICk7CisgICAgICAgICAgICAgICAgICAgIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERl
cHRoYnVmZmVyID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpOworICAgICAgICAgICAgICAgICAg
ICBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJn
bERlcHRoYnVmZmVyLCByZW5kZXJUYXJnZXQgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVC
VUZGRVIsIG51bGwgKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHVwIEdMIHJlc291
cmNlcyBmb3IgdGhlIHJlbmRlciB0YXJnZXQKKyAgICAgICAgZnVuY3Rpb24gc2V0dXBSZW5kZXJU
YXJnZXQoIHJlbmRlclRhcmdldCApIHsKKworICAgICAgICAgICAgdmFyIHJlbmRlclRhcmdldFBy
b3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7CisgICAgICAgICAgICB2
YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1
cmUgKTsKKworICAgICAgICAgICAgcmVuZGVyVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNw
b3NlJywgb25SZW5kZXJUYXJnZXREaXNwb3NlICk7CisKKyAgICAgICAgICAgIHRleHR1cmVQcm9w
ZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTsKKworICAgICAgICAg
ICAgaW5mb01lbW9yeS50ZXh0dXJlcyArKzsKKworICAgICAgICAgICAgdmFyIGlzQ3ViZSA9ICgg
cmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID09PSB0cnVlICk7CisgICAgICAg
ICAgICB2YXIgaXNUYXJnZXRQb3dlck9mVHdvID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQg
KTsKKworICAgICAgICAgICAgLy8gU2V0dXAgZnJhbWVidWZmZXIKKworICAgICAgICAgICAgaWYg
KCBpc0N1YmUgKSB7CisKKyAgICAgICAgICAgICAgICByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9f
d2ViZ2xGcmFtZWJ1ZmZlciA9IFtdOworCisgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAw
OyBpIDwgNjsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICByZW5kZXJUYXJnZXRQcm9w
ZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7
CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAg
ICAgICAgICByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IF9nbC5j
cmVhdGVGcmFtZWJ1ZmZlcigpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNl
dHVwIGNvbG9yIGJ1ZmZlcgorCisgICAgICAgICAgICBpZiAoIGlzQ3ViZSApIHsKKworICAgICAg
ICAgICAgICAgIHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVy
ZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTsKKyAgICAgICAgICAgICAgICBzZXRUZXh0dXJl
UGFyYW1ldGVycyggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBp
c1RhcmdldFBvd2VyT2ZUd28gKTsKKworICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0gMDsg
aSA8IDY7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgc2V0dXBGcmFtZUJ1ZmZlclRl
eHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0sIHJl
bmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9Q
T1NJVElWRV9YICsgaSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHJlbmRlclRhcmdldC50ZXh0dXJlLCBp
c1RhcmdldFBvd2VyT2ZUd28gKSApIF9nbC5nZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VC
RV9NQVAgKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVf
Q1VCRV9NQVAsIG51bGwgKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAg
ICAgIHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMu
X193ZWJnbFRleHR1cmUgKTsKKyAgICAgICAgICAgICAgICBzZXRUZXh0dXJlUGFyYW1ldGVycygg
X2dsLlRFWFRVUkVfMkQsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28g
KTsKKyAgICAgICAgICAgICAgICBzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0
UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FU
VEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV8yRCApOworCisgICAgICAgICAgICAgICAgaWYgKCB0ZXh0
dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBv
d2VyT2ZUd28gKSApIF9nbC5nZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQgKTsKKyAgICAg
ICAgICAgICAgICBzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIG51bGwgKTsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZXR1cCBkZXB0aCBhbmQgc3RlbmNpbCBi
dWZmZXJzCisKKyAgICAgICAgICAgIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICkgewor
CisgICAgICAgICAgICAgICAgc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gdXBkYXRl
UmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQgKSB7CisKKyAgICAgICAgICAgIHZhciB0
ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7CisgICAgICAgICAgICB2YXIgaXNUYXJnZXRQ
b3dlck9mVHdvID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKTsKKworICAgICAgICAgICAg
aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzVGFyZ2V0UG93ZXJP
ZlR3byApICkgeworCisgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHJlbmRlclRhcmdldC5p
c1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA/IF9nbC5URVhUVVJFX0NVQkVfTUFQIDogX2dsLlRFWFRV
UkVfMkQ7CisgICAgICAgICAgICAgICAgdmFyIHdlYmdsVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0
KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmU7CisKKyAgICAgICAgICAgICAgICBzdGF0ZS5iaW5k
VGV4dHVyZSggdGFyZ2V0LCB3ZWJnbFRleHR1cmUgKTsKKyAgICAgICAgICAgICAgICBfZ2wuZ2Vu
ZXJhdGVNaXBtYXAoIHRhcmdldCApOworICAgICAgICAgICAgICAgIHN0YXRlLmJpbmRUZXh0dXJl
KCB0YXJnZXQsIG51bGwgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAg
ICB0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDsKKyAgICAgICAgdGhpcy5zZXRUZXh0
dXJlQ3ViZSA9IHNldFRleHR1cmVDdWJlOworICAgICAgICB0aGlzLnNldFRleHR1cmVDdWJlRHlu
YW1pYyA9IHNldFRleHR1cmVDdWJlRHluYW1pYzsKKyAgICAgICAgdGhpcy5zZXR1cFJlbmRlclRh
cmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0OworICAgICAgICB0aGlzLnVwZGF0ZVJlbmRlclRhcmdl
dE1pcG1hcCA9IHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcDsKKworICAgIH0KKworICAgIC8qKgor
ICAgICAqIEBhdXRob3IgZm9yZGFjaW91cyAvIGZvcmRhY2lvdXMuZ2l0aHViLmlvCisgICAgICov
CisKKyAgICBmdW5jdGlvbiBXZWJHTFByb3BlcnRpZXMoKSB7CisKKyAgICAgICAgdmFyIHByb3Bl
cnRpZXMgPSB7fTsKKworICAgICAgICBmdW5jdGlvbiBnZXQoIG9iamVjdCApIHsKKworICAgICAg
ICAgICAgdmFyIHV1aWQgPSBvYmplY3QudXVpZDsKKyAgICAgICAgICAgIHZhciBtYXAgPSBwcm9w
ZXJ0aWVzWyB1dWlkIF07CisKKyAgICAgICAgICAgIGlmICggbWFwID09PSB1bmRlZmluZWQgKSB7
CisKKyAgICAgICAgICAgICAgICBtYXAgPSB7fTsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVz
WyB1dWlkIF0gPSBtYXA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1h
cDsKKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gcmVtb3ZlKCBvYmplY3QgKSB7CisK
KyAgICAgICAgICAgIGRlbGV0ZSBwcm9wZXJ0aWVzWyBvYmplY3QudXVpZCBdOworCisgICAgICAg
IH0KKworICAgICAgICBmdW5jdGlvbiBjbGVhcigpIHsKKworICAgICAgICAgICAgcHJvcGVydGll
cyA9IHt9OworCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geworICAgICAgICAgICAgZ2V0
OiBnZXQsCisgICAgICAgICAgICByZW1vdmU6IHJlbW92ZSwKKyAgICAgICAgICAgIGNsZWFyOiBj
bGVhcgorICAgICAgICB9OworCisgICAgfQorCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRv
b2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFdlYkdMU3Rh
dGUoIGdsLCBleHRlbnNpb25zLCBwYXJhbVRocmVlVG9HTCApIHsKKworICAgICAgICBmdW5jdGlv
biBDb2xvckJ1ZmZlcigpIHsKKworICAgICAgICAgICAgdmFyIGxvY2tlZCA9IGZhbHNlOworCisg
ICAgICAgICAgICB2YXIgY29sb3IgPSBuZXcgVmVjdG9yNCgpOworICAgICAgICAgICAgdmFyIGN1
cnJlbnRDb2xvck1hc2sgPSBudWxsOworICAgICAgICAgICAgdmFyIGN1cnJlbnRDb2xvckNsZWFy
ID0gbmV3IFZlY3RvcjQoKTsKKworICAgICAgICAgICAgcmV0dXJuIHsKKworICAgICAgICAgICAg
ICAgIHNldE1hc2s6IGZ1bmN0aW9uICggY29sb3JNYXNrICkgeworCisgICAgICAgICAgICAgICAg
ICAgIGlmICggY3VycmVudENvbG9yTWFzayAhPT0gY29sb3JNYXNrICYmICEgbG9ja2VkICkgewor
CisgICAgICAgICAgICAgICAgICAgICAgICBnbC5jb2xvck1hc2soIGNvbG9yTWFzaywgY29sb3JN
YXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzayApOworICAgICAgICAgICAgICAgICAgICAgICAgY3Vy
cmVudENvbG9yTWFzayA9IGNvbG9yTWFzazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgc2V0TG9ja2VkOiBmdW5jdGlvbiAo
IGxvY2sgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgbG9ja2VkID0gbG9jazsKKworICAgICAg
ICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICBzZXRDbGVhcjogZnVuY3Rpb24gKCByLCBn
LCBiLCBhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYg
KCBwcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHIgKj0gYTsgZyAqPSBhOyBiICo9IGE7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgICAgIGNvbG9yLnNldCggciwgZywgYiwgYSApOworCisgICAgICAgICAg
ICAgICAgICAgIGlmICggY3VycmVudENvbG9yQ2xlYXIuZXF1YWxzKCBjb2xvciApID09PSBmYWxz
ZSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2wuY2xlYXJDb2xvciggciwgZywgYiwg
YSApOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbG9yQ2xlYXIuY29weSggY29s
b3IgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9LAorCisg
ICAgICAgICAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgICAg
ICBsb2NrZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29sb3JNYXNr
ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbG9yQ2xlYXIuc2V0KCAwLCAw
LCAwLCAxICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH07CisKKyAgICAg
ICAgfQorCisgICAgICAgIGZ1bmN0aW9uIERlcHRoQnVmZmVyKCkgeworCisgICAgICAgICAgICB2
YXIgbG9ja2VkID0gZmFsc2U7CisKKyAgICAgICAgICAgIHZhciBjdXJyZW50RGVwdGhNYXNrID0g
bnVsbDsKKyAgICAgICAgICAgIHZhciBjdXJyZW50RGVwdGhGdW5jID0gbnVsbDsKKyAgICAgICAg
ICAgIHZhciBjdXJyZW50RGVwdGhDbGVhciA9IG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiB7
CisKKyAgICAgICAgICAgICAgICBzZXRUZXN0OiBmdW5jdGlvbiAoIGRlcHRoVGVzdCApIHsKKwor
ICAgICAgICAgICAgICAgICAgICBpZiAoIGRlcHRoVGVzdCApIHsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7CisKKyAgICAgICAgICAgICAgICAgICAg
fSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSggZ2wuREVQVEhfVEVT
VCApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0sCisKKyAg
ICAgICAgICAgICAgICBzZXRNYXNrOiBmdW5jdGlvbiAoIGRlcHRoTWFzayApIHsKKworICAgICAg
ICAgICAgICAgICAgICBpZiAoIGN1cnJlbnREZXB0aE1hc2sgIT09IGRlcHRoTWFzayAmJiAhIGxv
Y2tlZCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2wuZGVwdGhNYXNrKCBkZXB0aE1h
c2sgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXB0aE1hc2sgPSBkZXB0aE1h
c2s7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSwKKworICAg
ICAgICAgICAgICAgIHNldEZ1bmM6IGZ1bmN0aW9uICggZGVwdGhGdW5jICkgeworCisgICAgICAg
ICAgICAgICAgICAgIGlmICggY3VycmVudERlcHRoRnVuYyAhPT0gZGVwdGhGdW5jICkgeworCisg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRlcHRoRnVuYyApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN3aXRjaCAoIGRlcHRoRnVuYyApIHsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjYXNlIE5ldmVyRGVwdGg6CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGdsLmRlcHRoRnVuYyggZ2wuTkVWRVIgKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNhc2UgQWx3YXlzRGVwdGg6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGdsLmRlcHRoRnVuYyggZ2wuQUxXQVlTICk7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
YXNlIExlc3NEZXB0aDoKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wu
ZGVwdGhGdW5jKCBnbC5MRVNTICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExlc3NFcXVh
bERlcHRoOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbC5kZXB0aEZ1
bmMoIGdsLkxFUVVBTCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFcXVhbERlcHRoOgor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbC5kZXB0aEZ1bmMoIGdsLkVR
VUFMICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdyZWF0ZXJFcXVhbERlcHRoOgorCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbC5kZXB0aEZ1bmMoIGdsLkdFUVVB
TCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHcmVhdGVyRGVwdGg6CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsLmRlcHRoRnVuYyggZ2wuR1JFQVRFUiApOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY2FzZSBOb3RFcXVhbERlcHRoOgorCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBnbC5kZXB0aEZ1bmMoIGdsLk5PVEVRVUFMICk7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApOworCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZ2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVw
dGhGdW5jID0gZGVwdGhGdW5jOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICBzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayAp
IHsKKworICAgICAgICAgICAgICAgICAgICBsb2NrZWQgPSBsb2NrOworCisgICAgICAgICAgICAg
ICAgfSwKKworICAgICAgICAgICAgICAgIHNldENsZWFyOiBmdW5jdGlvbiAoIGRlcHRoICkgewor
CisgICAgICAgICAgICAgICAgICAgIGlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkg
eworCisgICAgICAgICAgICAgICAgICAgICAgICBnbC5jbGVhckRlcHRoKCBkZXB0aCApOworICAg
ICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcHRoQ2xlYXIgPSBkZXB0aDsKKworICAgICAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAg
cmVzZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgICAgICBsb2NrZWQgPSBmYWxz
ZTsKKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwdGhNYXNrID0gbnVsbDsKKyAgICAg
ICAgICAgICAgICAgICAgY3VycmVudERlcHRoRnVuYyA9IG51bGw7CisgICAgICAgICAgICAgICAg
ICAgIGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDsKKworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgfTsKKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gU3RlbmNpbEJ1ZmZl
cigpIHsKKworICAgICAgICAgICAgdmFyIGxvY2tlZCA9IGZhbHNlOworCisgICAgICAgICAgICB2
YXIgY3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBjdXJyZW50U3Rl
bmNpbEZ1bmMgPSBudWxsOworICAgICAgICAgICAgdmFyIGN1cnJlbnRTdGVuY2lsUmVmID0gbnVs
bDsKKyAgICAgICAgICAgIHZhciBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDsKKyAgICAg
ICAgICAgIHZhciBjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsOworICAgICAgICAgICAgdmFyIGN1
cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsOworICAgICAgICAgICAgdmFyIGN1cnJlbnRTdGVuY2ls
WlBhc3MgPSBudWxsOworICAgICAgICAgICAgdmFyIGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxs
OworCisgICAgICAgICAgICByZXR1cm4geworCisgICAgICAgICAgICAgICAgc2V0VGVzdDogZnVu
Y3Rpb24gKCBzdGVuY2lsVGVzdCApIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0ZW5j
aWxUZXN0ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUoIGdsLlNURU5DSUxf
VEVTVCApOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGRpc2FibGUoIGdsLlNURU5DSUxfVEVTVCApOworCisgICAgICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICBzZXRNYXNrOiBm
dW5jdGlvbiAoIHN0ZW5jaWxNYXNrICkgeworCisgICAgICAgICAgICAgICAgICAgIGlmICggY3Vy
cmVudFN0ZW5jaWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgZ2wuc3RlbmNpbE1hc2soIHN0ZW5jaWxNYXNrICk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBjdXJyZW50U3RlbmNpbE1hc2sgPSBzdGVuY2lsTWFzazsKKworICAg
ICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAg
ICAgc2V0RnVuYzogZnVuY3Rpb24gKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1h
c2sgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjdXJyZW50U3RlbmNpbEZ1bmMgIT09
IHN0ZW5jaWxGdW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ZW5jaWxS
ZWYgICE9PSBzdGVuY2lsUmVmICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRT
dGVuY2lsRnVuY01hc2sgIT09IHN0ZW5jaWxNYXNrICkgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICBnbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNr
ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGVuY2lsRnVuYyA9IHN0ZW5j
aWxGdW5jOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ZW5jaWxSZWYgPSBzdGVu
Y2lsUmVmOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ZW5jaWxGdW5jTWFzayA9
IHN0ZW5jaWxNYXNrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IH0sCisKKyAgICAgICAgICAgICAgICBzZXRPcDogZnVuY3Rpb24gKCBzdGVuY2lsRmFpbCwgc3Rl
bmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBj
dXJyZW50U3RlbmNpbEZhaWwgICE9PSBzdGVuY2lsRmFpbCAgICB8fAorICAgICAgICAgICAgICAg
ICAgICAgICAgIGN1cnJlbnRTdGVuY2lsWkZhaWwgIT09IHN0ZW5jaWxaRmFpbCB8fAorICAgICAg
ICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGVuY2lsWlBhc3MgIT09IHN0ZW5jaWxaUGFzcyAp
IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2wuc3RlbmNpbE9wKCBzdGVuY2lsRmFpbCwg
c3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
Y3VycmVudFN0ZW5jaWxGYWlsID0gc3RlbmNpbEZhaWw7CisgICAgICAgICAgICAgICAgICAgICAg
ICBjdXJyZW50U3RlbmNpbFpGYWlsID0gc3RlbmNpbFpGYWlsOworICAgICAgICAgICAgICAgICAg
ICAgICAgY3VycmVudFN0ZW5jaWxaUGFzcyA9IHN0ZW5jaWxaUGFzczsKKworICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgc2V0TG9j
a2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgbG9ja2VkID0g
bG9jazsKKworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICBzZXRDbGVhcjog
ZnVuY3Rpb24gKCBzdGVuY2lsICkgeworCisgICAgICAgICAgICAgICAgICAgIGlmICggY3VycmVu
dFN0ZW5jaWxDbGVhciAhPT0gc3RlbmNpbCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
Z2wuY2xlYXJTdGVuY2lsKCBzdGVuY2lsICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJy
ZW50U3RlbmNpbENsZWFyID0gc3RlbmNpbDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHsK
KworICAgICAgICAgICAgICAgICAgICBsb2NrZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAg
ICAgICBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBjdXJy
ZW50U3RlbmNpbEZ1bmMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlbmNp
bFJlZiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sg
PSBudWxsOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsOwor
ICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDsKKyAgICAgICAg
ICAgICAgICAgICAgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7CisgICAgICAgICAgICAgICAg
ICAgIGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsOworCisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB9OworCisgICAgICAgIH0KKworICAgICAgICAvLworCisgICAgICAgIHZhciBj
b2xvckJ1ZmZlciA9IG5ldyBDb2xvckJ1ZmZlcigpOworICAgICAgICB2YXIgZGVwdGhCdWZmZXIg
PSBuZXcgRGVwdGhCdWZmZXIoKTsKKyAgICAgICAgdmFyIHN0ZW5jaWxCdWZmZXIgPSBuZXcgU3Rl
bmNpbEJ1ZmZlcigpOworCisgICAgICAgIHZhciBtYXhWZXJ0ZXhBdHRyaWJ1dGVzID0gZ2wuZ2V0
UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX0FUVFJJQlMgKTsKKyAgICAgICAgdmFyIG5ld0F0dHJp
YnV0ZXMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApOworICAgICAgICB2
YXIgZW5hYmxlZEF0dHJpYnV0ZXMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRl
cyApOworICAgICAgICB2YXIgYXR0cmlidXRlRGl2aXNvcnMgPSBuZXcgVWludDhBcnJheSggbWF4
VmVydGV4QXR0cmlidXRlcyApOworCisgICAgICAgIHZhciBjYXBhYmlsaXRpZXMgPSB7fTsKKwor
ICAgICAgICB2YXIgY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gbnVsbDsKKworICAgICAgICB2
YXIgY3VycmVudEJsZW5kaW5nID0gbnVsbDsKKyAgICAgICAgdmFyIGN1cnJlbnRCbGVuZEVxdWF0
aW9uID0gbnVsbDsKKyAgICAgICAgdmFyIGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7CisgICAgICAg
IHZhciBjdXJyZW50QmxlbmREc3QgPSBudWxsOworICAgICAgICB2YXIgY3VycmVudEJsZW5kRXF1
YXRpb25BbHBoYSA9IG51bGw7CisgICAgICAgIHZhciBjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51
bGw7CisgICAgICAgIHZhciBjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7CisgICAgICAgIHZh
ciBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBmYWxzZTsKKworICAgICAgICB2YXIgY3VycmVu
dEZsaXBTaWRlZCA9IG51bGw7CisgICAgICAgIHZhciBjdXJyZW50Q3VsbEZhY2UgPSBudWxsOwor
CisgICAgICAgIHZhciBjdXJyZW50TGluZVdpZHRoID0gbnVsbDsKKworICAgICAgICB2YXIgY3Vy
cmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsOworICAgICAgICB2YXIgY3VycmVudFBvbHln
b25PZmZzZXRVbml0cyA9IG51bGw7CisKKyAgICAgICAgdmFyIGN1cnJlbnRTY2lzc29yVGVzdCA9
IG51bGw7CisKKyAgICAgICAgdmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5N
QVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyApOworCisgICAgICAgIHZhciB2ZXJzaW9u
ID0gcGFyc2VGbG9hdCggL15XZWJHTFwgKFswLTldKS8uZXhlYyggZ2wuZ2V0UGFyYW1ldGVyKCBn
bC5WRVJTSU9OICkgKVsgMSBdICk7CisgICAgICAgIHZhciBsaW5lV2lkdGhBdmFpbGFibGUgPSBw
YXJzZUZsb2F0KCB2ZXJzaW9uICkgPj0gMS4wOworCisgICAgICAgIHZhciBjdXJyZW50VGV4dHVy
ZVNsb3QgPSBudWxsOworICAgICAgICB2YXIgY3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTsKKwor
ICAgICAgICB2YXIgY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCgpOworICAgICAgICB2YXIg
Y3VycmVudFZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTsKKworICAgICAgICBmdW5jdGlvbiBjcmVh
dGVUZXh0dXJlKCB0eXBlLCB0YXJnZXQsIGNvdW50ICkgeworCisgICAgICAgICAgICB2YXIgZGF0
YSA9IG5ldyBVaW50OEFycmF5KCA0ICk7IC8vIDQgaXMgcmVxdWlyZWQgdG8gbWF0Y2ggZGVmYXVs
dCB1bnBhY2sgYWxpZ25tZW50IG9mIDQuCisgICAgICAgICAgICB2YXIgdGV4dHVyZSA9IGdsLmNy
ZWF0ZVRleHR1cmUoKTsKKworICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoIHR5cGUsIHRleHR1
cmUgKTsKKyAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUlO
X0ZJTFRFUiwgZ2wuTkVBUkVTVCApOworICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaSggdHlw
ZSwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUICk7CisKKyAgICAgICAgICAgIGZv
ciAoIHZhciBpID0gMDsgaSA8IGNvdW50OyBpICsrICkgeworCisgICAgICAgICAgICAgICAgZ2wu
dGV4SW1hZ2UyRCggdGFyZ2V0ICsgaSwgMCwgZ2wuUkdCQSwgMSwgMSwgMCwgZ2wuUkdCQSwgZ2wu
VU5TSUdORURfQllURSwgZGF0YSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJl
dHVybiB0ZXh0dXJlOworCisgICAgICAgIH0KKworICAgICAgICB2YXIgZW1wdHlUZXh0dXJlcyA9
IHt9OworICAgICAgICBlbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFXzJEIF0gPSBjcmVhdGVUZXh0
dXJlKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFXzJELCAxICk7CisgICAgICAgIGVtcHR5VGV4
dHVyZXNbIGdsLlRFWFRVUkVfQ1VCRV9NQVAgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVf
Q1VCRV9NQVAsIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwgNiApOworCisgICAgICAg
IC8vCisKKyAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHsKKworICAgICAgICAgICAgY29sb3JCdWZm
ZXIuc2V0Q2xlYXIoIDAsIDAsIDAsIDEgKTsKKyAgICAgICAgICAgIGRlcHRoQnVmZmVyLnNldENs
ZWFyKCAxICk7CisgICAgICAgICAgICBzdGVuY2lsQnVmZmVyLnNldENsZWFyKCAwICk7CisKKyAg
ICAgICAgICAgIGVuYWJsZSggZ2wuREVQVEhfVEVTVCApOworICAgICAgICAgICAgZGVwdGhCdWZm
ZXIuc2V0RnVuYyggTGVzc0VxdWFsRGVwdGggKTsKKworICAgICAgICAgICAgc2V0RmxpcFNpZGVk
KCBmYWxzZSApOworICAgICAgICAgICAgc2V0Q3VsbEZhY2UoIEN1bGxGYWNlQmFjayApOworICAg
ICAgICAgICAgZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTsKKworICAgICAgICAgICAgZW5hYmxlKCBn
bC5CTEVORCApOworICAgICAgICAgICAgc2V0QmxlbmRpbmcoIE5vcm1hbEJsZW5kaW5nICk7CisK
KyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGluaXRBdHRyaWJ1dGVzKCkgeworCisgICAg
ICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBuZXdBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGw7
IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICBuZXdBdHRyaWJ1dGVzWyBpIF0gPSAwOworCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGVuYWJsZUF0dHJp
YnV0ZSggYXR0cmlidXRlICkgeworCisgICAgICAgICAgICBuZXdBdHRyaWJ1dGVzWyBhdHRyaWJ1
dGUgXSA9IDE7CisKKyAgICAgICAgICAgIGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0
ZSBdID09PSAwICkgeworCisgICAgICAgICAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJy
YXkoIGF0dHJpYnV0ZSApOworICAgICAgICAgICAgICAgIGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRy
aWJ1dGUgXSA9IDE7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBhdHRyaWJ1
dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09IDAgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIg
ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApOwor
CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSggYXR0
cmlidXRlLCAwICk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0
ZSBdID0gMDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlv
biBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUg
KSB7CisKKyAgICAgICAgICAgIG5ld0F0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTsKKworICAg
ICAgICAgICAgaWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7CisK
KyAgICAgICAgICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7
CisgICAgICAgICAgICAgICAgZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRy
aWJ1dGUgXSAhPT0gbWVzaFBlckF0dHJpYnV0ZSApIHsKKworICAgICAgICAgICAgICAgIHZhciBl
eHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7CisK
KyAgICAgICAgICAgICAgICBleHRlbnNpb24udmVydGV4QXR0cmliRGl2aXNvckFOR0xFKCBhdHRy
aWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUgKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVEaXZp
c29yc1sgYXR0cmlidXRlIF0gPSBtZXNoUGVyQXR0cmlidXRlOworCisgICAgICAgICAgICB9CisK
KyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCkg
eworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBlbmFibGVkQXR0cmlidXRlcy5s
ZW5ndGg7IGkgIT09IGw7ICsrIGkgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoIGVuYWJsZWRB
dHRyaWJ1dGVzWyBpIF0gIT09IG5ld0F0dHJpYnV0ZXNbIGkgXSApIHsKKworICAgICAgICAgICAg
ICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoIGkgKTsKKyAgICAgICAgICAgICAg
ICAgICAgZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9IDA7CisKKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gZW5hYmxlKCBp
ZCApIHsKKworICAgICAgICAgICAgaWYgKCBjYXBhYmlsaXRpZXNbIGlkIF0gIT09IHRydWUgKSB7
CisKKyAgICAgICAgICAgICAgICBnbC5lbmFibGUoIGlkICk7CisgICAgICAgICAgICAgICAgY2Fw
YWJpbGl0aWVzWyBpZCBdID0gdHJ1ZTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKwor
ICAgICAgICBmdW5jdGlvbiBkaXNhYmxlKCBpZCApIHsKKworICAgICAgICAgICAgaWYgKCBjYXBh
YmlsaXRpZXNbIGlkIF0gIT09IGZhbHNlICkgeworCisgICAgICAgICAgICAgICAgZ2wuZGlzYWJs
ZSggaWQgKTsKKyAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXNbIGlkIF0gPSBmYWxzZTsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBnZXRDb21wcmVz
c2VkVGV4dHVyZUZvcm1hdHMoKSB7CisKKyAgICAgICAgICAgIGlmICggY29tcHJlc3NlZFRleHR1
cmVGb3JtYXRzID09PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgY29tcHJlc3NlZFRleHR1
cmVGb3JtYXRzID0gW107CisKKyAgICAgICAgICAgICAgICBpZiAoIGV4dGVuc2lvbnMuZ2V0KCAn
V0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApIHx8CisgICAgICAgICAgICAgICAgICAg
ICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8Cisg
ICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4
dHVyZV9ldGMxJyApICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBmb3JtYXRzID0gZ2wu
Z2V0UGFyYW1ldGVyKCBnbC5DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyApOworCisgICAgICAg
ICAgICAgICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGZvcm1hdHMubGVuZ3RoOyBpICsrICkg
eworCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMucHVz
aCggZm9ybWF0c1sgaSBdICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjb21wcmVzc2Vk
VGV4dHVyZUZvcm1hdHM7CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHNldEJsZW5k
aW5nKCBibGVuZGluZywgYmxlbmRFcXVhdGlvbiwgYmxlbmRTcmMsIGJsZW5kRHN0LCBibGVuZEVx
dWF0aW9uQWxwaGEsIGJsZW5kU3JjQWxwaGEsIGJsZW5kRHN0QWxwaGEsIHByZW11bHRpcGxpZWRB
bHBoYSApIHsKKworICAgICAgICAgICAgaWYgKCBibGVuZGluZyAhPT0gTm9CbGVuZGluZyApIHsK
KworICAgICAgICAgICAgICAgIGVuYWJsZSggZ2wuQkxFTkQgKTsKKworICAgICAgICAgICAgfSBl
bHNlIHsKKworICAgICAgICAgICAgICAgIGRpc2FibGUoIGdsLkJMRU5EICk7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaWYgKCAoIGJsZW5kaW5nICE9PSBDdXN0b21CbGVuZGluZyAp
ICYmICggYmxlbmRpbmcgIT09IGN1cnJlbnRCbGVuZGluZyB8fCBwcmVtdWx0aXBsaWVkQWxwaGEg
IT09IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSApICkgeworCisgICAgICAgICAgICAgICAgaWYg
KCBibGVuZGluZyA9PT0gQWRkaXRpdmVCbGVuZGluZyApIHsKKworICAgICAgICAgICAgICAgICAg
ICBpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5PTkUsIGdsLk9O
RSwgZ2wuT05FLCBnbC5PTkUgKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisg
ICAgICAgICAgICAgICAgICAgICAgICBnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApOwor
ICAgICAgICAgICAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jKCBnbC5TUkNfQUxQSEEsIGdsLk9O
RSApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBp
ZiAoIGJsZW5kaW5nID09PSBTdWJ0cmFjdGl2ZUJsZW5kaW5nICkgeworCisgICAgICAgICAgICAg
ICAgICAgIGlmICggcHJlbXVsdGlwbGllZEFscGhhICkgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICBnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCAp
OworICAgICAgICAgICAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8s
IGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEg
KTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICBnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApOworICAgICAgICAgICAgICAgICAg
ICAgICAgZ2wuYmxlbmRGdW5jKCBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SICk7CisK
KyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYmxl
bmRpbmcgPT09IE11bHRpcGx5QmxlbmRpbmcgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYg
KCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsLmJs
ZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuU1JDX0NP
TE9SLCBnbC5aRVJPLCBnbC5TUkNfQUxQSEEgKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVs
c2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICBnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5D
X0FERCApOworICAgICAgICAgICAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jKCBnbC5aRVJPLCBn
bC5TUkNfQ09MT1IgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIGlmICggcHJlbXVsdGlwbGllZEFscGhh
ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUo
IGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApOworICAgICAgICAgICAgICAgICAgICAgICAgZ2wu
YmxlbmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05F
LCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNl
IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBn
bC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsLmJs
ZW5kRnVuY1NlcGFyYXRlKCBnbC5TUkNfQUxQSEEsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsIGds
Lk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApOworCisgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGN1cnJlbnRCbGVuZGluZyA9
IGJsZW5kaW5nOworICAgICAgICAgICAgICAgIGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IHBy
ZW11bHRpcGxpZWRBbHBoYTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGJs
ZW5kaW5nID09PSBDdXN0b21CbGVuZGluZyApIHsKKworICAgICAgICAgICAgICAgIGJsZW5kRXF1
YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYSB8fCBibGVuZEVxdWF0aW9uOworICAgICAg
ICAgICAgICAgIGJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhIHx8IGJsZW5kU3JjOworICAg
ICAgICAgICAgICAgIGJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhIHx8IGJsZW5kRHN0Owor
CisgICAgICAgICAgICAgICAgaWYgKCBibGVuZEVxdWF0aW9uICE9PSBjdXJyZW50QmxlbmRFcXVh
dGlvbiB8fCBibGVuZEVxdWF0aW9uQWxwaGEgIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgZ2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBwYXJh
bVRocmVlVG9HTCggYmxlbmRFcXVhdGlvbiApLCBwYXJhbVRocmVlVG9HTCggYmxlbmRFcXVhdGlv
bkFscGhhICkgKTsKKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxlbmRFcXVhdGlvbiA9
IGJsZW5kRXF1YXRpb247CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbGVuZEVxdWF0aW9u
QWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGE7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICBpZiAoIGJsZW5kU3JjICE9PSBjdXJyZW50QmxlbmRTcmMgfHwgYmxlbmREc3Qg
IT09IGN1cnJlbnRCbGVuZERzdCB8fCBibGVuZFNyY0FscGhhICE9PSBjdXJyZW50QmxlbmRTcmNB
bHBoYSB8fCBibGVuZERzdEFscGhhICE9PSBjdXJyZW50QmxlbmREc3RBbHBoYSApIHsKKworICAg
ICAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggcGFyYW1UaHJlZVRvR0woIGJs
ZW5kU3JjICksIHBhcmFtVGhyZWVUb0dMKCBibGVuZERzdCApLCBwYXJhbVRocmVlVG9HTCggYmxl
bmRTcmNBbHBoYSApLCBwYXJhbVRocmVlVG9HTCggYmxlbmREc3RBbHBoYSApICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgY3VycmVudEJsZW5kU3JjID0gYmxlbmRTcmM7CisgICAgICAgICAgICAg
ICAgICAgIGN1cnJlbnRCbGVuZERzdCA9IGJsZW5kRHN0OworICAgICAgICAgICAgICAgICAgICBj
dXJyZW50QmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGE7CisgICAgICAgICAgICAgICAgICAg
IGN1cnJlbnRCbGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYTsKKworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGN1cnJlbnRCbGVu
ZEVxdWF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBjdXJyZW50QmxlbmRTcmMgPSBudWxs
OworICAgICAgICAgICAgICAgIGN1cnJlbnRCbGVuZERzdCA9IG51bGw7CisgICAgICAgICAgICAg
ICAgY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7CisgICAgICAgICAgICAgICAgY3Vy
cmVudEJsZW5kU3JjQWxwaGEgPSBudWxsOworICAgICAgICAgICAgICAgIGN1cnJlbnRCbGVuZERz
dEFscGhhID0gbnVsbDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBm
dW5jdGlvbiBzZXRNYXRlcmlhbCggbWF0ZXJpYWwgKSB7CisKKyAgICAgICAgICAgIG1hdGVyaWFs
LnNpZGUgPT09IERvdWJsZVNpZGUKKyAgICAgICAgICAgICAgICA/IGRpc2FibGUoIGdsLkNVTExf
RkFDRSApCisgICAgICAgICAgICAgICAgOiBlbmFibGUoIGdsLkNVTExfRkFDRSApOworCisgICAg
ICAgICAgICBzZXRGbGlwU2lkZWQoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICk7CisKKyAg
ICAgICAgICAgIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlCisgICAgICAgICAgICAgICAg
PyBzZXRCbGVuZGluZyggbWF0ZXJpYWwuYmxlbmRpbmcsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24s
IG1hdGVyaWFsLmJsZW5kU3JjLCBtYXRlcmlhbC5ibGVuZERzdCwgbWF0ZXJpYWwuYmxlbmRFcXVh
dGlvbkFscGhhLCBtYXRlcmlhbC5ibGVuZFNyY0FscGhhLCBtYXRlcmlhbC5ibGVuZERzdEFscGhh
LCBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEgKQorICAgICAgICAgICAgICAgIDogc2V0Qmxl
bmRpbmcoIE5vQmxlbmRpbmcgKTsKKworICAgICAgICAgICAgZGVwdGhCdWZmZXIuc2V0RnVuYygg
bWF0ZXJpYWwuZGVwdGhGdW5jICk7CisgICAgICAgICAgICBkZXB0aEJ1ZmZlci5zZXRUZXN0KCBt
YXRlcmlhbC5kZXB0aFRlc3QgKTsKKyAgICAgICAgICAgIGRlcHRoQnVmZmVyLnNldE1hc2soIG1h
dGVyaWFsLmRlcHRoV3JpdGUgKTsKKyAgICAgICAgICAgIGNvbG9yQnVmZmVyLnNldE1hc2soIG1h
dGVyaWFsLmNvbG9yV3JpdGUgKTsKKworICAgICAgICAgICAgc2V0UG9seWdvbk9mZnNldCggbWF0
ZXJpYWwucG9seWdvbk9mZnNldCwgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciwgbWF0ZXJp
YWwucG9seWdvbk9mZnNldFVuaXRzICk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vCisKKyAg
ICAgICAgZnVuY3Rpb24gc2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKSB7CisKKyAgICAgICAgICAg
IGlmICggY3VycmVudEZsaXBTaWRlZCAhPT0gZmxpcFNpZGVkICkgeworCisgICAgICAgICAgICAg
ICAgaWYgKCBmbGlwU2lkZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZ2wuZnJvbnRGYWNl
KCBnbC5DVyApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAg
ICAgICBnbC5mcm9udEZhY2UoIGdsLkNDVyApOworCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgY3VycmVudEZsaXBTaWRlZCA9IGZsaXBTaWRlZDsKKworICAgICAgICAgICAg
fQorCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBzZXRDdWxsRmFjZSggY3VsbEZhY2Ug
KSB7CisKKyAgICAgICAgICAgIGlmICggY3VsbEZhY2UgIT09IEN1bGxGYWNlTm9uZSApIHsKKwor
ICAgICAgICAgICAgICAgIGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7CisKKyAgICAgICAgICAgICAg
ICBpZiAoIGN1bGxGYWNlICE9PSBjdXJyZW50Q3VsbEZhY2UgKSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VCYWNrICkgeworCisgICAgICAgICAgICAg
ICAgICAgICAgICBnbC5jdWxsRmFjZSggZ2wuQkFDSyApOworCisgICAgICAgICAgICAgICAgICAg
IH0gZWxzZSBpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUZyb250ICkgeworCisgICAgICAgICAg
ICAgICAgICAgICAgICBnbC5jdWxsRmFjZSggZ2wuRlJPTlQgKTsKKworICAgICAgICAgICAgICAg
ICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICBnbC5jdWxsRmFjZSggZ2wu
RlJPTlRfQU5EX0JBQ0sgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICBkaXNhYmxl
KCBnbC5DVUxMX0ZBQ0UgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyZW50
Q3VsbEZhY2UgPSBjdWxsRmFjZTsKKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gc2V0
TGluZVdpZHRoKCB3aWR0aCApIHsKKworICAgICAgICAgICAgaWYgKCB3aWR0aCAhPT0gY3VycmVu
dExpbmVXaWR0aCApIHsKKworICAgICAgICAgICAgICAgIGlmICggbGluZVdpZHRoQXZhaWxhYmxl
ICkgZ2wubGluZVdpZHRoKCB3aWR0aCApOworCisgICAgICAgICAgICAgICAgY3VycmVudExpbmVX
aWR0aCA9IHdpZHRoOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1
bmN0aW9uIHNldFBvbHlnb25PZmZzZXQoIHBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMgKSB7
CisKKyAgICAgICAgICAgIGlmICggcG9seWdvbk9mZnNldCApIHsKKworICAgICAgICAgICAgICAg
IGVuYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApOworCisgICAgICAgICAgICAgICAgaWYg
KCBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciAhPT0gZmFjdG9yIHx8IGN1cnJlbnRQb2x5Z29u
T2Zmc2V0VW5pdHMgIT09IHVuaXRzICkgeworCisgICAgICAgICAgICAgICAgICAgIGdsLnBvbHln
b25PZmZzZXQoIGZhY3RvciwgdW5pdHMgKTsKKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50
UG9seWdvbk9mZnNldEZhY3RvciA9IGZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVu
dFBvbHlnb25PZmZzZXRVbml0cyA9IHVuaXRzOworCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgZGlzYWJsZSggZ2wuUE9MWUdPTl9P
RkZTRVRfRklMTCApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1
bmN0aW9uIGdldFNjaXNzb3JUZXN0KCkgeworCisgICAgICAgICAgICByZXR1cm4gY3VycmVudFNj
aXNzb3JUZXN0OworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBzZXRTY2lzc29yVGVz
dCggc2Npc3NvclRlc3QgKSB7CisKKyAgICAgICAgICAgIGN1cnJlbnRTY2lzc29yVGVzdCA9IHNj
aXNzb3JUZXN0OworCisgICAgICAgICAgICBpZiAoIHNjaXNzb3JUZXN0ICkgeworCisgICAgICAg
ICAgICAgICAgZW5hYmxlKCBnbC5TQ0lTU09SX1RFU1QgKTsKKworICAgICAgICAgICAgfSBlbHNl
IHsKKworICAgICAgICAgICAgICAgIGRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApOworCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRleHR1cmUKKworICAgICAgICBm
dW5jdGlvbiBhY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKSB7CisKKyAgICAgICAgICAgIGlmICgg
d2ViZ2xTbG90ID09PSB1bmRlZmluZWQgKSB3ZWJnbFNsb3QgPSBnbC5URVhUVVJFMCArIG1heFRl
eHR1cmVzIC0gMTsKKworICAgICAgICAgICAgaWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdl
YmdsU2xvdCApIHsKKworICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoIHdlYmdsU2xv
dCApOworICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBiaW5kVGV4dHVy
ZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUgKSB7CisKKyAgICAgICAgICAgIGlmICggY3VycmVu
dFRleHR1cmVTbG90ID09PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgYWN0aXZlVGV4dHVy
ZSgpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBib3VuZFRleHR1cmUgPSBj
dXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF07CisKKyAgICAgICAgICAg
IGlmICggYm91bmRUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICBi
b3VuZFRleHR1cmUgPSB7IHR5cGU6IHVuZGVmaW5lZCwgdGV4dHVyZTogdW5kZWZpbmVkIH07Cisg
ICAgICAgICAgICAgICAgY3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBd
ID0gYm91bmRUZXh0dXJlOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggYm91
bmRUZXh0dXJlLnR5cGUgIT09IHdlYmdsVHlwZSB8fCBib3VuZFRleHR1cmUudGV4dHVyZSAhPT0g
d2ViZ2xUZXh0dXJlICkgeworCisgICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoIHdlYmds
VHlwZSwgd2ViZ2xUZXh0dXJlIHx8IGVtcHR5VGV4dHVyZXNbIHdlYmdsVHlwZSBdICk7CisKKyAg
ICAgICAgICAgICAgICBib3VuZFRleHR1cmUudHlwZSA9IHdlYmdsVHlwZTsKKyAgICAgICAgICAg
ICAgICBib3VuZFRleHR1cmUudGV4dHVyZSA9IHdlYmdsVGV4dHVyZTsKKworICAgICAgICAgICAg
fQorCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBjb21wcmVzc2VkVGV4SW1hZ2UyRCgp
IHsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIGdsLmNvbXByZXNzZWRU
ZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7CisKKyAgICAgICAgICAgIH0gY2F0Y2gg
KCBlcnJvciApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJH
TFN0YXRlOicsIGVycm9yICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAg
ICAgZnVuY3Rpb24gdGV4SW1hZ2UyRCgpIHsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAg
ICAgICAgICAgIGdsLnRleEltYWdlMkQuYXBwbHkoIGdsLCBhcmd1bWVudHMgKTsKKworICAgICAg
ICAgICAgfSBjYXRjaCAoIGVycm9yICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJv
ciggJ1RIUkVFLldlYkdMU3RhdGU6JywgZXJyb3IgKTsKKworICAgICAgICAgICAgfQorCisgICAg
ICAgIH0KKworICAgICAgICAvLworCisgICAgICAgIGZ1bmN0aW9uIHNjaXNzb3IoIHNjaXNzb3Ig
KSB7CisKKyAgICAgICAgICAgIGlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkg
PT09IGZhbHNlICkgeworCisgICAgICAgICAgICAgICAgZ2wuc2Npc3Nvciggc2Npc3Nvci54LCBz
Y2lzc29yLnksIHNjaXNzb3Iueiwgc2Npc3Nvci53ICk7CisgICAgICAgICAgICAgICAgY3VycmVu
dFNjaXNzb3IuY29weSggc2Npc3NvciApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQor
CisgICAgICAgIGZ1bmN0aW9uIHZpZXdwb3J0KCB2aWV3cG9ydCApIHsKKworICAgICAgICAgICAg
aWYgKCBjdXJyZW50Vmlld3BvcnQuZXF1YWxzKCB2aWV3cG9ydCApID09PSBmYWxzZSApIHsKKwor
ICAgICAgICAgICAgICAgIGdsLnZpZXdwb3J0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3
cG9ydC56LCB2aWV3cG9ydC53ICk7CisgICAgICAgICAgICAgICAgY3VycmVudFZpZXdwb3J0LmNv
cHkoIHZpZXdwb3J0ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAg
Ly8KKworICAgICAgICBmdW5jdGlvbiByZXNldCgpIHsKKworICAgICAgICAgICAgZm9yICggdmFy
IGkgPSAwOyBpIDwgZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICsrICkgeworCisgICAgICAg
ICAgICAgICAgaWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdID09PSAxICkgeworCisgICAgICAg
ICAgICAgICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSggaSApOworICAgICAgICAg
ICAgICAgICAgICBlbmFibGVkQXR0cmlidXRlc1sgaSBdID0gMDsKKworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXBhYmlsaXRpZXMgPSB7fTsKKwor
ICAgICAgICAgICAgY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gbnVsbDsKKworICAgICAgICAg
ICAgY3VycmVudFRleHR1cmVTbG90ID0gbnVsbDsKKyAgICAgICAgICAgIGN1cnJlbnRCb3VuZFRl
eHR1cmVzID0ge307CisKKyAgICAgICAgICAgIGN1cnJlbnRCbGVuZGluZyA9IG51bGw7CisKKyAg
ICAgICAgICAgIGN1cnJlbnRGbGlwU2lkZWQgPSBudWxsOworICAgICAgICAgICAgY3VycmVudEN1
bGxGYWNlID0gbnVsbDsKKworICAgICAgICAgICAgY29sb3JCdWZmZXIucmVzZXQoKTsKKyAgICAg
ICAgICAgIGRlcHRoQnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICBzdGVuY2lsQnVmZmVyLnJl
c2V0KCk7CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB7CisKKyAgICAgICAgICAgIGJ1
ZmZlcnM6IHsKKyAgICAgICAgICAgICAgICBjb2xvcjogY29sb3JCdWZmZXIsCisgICAgICAgICAg
ICAgICAgZGVwdGg6IGRlcHRoQnVmZmVyLAorICAgICAgICAgICAgICAgIHN0ZW5jaWw6IHN0ZW5j
aWxCdWZmZXIKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIGluaXQ6IGluaXQsCisgICAg
ICAgICAgICBpbml0QXR0cmlidXRlczogaW5pdEF0dHJpYnV0ZXMsCisgICAgICAgICAgICBlbmFi
bGVBdHRyaWJ1dGU6IGVuYWJsZUF0dHJpYnV0ZSwKKyAgICAgICAgICAgIGVuYWJsZUF0dHJpYnV0
ZUFuZERpdmlzb3I6IGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IsCisgICAgICAgICAgICBkaXNh
YmxlVW51c2VkQXR0cmlidXRlczogZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMsCisgICAgICAgICAg
ICBlbmFibGU6IGVuYWJsZSwKKyAgICAgICAgICAgIGRpc2FibGU6IGRpc2FibGUsCisgICAgICAg
ICAgICBnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHM6IGdldENvbXByZXNzZWRUZXh0dXJlRm9y
bWF0cywKKworICAgICAgICAgICAgc2V0QmxlbmRpbmc6IHNldEJsZW5kaW5nLAorICAgICAgICAg
ICAgc2V0TWF0ZXJpYWw6IHNldE1hdGVyaWFsLAorCisgICAgICAgICAgICBzZXRGbGlwU2lkZWQ6
IHNldEZsaXBTaWRlZCwKKyAgICAgICAgICAgIHNldEN1bGxGYWNlOiBzZXRDdWxsRmFjZSwKKwor
ICAgICAgICAgICAgc2V0TGluZVdpZHRoOiBzZXRMaW5lV2lkdGgsCisgICAgICAgICAgICBzZXRQ
b2x5Z29uT2Zmc2V0OiBzZXRQb2x5Z29uT2Zmc2V0LAorCisgICAgICAgICAgICBnZXRTY2lzc29y
VGVzdDogZ2V0U2Npc3NvclRlc3QsCisgICAgICAgICAgICBzZXRTY2lzc29yVGVzdDogc2V0U2Np
c3NvclRlc3QsCisKKyAgICAgICAgICAgIGFjdGl2ZVRleHR1cmU6IGFjdGl2ZVRleHR1cmUsCisg
ICAgICAgICAgICBiaW5kVGV4dHVyZTogYmluZFRleHR1cmUsCisgICAgICAgICAgICBjb21wcmVz
c2VkVGV4SW1hZ2UyRDogY29tcHJlc3NlZFRleEltYWdlMkQsCisgICAgICAgICAgICB0ZXhJbWFn
ZTJEOiB0ZXhJbWFnZTJELAorCisgICAgICAgICAgICBzY2lzc29yOiBzY2lzc29yLAorICAgICAg
ICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0LAorCisgICAgICAgICAgICByZXNldDogcmVzZXQKKwor
ICAgICAgICB9OworCisgICAgfQorCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBo
dHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFdlYkdMQ2FwYWJpbGl0
aWVzKCBnbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycyApIHsKKworICAgICAgICB2YXIgbWF4QW5p
c290cm9weTsKKworICAgICAgICBmdW5jdGlvbiBnZXRNYXhBbmlzb3Ryb3B5KCkgeworCisgICAg
ICAgICAgICBpZiAoIG1heEFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHJldHVybiBtYXhBbmlz
b3Ryb3B5OworCisgICAgICAgICAgICB2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdF
WFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7CisKKyAgICAgICAgICAgIGlmICggZXh0
ZW5zaW9uICE9PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgbWF4QW5pc290cm9weSA9IGds
LmdldFBhcmFtZXRlciggZXh0ZW5zaW9uLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAp
OworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgbWF4QW5pc290cm9w
eSA9IDA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1heEFuaXNvdHJv
cHk7CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGdldE1heFByZWNpc2lvbiggcHJl
Y2lzaW9uICkgeworCisgICAgICAgICAgICBpZiAoIHByZWNpc2lvbiA9PT0gJ2hpZ2hwJyApIHsK
KworICAgICAgICAgICAgICAgIGlmICggZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5W
RVJURVhfU0hBREVSLCBnbC5ISUdIX0ZMT0FUICkucHJlY2lzaW9uID4gMCAmJgorICAgICAgICAg
ICAgICAgICAgICAgZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5GUkFHTUVOVF9TSEFE
RVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICkgeworCisgICAgICAgICAgICAgICAg
ICAgIHJldHVybiAnaGlnaHAnOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgcHJlY2lzaW9uID0gJ21lZGl1bXAnOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IGlmICggcHJlY2lzaW9uID09PSAnbWVkaXVtcCcgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAo
IGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuVkVSVEVYX1NIQURFUiwgZ2wuTUVESVVN
X0ZMT0FUICkucHJlY2lzaW9uID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgZ2wuZ2V0U2hh
ZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5GUkFHTUVOVF9TSEFERVIsIGdsLk1FRElVTV9GTE9BVCAp
LnByZWNpc2lvbiA+IDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdtZWRpdW1w
JzsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBy
ZXR1cm4gJ2xvd3AnOworCisgICAgICAgIH0KKworICAgICAgICB2YXIgcHJlY2lzaW9uID0gcGFy
YW1ldGVycy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlY2lzaW9uIDog
J2hpZ2hwJzsKKyAgICAgICAgdmFyIG1heFByZWNpc2lvbiA9IGdldE1heFByZWNpc2lvbiggcHJl
Y2lzaW9uICk7CisKKyAgICAgICAgaWYgKCBtYXhQcmVjaXNpb24gIT09IHByZWNpc2lvbiApIHsK
KworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjonLCBwcmVj
aXNpb24sICdub3Qgc3VwcG9ydGVkLCB1c2luZycsIG1heFByZWNpc2lvbiwgJ2luc3RlYWQuJyAp
OworICAgICAgICAgICAgcHJlY2lzaW9uID0gbWF4UHJlY2lzaW9uOworCisgICAgICAgIH0KKwor
ICAgICAgICB2YXIgbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9IHBhcmFtZXRlcnMubG9nYXJpdGht
aWNEZXB0aEJ1ZmZlciA9PT0gdHJ1ZSAmJiAhISBleHRlbnNpb25zLmdldCggJ0VYVF9mcmFnX2Rl
cHRoJyApOworCisgICAgICAgIHZhciBtYXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wu
TUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTsKKyAgICAgICAgdmFyIG1heFZlcnRleFRleHR1cmVz
ID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTsK
KyAgICAgICAgdmFyIG1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVY
VFVSRV9TSVpFICk7CisgICAgICAgIHZhciBtYXhDdWJlbWFwU2l6ZSA9IGdsLmdldFBhcmFtZXRl
ciggZ2wuTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSApOworCisgICAgICAgIHZhciBtYXhBdHRy
aWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX0FUVFJJQlMgKTsKKyAgICAg
ICAgdmFyIG1heFZlcnRleFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVY
X1VOSUZPUk1fVkVDVE9SUyApOworICAgICAgICB2YXIgbWF4VmFyeWluZ3MgPSBnbC5nZXRQYXJh
bWV0ZXIoIGdsLk1BWF9WQVJZSU5HX1ZFQ1RPUlMgKTsKKyAgICAgICAgdmFyIG1heEZyYWdtZW50
VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RP
UlMgKTsKKworICAgICAgICB2YXIgdmVydGV4VGV4dHVyZXMgPSBtYXhWZXJ0ZXhUZXh0dXJlcyA+
IDA7CisgICAgICAgIHZhciBmbG9hdEZyYWdtZW50VGV4dHVyZXMgPSAhISBleHRlbnNpb25zLmdl
dCggJ09FU190ZXh0dXJlX2Zsb2F0JyApOworICAgICAgICB2YXIgZmxvYXRWZXJ0ZXhUZXh0dXJl
cyA9IHZlcnRleFRleHR1cmVzICYmIGZsb2F0RnJhZ21lbnRUZXh0dXJlczsKKworICAgICAgICBy
ZXR1cm4geworCisgICAgICAgICAgICBnZXRNYXhBbmlzb3Ryb3B5OiBnZXRNYXhBbmlzb3Ryb3B5
LAorICAgICAgICAgICAgZ2V0TWF4UHJlY2lzaW9uOiBnZXRNYXhQcmVjaXNpb24sCisKKyAgICAg
ICAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLAorICAgICAgICAgICAgbG9nYXJpdGhtaWNEZXB0
aEJ1ZmZlcjogbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciwKKworICAgICAgICAgICAgbWF4VGV4dHVy
ZXM6IG1heFRleHR1cmVzLAorICAgICAgICAgICAgbWF4VmVydGV4VGV4dHVyZXM6IG1heFZlcnRl
eFRleHR1cmVzLAorICAgICAgICAgICAgbWF4VGV4dHVyZVNpemU6IG1heFRleHR1cmVTaXplLAor
ICAgICAgICAgICAgbWF4Q3ViZW1hcFNpemU6IG1heEN1YmVtYXBTaXplLAorCisgICAgICAgICAg
ICBtYXhBdHRyaWJ1dGVzOiBtYXhBdHRyaWJ1dGVzLAorICAgICAgICAgICAgbWF4VmVydGV4VW5p
Zm9ybXM6IG1heFZlcnRleFVuaWZvcm1zLAorICAgICAgICAgICAgbWF4VmFyeWluZ3M6IG1heFZh
cnlpbmdzLAorICAgICAgICAgICAgbWF4RnJhZ21lbnRVbmlmb3JtczogbWF4RnJhZ21lbnRVbmlm
b3JtcywKKworICAgICAgICAgICAgdmVydGV4VGV4dHVyZXM6IHZlcnRleFRleHR1cmVzLAorICAg
ICAgICAgICAgZmxvYXRGcmFnbWVudFRleHR1cmVzOiBmbG9hdEZyYWdtZW50VGV4dHVyZXMsCisg
ICAgICAgICAgICBmbG9hdFZlcnRleFRleHR1cmVzOiBmbG9hdFZlcnRleFRleHR1cmVzCisKKyAg
ICAgICAgfTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0
cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBBcnJheUNhbWVyYSggYXJy
YXkgKSB7CisKKyAgICAgICAgUGVyc3BlY3RpdmVDYW1lcmEuY2FsbCggdGhpcyApOworCisgICAg
ICAgIHRoaXMuY2FtZXJhcyA9IGFycmF5IHx8IFtdOworCisgICAgfQorCisgICAgQXJyYXlDYW1l
cmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggUGVyc3BlY3RpdmVD
YW1lcmEucHJvdG90eXBlICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogQXJyYXlDYW1lcmEs
CisKKyAgICAgICAgaXNBcnJheUNhbWVyYTogdHJ1ZQorCisgICAgfSApOworCisgICAgLyoqCisg
ICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAg
IGZ1bmN0aW9uIFdlYlZSTWFuYWdlciggcmVuZGVyZXIgKSB7CisKKyAgICAgICAgdmFyIHNjb3Bl
ID0gdGhpczsKKworICAgICAgICB2YXIgZGV2aWNlID0gbnVsbDsKKyAgICAgICAgdmFyIGZyYW1l
RGF0YSA9IG51bGw7CisKKyAgICAgICAgaWYgKCAnVlJGcmFtZURhdGEnIGluIHdpbmRvdyApIHsK
KworICAgICAgICAgICAgZnJhbWVEYXRhID0gbmV3IHdpbmRvdy5WUkZyYW1lRGF0YSgpOworCisg
ICAgICAgIH0KKworICAgICAgICB2YXIgbWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQo
KTsKKworICAgICAgICB2YXIgc3RhbmRpbmdNYXRyaXggPSBuZXcgTWF0cml4NCgpOworICAgICAg
ICB2YXIgc3RhbmRpbmdNYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTsKKworICAgICAgICB2
YXIgY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpOworICAgICAgICBjYW1lcmFMLmJv
dW5kcyA9IG5ldyBWZWN0b3I0KCAwLjAsIDAuMCwgMC41LCAxLjAgKTsKKyAgICAgICAgY2FtZXJh
TC5sYXllcnMuZW5hYmxlKCAxICk7CisKKyAgICAgICAgdmFyIGNhbWVyYVIgPSBuZXcgUGVyc3Bl
Y3RpdmVDYW1lcmEoKTsKKyAgICAgICAgY2FtZXJhUi5ib3VuZHMgPSBuZXcgVmVjdG9yNCggMC41
LCAwLjAsIDAuNSwgMS4wICk7CisgICAgICAgIGNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApOwor
CisgICAgICAgIHZhciBjYW1lcmFWUiA9IG5ldyBBcnJheUNhbWVyYSggWyBjYW1lcmFMLCBjYW1l
cmFSIF0gKTsKKyAgICAgICAgY2FtZXJhVlIubGF5ZXJzLmVuYWJsZSggMSApOworICAgICAgICBj
YW1lcmFWUi5sYXllcnMuZW5hYmxlKCAyICk7CisKKyAgICAgICAgLy8KKworICAgICAgICB2YXIg
Y3VycmVudFNpemUsIGN1cnJlbnRQaXhlbFJhdGlvOworCisgICAgICAgIGZ1bmN0aW9uIG9uVlJE
aXNwbGF5UHJlc2VudENoYW5nZSgpIHsKKworICAgICAgICAgICAgaWYgKCBkZXZpY2UuaXNQcmVz
ZW50aW5nICkgeworCisgICAgICAgICAgICAgICAgdmFyIGV5ZVBhcmFtZXRlcnMgPSBkZXZpY2Uu
Z2V0RXllUGFyYW1ldGVycyggJ2xlZnQnICk7CisgICAgICAgICAgICAgICAgdmFyIHJlbmRlcldp
ZHRoID0gZXllUGFyYW1ldGVycy5yZW5kZXJXaWR0aDsKKyAgICAgICAgICAgICAgICB2YXIgcmVu
ZGVySGVpZ2h0ID0gZXllUGFyYW1ldGVycy5yZW5kZXJIZWlnaHQ7CisKKyAgICAgICAgICAgICAg
ICBjdXJyZW50UGl4ZWxSYXRpbyA9IHJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKTsKKyAgICAgICAg
ICAgICAgICBjdXJyZW50U2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTsKKworICAgICAgICAgICAg
ICAgIHJlbmRlcmVyLnNldERyYXdpbmdCdWZmZXJTaXplKCByZW5kZXJXaWR0aCAqIDIsIHJlbmRl
ckhlaWdodCwgMSApOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBzY29wZS5lbmFibGVkICkg
eworCisgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIGN1cnJl
bnRTaXplLndpZHRoLCBjdXJyZW50U2l6ZS5oZWlnaHQsIGN1cnJlbnRQaXhlbFJhdGlvICk7CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgd2luZG93LmFkZEV2ZW50TGlz
dGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdl
LCBmYWxzZSApOworCisgICAgICAgIC8vCisKKyAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7
CisgICAgICAgIHRoaXMuc3RhbmRpbmcgPSBmYWxzZTsKKworICAgICAgICB0aGlzLmdldERldmlj
ZSA9IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKKworICAgICAg
ICB9OworCisgICAgICAgIHRoaXMuc2V0RGV2aWNlID0gZnVuY3Rpb24gKCB2YWx1ZSApIHsKKwor
ICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgZGV2aWNlID0gdmFsdWU7CisK
KyAgICAgICAgfTsKKworICAgICAgICB0aGlzLmdldENhbWVyYSA9IGZ1bmN0aW9uICggY2FtZXJh
ICkgeworCisgICAgICAgICAgICBpZiAoIGRldmljZSA9PT0gbnVsbCApIHJldHVybiBjYW1lcmE7
CisKKyAgICAgICAgICAgIGRldmljZS5kZXB0aE5lYXIgPSBjYW1lcmEubmVhcjsKKyAgICAgICAg
ICAgIGRldmljZS5kZXB0aEZhciA9IGNhbWVyYS5mYXI7CisKKyAgICAgICAgICAgIGRldmljZS5n
ZXRGcmFtZURhdGEoIGZyYW1lRGF0YSApOworCisgICAgICAgICAgICAvLworCisgICAgICAgICAg
ICB2YXIgcG9zZSA9IGZyYW1lRGF0YS5wb3NlOworCisgICAgICAgICAgICBpZiAoIHBvc2UucG9z
aXRpb24gIT09IG51bGwgKSB7CisKKyAgICAgICAgICAgICAgICBjYW1lcmEucG9zaXRpb24uZnJv
bUFycmF5KCBwb3NlLnBvc2l0aW9uICk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAg
ICAgICAgICAgICBjYW1lcmEucG9zaXRpb24uc2V0KCAwLCAwLCAwICk7CisKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaWYgKCBwb3NlLm9yaWVudGF0aW9uICE9PSBudWxsICkgeworCisg
ICAgICAgICAgICAgICAgY2FtZXJhLnF1YXRlcm5pb24uZnJvbUFycmF5KCBwb3NlLm9yaWVudGF0
aW9uICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FtZXJhLnVwZGF0ZU1hdHJp
eFdvcmxkKCk7CisKKyAgICAgICAgICAgIHZhciBzdGFnZVBhcmFtZXRlcnMgPSBkZXZpY2Uuc3Rh
Z2VQYXJhbWV0ZXJzOworCisgICAgICAgICAgICBpZiAoIHRoaXMuc3RhbmRpbmcgJiYgc3RhZ2VQ
YXJhbWV0ZXJzICkgeworCisgICAgICAgICAgICAgICAgc3RhbmRpbmdNYXRyaXguZnJvbUFycmF5
KCBzdGFnZVBhcmFtZXRlcnMuc2l0dGluZ1RvU3RhbmRpbmdUcmFuc2Zvcm0gKTsKKyAgICAgICAg
ICAgICAgICBzdGFuZGluZ01hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggc3RhbmRpbmdNYXRyaXgg
KTsKKworICAgICAgICAgICAgICAgIGNhbWVyYS5tYXRyaXhXb3JsZC5tdWx0aXBseSggc3RhbmRp
bmdNYXRyaXggKTsKKyAgICAgICAgICAgICAgICBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLm11
bHRpcGx5KCBzdGFuZGluZ01hdHJpeEludmVyc2UgKTsKKworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBpZiAoIGRldmljZS5pc1ByZXNlbnRpbmcgPT09IGZhbHNlICkgcmV0dXJuIGNhbWVy
YTsKKworICAgICAgICAgICAgLy8KKworICAgICAgICAgICAgY2FtZXJhVlIubWF0cml4V29ybGQu
Y29weSggY2FtZXJhLm1hdHJpeFdvcmxkICk7CisgICAgICAgICAgICBjYW1lcmFWUi5tYXRyaXhX
b3JsZEludmVyc2UuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApOworCisgICAgICAg
ICAgICBjYW1lcmFMLm1hdHJpeFdvcmxkSW52ZXJzZS5mcm9tQXJyYXkoIGZyYW1lRGF0YS5sZWZ0
Vmlld01hdHJpeCApOworICAgICAgICAgICAgY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UuZnJv
bUFycmF5KCBmcmFtZURhdGEucmlnaHRWaWV3TWF0cml4ICk7CisKKyAgICAgICAgICAgIGlmICgg
dGhpcy5zdGFuZGluZyAmJiBzdGFnZVBhcmFtZXRlcnMgKSB7CisKKyAgICAgICAgICAgICAgICBj
YW1lcmFMLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseSggc3RhbmRpbmdNYXRyaXhJbnZlcnNl
ICk7CisgICAgICAgICAgICAgICAgY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHko
IHN0YW5kaW5nTWF0cml4SW52ZXJzZSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IHZhciBwYXJlbnQgPSBjYW1lcmEucGFyZW50OworCisgICAgICAgICAgICBpZiAoIHBhcmVudCAh
PT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgIG1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZl
cnNlKCBwYXJlbnQubWF0cml4V29ybGQgKTsKKworICAgICAgICAgICAgICAgIGNhbWVyYUwubWF0
cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTsKKyAgICAgICAg
ICAgICAgICBjYW1lcmFSLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseSggbWF0cml4V29ybGRJ
bnZlcnNlICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZW52TWFwIGFuZCBN
aXJyb3IgbmVlZHMgY2FtZXJhLm1hdHJpeFdvcmxkCisKKyAgICAgICAgICAgIGNhbWVyYUwubWF0
cml4V29ybGQuZ2V0SW52ZXJzZSggY2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UgKTsKKyAgICAg
ICAgICAgIGNhbWVyYVIubWF0cml4V29ybGQuZ2V0SW52ZXJzZSggY2FtZXJhUi5tYXRyaXhXb3Js
ZEludmVyc2UgKTsKKworICAgICAgICAgICAgY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmZyb21B
cnJheSggZnJhbWVEYXRhLmxlZnRQcm9qZWN0aW9uTWF0cml4ICk7CisgICAgICAgICAgICBjYW1l
cmFSLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KCBmcmFtZURhdGEucmlnaHRQcm9qZWN0aW9u
TWF0cml4ICk7CisKKyAgICAgICAgICAgIC8vIEhBQ0sgQG1yZG9vYgorICAgICAgICAgICAgLy8g
aHR0cHM6Ly9naXRodWIuY29tL3czYy93ZWJ2ci9pc3N1ZXMvMjAzCisKKyAgICAgICAgICAgIGNh
bWVyYVZSLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4ICk7
CisKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIHZhciBsYXllcnMgPSBkZXZpY2UuZ2V0
TGF5ZXJzKCk7CisKKyAgICAgICAgICAgIGlmICggbGF5ZXJzLmxlbmd0aCApIHsKKworICAgICAg
ICAgICAgICAgIHZhciBsYXllciA9IGxheWVyc1sgMCBdOworCisgICAgICAgICAgICAgICAgaWYg
KCBsYXllci5sZWZ0Qm91bmRzICE9PSBudWxsICYmIGxheWVyLmxlZnRCb3VuZHMubGVuZ3RoID09
PSA0ICkgeworCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUwuYm91bmRzLmZyb21BcnJheSgg
bGF5ZXIubGVmdEJvdW5kcyApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgaWYgKCBsYXllci5yaWdodEJvdW5kcyAhPT0gbnVsbCAmJiBsYXllci5yaWdodEJvdW5kcy5s
ZW5ndGggPT09IDQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhUi5ib3VuZHMuZnJv
bUFycmF5KCBsYXllci5yaWdodEJvdW5kcyApOworCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmFWUjsKKworICAgICAgICB9Owor
CisgICAgICAgIHRoaXMuZ2V0U3RhbmRpbmdNYXRyaXggPSBmdW5jdGlvbiAoKSB7CisKKyAgICAg
ICAgICAgIHJldHVybiBzdGFuZGluZ01hdHJpeDsKKworICAgICAgICB9OworCisgICAgICAgIHRo
aXMuc3VibWl0RnJhbWUgPSBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGlmICggZGV2aWNl
ICYmIGRldmljZS5pc1ByZXNlbnRpbmcgKSBkZXZpY2Uuc3VibWl0RnJhbWUoKTsKKworICAgICAg
ICB9OworCisgICAgfQorCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8v
bXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFdlYkdMRXh0ZW5zaW9ucyggZ2wg
KSB7CisKKyAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSB7fTsKKworICAgICAgICByZXR1cm4gewor
CisgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICggbmFtZSApIHsKKworICAgICAgICAgICAgICAg
IGlmICggZXh0ZW5zaW9uc1sgbmFtZSBdICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnNbIG5hbWUgXTsKKworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIHZhciBleHRlbnNpb247CisKKyAgICAgICAgICAgICAgICBzd2l0
Y2ggKCBuYW1lICkgeworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1dFQkdMX2RlcHRoX3Rl
eHR1cmUnOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5z
aW9uKCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfV0VC
R0xfZGVwdGhfdGV4dHVyZScgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfZGVw
dGhfdGV4dHVyZScgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAg
ICAgICAgICAgICAgIGNhc2UgJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyc6CisgICAg
ICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdFWFRfdGV4
dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX0VYVF90
ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRf
RVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApOworICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnV0VCR0xfY29tcHJlc3NlZF90
ZXh0dXJlX3MzdGMnOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gZ2wuZ2V0
RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0
ZW5zaW9uKCAnTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4
dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1dF
QkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Yyc6CisgICAgICAgICAgICAgICAgICAgICAgICBl
eHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZy
dGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVy
ZV9wdnJ0YycgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAg
ICAgICAgICAgIGNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJzoKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXBy
ZXNzZWRfdGV4dHVyZV9ldGMxJyApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisK
KyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4
dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggbmFtZSApOworCisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgaWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIG5hbWUg
KyAnIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLicgKTsKKworICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNbIG5hbWUgXSA9IGV4dGVuc2lvbjsKKworICAgICAg
ICAgICAgICAgIHJldHVybiBleHRlbnNpb247CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9
OworCisgICAgfQorCisgICAgLyoqCisgICAgICogQGF1dGhvciB0c2NodworICAgICAqLworCisg
ICAgZnVuY3Rpb24gV2ViR0xDbGlwcGluZygpIHsKKworICAgICAgICB2YXIgc2NvcGUgPSB0aGlz
LAorCisgICAgICAgICAgICBnbG9iYWxTdGF0ZSA9IG51bGwsCisgICAgICAgICAgICBudW1HbG9i
YWxQbGFuZXMgPSAwLAorICAgICAgICAgICAgbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSwK
KyAgICAgICAgICAgIHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZSwKKworICAgICAgICAgICAgcGxh
bmUgPSBuZXcgUGxhbmUoKSwKKyAgICAgICAgICAgIHZpZXdOb3JtYWxNYXRyaXggPSBuZXcgTWF0
cml4MygpLAorCisgICAgICAgICAgICB1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRh
dGU6IGZhbHNlIH07CisKKyAgICAgICAgdGhpcy51bmlmb3JtID0gdW5pZm9ybTsKKyAgICAgICAg
dGhpcy5udW1QbGFuZXMgPSAwOworICAgICAgICB0aGlzLm51bUludGVyc2VjdGlvbiA9IDA7CisK
KyAgICAgICAgdGhpcy5pbml0ID0gZnVuY3Rpb24oIHBsYW5lcywgZW5hYmxlTG9jYWxDbGlwcGlu
ZywgY2FtZXJhICkgeworCisgICAgICAgICAgICB2YXIgZW5hYmxlZCA9CisgICAgICAgICAgICAg
ICAgcGxhbmVzLmxlbmd0aCAhPT0gMCB8fAorICAgICAgICAgICAgICAgIGVuYWJsZUxvY2FsQ2xp
cHBpbmcgfHwKKyAgICAgICAgICAgICAgICAvLyBlbmFibGUgc3RhdGUgb2YgcHJldmlvdXMgZnJh
bWUgLSB0aGUgY2xpcHBpbmcgY29kZSBoYXMgdG8KKyAgICAgICAgICAgICAgICAvLyBydW4gYW5v
dGhlciBmcmFtZSBpbiBvcmRlciB0byByZXNldCB0aGUgc3RhdGU6CisgICAgICAgICAgICAgICAg
bnVtR2xvYmFsUGxhbmVzICE9PSAwIHx8CisgICAgICAgICAgICAgICAgbG9jYWxDbGlwcGluZ0Vu
YWJsZWQ7CisKKyAgICAgICAgICAgIGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZW5hYmxlTG9jYWxD
bGlwcGluZzsKKworICAgICAgICAgICAgZ2xvYmFsU3RhdGUgPSBwcm9qZWN0UGxhbmVzKCBwbGFu
ZXMsIGNhbWVyYSwgMCApOworICAgICAgICAgICAgbnVtR2xvYmFsUGxhbmVzID0gcGxhbmVzLmxl
bmd0aDsKKworICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWQ7CisKKyAgICAgICAgfTsKKworICAg
ICAgICB0aGlzLmJlZ2luU2hhZG93cyA9IGZ1bmN0aW9uKCkgeworCisgICAgICAgICAgICByZW5k
ZXJpbmdTaGFkb3dzID0gdHJ1ZTsKKyAgICAgICAgICAgIHByb2plY3RQbGFuZXMoIG51bGwgKTsK
KworICAgICAgICB9OworCisgICAgICAgIHRoaXMuZW5kU2hhZG93cyA9IGZ1bmN0aW9uKCkgewor
CisgICAgICAgICAgICByZW5kZXJpbmdTaGFkb3dzID0gZmFsc2U7CisgICAgICAgICAgICByZXNl
dEdsb2JhbFN0YXRlKCk7CisKKyAgICAgICAgfTsKKworICAgICAgICB0aGlzLnNldFN0YXRlID0g
ZnVuY3Rpb24oIHBsYW5lcywgY2xpcEludGVyc2VjdGlvbiwgY2xpcFNoYWRvd3MsIGNhbWVyYSwg
Y2FjaGUsIGZyb21DYWNoZSApIHsKKworICAgICAgICAgICAgaWYgKCAhIGxvY2FsQ2xpcHBpbmdF
bmFibGVkIHx8CisgICAgICAgICAgICAgICAgICAgIHBsYW5lcyA9PT0gbnVsbCB8fCBwbGFuZXMu
bGVuZ3RoID09PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1NoYWRvd3MgJiYg
ISBjbGlwU2hhZG93cyApIHsKKyAgICAgICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGxvY2FsIGNs
aXBwaW5nCisKKyAgICAgICAgICAgICAgICBpZiAoIHJlbmRlcmluZ1NoYWRvd3MgKSB7CisgICAg
ICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gZ2xvYmFsIGNsaXBwaW5nCisKKyAgICAgICAg
ICAgICAgICAgICAgcHJvamVjdFBsYW5lcyggbnVsbCApOworCisgICAgICAgICAgICAgICAgfSBl
bHNlIHsKKworICAgICAgICAgICAgICAgICAgICByZXNldEdsb2JhbFN0YXRlKCk7CisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgdmFy
IG5HbG9iYWwgPSByZW5kZXJpbmdTaGFkb3dzID8gMCA6IG51bUdsb2JhbFBsYW5lcywKKyAgICAg
ICAgICAgICAgICAgICAgbEdsb2JhbCA9IG5HbG9iYWwgKiA0LAorCisgICAgICAgICAgICAgICAg
ICAgIGRzdEFycmF5ID0gY2FjaGUuY2xpcHBpbmdTdGF0ZSB8fCBudWxsOworCisgICAgICAgICAg
ICAgICAgdW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OyAvLyBlbnN1cmUgdW5pcXVlIHN0YXRlCisK
KyAgICAgICAgICAgICAgICBkc3RBcnJheSA9IHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJh
LCBsR2xvYmFsLCBmcm9tQ2FjaGUgKTsKKworICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0g
MDsgaSAhPT0gbEdsb2JhbDsgKysgaSApIHsKKworICAgICAgICAgICAgICAgICAgICBkc3RBcnJh
eVsgaSBdID0gZ2xvYmFsU3RhdGVbIGkgXTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIGNhY2hlLmNsaXBwaW5nU3RhdGUgPSBkc3RBcnJheTsKKyAgICAgICAgICAgICAg
ICB0aGlzLm51bUludGVyc2VjdGlvbiA9IGNsaXBJbnRlcnNlY3Rpb24gPyB0aGlzLm51bVBsYW5l
cyA6IDA7CisgICAgICAgICAgICAgICAgdGhpcy5udW1QbGFuZXMgKz0gbkdsb2JhbDsKKworICAg
ICAgICAgICAgfQorCisKKyAgICAgICAgfTsKKworICAgICAgICBmdW5jdGlvbiByZXNldEdsb2Jh
bFN0YXRlKCkgeworCisgICAgICAgICAgICBpZiAoIHVuaWZvcm0udmFsdWUgIT09IGdsb2JhbFN0
YXRlICkgeworCisgICAgICAgICAgICAgICAgdW5pZm9ybS52YWx1ZSA9IGdsb2JhbFN0YXRlOwor
ICAgICAgICAgICAgICAgIHVuaWZvcm0ubmVlZHNVcGRhdGUgPSBudW1HbG9iYWxQbGFuZXMgPiAw
OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNjb3BlLm51bVBsYW5lcyA9IG51bUds
b2JhbFBsYW5lczsKKyAgICAgICAgICAgIHNjb3BlLm51bUludGVyc2VjdGlvbiA9IDA7CisKKyAg
ICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJh
LCBkc3RPZmZzZXQsIHNraXBUcmFuc2Zvcm0gKSB7CisKKyAgICAgICAgICAgIHZhciBuUGxhbmVz
ID0gcGxhbmVzICE9PSBudWxsID8gcGxhbmVzLmxlbmd0aCA6IDAsCisgICAgICAgICAgICAgICAg
ZHN0QXJyYXkgPSBudWxsOworCisgICAgICAgICAgICBpZiAoIG5QbGFuZXMgIT09IDAgKSB7CisK
KyAgICAgICAgICAgICAgICBkc3RBcnJheSA9IHVuaWZvcm0udmFsdWU7CisKKyAgICAgICAgICAg
ICAgICBpZiAoIHNraXBUcmFuc2Zvcm0gIT09IHRydWUgfHwgZHN0QXJyYXkgPT09IG51bGwgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZsYXRTaXplID0gZHN0T2Zmc2V0ICsgblBsYW5l
cyAqIDQsCisgICAgICAgICAgICAgICAgICAgICAgICB2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJp
eFdvcmxkSW52ZXJzZTsKKworICAgICAgICAgICAgICAgICAgICB2aWV3Tm9ybWFsTWF0cml4Lmdl
dE5vcm1hbE1hdHJpeCggdmlld01hdHJpeCApOworCisgICAgICAgICAgICAgICAgICAgIGlmICgg
ZHN0QXJyYXkgPT09IG51bGwgfHwgZHN0QXJyYXkubGVuZ3RoIDwgZmxhdFNpemUgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGRzdEFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggZmxhdFNp
emUgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9y
ICggdmFyIGkgPSAwLCBpNCA9IGRzdE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpICE9PSBuUGxhbmVzOyArKyBpLCBpNCArPSA0ICkgeworCisgICAgICAg
ICAgICAgICAgICAgICAgICBwbGFuZS5jb3B5KCBwbGFuZXNbIGkgXSApLgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBhcHBseU1hdHJpeDQoIHZpZXdNYXRyaXgsIHZpZXdOb3JtYWxN
YXRyaXggKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUubm9ybWFsLnRvQXJyYXko
IGRzdEFycmF5LCBpNCApOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0QXJyYXlbIGk0ICsg
MyBdID0gcGxhbmUuY29uc3RhbnQ7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5Owor
ICAgICAgICAgICAgICAgIHVuaWZvcm0ubmVlZHNVcGRhdGUgPSB0cnVlOworCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIHNjb3BlLm51bVBsYW5lcyA9IG5QbGFuZXM7CisKKyAgICAgICAg
ICAgIHJldHVybiBkc3RBcnJheTsKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBpbXBv
cnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZSc7CisgICAgLyoqCisgICAgICogQGF1
dGhvciBzdXBlcmVnZ2JlcnQgLyBodHRwOi8vd3d3LnBhdWxicnVudC5jby51ay8KKyAgICAgKiBA
YXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworICAgICAqIEBhdXRob3IgYWx0ZXJl
ZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAgICogQGF1dGhvciBzemltZWsgLyBo
dHRwczovL2dpdGh1Yi5jb20vc3ppbWVrLworICAgICAqIEBhdXRob3IgdHNjaHcKKyAgICAgKi8K
KworICAgIGZ1bmN0aW9uIFdlYkdMUmVuZGVyZXIoIHBhcmFtZXRlcnMgKSB7CisKKyAgICAgICAg
Y29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlcmVyJywgUkVWSVNJT04gKTsKKworICAgICAg
ICBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTsKKworICAgICAgICB2YXIgX2NhbnZhcyA9
IHBhcmFtZXRlcnMuY2FudmFzICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNhbnZhcyA6IGRv
Y3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAn
Y2FudmFzJyApLAorICAgICAgICAgICAgX2NvbnRleHQgPSBwYXJhbWV0ZXJzLmNvbnRleHQgIT09
IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuY29udGV4dCA6IG51bGwsCisKKyAgICAgICAgICAgIF9h
bHBoYSA9IHBhcmFtZXRlcnMuYWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYWxwaGEg
OiBmYWxzZSwKKyAgICAgICAgICAgIF9kZXB0aCA9IHBhcmFtZXRlcnMuZGVwdGggIT09IHVuZGVm
aW5lZCA/IHBhcmFtZXRlcnMuZGVwdGggOiB0cnVlLAorICAgICAgICAgICAgX3N0ZW5jaWwgPSBw
YXJhbWV0ZXJzLnN0ZW5jaWwgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuc3RlbmNpbCA6IHRy
dWUsCisgICAgICAgICAgICBfYW50aWFsaWFzID0gcGFyYW1ldGVycy5hbnRpYWxpYXMgIT09IHVu
ZGVmaW5lZCA/IHBhcmFtZXRlcnMuYW50aWFsaWFzIDogZmFsc2UsCisgICAgICAgICAgICBfcHJl
bXVsdGlwbGllZEFscGhhID0gcGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgIT09IHVuZGVm
aW5lZCA/IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhIDogdHJ1ZSwKKyAgICAgICAgICAg
IF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgPSBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZl
ciAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgOiBmYWxz
ZTsKKworICAgICAgICB2YXIgbGlnaHRzID0gW107CisKKyAgICAgICAgdmFyIGN1cnJlbnRSZW5k
ZXJMaXN0ID0gbnVsbDsKKworICAgICAgICB2YXIgbW9ycGhJbmZsdWVuY2VzID0gbmV3IEZsb2F0
MzJBcnJheSggOCApOworCisgICAgICAgIHZhciBzcHJpdGVzID0gW107CisgICAgICAgIHZhciBs
ZW5zRmxhcmVzID0gW107CisKKyAgICAgICAgLy8gcHVibGljIHByb3BlcnRpZXMKKworICAgICAg
ICB0aGlzLmRvbUVsZW1lbnQgPSBfY2FudmFzOworICAgICAgICB0aGlzLmNvbnRleHQgPSBudWxs
OworCisgICAgICAgIC8vIGNsZWFyaW5nCisKKyAgICAgICAgdGhpcy5hdXRvQ2xlYXIgPSB0cnVl
OworICAgICAgICB0aGlzLmF1dG9DbGVhckNvbG9yID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5hdXRv
Q2xlYXJEZXB0aCA9IHRydWU7CisgICAgICAgIHRoaXMuYXV0b0NsZWFyU3RlbmNpbCA9IHRydWU7
CisKKyAgICAgICAgLy8gc2NlbmUgZ3JhcGgKKworICAgICAgICB0aGlzLnNvcnRPYmplY3RzID0g
dHJ1ZTsKKworICAgICAgICAvLyB1c2VyLWRlZmluZWQgY2xpcHBpbmcKKworICAgICAgICB0aGlz
LmNsaXBwaW5nUGxhbmVzID0gW107CisgICAgICAgIHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQg
PSBmYWxzZTsKKworICAgICAgICAvLyBwaHlzaWNhbGx5IGJhc2VkIHNoYWRpbmcKKworICAgICAg
ICB0aGlzLmdhbW1hRmFjdG9yID0gMi4wOyAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkK
KyAgICAgICAgdGhpcy5nYW1tYUlucHV0ID0gZmFsc2U7CisgICAgICAgIHRoaXMuZ2FtbWFPdXRw
dXQgPSBmYWxzZTsKKworICAgICAgICAvLyBwaHlzaWNhbCBsaWdodHMKKworICAgICAgICB0aGlz
LnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzID0gZmFsc2U7CisKKyAgICAgICAgLy8gdG9uZSBtYXBw
aW5nCisKKyAgICAgICAgdGhpcy50b25lTWFwcGluZyA9IExpbmVhclRvbmVNYXBwaW5nOworICAg
ICAgICB0aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjA7CisgICAgICAgIHRoaXMudG9uZU1h
cHBpbmdXaGl0ZVBvaW50ID0gMS4wOworCisgICAgICAgIC8vIG1vcnBocworCisgICAgICAgIHRo
aXMubWF4TW9ycGhUYXJnZXRzID0gODsKKyAgICAgICAgdGhpcy5tYXhNb3JwaE5vcm1hbHMgPSA0
OworCisgICAgICAgIC8vIGludGVybmFsIHByb3BlcnRpZXMKKworICAgICAgICB2YXIgX3RoaXMg
PSB0aGlzLAorCisgICAgICAgICAgICAvLyBpbnRlcm5hbCBzdGF0ZSBjYWNoZQorCisgICAgICAg
ICAgICBfY3VycmVudFByb2dyYW0gPSBudWxsLAorICAgICAgICAgICAgX2N1cnJlbnRSZW5kZXJU
YXJnZXQgPSBudWxsLAorICAgICAgICAgICAgX2N1cnJlbnRGcmFtZWJ1ZmZlciA9IG51bGwsCisg
ICAgICAgICAgICBfY3VycmVudE1hdGVyaWFsSWQgPSAtIDEsCisgICAgICAgICAgICBfY3VycmVu
dEdlb21ldHJ5UHJvZ3JhbSA9ICcnLAorCisgICAgICAgICAgICBfY3VycmVudENhbWVyYSA9IG51
bGwsCisgICAgICAgICAgICBfY3VycmVudEFycmF5Q2FtZXJhID0gbnVsbCwKKworICAgICAgICAg
ICAgX2N1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKSwKKyAgICAgICAgICAgIF9jdXJyZW50
U2Npc3NvclRlc3QgPSBudWxsLAorCisgICAgICAgICAgICBfY3VycmVudFZpZXdwb3J0ID0gbmV3
IFZlY3RvcjQoKSwKKworICAgICAgICAgICAgLy8KKworICAgICAgICAgICAgX3VzZWRUZXh0dXJl
VW5pdHMgPSAwLAorCisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBfd2lkdGggPSBfY2Fu
dmFzLndpZHRoLAorICAgICAgICAgICAgX2hlaWdodCA9IF9jYW52YXMuaGVpZ2h0LAorCisgICAg
ICAgICAgICBfcGl4ZWxSYXRpbyA9IDEsCisKKyAgICAgICAgICAgIF9zY2lzc29yID0gbmV3IFZl
Y3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApLAorICAgICAgICAgICAgX3NjaXNzb3JUZXN0
ID0gZmFsc2UsCisKKyAgICAgICAgICAgIF92aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCBf
d2lkdGgsIF9oZWlnaHQgKSwKKworICAgICAgICAgICAgLy8gZnJ1c3R1bQorCisgICAgICAgICAg
ICBfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCksCisKKyAgICAgICAgICAgIC8vIGNsaXBwaW5nCisK
KyAgICAgICAgICAgIF9jbGlwcGluZyA9IG5ldyBXZWJHTENsaXBwaW5nKCksCisgICAgICAgICAg
ICBfY2xpcHBpbmdFbmFibGVkID0gZmFsc2UsCisgICAgICAgICAgICBfbG9jYWxDbGlwcGluZ0Vu
YWJsZWQgPSBmYWxzZSwKKworICAgICAgICAgICAgLy8gY2FtZXJhIG1hdHJpY2VzIGNhY2hlCisK
KyAgICAgICAgICAgIF9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSwKKworICAgICAg
ICAgICAgX3ZlY3RvcjMgPSBuZXcgVmVjdG9yMygpLAorICAgICAgICAgICAgX21hdHJpeDQgPSBu
ZXcgTWF0cml4NCgpLAorICAgICAgICAgICAgX21hdHJpeDQyID0gbmV3IE1hdHJpeDQoKSwKKwor
ICAgICAgICAgICAgLy8gbGlnaHQgYXJyYXlzIGNhY2hlCisKKyAgICAgICAgICAgIF9saWdodHMg
PSB7CisKKyAgICAgICAgICAgICAgICBoYXNoOiAnJywKKworICAgICAgICAgICAgICAgIGFtYmll
bnQ6IFsgMCwgMCwgMCBdLAorICAgICAgICAgICAgICAgIGRpcmVjdGlvbmFsOiBbXSwKKyAgICAg
ICAgICAgICAgICBkaXJlY3Rpb25hbFNoYWRvd01hcDogW10sCisgICAgICAgICAgICAgICAgZGly
ZWN0aW9uYWxTaGFkb3dNYXRyaXg6IFtdLAorICAgICAgICAgICAgICAgIHNwb3Q6IFtdLAorICAg
ICAgICAgICAgICAgIHNwb3RTaGFkb3dNYXA6IFtdLAorICAgICAgICAgICAgICAgIHNwb3RTaGFk
b3dNYXRyaXg6IFtdLAorICAgICAgICAgICAgICAgIHJlY3RBcmVhOiBbXSwKKyAgICAgICAgICAg
ICAgICBwb2ludDogW10sCisgICAgICAgICAgICAgICAgcG9pbnRTaGFkb3dNYXA6IFtdLAorICAg
ICAgICAgICAgICAgIHBvaW50U2hhZG93TWF0cml4OiBbXSwKKyAgICAgICAgICAgICAgICBoZW1p
OiBbXSwKKworICAgICAgICAgICAgICAgIHNoYWRvd3M6IFtdCisKKyAgICAgICAgICAgIH0sCisK
KyAgICAgICAgICAgIC8vIGluZm8KKworICAgICAgICAgICAgX2luZm9NZW1vcnkgPSB7CisgICAg
ICAgICAgICAgICAgZ2VvbWV0cmllczogMCwKKyAgICAgICAgICAgICAgICB0ZXh0dXJlczogMAor
ICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgX2luZm9SZW5kZXIgPSB7CisKKyAgICAgICAg
ICAgICAgICBmcmFtZTogMCwKKyAgICAgICAgICAgICAgICBjYWxsczogMCwKKyAgICAgICAgICAg
ICAgICB2ZXJ0aWNlczogMCwKKyAgICAgICAgICAgICAgICBmYWNlczogMCwKKyAgICAgICAgICAg
ICAgICBwb2ludHM6IDAKKworICAgICAgICAgICAgfTsKKworICAgICAgICB0aGlzLmluZm8gPSB7
CisKKyAgICAgICAgICAgIHJlbmRlcjogX2luZm9SZW5kZXIsCisgICAgICAgICAgICBtZW1vcnk6
IF9pbmZvTWVtb3J5LAorICAgICAgICAgICAgcHJvZ3JhbXM6IG51bGwKKworICAgICAgICB9Owor
CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZQorCisgICAgICAgIHZhciBfZ2w7CisKKyAgICAgICAg
dHJ5IHsKKworICAgICAgICAgICAgdmFyIGNvbnRleHRBdHRyaWJ1dGVzID0geworICAgICAgICAg
ICAgICAgIGFscGhhOiBfYWxwaGEsCisgICAgICAgICAgICAgICAgZGVwdGg6IF9kZXB0aCwKKyAg
ICAgICAgICAgICAgICBzdGVuY2lsOiBfc3RlbmNpbCwKKyAgICAgICAgICAgICAgICBhbnRpYWxp
YXM6IF9hbnRpYWxpYXMsCisgICAgICAgICAgICAgICAgcHJlbXVsdGlwbGllZEFscGhhOiBfcHJl
bXVsdGlwbGllZEFscGhhLAorICAgICAgICAgICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjog
X3ByZXNlcnZlRHJhd2luZ0J1ZmZlcgorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgX2ds
ID0gX2NvbnRleHQgfHwgX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnLCBjb250ZXh0QXR0cmli
dXRlcyApIHx8IF9jYW52YXMuZ2V0Q29udGV4dCggJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGNvbnRl
eHRBdHRyaWJ1dGVzICk7CisKKyAgICAgICAgICAgIGlmICggX2dsID09PSBudWxsICkgeworCisg
ICAgICAgICAgICAgICAgaWYgKCBfY2FudmFzLmdldENvbnRleHQoICd3ZWJnbCcgKSAhPT0gbnVs
bCApIHsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyAnRXJyb3IgY3JlYXRpbmcgV2ViR0wg
Y29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4nOworCisgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyAnRXJyb3IgY3JlYXRpbmcg
V2ViR0wgY29udGV4dC4nOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIC8vIFNvbWUgZXhwZXJpbWVudGFsLXdlYmdsIGltcGxlbWVudGF0aW9ucyBk
byBub3QgaGF2ZSBnZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQKKworICAgICAgICAgICAgaWYgKCBf
Z2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAg
ICAgICAgICBfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID0gZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiB7ICdyYW5nZU1pbic6IDEsICdyYW5nZU1heCc6IDEs
ICdwcmVjaXNpb24nOiAxIH07CisKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxv
c3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApOworCisgICAgICAgIH0gY2F0Y2ggKCBlcnJvciAp
IHsKKworICAgICAgICAgICAgY29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcg
KyBlcnJvciApOworCisgICAgICAgIH0KKworICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IG5ldyBX
ZWJHTEV4dGVuc2lvbnMoIF9nbCApOworCisgICAgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xf
ZGVwdGhfdGV4dHVyZScgKTsKKyAgICAgICAgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9m
bG9hdCcgKTsKKyAgICAgICAgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5l
YXInICk7CisgICAgICAgIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcg
KTsKKyAgICAgICAgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVh
cicgKTsKKyAgICAgICAgZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMn
ICk7CisgICAgICAgIGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTsK
KworICAgICAgICBpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX2VsZW1lbnRfaW5kZXhfdWludCcg
KSApIHsKKworICAgICAgICAgICAgQnVmZmVyR2VvbWV0cnkuTWF4SW5kZXggPSA0Mjk0OTY3Mjk2
OworCisgICAgICAgIH0KKworICAgICAgICB2YXIgY2FwYWJpbGl0aWVzID0gbmV3IFdlYkdMQ2Fw
YWJpbGl0aWVzKCBfZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKTsKKworICAgICAgICB2YXIg
c3RhdGUgPSBuZXcgV2ViR0xTdGF0ZSggX2dsLCBleHRlbnNpb25zLCBwYXJhbVRocmVlVG9HTCAp
OworCisgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gbmV3IFdlYkdMUHJvcGVydGllcygpOworICAg
ICAgICB2YXIgdGV4dHVyZXMgPSBuZXcgV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBz
dGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCBwYXJhbVRocmVlVG9HTCwgX2luZm9NZW1v
cnkgKTsKKyAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBuZXcgV2ViR0xBdHRyaWJ1dGVzKCBfZ2wg
KTsKKyAgICAgICAgdmFyIGdlb21ldHJpZXMgPSBuZXcgV2ViR0xHZW9tZXRyaWVzKCBfZ2wsIGF0
dHJpYnV0ZXMsIF9pbmZvTWVtb3J5ICk7CisgICAgICAgIHZhciBvYmplY3RzID0gbmV3IFdlYkdM
T2JqZWN0cyggX2dsLCBnZW9tZXRyaWVzLCBfaW5mb1JlbmRlciApOworICAgICAgICB2YXIgcHJv
Z3JhbUNhY2hlID0gbmV3IFdlYkdMUHJvZ3JhbXMoIHRoaXMsIGNhcGFiaWxpdGllcyApOworICAg
ICAgICB2YXIgbGlnaHRDYWNoZSA9IG5ldyBXZWJHTExpZ2h0cygpOworICAgICAgICB2YXIgcmVu
ZGVyTGlzdHMgPSBuZXcgV2ViR0xSZW5kZXJMaXN0cygpOworCisgICAgICAgIHZhciBiYWNrZ3Jv
dW5kID0gbmV3IFdlYkdMQmFja2dyb3VuZCggdGhpcywgc3RhdGUsIG9iamVjdHMsIF9wcmVtdWx0
aXBsaWVkQWxwaGEgKTsKKyAgICAgICAgdmFyIHZyID0gbmV3IFdlYlZSTWFuYWdlciggdGhpcyAp
OworCisgICAgICAgIHRoaXMuaW5mby5wcm9ncmFtcyA9IHByb2dyYW1DYWNoZS5wcm9ncmFtczsK
KworICAgICAgICB2YXIgYnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xCdWZmZXJSZW5kZXJlcigg
X2dsLCBleHRlbnNpb25zLCBfaW5mb1JlbmRlciApOworICAgICAgICB2YXIgaW5kZXhlZEJ1ZmZl
clJlbmRlcmVyID0gbmV3IFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lv
bnMsIF9pbmZvUmVuZGVyICk7CisKKyAgICAgICAgLy8KKworICAgICAgICBmdW5jdGlvbiBnZXRU
YXJnZXRQaXhlbFJhdGlvKCkgeworCisgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRSZW5kZXJU
YXJnZXQgPT09IG51bGwgPyBfcGl4ZWxSYXRpbyA6IDE7CisKKyAgICAgICAgfQorCisgICAgICAg
IGZ1bmN0aW9uIHNldERlZmF1bHRHTFN0YXRlKCkgeworCisgICAgICAgICAgICBzdGF0ZS5pbml0
KCk7CisKKyAgICAgICAgICAgIHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3Nvci5jb3B5KCBf
c2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7CisgICAgICAgICAgICBz
dGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBs
eVNjYWxhciggX3BpeGVsUmF0aW8gKSApOworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlv
biByZXNldEdMU3RhdGUoKSB7CisKKyAgICAgICAgICAgIF9jdXJyZW50UHJvZ3JhbSA9IG51bGw7
CisgICAgICAgICAgICBfY3VycmVudENhbWVyYSA9IG51bGw7CisKKyAgICAgICAgICAgIF9jdXJy
ZW50R2VvbWV0cnlQcm9ncmFtID0gJyc7CisgICAgICAgICAgICBfY3VycmVudE1hdGVyaWFsSWQg
PSAtIDE7CisKKyAgICAgICAgICAgIHN0YXRlLnJlc2V0KCk7CisKKyAgICAgICAgfQorCisgICAg
ICAgIHNldERlZmF1bHRHTFN0YXRlKCk7CisKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gX2dsOwor
ICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKKyAgICAgICAgdGhpcy5l
eHRlbnNpb25zID0gZXh0ZW5zaW9uczsKKyAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVy
dGllczsKKyAgICAgICAgdGhpcy5yZW5kZXJMaXN0cyA9IHJlbmRlckxpc3RzOworICAgICAgICB0
aGlzLnN0YXRlID0gc3RhdGU7CisgICAgICAgIHRoaXMudnIgPSB2cjsKKworICAgICAgICAvLyBz
aGFkb3cgbWFwCisKKyAgICAgICAgdmFyIHNoYWRvd01hcCA9IG5ldyBXZWJHTFNoYWRvd01hcCgg
dGhpcywgX2xpZ2h0cywgb2JqZWN0cywgY2FwYWJpbGl0aWVzICk7CisKKyAgICAgICAgdGhpcy5z
aGFkb3dNYXAgPSBzaGFkb3dNYXA7CisKKworICAgICAgICAvLyBQbHVnaW5zCisKKyAgICAgICAg
dmFyIHNwcml0ZVBsdWdpbiA9IG5ldyBTcHJpdGVQbHVnaW4oIHRoaXMsIHNwcml0ZXMgKTsKKyAg
ICAgICAgdmFyIGxlbnNGbGFyZVBsdWdpbiA9IG5ldyBMZW5zRmxhcmVQbHVnaW4oIHRoaXMsIGxl
bnNGbGFyZXMgKTsKKworICAgICAgICAvLyBBUEkKKworICAgICAgICB0aGlzLmdldENvbnRleHQg
PSBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBfZ2w7CisKKyAgICAgICAgfTsK
KworICAgICAgICB0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICByZXR1cm4gX2dsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAg
fTsKKworICAgICAgICB0aGlzLmZvcmNlQ29udGV4dExvc3MgPSBmdW5jdGlvbiAoKSB7CisKKyAg
ICAgICAgICAgIHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2xvc2VfY29u
dGV4dCcgKTsKKyAgICAgICAgICAgIGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLmxvc2VDb250
ZXh0KCk7CisKKyAgICAgICAgfTsKKworICAgICAgICB0aGlzLmdldE1heEFuaXNvdHJvcHkgPSBm
dW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBjYXBhYmlsaXRpZXMuZ2V0TWF4QW5p
c290cm9weSgpOworCisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5nZXRQcmVjaXNpb24gPSBm
dW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBjYXBhYmlsaXRpZXMucHJlY2lzaW9u
OworCisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24g
KCkgeworCisgICAgICAgICAgICByZXR1cm4gX3BpeGVsUmF0aW87CisKKyAgICAgICAgfTsKKwor
ICAgICAgICB0aGlzLnNldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAg
ICAgICAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSByZXR1cm47CisKKyAgICAgICAgICAg
IF9waXhlbFJhdGlvID0gdmFsdWU7CisKKyAgICAgICAgICAgIHRoaXMuc2V0U2l6ZSggX3dpZHRo
LCBfaGVpZ2h0LCBmYWxzZSApOworCisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5nZXRTaXpl
ID0gZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAg
IHdpZHRoOiBfd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0OiBfaGVpZ2h0CisgICAgICAg
ICAgICB9OworCisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5zZXRTaXplID0gZnVuY3Rpb24g
KCB3aWR0aCwgaGVpZ2h0LCB1cGRhdGVTdHlsZSApIHsKKworICAgICAgICAgICAgdmFyIGRldmlj
ZSA9IHZyLmdldERldmljZSgpOworCisgICAgICAgICAgICBpZiAoIGRldmljZSAmJiBkZXZpY2Uu
aXNQcmVzZW50aW5nICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUu
V2ViR0xSZW5kZXJlcjogQ2FuXCd0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVz
ZW50aW5nLicgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgX3dpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBfaGVpZ2h0ID0gaGVpZ2h0
OworCisgICAgICAgICAgICBfY2FudmFzLndpZHRoID0gd2lkdGggKiBfcGl4ZWxSYXRpbzsKKyAg
ICAgICAgICAgIF9jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogX3BpeGVsUmF0aW87CisKKyAgICAg
ICAgICAgIGlmICggdXBkYXRlU3R5bGUgIT09IGZhbHNlICkgeworCisgICAgICAgICAgICAgICAg
X2NhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JzsKKyAgICAgICAgICAgICAgICBfY2Fu
dmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgdGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApOworCisgICAg
ICAgIH07CisKKyAgICAgICAgdGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICgp
IHsKKworICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICB3aWR0aDogX3dpZHRo
ICogX3BpeGVsUmF0aW8sCisgICAgICAgICAgICAgICAgaGVpZ2h0OiBfaGVpZ2h0ICogX3BpeGVs
UmF0aW8KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfTsKKworICAgICAgICB0aGlzLnNldERy
YXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCBwaXhlbFJhdGlvICkg
eworCisgICAgICAgICAgICBfd2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgIF9oZWlnaHQgPSBo
ZWlnaHQ7CisKKyAgICAgICAgICAgIF9waXhlbFJhdGlvID0gcGl4ZWxSYXRpbzsKKworICAgICAg
ICAgICAgX2NhbnZhcy53aWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbzsKKyAgICAgICAgICAgIF9j
YW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogcGl4ZWxSYXRpbzsKKworICAgICAgICAgICAgdGhpcy5z
ZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApOworCisgICAgICAgIH07CisKKyAgICAg
ICAgdGhpcy5zZXRWaWV3cG9ydCA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHsK
KworICAgICAgICAgICAgX3ZpZXdwb3J0LnNldCggeCwgX2hlaWdodCAtIHkgLSBoZWlnaHQsIHdp
ZHRoLCBoZWlnaHQgKTsKKyAgICAgICAgICAgIHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdw
b3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7CisK
KyAgICAgICAgfTsKKworICAgICAgICB0aGlzLnNldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHgsIHks
IHdpZHRoLCBoZWlnaHQgKSB7CisKKyAgICAgICAgICAgIF9zY2lzc29yLnNldCggeCwgX2hlaWdo
dCAtIHkgLSBoZWlnaHQsIHdpZHRoLCBoZWlnaHQgKTsKKyAgICAgICAgICAgIHN0YXRlLnNjaXNz
b3IoIF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4
ZWxSYXRpbyApICk7CisKKyAgICAgICAgfTsKKworICAgICAgICB0aGlzLnNldFNjaXNzb3JUZXN0
ID0gZnVuY3Rpb24gKCBib29sZWFuICkgeworCisgICAgICAgICAgICBzdGF0ZS5zZXRTY2lzc29y
VGVzdCggX3NjaXNzb3JUZXN0ID0gYm9vbGVhbiApOworCisgICAgICAgIH07CisKKyAgICAgICAg
Ly8gQ2xlYXJpbmcKKworICAgICAgICB0aGlzLmdldENsZWFyQ29sb3IgPSBiYWNrZ3JvdW5kLmdl
dENsZWFyQ29sb3I7CisgICAgICAgIHRoaXMuc2V0Q2xlYXJDb2xvciA9IGJhY2tncm91bmQuc2V0
Q2xlYXJDb2xvcjsKKyAgICAgICAgdGhpcy5nZXRDbGVhckFscGhhID0gYmFja2dyb3VuZC5nZXRD
bGVhckFscGhhOworICAgICAgICB0aGlzLnNldENsZWFyQWxwaGEgPSBiYWNrZ3JvdW5kLnNldENs
ZWFyQWxwaGE7CisKKyAgICAgICAgdGhpcy5jbGVhciA9IGZ1bmN0aW9uICggY29sb3IsIGRlcHRo
LCBzdGVuY2lsICkgeworCisgICAgICAgICAgICB2YXIgYml0cyA9IDA7CisKKyAgICAgICAgICAg
IGlmICggY29sb3IgPT09IHVuZGVmaW5lZCB8fCBjb2xvciApIGJpdHMgfD0gX2dsLkNPTE9SX0JV
RkZFUl9CSVQ7CisgICAgICAgICAgICBpZiAoIGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGgg
KSBiaXRzIHw9IF9nbC5ERVBUSF9CVUZGRVJfQklUOworICAgICAgICAgICAgaWYgKCBzdGVuY2ls
ID09PSB1bmRlZmluZWQgfHwgc3RlbmNpbCApIGJpdHMgfD0gX2dsLlNURU5DSUxfQlVGRkVSX0JJ
VDsKKworICAgICAgICAgICAgX2dsLmNsZWFyKCBiaXRzICk7CisKKyAgICAgICAgfTsKKworICAg
ICAgICB0aGlzLmNsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHRoaXMu
Y2xlYXIoIHRydWUsIGZhbHNlLCBmYWxzZSApOworCisgICAgICAgIH07CisKKyAgICAgICAgdGhp
cy5jbGVhckRlcHRoID0gZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB0aGlzLmNsZWFyKCBm
YWxzZSwgdHJ1ZSwgZmFsc2UgKTsKKworICAgICAgICB9OworCisgICAgICAgIHRoaXMuY2xlYXJT
dGVuY2lsID0gZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB0aGlzLmNsZWFyKCBmYWxzZSwg
ZmFsc2UsIHRydWUgKTsKKworICAgICAgICB9OworCisgICAgICAgIHRoaXMuY2xlYXJUYXJnZXQg
PSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgY29sb3IsIGRlcHRoLCBzdGVuY2lsICkgeworCisg
ICAgICAgICAgICB0aGlzLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7CisgICAgICAg
ICAgICB0aGlzLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTsKKworICAgICAgICB9Owor
CisgICAgICAgIC8vIFJlc2V0CisKKyAgICAgICAgdGhpcy5yZXNldEdMU3RhdGUgPSByZXNldEdM
U3RhdGU7CisKKyAgICAgICAgdGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICBfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0Jywgb25D
b250ZXh0TG9zdCwgZmFsc2UgKTsKKworICAgICAgICAgICAgcmVuZGVyTGlzdHMuZGlzcG9zZSgp
OworCisgICAgICAgIH07CisKKyAgICAgICAgLy8gRXZlbnRzCisKKyAgICAgICAgZnVuY3Rpb24g
b25Db250ZXh0TG9zdCggZXZlbnQgKSB7CisKKyAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZh
dWx0KCk7CisKKyAgICAgICAgICAgIHJlc2V0R0xTdGF0ZSgpOworICAgICAgICAgICAgc2V0RGVm
YXVsdEdMU3RhdGUoKTsKKworICAgICAgICAgICAgcHJvcGVydGllcy5jbGVhcigpOworICAgICAg
ICAgICAgb2JqZWN0cy5jbGVhcigpOworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBv
bk1hdGVyaWFsRGlzcG9zZSggZXZlbnQgKSB7CisKKyAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9
IGV2ZW50LnRhcmdldDsKKworICAgICAgICAgICAgbWF0ZXJpYWwucmVtb3ZlRXZlbnRMaXN0ZW5l
ciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApOworCisgICAgICAgICAgICBkZWFsbG9j
YXRlTWF0ZXJpYWwoIG1hdGVyaWFsICk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIEJ1ZmZl
ciBkZWFsbG9jYXRpb24KKworICAgICAgICBmdW5jdGlvbiBkZWFsbG9jYXRlTWF0ZXJpYWwoIG1h
dGVyaWFsICkgeworCisgICAgICAgICAgICByZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNl
KCBtYXRlcmlhbCApOworCisgICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZSggbWF0ZXJpYWwg
KTsKKworICAgICAgICB9CisKKworICAgICAgICBmdW5jdGlvbiByZWxlYXNlTWF0ZXJpYWxQcm9n
cmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApIHsKKworICAgICAgICAgICAgdmFyIHByb2dyYW1JbmZv
ID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICkucHJvZ3JhbTsKKworICAgICAgICAgICAgbWF0
ZXJpYWwucHJvZ3JhbSA9IHVuZGVmaW5lZDsKKworICAgICAgICAgICAgaWYgKCBwcm9ncmFtSW5m
byAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgcHJvZ3JhbUNhY2hlLnJlbGVh
c2VQcm9ncmFtKCBwcm9ncmFtSW5mbyApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQor
CisgICAgICAgIC8vIEJ1ZmZlciByZW5kZXJpbmcKKworICAgICAgICBmdW5jdGlvbiByZW5kZXJP
YmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKSB7CisKKyAgICAgICAg
ICAgIG9iamVjdC5yZW5kZXIoIGZ1bmN0aW9uICggb2JqZWN0ICkgeworCisgICAgICAgICAgICAg
ICAgX3RoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFs
ICk7CisKKyAgICAgICAgICAgIH0gKTsKKworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5yZW5k
ZXJCdWZmZXJJbW1lZGlhdGUgPSBmdW5jdGlvbiAoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwg
KSB7CisKKyAgICAgICAgICAgIHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgICAg
IHZhciBidWZmZXJzID0gcHJvcGVydGllcy5nZXQoIG9iamVjdCApOworCisgICAgICAgICAgICBp
ZiAoIG9iamVjdC5oYXNQb3NpdGlvbnMgJiYgISBidWZmZXJzLnBvc2l0aW9uICkgYnVmZmVycy5w
b3NpdGlvbiA9IF9nbC5jcmVhdGVCdWZmZXIoKTsKKyAgICAgICAgICAgIGlmICggb2JqZWN0Lmhh
c05vcm1hbHMgJiYgISBidWZmZXJzLm5vcm1hbCApIGJ1ZmZlcnMubm9ybWFsID0gX2dsLmNyZWF0
ZUJ1ZmZlcigpOworICAgICAgICAgICAgaWYgKCBvYmplY3QuaGFzVXZzICYmICEgYnVmZmVycy51
diApIGJ1ZmZlcnMudXYgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7CisgICAgICAgICAgICBpZiAoIG9i
amVjdC5oYXNDb2xvcnMgJiYgISBidWZmZXJzLmNvbG9yICkgYnVmZmVycy5jb2xvciA9IF9nbC5j
cmVhdGVCdWZmZXIoKTsKKworICAgICAgICAgICAgdmFyIHByb2dyYW1BdHRyaWJ1dGVzID0gcHJv
Z3JhbS5nZXRBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgICAgIGlmICggb2JqZWN0Lmhhc1Bvc2l0
aW9ucyApIHsKKworICAgICAgICAgICAgICAgIF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVG
RkVSLCBidWZmZXJzLnBvc2l0aW9uICk7CisgICAgICAgICAgICAgICAgX2dsLmJ1ZmZlckRhdGEo
IF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC5wb3NpdGlvbkFycmF5LCBfZ2wuRFlOQU1JQ19EUkFX
ICk7CisKKyAgICAgICAgICAgICAgICBzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRy
aWJ1dGVzLnBvc2l0aW9uICk7CisgICAgICAgICAgICAgICAgX2dsLnZlcnRleEF0dHJpYlBvaW50
ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uLCAzLCBfZ2wuRkxPQVQsIGZhbHNlLCAwLCAw
ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBvYmplY3QuaGFzTm9ybWFs
cyApIHsKKworICAgICAgICAgICAgICAgIF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVS
LCBidWZmZXJzLm5vcm1hbCApOworCisgICAgICAgICAgICAgICAgaWYgKCAhIG1hdGVyaWFsLmlz
TWVzaFBob25nTWF0ZXJpYWwgJiYKKyAgICAgICAgICAgICAgICAgICAgISBtYXRlcmlhbC5pc01l
c2hTdGFuZGFyZE1hdGVyaWFsICYmCisgICAgICAgICAgICAgICAgICAgICEgbWF0ZXJpYWwuaXNN
ZXNoTm9ybWFsTWF0ZXJpYWwgJiYKKyAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2hhZGlu
ZyA9PT0gRmxhdFNoYWRpbmcgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGkg
PSAwLCBsID0gb2JqZWN0LmNvdW50ICogMzsgaSA8IGw7IGkgKz0gOSApIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gb2JqZWN0Lm5vcm1hbEFycmF5OworCisgICAgICAg
ICAgICAgICAgICAgICAgICB2YXIgbnggPSAoIGFycmF5WyBpICsgMCBdICsgYXJyYXlbIGkgKyAz
IF0gKyBhcnJheVsgaSArIDYgXSApIC8gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBu
eSA9ICggYXJyYXlbIGkgKyAxIF0gKyBhcnJheVsgaSArIDQgXSArIGFycmF5WyBpICsgNyBdICkg
LyAzOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG56ID0gKCBhcnJheVsgaSArIDIgXSAr
IGFycmF5WyBpICsgNSBdICsgYXJyYXlbIGkgKyA4IF0gKSAvIDM7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGFycmF5WyBpICsgMCBdID0gbng7CisgICAgICAgICAgICAgICAgICAgICAgICBh
cnJheVsgaSArIDEgXSA9IG55OworICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbIGkgKyAy
IF0gPSBuejsKKworICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbIGkgKyAzIF0gPSBueDsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5WyBpICsgNCBdID0gbnk7CisgICAgICAgICAg
ICAgICAgICAgICAgICBhcnJheVsgaSArIDUgXSA9IG56OworCisgICAgICAgICAgICAgICAgICAg
ICAgICBhcnJheVsgaSArIDYgXSA9IG54OworICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlb
IGkgKyA3IF0gPSBueTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5WyBpICsgOCBdID0g
bno7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgX2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC5ub3Jt
YWxBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApOworCisgICAgICAgICAgICAgICAgc3RhdGUuZW5h
YmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwgKTsKKworICAgICAgICAgICAg
ICAgIF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwsIDMs
IF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBpZiAoIG9iamVjdC5oYXNVdnMgJiYgbWF0ZXJpYWwubWFwICkgeworCisgICAgICAgICAgICAg
ICAgX2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMudXYgKTsKKyAgICAg
ICAgICAgICAgICBfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LnV2QXJy
YXksIF9nbC5EWU5BTUlDX0RSQVcgKTsKKworICAgICAgICAgICAgICAgIHN0YXRlLmVuYWJsZUF0
dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMudXYgKTsKKworICAgICAgICAgICAgICAgIF9nbC52
ZXJ0ZXhBdHRyaWJQb2ludGVyKCBhdHRyaWJ1dGVzLnV2LCAyLCBfZ2wuRkxPQVQsIGZhbHNlLCAw
LCAwICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBvYmplY3QuaGFzQ29s
b3JzICYmIG1hdGVyaWFsLnZlcnRleENvbG9ycyAhPT0gTm9Db2xvcnMgKSB7CisKKyAgICAgICAg
ICAgICAgICBfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy5jb2xvciAp
OworICAgICAgICAgICAgICAgIF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmpl
Y3QuY29sb3JBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApOworCisgICAgICAgICAgICAgICAgc3Rh
dGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5jb2xvciApOworCisgICAgICAg
ICAgICAgICAgX2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLmNvbG9y
LCAzLCBfZ2wuRkxPQVQsIGZhbHNlLCAwLCAwICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgc3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTsKKworICAgICAgICAgICAgX2ds
LmRyYXdBcnJheXMoIF9nbC5UUklBTkdMRVMsIDAsIG9iamVjdC5jb3VudCApOworCisgICAgICAg
ICAgICBvYmplY3QuY291bnQgPSAwOworCisgICAgICAgIH07CisKKyAgICAgICAgZnVuY3Rpb24g
YWJzTnVtZXJpY2FsU29ydCggYSwgYiApIHsKKworICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJz
KCBiWyAwIF0gKSAtIE1hdGguYWJzKCBhWyAwIF0gKTsKKworICAgICAgICB9CisKKyAgICAgICAg
dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbiAoIGNhbWVyYSwgZm9nLCBnZW9tZXRy
eSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKSB7CisKKyAgICAgICAgICAgIHN0YXRlLnNldE1h
dGVyaWFsKCBtYXRlcmlhbCApOworCisgICAgICAgICAgICB2YXIgcHJvZ3JhbSA9IHNldFByb2dy
YW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICk7CisgICAgICAgICAgICB2YXIgZ2Vv
bWV0cnlQcm9ncmFtID0gZ2VvbWV0cnkuaWQgKyAnXycgKyBwcm9ncmFtLmlkICsgJ18nICsgKCBt
YXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKTsKKworICAgICAgICAgICAgdmFyIHVwZGF0ZUJ1
ZmZlcnMgPSBmYWxzZTsKKworICAgICAgICAgICAgaWYgKCBnZW9tZXRyeVByb2dyYW0gIT09IF9j
dXJyZW50R2VvbWV0cnlQcm9ncmFtICkgeworCisgICAgICAgICAgICAgICAgX2N1cnJlbnRHZW9t
ZXRyeVByb2dyYW0gPSBnZW9tZXRyeVByb2dyYW07CisgICAgICAgICAgICAgICAgdXBkYXRlQnVm
ZmVycyA9IHRydWU7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbW9ycGggdGFy
Z2V0cworCisgICAgICAgICAgICB2YXIgbW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gb2JqZWN0Lm1v
cnBoVGFyZ2V0SW5mbHVlbmNlczsKKworICAgICAgICAgICAgaWYgKCBtb3JwaFRhcmdldEluZmx1
ZW5jZXMgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIC8vIFRPRE8gUmVtb3Zl
IGFsbG9jYXRpb25zCisKKyAgICAgICAgICAgICAgICB2YXIgYWN0aXZlSW5mbHVlbmNlcyA9IFtd
OworCisgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0gbW9ycGhUYXJnZXRJbmZs
dWVuY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFy
IGluZmx1ZW5jZSA9IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdOworICAgICAgICAgICAgICAg
ICAgICBhY3RpdmVJbmZsdWVuY2VzLnB1c2goIFsgaW5mbHVlbmNlLCBpIF0gKTsKKworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFjdGl2ZUluZmx1ZW5jZXMuc29ydCggYWJz
TnVtZXJpY2FsU29ydCApOworCisgICAgICAgICAgICAgICAgaWYgKCBhY3RpdmVJbmZsdWVuY2Vz
Lmxlbmd0aCA+IDggKSB7CisKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlSW5mbHVlbmNlcy5s
ZW5ndGggPSA4OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIG1v
cnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlczsKKworICAgICAgICAgICAg
ICAgIGZvciAoIHZhciBpID0gMCwgbCA9IGFjdGl2ZUluZmx1ZW5jZXMubGVuZ3RoOyBpIDwgbDsg
aSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIgaW5mbHVlbmNlID0gYWN0aXZlSW5m
bHVlbmNlc1sgaSBdOworICAgICAgICAgICAgICAgICAgICBtb3JwaEluZmx1ZW5jZXNbIGkgXSA9
IGluZmx1ZW5jZVsgMCBdOworCisgICAgICAgICAgICAgICAgICAgIGlmICggaW5mbHVlbmNlWyAw
IF0gIT09IDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGluZmx1
ZW5jZVsgMSBdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGVyaWFsLm1vcnBo
VGFyZ2V0cyA9PT0gdHJ1ZSAmJiBtb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gKSBnZW9tZXRyeS5h
ZGRBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpLCBtb3JwaEF0dHJpYnV0ZXMucG9zaXRpb25b
IGluZGV4IF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbWF0ZXJpYWwubW9ycGhO
b3JtYWxzID09PSB0cnVlICYmIG1vcnBoQXR0cmlidXRlcy5ub3JtYWwgKSBnZW9tZXRyeS5hZGRB
dHRyaWJ1dGUoICdtb3JwaE5vcm1hbCcgKyBpLCBtb3JwaEF0dHJpYnV0ZXMubm9ybWFsWyBpbmRl
eCBdICk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPT09IHRydWUgKSBnZW9tZXRyeS5y
ZW1vdmVBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpICk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIG1hdGVyaWFsLm1vcnBoTm9ybWFscyA9PT0gdHJ1ZSApIGdlb21ldHJ5LnJlbW92
ZUF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGkgKTsKKworICAgICAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IGFj
dGl2ZUluZmx1ZW5jZXMubGVuZ3RoLCBpbCA9IG1vcnBoSW5mbHVlbmNlcy5sZW5ndGg7IGkgPCBp
bDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICBtb3JwaEluZmx1ZW5jZXNbIGkgXSA9
IDAuMDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByb2dyYW0uZ2V0
VW5pZm9ybXMoKS5zZXRWYWx1ZSggX2dsLCAnbW9ycGhUYXJnZXRJbmZsdWVuY2VzJywgbW9ycGhJ
bmZsdWVuY2VzICk7CisKKyAgICAgICAgICAgICAgICB1cGRhdGVCdWZmZXJzID0gdHJ1ZTsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworCisgICAgICAgICAgICB2YXIgaW5kZXgg
PSBnZW9tZXRyeS5pbmRleDsKKyAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0
dHJpYnV0ZXMucG9zaXRpb247CisgICAgICAgICAgICB2YXIgcmFuZ2VGYWN0b3IgPSAxOworCisg
ICAgICAgICAgICBpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHsKKworICAgICAg
ICAgICAgICAgIGluZGV4ID0gZ2VvbWV0cmllcy5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21l
dHJ5ICk7CisgICAgICAgICAgICAgICAgcmFuZ2VGYWN0b3IgPSAyOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIHZhciBhdHRyaWJ1dGU7CisgICAgICAgICAgICB2YXIgcmVuZGVyZXIg
PSBidWZmZXJSZW5kZXJlcjsKKworICAgICAgICAgICAgaWYgKCBpbmRleCAhPT0gbnVsbCApIHsK
KworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBpbmRleCApOwor
CisgICAgICAgICAgICAgICAgcmVuZGVyZXIgPSBpbmRleGVkQnVmZmVyUmVuZGVyZXI7CisgICAg
ICAgICAgICAgICAgcmVuZGVyZXIuc2V0SW5kZXgoIGF0dHJpYnV0ZSApOworCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGlmICggdXBkYXRlQnVmZmVycyApIHsKKworICAgICAgICAgICAg
ICAgIHNldHVwVmVydGV4QXR0cmlidXRlcyggbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICk7
CisKKyAgICAgICAgICAgICAgICBpZiAoIGluZGV4ICE9PSBudWxsICkgeworCisgICAgICAgICAg
ICAgICAgICAgIF9nbC5iaW5kQnVmZmVyKCBfZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGF0dHJp
YnV0ZS5idWZmZXIgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAvLworCisgICAgICAgICAgICB2YXIgZGF0YUNvdW50ID0gMDsKKworICAgICAg
ICAgICAgaWYgKCBpbmRleCAhPT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgIGRhdGFDb3Vu
dCA9IGluZGV4LmNvdW50OworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBwb3NpdGlvbiAhPT0g
dW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgZGF0YUNvdW50ID0gcG9zaXRpb24uY291
bnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJhbmdlU3RhcnQgPSBnZW9t
ZXRyeS5kcmF3UmFuZ2Uuc3RhcnQgKiByYW5nZUZhY3RvcjsKKyAgICAgICAgICAgIHZhciByYW5n
ZUNvdW50ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLmNvdW50ICogcmFuZ2VGYWN0b3I7CisKKyAgICAg
ICAgICAgIHZhciBncm91cFN0YXJ0ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5zdGFydCAqIHJh
bmdlRmFjdG9yIDogMDsKKyAgICAgICAgICAgIHZhciBncm91cENvdW50ID0gZ3JvdXAgIT09IG51
bGwgPyBncm91cC5jb3VudCAqIHJhbmdlRmFjdG9yIDogSW5maW5pdHk7CisKKyAgICAgICAgICAg
IHZhciBkcmF3U3RhcnQgPSBNYXRoLm1heCggcmFuZ2VTdGFydCwgZ3JvdXBTdGFydCApOworICAg
ICAgICAgICAgdmFyIGRyYXdFbmQgPSBNYXRoLm1pbiggZGF0YUNvdW50LCByYW5nZVN0YXJ0ICsg
cmFuZ2VDb3VudCwgZ3JvdXBTdGFydCArIGdyb3VwQ291bnQgKSAtIDE7CisKKyAgICAgICAgICAg
IHZhciBkcmF3Q291bnQgPSBNYXRoLm1heCggMCwgZHJhd0VuZCAtIGRyYXdTdGFydCArIDEgKTsK
KworICAgICAgICAgICAgaWYgKCBkcmF3Q291bnQgPT09IDAgKSByZXR1cm47CisKKyAgICAgICAg
ICAgIC8vCisKKyAgICAgICAgICAgIGlmICggb2JqZWN0LmlzTWVzaCApIHsKKworICAgICAgICAg
ICAgICAgIGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkgeworCisgICAgICAgICAg
ICAgICAgICAgIHN0YXRlLnNldExpbmVXaWR0aCggbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRo
ICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7CisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVy
LnNldE1vZGUoIF9nbC5MSU5FUyApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAg
ICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBvYmplY3QuZHJhd01vZGUgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGNhc2UgVHJpYW5nbGVzRHJhd01vZGU6CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFUyApOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNl
IFRyaWFuZ2xlU3RyaXBEcmF3TW9kZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5k
ZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVfU1RSSVAgKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmlhbmdsZUZh
bkRyYXdNb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldE1vZGUo
IF9nbC5UUklBTkdMRV9GQU4gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK
KworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAg
ICAgICAgfSBlbHNlIGlmICggb2JqZWN0LmlzTGluZSApIHsKKworICAgICAgICAgICAgICAgIHZh
ciBsaW5lV2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGg7CisKKyAgICAgICAgICAgICAgICBpZiAo
IGxpbmVXaWR0aCA9PT0gdW5kZWZpbmVkICkgbGluZVdpZHRoID0gMTsgLy8gTm90IHVzaW5nIExp
bmUqTWF0ZXJpYWwKKworICAgICAgICAgICAgICAgIHN0YXRlLnNldExpbmVXaWR0aCggbGluZVdp
ZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIG9i
amVjdC5pc0xpbmVTZWdtZW50cyApIHsKKworICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5z
ZXRNb2RlKCBfZ2wuTElORVMgKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIG9iamVj
dC5pc0xpbmVMb29wICkgeworCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldE1vZGUo
IF9nbC5MSU5FX0xPT1AgKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgcmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVfU1RSSVAgKTsKKworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmICggb2JqZWN0LmlzUG9pbnRzICkg
eworCisgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0TW9kZSggX2dsLlBPSU5UUyApOworCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNJ
bnN0YW5jZWRCdWZmZXJHZW9tZXRyeSApIHsKKworICAgICAgICAgICAgICAgIGlmICggZ2VvbWV0
cnkubWF4SW5zdGFuY2VkQ291bnQgPiAwICkgeworCisgICAgICAgICAgICAgICAgICAgIHJlbmRl
cmVyLnJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIGRyYXdTdGFydCwgZHJhd0NvdW50ICk7CisK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAg
ICAgICByZW5kZXJlci5yZW5kZXIoIGRyYXdTdGFydCwgZHJhd0NvdW50ICk7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICB9OworCisgICAgICAgIGZ1bmN0aW9uIHNldHVwVmVydGV4QXR0cmli
dXRlcyggbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5LCBzdGFydEluZGV4ICkgeworCisgICAg
ICAgICAgICBpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0
cnkgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5z
dGFuY2VkX2FycmF5cycgKSA9PT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgICAgICBjb25z
b2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5zZXR1cFZlcnRleEF0dHJpYnV0ZXM6IHVz
aW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBz
dXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTsKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmICggc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkICkgc3RhcnRJbmRleCA9
IDA7CisKKyAgICAgICAgICAgIHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgICAg
IHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOworCisgICAgICAg
ICAgICB2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTsKKwor
ICAgICAgICAgICAgdmFyIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IG1hdGVyaWFs
LmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7CisKKyAgICAgICAgICAgIGZvciAoIHZhciBuYW1lIGlu
IHByb2dyYW1BdHRyaWJ1dGVzICkgeworCisgICAgICAgICAgICAgICAgdmFyIHByb2dyYW1BdHRy
aWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdOworCisgICAgICAgICAgICAgICAgaWYg
KCBwcm9ncmFtQXR0cmlidXRlID49IDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdl
b21ldHJ5QXR0cmlidXRlID0gZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF07CisKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCBnZW9tZXRyeUF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgeworCisg
ICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZCA9IGdlb21ldHJ5QXR0cmlidXRl
Lm5vcm1hbGl6ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IGdlb21ldHJ5
QXR0cmlidXRlLml0ZW1TaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmli
dXRlID0gYXR0cmlidXRlcy5nZXQoIGdlb21ldHJ5QXR0cmlidXRlICk7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHZhciBidWZmZXIgPSBhdHRyaWJ1dGUuYnVmZmVyOworICAgICAgICAgICAg
ICAgICAgICAgICAgdmFyIHR5cGUgPSBhdHRyaWJ1dGUudHlwZTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHZhciBieXRlc1BlckVsZW1lbnQgPSBhdHRyaWJ1dGUuYnl0ZXNQZXJFbGVtZW50Owor
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGdlb21ldHJ5QXR0cmlidXRlLmlzSW50ZXJs
ZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2
YXIgZGF0YSA9IGdlb21ldHJ5QXR0cmlidXRlLmRhdGE7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdmFyIHN0cmlkZSA9IGRhdGEuc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHZhciBvZmZzZXQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5vZmZzZXQ7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoIGRhdGEgJiYgZGF0YS5pc0luc3RhbmNlZEludGVybGVhdmVk
QnVmZmVyICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVuYWJs
ZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIGRhdGEubWVzaFBlckF0dHJp
YnV0ZSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZ2VvbWV0cnku
bWF4SW5zdGFuY2VkQ291bnQgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPSBkYXRhLm1lc2hQ
ZXJBdHRyaWJ1dGUgKiBkYXRhLmNvdW50OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0
cmlidXRlICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVy
ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dsLnZlcnRleEF0dHJpYlBvaW50ZXIo
IHByb2dyYW1BdHRyaWJ1dGUsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSAqIGJ5dGVz
UGVyRWxlbWVudCwgKCBzdGFydEluZGV4ICogc3RyaWRlICsgb2Zmc2V0ICkgKiBieXRlc1BlckVs
ZW1lbnQgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnN0YW5jZWRCdWZm
ZXJBdHRyaWJ1dGUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUu
ZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSwgZ2VvbWV0cnlBdHRy
aWJ1dGUubWVzaFBlckF0dHJpYnV0ZSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPT09IHVuZGVmaW5lZCApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkubWF4SW5zdGFuY2Vk
Q291bnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICogZ2VvbWV0cnlBdHRy
aWJ1dGUuY291bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGUgKTsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJp
YnV0ZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgMCwgc3RhcnRJbmRleCAqIHNpemUgKiBieXRl
c1BlckVsZW1lbnQgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAoIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyAhPT0g
dW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBtYXRl
cmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbIG5hbWUgXTsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3dpdGNoICggdmFsdWUubGVuZ3RoICkgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IF9nbC52ZXJ0ZXhBdHRyaWIyZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBfZ2wudmVydGV4QXR0cmliM2Z2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgX2dsLnZlcnRleEF0dHJpYjRmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBfZ2wudmVydGV4QXR0cmliMWZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApOworCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7CisK
KyAgICAgICAgfQorCisgICAgICAgIC8vIENvbXBpbGUKKworICAgICAgICB0aGlzLmNvbXBpbGUg
PSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7CisKKyAgICAgICAgICAgIGxpZ2h0cyA9IFtd
OworCisgICAgICAgICAgICBzY2VuZS50cmF2ZXJzZSggZnVuY3Rpb24gKCBvYmplY3QgKSB7CisK
KyAgICAgICAgICAgICAgICBpZiAoIG9iamVjdC5pc0xpZ2h0ICkgeworCisgICAgICAgICAgICAg
ICAgICAgIGxpZ2h0cy5wdXNoKCBvYmplY3QgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgfSApOworCisgICAgICAgICAgICBzZXR1cExpZ2h0cyggbGlnaHRzLCBjYW1lcmEg
KTsKKworICAgICAgICAgICAgc2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkgewor
CisgICAgICAgICAgICAgICAgaWYgKCBvYmplY3QubWF0ZXJpYWwgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KCBvYmplY3QubWF0ZXJpYWwgKSApIHsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0Lm1hdGVyaWFs
Lmxlbmd0aDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRNYXRl
cmlhbCggb2JqZWN0Lm1hdGVyaWFsWyBpIF0sIHNjZW5lLmZvZywgb2JqZWN0ICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisg
ICAgICAgICAgICAgICAgICAgICAgICBpbml0TWF0ZXJpYWwoIG9iamVjdC5tYXRlcmlhbCwgc2Nl
bmUuZm9nLCBvYmplY3QgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIH0gKTsKKworICAgICAgICB9OworCisgICAgICAgIC8vIFJl
bmRlcmluZworCisgICAgICAgIHRoaXMuYW5pbWF0ZSA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7
CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIG9uRnJhbWUoKSB7CisKKyAgICAgICAgICAgICAgICBj
YWxsYmFjaygpOworCisgICAgICAgICAgICAgICAgKCB2ci5nZXREZXZpY2UoKSB8fCB3aW5kb3cg
KS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIG9uRnJhbWUgKTsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAoIHZyLmdldERldmljZSgpIHx8IHdpbmRvdyApLnJlcXVlc3RBbmltYXRpb25G
cmFtZSggb25GcmFtZSApOworCisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5yZW5kZXIgPSBm
dW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCwgZm9yY2VDbGVhciApIHsKKwor
ICAgICAgICAgICAgaWYgKCAhICggY2FtZXJhICYmIGNhbWVyYS5pc0NhbWVyYSApICkgeworCisg
ICAgICAgICAgICAgICAgY29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVy
OiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4nICk7CisgICAgICAg
ICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlc2V0
IGNhY2hpbmcgZm9yIHRoaXMgZnJhbWUKKworICAgICAgICAgICAgX2N1cnJlbnRHZW9tZXRyeVBy
b2dyYW0gPSAnJzsKKyAgICAgICAgICAgIF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMTsKKyAgICAg
ICAgICAgIF9jdXJyZW50Q2FtZXJhID0gbnVsbDsKKworICAgICAgICAgICAgLy8gdXBkYXRlIHNj
ZW5lIGdyYXBoCisKKyAgICAgICAgICAgIGlmICggc2NlbmUuYXV0b1VwZGF0ZSA9PT0gdHJ1ZSAp
IHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7CisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBjYW1l
cmEgbWF0cmljZXMgYW5kIGZydXN0dW0KKworICAgICAgICAgICAgaWYgKCBjYW1lcmEucGFyZW50
ID09PSBudWxsICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7CisKKyAgICAgICAgICAgIGlm
ICggdnIuZW5hYmxlZCApIHsKKworICAgICAgICAgICAgICAgIGNhbWVyYSA9IHZyLmdldENhbWVy
YSggY2FtZXJhICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX3Byb2pTY3JlZW5N
YXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIGNhbWVyYS5t
YXRyaXhXb3JsZEludmVyc2UgKTsKKyAgICAgICAgICAgIF9mcnVzdHVtLnNldEZyb21NYXRyaXgo
IF9wcm9qU2NyZWVuTWF0cml4ICk7CisKKyAgICAgICAgICAgIGxpZ2h0cy5sZW5ndGggPSAwOwor
ICAgICAgICAgICAgc3ByaXRlcy5sZW5ndGggPSAwOworICAgICAgICAgICAgbGVuc0ZsYXJlcy5s
ZW5ndGggPSAwOworCisgICAgICAgICAgICBfbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSB0aGlzLmxv
Y2FsQ2xpcHBpbmdFbmFibGVkOworICAgICAgICAgICAgX2NsaXBwaW5nRW5hYmxlZCA9IF9jbGlw
cGluZy5pbml0KCB0aGlzLmNsaXBwaW5nUGxhbmVzLCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQsIGNh
bWVyYSApOworCisgICAgICAgICAgICBjdXJyZW50UmVuZGVyTGlzdCA9IHJlbmRlckxpc3RzLmdl
dCggc2NlbmUsIGNhbWVyYSApOworICAgICAgICAgICAgY3VycmVudFJlbmRlckxpc3QuaW5pdCgp
OworCisgICAgICAgICAgICBwcm9qZWN0T2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBfdGhpcy5zb3J0
T2JqZWN0cyApOworCisgICAgICAgICAgICBjdXJyZW50UmVuZGVyTGlzdC5maW5pc2goKTsKKwor
ICAgICAgICAgICAgaWYgKCBfdGhpcy5zb3J0T2JqZWN0cyA9PT0gdHJ1ZSApIHsKKworICAgICAg
ICAgICAgICAgIGN1cnJlbnRSZW5kZXJMaXN0LnNvcnQoKTsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAvLworCisgICAgICAgICAgICBpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSBfY2xp
cHBpbmcuYmVnaW5TaGFkb3dzKCk7CisKKyAgICAgICAgICAgIHNldHVwU2hhZG93cyggbGlnaHRz
ICk7CisKKyAgICAgICAgICAgIHNoYWRvd01hcC5yZW5kZXIoIHNjZW5lLCBjYW1lcmEgKTsKKwor
ICAgICAgICAgICAgc2V0dXBMaWdodHMoIGxpZ2h0cywgY2FtZXJhICk7CisKKyAgICAgICAgICAg
IGlmICggX2NsaXBwaW5nRW5hYmxlZCApIF9jbGlwcGluZy5lbmRTaGFkb3dzKCk7CisKKyAgICAg
ICAgICAgIC8vCisKKyAgICAgICAgICAgIF9pbmZvUmVuZGVyLmZyYW1lICsrOworICAgICAgICAg
ICAgX2luZm9SZW5kZXIuY2FsbHMgPSAwOworICAgICAgICAgICAgX2luZm9SZW5kZXIudmVydGlj
ZXMgPSAwOworICAgICAgICAgICAgX2luZm9SZW5kZXIuZmFjZXMgPSAwOworICAgICAgICAgICAg
X2luZm9SZW5kZXIucG9pbnRzID0gMDsKKworICAgICAgICAgICAgaWYgKCByZW5kZXJUYXJnZXQg
PT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIHJlbmRlclRhcmdldCA9IG51bGw7
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJl
bmRlclRhcmdldCApOworCisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBiYWNrZ3JvdW5k
LnJlbmRlciggc2NlbmUsIGNhbWVyYSwgZm9yY2VDbGVhciApOworCisgICAgICAgICAgICAvLyBy
ZW5kZXIgc2NlbmUKKworICAgICAgICAgICAgdmFyIG9wYXF1ZU9iamVjdHMgPSBjdXJyZW50UmVu
ZGVyTGlzdC5vcGFxdWU7CisgICAgICAgICAgICB2YXIgdHJhbnNwYXJlbnRPYmplY3RzID0gY3Vy
cmVudFJlbmRlckxpc3QudHJhbnNwYXJlbnQ7CisKKyAgICAgICAgICAgIGlmICggc2NlbmUub3Zl
cnJpZGVNYXRlcmlhbCApIHsKKworICAgICAgICAgICAgICAgIHZhciBvdmVycmlkZU1hdGVyaWFs
ID0gc2NlbmUub3ZlcnJpZGVNYXRlcmlhbDsKKworICAgICAgICAgICAgICAgIGlmICggb3BhcXVl
T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2Ft
ZXJhLCBvdmVycmlkZU1hdGVyaWFsICk7CisgICAgICAgICAgICAgICAgaWYgKCB0cmFuc3BhcmVu
dE9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2Vu
ZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisK
KyAgICAgICAgICAgICAgICAvLyBvcGFxdWUgcGFzcyAoZnJvbnQtdG8tYmFjayBvcmRlcikKKwor
ICAgICAgICAgICAgICAgIGlmICggb3BhcXVlT2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3Rz
KCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7CisKKyAgICAgICAgICAgICAgICAvLyB0
cmFuc3BhcmVudCBwYXNzIChiYWNrLXRvLWZyb250IG9yZGVyKQorCisgICAgICAgICAgICAgICAg
aWYgKCB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJl
bnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgLy8gY3VzdG9tIHJlbmRlciBwbHVnaW5zIChwb3N0IHBhc3MpCisKKyAgICAgICAgICAgIHNw
cml0ZVBsdWdpbi5yZW5kZXIoIHNjZW5lLCBjYW1lcmEgKTsKKyAgICAgICAgICAgIGxlbnNGbGFy
ZVBsdWdpbi5yZW5kZXIoIHNjZW5lLCBjYW1lcmEsIF9jdXJyZW50Vmlld3BvcnQgKTsKKworICAg
ICAgICAgICAgLy8gR2VuZXJhdGUgbWlwbWFwIGlmIHdlJ3JlIHVzaW5nIGFueSBraW5kIG9mIG1p
cG1hcCBmaWx0ZXJpbmcKKworICAgICAgICAgICAgaWYgKCByZW5kZXJUYXJnZXQgKSB7CisKKyAg
ICAgICAgICAgICAgICB0ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoIHJlbmRlclRh
cmdldCApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVuc3VyZSBkZXB0aCBi
dWZmZXIgd3JpdGluZyBpcyBlbmFibGVkIHNvIGl0IGNhbiBiZSBjbGVhcmVkIG9uIG5leHQgcmVu
ZGVyCisKKyAgICAgICAgICAgIHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApOwor
ICAgICAgICAgICAgc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCB0cnVlICk7CisgICAgICAg
ICAgICBzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIHRydWUgKTsKKworICAgICAgICAgICAg
aWYgKCBjYW1lcmEuaXNBcnJheUNhbWVyYSApIHsKKworICAgICAgICAgICAgICAgIF90aGlzLnNl
dFNjaXNzb3JUZXN0KCBmYWxzZSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlm
ICggdnIuZW5hYmxlZCApIHsKKworICAgICAgICAgICAgICAgIHZyLnN1Ym1pdEZyYW1lKCk7CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gX2dsLmZpbmlzaCgpOworCisgICAgICAg
IH07CisKKyAgICAgICAgLyoKKyAgICAgICAgLy8gVE9ETyBEdXBsaWNhdGVkIGNvZGUgKEZydXN0
dW0pCisKKyAgICAgICAgdmFyIF9zcGhlcmUgPSBuZXcgU3BoZXJlKCk7CisKKyAgICAgICAgZnVu
Y3Rpb24gaXNPYmplY3RWaWV3YWJsZSggb2JqZWN0ICkgeworCisgICAgICAgICAgICB2YXIgZ2Vv
bWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CisKKyAgICAgICAgICAgIGlmICggZ2VvbWV0cnkuYm91
bmRpbmdTcGhlcmUgPT09IG51bGwgKQorICAgICAgICAgICAgICAgIGdlb21ldHJ5LmNvbXB1dGVC
b3VuZGluZ1NwaGVyZSgpOworCisgICAgICAgICAgICBfc3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJv
dW5kaW5nU3BoZXJlICkuCisgICAgICAgICAgICBhcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhX
b3JsZCApOworCisgICAgICAgICAgICByZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSAp
OworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBpc1Nwcml0ZVZpZXdhYmxlKCBzcHJp
dGUgKSB7CisKKyAgICAgICAgICAgIF9zcGhlcmUuY2VudGVyLnNldCggMCwgMCwgMCApOworICAg
ICAgICAgICAgX3NwaGVyZS5yYWRpdXMgPSAwLjcwNzEwNjc4MTE4NjU0NzY7CisgICAgICAgICAg
ICBfc3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7CisKKyAgICAgICAg
ICAgIHJldHVybiBpc1NwaGVyZVZpZXdhYmxlKCBfc3BoZXJlICk7CisKKyAgICAgICAgfQorCisg
ICAgICAgIGZ1bmN0aW9uIGlzU3BoZXJlVmlld2FibGUoIHNwaGVyZSApIHsKKworICAgICAgICAg
ICAgaWYgKCAhIF9mcnVzdHVtLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApICkgcmV0dXJuIGZh
bHNlOworCisgICAgICAgICAgICB2YXIgbnVtUGxhbmVzID0gX2NsaXBwaW5nLm51bVBsYW5lczsK
KworICAgICAgICAgICAgaWYgKCBudW1QbGFuZXMgPT09IDAgKSByZXR1cm4gdHJ1ZTsKKworICAg
ICAgICAgICAgdmFyIHBsYW5lcyA9IF90aGlzLmNsaXBwaW5nUGxhbmVzLAorCisgICAgICAgICAg
ICAgICAgY2VudGVyID0gc3BoZXJlLmNlbnRlciwKKyAgICAgICAgICAgICAgICBuZWdSYWQgPSAt
IHNwaGVyZS5yYWRpdXMsCisgICAgICAgICAgICAgICAgaSA9IDA7CisKKyAgICAgICAgICAgIGRv
IHsKKworICAgICAgICAgICAgICAgIC8vIG91dCB3aGVuIGRlZXBlciB0aGFuIHJhZGl1cyBpbiB0
aGUgbmVnYXRpdmUgaGFsZnNwYWNlCisgICAgICAgICAgICAgICAgaWYgKCBwbGFuZXNbIGkgXS5k
aXN0YW5jZVRvUG9pbnQoIGNlbnRlciApIDwgbmVnUmFkICkgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgICAgICB9IHdoaWxlICggKysgaSAhPT0gbnVtUGxhbmVzICk7CisKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworCisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICBmdW5jdGlvbiBw
cm9qZWN0T2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc29ydE9iamVjdHMgKSB7CisKKyAgICAgICAg
ICAgIGlmICggISBvYmplY3QudmlzaWJsZSApIHJldHVybjsKKworICAgICAgICAgICAgdmFyIHZp
c2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTsKKworICAgICAgICAg
ICAgaWYgKCB2aXNpYmxlICkgeworCisgICAgICAgICAgICAgICAgaWYgKCBvYmplY3QuaXNMaWdo
dCApIHsKKworICAgICAgICAgICAgICAgICAgICBsaWdodHMucHVzaCggb2JqZWN0ICk7CisKKyAg
ICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBvYmplY3QuaXNTcHJpdGUgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVy
c2VjdHNTcHJpdGUoIG9iamVjdCApICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBzcHJp
dGVzLnB1c2goIG9iamVjdCApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIH0gZWxzZSBpZiAoIG9iamVjdC5pc0xlbnNGbGFyZSApIHsKKworICAgICAgICAgICAg
ICAgICAgICBsZW5zRmxhcmVzLnB1c2goIG9iamVjdCApOworCisgICAgICAgICAgICAgICAgfSBl
bHNlIGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkgeworCisgICAgICAgICAg
ICAgICAgICAgIGlmICggc29ydE9iamVjdHMgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkICkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJp
eCApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjdXJy
ZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIG51bGwsIG9iamVjdC5tYXRlcmlhbCwgX3ZlY3Rv
cjMueiwgbnVsbCApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggb2JqZWN0LmlzTWVz
aCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApIHsKKworICAgICAgICAgICAg
ICAgICAgICBpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICkgeworCisgICAgICAgICAgICAgICAg
ICAgICAgICBvYmplY3Quc2tlbGV0b24udXBkYXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgICAgIGlmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBf
ZnJ1c3R1bS5pbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSApIHsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCBzb3J0T2JqZWN0cyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkICkK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGx5TWF0cml4NCggX3Byb2pTY3Jl
ZW5NYXRyaXggKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBvYmplY3RzLnVwZGF0ZSggb2JqZWN0ICk7CisgICAg
ICAgICAgICAgICAgICAgICAgICB2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91
cHM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBn
cm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRl
eCBdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZ3JvdXBNYXRlcmlh
bCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIGdy
b3VwTWF0ZXJpYWwsIF92ZWN0b3IzLnosIGdyb3VwICk7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBtYXRlcmlhbC52aXNpYmxlICkgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBn
ZW9tZXRyeSwgbWF0ZXJpYWwsIF92ZWN0b3IzLnosIG51bGwgKTsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hp
bGRyZW47CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0
aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICBwcm9qZWN0T2JqZWN0KCBjaGls
ZHJlblsgaSBdLCBjYW1lcmEsIHNvcnRPYmplY3RzICk7CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gcmVuZGVyT2JqZWN0cyggcmVuZGVyTGlzdCwgc2Nl
bmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApIHsKKworICAgICAgICAgICAgZm9yICggdmFy
IGkgPSAwLCBsID0gcmVuZGVyTGlzdC5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisgICAgICAg
ICAgICAgICAgdmFyIHJlbmRlckl0ZW0gPSByZW5kZXJMaXN0WyBpIF07CisKKyAgICAgICAgICAg
ICAgICB2YXIgb2JqZWN0ID0gcmVuZGVySXRlbS5vYmplY3Q7CisgICAgICAgICAgICAgICAgdmFy
IGdlb21ldHJ5ID0gcmVuZGVySXRlbS5nZW9tZXRyeTsKKyAgICAgICAgICAgICAgICB2YXIgbWF0
ZXJpYWwgPSBvdmVycmlkZU1hdGVyaWFsID09PSB1bmRlZmluZWQgPyByZW5kZXJJdGVtLm1hdGVy
aWFsIDogb3ZlcnJpZGVNYXRlcmlhbDsKKyAgICAgICAgICAgICAgICB2YXIgZ3JvdXAgPSByZW5k
ZXJJdGVtLmdyb3VwOworCisgICAgICAgICAgICAgICAgaWYgKCBjYW1lcmEuaXNBcnJheUNhbWVy
YSApIHsKKworICAgICAgICAgICAgICAgICAgICBfY3VycmVudEFycmF5Q2FtZXJhID0gY2FtZXJh
OworCisgICAgICAgICAgICAgICAgICAgIHZhciBjYW1lcmFzID0gY2FtZXJhLmNhbWVyYXM7CisK
KyAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGogPSAwLCBqbCA9IGNhbWVyYXMubGVuZ3Ro
OyBqIDwgamw7IGogKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYW1lcmEy
ID0gY2FtZXJhc1sgaiBdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG9iamVjdC5s
YXllcnMudGVzdCggY2FtZXJhMi5sYXllcnMgKSApIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHZhciBib3VuZHMgPSBjYW1lcmEyLmJvdW5kczsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHZhciB4ID0gYm91bmRzLnggKiBfd2lkdGg7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdmFyIHkgPSBib3VuZHMueSAqIF9oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdmFyIHdpZHRoID0gYm91bmRzLnogKiBfd2lkdGg7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdmFyIGhlaWdodCA9IGJvdW5kcy53ICogX2hlaWdodDsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIF90aGlzLnNldFZpZXdwb3J0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0
ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2V0U2Npc3NvciggeCwgeSwg
d2lkdGgsIGhlaWdodCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNldFNj
aXNzb3JUZXN0KCB0cnVlICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJP
YmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYTIsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAg
KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgX2N1cnJl
bnRBcnJheUNhbWVyYSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyT2JqZWN0
KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTsKKwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAg
ICBmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnks
IG1hdGVyaWFsLCBncm91cCApIHsKKworICAgICAgICAgICAgb2JqZWN0Lm1vZGVsVmlld01hdHJp
eC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0
cml4V29ybGQgKTsKKyAgICAgICAgICAgIG9iamVjdC5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0
cml4KCBvYmplY3QubW9kZWxWaWV3TWF0cml4ICk7CisKKyAgICAgICAgICAgIG9iamVjdC5vbkJl
Zm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3Jv
dXAgKTsKKworICAgICAgICAgICAgaWYgKCBvYmplY3QuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3Qg
KSB7CisKKyAgICAgICAgICAgICAgICBzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwgKTsKKwor
ICAgICAgICAgICAgICAgIHZhciBwcm9ncmFtID0gc2V0UHJvZ3JhbSggY2FtZXJhLCBzY2VuZS5m
b2csIG1hdGVyaWFsLCBvYmplY3QgKTsKKworICAgICAgICAgICAgICAgIF9jdXJyZW50R2VvbWV0
cnlQcm9ncmFtID0gJyc7CisKKyAgICAgICAgICAgICAgICByZW5kZXJPYmplY3RJbW1lZGlhdGUo
IG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKwor
ICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBzY2VuZS5m
b2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIG9iamVjdC5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVy
YSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApOworCisgICAgICAgIH0KKworICAgICAgICBm
dW5jdGlvbiBpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmb2csIG9iamVjdCApIHsKKworICAgICAg
ICAgICAgdmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCAp
OworCisgICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IHByb2dyYW1DYWNoZS5nZXRQYXJhbWV0
ZXJzKAorICAgICAgICAgICAgICAgIG1hdGVyaWFsLCBfbGlnaHRzLCBmb2csIF9jbGlwcGluZy5u
dW1QbGFuZXMsIF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb24sIG9iamVjdCApOworCisgICAgICAg
ICAgICB2YXIgY29kZSA9IHByb2dyYW1DYWNoZS5nZXRQcm9ncmFtQ29kZSggbWF0ZXJpYWwsIHBh
cmFtZXRlcnMgKTsKKworICAgICAgICAgICAgdmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRp
ZXMucHJvZ3JhbTsKKyAgICAgICAgICAgIHZhciBwcm9ncmFtQ2hhbmdlID0gdHJ1ZTsKKworICAg
ICAgICAgICAgaWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAg
ICAvLyBuZXcgbWF0ZXJpYWwKKyAgICAgICAgICAgICAgICBtYXRlcmlhbC5hZGRFdmVudExpc3Rl
bmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7CisKKyAgICAgICAgICAgIH0gZWxz
ZSBpZiAoIHByb2dyYW0uY29kZSAhPT0gY29kZSApIHsKKworICAgICAgICAgICAgICAgIC8vIGNo
YW5nZWQgZ2xzbCBvciBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgcmVsZWFzZU1hdGVyaWFs
UHJvZ3JhbVJlZmVyZW5jZSggbWF0ZXJpYWwgKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmICgg
cGFyYW1ldGVycy5zaGFkZXJJRCAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAg
Ly8gc2FtZSBnbHNsIGFuZCB1bmlmb3JtIGxpc3QKKyAgICAgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvLyBvbmx5IHJlYnVpbGQg
dW5pZm9ybSBsaXN0CisgICAgICAgICAgICAgICAgcHJvZ3JhbUNoYW5nZSA9IGZhbHNlOworCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggcHJvZ3JhbUNoYW5nZSApIHsKKworICAg
ICAgICAgICAgICAgIGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHsKKworICAgICAgICAgICAg
ICAgICAgICB2YXIgc2hhZGVyID0gU2hhZGVyTGliWyBwYXJhbWV0ZXJzLnNoYWRlcklEIF07CisK
KyAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciA9IHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hdGVyaWFsLnR5cGUsCisgICAgICAgICAgICAgICAg
ICAgICAgICB1bmlmb3JtczogVW5pZm9ybXNVdGlscy5jbG9uZSggc2hhZGVyLnVuaWZvcm1zICks
CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhTaGFkZXI6IHNoYWRlci52ZXJ0ZXhTaGFk
ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudFNoYWRlcjogc2hhZGVyLmZyYWdt
ZW50U2hhZGVyCisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICB9IGVs
c2UgeworCisgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIgPSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBtYXRlcmlhbC50eXBlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgdW5pZm9ybXM6IG1hdGVyaWFsLnVuaWZvcm1zLAorICAgICAgICAgICAg
ICAgICAgICAgICAgdmVydGV4U2hhZGVyOiBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIsCisgICAgICAg
ICAgICAgICAgICAgICAgICBmcmFnbWVudFNoYWRlcjogbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIK
KyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIG1hdGVyaWFsLm9uQmVmb3JlQ29tcGlsZSggbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRl
ciApOworCisgICAgICAgICAgICAgICAgcHJvZ3JhbSA9IHByb2dyYW1DYWNoZS5hY3F1aXJlUHJv
Z3JhbSggbWF0ZXJpYWwsIG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIsIHBhcmFtZXRlcnMsIGNv
ZGUgKTsKKworICAgICAgICAgICAgICAgIG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtID0gcHJv
Z3JhbTsKKyAgICAgICAgICAgICAgICBtYXRlcmlhbC5wcm9ncmFtID0gcHJvZ3JhbTsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFt
LmdldEF0dHJpYnV0ZXMoKTsKKworICAgICAgICAgICAgaWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdl
dHMgKSB7CisKKyAgICAgICAgICAgICAgICBtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdl
dHMgPSAwOworCisgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgX3RoaXMubWF4
TW9ycGhUYXJnZXRzOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIGlmICggcHJvZ3Jh
bUF0dHJpYnV0ZXNbICdtb3JwaFRhcmdldCcgKyBpIF0gPj0gMCApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgbWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzICsrOworCisgICAg
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBpZiAoIG1hdGVyaWFsLm1vcnBoTm9ybWFscyApIHsKKworICAgICAgICAg
ICAgICAgIG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyA9IDA7CisKKyAgICAgICAg
ICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBfdGhpcy5tYXhNb3JwaE5vcm1hbHM7IGkgKysg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwcm9ncmFtQXR0cmlidXRlc1sgJ21vcnBo
Tm9ybWFsJyArIGkgXSA+PSAwICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlh
bC5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMgKys7CisKKyAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB1
bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIudW5pZm9ybXM7CisKKyAgICAgICAg
ICAgIGlmICggISBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmCisgICAgICAgICAgICAgICAg
ISBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsIHx8CisgICAgICAgICAgICAgICAgbWF0ZXJp
YWwuY2xpcHBpbmcgPT09IHRydWUgKSB7CisKKyAgICAgICAgICAgICAgICBtYXRlcmlhbFByb3Bl
cnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgPSBfY2xpcHBpbmcubnVtUGxhbmVzOworICAgICAgICAg
ICAgICAgIG1hdGVyaWFsUHJvcGVydGllcy5udW1JbnRlcnNlY3Rpb24gPSBfY2xpcHBpbmcubnVt
SW50ZXJzZWN0aW9uOworICAgICAgICAgICAgICAgIHVuaWZvcm1zLmNsaXBwaW5nUGxhbmVzID0g
X2NsaXBwaW5nLnVuaWZvcm07CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWF0ZXJp
YWxQcm9wZXJ0aWVzLmZvZyA9IGZvZzsKKworICAgICAgICAgICAgLy8gc3RvcmUgdGhlIGxpZ2h0
IHNldHVwIGl0IHdhcyBjcmVhdGVkIGZvcgorCisgICAgICAgICAgICBtYXRlcmlhbFByb3BlcnRp
ZXMubGlnaHRzSGFzaCA9IF9saWdodHMuaGFzaDsKKworICAgICAgICAgICAgaWYgKCBtYXRlcmlh
bC5saWdodHMgKSB7CisKKyAgICAgICAgICAgICAgICAvLyB3aXJlIHVwIHRoZSBtYXRlcmlhbCB0
byB0aGlzIHJlbmRlcmVyJ3MgbGlnaHRpbmcgc3RhdGUKKworICAgICAgICAgICAgICAgIHVuaWZv
cm1zLmFtYmllbnRMaWdodENvbG9yLnZhbHVlID0gX2xpZ2h0cy5hbWJpZW50OworICAgICAgICAg
ICAgICAgIHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlID0gX2xpZ2h0cy5kaXJlY3Rp
b25hbDsKKyAgICAgICAgICAgICAgICB1bmlmb3Jtcy5zcG90TGlnaHRzLnZhbHVlID0gX2xpZ2h0
cy5zcG90OworICAgICAgICAgICAgICAgIHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLnZhbHVlID0g
X2xpZ2h0cy5yZWN0QXJlYTsKKyAgICAgICAgICAgICAgICB1bmlmb3Jtcy5wb2ludExpZ2h0cy52
YWx1ZSA9IF9saWdodHMucG9pbnQ7CisgICAgICAgICAgICAgICAgdW5pZm9ybXMuaGVtaXNwaGVy
ZUxpZ2h0cy52YWx1ZSA9IF9saWdodHMuaGVtaTsKKworICAgICAgICAgICAgICAgIHVuaWZvcm1z
LmRpcmVjdGlvbmFsU2hhZG93TWFwLnZhbHVlID0gX2xpZ2h0cy5kaXJlY3Rpb25hbFNoYWRvd01h
cDsKKyAgICAgICAgICAgICAgICB1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1
ZSA9IF9saWdodHMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg7CisgICAgICAgICAgICAgICAgdW5p
Zm9ybXMuc3BvdFNoYWRvd01hcC52YWx1ZSA9IF9saWdodHMuc3BvdFNoYWRvd01hcDsKKyAgICAg
ICAgICAgICAgICB1bmlmb3Jtcy5zcG90U2hhZG93TWF0cml4LnZhbHVlID0gX2xpZ2h0cy5zcG90
U2hhZG93TWF0cml4OworICAgICAgICAgICAgICAgIHVuaWZvcm1zLnBvaW50U2hhZG93TWFwLnZh
bHVlID0gX2xpZ2h0cy5wb2ludFNoYWRvd01hcDsKKyAgICAgICAgICAgICAgICB1bmlmb3Jtcy5w
b2ludFNoYWRvd01hdHJpeC52YWx1ZSA9IF9saWdodHMucG9pbnRTaGFkb3dNYXRyaXg7CisgICAg
ICAgICAgICAgICAgLy8gVE9ETyAoYWJlbG5hdGlvbik6IGFkZCBhcmVhIGxpZ2h0cyBzaGFkb3cg
aW5mbyB0byB1bmlmb3JtcworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBwcm9n
VW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbS5nZXRVbmlmb3JtcygpLAorICAg
ICAgICAgICAgICAgIHVuaWZvcm1zTGlzdCA9CisgICAgICAgICAgICAgICAgICAgIFdlYkdMVW5p
Zm9ybXMuc2VxV2l0aFZhbHVlKCBwcm9nVW5pZm9ybXMuc2VxLCB1bmlmb3JtcyApOworCisgICAg
ICAgICAgICBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0ID0gdW5pZm9ybXNMaXN0Owor
CisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBzZXRQcm9ncmFtKCBjYW1lcmEsIGZvZywg
bWF0ZXJpYWwsIG9iamVjdCApIHsKKworICAgICAgICAgICAgX3VzZWRUZXh0dXJlVW5pdHMgPSAw
OworCisgICAgICAgICAgICB2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQo
IG1hdGVyaWFsICk7CisKKyAgICAgICAgICAgIGlmICggX2NsaXBwaW5nRW5hYmxlZCApIHsKKwor
ICAgICAgICAgICAgICAgIGlmICggX2xvY2FsQ2xpcHBpbmdFbmFibGVkIHx8IGNhbWVyYSAhPT0g
X2N1cnJlbnRDYW1lcmEgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHVzZUNhY2hlID0K
KyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9PT0gX2N1cnJlbnRDYW1lcmEgJiYKKyAg
ICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLmlkID09PSBfY3VycmVudE1hdGVyaWFsSWQ7
CisKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgbWlnaHQgd2FudCB0byBjYWxsIHRoaXMgZnVu
Y3Rpb24gd2l0aCBzb21lIENsaXBwaW5nR3JvdXAKKyAgICAgICAgICAgICAgICAgICAgLy8gb2Jq
ZWN0IGluc3RlYWQgb2YgdGhlIG1hdGVyaWFsLCBvbmNlIGl0IGJlY29tZXMgZmVhc2libGUKKyAg
ICAgICAgICAgICAgICAgICAgLy8gKCM4NDY1LCAjODM3OSkKKyAgICAgICAgICAgICAgICAgICAg
X2NsaXBwaW5nLnNldFN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuY2xp
cHBpbmdQbGFuZXMsIG1hdGVyaWFsLmNsaXBJbnRlcnNlY3Rpb24sIG1hdGVyaWFsLmNsaXBTaGFk
b3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhLCBtYXRlcmlhbFByb3BlcnRpZXMs
IHVzZUNhY2hlICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgaWYgKCBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSB7CisKKyAgICAg
ICAgICAgICAgICBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtID09PSB1bmRlZmluZWQg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlOwor
CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggbWF0ZXJpYWwuZm9nICYmIG1hdGVyaWFsUHJv
cGVydGllcy5mb2cgIT09IGZvZyApIHsKKworICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5u
ZWVkc1VwZGF0ZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBtYXRlcmlh
bC5saWdodHMgJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c0hhc2ggIT09IF9saWdodHMuaGFz
aCApIHsKKworICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7
CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xp
cHBpbmdQbGFuZXMgIT09IHVuZGVmaW5lZCAmJgorICAgICAgICAgICAgICAgICAgICAoIG1hdGVy
aWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gX2NsaXBwaW5nLm51bVBsYW5lcyB8
fAorICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9u
ICE9PSBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uICkgKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgbWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggbWF0ZXJpYWwubmVlZHNVcGRhdGUgKSB7
CisKKyAgICAgICAgICAgICAgICBpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmb2csIG9iamVjdCAp
OworICAgICAgICAgICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gZmFsc2U7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJlZnJlc2hQcm9ncmFtID0gZmFsc2U7CisgICAg
ICAgICAgICB2YXIgcmVmcmVzaE1hdGVyaWFsID0gZmFsc2U7CisgICAgICAgICAgICB2YXIgcmVm
cmVzaExpZ2h0cyA9IGZhbHNlOworCisgICAgICAgICAgICB2YXIgcHJvZ3JhbSA9IG1hdGVyaWFs
UHJvcGVydGllcy5wcm9ncmFtLAorICAgICAgICAgICAgICAgIHBfdW5pZm9ybXMgPSBwcm9ncmFt
LmdldFVuaWZvcm1zKCksCisgICAgICAgICAgICAgICAgbV91bmlmb3JtcyA9IG1hdGVyaWFsUHJv
cGVydGllcy5zaGFkZXIudW5pZm9ybXM7CisKKyAgICAgICAgICAgIGlmICggcHJvZ3JhbS5pZCAh
PT0gX2N1cnJlbnRQcm9ncmFtICkgeworCisgICAgICAgICAgICAgICAgX2dsLnVzZVByb2dyYW0o
IHByb2dyYW0ucHJvZ3JhbSApOworICAgICAgICAgICAgICAgIF9jdXJyZW50UHJvZ3JhbSA9IHBy
b2dyYW0uaWQ7CisKKyAgICAgICAgICAgICAgICByZWZyZXNoUHJvZ3JhbSA9IHRydWU7CisgICAg
ICAgICAgICAgICAgcmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZWZy
ZXNoTGlnaHRzID0gdHJ1ZTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIG1h
dGVyaWFsLmlkICE9PSBfY3VycmVudE1hdGVyaWFsSWQgKSB7CisKKyAgICAgICAgICAgICAgICBf
Y3VycmVudE1hdGVyaWFsSWQgPSBtYXRlcmlhbC5pZDsKKworICAgICAgICAgICAgICAgIHJlZnJl
c2hNYXRlcmlhbCA9IHRydWU7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBy
ZWZyZXNoUHJvZ3JhbSB8fCBjYW1lcmEgIT09IF9jdXJyZW50Q2FtZXJhICkgeworCisgICAgICAg
ICAgICAgICAgcF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAncHJvamVjdGlvbk1hdHJpeCcsIGNh
bWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGNhcGFiaWxp
dGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkgeworCisgICAgICAgICAgICAgICAgICAgIHBf
dW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2xvZ0RlcHRoQnVmRkMnLAorICAgICAgICAgICAgICAg
ICAgICAgICAgMi4wIC8gKCBNYXRoLmxvZyggY2FtZXJhLmZhciArIDEuMCApIC8gTWF0aC5MTjIg
KSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQXZvaWQgdW5u
ZWVkZWQgdW5pZm9ybSB1cGRhdGVzIHBlciBBcnJheUNhbWVyYSdzIHN1Yi1jYW1lcmEKKworICAg
ICAgICAgICAgICAgIGlmICggX2N1cnJlbnRDYW1lcmEgIT09ICggX2N1cnJlbnRBcnJheUNhbWVy
YSB8fCBjYW1lcmEgKSApIHsKKworICAgICAgICAgICAgICAgICAgICBfY3VycmVudENhbWVyYSA9
ICggX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKTsKKworICAgICAgICAgICAgICAgICAg
ICAvLyBsaWdodGluZyB1bmlmb3JtcyBkZXBlbmQgb24gdGhlIGNhbWVyYSBzbyBlbmZvcmNlIGFu
IHVwZGF0ZQorICAgICAgICAgICAgICAgICAgICAvLyBub3csIGluIGNhc2UgdGhpcyBtYXRlcmlh
bCBzdXBwb3J0cyBsaWdodHMgLSBvciBsYXRlciwgd2hlbgorICAgICAgICAgICAgICAgICAgICAv
LyB0aGUgbmV4dCBtYXRlcmlhbCB0aGF0IGRvZXMgZ2V0cyBhY3RpdmF0ZWQ6CisKKyAgICAgICAg
ICAgICAgICAgICAgcmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTsgICAgIC8vIHNldCB0byB0cnVlIG9u
IG1hdGVyaWFsIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICByZWZyZXNoTGlnaHRzID0gdHJ1
ZTsgICAgICAgLy8gcmVtYWlucyBzZXQgdW50aWwgdXBkYXRlIGRvbmUKKworICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGxvYWQgbWF0ZXJpYWwgc3BlY2lmaWMgdW5pZm9y
bXMKKyAgICAgICAgICAgICAgICAvLyAoc2hhZGVyIG1hdGVyaWFsIGFsc28gZ2V0cyB0aGVtIGZv
ciB0aGUgc2FrZSBvZiBnZW5lcmljaXR5KQorCisgICAgICAgICAgICAgICAgaWYgKCBtYXRlcmlh
bC5pc1NoYWRlck1hdGVyaWFsIHx8CisgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLmlzTWVz
aFBob25nTWF0ZXJpYWwgfHwKKyAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuaXNNZXNoU3Rh
bmRhcmRNYXRlcmlhbCB8fAorICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5lbnZNYXAgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHVDYW1Qb3MgPSBwX3VuaWZvcm1zLm1hcC5jYW1l
cmFQb3NpdGlvbjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHVDYW1Qb3MgIT09IHVuZGVm
aW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdUNhbVBvcy5zZXRWYWx1ZSggX2ds
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3Np
dGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICkgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIG1hdGVyaWFsLmlzTWVz
aFBob25nTWF0ZXJpYWwgfHwKKyAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuaXNNZXNoTGFt
YmVydE1hdGVyaWFsIHx8CisgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLmlzTWVzaEJhc2lj
TWF0ZXJpYWwgfHwKKyAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRN
YXRlcmlhbCB8fAorICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFs
IHx8CisgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNraW5uaW5nICkgeworCisgICAgICAg
ICAgICAgICAgICAgIHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3ZpZXdNYXRyaXgnLCBjYW1l
cmEubWF0cml4V29ybGRJbnZlcnNlICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgLy8gc2tpbm5pbmcgdW5pZm9ybXMgbXVzdCBiZSBzZXQgZXZl
biBpZiBtYXRlcmlhbCBkaWRuJ3QgY2hhbmdlCisgICAgICAgICAgICAvLyBhdXRvLXNldHRpbmcg
b2YgdGV4dHVyZSB1bml0IGZvciBib25lIHRleHR1cmUgbXVzdCBnbyBiZWZvcmUgb3RoZXIgdGV4
dHVyZXMKKyAgICAgICAgICAgIC8vIG5vdCBzdXJlIHdoeSwgYnV0IG90aGVyd2lzZSB3ZWlyZCB0
aGluZ3MgaGFwcGVuCisKKyAgICAgICAgICAgIGlmICggbWF0ZXJpYWwuc2tpbm5pbmcgKSB7CisK
KyAgICAgICAgICAgICAgICBwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2Jp
bmRNYXRyaXgnICk7CisgICAgICAgICAgICAgICAgcF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2ds
LCBvYmplY3QsICdiaW5kTWF0cml4SW52ZXJzZScgKTsKKworICAgICAgICAgICAgICAgIHZhciBz
a2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjsKKworICAgICAgICAgICAgICAgIGlmICggc2tlbGV0
b24gKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGJvbmVzID0gc2tlbGV0b24uYm9uZXM7
CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0
dXJlcyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBza2VsZXRvbi5ib25lVGV4
dHVyZSA9PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
bGF5b3V0ICgxIG1hdHJpeCA9IDQgcGl4ZWxzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IC8vICAgICAgUkdCQSBSR0JBIFJHQkEgUkdCQSAoPT4gY29sdW1uMSwgY29sdW1uMiwgY29sdW1u
MywgY29sdW1uNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgd2l0aCAgOHg4ICBw
aXhlbCB0ZXh0dXJlIG1heCAgIDE2IGJvbmVzICogNCBwaXhlbHMgPSAgKDggKiA4KQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIDE2eDE2IHBpeGVsIHRleHR1cmUgbWF4ICAg
NjQgYm9uZXMgKiA0IHBpeGVscyA9ICgxNiAqIDE2KQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vICAgICAgIDMyeDMyIHBpeGVsIHRleHR1cmUgbWF4ICAyNTYgYm9uZXMgKiA0IHBpeGVs
cyA9ICgzMiAqIDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIDY0eDY0
IHBpeGVsIHRleHR1cmUgbWF4IDEwMjQgYm9uZXMgKiA0IHBpeGVscyA9ICg2NCAqIDY0KQorCisK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IE1hdGguc3FydCggYm9uZXMu
bGVuZ3RoICogNCApOyAvLyA0IHBpeGVscyBuZWVkZWQgZm9yIDEgbWF0cml4CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc2l6ZSA9IF9NYXRoLm5leHRQb3dlck9mVHdvKCBNYXRoLmNlaWwo
IHNpemUgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBNYXRoLm1heCgg
c2l6ZSwgNCApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJvbmVNYXRyaWNl
cyA9IG5ldyBGbG9hdDMyQXJyYXkoIHNpemUgKiBzaXplICogNCApOyAvLyA0IGZsb2F0cyBwZXIg
UkdCQSBwaXhlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbmVNYXRyaWNlcy5zZXQo
IHNrZWxldG9uLmJvbmVNYXRyaWNlcyApOyAvLyBjb3B5IGN1cnJlbnQgdmFsdWVzCisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB2YXIgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUo
IGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsZXRvbi5ib25lTWF0cmljZXMgPSBib25lTWF0
cmljZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbGV0b24uYm9uZVRleHR1cmUg
PSBib25lVGV4dHVyZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsZXRvbi5ib25l
VGV4dHVyZVNpemUgPSBzaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJl
Jywgc2tlbGV0b24uYm9uZVRleHR1cmUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdW5p
Zm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlU2l6ZScsIHNrZWxldG9uLmJvbmVUZXh0
dXJlU2l6ZSApOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgc2tlbGV0b24sICdib25l
TWF0cmljZXMnICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggcmVmcmVzaE1hdGVyaWFsICkg
eworCisgICAgICAgICAgICAgICAgcF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndG9uZU1hcHBp
bmdFeHBvc3VyZScsIF90aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgKTsKKyAgICAgICAgICAgICAg
ICBwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ1doaXRlUG9pbnQnLCBfdGhp
cy50b25lTWFwcGluZ1doaXRlUG9pbnQgKTsKKworICAgICAgICAgICAgICAgIGlmICggbWF0ZXJp
YWwubGlnaHRzICkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IG1hdGVy
aWFsIHJlcXVpcmVzIGxpZ2h0aW5nIGluZm8KKworICAgICAgICAgICAgICAgICAgICAvLyBub3Rl
OiBhbGwgbGlnaHRpbmcgdW5pZm9ybXMgYXJlIGFsd2F5cyBzZXQgY29ycmVjdGx5CisgICAgICAg
ICAgICAgICAgICAgIC8vIHRoZXkgc2ltcGx5IHJlZmVyZW5jZSB0aGUgcmVuZGVyZXIncyBzdGF0
ZSBmb3IgdGhlaXIKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzCisgICAgICAgICAgICAg
ICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCBtYXRlcmlh
bCdzIC5uZWVkc1VwZGF0ZSBmbGFncyB0byBzZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhl
IEdMIHN0YXRlIHdoZW4gcmVxdWlyZWQKKworICAgICAgICAgICAgICAgICAgICBtYXJrVW5pZm9y
bXNMaWdodHNOZWVkc1VwZGF0ZSggbV91bmlmb3JtcywgcmVmcmVzaExpZ2h0cyApOworCisgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB1bmlmb3JtcyBjb21t
b24gdG8gc2V2ZXJhbCBtYXRlcmlhbHMKKworICAgICAgICAgICAgICAgIGlmICggZm9nICYmIG1h
dGVyaWFsLmZvZyApIHsKKworICAgICAgICAgICAgICAgICAgICByZWZyZXNoVW5pZm9ybXNGb2co
IG1fdW5pZm9ybXMsIGZvZyApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgaWYgKCBtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsIHx8CisgICAgICAgICAgICAgICAg
ICAgIG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCB8fAorICAgICAgICAgICAgICAgICAg
ICBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8CisgICAgICAgICAgICAgICAgICAgIG1h
dGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHwKKyAgICAgICAgICAgICAgICAgICAgbWF0
ZXJpYWwuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgfHwKKyAgICAgICAgICAgICAgICAgICAgbWF0ZXJp
YWwuaXNNZXNoRGVwdGhNYXRlcmlhbCApIHsKKworICAgICAgICAgICAgICAgICAgICByZWZyZXNo
VW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CisKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHNpbmdsZSBtYXRlcmlhbCBzcGVjaWZp
YyB1bmlmb3JtcworCisgICAgICAgICAgICAgICAgaWYgKCBtYXRlcmlhbC5pc0xpbmVCYXNpY01h
dGVyaWFsICkgeworCisgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hVbmlmb3Jtc0xpbmUoIG1f
dW5pZm9ybXMsIG1hdGVyaWFsICk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBtYXRl
cmlhbC5pc0xpbmVEYXNoZWRNYXRlcmlhbCApIHsKKworICAgICAgICAgICAgICAgICAgICByZWZy
ZXNoVW5pZm9ybXNMaW5lKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOworICAgICAgICAgICAgICAg
ICAgICByZWZyZXNoVW5pZm9ybXNEYXNoKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOworCisgICAg
ICAgICAgICAgICAgfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNQb2ludHNNYXRlcmlhbCApIHsKKwor
ICAgICAgICAgICAgICAgICAgICByZWZyZXNoVW5pZm9ybXNQb2ludHMoIG1fdW5pZm9ybXMsIG1h
dGVyaWFsICk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hM
YW1iZXJ0TWF0ZXJpYWwgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFVuaWZvcm1z
TGFtYmVydCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKKworICAgICAgICAgICAgICAgIH0gZWxz
ZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCApIHsKKworICAgICAgICAgICAgICAg
ICAgICByZWZyZXNoVW5pZm9ybXNUb29uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOworCisgICAg
ICAgICAgICAgICAgfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCApIHsK
KworICAgICAgICAgICAgICAgICAgICByZWZyZXNoVW5pZm9ybXNQaG9uZyggbV91bmlmb3Jtcywg
bWF0ZXJpYWwgKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVz
aFBoeXNpY2FsTWF0ZXJpYWwgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFVuaWZv
cm1zUGh5c2ljYWwoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CisKKyAgICAgICAgICAgICAgICB9
IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsICkgeworCisgICAgICAg
ICAgICAgICAgICAgIHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCBtX3VuaWZvcm1zLCBtYXRlcmlh
bCApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoRGVwdGhN
YXRlcmlhbCApIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGVyaWFsLmRpc3BsYWNl
bWVudE1hcCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgbV91bmlmb3Jtcy5kaXNwbGFj
ZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7CisgICAgICAgICAgICAg
ICAgICAgICAgICBtX3VuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwu
ZGlzcGxhY2VtZW50U2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3VuaWZvcm1zLmRp
c3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzOworCisgICAg
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIG1hdGVyaWFs
LmlzTWVzaE5vcm1hbE1hdGVyaWFsICkgeworCisgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hV
bmlmb3Jtc05vcm1hbCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKKworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIC8vIFJlY3RBcmVhTGlnaHQgVGV4dHVyZQorICAgICAgICAg
ICAgICAgIC8vIFRPRE8gKG1yZG9vYik6IEZpbmQgYSBuaWNlciBpbXBsZW1lbnRhdGlvbgorCisg
ICAgICAgICAgICAgICAgaWYgKCBtX3VuaWZvcm1zLmx0Y01hdCAhPT0gdW5kZWZpbmVkICkgbV91
bmlmb3Jtcy5sdGNNYXQudmFsdWUgPSBVbmlmb3Jtc0xpYi5MVENfTUFUX1RFWFRVUkU7CisgICAg
ICAgICAgICAgICAgaWYgKCBtX3VuaWZvcm1zLmx0Y01hZyAhPT0gdW5kZWZpbmVkICkgbV91bmlm
b3Jtcy5sdGNNYWcudmFsdWUgPSBVbmlmb3Jtc0xpYi5MVENfTUFHX1RFWFRVUkU7CisKKyAgICAg
ICAgICAgICAgICBXZWJHTFVuaWZvcm1zLnVwbG9hZCgKKyAgICAgICAgICAgICAgICAgICAgX2ds
LCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCBfdGhpcyApOwor
CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gY29tbW9uIG1hdHJpY2VzCisKKyAg
ICAgICAgICAgIHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9i
amVjdC5tb2RlbFZpZXdNYXRyaXggKTsKKyAgICAgICAgICAgIHBfdW5pZm9ybXMuc2V0VmFsdWUo
IF9nbCwgJ25vcm1hbE1hdHJpeCcsIG9iamVjdC5ub3JtYWxNYXRyaXggKTsKKyAgICAgICAgICAg
IHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsTWF0cml4Jywgb2JqZWN0Lm1hdHJpeFdv
cmxkICk7CisKKyAgICAgICAgICAgIHJldHVybiBwcm9ncmFtOworCisgICAgICAgIH0KKworICAg
ICAgICAvLyBVbmlmb3JtcyAocmVmcmVzaCB1bmlmb3JtcyBvYmplY3RzKQorCisgICAgICAgIGZ1
bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkgeworCisg
ICAgICAgICAgICB1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTsKKwor
ICAgICAgICAgICAgdW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yOworCisg
ICAgICAgICAgICBpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkgeworCisgICAgICAgICAgICAgICAg
dW5pZm9ybXMuZW1pc3NpdmUudmFsdWUuY29weSggbWF0ZXJpYWwuZW1pc3NpdmUgKS5tdWx0aXBs
eVNjYWxhciggbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgKTsKKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICB1bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7CisgICAgICAg
ICAgICB1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwOwor
ICAgICAgICAgICAgdW5pZm9ybXMuYWxwaGFNYXAudmFsdWUgPSBtYXRlcmlhbC5hbHBoYU1hcDsK
KworICAgICAgICAgICAgaWYgKCBtYXRlcmlhbC5saWdodE1hcCApIHsKKworICAgICAgICAgICAg
ICAgIHVuaWZvcm1zLmxpZ2h0TWFwLnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXA7CisgICAgICAg
ICAgICAgICAgdW5pZm9ybXMubGlnaHRNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5saWdo
dE1hcEludGVuc2l0eTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIG1hdGVy
aWFsLmFvTWFwICkgeworCisgICAgICAgICAgICAgICAgdW5pZm9ybXMuYW9NYXAudmFsdWUgPSBt
YXRlcmlhbC5hb01hcDsKKyAgICAgICAgICAgICAgICB1bmlmb3Jtcy5hb01hcEludGVuc2l0eS52
YWx1ZSA9IG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5OworCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIC8vIHV2IHJlcGVhdCBhbmQgb2Zmc2V0IHNldHRpbmcgcHJpb3JpdGllcworICAgICAg
ICAgICAgLy8gMS4gY29sb3IgbWFwCisgICAgICAgICAgICAvLyAyLiBzcGVjdWxhciBtYXAKKyAg
ICAgICAgICAgIC8vIDMuIG5vcm1hbCBtYXAKKyAgICAgICAgICAgIC8vIDQuIGJ1bXAgbWFwCisg
ICAgICAgICAgICAvLyA1LiBhbHBoYSBtYXAKKyAgICAgICAgICAgIC8vIDYuIGVtaXNzaXZlIG1h
cAorCisgICAgICAgICAgICB2YXIgdXZTY2FsZU1hcDsKKworICAgICAgICAgICAgaWYgKCBtYXRl
cmlhbC5tYXAgKSB7CisKKyAgICAgICAgICAgICAgICB1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWFw
OworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtYXRlcmlhbC5zcGVjdWxhck1hcCApIHsKKwor
ICAgICAgICAgICAgICAgIHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDsKKworICAg
ICAgICAgICAgfSBlbHNlIGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkgeworCisgICAg
ICAgICAgICAgICAgdXZTY2FsZU1hcCA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDsKKworICAg
ICAgICAgICAgfSBlbHNlIGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkgeworCisgICAgICAgICAg
ICAgICAgdXZTY2FsZU1hcCA9IG1hdGVyaWFsLm5vcm1hbE1hcDsKKworICAgICAgICAgICAgfSBl
bHNlIGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHsKKworICAgICAgICAgICAgICAgIHV2U2NhbGVN
YXAgPSBtYXRlcmlhbC5idW1wTWFwOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtYXRlcmlh
bC5yb3VnaG5lc3NNYXAgKSB7CisKKyAgICAgICAgICAgICAgICB1dlNjYWxlTWFwID0gbWF0ZXJp
YWwucm91Z2huZXNzTWFwOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtYXRlcmlhbC5tZXRh
bG5lc3NNYXAgKSB7CisKKyAgICAgICAgICAgICAgICB1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWV0
YWxuZXNzTWFwOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtYXRlcmlhbC5hbHBoYU1hcCAp
IHsKKworICAgICAgICAgICAgICAgIHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDsKKwor
ICAgICAgICAgICAgfSBlbHNlIGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7CisKKyAgICAg
ICAgICAgICAgICB1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaWYgKCB1dlNjYWxlTWFwICE9PSB1bmRlZmluZWQgKSB7CisK
KyAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAgICAgICAg
ICAgIGlmICggdXZTY2FsZU1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkgeworCisgICAgICAgICAg
ICAgICAgICAgIHV2U2NhbGVNYXAgPSB1dlNjYWxlTWFwLnRleHR1cmU7CisKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdXZTY2FsZU1hcC5vZmZzZXQ7
CisgICAgICAgICAgICAgICAgdmFyIHJlcGVhdCA9IHV2U2NhbGVNYXAucmVwZWF0OworCisgICAg
ICAgICAgICAgICAgdW5pZm9ybXMub2Zmc2V0UmVwZWF0LnZhbHVlLnNldCggb2Zmc2V0LngsIG9m
ZnNldC55LCByZXBlYXQueCwgcmVwZWF0LnkgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICB1bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXA7CisKKyAgICAgICAg
ICAgIC8vIGRvbid0IGZsaXAgQ3ViZVRleHR1cmUgZW52TWFwcywgZmxpcCBldmVyeXRoaW5nIGVs
c2U6CisgICAgICAgICAgICAvLyAgV2ViR0xSZW5kZXJUYXJnZXRDdWJlIHdpbGwgYmUgZmxpcHBl
ZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICAgICAgICAgIC8vICBXZWJHTFJlbmRl
clRhcmdldEN1YmUudGV4dHVyZSB3aWxsIGJlIGZsaXBwZWQgYmVjYXVzZSBpdCdzIGEgVGV4dHVy
ZSBhbmQgTk9UIGEgQ3ViZVRleHR1cmUKKyAgICAgICAgICAgIC8vIHRoaXMgY2hlY2sgbXVzdCBi
ZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBvciByZW1vdmVkIGVudGlyZWx5LCBpZiBXZWJHTFJlbmRl
clRhcmdldEN1YmUgdXNlcyBhIEN1YmVUZXh0dXJlIGluIHRoZSBmdXR1cmUKKyAgICAgICAgICAg
IHVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSAoICEgKCBtYXRlcmlhbC5lbnZNYXAgJiYgbWF0
ZXJpYWwuZW52TWFwLmlzQ3ViZVRleHR1cmUgKSApID8gMSA6IC0gMTsKKworICAgICAgICAgICAg
dW5pZm9ybXMucmVmbGVjdGl2aXR5LnZhbHVlID0gbWF0ZXJpYWwucmVmbGVjdGl2aXR5OworICAg
ICAgICAgICAgdW5pZm9ybXMucmVmcmFjdGlvblJhdGlvLnZhbHVlID0gbWF0ZXJpYWwucmVmcmFj
dGlvblJhdGlvOworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiByZWZyZXNoVW5pZm9y
bXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7CisKKyAgICAgICAgICAgIHVuaWZvcm1zLmRp
ZmZ1c2UudmFsdWUgPSBtYXRlcmlhbC5jb2xvcjsKKyAgICAgICAgICAgIHVuaWZvcm1zLm9wYWNp
dHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5OworCisgICAgICAgIH0KKworICAgICAgICBmdW5j
dGlvbiByZWZyZXNoVW5pZm9ybXNEYXNoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7CisKKyAgICAg
ICAgICAgIHVuaWZvcm1zLmRhc2hTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemU7CisgICAg
ICAgICAgICB1bmlmb3Jtcy50b3RhbFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZSArIG1h
dGVyaWFsLmdhcFNpemU7CisgICAgICAgICAgICB1bmlmb3Jtcy5zY2FsZS52YWx1ZSA9IG1hdGVy
aWFsLnNjYWxlOworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiByZWZyZXNoVW5pZm9y
bXNQb2ludHMoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKKworICAgICAgICAgICAgdW5pZm9ybXMu
ZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yOworICAgICAgICAgICAgdW5pZm9ybXMub3Bh
Y2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7CisgICAgICAgICAgICB1bmlmb3Jtcy5zaXpl
LnZhbHVlID0gbWF0ZXJpYWwuc2l6ZSAqIF9waXhlbFJhdGlvOworICAgICAgICAgICAgdW5pZm9y
bXMuc2NhbGUudmFsdWUgPSBfaGVpZ2h0ICogMC41OworCisgICAgICAgICAgICB1bmlmb3Jtcy5t
YXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7CisKKyAgICAgICAgICAgIGlmICggbWF0ZXJpYWwubWFw
ICE9PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IG1hdGVyaWFsLm1h
cC5vZmZzZXQ7CisgICAgICAgICAgICAgICAgdmFyIHJlcGVhdCA9IG1hdGVyaWFsLm1hcC5yZXBl
YXQ7CisKKyAgICAgICAgICAgICAgICB1bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUuc2V0KCBv
ZmZzZXQueCwgb2Zmc2V0LnksIHJlcGVhdC54LCByZXBlYXQueSApOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0ZvZyggdW5p
Zm9ybXMsIGZvZyApIHsKKworICAgICAgICAgICAgdW5pZm9ybXMuZm9nQ29sb3IudmFsdWUgPSBm
b2cuY29sb3I7CisKKyAgICAgICAgICAgIGlmICggZm9nLmlzRm9nICkgeworCisgICAgICAgICAg
ICAgICAgdW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyOworICAgICAgICAgICAgICAg
IHVuaWZvcm1zLmZvZ0Zhci52YWx1ZSA9IGZvZy5mYXI7CisKKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7CisKKyAgICAgICAgICAgICAgICB1bmlmb3Jtcy5mb2dEZW5z
aXR5LnZhbHVlID0gZm9nLmRlbnNpdHk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisK
KyAgICAgICAgZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGFtYmVydCggdW5pZm9ybXMsIG1hdGVy
aWFsICkgeworCisgICAgICAgICAgICBpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkgeworCisg
ICAgICAgICAgICAgICAgdW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlz
c2l2ZU1hcDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlv
biByZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5pZm9ybXMsIG1hdGVyaWFsICkgeworCisgICAgICAg
ICAgICB1bmlmb3Jtcy5zcGVjdWxhci52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyOworICAgICAg
ICAgICAgdW5pZm9ybXMuc2hpbmluZXNzLnZhbHVlID0gTWF0aC5tYXgoIG1hdGVyaWFsLnNoaW5p
bmVzcywgMWUtNCApOyAvLyB0byBwcmV2ZW50IHBvdyggMC4wLCAwLjAgKQorCisgICAgICAgICAg
ICBpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkgeworCisgICAgICAgICAgICAgICAgdW5pZm9y
bXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDsKKworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7CisKKyAgICAgICAg
ICAgICAgICB1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDsKKyAgICAg
ICAgICAgICAgICB1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAg
KSB7CisKKyAgICAgICAgICAgICAgICB1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlh
bC5ub3JtYWxNYXA7CisgICAgICAgICAgICAgICAgdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUu
Y29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHsKKworICAgICAgICAgICAgICAg
IHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1h
cDsKKyAgICAgICAgICAgICAgICB1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1h
dGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlOworICAgICAgICAgICAgICAgIHVuaWZvcm1zLmRpc3Bs
YWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rv
b24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKKworICAgICAgICAgICAgcmVmcmVzaFVuaWZvcm1z
UGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApOworCisgICAgICAgICAgICBpZiAoIG1hdGVyaWFs
LmdyYWRpZW50TWFwICkgeworCisgICAgICAgICAgICAgICAgdW5pZm9ybXMuZ3JhZGllbnRNYXAu
dmFsdWUgPSBtYXRlcmlhbC5ncmFkaWVudE1hcDsKKworICAgICAgICAgICAgfQorCisgICAgICAg
IH0KKworICAgICAgICBmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMs
IG1hdGVyaWFsICkgeworCisgICAgICAgICAgICB1bmlmb3Jtcy5yb3VnaG5lc3MudmFsdWUgPSBt
YXRlcmlhbC5yb3VnaG5lc3M7CisgICAgICAgICAgICB1bmlmb3Jtcy5tZXRhbG5lc3MudmFsdWUg
PSBtYXRlcmlhbC5tZXRhbG5lc3M7CisKKyAgICAgICAgICAgIGlmICggbWF0ZXJpYWwucm91Z2hu
ZXNzTWFwICkgeworCisgICAgICAgICAgICAgICAgdW5pZm9ybXMucm91Z2huZXNzTWFwLnZhbHVl
ID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkgeworCisgICAgICAgICAgICAgICAgdW5pZm9y
bXMubWV0YWxuZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7CisKKyAg
ICAgICAgICAgICAgICB1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNz
aXZlTWFwOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggbWF0ZXJpYWwuYnVt
cE1hcCApIHsKKworICAgICAgICAgICAgICAgIHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRl
cmlhbC5idW1wTWFwOworICAgICAgICAgICAgICAgIHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9
IG1hdGVyaWFsLmJ1bXBTY2FsZTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAo
IG1hdGVyaWFsLm5vcm1hbE1hcCApIHsKKworICAgICAgICAgICAgICAgIHVuaWZvcm1zLm5vcm1h
bE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDsKKyAgICAgICAgICAgICAgICB1bmlmb3Jt
cy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApOworCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkg
eworCisgICAgICAgICAgICAgICAgdW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0
ZXJpYWwuZGlzcGxhY2VtZW50TWFwOworICAgICAgICAgICAgICAgIHVuaWZvcm1zLmRpc3BsYWNl
bWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7CisgICAgICAgICAg
ICAgICAgdW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNl
bWVudEJpYXM7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBtYXRlcmlhbC5l
bnZNYXAgKSB7CisKKyAgICAgICAgICAgICAgICAvL3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1h
dGVyaWFsLmVudk1hcDsgLy8gcGFydCBvZiB1bmlmb3JtcyBjb21tb24KKyAgICAgICAgICAgICAg
ICB1bmlmb3Jtcy5lbnZNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXBJbnRlbnNp
dHk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gcmVm
cmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKKworICAgICAgICAg
ICAgdW5pZm9ybXMuY2xlYXJDb2F0LnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJDb2F0OworICAgICAg
ICAgICAgdW5pZm9ybXMuY2xlYXJDb2F0Um91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJD
b2F0Um91Z2huZXNzOworCisgICAgICAgICAgICByZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5p
Zm9ybXMsIG1hdGVyaWFsICk7CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHJlZnJl
c2hVbmlmb3Jtc05vcm1hbCggdW5pZm9ybXMsIG1hdGVyaWFsICkgeworCisgICAgICAgICAgICBp
ZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7CisKKyAgICAgICAgICAgICAgICB1bmlmb3Jtcy5idW1w
TWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDsKKyAgICAgICAgICAgICAgICB1bmlmb3Jtcy5i
dW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgaWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7CisKKyAgICAgICAgICAgICAg
ICB1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7CisgICAgICAg
ICAgICAgICAgdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFs
U2NhbGUgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIG1hdGVyaWFsLmRp
c3BsYWNlbWVudE1hcCApIHsKKworICAgICAgICAgICAgICAgIHVuaWZvcm1zLmRpc3BsYWNlbWVu
dE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDsKKyAgICAgICAgICAgICAgICB1
bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNj
YWxlOworICAgICAgICAgICAgICAgIHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBt
YXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQor
CisgICAgICAgIC8vIElmIHVuaWZvcm1zIGFyZSBtYXJrZWQgYXMgY2xlYW4sIHRoZXkgZG9uJ3Qg
bmVlZCB0byBiZSBsb2FkZWQgdG8gdGhlIEdQVS4KKworICAgICAgICBmdW5jdGlvbiBtYXJrVW5p
Zm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggdW5pZm9ybXMsIHZhbHVlICkgeworCisgICAgICAgICAg
ICB1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZSA9IHZhbHVlOworCisgICAg
ICAgICAgICB1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlOwor
ICAgICAgICAgICAgdW5pZm9ybXMucG9pbnRMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTsKKyAg
ICAgICAgICAgIHVuaWZvcm1zLnNwb3RMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTsKKyAgICAg
ICAgICAgIHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7CisgICAg
ICAgICAgICB1bmlmb3Jtcy5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7CisK
KyAgICAgICAgfQorCisgICAgICAgIC8vIExpZ2h0aW5nCisKKyAgICAgICAgZnVuY3Rpb24gc2V0
dXBTaGFkb3dzKCBsaWdodHMgKSB7CisKKyAgICAgICAgICAgIHZhciBsaWdodFNoYWRvd3NMZW5n
dGggPSAwOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBsaWdodHMubGVuZ3Ro
OyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHZhciBsaWdodCA9IGxpZ2h0c1sg
aSBdOworCisgICAgICAgICAgICAgICAgaWYgKCBsaWdodC5jYXN0U2hhZG93ICkgeworCisgICAg
ICAgICAgICAgICAgICAgIF9saWdodHMuc2hhZG93c1sgbGlnaHRTaGFkb3dzTGVuZ3RoIF0gPSBs
aWdodDsKKyAgICAgICAgICAgICAgICAgICAgbGlnaHRTaGFkb3dzTGVuZ3RoICsrOworCisgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9saWdodHMuc2hh
ZG93cy5sZW5ndGggPSBsaWdodFNoYWRvd3NMZW5ndGg7CisKKyAgICAgICAgfQorCisgICAgICAg
IGZ1bmN0aW9uIHNldHVwTGlnaHRzKCBsaWdodHMsIGNhbWVyYSApIHsKKworICAgICAgICAgICAg
dmFyIGwsIGxsLCBsaWdodCwgc2hhZG93LAorICAgICAgICAgICAgICAgIHIgPSAwLCBnID0gMCwg
YiA9IDAsCisgICAgICAgICAgICAgICAgY29sb3IsCisgICAgICAgICAgICAgICAgaW50ZW5zaXR5
LAorICAgICAgICAgICAgICAgIGRpc3RhbmNlLAorICAgICAgICAgICAgICAgIHNoYWRvd01hcCwK
KworICAgICAgICAgICAgICAgIHZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNl
LAorCisgICAgICAgICAgICAgICAgZGlyZWN0aW9uYWxMZW5ndGggPSAwLAorICAgICAgICAgICAg
ICAgIHBvaW50TGVuZ3RoID0gMCwKKyAgICAgICAgICAgICAgICBzcG90TGVuZ3RoID0gMCwKKyAg
ICAgICAgICAgICAgICByZWN0QXJlYUxlbmd0aCA9IDAsCisgICAgICAgICAgICAgICAgaGVtaUxl
bmd0aCA9IDA7CisKKyAgICAgICAgICAgIGZvciAoIGwgPSAwLCBsbCA9IGxpZ2h0cy5sZW5ndGg7
IGwgPCBsbDsgbCArKyApIHsKKworICAgICAgICAgICAgICAgIGxpZ2h0ID0gbGlnaHRzWyBsIF07
CisKKyAgICAgICAgICAgICAgICBjb2xvciA9IGxpZ2h0LmNvbG9yOworICAgICAgICAgICAgICAg
IGludGVuc2l0eSA9IGxpZ2h0LmludGVuc2l0eTsKKyAgICAgICAgICAgICAgICBkaXN0YW5jZSA9
IGxpZ2h0LmRpc3RhbmNlOworCisgICAgICAgICAgICAgICAgc2hhZG93TWFwID0gKCBsaWdodC5z
aGFkb3cgJiYgbGlnaHQuc2hhZG93Lm1hcCApID8gbGlnaHQuc2hhZG93Lm1hcC50ZXh0dXJlIDog
bnVsbDsKKworICAgICAgICAgICAgICAgIGlmICggbGlnaHQuaXNBbWJpZW50TGlnaHQgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgciArPSBjb2xvci5yICogaW50ZW5zaXR5OworICAgICAgICAg
ICAgICAgICAgICBnICs9IGNvbG9yLmcgKiBpbnRlbnNpdHk7CisgICAgICAgICAgICAgICAgICAg
IGIgKz0gY29sb3IuYiAqIGludGVuc2l0eTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAo
IGxpZ2h0LmlzRGlyZWN0aW9uYWxMaWdodCApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIg
dW5pZm9ybXMgPSBsaWdodENhY2hlLmdldCggbGlnaHQgKTsKKworICAgICAgICAgICAgICAgICAg
ICB1bmlmb3Jtcy5jb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBsaWdo
dC5pbnRlbnNpdHkgKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMuZGlyZWN0aW9uLnNl
dEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKKyAgICAgICAgICAgICAg
ICAgICAgX3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4
V29ybGQgKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggX3Zl
Y3RvcjMgKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9y
bURpcmVjdGlvbiggdmlld01hdHJpeCApOworCisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1z
LnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBs
aWdodC5jYXN0U2hhZG93ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3cgPSBs
aWdodC5zaGFkb3c7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLnNoYWRvd0Jp
YXMgPSBzaGFkb3cuYmlhczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLnNoYWRv
d1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jt
cy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7CisKKyAgICAgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgICAgIF9saWdodHMuZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGRp
cmVjdGlvbmFsTGVuZ3RoIF0gPSBzaGFkb3dNYXA7CisgICAgICAgICAgICAgICAgICAgIF9saWdo
dHMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBsaWdodC5z
aGFkb3cubWF0cml4OworICAgICAgICAgICAgICAgICAgICBfbGlnaHRzLmRpcmVjdGlvbmFsWyBk
aXJlY3Rpb25hbExlbmd0aCBdID0gdW5pZm9ybXM7CisKKyAgICAgICAgICAgICAgICAgICAgZGly
ZWN0aW9uYWxMZW5ndGggKys7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBsaWdodC5p
c1Nwb3RMaWdodCApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdW5pZm9ybXMgPSBsaWdo
dENhY2hlLmdldCggbGlnaHQgKTsKKworICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtcy5wb3Np
dGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CisgICAgICAg
ICAgICAgICAgICAgIHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCAp
OworCisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVs
dGlwbHlTY2FsYXIoIGludGVuc2l0eSApOworICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtcy5k
aXN0YW5jZSA9IGRpc3RhbmNlOworCisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLmRpcmVj
dGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CisgICAgICAg
ICAgICAgICAgICAgIF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0
Lm1hdHJpeFdvcmxkICk7CisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLmRpcmVjdGlvbi5z
dWIoIF92ZWN0b3IzICk7CisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLmRpcmVjdGlvbi50
cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTsKKworICAgICAgICAgICAgICAgICAgICB1
bmlmb3Jtcy5jb25lQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICk7CisgICAgICAgICAgICAg
ICAgICAgIHVuaWZvcm1zLnBlbnVtYnJhQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICogKCAx
IC0gbGlnaHQucGVudW1icmEgKSApOworICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtcy5kZWNh
eSA9ICggbGlnaHQuZGlzdGFuY2UgPT09IDAgKSA/IDAuMCA6IGxpZ2h0LmRlY2F5OworCisgICAg
ICAgICAgICAgICAgICAgIHVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7CisKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCBsaWdodC5jYXN0U2hhZG93ICkgeworCisgICAgICAgICAg
ICAgICAgICAgICAgICBzaGFkb3cgPSBsaWdodC5zaGFkb3c7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhczsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7CisgICAgICAg
ICAgICAgICAgICAgICAgICB1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7
CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIF9saWdodHMu
c3BvdFNoYWRvd01hcFsgc3BvdExlbmd0aCBdID0gc2hhZG93TWFwOworICAgICAgICAgICAgICAg
ICAgICBfbGlnaHRzLnNwb3RTaGFkb3dNYXRyaXhbIHNwb3RMZW5ndGggXSA9IGxpZ2h0LnNoYWRv
dy5tYXRyaXg7CisgICAgICAgICAgICAgICAgICAgIF9saWdodHMuc3BvdFsgc3BvdExlbmd0aCBd
ID0gdW5pZm9ybXM7CisKKyAgICAgICAgICAgICAgICAgICAgc3BvdExlbmd0aCArKzsKKworICAg
ICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHsKKworICAg
ICAgICAgICAgICAgICAgICB2YXIgdW5pZm9ybXMgPSBsaWdodENhY2hlLmdldCggbGlnaHQgKTsK
KworICAgICAgICAgICAgICAgICAgICAvLyAoYSkgaW50ZW5zaXR5IGNvbnRyb2xzIGlycmFkaWFu
Y2Ugb2YgZW50aXJlIGxpZ2h0CisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLmNvbG9yCisg
ICAgICAgICAgICAgICAgICAgICAgICAuY29weSggY29sb3IgKQorICAgICAgICAgICAgICAgICAg
ICAgICAgLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgLyAoIGxpZ2h0LndpZHRoICogbGlnaHQu
aGVpZ2h0ICkgKTsKKworICAgICAgICAgICAgICAgICAgICAvLyAoYikgaW50ZW5zaXR5IGNvbnRy
b2xzIHRoZSByYWRpYW5jZSBwZXIgbGlnaHQgYXJlYQorICAgICAgICAgICAgICAgICAgICAvLyB1
bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTsK
KworICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9z
aXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1z
LnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApOworCisgICAgICAgICAgICAgICAg
ICAgIC8vIGV4dHJhY3QgbG9jYWwgcm90YXRpb24gb2YgbGlnaHQgdG8gZGVyaXZlIHdpZHRoL2hl
aWdodCBoYWxmIHZlY3RvcnMKKyAgICAgICAgICAgICAgICAgICAgX21hdHJpeDQyLmlkZW50aXR5
KCk7CisgICAgICAgICAgICAgICAgICAgIF9tYXRyaXg0LmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxk
ICk7CisgICAgICAgICAgICAgICAgICAgIF9tYXRyaXg0LnByZW11bHRpcGx5KCB2aWV3TWF0cml4
ICk7CisgICAgICAgICAgICAgICAgICAgIF9tYXRyaXg0Mi5leHRyYWN0Um90YXRpb24oIF9tYXRy
aXg0ICk7CisKKyAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGln
aHQud2lkdGggKiAwLjUsICAgICAgICAgICAgICAgIDAuMCwgMC4wICk7CisgICAgICAgICAgICAg
ICAgICAgIHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAgICAgICAgICAgICAgMC4wLCBsaWdodC5o
ZWlnaHQgKiAwLjUsIDAuMCApOworCisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLmhhbGZX
aWR0aC5hcHBseU1hdHJpeDQoIF9tYXRyaXg0MiApOworICAgICAgICAgICAgICAgICAgICB1bmlm
b3Jtcy5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NCggX21hdHJpeDQyICk7CisKKyAgICAgICAgICAg
ICAgICAgICAgLy8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgZGlzdGFuY2U/Cisg
ICAgICAgICAgICAgICAgICAgIC8vIHVuaWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7CisKKyAg
ICAgICAgICAgICAgICAgICAgX2xpZ2h0cy5yZWN0QXJlYVsgcmVjdEFyZWFMZW5ndGggXSA9IHVu
aWZvcm1zOworCisgICAgICAgICAgICAgICAgICAgIHJlY3RBcmVhTGVuZ3RoICsrOworCisgICAg
ICAgICAgICAgICAgfSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkgeworCisgICAgICAg
ICAgICAgICAgICAgIHZhciB1bmlmb3JtcyA9IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApOworCisg
ICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlv
biggbGlnaHQubWF0cml4V29ybGQgKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMucG9z
aXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7CisKKyAgICAgICAgICAgICAgICAgICAg
dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQu
aW50ZW5zaXR5ICk7CisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLmRpc3RhbmNlID0gbGln
aHQuZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLmRlY2F5ID0gKCBsaWdo
dC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVjYXk7CisKKyAgICAgICAgICAgICAg
ICAgICAgdW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdzsKKworICAgICAgICAgICAg
ICAgICAgICBpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdzsKKworICAgICAgICAgICAgICAgICAgICAgICAgdW5p
Zm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzOworICAgICAgICAgICAgICAgICAgICAgICAg
dW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1czsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHVuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTsKKworICAgICAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgX2xpZ2h0cy5wb2ludFNoYWRv
d01hcFsgcG9pbnRMZW5ndGggXSA9IHNoYWRvd01hcDsKKyAgICAgICAgICAgICAgICAgICAgX2xp
Z2h0cy5wb2ludFNoYWRvd01hdHJpeFsgcG9pbnRMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRy
aXg7CisgICAgICAgICAgICAgICAgICAgIF9saWdodHMucG9pbnRbIHBvaW50TGVuZ3RoIF0gPSB1
bmlmb3JtczsKKworICAgICAgICAgICAgICAgICAgICBwb2ludExlbmd0aCArKzsKKworICAgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAoIGxpZ2h0LmlzSGVtaXNwaGVyZUxpZ2h0ICkgeworCisgICAg
ICAgICAgICAgICAgICAgIHZhciB1bmlmb3JtcyA9IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApOwor
CisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9z
aXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CisgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1z
LmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTsKKyAgICAgICAgICAg
ICAgICAgICAgdW5pZm9ybXMuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpOworCisgICAgICAgICAgICAg
ICAgICAgIHVuaWZvcm1zLnNreUNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2Fs
YXIoIGludGVuc2l0eSApOworICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtcy5ncm91bmRDb2xv
ci5jb3B5KCBsaWdodC5ncm91bmRDb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTsK
KworICAgICAgICAgICAgICAgICAgICBfbGlnaHRzLmhlbWlbIGhlbWlMZW5ndGggXSA9IHVuaWZv
cm1zOworCisgICAgICAgICAgICAgICAgICAgIGhlbWlMZW5ndGggKys7CisKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2xpZ2h0cy5hbWJpZW50WyAw
IF0gPSByOworICAgICAgICAgICAgX2xpZ2h0cy5hbWJpZW50WyAxIF0gPSBnOworICAgICAgICAg
ICAgX2xpZ2h0cy5hbWJpZW50WyAyIF0gPSBiOworCisgICAgICAgICAgICBfbGlnaHRzLmRpcmVj
dGlvbmFsLmxlbmd0aCA9IGRpcmVjdGlvbmFsTGVuZ3RoOworICAgICAgICAgICAgX2xpZ2h0cy5z
cG90Lmxlbmd0aCA9IHNwb3RMZW5ndGg7CisgICAgICAgICAgICBfbGlnaHRzLnJlY3RBcmVhLmxl
bmd0aCA9IHJlY3RBcmVhTGVuZ3RoOworICAgICAgICAgICAgX2xpZ2h0cy5wb2ludC5sZW5ndGgg
PSBwb2ludExlbmd0aDsKKyAgICAgICAgICAgIF9saWdodHMuaGVtaS5sZW5ndGggPSBoZW1pTGVu
Z3RoOworCisgICAgICAgICAgICAvLyBUT0RPIChzYW0tZy1zdGVlbCkgd2h5IGFyZW4ndCB3ZSB1
c2luZyBqb2luCisgICAgICAgICAgICBfbGlnaHRzLmhhc2ggPSBkaXJlY3Rpb25hbExlbmd0aCAr
ICcsJyArIHBvaW50TGVuZ3RoICsgJywnICsgc3BvdExlbmd0aCArICcsJyArIHJlY3RBcmVhTGVu
Z3RoICsgJywnICsgaGVtaUxlbmd0aCArICcsJyArIF9saWdodHMuc2hhZG93cy5sZW5ndGg7CisK
KyAgICAgICAgfQorCisgICAgICAgIC8vIEdMIHN0YXRlIHNldHRpbmcKKworICAgICAgICB0aGlz
LnNldEZhY2VDdWxsaW5nID0gZnVuY3Rpb24gKCBjdWxsRmFjZSwgZnJvbnRGYWNlRGlyZWN0aW9u
ICkgeworCisgICAgICAgICAgICBzdGF0ZS5zZXRDdWxsRmFjZSggY3VsbEZhY2UgKTsKKyAgICAg
ICAgICAgIHN0YXRlLnNldEZsaXBTaWRlZCggZnJvbnRGYWNlRGlyZWN0aW9uID09PSBGcm9udEZh
Y2VEaXJlY3Rpb25DVyApOworCisgICAgICAgIH07CisKKyAgICAgICAgLy8gVGV4dHVyZXMKKwor
ICAgICAgICBmdW5jdGlvbiBhbGxvY1RleHR1cmVVbml0KCkgeworCisgICAgICAgICAgICB2YXIg
dGV4dHVyZVVuaXQgPSBfdXNlZFRleHR1cmVVbml0czsKKworICAgICAgICAgICAgaWYgKCB0ZXh0
dXJlVW5pdCA+PSBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKSB7CisKKyAgICAgICAgICAgICAg
ICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUcnlpbmcgdG8gdXNlICcgKyB0
ZXh0dXJlVW5pdCArICcgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5
ICcgKyBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKTsKKworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBfdXNlZFRleHR1cmVVbml0cyArPSAxOworCisgICAgICAgICAgICByZXR1cm4gdGV4
dHVyZVVuaXQ7CisKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuYWxsb2NUZXh0dXJlVW5pdCA9
IGFsbG9jVGV4dHVyZVVuaXQ7CisKKyAgICAgICAgLy8gdGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRU
ZXh0dXJlMkQ7CisgICAgICAgIHRoaXMuc2V0VGV4dHVyZTJEID0gKCBmdW5jdGlvbiAoKSB7CisK
KyAgICAgICAgICAgIHZhciB3YXJuZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gYmFja3dh
cmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlCisgICAgICAgICAgICByZXR1
cm4gZnVuY3Rpb24gc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkgeworCisgICAgICAgICAg
ICAgICAgaWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldCApIHsKKwor
ICAgICAgICAgICAgICAgICAgICBpZiAoICEgd2FybmVkICkgeworCisgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zb2xlLndhcm4oICJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldFRleHR1cmUyRDog
ZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUg
cHJvcGVydHkgaW5zdGVhZC4iICk7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuZWQgPSB0
cnVlOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0ZXh0
dXJlID0gdGV4dHVyZS50ZXh0dXJlOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgdGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7CisKKyAgICAgICAg
ICAgIH07CisKKyAgICAgICAgfSgpICk7CisKKyAgICAgICAgdGhpcy5zZXRUZXh0dXJlID0gKCBm
dW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciB3YXJuZWQgPSBmYWxzZTsKKworICAgICAg
ICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUoIHRleHR1cmUsIHNsb3QgKSB7CisKKyAg
ICAgICAgICAgICAgICBpZiAoICEgd2FybmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIGNv
bnNvbGUud2FybiggIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlIGlzIGRlcHJlY2F0
ZWQsIHVzZSBzZXRUZXh0dXJlMkQgaW5zdGVhZC4iICk7CisgICAgICAgICAgICAgICAgICAgIHdh
cm5lZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0ZXh0
dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTsKKworICAgICAgICAgICAgfTsKKwor
ICAgICAgICB9KCkgKTsKKworICAgICAgICB0aGlzLnNldFRleHR1cmVDdWJlID0gKCBmdW5jdGlv
biAoKSB7CisKKyAgICAgICAgICAgIHZhciB3YXJuZWQgPSBmYWxzZTsKKworICAgICAgICAgICAg
cmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkgeworCisgICAg
ICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0
dXJlCisgICAgICAgICAgICAgICAgaWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRl
clRhcmdldEN1YmUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHdhcm5lZCApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAiVEhSRUUuV2ViR0xSZW5k
ZXJlci5zZXRUZXh0dXJlQ3ViZTogZG9uJ3QgdXNlIGN1YmUgcmVuZGVyIHRhcmdldHMgYXMgdGV4
dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLiIgKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHdhcm5lZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgICAgIHRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7CisKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgcmVseWluZyBvbiB0
aGUgZmFjdCB0aGF0IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJlIGlzIGEgVGV4dHVyZSBh
bmQgTk9UIGEgQ3ViZVRleHR1cmUKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB1bmlmeSB0aGVz
ZSBjb2RlIHBhdGhzCisgICAgICAgICAgICAgICAgaWYgKCAoIHRleHR1cmUgJiYgdGV4dHVyZS5p
c0N1YmVUZXh0dXJlICkgfHwKKyAgICAgICAgICAgICAgICAgICAgKCBBcnJheS5pc0FycmF5KCB0
ZXh0dXJlLmltYWdlICkgJiYgdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDYgKSApIHsKKworICAg
ICAgICAgICAgICAgICAgICAvLyBDb21wcmVzc2VkVGV4dHVyZSBjYW4gaGF2ZSBBcnJheSBpbiBp
bWFnZSA6LworCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gYWxvbmUgc2hv
dWxkIHRha2UgY2FyZSBvZiBjdWJlIHRleHR1cmVzCisgICAgICAgICAgICAgICAgICAgIHRleHR1
cmVzLnNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICk7CisKKyAgICAgICAgICAgICAgICB9
IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZWQ6IHRleHR1cmUgcHJvcGVy
dHkgb2YgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlCisKKyAgICAgICAgICAgICAgICAgICAg
dGV4dHVyZXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljKCB0ZXh0dXJlLCBzbG90ICk7CisKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpICk7CisKKyAgICAg
ICAgdGhpcy5nZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJl
dHVybiBfY3VycmVudFJlbmRlclRhcmdldDsKKworICAgICAgICB9OworCisgICAgICAgIHRoaXMu
c2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQgKSB7CisKKyAgICAgICAg
ICAgIF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0OworCisgICAgICAgICAgICBp
ZiAoIHJlbmRlclRhcmdldCAmJiBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJn
bEZyYW1lYnVmZmVyID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICB0ZXh0dXJl
cy5zZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgdmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5p
c1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApOworICAgICAgICAgICAgdmFyIGZyYW1lYnVmZmVyOwor
CisgICAgICAgICAgICBpZiAoIHJlbmRlclRhcmdldCApIHsKKworICAgICAgICAgICAgICAgIHZh
ciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCAp
OworCisgICAgICAgICAgICAgICAgaWYgKCBpc0N1YmUgKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgZnJhbWVidWZmZXIgPSByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZl
clsgcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlIF07CisKKyAgICAgICAgICAgICAgICB9IGVs
c2UgeworCisgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyID0gcmVuZGVyVGFyZ2V0UHJv
cGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXI7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICBfY3VycmVudFNjaXNzb3IuY29weSggcmVuZGVyVGFyZ2V0LnNjaXNzb3IgKTsK
KyAgICAgICAgICAgICAgICBfY3VycmVudFNjaXNzb3JUZXN0ID0gcmVuZGVyVGFyZ2V0LnNjaXNz
b3JUZXN0OworCisgICAgICAgICAgICAgICAgX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCByZW5kZXJU
YXJnZXQudmlld3BvcnQgKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAg
ICAgIGZyYW1lYnVmZmVyID0gbnVsbDsKKworICAgICAgICAgICAgICAgIF9jdXJyZW50U2Npc3Nv
ci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApOworICAgICAg
ICAgICAgICAgIF9jdXJyZW50U2Npc3NvclRlc3QgPSBfc2Npc3NvclRlc3Q7CisKKyAgICAgICAg
ICAgICAgICBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFy
KCBfcGl4ZWxSYXRpbyApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggX2N1
cnJlbnRGcmFtZWJ1ZmZlciAhPT0gZnJhbWVidWZmZXIgKSB7CisKKyAgICAgICAgICAgICAgICBf
Z2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7CisgICAg
ICAgICAgICAgICAgX2N1cnJlbnRGcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3NvciApOwor
ICAgICAgICAgICAgc3RhdGUuc2V0U2Npc3NvclRlc3QoIF9jdXJyZW50U2Npc3NvclRlc3QgKTsK
KworICAgICAgICAgICAgc3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQgKTsKKworICAg
ICAgICAgICAgaWYgKCBpc0N1YmUgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgdGV4dHVyZVBy
b3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTsKKyAgICAg
ICAgICAgICAgICBfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2ds
LkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgcmVu
ZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVy
ZSwgcmVuZGVyVGFyZ2V0LmFjdGl2ZU1pcE1hcExldmVsICk7CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICB9OworCisgICAgICAgIHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscyA9IGZ1bmN0
aW9uICggcmVuZGVyVGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBidWZmZXIgKSB7CisKKyAg
ICAgICAgICAgIGlmICggISAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJl
bmRlclRhcmdldCApICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvciggJ1RIUkVF
LldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5v
dCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4nICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmcmFtZWJ1ZmZlciA9IHByb3BlcnRp
ZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7CisKKyAgICAgICAgICAg
IGlmICggZnJhbWVidWZmZXIgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgcmVzdG9yZSA9IGZh
bHNlOworCisgICAgICAgICAgICAgICAgaWYgKCBmcmFtZWJ1ZmZlciAhPT0gX2N1cnJlbnRGcmFt
ZWJ1ZmZlciApIHsKKworICAgICAgICAgICAgICAgICAgICBfZ2wuYmluZEZyYW1lYnVmZmVyKCBf
Z2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVz
dG9yZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkg
eworCisgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1
cmU7CisgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlRm9ybWF0ID0gdGV4dHVyZS5mb3Jt
YXQ7CisgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlVHlwZSA9IHRleHR1cmUudHlwZTsK
KworICAgICAgICAgICAgICAgICAgICBpZiAoIHRleHR1cmVGb3JtYXQgIT09IFJHQkFGb3JtYXQg
JiYgcGFyYW1UaHJlZVRvR0woIHRleHR1cmVGb3JtYXQgKSAhPT0gX2dsLmdldFBhcmFtZXRlcigg
X2dsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUICkgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5k
ZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRh
dGlvbiBkZWZpbmVkIGZvcm1hdC4nICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggdGV4
dHVyZVR5cGUgIT09IFVuc2lnbmVkQnl0ZVR5cGUgJiYgcGFyYW1UaHJlZVRvR0woIHRleHR1cmVU
eXBlICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFE
X1RZUEUgKSAmJiAvLyBJRTExLCBFZGdlIGFuZCBDaHJvbWUgTWFjIDwgNTIgKCM5NTEzKQorICAg
ICAgICAgICAgICAgICAgICAgICAgISAoIHRleHR1cmVUeXBlID09PSBGbG9hdFR5cGUgJiYgKCBl
eHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuZ2V0KCAn
V0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgKSAmJiAvLyBDaHJvbWUgTWFjID49IDUyIGFu
ZCBGaXJlZm94CisgICAgICAgICAgICAgICAgICAgICAgICAhICggdGV4dHVyZVR5cGUgPT09IEhh
bGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxv
YXQnICkgKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvciggJ1RI
UkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlz
IG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4n
ICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggX2dsLmNoZWNrRnJhbWVidWZmZXJTdGF0
dXMoIF9nbC5GUkFNRUJVRkZFUiApID09PSBfZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IGVu
c3VyZXMgdmFsaWQgcmVhZCByZXF1ZXN0cyAobm8gb3V0LW9mLWJvdW5kcyBwaXhlbHMsIHNlZSAj
ODYwNCkKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIHggPj0gMCAmJiB4IDw9ICgg
cmVuZGVyVGFyZ2V0LndpZHRoIC0gd2lkdGggKSApICYmICggeSA+PSAwICYmIHkgPD0gKCByZW5k
ZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0ICkgKSApIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIF9nbC5yZWFkUGl4ZWxzKCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwYXJhbVRocmVlVG9H
TCggdGV4dHVyZUZvcm1hdCApLCBwYXJhbVRocmVlVG9HTCggdGV4dHVyZVR5cGUgKSwgYnVmZmVy
ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9
IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUu
V2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVu
ZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLicgKTsKKworICAgICAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAg
ICAgICAgICAgICAgIGlmICggcmVzdG9yZSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfY3VycmVudEZyYW1lYnVmZmVy
ICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgfTsKKworICAgICAgICAvLyBNYXAgdGhyZWUuanMgY29uc3Rh
bnRzIHRvIFdlYkdMIGNvbnN0YW50cworCisgICAgICAgIGZ1bmN0aW9uIHBhcmFtVGhyZWVUb0dM
KCBwICkgeworCisgICAgICAgICAgICB2YXIgZXh0ZW5zaW9uOworCisgICAgICAgICAgICBpZiAo
IHAgPT09IFJlcGVhdFdyYXBwaW5nICkgcmV0dXJuIF9nbC5SRVBFQVQ7CisgICAgICAgICAgICBp
ZiAoIHAgPT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSByZXR1cm4gX2dsLkNMQU1QX1RPX0VER0U7
CisgICAgICAgICAgICBpZiAoIHAgPT09IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4g
X2dsLk1JUlJPUkVEX1JFUEVBVDsKKworICAgICAgICAgICAgaWYgKCBwID09PSBOZWFyZXN0Rmls
dGVyICkgcmV0dXJuIF9nbC5ORUFSRVNUOworICAgICAgICAgICAgaWYgKCBwID09PSBOZWFyZXN0
TWlwTWFwTmVhcmVzdEZpbHRlciApIHJldHVybiBfZ2wuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVDsK
KyAgICAgICAgICAgIGlmICggcCA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHJldHVy
biBfZ2wuTkVBUkVTVF9NSVBNQVBfTElORUFSOworCisgICAgICAgICAgICBpZiAoIHAgPT09IExp
bmVhckZpbHRlciApIHJldHVybiBfZ2wuTElORUFSOworICAgICAgICAgICAgaWYgKCBwID09PSBM
aW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIF9nbC5MSU5FQVJfTUlQTUFQX05FQVJF
U1Q7CisgICAgICAgICAgICBpZiAoIHAgPT09IExpbmVhck1pcE1hcExpbmVhckZpbHRlciApIHJl
dHVybiBfZ2wuTElORUFSX01JUE1BUF9MSU5FQVI7CisKKyAgICAgICAgICAgIGlmICggcCA9PT0g
VW5zaWduZWRCeXRlVHlwZSApIHJldHVybiBfZ2wuVU5TSUdORURfQllURTsKKyAgICAgICAgICAg
IGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlICkgcmV0dXJuIF9nbC5VTlNJR05FRF9T
SE9SVF80XzRfNF80OworICAgICAgICAgICAgaWYgKCBwID09PSBVbnNpZ25lZFNob3J0NTU1MVR5
cGUgKSByZXR1cm4gX2dsLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE7CisgICAgICAgICAgICBpZiAo
IHAgPT09IFVuc2lnbmVkU2hvcnQ1NjVUeXBlICkgcmV0dXJuIF9nbC5VTlNJR05FRF9TSE9SVF81
XzZfNTsKKworICAgICAgICAgICAgaWYgKCBwID09PSBCeXRlVHlwZSApIHJldHVybiBfZ2wuQllU
RTsKKyAgICAgICAgICAgIGlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIF9nbC5TSE9SVDsK
KyAgICAgICAgICAgIGlmICggcCA9PT0gVW5zaWduZWRTaG9ydFR5cGUgKSByZXR1cm4gX2dsLlVO
U0lHTkVEX1NIT1JUOworICAgICAgICAgICAgaWYgKCBwID09PSBJbnRUeXBlICkgcmV0dXJuIF9n
bC5JTlQ7CisgICAgICAgICAgICBpZiAoIHAgPT09IFVuc2lnbmVkSW50VHlwZSApIHJldHVybiBf
Z2wuVU5TSUdORURfSU5UOworICAgICAgICAgICAgaWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1
cm4gX2dsLkZMT0FUOworCisgICAgICAgICAgICBpZiAoIHAgPT09IEhhbGZGbG9hdFR5cGUgKSB7
CisKKyAgICAgICAgICAgICAgICBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ09FU190ZXh0
dXJlX2hhbGZfZmxvYXQnICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGV4dGVuc2lvbiAhPT0g
bnVsbCApIHJldHVybiBleHRlbnNpb24uSEFMRl9GTE9BVF9PRVM7CisKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgaWYgKCBwID09PSBBbHBoYUZvcm1hdCApIHJldHVybiBfZ2wuQUxQSEE7
CisgICAgICAgICAgICBpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiBfZ2wuUkdCOworICAg
ICAgICAgICAgaWYgKCBwID09PSBSR0JBRm9ybWF0ICkgcmV0dXJuIF9nbC5SR0JBOworICAgICAg
ICAgICAgaWYgKCBwID09PSBMdW1pbmFuY2VGb3JtYXQgKSByZXR1cm4gX2dsLkxVTUlOQU5DRTsK
KyAgICAgICAgICAgIGlmICggcCA9PT0gTHVtaW5hbmNlQWxwaGFGb3JtYXQgKSByZXR1cm4gX2ds
LkxVTUlOQU5DRV9BTFBIQTsKKyAgICAgICAgICAgIGlmICggcCA9PT0gRGVwdGhGb3JtYXQgKSBy
ZXR1cm4gX2dsLkRFUFRIX0NPTVBPTkVOVDsKKyAgICAgICAgICAgIGlmICggcCA9PT0gRGVwdGhT
dGVuY2lsRm9ybWF0ICkgcmV0dXJuIF9nbC5ERVBUSF9TVEVOQ0lMOworCisgICAgICAgICAgICBp
ZiAoIHAgPT09IEFkZEVxdWF0aW9uICkgcmV0dXJuIF9nbC5GVU5DX0FERDsKKyAgICAgICAgICAg
IGlmICggcCA9PT0gU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBfZ2wuRlVOQ19TVUJUUkFDVDsK
KyAgICAgICAgICAgIGlmICggcCA9PT0gUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gKSByZXR1cm4g
X2dsLkZVTkNfUkVWRVJTRV9TVUJUUkFDVDsKKworICAgICAgICAgICAgaWYgKCBwID09PSBaZXJv
RmFjdG9yICkgcmV0dXJuIF9nbC5aRVJPOworICAgICAgICAgICAgaWYgKCBwID09PSBPbmVGYWN0
b3IgKSByZXR1cm4gX2dsLk9ORTsKKyAgICAgICAgICAgIGlmICggcCA9PT0gU3JjQ29sb3JGYWN0
b3IgKSByZXR1cm4gX2dsLlNSQ19DT0xPUjsKKyAgICAgICAgICAgIGlmICggcCA9PT0gT25lTWlu
dXNTcmNDb2xvckZhY3RvciApIHJldHVybiBfZ2wuT05FX01JTlVTX1NSQ19DT0xPUjsKKyAgICAg
ICAgICAgIGlmICggcCA9PT0gU3JjQWxwaGFGYWN0b3IgKSByZXR1cm4gX2dsLlNSQ19BTFBIQTsK
KyAgICAgICAgICAgIGlmICggcCA9PT0gT25lTWludXNTcmNBbHBoYUZhY3RvciApIHJldHVybiBf
Z2wuT05FX01JTlVTX1NSQ19BTFBIQTsKKyAgICAgICAgICAgIGlmICggcCA9PT0gRHN0QWxwaGFG
YWN0b3IgKSByZXR1cm4gX2dsLkRTVF9BTFBIQTsKKyAgICAgICAgICAgIGlmICggcCA9PT0gT25l
TWludXNEc3RBbHBoYUZhY3RvciApIHJldHVybiBfZ2wuT05FX01JTlVTX0RTVF9BTFBIQTsKKwor
ICAgICAgICAgICAgaWYgKCBwID09PSBEc3RDb2xvckZhY3RvciApIHJldHVybiBfZ2wuRFNUX0NP
TE9SOworICAgICAgICAgICAgaWYgKCBwID09PSBPbmVNaW51c0RzdENvbG9yRmFjdG9yICkgcmV0
dXJuIF9nbC5PTkVfTUlOVVNfRFNUX0NPTE9SOworICAgICAgICAgICAgaWYgKCBwID09PSBTcmNB
bHBoYVNhdHVyYXRlRmFjdG9yICkgcmV0dXJuIF9nbC5TUkNfQUxQSEFfU0FUVVJBVEU7CisKKyAg
ICAgICAgICAgIGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9T
M1RDX0RYVDFfRm9ybWF0IHx8CisgICAgICAgICAgICAgICAgcCA9PT0gUkdCQV9TM1RDX0RYVDNf
Rm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHsKKworICAgICAgICAgICAg
ICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJl
X3MzdGMnICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHsK
KworICAgICAgICAgICAgICAgICAgICBpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkg
cmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUOworICAgICAgICAg
ICAgICAgICAgICBpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRl
bnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7CisgICAgICAgICAgICAgICAgICAg
IGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01Q
UkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwID09
PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdC
QV9TM1RDX0RYVDVfRVhUOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmICggcCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0g
UkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgfHwKKyAgICAgICAgICAgICAgICBwID09PSBSR0JBX1BW
UlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgewor
CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21w
cmVzc2VkX3RleHR1cmVfcHZydGMnICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGV4dGVuc2lv
biAhPT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHAgPT09IFJHQl9QVlJU
Q180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ180
QlBQVjFfSU1HOworICAgICAgICAgICAgICAgICAgICBpZiAoIHAgPT09IFJHQl9QVlJUQ18yQlBQ
VjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFf
SU1HOworICAgICAgICAgICAgICAgICAgICBpZiAoIHAgPT09IFJHQkFfUFZSVENfNEJQUFYxX0Zv
cm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUc7
CisgICAgICAgICAgICAgICAgICAgIGlmICggcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0
ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRzsKKwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHAg
PT09IFJHQl9FVEMxX0Zvcm1hdCApIHsKKworICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9IGV4
dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnICk7CisKKyAgICAg
ICAgICAgICAgICBpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uQ09N
UFJFU1NFRF9SR0JfRVRDMV9XRUJHTDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBp
ZiAoIHAgPT09IE1pbkVxdWF0aW9uIHx8IHAgPT09IE1heEVxdWF0aW9uICkgeworCisgICAgICAg
ICAgICAgICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyAp
OworCisgICAgICAgICAgICAgICAgaWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCBwID09PSBNaW5FcXVhdGlvbiApIHJldHVybiBleHRlbnNpb24u
TUlOX0VYVDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwID09PSBNYXhFcXVhdGlvbiApIHJl
dHVybiBleHRlbnNpb24uTUFYX0VYVDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHsKKwor
ICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVwdGhf
dGV4dHVyZScgKTsKKworICAgICAgICAgICAgICAgIGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkg
cmV0dXJuIGV4dGVuc2lvbi5VTlNJR05FRF9JTlRfMjRfOF9XRUJHTDsKKworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAv
KioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworICAgICAqIEBh
dXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAgICovCisKKyAg
ICBmdW5jdGlvbiBGb2dFeHAyICggY29sb3IsIGRlbnNpdHkgKSB7CisKKyAgICAgICAgdGhpcy5u
YW1lID0gJyc7CisKKyAgICAgICAgdGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTsKKyAg
ICAgICAgdGhpcy5kZW5zaXR5ID0gKCBkZW5zaXR5ICE9PSB1bmRlZmluZWQgKSA/IGRlbnNpdHkg
OiAwLjAwMDI1OworCisgICAgfQorCisgICAgRm9nRXhwMi5wcm90b3R5cGUuaXNGb2dFeHAyID0g
dHJ1ZTsKKworICAgIEZvZ0V4cDIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkgeworCisg
ICAgICAgIHJldHVybiBuZXcgRm9nRXhwMiggdGhpcy5jb2xvci5nZXRIZXgoKSwgdGhpcy5kZW5z
aXR5ICk7CisKKyAgICB9OworCisgICAgRm9nRXhwMi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rp
b24gKCBtZXRhICkgeworCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICB0eXBlOiAnRm9n
RXhwMicsCisgICAgICAgICAgICBjb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSwKKyAgICAgICAg
ICAgIGRlbnNpdHk6IHRoaXMuZGVuc2l0eQorICAgICAgICB9OworCisgICAgfTsKKworICAgIC8q
KgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1
dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKi8KKworICAg
IGZ1bmN0aW9uIEZvZyAoIGNvbG9yLCBuZWFyLCBmYXIgKSB7CisKKyAgICAgICAgdGhpcy5uYW1l
ID0gJyc7CisKKyAgICAgICAgdGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTsKKworICAg
ICAgICB0aGlzLm5lYXIgPSAoIG5lYXIgIT09IHVuZGVmaW5lZCApID8gbmVhciA6IDE7CisgICAg
ICAgIHRoaXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMTAwMDsKKworICAg
IH0KKworICAgIEZvZy5wcm90b3R5cGUuaXNGb2cgPSB0cnVlOworCisgICAgRm9nLnByb3RvdHlw
ZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHsKKworICAgICAgICByZXR1cm4gbmV3IEZvZyggdGhpcy5j
b2xvci5nZXRIZXgoKSwgdGhpcy5uZWFyLCB0aGlzLmZhciApOworCisgICAgfTsKKworICAgIEZv
Zy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCBtZXRhICkgeworCisgICAgICAgIHJldHVy
biB7CisgICAgICAgICAgICB0eXBlOiAnRm9nJywKKyAgICAgICAgICAgIGNvbG9yOiB0aGlzLmNv
bG9yLmdldEhleCgpLAorICAgICAgICAgICAgbmVhcjogdGhpcy5uZWFyLAorICAgICAgICAgICAg
ZmFyOiB0aGlzLmZhcgorICAgICAgICB9OworCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEBh
dXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlv
biBTY2VuZSAoKSB7CisKKyAgICAgICAgT2JqZWN0M0QuY2FsbCggdGhpcyApOworCisgICAgICAg
IHRoaXMudHlwZSA9ICdTY2VuZSc7CisKKyAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gbnVsbDsK
KyAgICAgICAgdGhpcy5mb2cgPSBudWxsOworICAgICAgICB0aGlzLm92ZXJyaWRlTWF0ZXJpYWwg
PSBudWxsOworCisgICAgICAgIHRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7IC8vIGNoZWNrZWQgYnkg
dGhlIHJlbmRlcmVyCisKKyAgICB9CisKKyAgICBTY2VuZS5wcm90b3R5cGUgPSBPYmplY3QuYXNz
aWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgeworCisgICAgICAgIGNv
bnN0cnVjdG9yOiBTY2VuZSwKKworICAgICAgICBjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVj
dXJzaXZlICkgeworCisgICAgICAgICAgICBPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0
aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApOworCisgICAgICAgICAgICBpZiAoIHNvdXJjZS5iYWNr
Z3JvdW5kICE9PSBudWxsICkgdGhpcy5iYWNrZ3JvdW5kID0gc291cmNlLmJhY2tncm91bmQuY2xv
bmUoKTsKKyAgICAgICAgICAgIGlmICggc291cmNlLmZvZyAhPT0gbnVsbCApIHRoaXMuZm9nID0g
c291cmNlLmZvZy5jbG9uZSgpOworICAgICAgICAgICAgaWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRl
cmlhbCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1h
dGVyaWFsLmNsb25lKCk7CisKKyAgICAgICAgICAgIHRoaXMuYXV0b1VwZGF0ZSA9IHNvdXJjZS5h
dXRvVXBkYXRlOworICAgICAgICAgICAgdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1h
dHJpeEF1dG9VcGRhdGU7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0s
CisKKyAgICAgICAgdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CisKKyAgICAgICAgICAgIHZh
ciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CisK
KyAgICAgICAgICAgIGlmICggdGhpcy5iYWNrZ3JvdW5kICE9PSBudWxsICkgZGF0YS5vYmplY3Qu
YmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZC50b0pTT04oIG1ldGEgKTsKKyAgICAgICAgICAg
IGlmICggdGhpcy5mb2cgIT09IG51bGwgKSBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pT
T04oKTsKKworICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisKKyAgICAgICAgfQorCisgICAgfSAp
OworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29t
by5zZS8KKyAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29t
LworICAgICAqLworCisgICAgZnVuY3Rpb24gTGVuc0ZsYXJlKCB0ZXh0dXJlLCBzaXplLCBkaXN0
YW5jZSwgYmxlbmRpbmcsIGNvbG9yICkgeworCisgICAgICAgIE9iamVjdDNELmNhbGwoIHRoaXMg
KTsKKworICAgICAgICB0aGlzLmxlbnNGbGFyZXMgPSBbXTsKKworICAgICAgICB0aGlzLnBvc2l0
aW9uU2NyZWVuID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgdGhpcy5jdXN0b21VcGRhdGVDYWxs
YmFjayA9IHVuZGVmaW5lZDsKKworICAgICAgICBpZiAoIHRleHR1cmUgIT09IHVuZGVmaW5lZCAp
IHsKKworICAgICAgICAgICAgdGhpcy5hZGQoIHRleHR1cmUsIHNpemUsIGRpc3RhbmNlLCBibGVu
ZGluZywgY29sb3IgKTsKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICBMZW5zRmxhcmUucHJv
dG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBl
ICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogTGVuc0ZsYXJlLAorCisgICAgICAgIGlzTGVu
c0ZsYXJlOiB0cnVlLAorCisgICAgICAgIGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisg
ICAgICAgICAgICBPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsK
KworICAgICAgICAgICAgdGhpcy5wb3NpdGlvblNjcmVlbi5jb3B5KCBzb3VyY2UucG9zaXRpb25T
Y3JlZW4gKTsKKyAgICAgICAgICAgIHRoaXMuY3VzdG9tVXBkYXRlQ2FsbGJhY2sgPSBzb3VyY2Uu
Y3VzdG9tVXBkYXRlQ2FsbGJhY2s7CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwgbCA9
IHNvdXJjZS5sZW5zRmxhcmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAg
ICAgICB0aGlzLmxlbnNGbGFyZXMucHVzaCggc291cmNlLmxlbnNGbGFyZXNbIGkgXSApOworCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisK
KyAgICAgICAgYWRkOiBmdW5jdGlvbiAoIHRleHR1cmUsIHNpemUsIGRpc3RhbmNlLCBibGVuZGlu
ZywgY29sb3IsIG9wYWNpdHkgKSB7CisKKyAgICAgICAgICAgIGlmICggc2l6ZSA9PT0gdW5kZWZp
bmVkICkgc2l6ZSA9IC0gMTsKKyAgICAgICAgICAgIGlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5l
ZCApIGRpc3RhbmNlID0gMDsKKyAgICAgICAgICAgIGlmICggb3BhY2l0eSA9PT0gdW5kZWZpbmVk
ICkgb3BhY2l0eSA9IDE7CisgICAgICAgICAgICBpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSBj
b2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsKKyAgICAgICAgICAgIGlmICggYmxlbmRpbmcg
PT09IHVuZGVmaW5lZCApIGJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7CisKKyAgICAgICAgICAg
IGRpc3RhbmNlID0gTWF0aC5taW4oIGRpc3RhbmNlLCBNYXRoLm1heCggMCwgZGlzdGFuY2UgKSAp
OworCisgICAgICAgICAgICB0aGlzLmxlbnNGbGFyZXMucHVzaCggeworICAgICAgICAgICAgICAg
IHRleHR1cmU6IHRleHR1cmUsICAgLy8gVEhSRUUuVGV4dHVyZQorICAgICAgICAgICAgICAgIHNp
emU6IHNpemUsICAgICAgICAgLy8gc2l6ZSBpbiBwaXhlbHMgKC0xID0gdXNlIHRleHR1cmUud2lk
dGgpCisgICAgICAgICAgICAgICAgZGlzdGFuY2U6IGRpc3RhbmNlLCAgICAgLy8gZGlzdGFuY2Ug
KDAtMSkgZnJvbSBsaWdodCBzb3VyY2UgKDA9YXQgbGlnaHQgc291cmNlKQorICAgICAgICAgICAg
ICAgIHg6IDAsIHk6IDAsIHo6IDAsICAgLy8gc2NyZWVuIHBvc2l0aW9uICgtMSA9PiAxKSB6ID0g
MCBpcyBpbiBmcm9udCB6ID0gMSBpcyBiYWNrCisgICAgICAgICAgICAgICAgc2NhbGU6IDEsICAg
ICAgIC8vIHNjYWxlCisgICAgICAgICAgICAgICAgcm90YXRpb246IDAsICAgICAgICAvLyByb3Rh
dGlvbgorICAgICAgICAgICAgICAgIG9wYWNpdHk6IG9wYWNpdHksICAgLy8gb3BhY2l0eQorICAg
ICAgICAgICAgICAgIGNvbG9yOiBjb2xvciwgICAgICAgLy8gY29sb3IKKyAgICAgICAgICAgICAg
ICBibGVuZGluZzogYmxlbmRpbmcgIC8vIGJsZW5kaW5nCisgICAgICAgICAgICB9ICk7CisKKyAg
ICAgICAgfSwKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgbGVucyBmbGFyZXMgdXBk
YXRlIHBvc2l0aW9ucyBvbiBhbGwgZmxhcmVzIGJhc2VkIG9uIHRoZSBzY3JlZW4gcG9zaXRpb24K
KyAgICAgICAgICogU2V0IG15TGVuc0ZsYXJlLmN1c3RvbVVwZGF0ZUNhbGxiYWNrIHRvIGFsdGVy
IHRoZSBmbGFyZXMgaW4geW91ciBwcm9qZWN0IHNwZWNpZmljIHdheS4KKyAgICAgICAgICovCisK
KyAgICAgICAgdXBkYXRlTGVuc0ZsYXJlczogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2
YXIgZiwgZmwgPSB0aGlzLmxlbnNGbGFyZXMubGVuZ3RoOworICAgICAgICAgICAgdmFyIGZsYXJl
OworICAgICAgICAgICAgdmFyIHZlY1ggPSAtIHRoaXMucG9zaXRpb25TY3JlZW4ueCAqIDI7Cisg
ICAgICAgICAgICB2YXIgdmVjWSA9IC0gdGhpcy5wb3NpdGlvblNjcmVlbi55ICogMjsKKworICAg
ICAgICAgICAgZm9yICggZiA9IDA7IGYgPCBmbDsgZiArKyApIHsKKworICAgICAgICAgICAgICAg
IGZsYXJlID0gdGhpcy5sZW5zRmxhcmVzWyBmIF07CisKKyAgICAgICAgICAgICAgICBmbGFyZS54
ID0gdGhpcy5wb3NpdGlvblNjcmVlbi54ICsgdmVjWCAqIGZsYXJlLmRpc3RhbmNlOworICAgICAg
ICAgICAgICAgIGZsYXJlLnkgPSB0aGlzLnBvc2l0aW9uU2NyZWVuLnkgKyB2ZWNZICogZmxhcmUu
ZGlzdGFuY2U7CisKKyAgICAgICAgICAgICAgICBmbGFyZS53YW50ZWRSb3RhdGlvbiA9IGZsYXJl
LnggKiBNYXRoLlBJICogMC4yNTsKKyAgICAgICAgICAgICAgICBmbGFyZS5yb3RhdGlvbiArPSAo
IGZsYXJlLndhbnRlZFJvdGF0aW9uIC0gZmxhcmUucm90YXRpb24gKSAqIDAuMjU7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0
aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworICAgICAqCisgICAgICog
cGFyYW1ldGVycyA9IHsKKyAgICAgKiAgY29sb3I6IDxoZXg+LAorICAgICAqICBvcGFjaXR5OiA8
ZmxvYXQ+LAorICAgICAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisgICAg
ICoKKyAgICAgKiAgdXZPZmZzZXQ6IG5ldyBUSFJFRS5WZWN0b3IyKCksCisgICAgICogIHV2U2Nh
bGU6IG5ldyBUSFJFRS5WZWN0b3IyKCkKKyAgICAgKiB9CisgICAgICovCisKKyAgICBmdW5jdGlv
biBTcHJpdGVNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKKworICAgICAgICBNYXRlcmlhbC5jYWxs
KCB0aGlzICk7CisKKyAgICAgICAgdGhpcy50eXBlID0gJ1Nwcml0ZU1hdGVyaWFsJzsKKworICAg
ICAgICB0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOworICAgICAgICB0aGlzLm1h
cCA9IG51bGw7CisKKyAgICAgICAgdGhpcy5yb3RhdGlvbiA9IDA7CisKKyAgICAgICAgdGhpcy5m
b2cgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5saWdodHMgPSBmYWxzZTsKKworICAgICAgICB0aGlz
LnNldFZhbHVlcyggcGFyYW1ldGVycyApOworCisgICAgfQorCisgICAgU3ByaXRlTWF0ZXJpYWwu
cHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CisgICAgU3By
aXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ByaXRlTWF0ZXJpYWw7CisgICAg
U3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmlzU3ByaXRlTWF0ZXJpYWwgPSB0cnVlOworCisgICAg
U3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKwor
ICAgICAgICBNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKwor
ICAgICAgICB0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworICAgICAgICB0aGlzLm1h
cCA9IHNvdXJjZS5tYXA7CisKKyAgICAgICAgdGhpcy5yb3RhdGlvbiA9IHNvdXJjZS5yb3RhdGlv
bjsKKworICAgICAgICByZXR1cm4gdGhpczsKKworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBA
YXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLworICAgICAqIEBhdXRob3Ig
YWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAgICovCisKKyAgICBmdW5j
dGlvbiBTcHJpdGUoIG1hdGVyaWFsICkgeworCisgICAgICAgIE9iamVjdDNELmNhbGwoIHRoaXMg
KTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnU3ByaXRlJzsKKworICAgICAgICB0aGlzLm1hdGVy
aWFsID0gKCBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbCA6IG5ldyBTcHJpdGVN
YXRlcmlhbCgpOworCisgICAgfQorCisgICAgU3ByaXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3Np
Z24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CisKKyAgICAgICAgY29u
c3RydWN0b3I6IFNwcml0ZSwKKworICAgICAgICBpc1Nwcml0ZTogdHJ1ZSwKKworICAgICAgICBy
YXljYXN0OiAoIGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIGludGVyc2VjdFBvaW50
ID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAgIHZhciB3b3JsZFBvc2l0aW9uID0gbmV3IFZl
Y3RvcjMoKTsKKyAgICAgICAgICAgIHZhciB3b3JsZFNjYWxlID0gbmV3IFZlY3RvcjMoKTsKKwor
ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0
cyApIHsKKworICAgICAgICAgICAgICAgIHdvcmxkUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0
aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7CisgICAgICAgICAgICAgICAgcmF5Y2FzdGVyLnJheS5j
bG9zZXN0UG9pbnRUb1BvaW50KCB3b3JsZFBvc2l0aW9uLCBpbnRlcnNlY3RQb2ludCApOworCisg
ICAgICAgICAgICAgICAgd29ybGRTY2FsZS5zZXRGcm9tTWF0cml4U2NhbGUoIHRoaXMubWF0cml4
V29ybGQgKTsKKyAgICAgICAgICAgICAgICB2YXIgZ3Vlc3NTaXplU3EgPSB3b3JsZFNjYWxlLngg
KiB3b3JsZFNjYWxlLnkgLyA0OworCisgICAgICAgICAgICAgICAgaWYgKCB3b3JsZFBvc2l0aW9u
LmRpc3RhbmNlVG9TcXVhcmVkKCBpbnRlcnNlY3RQb2ludCApID4gZ3Vlc3NTaXplU3EgKSByZXR1
cm47CisKKyAgICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdp
bi5kaXN0YW5jZVRvKCBpbnRlcnNlY3RQb2ludCApOworCisgICAgICAgICAgICAgICAgaWYgKCBk
aXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJl
dHVybjsKKworICAgICAgICAgICAgICAgIGludGVyc2VjdHMucHVzaCggeworCisgICAgICAgICAg
ICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgcG9pbnQ6
IGludGVyc2VjdFBvaW50LmNsb25lKCksCisgICAgICAgICAgICAgICAgICAgIGZhY2U6IG51bGws
CisgICAgICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcworCisgICAgICAgICAgICAgICAgfSAp
OworCisgICAgICAgICAgICB9OworCisgICAgICAgIH0oKSApLAorCisgICAgICAgIGNsb25lOiBm
dW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcigg
dGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisK
KyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNl
LworICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisg
ICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAg
IGZ1bmN0aW9uIExPRCgpIHsKKworICAgICAgICBPYmplY3QzRC5jYWxsKCB0aGlzICk7CisKKyAg
ICAgICAgdGhpcy50eXBlID0gJ0xPRCc7CisKKyAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRp
ZXMoIHRoaXMsIHsKKyAgICAgICAgICAgIGxldmVsczogeworICAgICAgICAgICAgICAgIGVudW1l
cmFibGU6IHRydWUsCisgICAgICAgICAgICAgICAgdmFsdWU6IFtdCisgICAgICAgICAgICB9Cisg
ICAgICAgIH0gKTsKKworICAgIH0KKworICAgIExPRC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWdu
KCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgeworCisgICAgICAgIGNvbnN0
cnVjdG9yOiBMT0QsCisKKyAgICAgICAgY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKyAg
ICAgICAgICAgIE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgZmFs
c2UgKTsKKworICAgICAgICAgICAgdmFyIGxldmVscyA9IHNvdXJjZS5sZXZlbHM7CisKKyAgICAg
ICAgICAgIGZvciAoIHZhciBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkg
eworCisgICAgICAgICAgICAgICAgdmFyIGxldmVsID0gbGV2ZWxzWyBpIF07CisKKyAgICAgICAg
ICAgICAgICB0aGlzLmFkZExldmVsKCBsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFu
Y2UgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAg
ICAgICB9LAorCisgICAgICAgIGFkZExldmVsOiBmdW5jdGlvbiAoIG9iamVjdCwgZGlzdGFuY2Ug
KSB7CisKKyAgICAgICAgICAgIGlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3RhbmNl
ID0gMDsKKworICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyggZGlzdGFuY2UgKTsKKwor
ICAgICAgICAgICAgdmFyIGxldmVscyA9IHRoaXMubGV2ZWxzOworCisgICAgICAgICAgICBmb3Ig
KCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkgeworCisgICAgICAgICAgICAg
ICAgaWYgKCBkaXN0YW5jZSA8IGxldmVsc1sgbCBdLmRpc3RhbmNlICkgeworCisgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGxldmVscy5zcGxpY2UoIGwsIDAsIHsgZGlzdGFuY2U6IGRpc3RhbmNlLCBv
YmplY3Q6IG9iamVjdCB9ICk7CisKKyAgICAgICAgICAgIHRoaXMuYWRkKCBvYmplY3QgKTsKKwor
ICAgICAgICB9LAorCisgICAgICAgIGdldE9iamVjdEZvckRpc3RhbmNlOiBmdW5jdGlvbiAoIGRp
c3RhbmNlICkgeworCisgICAgICAgICAgICB2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7CisKKyAg
ICAgICAgICAgIGZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsr
ICkgeworCisgICAgICAgICAgICAgICAgaWYgKCBkaXN0YW5jZSA8IGxldmVsc1sgaSBdLmRpc3Rh
bmNlICkgeworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBsZXZlbHNbIGkgLSAxIF0u
b2JqZWN0OworCisgICAgICAgIH0sCisKKyAgICAgICAgcmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7
CisKKyAgICAgICAgICAgIHZhciBtYXRyaXhQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CisKKyAg
ICAgICAgICAgIHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMg
KSB7CisKKyAgICAgICAgICAgICAgICBtYXRyaXhQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRp
b24oIHRoaXMubWF0cml4V29ybGQgKTsKKworICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9
IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIG1hdHJpeFBvc2l0aW9uICk7CisKKyAg
ICAgICAgICAgICAgICB0aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKCBkaXN0YW5jZSApLnJheWNh
c3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApOworCisgICAgICAgICAgICB9OworCisgICAgICAg
IH0oKSApLAorCisgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2
YXIgdjEgPSBuZXcgVmVjdG9yMygpOworICAgICAgICAgICAgdmFyIHYyID0gbmV3IFZlY3RvcjMo
KTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkgeworCisg
ICAgICAgICAgICAgICAgdmFyIGxldmVscyA9IHRoaXMubGV2ZWxzOworCisgICAgICAgICAgICAg
ICAgaWYgKCBsZXZlbHMubGVuZ3RoID4gMSApIHsKKworICAgICAgICAgICAgICAgICAgICB2MS5z
ZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApOworICAgICAgICAgICAg
ICAgICAgICB2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTsKKwor
ICAgICAgICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSB2MS5kaXN0YW5jZVRvKCB2MiApOwor
CisgICAgICAgICAgICAgICAgICAgIGxldmVsc1sgMCBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTsK
KworICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3Ro
OyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkaXN0YW5j
ZSA+PSBsZXZlbHNbIGkgXS5kaXN0YW5jZSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGxldmVsc1sgaSAtIDEgXS5vYmplY3QudmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoIDsgaSA8IGw7IGkgKysgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gZmFs
c2U7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICB0b0pTT046IGZ1bmN0aW9uICgg
bWV0YSApIHsKKworICAgICAgICAgICAgdmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9K
U09OLmNhbGwoIHRoaXMsIG1ldGEgKTsKKworICAgICAgICAgICAgZGF0YS5vYmplY3QubGV2ZWxz
ID0gW107CisKKyAgICAgICAgICAgIHZhciBsZXZlbHMgPSB0aGlzLmxldmVsczsKKworICAgICAg
ICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7
CisKKyAgICAgICAgICAgICAgICB2YXIgbGV2ZWwgPSBsZXZlbHNbIGkgXTsKKworICAgICAgICAg
ICAgICAgIGRhdGEub2JqZWN0LmxldmVscy5wdXNoKCB7CisgICAgICAgICAgICAgICAgICAgIG9i
amVjdDogbGV2ZWwub2JqZWN0LnV1aWQsCisgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBs
ZXZlbC5kaXN0YW5jZQorICAgICAgICAgICAgICAgIH0gKTsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICByZXR1cm4gZGF0YTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAv
KioKKyAgICAgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLworICAg
ICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAgICog
QGF1dGhvciBtaWNoYWVsIGd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb20KKyAg
ICAgKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb20KKyAgICAgKi8KKworICAgIGZ1
bmN0aW9uIFNrZWxldG9uKCBib25lcywgYm9uZUludmVyc2VzICkgeworCisgICAgICAgIC8vIGNv
cHkgdGhlIGJvbmUgYXJyYXkKKworICAgICAgICBib25lcyA9IGJvbmVzIHx8IFtdOworCisgICAg
ICAgIHRoaXMuYm9uZXMgPSBib25lcy5zbGljZSggMCApOworICAgICAgICB0aGlzLmJvbmVNYXRy
aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHRoaXMuYm9uZXMubGVuZ3RoICogMTYgKTsKKworICAg
ICAgICAvLyB1c2UgdGhlIHN1cHBsaWVkIGJvbmUgaW52ZXJzZXMgb3IgY2FsY3VsYXRlIHRoZSBp
bnZlcnNlcworCisgICAgICAgIGlmICggYm9uZUludmVyc2VzID09PSB1bmRlZmluZWQgKSB7CisK
KyAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSW52ZXJzZXMoKTsKKworICAgICAgICB9IGVsc2Ug
eworCisgICAgICAgICAgICBpZiAoIHRoaXMuYm9uZXMubGVuZ3RoID09PSBib25lSW52ZXJzZXMu
bGVuZ3RoICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5ib25lSW52ZXJzZXMgPSBib25lSW52
ZXJzZXMuc2xpY2UoIDAgKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAg
ICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uIGJvbmVJbnZlcnNlcyBpcyB0aGUgd3Jv
bmcgbGVuZ3RoLicgKTsKKworICAgICAgICAgICAgICAgIHRoaXMuYm9uZUludmVyc2VzID0gW107
CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5n
dGg7IGkgPCBpbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLmJvbmVJbnZl
cnNlcy5wdXNoKCBuZXcgTWF0cml4NCgpICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICBPYmplY3QuYXNzaWduKCBTa2Vs
ZXRvbi5wcm90b3R5cGUsIHsKKworICAgICAgICBjYWxjdWxhdGVJbnZlcnNlczogZnVuY3Rpb24g
KCkgeworCisgICAgICAgICAgICB0aGlzLmJvbmVJbnZlcnNlcyA9IFtdOworCisgICAgICAgICAg
ICBmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyAp
IHsKKworICAgICAgICAgICAgICAgIHZhciBpbnZlcnNlID0gbmV3IE1hdHJpeDQoKTsKKworICAg
ICAgICAgICAgICAgIGlmICggdGhpcy5ib25lc1sgaSBdICkgeworCisgICAgICAgICAgICAgICAg
ICAgIGludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5ib25lc1sgaSBdLm1hdHJpeFdvcmxkICk7CisK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLmJvbmVJbnZlcnNlcy5w
dXNoKCBpbnZlcnNlICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9LAorCisgICAgICAg
IHBvc2U6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIGJvbmUsIGksIGlsOworCisg
ICAgICAgICAgICAvLyByZWNvdmVyIHRoZSBiaW5kLXRpbWUgd29ybGQgbWF0cmljZXMKKworICAg
ICAgICAgICAgZm9yICggaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSAr
KyApIHsKKworICAgICAgICAgICAgICAgIGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07CisKKyAgICAg
ICAgICAgICAgICBpZiAoIGJvbmUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgYm9uZS5tYXRy
aXhXb3JsZC5nZXRJbnZlcnNlKCB0aGlzLmJvbmVJbnZlcnNlc1sgaSBdICk7CisKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUg
bG9jYWwgbWF0cmljZXMsIHBvc2l0aW9ucywgcm90YXRpb25zIGFuZCBzY2FsZXMKKworICAgICAg
ICAgICAgZm9yICggaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyAp
IHsKKworICAgICAgICAgICAgICAgIGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07CisKKyAgICAgICAg
ICAgICAgICBpZiAoIGJvbmUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBib25lLnBh
cmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IGJvbmUubWF0cml4LmdldEludmVyc2UoIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxkICk7CisgICAg
ICAgICAgICAgICAgICAgICAgICBib25lLm1hdHJpeC5tdWx0aXBseSggYm9uZS5tYXRyaXhXb3Js
ZCApOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGJvbmUubWF0cml4LmNvcHkoIGJvbmUubWF0cml4V29ybGQgKTsKKworICAgICAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYm9uZS5tYXRyaXguZGVjb21wb3Nl
KCBib25lLnBvc2l0aW9uLCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTsKKworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAgdXBk
YXRlOiAoIGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIG9mZnNldE1hdHJpeCA9IG5l
dyBNYXRyaXg0KCk7CisgICAgICAgICAgICB2YXIgaWRlbnRpdHlNYXRyaXggPSBuZXcgTWF0cml4
NCgpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkgeworCisgICAgICAg
ICAgICAgICAgdmFyIGJvbmVzID0gdGhpcy5ib25lczsKKyAgICAgICAgICAgICAgICB2YXIgYm9u
ZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7CisgICAgICAgICAgICAgICAgdmFyIGJvbmVN
YXRyaWNlcyA9IHRoaXMuYm9uZU1hdHJpY2VzOworICAgICAgICAgICAgICAgIHZhciBib25lVGV4
dHVyZSA9IHRoaXMuYm9uZVRleHR1cmU7CisKKyAgICAgICAgICAgICAgICAvLyBmbGF0dGVuIGJv
bmUgbWF0cmljZXMgdG8gYXJyYXkKKworICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwg
aWwgPSBib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAg
ICAvLyBjb21wdXRlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIG9yaWdp
bmFsIHRyYW5zZm9ybQorCisgICAgICAgICAgICAgICAgICAgIHZhciBtYXRyaXggPSBib25lc1sg
aSBdID8gYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCA6IGlkZW50aXR5TWF0cml4OworCisgICAgICAg
ICAgICAgICAgICAgIG9mZnNldE1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIGJvbmVJ
bnZlcnNlc1sgaSBdICk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldE1hdHJpeC50b0FycmF5
KCBib25lTWF0cmljZXMsIGkgKiAxNiApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgaWYgKCBib25lVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAg
ICAgICAgICAgIGJvbmVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgfTsKKworICAgICAgICB9ICkoKSwKKworICAgICAgICBjbG9u
ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICByZXR1cm4gbmV3IFNrZWxldG9uKCB0aGlz
LmJvbmVzLCB0aGlzLmJvbmVJbnZlcnNlcyApOworCisgICAgICAgIH0KKworICAgIH0gKTsKKwor
ICAgIC8qKgorICAgICAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2Uv
CisgICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAg
ICAgKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb20KKyAgICAgKi8KKworICAgIGZ1
bmN0aW9uIEJvbmUoKSB7CisKKyAgICAgICAgT2JqZWN0M0QuY2FsbCggdGhpcyApOworCisgICAg
ICAgIHRoaXMudHlwZSA9ICdCb25lJzsKKworICAgIH0KKworICAgIEJvbmUucHJvdG90eXBlID0g
T2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKKwor
ICAgICAgICBjb25zdHJ1Y3RvcjogQm9uZSwKKworICAgICAgICBpc0JvbmU6IHRydWUKKworICAg
IH0gKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDov
L2dvbW8uc2UvCisgICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlh
LmNvbS8KKyAgICAgKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb20KKyAgICAgKi8K
KworICAgIGZ1bmN0aW9uIFNraW5uZWRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7CisKKyAg
ICAgICAgTWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKKworICAgICAgICB0
aGlzLnR5cGUgPSAnU2tpbm5lZE1lc2gnOworCisgICAgICAgIHRoaXMuYmluZE1vZGUgPSAnYXR0
YWNoZWQnOworICAgICAgICB0aGlzLmJpbmRNYXRyaXggPSBuZXcgTWF0cml4NCgpOworICAgICAg
ICB0aGlzLmJpbmRNYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTsKKworICAgICAgICB2YXIg
Ym9uZXMgPSB0aGlzLmluaXRCb25lcygpOworICAgICAgICB2YXIgc2tlbGV0b24gPSBuZXcgU2tl
bGV0b24oIGJvbmVzICk7CisKKyAgICAgICAgdGhpcy5iaW5kKCBza2VsZXRvbiwgdGhpcy5tYXRy
aXhXb3JsZCApOworCisgICAgICAgIHRoaXMubm9ybWFsaXplU2tpbldlaWdodHMoKTsKKworICAg
IH0KKworICAgIFNraW5uZWRNZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5j
cmVhdGUoIE1lc2gucHJvdG90eXBlICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogU2tpbm5l
ZE1lc2gsCisKKyAgICAgICAgaXNTa2lubmVkTWVzaDogdHJ1ZSwKKworICAgICAgICBpbml0Qm9u
ZXM6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIGJvbmVzID0gW10sIGJvbmUsIGdi
b25lOworICAgICAgICAgICAgdmFyIGksIGlsOworCisgICAgICAgICAgICBpZiAoIHRoaXMuZ2Vv
bWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5ib25lcyAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAg
ICAgICAgICAgLy8gZmlyc3QsIGNyZWF0ZSBhcnJheSBvZiAnQm9uZScgb2JqZWN0cyBmcm9tIGdl
b21ldHJ5IGRhdGEKKworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuZ2Vv
bWV0cnkuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgZ2JvbmUgPSB0aGlzLmdlb21ldHJ5LmJvbmVzWyBpIF07CisKKyAgICAgICAgICAgICAgICAg
ICAgLy8gY3JlYXRlIG5ldyAnQm9uZScgb2JqZWN0CisKKyAgICAgICAgICAgICAgICAgICAgYm9u
ZSA9IG5ldyBCb25lKCk7CisgICAgICAgICAgICAgICAgICAgIGJvbmVzLnB1c2goIGJvbmUgKTsK
KworICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB2YWx1ZXMKKworICAgICAgICAgICAgICAg
ICAgICBib25lLm5hbWUgPSBnYm9uZS5uYW1lOworICAgICAgICAgICAgICAgICAgICBib25lLnBv
c2l0aW9uLmZyb21BcnJheSggZ2JvbmUucG9zICk7CisgICAgICAgICAgICAgICAgICAgIGJvbmUu
cXVhdGVybmlvbi5mcm9tQXJyYXkoIGdib25lLnJvdHEgKTsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKCBnYm9uZS5zY2wgIT09IHVuZGVmaW5lZCApIGJvbmUuc2NhbGUuZnJvbUFycmF5KCBnYm9u
ZS5zY2wgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHNlY29u
ZCwgY3JlYXRlIGJvbmUgaGllcmFyY2h5CisKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMCwg
aWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgeworCisgICAg
ICAgICAgICAgICAgICAgIGdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdOworCisgICAg
ICAgICAgICAgICAgICAgIGlmICggKCBnYm9uZS5wYXJlbnQgIT09IC0gMSApICYmICggZ2JvbmUu
cGFyZW50ICE9PSBudWxsICkgJiYgKCBib25lc1sgZ2JvbmUucGFyZW50IF0gIT09IHVuZGVmaW5l
ZCApICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGJvbmVzIGlu
IHRoZSBoaWVyYXJjaHkKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9uZXNbIGdib25lLnBh
cmVudCBdLmFkZCggYm9uZXNbIGkgXSApOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvcG1vc3QgYm9uZSwgaW1tZWRpYXRlIGNo
aWxkIG9mIHRoZSBza2lubmVkIG1lc2gKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5h
ZGQoIGJvbmVzWyBpIF0gKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm93IHRoZSBib25lcyBh
cmUgcGFydCBvZiB0aGUgc2NlbmUgZ3JhcGggYW5kIGNoaWxkcmVuIG9mIHRoZSBza2lubmVkIG1l
c2guCisgICAgICAgICAgICAvLyBsZXQncyB1cGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cmlj
ZXMKKworICAgICAgICAgICAgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApOworCisgICAg
ICAgICAgICByZXR1cm4gYm9uZXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBiaW5kOiBmdW5j
dGlvbiAoIHNrZWxldG9uLCBiaW5kTWF0cml4ICkgeworCisgICAgICAgICAgICB0aGlzLnNrZWxl
dG9uID0gc2tlbGV0b247CisKKyAgICAgICAgICAgIGlmICggYmluZE1hdHJpeCA9PT0gdW5kZWZp
bmVkICkgeworCisgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSAp
OworCisgICAgICAgICAgICAgICAgdGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpOwor
CisgICAgICAgICAgICAgICAgYmluZE1hdHJpeCA9IHRoaXMubWF0cml4V29ybGQ7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5iaW5kTWF0cml4LmNvcHkoIGJpbmRNYXRyaXgg
KTsKKyAgICAgICAgICAgIHRoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggYmluZE1h
dHJpeCApOworCisgICAgICAgIH0sCisKKyAgICAgICAgcG9zZTogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICB0aGlzLnNrZWxldG9uLnBvc2UoKTsKKworICAgICAgICB9LAorCisgICAgICAg
IG5vcm1hbGl6ZVNraW5XZWlnaHRzOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciBz
Y2FsZSwgaTsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmdlb21ldHJ5ICYmIHRoaXMuZ2VvbWV0
cnkuaXNHZW9tZXRyeSApIHsKKworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgdGhp
cy5nZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGg7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgdmFyIHN3ID0gdGhpcy5nZW9tZXRyeS5za2luV2VpZ2h0c1sgaSBdOworCisgICAgICAg
ICAgICAgICAgICAgIHNjYWxlID0gMS4wIC8gc3cubGVuZ3RoTWFuaGF0dGFuKCk7CisKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCBzY2FsZSAhPT0gSW5maW5pdHkgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHN3Lm11bHRpcGx5U2NhbGFyKCBzY2FsZSApOworCisgICAgICAgICAgICAg
ICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3LnNldCggMSwgMCwg
MCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZQorCisgICAgICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmICggdGhpcy5n
ZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisKKyAgICAgICAg
ICAgICAgICB2YXIgdmVjID0gbmV3IFZlY3RvcjQoKTsKKworICAgICAgICAgICAgICAgIHZhciBz
a2luV2VpZ2h0ID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQ7CisKKyAgICAg
ICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHNraW5XZWlnaHQuY291bnQ7IGkgKysgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgdmVjLnggPSBza2luV2VpZ2h0LmdldFgoIGkgKTsKKyAgICAg
ICAgICAgICAgICAgICAgdmVjLnkgPSBza2luV2VpZ2h0LmdldFkoIGkgKTsKKyAgICAgICAgICAg
ICAgICAgICAgdmVjLnogPSBza2luV2VpZ2h0LmdldFooIGkgKTsKKyAgICAgICAgICAgICAgICAg
ICAgdmVjLncgPSBza2luV2VpZ2h0LmdldFcoIGkgKTsKKworICAgICAgICAgICAgICAgICAgICBz
Y2FsZSA9IDEuMCAvIHZlYy5sZW5ndGhNYW5oYXR0YW4oKTsKKworICAgICAgICAgICAgICAgICAg
ICBpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
dmVjLm11bHRpcGx5U2NhbGFyKCBzY2FsZSApOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxz
ZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlYy5zZXQoIDEsIDAsIDAsIDAgKTsgLy8g
ZG8gc29tZXRoaW5nIHJlYXNvbmFibGUKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICAgICAgc2tpbldlaWdodC5zZXRYWVpXKCBpLCB2ZWMueCwgdmVjLnksIHZlYy56
LCB2ZWMudyApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgfSwKKworICAgICAgICB1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHsK
KworICAgICAgICAgICAgTWVzaC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhp
cywgZm9yY2UgKTsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmJpbmRNb2RlID09PSAnYXR0YWNo
ZWQnICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZl
cnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHRoaXMu
YmluZE1vZGUgPT09ICdkZXRhY2hlZCcgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLmJpbmRN
YXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMuYmluZE1hdHJpeCApOworCisgICAgICAgICAg
ICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuU2tpbm5l
ZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogJyArIHRoaXMuYmluZE1vZGUgKTsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsK
KworICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5
LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApOworCisgICAgICAgIH0KKworICAgIH0gKTsK
KworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisg
ICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAg
KgorICAgICAqIHBhcmFtZXRlcnMgPSB7CisgICAgICogIGNvbG9yOiA8aGV4PiwKKyAgICAgKiAg
b3BhY2l0eTogPGZsb2F0PiwKKyAgICAgKgorICAgICAqICBsaW5ld2lkdGg6IDxmbG9hdD4sCisg
ICAgICogIGxpbmVjYXA6ICJyb3VuZCIsCisgICAgICogIGxpbmVqb2luOiAicm91bmQiCisgICAg
ICogfQorICAgICAqLworCisgICAgZnVuY3Rpb24gTGluZUJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRl
cnMgKSB7CisKKyAgICAgICAgTWF0ZXJpYWwuY2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMu
dHlwZSA9ICdMaW5lQmFzaWNNYXRlcmlhbCc7CisKKyAgICAgICAgdGhpcy5jb2xvciA9IG5ldyBD
b2xvciggMHhmZmZmZmYgKTsKKworICAgICAgICB0aGlzLmxpbmV3aWR0aCA9IDE7CisgICAgICAg
IHRoaXMubGluZWNhcCA9ICdyb3VuZCc7CisgICAgICAgIHRoaXMubGluZWpvaW4gPSAncm91bmQn
OworCisgICAgICAgIHRoaXMubGlnaHRzID0gZmFsc2U7CisKKyAgICAgICAgdGhpcy5zZXRWYWx1
ZXMoIHBhcmFtZXRlcnMgKTsKKworICAgIH0KKworICAgIExpbmVCYXNpY01hdGVyaWFsLnByb3Rv
dHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOworICAgIExpbmVCYXNp
Y01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVCYXNpY01hdGVyaWFsOworCisg
ICAgTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWwgPSB0cnVl
OworCisgICAgTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNv
dXJjZSApIHsKKworICAgICAgICBNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBz
b3VyY2UgKTsKKworICAgICAgICB0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworCisg
ICAgICAgIHRoaXMubGluZXdpZHRoID0gc291cmNlLmxpbmV3aWR0aDsKKyAgICAgICAgdGhpcy5s
aW5lY2FwID0gc291cmNlLmxpbmVjYXA7CisgICAgICAgIHRoaXMubGluZWpvaW4gPSBzb3VyY2Uu
bGluZWpvaW47CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICB9OworCisgICAgLyoqCisg
ICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAg
IGZ1bmN0aW9uIExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCwgbW9kZSApIHsKKworICAgICAgICBp
ZiAoIG1vZGUgPT09IDEgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkxp
bmU6IHBhcmFtZXRlciBUSFJFRS5MaW5lUGllY2VzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIENyZWF0
ZWQgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuJyApOworICAgICAgICAgICAgcmV0dXJuIG5l
dyBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApOworCisgICAgICAgIH0KKworICAg
ICAgICBPYmplY3QzRC5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhpcy50eXBlID0gJ0xpbmUn
OworCisgICAgICAgIHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2Vv
bWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKyAgICAgICAgdGhpcy5tYXRlcmlhbCA9IG1h
dGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCgg
eyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTsKKworICAgIH0KKworICAgIExp
bmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJv
dG90eXBlICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogTGluZSwKKworICAgICAgICBpc0xp
bmU6IHRydWUsCisKKyAgICAgICAgcmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAg
ICAgIHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKKyAgICAgICAgICAgIHZhciBy
YXkgPSBuZXcgUmF5KCk7CisgICAgICAgICAgICB2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpOwor
CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNl
Y3RzICkgeworCisgICAgICAgICAgICAgICAgdmFyIHByZWNpc2lvbiA9IHJheWNhc3Rlci5saW5l
UHJlY2lzaW9uOworICAgICAgICAgICAgICAgIHZhciBwcmVjaXNpb25TcSA9IHByZWNpc2lvbiAq
IHByZWNpc2lvbjsKKworICAgICAgICAgICAgICAgIHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0
cnk7CisgICAgICAgICAgICAgICAgdmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDsK
KworICAgICAgICAgICAgICAgIC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRv
IHJheQorCisgICAgICAgICAgICAgICAgaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0g
bnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOworCisgICAgICAgICAgICAg
ICAgc3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7CisgICAgICAgICAgICAg
ICAgc3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsKKworICAgICAgICAgICAgICAg
IGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2Ug
KSByZXR1cm47CisKKyAgICAgICAgICAgICAgICAvLworCisgICAgICAgICAgICAgICAgaW52ZXJz
ZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApOworICAgICAgICAgICAgICAgIHJheS5j
b3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBpbnZlcnNlTWF0cml4ICk7CisKKyAg
ICAgICAgICAgICAgICB2YXIgdlN0YXJ0ID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAgICAg
ICB2YXIgdkVuZCA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICAgICAgdmFyIGludGVyU2Vn
bWVudCA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICAgICAgdmFyIGludGVyUmF5ID0gbmV3
IFZlY3RvcjMoKTsKKyAgICAgICAgICAgICAgICB2YXIgc3RlcCA9ICh0aGlzICYmIHRoaXMuaXNM
aW5lU2VnbWVudHMpID8gMiA6IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoIGdlb21ldHJ5Lmlz
QnVmZmVyR2VvbWV0cnkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZ2Vv
bWV0cnkuaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0
cnkuYXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9ucyA9IGF0dHJp
YnV0ZXMucG9zaXRpb24uYXJyYXk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmRleCAh
PT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGljZXMgPSBpbmRl
eC5hcnJheTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0g
aW5kaWNlcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArPSBzdGVwICkgeworCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdmFyIGEgPSBpbmRpY2VzWyBpIF07CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdmFyIGIgPSBpbmRpY2VzWyBpICsgMSBdOworCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHZFbmQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGIgKiAzICk7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FU
b1NlZ21lbnQoIHZTdGFydCwgdkVuZCwgaW50ZXJSYXksIGludGVyU2VnbWVudCApOworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRp
bnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJSYXkuYXBwbHlNYXRyaXg0
KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0
YW5jZSBjYWxjdWxhdGlvbgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3Rh
bmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8
fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGludGVyc2VjdHMucHVzaCggeworCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBv
ciBvbiB0aGUgc2VnbWVudD8/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBv
aW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5jZSApLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlz
Lm1hdHJpeFdvcmxkICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlOiBudWxsLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBmYWNlSW5kZXg6IG51bGwsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcworCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfSApOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBs
ID0gcG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCAzICog
aSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZFbmQuZnJvbUFycmF5KCBwb3NpdGlv
bnMsIDMgKiBpICsgMyApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3RT
cSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRl
clNlZ21lbnQgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZGlzdFNxID4g
cHJlY2lzaW9uU3EgKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
dGVyUmF5LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApOyAvL01vdmUgYmFjayB0byB3
b3JsZCBzcGFjZSBmb3IgZGlzdGFuY2UgY2FsY3VsYXRpb24KKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8o
IGludGVyUmF5ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRpc3RhbmNl
IDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgY29udGludWU7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3RzLnB1c2goIHsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZTogZGlzdGFuY2UsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9u
IHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/PworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBwb2ludDogcmF5Y2FzdGVyLnJheS5hdCggZGlzdGFuY2UgKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgp
LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbmRleDogaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFj
ZTogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZUluZGV4OiBudWxs
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMKKworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIH0gKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGdl
b21ldHJ5LmlzR2VvbWV0cnkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHZlcnRpY2Vz
ID0gZ2VvbWV0cnkudmVydGljZXM7CisgICAgICAgICAgICAgICAgICAgIHZhciBuYlZlcnRpY2Vz
ID0gdmVydGljZXMubGVuZ3RoOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0g
MDsgaSA8IG5iVmVydGljZXMgLSAxOyBpICs9IHN0ZXAgKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHZhciBkaXN0U3EgPSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggdmVydGljZXNbIGkg
XSwgdmVydGljZXNbIGkgKyAxIF0sIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlOwor
CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0
cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1
bGF0aW9uCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IHJheWNhc3Rl
ci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNh
c3Rlci5mYXIgKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0
cy5wdXNoKCB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZTogZGlzdGFu
Y2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hhdCBkbyB3ZSB3YW50PyBpbnRl
cnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgp
LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGluZGV4OiBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2U6IG51bGws
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZUluZGV4OiBudWxsLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG9iamVjdDogdGhpcworCisgICAgICAgICAgICAgICAgICAgICAg
ICB9ICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB9OworCisgICAgICAgIH0oKSApLAorCisgICAgICAgIGNsb25lOiBmdW5jdGlv
biAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5n
ZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTsKKworICAgICAgICB9CisKKyAg
ICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2Iu
Y29tLworICAgICAqLworCisgICAgZnVuY3Rpb24gTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0
ZXJpYWwgKSB7CisKKyAgICAgICAgTGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwg
KTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnTGluZVNlZ21lbnRzJzsKKworICAgIH0KKworICAg
IExpbmVTZWdtZW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBM
aW5lLnByb3RvdHlwZSApLCB7CisKKyAgICAgICAgY29uc3RydWN0b3I6IExpbmVTZWdtZW50cywK
KworICAgICAgICBpc0xpbmVTZWdtZW50czogdHJ1ZQorCisgICAgfSApOworCisgICAgLyoqCisg
ICAgICogQGF1dGhvciBtZ3JldGVyIC8gaHR0cDovL2dpdGh1Yi5jb20vbWdyZXRlcgorICAgICAq
LworCisgICAgZnVuY3Rpb24gTGluZUxvb3AoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHsKKworICAg
ICAgICBMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApOworCisgICAgICAgIHRo
aXMudHlwZSA9ICdMaW5lTG9vcCc7CisKKyAgICB9CisKKyAgICBMaW5lTG9vcC5wcm90b3R5cGUg
PSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7CisKKyAg
ICAgICAgY29uc3RydWN0b3I6IExpbmVMb29wLAorCisgICAgICAgIGlzTGluZUxvb3A6IHRydWUs
CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9t
cmRvb2IuY29tLworICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxp
YS5jb20vCisgICAgICoKKyAgICAgKiBwYXJhbWV0ZXJzID0geworICAgICAqICBjb2xvcjogPGhl
eD4sCisgICAgICogIG9wYWNpdHk6IDxmbG9hdD4sCisgICAgICogIG1hcDogbmV3IFRIUkVFLlRl
eHR1cmUoIDxJbWFnZT4gKSwKKyAgICAgKgorICAgICAqICBzaXplOiA8ZmxvYXQ+LAorICAgICAq
ICBzaXplQXR0ZW51YXRpb246IDxib29sPgorICAgICAqIH0KKyAgICAgKi8KKworICAgIGZ1bmN0
aW9uIFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisgICAgICAgIE1hdGVyaWFsLmNh
bGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnOworCisg
ICAgICAgIHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7CisKKyAgICAgICAgdGhp
cy5tYXAgPSBudWxsOworCisgICAgICAgIHRoaXMuc2l6ZSA9IDE7CisgICAgICAgIHRoaXMuc2l6
ZUF0dGVudWF0aW9uID0gdHJ1ZTsKKworICAgICAgICB0aGlzLmxpZ2h0cyA9IGZhbHNlOworCisg
ICAgICAgIHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CisKKyAgICB9CisKKyAgICBQb2lu
dHNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUg
KTsKKyAgICBQb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludHNNYXRl
cmlhbDsKKworICAgIFBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5pc1BvaW50c01hdGVyaWFsID0g
dHJ1ZTsKKworICAgIFBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBz
b3VyY2UgKSB7CisKKyAgICAgICAgTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywg
c291cmNlICk7CisKKyAgICAgICAgdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKKwor
ICAgICAgICB0aGlzLm1hcCA9IHNvdXJjZS5tYXA7CisKKyAgICAgICAgdGhpcy5zaXplID0gc291
cmNlLnNpemU7CisgICAgICAgIHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRl
bnVhdGlvbjsKKworICAgICAgICByZXR1cm4gdGhpczsKKworICAgIH07CisKKyAgICAvKioKKyAg
ICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworICAgICAq
LworCisgICAgZnVuY3Rpb24gUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7CisKKyAgICAg
ICAgT2JqZWN0M0QuY2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdQb2ludHMn
OworCisgICAgICAgIHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2Vv
bWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKyAgICAgICAgdGhpcy5tYXRlcmlhbCA9IG1h
dGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBQb2ludHNNYXRlcmlhbCggeyBj
b2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTsKKworICAgIH0KKworICAgIFBvaW50
cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90
b3R5cGUgKSwgeworCisgICAgICAgIGNvbnN0cnVjdG9yOiBQb2ludHMsCisKKyAgICAgICAgaXNQ
b2ludHM6IHRydWUsCisKKyAgICAgICAgcmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7CisKKyAgICAg
ICAgICAgIHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKKyAgICAgICAgICAgIHZh
ciByYXkgPSBuZXcgUmF5KCk7CisgICAgICAgICAgICB2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgp
OworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRl
cnNlY3RzICkgeworCisgICAgICAgICAgICAgICAgdmFyIG9iamVjdCA9IHRoaXM7CisgICAgICAg
ICAgICAgICAgdmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKKyAgICAgICAgICAgICAgICB2
YXIgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkOworICAgICAgICAgICAgICAgIHZhciB0
aHJlc2hvbGQgPSByYXljYXN0ZXIucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7CisKKyAgICAgICAg
ICAgICAgICAvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXkKKworICAg
ICAgICAgICAgICAgIGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9t
ZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKKworICAgICAgICAgICAgICAgIHNwaGVyZS5j
b3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApOworICAgICAgICAgICAgICAgIHNwaGVyZS5h
cHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7CisgICAgICAgICAgICAgICAgc3BoZXJlLnJhZGl1
cyArPSB0aHJlc2hvbGQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIHJheWNhc3Rlci5yYXkuaW50
ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuOworCisgICAgICAgICAg
ICAgICAgLy8KKworICAgICAgICAgICAgICAgIGludmVyc2VNYXRyaXguZ2V0SW52ZXJzZSggbWF0
cml4V29ybGQgKTsKKyAgICAgICAgICAgICAgICByYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFw
cGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApOworCisgICAgICAgICAgICAgICAgdmFyIGxvY2Fs
VGhyZXNob2xkID0gdGhyZXNob2xkIC8gKCAoIHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSAr
IHRoaXMuc2NhbGUueiApIC8gMyApOworICAgICAgICAgICAgICAgIHZhciBsb2NhbFRocmVzaG9s
ZFNxID0gbG9jYWxUaHJlc2hvbGQgKiBsb2NhbFRocmVzaG9sZDsKKyAgICAgICAgICAgICAgICB2
YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICAgICAgZnVuY3Rpb24g
dGVzdFBvaW50KCBwb2ludCwgaW5kZXggKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJh
eVBvaW50RGlzdGFuY2VTcSA9IHJheS5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKTsKKworICAg
ICAgICAgICAgICAgICAgICBpZiAoIHJheVBvaW50RGlzdGFuY2VTcSA8IGxvY2FsVGhyZXNob2xk
U3EgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnNlY3RQb2ludCA9IHJh
eS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCApOworICAgICAgICAgICAgICAgICAgICAgICAg
aW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApOworCisgICAgICAgICAg
ICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5j
ZVRvKCBpbnRlcnNlY3RQb2ludCApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRp
c3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0
dXJuOworCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3RzLnB1c2goIHsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkaXN0YW5jZVRvUmF5OiBNYXRoLnNxcnQoIHJheVBvaW50RGlzdGFu
Y2VTcSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50OiBpbnRlcnNlY3RQb2lu
dC5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlOiBudWxsLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG9iamVjdDogb2JqZWN0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsK
KworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICBpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgdmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CisgICAgICAgICAgICAgICAgICAg
IHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAg
ICAgdmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7CisKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCBpbmRleCAhPT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgdmFyIGluZGljZXMgPSBpbmRleC5hcnJheTsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgZm9yICggdmFyIGkgPSAwLCBpbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGluZGljZXNbIGkgXTsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLmZyb21BcnJheSggcG9zaXRpb25z
LCBhICogMyApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBvaW50KCBwb3Np
dGlvbiwgYSApOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAw
LCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgPCBsOyBpICsrICkgeworCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcG9zaXRpb24uZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKiAzICk7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UG9pbnQoIHBvc2l0aW9uLCBpICk7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIHZhciB2ZXJ0
aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoIHZh
ciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHRlc3RQb2ludCggdmVydGljZXNbIGkgXSwgaSApOworCisgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKwor
ICAgICAgICB9KCkgKSwKKworICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0
ZXJpYWwgKS5jb3B5KCB0aGlzICk7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoq
CisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKwor
ICAgIGZ1bmN0aW9uIEdyb3VwKCkgeworCisgICAgICAgIE9iamVjdDNELmNhbGwoIHRoaXMgKTsK
KworICAgICAgICB0aGlzLnR5cGUgPSAnR3JvdXAnOworCisgICAgfQorCisgICAgR3JvdXAucHJv
dG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBl
ICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogR3JvdXAKKworICAgIH0gKTsKKworICAgIC8q
KgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisK
KyAgICBmdW5jdGlvbiBWaWRlb1RleHR1cmUoIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQs
IG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7CisKKyAg
ICAgICAgVGV4dHVyZS5jYWxsKCB0aGlzLCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBt
YWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7CisKKyAgICAg
ICAgdGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTsKKworICAgICAgICB2YXIgc2NvcGUgPSB0
aGlzOworCisgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHsKKworICAgICAgICAgICAgcmVxdWVz
dEFuaW1hdGlvbkZyYW1lKCB1cGRhdGUgKTsKKworICAgICAgICAgICAgaWYgKCB2aWRlby5yZWFk
eVN0YXRlID49IHZpZGVvLkhBVkVfQ1VSUkVOVF9EQVRBICkgeworCisgICAgICAgICAgICAgICAg
c2NvcGUubmVlZHNVcGRhdGUgPSB0cnVlOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQor
CisgICAgICAgIHVwZGF0ZSgpOworCisgICAgfQorCisgICAgVmlkZW9UZXh0dXJlLnByb3RvdHlw
ZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7CisgICAgVmlkZW9UZXh0dXJl
LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZpZGVvVGV4dHVyZTsKKworICAgIC8qKgorICAgICAq
IEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAgICovCisK
KyAgICBmdW5jdGlvbiBDb21wcmVzc2VkVGV4dHVyZSggbWlwbWFwcywgd2lkdGgsIGhlaWdodCwg
Zm9ybWF0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVy
LCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHsKKworICAgICAgICBUZXh0dXJlLmNhbGwoIHRoaXMs
IG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1h
dCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTsKKworICAgICAgICB0aGlzLmltYWdlID0g
eyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07CisgICAgICAgIHRoaXMubWlwbWFwcyA9
IG1pcG1hcHM7CisKKyAgICAgICAgLy8gbm8gZmxpcHBpbmcgZm9yIGN1YmUgdGV4dHVyZXMKKyAg
ICAgICAgLy8gKGFsc28gZmxpcHBpbmcgZG9lc24ndCB3b3JrIGZvciBjb21wcmVzc2VkIHRleHR1
cmVzICkKKworICAgICAgICB0aGlzLmZsaXBZID0gZmFsc2U7CisKKyAgICAgICAgLy8gY2FuJ3Qg
Z2VuZXJhdGUgbWlwbWFwcyBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlcworICAgICAgICAvLyBtaXBz
IG11c3QgYmUgZW1iZWRkZWQgaW4gRERTIGZpbGVzCisKKyAgICAgICAgdGhpcy5nZW5lcmF0ZU1p
cG1hcHMgPSBmYWxzZTsKKworICAgIH0KKworICAgIENvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlw
ZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7CisgICAgQ29tcHJlc3NlZFRl
eHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29tcHJlc3NlZFRleHR1cmU7CisKKyAgICBD
b21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZSA9IHRydWU7CisK
KyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworICAg
ICAqLworCisgICAgZnVuY3Rpb24gQ2FudmFzVGV4dHVyZSggY2FudmFzLCBtYXBwaW5nLCB3cmFw
Uywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkg
KSB7CisKKyAgICAgICAgVGV4dHVyZS5jYWxsKCB0aGlzLCBjYW52YXMsIG1hcHBpbmcsIHdyYXBT
LCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSAp
OworCisgICAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlOworCisgICAgfQorCisgICAgQ2Fu
dmFzVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSAp
OworICAgIENhbnZhc1RleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FudmFzVGV4dHVy
ZTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgTWF0dCBEZXNMYXVyaWVycyAvIEBtYXR0ZGVz
bAorICAgICAqIEBhdXRob3IgYXRpeCAvIGFydGh1cnNpbGJlci5kZQorICAgICAqLworCisgICAg
ZnVuY3Rpb24gRGVwdGhUZXh0dXJlKCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBtYXBwaW5nLCB3cmFw
Uywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBmb3JtYXQgKSB7CisK
KyAgICAgICAgZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBEZXB0aEZv
cm1hdDsKKworICAgICAgICBpZiAoIGZvcm1hdCAhPT0gRGVwdGhGb3JtYXQgJiYgZm9ybWF0ICE9
PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigg
J0RlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3Ig
VEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0JyApCisKKyAgICAgICAgfQorCisgICAgICAgIGlmICgg
dHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB0eXBlID0gVW5z
aWduZWRTaG9ydFR5cGU7CisgICAgICAgIGlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1h
dCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTsKKwor
ICAgICAgICBUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwg
bWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApOworCisgICAg
ICAgIHRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTsKKworICAg
ICAgICB0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVy
IDogTmVhcmVzdEZpbHRlcjsKKyAgICAgICAgdGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09
IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7CisKKyAgICAgICAgdGhpcy5m
bGlwWSA9IGZhbHNlOworICAgICAgICB0aGlzLmdlbmVyYXRlTWlwbWFwcyAgICA9IGZhbHNlOwor
CisgICAgfQorCisgICAgRGVwdGhUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRl
eHR1cmUucHJvdG90eXBlICk7CisgICAgRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3Rv
ciA9IERlcHRoVGV4dHVyZTsKKyAgICBEZXB0aFRleHR1cmUucHJvdG90eXBlLmlzRGVwdGhUZXh0
dXJlID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21y
ZG9vYi5jb20vCisgICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011
Z2VuODcKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFdpcmVmcmFtZUdlb21ldHJ5KCBnZW9tZXRy
eSApIHsKKworICAgICAgICBCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAgICAg
dGhpcy50eXBlID0gJ1dpcmVmcmFtZUdlb21ldHJ5JzsKKworICAgICAgICAvLyBidWZmZXIKKwor
ICAgICAgICB2YXIgdmVydGljZXMgPSBbXTsKKworICAgICAgICAvLyBoZWxwZXIgdmFyaWFibGVz
CisKKyAgICAgICAgdmFyIGksIGosIGwsIG8sIG9sOworICAgICAgICB2YXIgZWRnZSA9IFsgMCwg
MCBdLCBlZGdlcyA9IHt9LCBlLCBlZGdlMSwgZWRnZTI7CisgICAgICAgIHZhciBrZXksIGtleXMg
PSBbICdhJywgJ2InLCAnYycgXTsKKyAgICAgICAgdmFyIHZlcnRleDsKKworICAgICAgICAvLyBk
aWZmZXJlbnQgbG9naWMgZm9yIEdlb21ldHJ5IGFuZCBCdWZmZXJHZW9tZXRyeQorCisgICAgICAg
IGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKKworICAgICAgICAgICAg
Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWRnZXMgd2l0aG91
dCBkdXBsaWNhdGVzCisKKyAgICAgICAgICAgIHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzOwor
CisgICAgICAgICAgICBmb3IgKCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysg
KSB7CisKKyAgICAgICAgICAgICAgICB2YXIgZmFjZSA9IGZhY2VzWyBpIF07CisKKyAgICAgICAg
ICAgICAgICBmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgZWRnZTEgPSBmYWNlWyBrZXlzWyBqIF0gXTsKKyAgICAgICAgICAgICAgICAgICAgZWRnZTIg
PSBmYWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTsKKyAgICAgICAgICAgICAgICAgICAgZWRn
ZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1
cGxpY2F0ZXMKKyAgICAgICAgICAgICAgICAgICAgZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2Ux
LCBlZGdlMiApOworCisgICAgICAgICAgICAgICAgICAgIGtleSA9IGVkZ2VbIDAgXSArICcsJyAr
IGVkZ2VbIDEgXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGVkZ2VzWyBrZXkgXSA9PT0g
dW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBlZGdlc1sga2V5IF0gPSB7
IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9OworCisgICAgICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAvLyBnZW5lcmF0ZSB2ZXJ0aWNlcworCisgICAgICAgICAgICBmb3IgKCBrZXkgaW4gZWRn
ZXMgKSB7CisKKyAgICAgICAgICAgICAgICBlID0gZWRnZXNbIGtleSBdOworCisgICAgICAgICAg
ICAgICAgdmVydGV4ID0gZ2VvbWV0cnkudmVydGljZXNbIGUuaW5kZXgxIF07CisgICAgICAgICAg
ICAgICAgdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisg
ICAgICAgICAgICAgICAgdmVydGV4ID0gZ2VvbWV0cnkudmVydGljZXNbIGUuaW5kZXgyIF07Cisg
ICAgICAgICAgICAgICAgdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgu
eiApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmICggZ2VvbWV0cnkgJiYg
Z2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKKworICAgICAgICAgICAgdmFyIHBvc2l0aW9u
LCBpbmRpY2VzLCBncm91cHM7CisgICAgICAgICAgICB2YXIgZ3JvdXAsIHN0YXJ0LCBjb3VudDsK
KyAgICAgICAgICAgIHZhciBpbmRleDEsIGluZGV4MjsKKworICAgICAgICAgICAgdmVydGV4ID0g
bmV3IFZlY3RvcjMoKTsKKworICAgICAgICAgICAgaWYgKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVs
bCApIHsKKworICAgICAgICAgICAgICAgIC8vIGluZGV4ZWQgQnVmZmVyR2VvbWV0cnkKKworICAg
ICAgICAgICAgICAgIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKKyAg
ICAgICAgICAgICAgICBpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXg7CisgICAgICAgICAgICAgICAg
Z3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOworCisgICAgICAgICAgICAgICAgaWYgKCBncm91cHMu
bGVuZ3RoID09PSAwICkgeworCisgICAgICAgICAgICAgICAgICAgIGdyb3VwcyA9IFsgeyBzdGFy
dDogMCwgY291bnQ6IGluZGljZXMuY291bnQsIG1hdGVyaWFsSW5kZXg6IDAgfSBdOworCisgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1
cmUgdGhhdCBjb250YWlucyBhbGwgZWdlcyB3aXRob3V0IGR1cGxpY2F0ZXMKKworICAgICAgICAg
ICAgICAgIGZvciAoIG8gPSAwLCBvbCA9IGdyb3Vwcy5sZW5ndGg7IG8gPCBvbDsgKysgbyApIHsK
KworICAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3Vwc1sgbyBdOworCisgICAgICAgICAg
ICAgICAgICAgIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGNvdW50
ID0gZ3JvdXAuY291bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IHN0YXJ0LCBs
ID0gKCBzdGFydCArIGNvdW50ICk7IGkgPCBsOyBpICs9IDMgKSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGVkZ2UxID0gaW5kaWNlcy5nZXRYKCBpICsgaiApOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGVkZ2UyID0gaW5kaWNlcy5nZXRYKCBpICsgKCBqICsgMSApICUgMyAp
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdl
MSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApOworCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsg
MSBdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBlZGdlc1sga2V5IF0gPT09
IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlc1sg
a2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9OworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgLy8gZ2VuZXJhdGUgdmVydGljZXMKKworICAgICAgICAgICAgICAgIGZvciAoIGtleSBp
biBlZGdlcyApIHsKKworICAgICAgICAgICAgICAgICAgICBlID0gZWRnZXNbIGtleSBdOworCisg
ICAgICAgICAgICAgICAgICAgIHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwg
ZS5pbmRleDEgKTsKKyAgICAgICAgICAgICAgICAgICAgdmVydGljZXMucHVzaCggdmVydGV4Lngs
IHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisgICAgICAgICAgICAgICAgICAgIHZlcnRleC5mcm9t
QnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDIgKTsKKyAgICAgICAgICAgICAgICAg
ICAgdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOworCisgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAg
Ly8gbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkKKworICAgICAgICAgICAgICAgIHBvc2l0aW9u
ID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKKworICAgICAgICAgICAgICAgIGZvciAo
IGkgPSAwLCBsID0gKCBwb3NpdGlvbi5jb3VudCAvIDMgKTsgaSA8IGw7IGkgKysgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCAzOyBqICsrICkgeworCisgICAgICAg
ICAgICAgICAgICAgICAgICAvLyB0aHJlZSBlZGdlcyBwZXIgdHJpYW5nbGUsIGFuIGVkZ2UgaXMg
cmVwcmVzZW50ZWQgYXMgKGluZGV4MSwgaW5kZXgyKQorICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gZS5nLiB0aGUgZmlyc3QgdHJpYW5nbGUgaGFzIHRoZSBmb2xsb3dpbmcgZWRnZXM6ICgwLDEp
LCgxLDIpLCgyLDApCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4MSA9IDMgKiBpICsg
ajsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBw
b3NpdGlvbiwgaW5kZXgxICk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNo
KCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGluZGV4MiA9IDMgKiBpICsgKCAoIGogKyAxICkgJSAzICk7CisgICAgICAgICAgICAgICAg
ICAgICAgICB2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MiApOwor
ICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55
LCB2ZXJ0ZXgueiApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCBnZW9t
ZXRyeQorCisgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQz
MkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworCisgICAgfQorCisgICAgV2lyZWZy
YW1lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJv
dG90eXBlICk7CisgICAgV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0g
V2lyZWZyYW1lR2VvbWV0cnk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIHp6ODUgLyBodHRw
czovL2dpdGh1Yi5jb20veno4NQorICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0
aHViLmNvbS9NdWdlbjg3CisgICAgICoKKyAgICAgKiBQYXJhbWV0cmljIFN1cmZhY2VzIEdlb21l
dHJ5CisgICAgICogYmFzZWQgb24gdGhlIGJyaWxsaWFudCBhcnRpY2xlIGJ5IEBwcmlkZW91dCBo
dHRwOi8vcHJpZGVvdXQubmV0L2Jsb2cvP3A9NDQKKyAgICAgKi8KKworICAgIC8vIFBhcmFtZXRy
aWNHZW9tZXRyeQorCisgICAgZnVuY3Rpb24gUGFyYW1ldHJpY0dlb21ldHJ5KCBmdW5jLCBzbGlj
ZXMsIHN0YWNrcyApIHsKKworICAgICAgICBHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAg
ICAgdGhpcy50eXBlID0gJ1BhcmFtZXRyaWNHZW9tZXRyeSc7CisKKyAgICAgICAgdGhpcy5wYXJh
bWV0ZXJzID0geworICAgICAgICAgICAgZnVuYzogZnVuYywKKyAgICAgICAgICAgIHNsaWNlczog
c2xpY2VzLAorICAgICAgICAgICAgc3RhY2tzOiBzdGFja3MKKyAgICAgICAgfTsKKworICAgICAg
ICB0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSgg
ZnVuYywgc2xpY2VzLCBzdGFja3MgKSApOworICAgICAgICB0aGlzLm1lcmdlVmVydGljZXMoKTsK
KworICAgIH0KKworICAgIFBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3Jl
YXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKKyAgICBQYXJhbWV0cmljR2VvbWV0cnkucHJvdG90
eXBlLmNvbnN0cnVjdG9yID0gUGFyYW1ldHJpY0dlb21ldHJ5OworCisgICAgLy8gUGFyYW1ldHJp
Y0J1ZmZlckdlb21ldHJ5CisKKyAgICBmdW5jdGlvbiBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnko
IGZ1bmMsIHNsaWNlcywgc3RhY2tzICkgeworCisgICAgICAgIEJ1ZmZlckdlb21ldHJ5LmNhbGwo
IHRoaXMgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5
JzsKKworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CisgICAgICAgICAgICBmdW5jOiBmdW5j
LAorICAgICAgICAgICAgc2xpY2VzOiBzbGljZXMsCisgICAgICAgICAgICBzdGFja3M6IHN0YWNr
cworICAgICAgICB9OworCisgICAgICAgIC8vIGJ1ZmZlcnMKKworICAgICAgICB2YXIgaW5kaWNl
cyA9IFtdOworICAgICAgICB2YXIgdmVydGljZXMgPSBbXTsKKyAgICAgICAgdmFyIG5vcm1hbHMg
PSBbXTsKKyAgICAgICAgdmFyIHV2cyA9IFtdOworCisgICAgICAgIHZhciBFUFMgPSAwLjAwMDAx
OworCisgICAgICAgIHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgIHZhciBw
MCA9IG5ldyBWZWN0b3IzKCksIHAxID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgdmFyIHB1ID0g
bmV3IFZlY3RvcjMoKSwgcHYgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgIHZhciBpLCBqOwor
CisgICAgICAgIC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKKworICAgICAg
ICB2YXIgc2xpY2VDb3VudCA9IHNsaWNlcyArIDE7CisKKyAgICAgICAgZm9yICggaSA9IDA7IGkg
PD0gc3RhY2tzOyBpICsrICkgeworCisgICAgICAgICAgICB2YXIgdiA9IGkgLyBzdGFja3M7CisK
KyAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDw9IHNsaWNlczsgaiArKyApIHsKKworICAgICAg
ICAgICAgICAgIHZhciB1ID0gaiAvIHNsaWNlczsKKworICAgICAgICAgICAgICAgIC8vIHZlcnRl
eAorCisgICAgICAgICAgICAgICAgcDAgPSBmdW5jKCB1LCB2LCBwMCApOworICAgICAgICAgICAg
ICAgIHZlcnRpY2VzLnB1c2goIHAwLngsIHAwLnksIHAwLnogKTsKKworICAgICAgICAgICAgICAg
IC8vIG5vcm1hbAorCisgICAgICAgICAgICAgICAgLy8gYXBwcm94aW1hdGUgdGFuZ2VudCB2ZWN0
b3JzIHZpYSBmaW5pdGUgZGlmZmVyZW5jZXMKKworICAgICAgICAgICAgICAgIGlmICggdSAtIEVQ
UyA+PSAwICkgeworCisgICAgICAgICAgICAgICAgICAgIHAxID0gZnVuYyggdSAtIEVQUywgdiwg
cDEgKTsKKyAgICAgICAgICAgICAgICAgICAgcHUuc3ViVmVjdG9ycyggcDAsIHAxICk7CisKKyAg
ICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIHAxID0gZnVuYygg
dSArIEVQUywgdiwgcDEgKTsKKyAgICAgICAgICAgICAgICAgICAgcHUuc3ViVmVjdG9ycyggcDEs
IHAwICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIHYgLSBF
UFMgPj0gMCApIHsKKworICAgICAgICAgICAgICAgICAgICBwMSA9IGZ1bmMoIHUsIHYgLSBFUFMs
IHAxICk7CisgICAgICAgICAgICAgICAgICAgIHB2LnN1YlZlY3RvcnMoIHAwLCBwMSApOworCisg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICBwMSA9IGZ1bmMo
IHUsIHYgKyBFUFMsIHAxICk7CisgICAgICAgICAgICAgICAgICAgIHB2LnN1YlZlY3RvcnMoIHAx
LCBwMCApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gY3Jvc3Mg
cHJvZHVjdCBvZiB0YW5nZW50IHZlY3RvcnMgcmV0dXJucyBzdXJmYWNlIG5vcm1hbAorCisgICAg
ICAgICAgICAgICAgbm9ybWFsLmNyb3NzVmVjdG9ycyggcHUsIHB2ICkubm9ybWFsaXplKCk7Cisg
ICAgICAgICAgICAgICAgbm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56
ICk7CisKKyAgICAgICAgICAgICAgICAvLyB1dgorCisgICAgICAgICAgICAgICAgdXZzLnB1c2go
IHUsIHYgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBnZW5l
cmF0ZSBpbmRpY2VzCisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBzdGFja3M7IGkgKysgKSB7
CisKKyAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgc2xpY2VzOyBqICsrICkgeworCisgICAg
ICAgICAgICAgICAgdmFyIGEgPSBpICogc2xpY2VDb3VudCArIGo7CisgICAgICAgICAgICAgICAg
dmFyIGIgPSBpICogc2xpY2VDb3VudCArIGogKyAxOworICAgICAgICAgICAgICAgIHZhciBjID0g
KCBpICsgMSApICogc2xpY2VDb3VudCArIGogKyAxOworICAgICAgICAgICAgICAgIHZhciBkID0g
KCBpICsgMSApICogc2xpY2VDb3VudCArIGo7CisKKyAgICAgICAgICAgICAgICAvLyBmYWNlcyBv
bmUgYW5kIHR3bworCisgICAgICAgICAgICAgICAgaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7Cisg
ICAgICAgICAgICAgICAgaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CisKKyAgICAgICAgICAgIH0K
KworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgZ2VvbWV0cnkKKworICAgICAgICB0aGlz
LnNldEluZGV4KCBpbmRpY2VzICk7CisgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRp
b24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworICAgICAg
ICB0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRl
KCBub3JtYWxzLCAzICkgKTsKKyAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBG
bG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApOworCisgICAgfQorCisgICAgUGFyYW1l
dHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21l
dHJ5LnByb3RvdHlwZSApOworICAgIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUu
Y29uc3RydWN0b3IgPSBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk7CisKKyAgICAvKioKKyAgICAg
KiBAYXV0aG9yIGNsb2Nrd29ya2dlZWsgLyBodHRwczovL2dpdGh1Yi5jb20vY2xvY2t3b3JrZ2Vl
aworICAgICAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGlt
b3RoeXByYXRsZXkKKyAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5j
b20vV2VzdExhbmdsZXkKKyAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5j
b20vTXVnZW44NworICAgICAqLworCisgICAgLy8gUG9seWhlZHJvbkdlb21ldHJ5CisKKyAgICBm
dW5jdGlvbiBQb2x5aGVkcm9uR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRl
dGFpbCApIHsKKworICAgICAgICBHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhp
cy50eXBlID0gJ1BvbHloZWRyb25HZW9tZXRyeSc7CisKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJz
ID0geworICAgICAgICAgICAgdmVydGljZXM6IHZlcnRpY2VzLAorICAgICAgICAgICAgaW5kaWNl
czogaW5kaWNlcywKKyAgICAgICAgICAgIHJhZGl1czogcmFkaXVzLAorICAgICAgICAgICAgZGV0
YWlsOiBkZXRhaWwKKyAgICAgICAgfTsKKworICAgICAgICB0aGlzLmZyb21CdWZmZXJHZW9tZXRy
eSggbmV3IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1
cywgZGV0YWlsICkgKTsKKyAgICAgICAgdGhpcy5tZXJnZVZlcnRpY2VzKCk7CisKKyAgICB9CisK
KyAgICBQb2x5aGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0
cnkucHJvdG90eXBlICk7CisgICAgUG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1
Y3RvciA9IFBvbHloZWRyb25HZW9tZXRyeTsKKworICAgIC8vIFBvbHloZWRyb25CdWZmZXJHZW9t
ZXRyeQorCisgICAgZnVuY3Rpb24gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCB2ZXJ0aWNlcywg
aW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSB7CisKKyAgICAgICAgQnVmZmVyR2VvbWV0cnkuY2Fs
bCggdGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdQb2x5aGVkcm9uQnVmZmVyR2VvbWV0
cnknOworCisgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKKyAgICAgICAgICAgIHZlcnRpY2Vz
OiB2ZXJ0aWNlcywKKyAgICAgICAgICAgIGluZGljZXM6IGluZGljZXMsCisgICAgICAgICAgICBy
YWRpdXM6IHJhZGl1cywKKyAgICAgICAgICAgIGRldGFpbDogZGV0YWlsCisgICAgICAgIH07CisK
KyAgICAgICAgcmFkaXVzID0gcmFkaXVzIHx8IDE7CisgICAgICAgIGRldGFpbCA9IGRldGFpbCB8
fCAwOworCisgICAgICAgIC8vIGRlZmF1bHQgYnVmZmVyIGRhdGEKKworICAgICAgICB2YXIgdmVy
dGV4QnVmZmVyID0gW107CisgICAgICAgIHZhciB1dkJ1ZmZlciA9IFtdOworCisgICAgICAgIC8v
IHRoZSBzdWJkaXZpc2lvbiBjcmVhdGVzIHRoZSB2ZXJ0ZXggYnVmZmVyIGRhdGEKKworICAgICAg
ICBzdWJkaXZpZGUoIGRldGFpbCApOworCisgICAgICAgIC8vIGFsbCB2ZXJ0aWNlcyBzaG91bGQg
bGllIG9uIGEgY29uY2VwdHVhbCBzcGhlcmUgd2l0aCBhIGdpdmVuIHJhZGl1cworCisgICAgICAg
IGFwcHBseVJhZGl1cyggcmFkaXVzICk7CisKKyAgICAgICAgLy8gZmluYWxseSwgY3JlYXRlIHRo
ZSB1diBkYXRhCisKKyAgICAgICAgZ2VuZXJhdGVVVnMoKTsKKworICAgICAgICAvLyBidWlsZCBu
b24taW5kZXhlZCBnZW9tZXRyeQorCisgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRp
b24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGV4QnVmZmVyLCAzICkgKTsKKyAg
ICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJp
YnV0ZSggdmVydGV4QnVmZmVyLnNsaWNlKCksIDMgKSApOworICAgICAgICB0aGlzLmFkZEF0dHJp
YnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QnVmZmVyLCAyICkgKTsK
KworICAgICAgICBpZiAoIGRldGFpbCA9PT0gMCApIHsKKworICAgICAgICAgICAgdGhpcy5jb21w
dXRlVmVydGV4Tm9ybWFscygpOyAvLyBmbGF0IG5vcm1hbHMKKworICAgICAgICB9IGVsc2Ugewor
CisgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTsgLy8gc21vb3RoIG5vcm1hbHMK
KworICAgICAgICB9CisKKyAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9ucworCisgICAgICAgIGZ1
bmN0aW9uIHN1YmRpdmlkZSggZGV0YWlsICkgeworCisgICAgICAgICAgICB2YXIgYSA9IG5ldyBW
ZWN0b3IzKCk7CisgICAgICAgICAgICB2YXIgYiA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAg
ICB2YXIgYyA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBh
bGwgZmFjZXMgYW5kIGFwcGx5IGEgc3ViZGl2aXNvbiB3aXRoIHRoZSBnaXZlbiBkZXRhaWwgdmFs
dWUKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkg
Kz0gMyApIHsKKworICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdmVydGljZXMgb2YgdGhlIGZh
Y2UKKworICAgICAgICAgICAgICAgIGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAwIF0s
IGEgKTsKKyAgICAgICAgICAgICAgICBnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMSBd
LCBiICk7CisgICAgICAgICAgICAgICAgZ2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDIg
XSwgYyApOworCisgICAgICAgICAgICAgICAgLy8gcGVyZm9ybSBzdWJkaXZpc2lvbgorCisgICAg
ICAgICAgICAgICAgc3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICk7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gc3ViZGl2aWRlRmFjZSggYSwg
YiwgYywgZGV0YWlsICkgeworCisgICAgICAgICAgICB2YXIgY29scyA9IE1hdGgucG93KCAyLCBk
ZXRhaWwgKTsKKworICAgICAgICAgICAgLy8gd2UgdXNlIHRoaXMgbXVsdGlkaW1lbnNpb25hbCBh
cnJheSBhcyBhIGRhdGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyB0aGUgc3ViZGl2aXNpb24KKwor
ICAgICAgICAgICAgdmFyIHYgPSBbXTsKKworICAgICAgICAgICAgdmFyIGksIGo7CisKKyAgICAg
ICAgICAgIC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlz
aW9uCisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IGNvbHM7IGkgKysgKSB7CisKKyAg
ICAgICAgICAgICAgICB2WyBpIF0gPSBbXTsKKworICAgICAgICAgICAgICAgIHZhciBhaiA9IGEu
Y2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApOworICAgICAgICAgICAgICAgIHZhciBiaiA9IGIu
Y2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApOworCisgICAgICAgICAgICAgICAgdmFyIHJvd3Mg
PSBjb2xzIC0gaTsKKworICAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDw9IHJvd3M7IGog
KysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBqID09PSAwICYmIGkgPT09IGNvbHMg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZbIGkgXVsgaiBdID0gYWo7CisKKyAgICAg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdlsgaSBd
WyBqIF0gPSBhai5jbG9uZSgpLmxlcnAoIGJqLCBqIC8gcm93cyApOworCisgICAgICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAvLyBjb25zdHJ1Y3QgYWxsIG9mIHRoZSBmYWNlcworCisgICAgICAgICAgICBmb3IgKCBp
ID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBqID0gMDsg
aiA8IDIgKiAoIGNvbHMgLSBpICkgLSAxOyBqICsrICkgeworCisgICAgICAgICAgICAgICAgICAg
IHZhciBrID0gTWF0aC5mbG9vciggaiAvIDIgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAo
IGogJSAyID09PSAwICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoVmVydGV4KCB2
WyBpIF1bIGsgKyAxIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hWZXJ0ZXgoIHZb
IGkgKyAxIF1bIGsgXSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHVzaFZlcnRleCggdlsg
aSBdWyBrIF0gKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAg
ICAgICAgICAgICAgICBwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgKyAxIF0gKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApOworCisgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisg
ICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBhcHBwbHlSYWRpdXMoIHJhZGl1cyApIHsKKwor
ICAgICAgICAgICAgdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgIC8v
IGl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGJ1ZmZlciBhbmQgYXBwbHkgdGhlIHJhZGl1cyB0byBl
YWNoIHZlcnRleAorCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZm
ZXIubGVuZ3RoOyBpICs9IDMgKSB7CisKKyAgICAgICAgICAgICAgICB2ZXJ0ZXgueCA9IHZlcnRl
eEJ1ZmZlclsgaSArIDAgXTsKKyAgICAgICAgICAgICAgICB2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZl
clsgaSArIDEgXTsKKyAgICAgICAgICAgICAgICB2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSAr
IDIgXTsKKworICAgICAgICAgICAgICAgIHZlcnRleC5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxh
ciggcmFkaXVzICk7CisKKyAgICAgICAgICAgICAgICB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0gPSB2
ZXJ0ZXgueDsKKyAgICAgICAgICAgICAgICB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0gPSB2ZXJ0ZXgu
eTsKKyAgICAgICAgICAgICAgICB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gPSB2ZXJ0ZXguejsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVVW
cygpIHsKKworICAgICAgICAgICAgdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAg
ICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyAp
IHsKKworICAgICAgICAgICAgICAgIHZlcnRleC54ID0gdmVydGV4QnVmZmVyWyBpICsgMCBdOwor
ICAgICAgICAgICAgICAgIHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdOworICAgICAg
ICAgICAgICAgIHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdOworCisgICAgICAgICAg
ICAgICAgdmFyIHUgPSBhemltdXRoKCB2ZXJ0ZXggKSAvIDIgLyBNYXRoLlBJICsgMC41OworICAg
ICAgICAgICAgICAgIHZhciB2ID0gaW5jbGluYXRpb24oIHZlcnRleCApIC8gTWF0aC5QSSArIDAu
NTsKKyAgICAgICAgICAgICAgICB1dkJ1ZmZlci5wdXNoKCB1LCAxIC0gdiApOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGNvcnJlY3RVVnMoKTsKKworICAgICAgICAgICAgY29ycmVj
dFNlYW0oKTsKKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gY29ycmVjdFNlYW0oKSB7
CisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBjYXNlIHdoZW4gZmFjZSBzdHJhZGRsZXMgdGhlIHNl
YW0sIHNlZSAjMzI2OQorCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCB1dkJ1ZmZl
ci5sZW5ndGg7IGkgKz0gNiApIHsKKworICAgICAgICAgICAgICAgIC8vIHV2IGRhdGEgb2YgYSBz
aW5nbGUgZmFjZQorCisgICAgICAgICAgICAgICAgdmFyIHgwID0gdXZCdWZmZXJbIGkgKyAwIF07
CisgICAgICAgICAgICAgICAgdmFyIHgxID0gdXZCdWZmZXJbIGkgKyAyIF07CisgICAgICAgICAg
ICAgICAgdmFyIHgyID0gdXZCdWZmZXJbIGkgKyA0IF07CisKKyAgICAgICAgICAgICAgICB2YXIg
bWF4ID0gTWF0aC5tYXgoIHgwLCB4MSwgeDIgKTsKKyAgICAgICAgICAgICAgICB2YXIgbWluID0g
TWF0aC5taW4oIHgwLCB4MSwgeDIgKTsKKworICAgICAgICAgICAgICAgIC8vIDAuOSBpcyBzb21l
d2hhdCBhcmJpdHJhcnkKKworICAgICAgICAgICAgICAgIGlmICggbWF4ID4gMC45ICYmIG1pbiA8
IDAuMSApIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHgwIDwgMC4yICkgdXZCdWZmZXJb
IGkgKyAwIF0gKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB4MSA8IDAuMiApIHV2QnVm
ZmVyWyBpICsgMiBdICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICggeDIgPCAwLjIgKSB1
dkJ1ZmZlclsgaSArIDQgXSArPSAxOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHB1c2hWZXJ0ZXgoIHZlcnRleCAp
IHsKKworICAgICAgICAgICAgdmVydGV4QnVmZmVyLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwg
dmVydGV4LnogKTsKKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gZ2V0VmVydGV4QnlJ
bmRleCggaW5kZXgsIHZlcnRleCApIHsKKworICAgICAgICAgICAgdmFyIHN0cmlkZSA9IGluZGV4
ICogMzsKKworICAgICAgICAgICAgdmVydGV4LnggPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMCBdOwor
ICAgICAgICAgICAgdmVydGV4LnkgPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMSBdOworICAgICAgICAg
ICAgdmVydGV4LnogPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMiBdOworCisgICAgICAgIH0KKworICAg
ICAgICBmdW5jdGlvbiBjb3JyZWN0VVZzKCkgeworCisgICAgICAgICAgICB2YXIgYSA9IG5ldyBW
ZWN0b3IzKCk7CisgICAgICAgICAgICB2YXIgYiA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAg
ICB2YXIgYyA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgIHZhciBjZW50cm9pZCA9IG5l
dyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgIHZhciB1dkEgPSBuZXcgVmVjdG9yMigpOworICAg
ICAgICAgICAgdmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7CisgICAgICAgICAgICB2YXIgdXZDID0g
bmV3IFZlY3RvcjIoKTsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8
IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gOSwgaiArPSA2ICkgeworCisgICAgICAgICAgICAg
ICAgYS5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDAgXSwgdmVydGV4QnVmZmVyWyBpICsgMSBdLCB2
ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gKTsKKyAgICAgICAgICAgICAgICBiLnNldCggdmVydGV4QnVm
ZmVyWyBpICsgMyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA0IF0sIHZlcnRleEJ1ZmZlclsgaSArIDUg
XSApOworICAgICAgICAgICAgICAgIGMuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyA2IF0sIHZlcnRl
eEJ1ZmZlclsgaSArIDcgXSwgdmVydGV4QnVmZmVyWyBpICsgOCBdICk7CisKKyAgICAgICAgICAg
ICAgICB1dkEuc2V0KCB1dkJ1ZmZlclsgaiArIDAgXSwgdXZCdWZmZXJbIGogKyAxIF0gKTsKKyAg
ICAgICAgICAgICAgICB1dkIuc2V0KCB1dkJ1ZmZlclsgaiArIDIgXSwgdXZCdWZmZXJbIGogKyAz
IF0gKTsKKyAgICAgICAgICAgICAgICB1dkMuc2V0KCB1dkJ1ZmZlclsgaiArIDQgXSwgdXZCdWZm
ZXJbIGogKyA1IF0gKTsKKworICAgICAgICAgICAgICAgIGNlbnRyb2lkLmNvcHkoIGEgKS5hZGQo
IGIgKS5hZGQoIGMgKS5kaXZpZGVTY2FsYXIoIDMgKTsKKworICAgICAgICAgICAgICAgIHZhciBh
emkgPSBhemltdXRoKCBjZW50cm9pZCApOworCisgICAgICAgICAgICAgICAgY29ycmVjdFVWKCB1
dkEsIGogKyAwLCBhLCBhemkgKTsKKyAgICAgICAgICAgICAgICBjb3JyZWN0VVYoIHV2QiwgaiAr
IDIsIGIsIGF6aSApOworICAgICAgICAgICAgICAgIGNvcnJlY3RVViggdXZDLCBqICsgNCwgYywg
YXppICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24g
Y29ycmVjdFVWKCB1diwgc3RyaWRlLCB2ZWN0b3IsIGF6aW11dGggKSB7CisKKyAgICAgICAgICAg
IGlmICggKCBhemltdXRoIDwgMCApICYmICggdXYueCA9PT0gMSApICkgeworCisgICAgICAgICAg
ICAgICAgdXZCdWZmZXJbIHN0cmlkZSBdID0gdXYueCAtIDE7CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgaWYgKCAoIHZlY3Rvci54ID09PSAwICkgJiYgKCB2ZWN0b3IueiA9PT0gMCAp
ICkgeworCisgICAgICAgICAgICAgICAgdXZCdWZmZXJbIHN0cmlkZSBdID0gYXppbXV0aCAvIDIg
LyBNYXRoLlBJICsgMC41OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAg
IC8vIEFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzLCBjb3VudGVyLWNsb2Nrd2lzZSB3aGVuIGxvb2tp
bmcgZnJvbSBhYm92ZS4KKworICAgICAgICBmdW5jdGlvbiBhemltdXRoKCB2ZWN0b3IgKSB7CisK
KyAgICAgICAgICAgIHJldHVybiBNYXRoLmF0YW4yKCB2ZWN0b3IueiwgLSB2ZWN0b3IueCApOwor
CisgICAgICAgIH0KKworCisgICAgICAgIC8vIEFuZ2xlIGFib3ZlIHRoZSBYWiBwbGFuZS4KKwor
ICAgICAgICBmdW5jdGlvbiBpbmNsaW5hdGlvbiggdmVjdG9yICkgeworCisgICAgICAgICAgICBy
ZXR1cm4gTWF0aC5hdGFuMiggLSB2ZWN0b3IueSwgTWF0aC5zcXJ0KCAoIHZlY3Rvci54ICogdmVj
dG9yLnggKSArICggdmVjdG9yLnogKiB2ZWN0b3IueiApICkgKTsKKworICAgICAgICB9CisKKyAg
ICB9CisKKyAgICBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNy
ZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisgICAgUG9seWhlZHJvbkJ1ZmZlckdl
b21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTsK
KworICAgIC8qKgorICAgICAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1
Yi5jb20vdGltb3RoeXByYXRsZXkKKyAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dp
dGh1Yi5jb20vTXVnZW44NworICAgICAqLworCisgICAgLy8gVGV0cmFoZWRyb25HZW9tZXRyeQor
CisgICAgZnVuY3Rpb24gVGV0cmFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7CisK
KyAgICAgICAgR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdU
ZXRyYWhlZHJvbkdlb21ldHJ5JzsKKworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CisgICAg
ICAgICAgICByYWRpdXM6IHJhZGl1cywKKyAgICAgICAgICAgIGRldGFpbDogZGV0YWlsCisgICAg
ICAgIH07CisKKyAgICAgICAgdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXRyYWhlZHJv
bkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7CisgICAgICAgIHRoaXMubWVyZ2VW
ZXJ0aWNlcygpOworCisgICAgfQorCisgICAgVGV0cmFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUg
PSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKKyAgICBUZXRyYWhlZHJvbkdl
b21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uR2VvbWV0cnk7CisKKyAg
ICAvLyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5CisKKyAgICBmdW5jdGlvbiBUZXRyYWhlZHJv
bkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKKworICAgICAgICB2YXIgdmVydGlj
ZXMgPSBbCisgICAgICAgICAgICAxLCAgMSwgIDEsICAgLSAxLCAtIDEsICAxLCAgIC0gMSwgIDEs
IC0gMSwgICAgMSwgLSAxLCAtIDEKKyAgICAgICAgXTsKKworICAgICAgICB2YXIgaW5kaWNlcyA9
IFsKKyAgICAgICAgICAgIDIsICAxLCAgMCwgICAgMCwgIDMsICAyLCAgICAxLCAgMywgIDAsICAg
IDIsICAzLCAgMQorICAgICAgICBdOworCisgICAgICAgIFBvbHloZWRyb25CdWZmZXJHZW9tZXRy
eS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTsKKworICAg
ICAgICB0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSc7CisKKyAgICAgICAg
dGhpcy5wYXJhbWV0ZXJzID0geworICAgICAgICAgICAgcmFkaXVzOiByYWRpdXMsCisgICAgICAg
ICAgICBkZXRhaWw6IGRldGFpbAorICAgICAgICB9OworCisgICAgfQorCisgICAgVGV0cmFoZWRy
b25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVm
ZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisgICAgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5w
cm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OworCisgICAg
LyoqCisgICAgICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90
aW1vdGh5cHJhdGxleQorICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNv
bS9NdWdlbjg3CisgICAgICovCisKKyAgICAvLyBPY3RhaGVkcm9uR2VvbWV0cnkKKworICAgIGZ1
bmN0aW9uIE9jdGFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7CisKKyAgICAgICAg
R2VvbWV0cnkuY2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdPY3RhaGVkcm9u
R2VvbWV0cnknOworCisgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKKyAgICAgICAgICAgIHJh
ZGl1czogcmFkaXVzLAorICAgICAgICAgICAgZGV0YWlsOiBkZXRhaWwKKyAgICAgICAgfTsKKwor
ICAgICAgICB0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IE9jdGFoZWRyb25CdWZmZXJHZW9t
ZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApOworICAgICAgICB0aGlzLm1lcmdlVmVydGljZXMoKTsK
KworICAgIH0KKworICAgIE9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3Jl
YXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKKyAgICBPY3RhaGVkcm9uR2VvbWV0cnkucHJvdG90
eXBlLmNvbnN0cnVjdG9yID0gT2N0YWhlZHJvbkdlb21ldHJ5OworCisgICAgLy8gT2N0YWhlZHJv
bkJ1ZmZlckdlb21ldHJ5CisKKyAgICBmdW5jdGlvbiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnko
IHJhZGl1cywgZGV0YWlsICkgeworCisgICAgICAgIHZhciB2ZXJ0aWNlcyA9IFsKKyAgICAgICAg
ICAgIDEsIDAsIDAsICAgLSAxLCAwLCAwLCAgICAwLCAxLCAwLCAgICAwLCAtIDEsIDAsICAgIDAs
IDAsIDEsICAgIDAsIDAsIC0gMQorICAgICAgICBdOworCisgICAgICAgIHZhciBpbmRpY2VzID0g
WworICAgICAgICAgICAgMCwgMiwgNCwgICAgMCwgNCwgMywgICAgMCwgMywgNSwgICAgMCwgNSwg
MiwgICAgMSwgMiwgNSwgICAgMSwgNSwgMywgICAgMSwgMywgNCwgICAgMSwgNCwgMgorICAgICAg
ICBdOworCisgICAgICAgIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0
aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAn
T2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzsKKworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7
CisgICAgICAgICAgICByYWRpdXM6IHJhZGl1cywKKyAgICAgICAgICAgIGRldGFpbDogZGV0YWls
CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJv
dG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlw
ZSApOworICAgIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3Ig
PSBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIHRp
bW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5CisgICAgICog
QGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKyAgICAgKi8KKwor
ICAgIC8vIEljb3NhaGVkcm9uR2VvbWV0cnkKKworICAgIGZ1bmN0aW9uIEljb3NhaGVkcm9uR2Vv
bWV0cnkoIHJhZGl1cywgZGV0YWlsICkgeworCisgICAgICAgIEdlb21ldHJ5LmNhbGwoIHRoaXMg
KTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnSWNvc2FoZWRyb25HZW9tZXRyeSc7CisKKyAgICAg
ICAgdGhpcy5wYXJhbWV0ZXJzID0geworICAgICAgICAgICAgcmFkaXVzOiByYWRpdXMsCisgICAg
ICAgICAgICBkZXRhaWw6IGRldGFpbAorICAgICAgICB9OworCisgICAgICAgIHRoaXMuZnJvbUJ1
ZmZlckdlb21ldHJ5KCBuZXcgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRh
aWwgKSApOworICAgICAgICB0aGlzLm1lcmdlVmVydGljZXMoKTsKKworICAgIH0KKworICAgIElj
b3NhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJv
dG90eXBlICk7CisgICAgSWNvc2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3Ig
PSBJY29zYWhlZHJvbkdlb21ldHJ5OworCisgICAgLy8gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRy
eQorCisgICAgZnVuY3Rpb24gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRh
aWwgKSB7CisKKyAgICAgICAgdmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjsKKwor
ICAgICAgICB2YXIgdmVydGljZXMgPSBbCisgICAgICAgICAgICAtIDEsICB0LCAgMCwgICAgMSwg
IHQsICAwLCAgIC0gMSwgLSB0LCAgMCwgICAgMSwgLSB0LCAgMCwKKyAgICAgICAgICAgICAwLCAt
IDEsICB0LCAgICAwLCAgMSwgIHQsICAgIDAsIC0gMSwgLSB0LCAgICAwLCAgMSwgLSB0LAorICAg
ICAgICAgICAgIHQsICAwLCAtIDEsICAgIHQsICAwLCAgMSwgICAtIHQsICAwLCAtIDEsICAgLSB0
LCAgMCwgIDEKKyAgICAgICAgXTsKKworICAgICAgICB2YXIgaW5kaWNlcyA9IFsKKyAgICAgICAg
ICAgICAwLCAxMSwgIDUsICAgIDAsICA1LCAgMSwgICAgMCwgIDEsICA3LCAgICAwLCAgNywgMTAs
ICAgIDAsIDEwLCAxMSwKKyAgICAgICAgICAgICAxLCAgNSwgIDksICAgIDUsIDExLCAgNCwgICAx
MSwgMTAsICAyLCAgIDEwLCAgNywgIDYsICAgIDcsICAxLCAgOCwKKyAgICAgICAgICAgICAzLCAg
OSwgIDQsICAgIDMsICA0LCAgMiwgICAgMywgIDIsICA2LCAgICAzLCAgNiwgIDgsICAgIDMsICA4
LCAgOSwKKyAgICAgICAgICAgICA0LCAgOSwgIDUsICAgIDIsICA0LCAxMSwgICAgNiwgIDIsIDEw
LCAgICA4LCAgNiwgIDcsICAgIDksICA4LCAgMQorICAgICAgICBdOworCisgICAgICAgIFBvbHlo
ZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVz
LCBkZXRhaWwgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnSWNvc2FoZWRyb25CdWZmZXJHZW9t
ZXRyeSc7CisKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0geworICAgICAgICAgICAgcmFkaXVz
OiByYWRpdXMsCisgICAgICAgICAgICBkZXRhaWw6IGRldGFpbAorICAgICAgICB9OworCisgICAg
fQorCisgICAgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3Jl
YXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisgICAgSWNvc2FoZWRy
b25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJY29zYWhlZHJvbkJ1ZmZl
ckdlb21ldHJ5OworCisgICAgLyoqCisgICAgICogQGF1dGhvciBBYmUgUGF6b3MgLyBodHRwczov
L2hhbW9pZC5jb20KKyAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20v
TXVnZW44NworICAgICAqLworCisgICAgLy8gRG9kZWNhaGVkcm9uR2VvbWV0cnkKKworICAgIGZ1
bmN0aW9uIERvZGVjYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKKworICAgICAg
ICBHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhpcy50eXBlID0gJ0RvZGVjYWhl
ZHJvbkdlb21ldHJ5JzsKKworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CisgICAgICAgICAg
ICByYWRpdXM6IHJhZGl1cywKKyAgICAgICAgICAgIGRldGFpbDogZGV0YWlsCisgICAgICAgIH07
CisKKyAgICAgICAgdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBEb2RlY2FoZWRyb25CdWZm
ZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApOworICAgICAgICB0aGlzLm1lcmdlVmVydGlj
ZXMoKTsKKworICAgIH0KKworICAgIERvZGVjYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9i
amVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOworICAgIERvZGVjYWhlZHJvbkdlb21l
dHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkdlb21ldHJ5OworCisgICAg
Ly8gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkKKworICAgIGZ1bmN0aW9uIERvZGVjYWhlZHJv
bkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKKworICAgICAgICB2YXIgdCA9ICgg
MSArIE1hdGguc3FydCggNSApICkgLyAyOworICAgICAgICB2YXIgciA9IDEgLyB0OworCisgICAg
ICAgIHZhciB2ZXJ0aWNlcyA9IFsKKworICAgICAgICAgICAgLy8gKMKxMSwgwrExLCDCsTEpCisg
ICAgICAgICAgICAtIDEsIC0gMSwgLSAxLCAgICAtIDEsIC0gMSwgIDEsCisgICAgICAgICAgICAt
IDEsICAxLCAtIDEsICAgIC0gMSwgIDEsICAxLAorICAgICAgICAgICAgICAxLCAtIDEsIC0gMSwg
ICAgIDEsIC0gMSwgIDEsCisgICAgICAgICAgICAgIDEsICAxLCAtIDEsICAgICAxLCAgMSwgIDEs
CisKKyAgICAgICAgICAgIC8vICgwLCDCsTEvz4YsIMKxz4YpCisgICAgICAgICAgICAgMCwgLSBy
LCAtIHQsICAgICAwLCAtIHIsICB0LAorICAgICAgICAgICAgIDAsICByLCAtIHQsICAgICAwLCAg
ciwgIHQsCisKKyAgICAgICAgICAgIC8vICjCsTEvz4YsIMKxz4YsIDApCisgICAgICAgICAgICAt
IHIsIC0gdCwgIDAsICAgIC0gciwgIHQsICAwLAorICAgICAgICAgICAgIHIsIC0gdCwgIDAsICAg
ICByLCAgdCwgIDAsCisKKyAgICAgICAgICAgIC8vICjCsc+GLCAwLCDCsTEvz4YpCisgICAgICAg
ICAgICAtIHQsICAwLCAtIHIsICAgICB0LCAgMCwgLSByLAorICAgICAgICAgICAgLSB0LCAgMCwg
IHIsICAgICB0LCAgMCwgIHIKKyAgICAgICAgXTsKKworICAgICAgICB2YXIgaW5kaWNlcyA9IFsK
KyAgICAgICAgICAgICAzLCAxMSwgIDcsICAgICAgMywgIDcsIDE1LCAgICAgIDMsIDE1LCAxMywK
KyAgICAgICAgICAgICA3LCAxOSwgMTcsICAgICAgNywgMTcsICA2LCAgICAgIDcsICA2LCAxNSwK
KyAgICAgICAgICAgIDE3LCAgNCwgIDgsICAgICAxNywgIDgsIDEwLCAgICAgMTcsIDEwLCAgNiwK
KyAgICAgICAgICAgICA4LCAgMCwgMTYsICAgICAgOCwgMTYsICAyLCAgICAgIDgsICAyLCAxMCwK
KyAgICAgICAgICAgICAwLCAxMiwgIDEsICAgICAgMCwgIDEsIDE4LCAgICAgIDAsIDE4LCAxNiwK
KyAgICAgICAgICAgICA2LCAxMCwgIDIsICAgICAgNiwgIDIsIDEzLCAgICAgIDYsIDEzLCAxNSwK
KyAgICAgICAgICAgICAyLCAxNiwgMTgsICAgICAgMiwgMTgsICAzLCAgICAgIDIsICAzLCAxMywK
KyAgICAgICAgICAgIDE4LCAgMSwgIDksICAgICAxOCwgIDksIDExLCAgICAgMTgsIDExLCAgMywK
KyAgICAgICAgICAgICA0LCAxNCwgMTIsICAgICAgNCwgMTIsICAwLCAgICAgIDQsICAwLCAgOCwK
KyAgICAgICAgICAgIDExLCAgOSwgIDUsICAgICAxMSwgIDUsIDE5LCAgICAgMTEsIDE5LCAgNywK
KyAgICAgICAgICAgIDE5LCAgNSwgMTQsICAgICAxOSwgMTQsICA0LCAgICAgMTksICA0LCAxNywK
KyAgICAgICAgICAgICAxLCAxMiwgMTQsICAgICAgMSwgMTQsICA1LCAgICAgIDEsICA1LCAgOQor
ICAgICAgICBdOworCisgICAgICAgIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlz
LCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTsKKworICAgICAgICB0aGlzLnR5
cGUgPSAnRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnknOworCisgICAgICAgIHRoaXMucGFyYW1l
dGVycyA9IHsKKyAgICAgICAgICAgIHJhZGl1czogcmFkaXVzLAorICAgICAgICAgICAgZGV0YWls
OiBkZXRhaWwKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIERvZGVjYWhlZHJvbkJ1ZmZlckdl
b21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRy
eS5wcm90b3R5cGUgKTsKKyAgICBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUu
Y29uc3RydWN0b3IgPSBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTsKKworICAgIC8qKgorICAg
ICAqIEBhdXRob3Igb29zbW94aWVjb2RlIC8gaHR0cHM6Ly9naXRodWIuY29tL29vc21veGllY29k
ZQorICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vV2VzdExh
bmdsZXkKKyAgICAgKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NQorICAg
ICAqIEBhdXRob3IgbWluaW5nb2xkIC8gaHR0cHM6Ly9naXRodWIuY29tL21pbmluZ29sZAorICAg
ICAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9qb25vYnIxCisgICAgICog
QGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKKyAgICAgKgorICAg
ICAqLworCisgICAgLy8gVHViZUdlb21ldHJ5CisKKyAgICBmdW5jdGlvbiBUdWJlR2VvbWV0cnko
IHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkLCB0
YXBlciApIHsKKworICAgICAgICBHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhp
cy50eXBlID0gJ1R1YmVHZW9tZXRyeSc7CisKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gewor
ICAgICAgICAgICAgcGF0aDogcGF0aCwKKyAgICAgICAgICAgIHR1YnVsYXJTZWdtZW50czogdHVi
dWxhclNlZ21lbnRzLAorICAgICAgICAgICAgcmFkaXVzOiByYWRpdXMsCisgICAgICAgICAgICBy
YWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsCisgICAgICAgICAgICBjbG9zZWQ6IGNsb3Nl
ZAorICAgICAgICB9OworCisgICAgICAgIGlmICggdGFwZXIgIT09IHVuZGVmaW5lZCApIGNvbnNv
bGUud2FybiggJ1RIUkVFLlR1YmVHZW9tZXRyeTogdGFwZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7
CisKKyAgICAgICAgdmFyIGJ1ZmZlckdlb21ldHJ5ID0gbmV3IFR1YmVCdWZmZXJHZW9tZXRyeSgg
cGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKTsK
KworICAgICAgICAvLyBleHBvc2UgaW50ZXJuYWxzCisKKyAgICAgICAgdGhpcy50YW5nZW50cyA9
IGJ1ZmZlckdlb21ldHJ5LnRhbmdlbnRzOworICAgICAgICB0aGlzLm5vcm1hbHMgPSBidWZmZXJH
ZW9tZXRyeS5ub3JtYWxzOworICAgICAgICB0aGlzLmJpbm9ybWFscyA9IGJ1ZmZlckdlb21ldHJ5
LmJpbm9ybWFsczsKKworICAgICAgICAvLyBjcmVhdGUgZ2VvbWV0cnkKKworICAgICAgICB0aGlz
LmZyb21CdWZmZXJHZW9tZXRyeSggYnVmZmVyR2VvbWV0cnkgKTsKKyAgICAgICAgdGhpcy5tZXJn
ZVZlcnRpY2VzKCk7CisKKyAgICB9CisKKyAgICBUdWJlR2VvbWV0cnkucHJvdG90eXBlID0gT2Jq
ZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisgICAgVHViZUdlb21ldHJ5LnByb3Rv
dHlwZS5jb25zdHJ1Y3RvciA9IFR1YmVHZW9tZXRyeTsKKworICAgIC8vIFR1YmVCdWZmZXJHZW9t
ZXRyeQorCisgICAgZnVuY3Rpb24gVHViZUJ1ZmZlckdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2Vn
bWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCApIHsKKworICAgICAgICBCdWZm
ZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhpcy50eXBlID0gJ1R1YmVCdWZm
ZXJHZW9tZXRyeSc7CisKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0geworICAgICAgICAgICAg
cGF0aDogcGF0aCwKKyAgICAgICAgICAgIHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRz
LAorICAgICAgICAgICAgcmFkaXVzOiByYWRpdXMsCisgICAgICAgICAgICByYWRpYWxTZWdtZW50
czogcmFkaWFsU2VnbWVudHMsCisgICAgICAgICAgICBjbG9zZWQ6IGNsb3NlZAorICAgICAgICB9
OworCisgICAgICAgIHR1YnVsYXJTZWdtZW50cyA9IHR1YnVsYXJTZWdtZW50cyB8fCA2NDsKKyAg
ICAgICAgcmFkaXVzID0gcmFkaXVzIHx8IDE7CisgICAgICAgIHJhZGlhbFNlZ21lbnRzID0gcmFk
aWFsU2VnbWVudHMgfHwgODsKKyAgICAgICAgY2xvc2VkID0gY2xvc2VkIHx8IGZhbHNlOworCisg
ICAgICAgIHZhciBmcmFtZXMgPSBwYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHR1YnVsYXJTZWdt
ZW50cywgY2xvc2VkICk7CisKKyAgICAgICAgLy8gZXhwb3NlIGludGVybmFscworCisgICAgICAg
IHRoaXMudGFuZ2VudHMgPSBmcmFtZXMudGFuZ2VudHM7CisgICAgICAgIHRoaXMubm9ybWFscyA9
IGZyYW1lcy5ub3JtYWxzOworICAgICAgICB0aGlzLmJpbm9ybWFscyA9IGZyYW1lcy5iaW5vcm1h
bHM7CisKKyAgICAgICAgLy8gaGVscGVyIHZhcmlhYmxlcworCisgICAgICAgIHZhciB2ZXJ0ZXgg
PSBuZXcgVmVjdG9yMygpOworICAgICAgICB2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTsKKyAg
ICAgICAgdmFyIHV2ID0gbmV3IFZlY3RvcjIoKTsKKworICAgICAgICB2YXIgaSwgajsKKworICAg
ICAgICAvLyBidWZmZXIKKworICAgICAgICB2YXIgdmVydGljZXMgPSBbXTsKKyAgICAgICAgdmFy
IG5vcm1hbHMgPSBbXTsKKyAgICAgICAgdmFyIHV2cyA9IFtdOworICAgICAgICB2YXIgaW5kaWNl
cyA9IFtdOworCisgICAgICAgIC8vIGNyZWF0ZSBidWZmZXIgZGF0YQorCisgICAgICAgIGdlbmVy
YXRlQnVmZmVyRGF0YSgpOworCisgICAgICAgIC8vIGJ1aWxkIGdlb21ldHJ5CisKKyAgICAgICAg
dGhpcy5zZXRJbmRleCggaW5kaWNlcyApOworICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bv
c2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKyAg
ICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJp
YnV0ZSggbm9ybWFscywgMyApICk7CisgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBu
ZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKKworICAgICAgICAvLyBmdW5j
dGlvbnMKKworICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZUJ1ZmZlckRhdGEoKSB7CisKKyAgICAg
ICAgICAgIGZvciAoIGkgPSAwOyBpIDwgdHVidWxhclNlZ21lbnRzOyBpICsrICkgeworCisgICAg
ICAgICAgICAgICAgZ2VuZXJhdGVTZWdtZW50KCBpICk7CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8gaWYgdGhlIGdlb21ldHJ5IGlzIG5vdCBjbG9zZWQsIGdlbmVyYXRlIHRoZSBs
YXN0IHJvdyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFscworICAgICAgICAgICAgLy8gYXQgdGhlIHJl
Z3VsYXIgcG9zaXRpb24gb24gdGhlIGdpdmVuIHBhdGgKKyAgICAgICAgICAgIC8vCisgICAgICAg
ICAgICAvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCBkdXBsaWNhdGUgdGhlIGZpcnN0IHJv
dyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFscyAodXZzIHdpbGwgZGlmZmVyKQorCisgICAgICAgICAg
ICBnZW5lcmF0ZVNlZ21lbnQoICggY2xvc2VkID09PSBmYWxzZSApID8gdHVidWxhclNlZ21lbnRz
IDogMCApOworCisgICAgICAgICAgICAvLyB1dnMgYXJlIGdlbmVyYXRlZCBpbiBhIHNlcGFyYXRl
IGZ1bmN0aW9uLgorICAgICAgICAgICAgLy8gdGhpcyBtYWtlcyBpdCBlYXN5IGNvbXB1dGUgY29y
cmVjdCB2YWx1ZXMgZm9yIGNsb3NlZCBnZW9tZXRyaWVzCisKKyAgICAgICAgICAgIGdlbmVyYXRl
VVZzKCk7CisKKyAgICAgICAgICAgIC8vIGZpbmFsbHkgY3JlYXRlIGZhY2VzCisKKyAgICAgICAg
ICAgIGdlbmVyYXRlSW5kaWNlcygpOworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBn
ZW5lcmF0ZVNlZ21lbnQoIGkgKSB7CisKKyAgICAgICAgICAgIC8vIHdlIHVzZSBnZXRQb2ludEF0
IHRvIHNhbXBsZSBldmVubHkgZGlzdHJpYnV0ZWQgcG9pbnRzIGZyb20gdGhlIGdpdmVuIHBhdGgK
KworICAgICAgICAgICAgdmFyIFAgPSBwYXRoLmdldFBvaW50QXQoIGkgLyB0dWJ1bGFyU2VnbWVu
dHMgKTsKKworICAgICAgICAgICAgLy8gcmV0cmlldmUgY29ycmVzcG9uZGluZyBub3JtYWwgYW5k
IGJpbm9ybWFsCisKKyAgICAgICAgICAgIHZhciBOID0gZnJhbWVzLm5vcm1hbHNbIGkgXTsKKyAg
ICAgICAgICAgIHZhciBCID0gZnJhbWVzLmJpbm9ybWFsc1sgaSBdOworCisgICAgICAgICAgICAv
LyBnZW5lcmF0ZSBub3JtYWxzIGFuZCB2ZXJ0aWNlcyBmb3IgdGhlIGN1cnJlbnQgc2VnbWVudAor
CisgICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHsK
KworICAgICAgICAgICAgICAgIHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAq
IDI7CisKKyAgICAgICAgICAgICAgICB2YXIgc2luID0gICBNYXRoLnNpbiggdiApOworICAgICAg
ICAgICAgICAgIHZhciBjb3MgPSAtIE1hdGguY29zKCB2ICk7CisKKyAgICAgICAgICAgICAgICAv
LyBub3JtYWwKKworICAgICAgICAgICAgICAgIG5vcm1hbC54ID0gKCBjb3MgKiBOLnggKyBzaW4g
KiBCLnggKTsKKyAgICAgICAgICAgICAgICBub3JtYWwueSA9ICggY29zICogTi55ICsgc2luICog
Qi55ICk7CisgICAgICAgICAgICAgICAgbm9ybWFsLnogPSAoIGNvcyAqIE4ueiArIHNpbiAqIEIu
eiApOworICAgICAgICAgICAgICAgIG5vcm1hbC5ub3JtYWxpemUoKTsKKworICAgICAgICAgICAg
ICAgIG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApOworCisgICAg
ICAgICAgICAgICAgLy8gdmVydGV4CisKKyAgICAgICAgICAgICAgICB2ZXJ0ZXgueCA9IFAueCAr
IHJhZGl1cyAqIG5vcm1hbC54OworICAgICAgICAgICAgICAgIHZlcnRleC55ID0gUC55ICsgcmFk
aXVzICogbm9ybWFsLnk7CisgICAgICAgICAgICAgICAgdmVydGV4LnogPSBQLnogKyByYWRpdXMg
KiBub3JtYWwuejsKKworICAgICAgICAgICAgICAgIHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2
ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAg
ICAgICBmdW5jdGlvbiBnZW5lcmF0ZUluZGljZXMoKSB7CisKKyAgICAgICAgICAgIGZvciAoIGog
PSAxOyBqIDw9IHR1YnVsYXJTZWdtZW50czsgaiArKyApIHsKKworICAgICAgICAgICAgICAgIGZv
ciAoIGkgPSAxOyBpIDw9IHJhZGlhbFNlZ21lbnRzOyBpICsrICkgeworCisgICAgICAgICAgICAg
ICAgICAgIHZhciBhID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArICggaSAt
IDEgKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSAp
ICogaiArICggaSAtIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAoIHJhZGlhbFNl
Z21lbnRzICsgMSApICogaiArIGk7CisgICAgICAgICAgICAgICAgICAgIHZhciBkID0gKCByYWRp
YWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7CisKKyAgICAgICAgICAgICAgICAgICAg
Ly8gZmFjZXMKKworICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsK
KyAgICAgICAgICAgICAgICAgICAgaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CisKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rp
b24gZ2VuZXJhdGVVVnMoKSB7CisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IHR1YnVs
YXJTZWdtZW50czsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDw9
IHJhZGlhbFNlZ21lbnRzOyBqICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIHV2LnggPSBp
IC8gdHVidWxhclNlZ21lbnRzOworICAgICAgICAgICAgICAgICAgICB1di55ID0gaiAvIHJhZGlh
bFNlZ21lbnRzOworCisgICAgICAgICAgICAgICAgICAgIHV2cy5wdXNoKCB1di54LCB1di55ICk7
CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAg
ICB9CisKKyAgICBUdWJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSgg
QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisgICAgVHViZUJ1ZmZlckdlb21ldHJ5LnByb3Rv
dHlwZS5jb25zdHJ1Y3RvciA9IFR1YmVCdWZmZXJHZW9tZXRyeTsKKworICAgIC8qKgorICAgICAq
IEBhdXRob3Igb29zbW94aWVjb2RlCisgICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9n
aXRodWIuY29tL011Z2VuODcKKyAgICAgKgorICAgICAqIGJhc2VkIG9uIGh0dHA6Ly93d3cuYmxh
Y2twYXduLmNvbS90ZXh0cy9wcXRvcnVzLworICAgICAqLworCisgICAgLy8gVG9ydXNLbm90R2Vv
bWV0cnkKKworICAgIGZ1bmN0aW9uIFRvcnVzS25vdEdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1
YnVsYXJTZWdtZW50cywgcmFkaWFsU2VnbWVudHMsIHAsIHEsIGhlaWdodFNjYWxlICkgeworCisg
ICAgICAgIEdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnVG9y
dXNLbm90R2VvbWV0cnknOworCisgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKKyAgICAgICAg
ICAgIHJhZGl1czogcmFkaXVzLAorICAgICAgICAgICAgdHViZTogdHViZSwKKyAgICAgICAgICAg
IHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLAorICAgICAgICAgICAgcmFkaWFsU2Vn
bWVudHM6IHJhZGlhbFNlZ21lbnRzLAorICAgICAgICAgICAgcDogcCwKKyAgICAgICAgICAgIHE6
IHEKKyAgICAgICAgfTsKKworICAgICAgICBpZiAoIGhlaWdodFNjYWxlICE9PSB1bmRlZmluZWQg
KSBjb25zb2xlLndhcm4oICdUSFJFRS5Ub3J1c0tub3RHZW9tZXRyeTogaGVpZ2h0U2NhbGUgaGFz
IGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zY2FsZSggeCwgeSwgeiApIGluc3RlYWQuJyApOworCisg
ICAgICAgIHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVG9ydXNLbm90QnVmZmVyR2VvbWV0
cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSAp
ICk7CisgICAgICAgIHRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisgICAgfQorCisgICAgVG9ydXNL
bm90R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBl
ICk7CisgICAgVG9ydXNLbm90R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNL
bm90R2VvbWV0cnk7CisKKyAgICAvLyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeQorCisgICAgZnVu
Y3Rpb24gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21l
bnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSApIHsKKworICAgICAgICBCdWZmZXJHZW9tZXRyeS5j
YWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhpcy50eXBlID0gJ1RvcnVzS25vdEJ1ZmZlckdlb21l
dHJ5JzsKKworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CisgICAgICAgICAgICByYWRpdXM6
IHJhZGl1cywKKyAgICAgICAgICAgIHR1YmU6IHR1YmUsCisgICAgICAgICAgICB0dWJ1bGFyU2Vn
bWVudHM6IHR1YnVsYXJTZWdtZW50cywKKyAgICAgICAgICAgIHJhZGlhbFNlZ21lbnRzOiByYWRp
YWxTZWdtZW50cywKKyAgICAgICAgICAgIHA6IHAsCisgICAgICAgICAgICBxOiBxCisgICAgICAg
IH07CisKKyAgICAgICAgcmFkaXVzID0gcmFkaXVzIHx8IDEwMDsKKyAgICAgICAgdHViZSA9IHR1
YmUgfHwgNDA7CisgICAgICAgIHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJT
ZWdtZW50cyApIHx8IDY0OworICAgICAgICByYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJh
ZGlhbFNlZ21lbnRzICkgfHwgODsKKyAgICAgICAgcCA9IHAgfHwgMjsKKyAgICAgICAgcSA9IHEg
fHwgMzsKKworICAgICAgICAvLyBidWZmZXJzCisKKyAgICAgICAgdmFyIGluZGljZXMgPSBbXTsK
KyAgICAgICAgdmFyIHZlcnRpY2VzID0gW107CisgICAgICAgIHZhciBub3JtYWxzID0gW107Cisg
ICAgICAgIHZhciB1dnMgPSBbXTsKKworICAgICAgICAvLyBoZWxwZXIgdmFyaWFibGVzCisKKyAg
ICAgICAgdmFyIGksIGo7CisKKyAgICAgICAgdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7Cisg
ICAgICAgIHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgIHZhciBQMSA9IG5l
dyBWZWN0b3IzKCk7CisgICAgICAgIHZhciBQMiA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAg
dmFyIEIgPSBuZXcgVmVjdG9yMygpOworICAgICAgICB2YXIgVCA9IG5ldyBWZWN0b3IzKCk7Cisg
ICAgICAgIHZhciBOID0gbmV3IFZlY3RvcjMoKTsKKworICAgICAgICAvLyBnZW5lcmF0ZSB2ZXJ0
aWNlcywgbm9ybWFscyBhbmQgdXZzCisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gdHVidWxh
clNlZ21lbnRzOyArKyBpICkgeworCisgICAgICAgICAgICAvLyB0aGUgcmFkaWFuICJ1IiBpcyB1
c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb24gdGhlIHRvcnVzIGN1cnZlIG9mIHRoZSBj
dXJyZW50IHR1YnVsYXIgc2VnZW1lbnQKKworICAgICAgICAgICAgdmFyIHUgPSBpIC8gdHVidWxh
clNlZ21lbnRzICogcCAqIE1hdGguUEkgKiAyOworCisgICAgICAgICAgICAvLyBub3cgd2UgY2Fs
Y3VsYXRlIHR3byBwb2ludHMuIFAxIGlzIG91ciBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2
ZSwgUDIgaXMgYSBsaXR0bGUgZmFydGhlciBhaGVhZC4KKyAgICAgICAgICAgIC8vIHRoZXNlIHBv
aW50cyBhcmUgdXNlZCB0byBjcmVhdGUgYSBzcGVjaWFsICJjb29yZGluYXRlIHNwYWNlIiwgd2hp
Y2ggaXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2ZXJ0ZXggcG9zaXRpb25z
CisKKyAgICAgICAgICAgIGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSwgcCwgcSwgcmFkaXVz
LCBQMSApOworICAgICAgICAgICAgY2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1ICsgMC4wMSwg
cCwgcSwgcmFkaXVzLCBQMiApOworCisgICAgICAgICAgICAvLyBjYWxjdWxhdGUgb3J0aG9ub3Jt
YWwgYmFzaXMKKworICAgICAgICAgICAgVC5zdWJWZWN0b3JzKCBQMiwgUDEgKTsKKyAgICAgICAg
ICAgIE4uYWRkVmVjdG9ycyggUDIsIFAxICk7CisgICAgICAgICAgICBCLmNyb3NzVmVjdG9ycygg
VCwgTiApOworICAgICAgICAgICAgTi5jcm9zc1ZlY3RvcnMoIEIsIFQgKTsKKworICAgICAgICAg
ICAgLy8gbm9ybWFsaXplIEIsIE4uIFQgY2FuIGJlIGlnbm9yZWQsIHdlIGRvbid0IHVzZSBpdAor
CisgICAgICAgICAgICBCLm5vcm1hbGl6ZSgpOworICAgICAgICAgICAgTi5ub3JtYWxpemUoKTsK
KworICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7ICsrIGogKSB7
CisKKyAgICAgICAgICAgICAgICAvLyBub3cgY2FsY3VsYXRlIHRoZSB2ZXJ0aWNlcy4gdGhleSBh
cmUgbm90aGluZyBtb3JlIHRoYW4gYW4gZXh0cnVzaW9uIG9mIHRoZSB0b3J1cyBjdXJ2ZS4KKyAg
ICAgICAgICAgICAgICAvLyBiZWNhdXNlIHdlIGV4dHJ1ZGUgYSBzaGFwZSBpbiB0aGUgeHktcGxh
bmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsY3VsYXRlIGEgei12YWx1ZS4KKworICAgICAgICAg
ICAgICAgIHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7CisgICAgICAg
ICAgICAgICAgdmFyIGN4ID0gLSB0dWJlICogTWF0aC5jb3MoIHYgKTsKKyAgICAgICAgICAgICAg
ICB2YXIgY3kgPSB0dWJlICogTWF0aC5zaW4oIHYgKTsKKworICAgICAgICAgICAgICAgIC8vIG5v
dyBjYWxjdWxhdGUgdGhlIGZpbmFsIHZlcnRleCBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICAv
LyBmaXJzdCB3ZSBvcmllbnQgdGhlIGV4dHJ1c2lvbiB3aXRoIG91ciBiYXNpcyB2ZWN0b3MsIHRo
ZW4gd2UgYWRkIGl0IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZQorCisgICAg
ICAgICAgICAgICAgdmVydGV4LnggPSBQMS54ICsgKCBjeCAqIE4ueCArIGN5ICogQi54ICk7Cisg
ICAgICAgICAgICAgICAgdmVydGV4LnkgPSBQMS55ICsgKCBjeCAqIE4ueSArIGN5ICogQi55ICk7
CisgICAgICAgICAgICAgICAgdmVydGV4LnogPSBQMS56ICsgKCBjeCAqIE4ueiArIGN5ICogQi56
ICk7CisKKyAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4Lnks
IHZlcnRleC56ICk7CisKKyAgICAgICAgICAgICAgICAvLyBub3JtYWwgKFAxIGlzIGFsd2F5cyB0
aGUgY2VudGVyL29yaWdpbiBvZiB0aGUgZXh0cnVzaW9uLCB0aHVzIHdlIGNhbiB1c2UgaXQgdG8g
Y2FsY3VsYXRlIHRoZSBub3JtYWwpCisKKyAgICAgICAgICAgICAgICBub3JtYWwuc3ViVmVjdG9y
cyggdmVydGV4LCBQMSApLm5vcm1hbGl6ZSgpOworCisgICAgICAgICAgICAgICAgbm9ybWFscy5w
dXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7CisKKyAgICAgICAgICAgICAgICAv
LyB1dgorCisgICAgICAgICAgICAgICAgdXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTsK
KyAgICAgICAgICAgICAgICB1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2VuZXJhdGUgaW5kaWNlcworCisg
ICAgICAgIGZvciAoIGogPSAxOyBqIDw9IHR1YnVsYXJTZWdtZW50czsgaiArKyApIHsKKworICAg
ICAgICAgICAgZm9yICggaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7CisKKyAg
ICAgICAgICAgICAgICAvLyBpbmRpY2VzCisKKyAgICAgICAgICAgICAgICB2YXIgYSA9ICggcmFk
aWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7CisgICAgICAgICAgICAg
ICAgdmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTsKKyAgICAg
ICAgICAgICAgICB2YXIgYyA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgaTsKKyAgICAg
ICAgICAgICAgICB2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBp
OworCisgICAgICAgICAgICAgICAgLy8gZmFjZXMKKworICAgICAgICAgICAgICAgIGluZGljZXMu
cHVzaCggYSwgYiwgZCApOworICAgICAgICAgICAgICAgIGluZGljZXMucHVzaCggYiwgYywgZCAp
OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJ1aWxkIGdlb21l
dHJ5CisKKyAgICAgICAgdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOworICAgICAgICB0aGlzLmFk
ZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRp
Y2VzLCAzICkgKTsKKyAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxv
YXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CisgICAgICAgIHRoaXMuYWRkQXR0
cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKKwor
ICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24g
b24gdGhlIHRvcnVzIGN1cnZlCisKKyAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlUG9zaXRpb25P
bkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIHBvc2l0aW9uICkgeworCisgICAgICAgICAgICB2YXIg
Y3UgPSBNYXRoLmNvcyggdSApOworICAgICAgICAgICAgdmFyIHN1ID0gTWF0aC5zaW4oIHUgKTsK
KyAgICAgICAgICAgIHZhciBxdU92ZXJQID0gcSAvIHAgKiB1OworICAgICAgICAgICAgdmFyIGNz
ID0gTWF0aC5jb3MoIHF1T3ZlclAgKTsKKworICAgICAgICAgICAgcG9zaXRpb24ueCA9IHJhZGl1
cyAqICggMiArIGNzICkgKiAwLjUgKiBjdTsKKyAgICAgICAgICAgIHBvc2l0aW9uLnkgPSByYWRp
dXMgKiAoIDIgKyBjcyApICogc3UgKiAwLjU7CisgICAgICAgICAgICBwb3NpdGlvbi56ID0gcmFk
aXVzICogTWF0aC5zaW4oIHF1T3ZlclAgKSAqIDAuNTsKKworICAgICAgICB9CisKKyAgICB9CisK
KyAgICBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBC
dWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKyAgICBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeS5w
cm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTsKKworICAgIC8q
KgorICAgICAqIEBhdXRob3Igb29zbW94aWVjb2RlCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBo
dHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1
Yi5jb20vTXVnZW44NworICAgICAqLworCisgICAgLy8gVG9ydXNHZW9tZXRyeQorCisgICAgZnVu
Y3Rpb24gVG9ydXNHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxh
clNlZ21lbnRzLCBhcmMgKSB7CisKKyAgICAgICAgR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisg
ICAgICAgIHRoaXMudHlwZSA9ICdUb3J1c0dlb21ldHJ5JzsKKworICAgICAgICB0aGlzLnBhcmFt
ZXRlcnMgPSB7CisgICAgICAgICAgICByYWRpdXM6IHJhZGl1cywKKyAgICAgICAgICAgIHR1YmU6
IHR1YmUsCisgICAgICAgICAgICByYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsCisgICAg
ICAgICAgICB0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cywKKyAgICAgICAgICAgIGFy
YzogYXJjCisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5l
dyBUb3J1c0J1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1
bGFyU2VnbWVudHMsIGFyYyApICk7CisgICAgICAgIHRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisg
ICAgfQorCisgICAgVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9t
ZXRyeS5wcm90b3R5cGUgKTsKKyAgICBUb3J1c0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3Rv
ciA9IFRvcnVzR2VvbWV0cnk7CisKKyAgICAvLyBUb3J1c0J1ZmZlckdlb21ldHJ5CisKKyAgICBm
dW5jdGlvbiBUb3J1c0J1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRz
LCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApIHsKKworICAgICAgICBCdWZmZXJHZW9tZXRyeS5jYWxs
KCB0aGlzICk7CisKKyAgICAgICAgdGhpcy50eXBlID0gJ1RvcnVzQnVmZmVyR2VvbWV0cnknOwor
CisgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKKyAgICAgICAgICAgIHJhZGl1czogcmFkaXVz
LAorICAgICAgICAgICAgdHViZTogdHViZSwKKyAgICAgICAgICAgIHJhZGlhbFNlZ21lbnRzOiBy
YWRpYWxTZWdtZW50cywKKyAgICAgICAgICAgIHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21l
bnRzLAorICAgICAgICAgICAgYXJjOiBhcmMKKyAgICAgICAgfTsKKworICAgICAgICByYWRpdXMg
PSByYWRpdXMgfHwgMTAwOworICAgICAgICB0dWJlID0gdHViZSB8fCA0MDsKKyAgICAgICAgcmFk
aWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7CisgICAgICAg
IHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApIHx8IDY7Cisg
ICAgICAgIGFyYyA9IGFyYyB8fCBNYXRoLlBJICogMjsKKworICAgICAgICAvLyBidWZmZXJzCisK
KyAgICAgICAgdmFyIGluZGljZXMgPSBbXTsKKyAgICAgICAgdmFyIHZlcnRpY2VzID0gW107Cisg
ICAgICAgIHZhciBub3JtYWxzID0gW107CisgICAgICAgIHZhciB1dnMgPSBbXTsKKworICAgICAg
ICAvLyBoZWxwZXIgdmFyaWFibGVzCisKKyAgICAgICAgdmFyIGNlbnRlciA9IG5ldyBWZWN0b3Iz
KCk7CisgICAgICAgIHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOworICAgICAgICB2YXIgbm9y
bWFsID0gbmV3IFZlY3RvcjMoKTsKKworICAgICAgICB2YXIgaiwgaTsKKworICAgICAgICAvLyBn
ZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzCisKKyAgICAgICAgZm9yICggaiA9IDA7
IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7CisKKyAgICAgICAgICAgIGZvciAoIGkgPSAw
OyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHZhciB1
ID0gaSAvIHR1YnVsYXJTZWdtZW50cyAqIGFyYzsKKyAgICAgICAgICAgICAgICB2YXIgdiA9IGog
LyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyOworCisgICAgICAgICAgICAgICAgLy8gdmVy
dGV4CisKKyAgICAgICAgICAgICAgICB2ZXJ0ZXgueCA9ICggcmFkaXVzICsgdHViZSAqIE1hdGgu
Y29zKCB2ICkgKSAqIE1hdGguY29zKCB1ICk7CisgICAgICAgICAgICAgICAgdmVydGV4LnkgPSAo
IHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRoLnNpbiggdSApOworICAgICAg
ICAgICAgICAgIHZlcnRleC56ID0gdHViZSAqIE1hdGguc2luKCB2ICk7CisKKyAgICAgICAgICAg
ICAgICB2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CisKKyAg
ICAgICAgICAgICAgICAvLyBub3JtYWwKKworICAgICAgICAgICAgICAgIGNlbnRlci54ID0gcmFk
aXVzICogTWF0aC5jb3MoIHUgKTsKKyAgICAgICAgICAgICAgICBjZW50ZXIueSA9IHJhZGl1cyAq
IE1hdGguc2luKCB1ICk7CisgICAgICAgICAgICAgICAgbm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRl
eCwgY2VudGVyICkubm9ybWFsaXplKCk7CisKKyAgICAgICAgICAgICAgICBub3JtYWxzLnB1c2go
IG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTsKKworICAgICAgICAgICAgICAgIC8vIHV2
CisKKyAgICAgICAgICAgICAgICB1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApOworICAg
ICAgICAgICAgICAgIHV2cy5wdXNoKCBqIC8gcmFkaWFsU2VnbWVudHMgKTsKKworICAgICAgICAg
ICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBnZW5lcmF0ZSBpbmRpY2VzCisKKyAgICAg
ICAgZm9yICggaiA9IDE7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7CisKKyAgICAgICAg
ICAgIGZvciAoIGkgPSAxOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHsKKworICAgICAg
ICAgICAgICAgIC8vIGluZGljZXMKKworICAgICAgICAgICAgICAgIHZhciBhID0gKCB0dWJ1bGFy
U2VnbWVudHMgKyAxICkgKiBqICsgaSAtIDE7CisgICAgICAgICAgICAgICAgdmFyIGIgPSAoIHR1
YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGkgLSAxOworICAgICAgICAgICAgICAg
IHZhciBjID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpOworICAgICAg
ICAgICAgICAgIHZhciBkID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiBqICsgaTsKKworICAg
ICAgICAgICAgICAgIC8vIGZhY2VzCisKKyAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goIGEs
IGIsIGQgKTsKKyAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCBnZW9tZXRyeQorCisg
ICAgICAgIHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKKyAgICAgICAgdGhpcy5hZGRBdHRyaWJ1
dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyAp
ICk7CisgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZm
ZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOworICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZSgg
J3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CisKKyAgICB9CisK
KyAgICBUb3J1c0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZl
ckdlb21ldHJ5LnByb3RvdHlwZSApOworICAgIFRvcnVzQnVmZmVyR2VvbWV0cnkucHJvdG90eXBl
LmNvbnN0cnVjdG9yID0gVG9ydXNCdWZmZXJHZW9tZXRyeTsKKworICAgIC8qKgorICAgICAqIEBh
dXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKKyAgICAgKi8K
KworICAgIHZhciBTaGFwZVV0aWxzID0geworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBhcmVhIG9m
IHRoZSBjb250b3VyIHBvbHlnb24KKworICAgICAgICBhcmVhOiBmdW5jdGlvbiAoIGNvbnRvdXIg
KSB7CisKKyAgICAgICAgICAgIHZhciBuID0gY29udG91ci5sZW5ndGg7CisgICAgICAgICAgICB2
YXIgYSA9IDAuMDsKKworICAgICAgICAgICAgZm9yICggdmFyIHAgPSBuIC0gMSwgcSA9IDA7IHEg
PCBuOyBwID0gcSArKyApIHsKKworICAgICAgICAgICAgICAgIGEgKz0gY29udG91clsgcCBdLngg
KiBjb250b3VyWyBxIF0ueSAtIGNvbnRvdXJbIHEgXS54ICogY29udG91clsgcCBdLnk7CisKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGEgKiAwLjU7CisKKyAgICAgICAgfSwK
KworICAgICAgICB0cmlhbmd1bGF0ZTogKCBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8q
KgorICAgICAgICAgICAgICogVGhpcyBjb2RlIGlzIGEgcXVpY2sgcG9ydCBvZiBjb2RlIHdyaXR0
ZW4gaW4gQysrIHdoaWNoIHdhcyBzdWJtaXR0ZWQgdG8KKyAgICAgICAgICAgICAqIGZsaXBjb2Rl
LmNvbSBieSBKb2huIFcuIFJhdGNsaWZmICAvLyBKdWx5IDIyLCAyMDAwCisgICAgICAgICAgICAg
KiBTZWUgb3JpZ2luYWwgY29kZSBhbmQgbW9yZSBpbmZvcm1hdGlvbiBoZXJlOgorICAgICAgICAg
ICAgICogaHR0cDovL3d3dy5mbGlwY29kZS5jb20vYXJjaGl2ZXMvRWZmaWNpZW50X1BvbHlnb25f
VHJpYW5ndWxhdGlvbi5zaHRtbAorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIHBvcnRl
ZCB0byBhY3Rpb25zY3JpcHQgYnkgWmV2YW4gUm9zc2VyCisgICAgICAgICAgICAgKiB3d3cuYWN0
aW9uc25pcHBldC5jb20KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBwb3J0ZWQgdG8g
amF2YXNjcmlwdCBieSBKb3NodWEgS29vCisgICAgICAgICAgICAgKiBodHRwOi8vd3d3LmxhYjRn
YW1lcy5uZXQveno4NS9ibG9nCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICovCisKKyAg
ICAgICAgICAgIGZ1bmN0aW9uIHNuaXAoIGNvbnRvdXIsIHUsIHYsIHcsIG4sIHZlcnRzICkgewor
CisgICAgICAgICAgICAgICAgdmFyIHA7CisgICAgICAgICAgICAgICAgdmFyIGF4LCBheSwgYngs
IGJ5OworICAgICAgICAgICAgICAgIHZhciBjeCwgY3ksIHB4LCBweTsKKworICAgICAgICAgICAg
ICAgIGF4ID0gY29udG91clsgdmVydHNbIHUgXSBdLng7CisgICAgICAgICAgICAgICAgYXkgPSBj
b250b3VyWyB2ZXJ0c1sgdSBdIF0ueTsKKworICAgICAgICAgICAgICAgIGJ4ID0gY29udG91clsg
dmVydHNbIHYgXSBdLng7CisgICAgICAgICAgICAgICAgYnkgPSBjb250b3VyWyB2ZXJ0c1sgdiBd
IF0ueTsKKworICAgICAgICAgICAgICAgIGN4ID0gY29udG91clsgdmVydHNbIHcgXSBdLng7Cisg
ICAgICAgICAgICAgICAgY3kgPSBjb250b3VyWyB2ZXJ0c1sgdyBdIF0ueTsKKworICAgICAgICAg
ICAgICAgIGlmICggKCBieCAtIGF4ICkgKiAoIGN5IC0gYXkgKSAtICggYnkgLSBheSApICogKCBj
eCAtIGF4ICkgPD0gMCApIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIHZhciBhWCwg
YVksIGJYLCBiWSwgY1gsIGNZOworICAgICAgICAgICAgICAgIHZhciBhcHgsIGFweSwgYnB4LCBi
cHksIGNweCwgY3B5OworICAgICAgICAgICAgICAgIHZhciBjQ1JPU1NhcCwgYkNST1NTY3AsIGFD
Uk9TU2JwOworCisgICAgICAgICAgICAgICAgYVggPSBjeCAtIGJ4OyAgYVkgPSBjeSAtIGJ5Owor
ICAgICAgICAgICAgICAgIGJYID0gYXggLSBjeDsgIGJZID0gYXkgLSBjeTsKKyAgICAgICAgICAg
ICAgICBjWCA9IGJ4IC0gYXg7ICBjWSA9IGJ5IC0gYXk7CisKKyAgICAgICAgICAgICAgICBmb3Ig
KCBwID0gMDsgcCA8IG47IHAgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcHggPSBjb250
b3VyWyB2ZXJ0c1sgcCBdIF0ueDsKKyAgICAgICAgICAgICAgICAgICAgcHkgPSBjb250b3VyWyB2
ZXJ0c1sgcCBdIF0ueTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICggKCBweCA9PT0gYXgg
KSAmJiAoIHB5ID09PSBheSApICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoICggcHgg
PT09IGJ4ICkgJiYgKCBweSA9PT0gYnkgKSApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAg
KCAoIHB4ID09PSBjeCApICYmICggcHkgPT09IGN5ICkgKSApICAgY29udGludWU7CisKKyAgICAg
ICAgICAgICAgICAgICAgYXB4ID0gcHggLSBheDsgIGFweSA9IHB5IC0gYXk7CisgICAgICAgICAg
ICAgICAgICAgIGJweCA9IHB4IC0gYng7ICBicHkgPSBweSAtIGJ5OworICAgICAgICAgICAgICAg
ICAgICBjcHggPSBweCAtIGN4OyAgY3B5ID0gcHkgLSBjeTsKKworICAgICAgICAgICAgICAgICAg
ICAvLyBzZWUgaWYgcCBpcyBpbnNpZGUgdHJpYW5nbGUgYWJjCisKKyAgICAgICAgICAgICAgICAg
ICAgYUNST1NTYnAgPSBhWCAqIGJweSAtIGFZICogYnB4OworICAgICAgICAgICAgICAgICAgICBj
Q1JPU1NhcCA9IGNYICogYXB5IC0gY1kgKiBhcHg7CisgICAgICAgICAgICAgICAgICAgIGJDUk9T
U2NwID0gYlggKiBjcHkgLSBiWSAqIGNweDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICgg
YUNST1NTYnAgPj0gLSBOdW1iZXIuRVBTSUxPTiApICYmICggYkNST1NTY3AgPj0gLSBOdW1iZXIu
RVBTSUxPTiApICYmICggY0NST1NTYXAgPj0gLSBOdW1iZXIuRVBTSUxPTiApICkgcmV0dXJuIGZh
bHNlOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGFrZXMgaW4gYW4gY29udG91ciBh
cnJheSBhbmQgcmV0dXJucworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gdHJpYW5ndWxh
dGUoIGNvbnRvdXIsIGluZGljZXMgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgbiA9IGNvbnRv
dXIubGVuZ3RoOworCisgICAgICAgICAgICAgICAgaWYgKCBuIDwgMyApIHJldHVybiBudWxsOwor
CisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdLAorICAgICAgICAgICAgICAgICAgICB2
ZXJ0cyA9IFtdLAorICAgICAgICAgICAgICAgICAgICB2ZXJ0SW5kaWNlcyA9IFtdOworCisgICAg
ICAgICAgICAgICAgLyogd2Ugd2FudCBhIGNvdW50ZXItY2xvY2t3aXNlIHBvbHlnb24gaW4gdmVy
dHMgKi8KKworICAgICAgICAgICAgICAgIHZhciB1LCB2LCB3OworCisgICAgICAgICAgICAgICAg
aWYgKCBTaGFwZVV0aWxzLmFyZWEoIGNvbnRvdXIgKSA+IDAuMCApIHsKKworICAgICAgICAgICAg
ICAgICAgICBmb3IgKCB2ID0gMDsgdiA8IG47IHYgKysgKSB2ZXJ0c1sgdiBdID0gdjsKKworICAg
ICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggdiA9IDA7
IHYgPCBuOyB2ICsrICkgdmVydHNbIHYgXSA9ICggbiAtIDEgKSAtIHY7CisKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgbnYgPSBuOworCisgICAgICAgICAgICAgICAg
LyogIHJlbW92ZSBudiAtIDIgdmVydGljZXMsIGNyZWF0aW5nIDEgdHJpYW5nbGUgZXZlcnkgdGlt
ZSAqLworCisgICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gMiAqIG52OyAgIC8qIGVycm9yIGRl
dGVjdGlvbiAqLworCisgICAgICAgICAgICAgICAgZm9yICggdiA9IG52IC0gMTsgbnYgPiAyOyAp
IHsKKworICAgICAgICAgICAgICAgICAgICAvKiBpZiB3ZSBsb29wLCBpdCBpcyBwcm9iYWJseSBh
IG5vbi1zaW1wbGUgcG9seWdvbiAqLworCisgICAgICAgICAgICAgICAgICAgIGlmICggKCBjb3Vu
dCAtLSApIDw9IDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vKiogVHJpYW5ndWxh
dGU6IEVSUk9SIC0gcHJvYmFibGUgYmFkIHBvbHlnb24hCisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIC8vdGhyb3cgKCAiV2FybmluZywgdW5hYmxlIHRvIHRyaWFuZ3VsYXRlIHBvbHlnb24hIiAp
OworICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIFNvbWV0aW1lcyB3YXJuaW5nIGlzIGZpbmUsIGVzcGVjaWFsbHkgcG9seWdv
bnMgYXJlIHRyaWFuZ3VsYXRlZCBpbiByZXZlcnNlLgorICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGVVdGlsczogVW5hYmxlIHRvIHRyaWFuZ3VsYXRlIHBv
bHlnb24hIGluIHRyaWFuZ3VsYXRlKCknICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICggaW5kaWNlcyApIHJldHVybiB2ZXJ0SW5kaWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybiByZXN1bHQ7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgICAgIC8qIHRocmVlIGNvbnNlY3V0aXZlIHZlcnRpY2VzIGluIGN1cnJlbnQgcG9seWdvbiwg
PHUsdix3PiAqLworCisgICAgICAgICAgICAgICAgICAgIHUgPSB2OyAgICAgIGlmICggbnYgPD0g
dSApIHUgPSAwOyAgICAgLyogcHJldmlvdXMgKi8KKyAgICAgICAgICAgICAgICAgICAgdiA9IHUg
KyAxOyAgaWYgKCBudiA8PSB2ICkgdiA9IDA7ICAgICAvKiBuZXcgdiAgICAqLworICAgICAgICAg
ICAgICAgICAgICB3ID0gdiArIDE7ICBpZiAoIG52IDw9IHcgKSB3ID0gMDsgICAgIC8qIG5leHQg
ICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzbmlwKCBjb250b3VyLCB1LCB2LCB3
LCBudiwgdmVydHMgKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIGIsIGMs
IHMsIHQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRydWUgbmFtZXMgb2YgdGhlIHZl
cnRpY2VzICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB2ZXJ0c1sgdSBdOworICAg
ICAgICAgICAgICAgICAgICAgICAgYiA9IHZlcnRzWyB2IF07CisgICAgICAgICAgICAgICAgICAg
ICAgICBjID0gdmVydHNbIHcgXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0
IFRyaWFuZ2xlICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCBbIGNv
bnRvdXJbIGEgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250b3VyWyBiIF0sCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udG91clsgYyBdIF0gKTsKKworCisgICAgICAg
ICAgICAgICAgICAgICAgICB2ZXJ0SW5kaWNlcy5wdXNoKCBbIHZlcnRzWyB1IF0sIHZlcnRzWyB2
IF0sIHZlcnRzWyB3IF0gXSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUg
diBmcm9tIHRoZSByZW1haW5pbmcgcG9seWdvbiAqLworCisgICAgICAgICAgICAgICAgICAgICAg
ICBmb3IgKCBzID0gdiwgdCA9IHYgKyAxOyB0IDwgbnY7IHMgKyssIHQgKysgKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0c1sgcyBdID0gdmVydHNbIHQgXTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBudiAtLTsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXQgZXJyb3IgZGV0ZWN0aW9uIGNvdW50ZXIg
Ki8KKworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAyICogbnY7CisKKyAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYg
KCBpbmRpY2VzICkgcmV0dXJuIHZlcnRJbmRpY2VzOworICAgICAgICAgICAgICAgIHJldHVybiBy
ZXN1bHQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9ICkoKSwKKworICAgICAgICB0cmlh
bmd1bGF0ZVNoYXBlOiBmdW5jdGlvbiAoIGNvbnRvdXIsIGhvbGVzICkgeworCisgICAgICAgICAg
ICBmdW5jdGlvbiByZW1vdmVEdXBFbmRQdHMocG9pbnRzKSB7CisKKyAgICAgICAgICAgICAgICB2
YXIgbCA9IHBvaW50cy5sZW5ndGg7CisKKyAgICAgICAgICAgICAgICBpZiAoIGwgPiAyICYmIHBv
aW50c1sgbCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgcG9pbnRzLnBvcCgpOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIHJlbW92ZUR1cEVuZFB0cyggY29udG91ciApOworICAgICAgICAgICAg
aG9sZXMuZm9yRWFjaCggcmVtb3ZlRHVwRW5kUHRzICk7CisKKyAgICAgICAgICAgIGZ1bmN0aW9u
IHBvaW50X2luX3NlZ21lbnRfMkRfY29saW4oIGluU2VnUHQxLCBpblNlZ1B0MiwgaW5PdGhlclB0
ICkgeworCisgICAgICAgICAgICAgICAgLy8gaW5PdGhlclB0IG5lZWRzIHRvIGJlIGNvbGxpbmVh
ciB0byB0aGUgaW5TZWdtZW50CisgICAgICAgICAgICAgICAgaWYgKCBpblNlZ1B0MS54ICE9PSBp
blNlZ1B0Mi54ICkgeworCisgICAgICAgICAgICAgICAgICAgIGlmICggaW5TZWdQdDEueCA8IGlu
U2VnUHQyLnggKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKCAoIGluU2Vn
UHQxLnggPD0gaW5PdGhlclB0LnggKSAmJiAoIGluT3RoZXJQdC54IDw9IGluU2VnUHQyLnggKSAp
OworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHJldHVybiAgKCAoIGluU2VnUHQyLnggPD0gaW5PdGhlclB0LnggKSAmJiAoIGluT3RoZXJQ
dC54IDw9IGluU2VnUHQxLnggKSApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpblNlZ1B0MS55
IDwgaW5TZWdQdDIueSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoICgg
aW5TZWdQdDEueSA8PSBpbk90aGVyUHQueSApICYmICggaW5PdGhlclB0LnkgPD0gaW5TZWdQdDIu
eSApICk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuICAoICggaW5TZWdQdDIueSA8PSBpbk90aGVyUHQueSApICYmICggaW5P
dGhlclB0LnkgPD0gaW5TZWdQdDEueSApICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0aW9u
IGludGVyc2VjdF9zZWdtZW50c18yRCggaW5TZWcxUHQxLCBpblNlZzFQdDIsIGluU2VnMlB0MSwg
aW5TZWcyUHQyLCBpbkV4Y2x1ZGVBZGphY2VudFNlZ3MgKSB7CisKKyAgICAgICAgICAgICAgICB2
YXIgc2VnMWR4ID0gaW5TZWcxUHQyLnggLSBpblNlZzFQdDEueCwgICBzZWcxZHkgPSBpblNlZzFQ
dDIueSAtIGluU2VnMVB0MS55OworICAgICAgICAgICAgICAgIHZhciBzZWcyZHggPSBpblNlZzJQ
dDIueCAtIGluU2VnMlB0MS54LCAgIHNlZzJkeSA9IGluU2VnMlB0Mi55IC0gaW5TZWcyUHQxLnk7
CisKKyAgICAgICAgICAgICAgICB2YXIgc2VnMXNlZzJkeCA9IGluU2VnMVB0MS54IC0gaW5TZWcy
UHQxLng7CisgICAgICAgICAgICAgICAgdmFyIHNlZzFzZWcyZHkgPSBpblNlZzFQdDEueSAtIGlu
U2VnMlB0MS55OworCisgICAgICAgICAgICAgICAgdmFyIGxpbWl0ICAgICAgID0gc2VnMWR5ICog
c2VnMmR4IC0gc2VnMWR4ICogc2VnMmR5OworICAgICAgICAgICAgICAgIHZhciBwZXJwU2VnMSAg
ICA9IHNlZzFkeSAqIHNlZzFzZWcyZHggLSBzZWcxZHggKiBzZWcxc2VnMmR5OworCisgICAgICAg
ICAgICAgICAgaWYgKCBNYXRoLmFicyggbGltaXQgKSA+IE51bWJlci5FUFNJTE9OICkgeworCisg
ICAgICAgICAgICAgICAgICAgIC8vIG5vdCBwYXJhbGxlbAorCisgICAgICAgICAgICAgICAgICAg
IHZhciBwZXJwU2VnMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBsaW1pdCA+IDAgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCBwZXJwU2VnMSA8IDAgKSB8fCAoIHBlcnBT
ZWcxID4gbGltaXQgKSApICAgICAgICAgcmV0dXJuIFtdOworICAgICAgICAgICAgICAgICAgICAg
ICAgcGVycFNlZzIgPSBzZWcyZHkgKiBzZWcxc2VnMmR4IC0gc2VnMmR4ICogc2VnMXNlZzJkeTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCBwZXJwU2VnMiA8IDAgKSB8fCAoIHBlcnBT
ZWcyID4gbGltaXQgKSApICAgICAgICAgcmV0dXJuIFtdOworCisgICAgICAgICAgICAgICAgICAg
IH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCBwZXJwU2VnMSA+IDAg
KSB8fCAoIHBlcnBTZWcxIDwgbGltaXQgKSApICAgICAgICAgcmV0dXJuIFtdOworICAgICAgICAg
ICAgICAgICAgICAgICAgcGVycFNlZzIgPSBzZWcyZHkgKiBzZWcxc2VnMmR4IC0gc2VnMmR4ICog
c2VnMXNlZzJkeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCBwZXJwU2VnMiA+IDAg
KSB8fCAoIHBlcnBTZWcyIDwgbGltaXQgKSApICAgICAgICAgcmV0dXJuIFtdOworCisgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIHRvIHJlZHVjZSBy
b3VuZGluZyBlcnJvcnMKKyAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJzZWN0aW9uIGF0IGVu
ZHBvaW50IG9mIHNlZ21lbnQjMT8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwZXJwU2VnMiA9
PT0gMCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIGluRXhjbHVkZUFkamFj
ZW50U2VncyApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCBwZXJwU2VnMSA9
PT0gMCApIHx8ICggcGVycFNlZzEgPT09IGxpbWl0ICkgKSApICAgICByZXR1cm4gW107CisgICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyBpblNlZzFQdDEgXTsKKworICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggcGVycFNlZzIgPT09IGxpbWl0ICkg
eworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggaW5FeGNsdWRlQWRqYWNlbnRTZWdz
ICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIHBlcnBTZWcxID09PSAwICkg
fHwgKCBwZXJwU2VnMSA9PT0gbGltaXQgKSApICkgICAgIHJldHVybiBbXTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBbIGluU2VnMVB0MiBdOworCisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJzZWN0aW9uIGF0IGVuZHBvaW50IG9mIHNl
Z21lbnQjMj8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwZXJwU2VnMSA9PT0gMCApICAgICAg
IHJldHVybiBbIGluU2VnMlB0MSBdOworICAgICAgICAgICAgICAgICAgICBpZiAoIHBlcnBTZWcx
ID09PSBsaW1pdCApICAgcmV0dXJuIFsgaW5TZWcyUHQyIF07CisKKyAgICAgICAgICAgICAgICAg
ICAgLy8gcmV0dXJuIHJlYWwgaW50ZXJzZWN0aW9uIHBvaW50CisgICAgICAgICAgICAgICAgICAg
IHZhciBmYWN0b3JTZWcxID0gcGVycFNlZzIgLyBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuICBbIHsgeDogaW5TZWcxUHQxLnggKyBmYWN0b3JTZWcxICogc2VnMWR4LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBpblNlZzFQdDEueSArIGZhY3RvclNlZzEgKiBz
ZWcxZHkgfSBdOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAg
ICAgICAvLyBwYXJhbGxlbCBvciBjb2xsaW5lYXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAo
IHBlcnBTZWcxICE9PSAwICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoIHNlZzJkeSAq
IHNlZzFzZWcyZHggIT09IHNlZzJkeCAqIHNlZzFzZWcyZHkgKSApICAgICAgICAgIHJldHVybiBb
XTsKKworICAgICAgICAgICAgICAgICAgICAvLyB0aGV5IGFyZSBjb2xsaW5lYXIgb3IgZGVnZW5l
cmF0ZQorICAgICAgICAgICAgICAgICAgICB2YXIgc2VnMVB0ID0gKCAoIHNlZzFkeCA9PT0gMCAp
ICYmICggc2VnMWR5ID09PSAwICkgKTsgIC8vIHNlZ21lbnQxIGlzIGp1c3QgYSBwb2ludD8KKyAg
ICAgICAgICAgICAgICAgICAgdmFyIHNlZzJQdCA9ICggKCBzZWcyZHggPT09IDAgKSAmJiAoIHNl
ZzJkeSA9PT0gMCApICk7ICAvLyBzZWdtZW50MiBpcyBqdXN0IGEgcG9pbnQ/CisgICAgICAgICAg
ICAgICAgICAgIC8vIGJvdGggc2VnbWVudHMgYXJlIHBvaW50cworICAgICAgICAgICAgICAgICAg
ICBpZiAoIHNlZzFQdCAmJiBzZWcyUHQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICggKCBpblNlZzFQdDEueCAhPT0gaW5TZWcyUHQxLnggKSB8fAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoIGluU2VnMVB0MS55ICE9PSBpblNlZzJQdDEueSApICkgICAgICByZXR1cm4g
W107ICAvLyB0aGV5IGFyZSBkaXN0aW5jdCAgcG9pbnRzCisgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gWyBpblNlZzFQdDEgXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyB0aGV5IGFyZSB0aGUgc2FtZSBwb2ludAorCisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgLy8gc2VnbWVudCMxICBpcyBhIHNpbmdsZSBwb2ludAorICAg
ICAgICAgICAgICAgICAgICBpZiAoIHNlZzFQdCApIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKCAhIHBvaW50X2luX3NlZ21lbnRfMkRfY29saW4oIGluU2VnMlB0MSwgaW5TZWcyUHQy
LCBpblNlZzFQdDEgKSApICAgICAgIHJldHVybiBbXTsgICAgICAvLyBidXQgbm90IGluIHNlZ21l
bnQjMgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgaW5TZWcxUHQxIF07CisKKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBzZWdtZW50IzIgIGlz
IGEgc2luZ2xlIHBvaW50CisgICAgICAgICAgICAgICAgICAgIGlmICggc2VnMlB0ICkgeworCisg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgcG9pbnRfaW5fc2VnbWVudF8yRF9jb2xpbigg
aW5TZWcxUHQxLCBpblNlZzFQdDIsIGluU2VnMlB0MSApICkgICAgICAgcmV0dXJuIFtdOyAgICAg
IC8vIGJ1dCBub3QgaW4gc2VnbWVudCMxCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
WyBpblNlZzJQdDEgXTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAgICAgLy8gdGhleSBhcmUgY29sbGluZWFyIHNlZ21lbnRzLCB3aGljaCBtaWdodCBvdmVybGFw
CisgICAgICAgICAgICAgICAgICAgIHZhciBzZWcxbWluLCBzZWcxbWF4LCBzZWcxbWluVmFsLCBz
ZWcxbWF4VmFsOworICAgICAgICAgICAgICAgICAgICB2YXIgc2VnMm1pbiwgc2VnMm1heCwgc2Vn
Mm1pblZhbCwgc2VnMm1heFZhbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzZWcxZHggIT09
IDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWdtZW50cyBhcmUgTk9U
IG9uIGEgdmVydGljYWwgbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpblNlZzFQ
dDEueCA8IGluU2VnMVB0Mi54ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vn
MW1pbiA9IGluU2VnMVB0MTsgc2VnMW1pblZhbCA9IGluU2VnMVB0MS54OworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHNlZzFtYXggPSBpblNlZzFQdDI7IHNlZzFtYXhWYWwgPSBpblNlZzFQ
dDIueDsKKworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHNlZzFtaW4gPSBpblNlZzFQdDI7IHNlZzFtaW5WYWwgPSBpblNlZzFQ
dDIueDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWcxbWF4ID0gaW5TZWcxUHQxOyBz
ZWcxbWF4VmFsID0gaW5TZWcxUHQxLng7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5TZWcyUHQxLnggPCBpblNlZzJQdDIueCApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZzJtaW4gPSBpblNlZzJQdDE7IHNlZzJt
aW5WYWwgPSBpblNlZzJQdDEueDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWcybWF4
ID0gaW5TZWcyUHQyOyBzZWcybWF4VmFsID0gaW5TZWcyUHQyLng7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWcybWlu
ID0gaW5TZWcyUHQyOyBzZWcybWluVmFsID0gaW5TZWcyUHQyLng7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2VnMm1heCA9IGluU2VnMlB0MTsgc2VnMm1heFZhbCA9IGluU2VnMlB0MS54
OworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfSBl
bHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlZ21lbnRzIGFyZSBvbiBh
IHZlcnRpY2FsIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5TZWcxUHQxLnkg
PCBpblNlZzFQdDIueSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZzFtaW4g
PSBpblNlZzFQdDE7IHNlZzFtaW5WYWwgPSBpblNlZzFQdDEueTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZWcxbWF4ID0gaW5TZWcxUHQyOyBzZWcxbWF4VmFsID0gaW5TZWcxUHQyLnk7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZWcxbWluID0gaW5TZWcxUHQyOyBzZWcxbWluVmFsID0gaW5TZWcxUHQyLnk7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnMW1heCA9IGluU2VnMVB0MTsgc2VnMW1h
eFZhbCA9IGluU2VnMVB0MS55OworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoIGluU2VnMlB0MS55IDwgaW5TZWcyUHQyLnkgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzZWcybWluID0gaW5TZWcyUHQxOyBzZWcybWluVmFs
ID0gaW5TZWcyUHQxLnk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnMm1heCA9IGlu
U2VnMlB0Mjsgc2VnMm1heFZhbCA9IGluU2VnMlB0Mi55OworCisgICAgICAgICAgICAgICAgICAg
ICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnMm1pbiA9IGlu
U2VnMlB0Mjsgc2VnMm1pblZhbCA9IGluU2VnMlB0Mi55OworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHNlZzJtYXggPSBpblNlZzJQdDE7IHNlZzJtYXhWYWwgPSBpblNlZzJQdDEueTsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCBzZWcxbWluVmFsIDw9IHNlZzJtaW5WYWwgKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggc2VnMW1heFZhbCA8ICBzZWcybWluVmFsICkgcmV0dXJu
IFtdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzZWcxbWF4VmFsID09PSBzZWcybWlu
VmFsICkgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbkV4Y2x1ZGVB
ZGphY2VudFNlZ3MgKSAgICAgICAgcmV0dXJuIFtdOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBbIHNlZzJtaW4gXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCBzZWcxbWF4VmFsIDw9IHNlZzJtYXhWYWwgKSByZXR1
cm4gWyBzZWcybWluLCBzZWcxbWF4IF07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
IFsgc2VnMm1pbiwgc2VnMm1heCBdOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc2VnMW1pblZhbCA+ICBzZWcybWF4VmFsICkg
cmV0dXJuIFtdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzZWcxbWluVmFsID09PSBz
ZWcybWF4VmFsICkgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbkV4
Y2x1ZGVBZGphY2VudFNlZ3MgKSAgICAgICAgcmV0dXJuIFtdOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBbIHNlZzFtaW4gXTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzZWcxbWF4VmFsIDw9IHNlZzJtYXhWYWwg
KSByZXR1cm4gWyBzZWcxbWluLCBzZWcxbWF4IF07CisgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gIFsgc2VnMW1pbiwgc2VnMm1heCBdOworCisgICAgICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdW5jdGlv
biBpc1BvaW50SW5zaWRlQW5nbGUoIGluVmVydGV4LCBpbkxlZ0Zyb21QdCwgaW5MZWdUb1B0LCBp
bk90aGVyUHQgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgb3JkZXIgb2YgbGVncyBpcyBp
bXBvcnRhbnQKKworICAgICAgICAgICAgICAgIC8vIHRyYW5zbGF0aW9uIG9mIGFsbCBwb2ludHMs
IHNvIHRoYXQgVmVydGV4IGlzIGF0ICgwLDApCisgICAgICAgICAgICAgICAgdmFyIGxlZ0Zyb21Q
dFggID0gaW5MZWdGcm9tUHQueCAtIGluVmVydGV4LngsICBsZWdGcm9tUHRZICAgPSBpbkxlZ0Zy
b21QdC55IC0gaW5WZXJ0ZXgueTsKKyAgICAgICAgICAgICAgICB2YXIgbGVnVG9QdFggICAgPSBp
bkxlZ1RvUHQueCAgIC0gaW5WZXJ0ZXgueCwgIGxlZ1RvUHRZICAgICA9IGluTGVnVG9QdC55ICAg
LSBpblZlcnRleC55OworICAgICAgICAgICAgICAgIHZhciBvdGhlclB0WCAgICA9IGluT3RoZXJQ
dC54ICAgLSBpblZlcnRleC54LCAgb3RoZXJQdFkgICAgID0gaW5PdGhlclB0LnkgICAtIGluVmVy
dGV4Lnk7CisKKyAgICAgICAgICAgICAgICAvLyBtYWluIGFuZ2xlID4wOiA8IDE4MCBkZWcuOyAw
OiAxODAgZGVnLjsgPDA6ID4gMTgwIGRlZy4KKyAgICAgICAgICAgICAgICB2YXIgZnJvbTJ0b0Fu
Z2xlICAgID0gbGVnRnJvbVB0WCAqIGxlZ1RvUHRZIC0gbGVnRnJvbVB0WSAqIGxlZ1RvUHRYOwor
ICAgICAgICAgICAgICAgIHZhciBmcm9tMm90aGVyQW5nbGUgPSBsZWdGcm9tUHRYICogb3RoZXJQ
dFkgLSBsZWdGcm9tUHRZICogb3RoZXJQdFg7CisKKyAgICAgICAgICAgICAgICBpZiAoIE1hdGgu
YWJzKCBmcm9tMnRvQW5nbGUgKSA+IE51bWJlci5FUFNJTE9OICkgeworCisgICAgICAgICAgICAg
ICAgICAgIC8vIGFuZ2xlICE9IDE4MCBkZWcuCisKKyAgICAgICAgICAgICAgICAgICAgdmFyIG90
aGVyMnRvQW5nbGUgICAgICAgPSBvdGhlclB0WCAqIGxlZ1RvUHRZIC0gb3RoZXJQdFkgKiBsZWdU
b1B0WDsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coICJmcm9tMnRvOiAiICsg
ZnJvbTJ0b0FuZ2xlICsgIiwgZnJvbTJvdGhlcjogIiArIGZyb20yb3RoZXJBbmdsZSArICIsIG90
aGVyMnRvOiAiICsgb3RoZXIydG9BbmdsZSApOworCisgICAgICAgICAgICAgICAgICAgIGlmICgg
ZnJvbTJ0b0FuZ2xlID4gMCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFpbiBh
bmdsZSA8IDE4MCBkZWcuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gICggKCBmcm9t
Mm90aGVyQW5nbGUgPj0gMCApICYmICggb3RoZXIydG9BbmdsZSA+PSAwICkgKTsKKworICAgICAg
ICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWlu
IGFuZ2xlID4gMTgwIGRlZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKCAoIGZy
b20yb3RoZXJBbmdsZSA+PSAwICkgfHwgKCBvdGhlcjJ0b0FuZ2xlID49IDAgKSApOworCisgICAg
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgLy8gYW5nbGUgPT0gMTgwIGRlZy4KKyAgICAgICAgICAgICAgICAgICAgLy8g
Y29uc29sZS5sb2coICJmcm9tMnRvOiAxODAgZGVnLiwgZnJvbTJvdGhlcjogIiArIGZyb20yb3Ro
ZXJBbmdsZSAgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoIGZyb20yb3RoZXJBbmds
ZSA+IDAgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAg
ICAgICAgIGZ1bmN0aW9uIHJlbW92ZUhvbGVzKCBjb250b3VyLCBob2xlcyApIHsKKworICAgICAg
ICAgICAgICAgIHZhciBzaGFwZSA9IGNvbnRvdXIuY29uY2F0KCk7IC8vIHdvcmsgb24gdGhpcyBz
aGFwZQorICAgICAgICAgICAgICAgIHZhciBob2xlOworCisgICAgICAgICAgICAgICAgZnVuY3Rp
b24gaXNDdXRMaW5lSW5zaWRlQW5nbGVzKCBpblNoYXBlSWR4LCBpbkhvbGVJZHggKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaG9sZSBwb2ludCBsaWVzIHdpdGhpbiBhbmds
ZSBhcm91bmQgc2hhcGUgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RTaGFwZUlk
eCA9IHNoYXBlLmxlbmd0aCAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZTaGFw
ZUlkeCA9IGluU2hhcGVJZHggLSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoIHByZXZTaGFw
ZUlkeCA8IDAgKSAgICAgICAgIHByZXZTaGFwZUlkeCA9IGxhc3RTaGFwZUlkeDsKKworICAgICAg
ICAgICAgICAgICAgICB2YXIgbmV4dFNoYXBlSWR4ID0gaW5TaGFwZUlkeCArIDE7CisgICAgICAg
ICAgICAgICAgICAgIGlmICggbmV4dFNoYXBlSWR4ID4gbGFzdFNoYXBlSWR4ICkgIG5leHRTaGFw
ZUlkeCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGluc2lkZUFuZ2xlID0gaXNQb2lu
dEluc2lkZUFuZ2xlKCBzaGFwZVsgaW5TaGFwZUlkeCBdLCBzaGFwZVsgcHJldlNoYXBlSWR4IF0s
IHNoYXBlWyBuZXh0U2hhcGVJZHggXSwgaG9sZVsgaW5Ib2xlSWR4IF0gKTsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKCAhIGluc2lkZUFuZ2xlICkgeworCisgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBjb25zb2xlLmxvZyggIlZlcnRleCAoU2hhcGUpOiAiICsgaW5TaGFwZUlkeCArICIsIFBv
aW50OiAiICsgaG9sZVtpbkhvbGVJZHhdLnggKyAiLyIgKyBob2xlW2luSG9sZUlkeF0ueSApOwor
ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBmYWxzZTsKKworICAgICAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgc2hhcGUgcG9pbnQgbGll
cyB3aXRoaW4gYW5nbGUgYXJvdW5kIGhvbGUgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgdmFy
IGxhc3RIb2xlSWR4ID0gaG9sZS5sZW5ndGggLSAxOworCisgICAgICAgICAgICAgICAgICAgIHZh
ciBwcmV2SG9sZUlkeCA9IGluSG9sZUlkeCAtIDE7CisgICAgICAgICAgICAgICAgICAgIGlmICgg
cHJldkhvbGVJZHggPCAwICkgICAgICAgICAgcHJldkhvbGVJZHggPSBsYXN0SG9sZUlkeDsKKwor
ICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dEhvbGVJZHggPSBpbkhvbGVJZHggKyAxOworICAg
ICAgICAgICAgICAgICAgICBpZiAoIG5leHRIb2xlSWR4ID4gbGFzdEhvbGVJZHggKSAgICBuZXh0
SG9sZUlkeCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaW5zaWRlQW5nbGUgPSBpc1BvaW50
SW5zaWRlQW5nbGUoIGhvbGVbIGluSG9sZUlkeCBdLCBob2xlWyBwcmV2SG9sZUlkeCBdLCBob2xl
WyBuZXh0SG9sZUlkeCBdLCBzaGFwZVsgaW5TaGFwZUlkeCBdICk7CisgICAgICAgICAgICAgICAg
ICAgIGlmICggISBpbnNpZGVBbmdsZSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8g
Y29uc29sZS5sb2coICJWZXJ0ZXggKEhvbGUpOiAiICsgaW5Ib2xlSWR4ICsgIiwgUG9pbnQ6ICIg
KyBzaGFwZVtpblNoYXBlSWR4XS54ICsgIi8iICsgc2hhcGVbaW5TaGFwZUlkeF0ueSApOworICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBmYWxzZTsKKworICAgICAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICB0cnVlOworCisgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgZnVuY3Rpb24gaW50ZXJzZWN0c1NoYXBlRWRnZSggaW5T
aGFwZVB0LCBpbkhvbGVQdCApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBjaGVja3MgZm9y
IGludGVyc2VjdGlvbnMgd2l0aCBzaGFwZSBlZGdlcworICAgICAgICAgICAgICAgICAgICB2YXIg
c0lkeCwgbmV4dElkeCwgaW50ZXJzZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBmb3IgKCBz
SWR4ID0gMDsgc0lkeCA8IHNoYXBlLmxlbmd0aDsgc0lkeCArKyApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgbmV4dElkeCA9IHNJZHggKyAxOyBuZXh0SWR4ICU9IHNoYXBlLmxlbmd0aDsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyc2VjdGlvbiA9IGludGVyc2VjdF9zZWdtZW50
c18yRCggaW5TaGFwZVB0LCBpbkhvbGVQdCwgc2hhcGVbIHNJZHggXSwgc2hhcGVbIG5leHRJZHgg
XSwgdHJ1ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnRlcnNlY3Rpb24ubGVu
Z3RoID4gMCApICAgICAgcmV0dXJuICB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGZhbHNlOworCisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgdmFyIGluZGVwSG9sZXMgPSBbXTsKKworICAgICAgICAgICAgICAg
IGZ1bmN0aW9uIGludGVyc2VjdHNIb2xlRWRnZSggaW5TaGFwZVB0LCBpbkhvbGVQdCApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAvLyBjaGVja3MgZm9yIGludGVyc2VjdGlvbnMgd2l0aCBob2xl
IGVkZ2VzCisgICAgICAgICAgICAgICAgICAgIHZhciBpaElkeCwgY2hrSG9sZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGhJZHgsIG5leHRJZHgsIGludGVyc2VjdGlvbjsKKyAgICAgICAgICAg
ICAgICAgICAgZm9yICggaWhJZHggPSAwOyBpaElkeCA8IGluZGVwSG9sZXMubGVuZ3RoOyBpaElk
eCArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2hrSG9sZSA9IGhvbGVzWyBpbmRl
cEhvbGVzWyBpaElkeCBdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIGhJZHggPSAw
OyBoSWR4IDwgY2hrSG9sZS5sZW5ndGg7IGhJZHggKysgKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBuZXh0SWR4ID0gaElkeCArIDE7IG5leHRJZHggJT0gY2hrSG9sZS5sZW5ndGg7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0X3Nl
Z21lbnRzXzJEKCBpblNoYXBlUHQsIGluSG9sZVB0LCBjaGtIb2xlWyBoSWR4IF0sIGNoa0hvbGVb
IG5leHRJZHggXSwgdHJ1ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW50
ZXJzZWN0aW9uLmxlbmd0aCA+IDAgKSAgICAgIHJldHVybiAgdHJ1ZTsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuICBmYWxzZTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IHZhciBob2xlSW5kZXgsIHNoYXBlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHNoYXBlUHQs
IGhvbGVQdCwKKyAgICAgICAgICAgICAgICAgICAgaG9sZUlkeCwgY3V0S2V5LCBmYWlsZWRDdXRz
ID0gW10sCisgICAgICAgICAgICAgICAgICAgIHRtcFNoYXBlMSwgdG1wU2hhcGUyLAorICAgICAg
ICAgICAgICAgICAgICB0bXBIb2xlMSwgdG1wSG9sZTI7CisKKyAgICAgICAgICAgICAgICBmb3Ig
KCB2YXIgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgaW5kZXBIb2xlcy5wdXNoKCBoICk7CisKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICB2YXIgbWluU2hhcGVJbmRleCA9IDA7CisgICAgICAgICAgICAg
ICAgdmFyIGNvdW50ZXIgPSBpbmRlcEhvbGVzLmxlbmd0aCAqIDI7CisgICAgICAgICAgICAgICAg
d2hpbGUgKCBpbmRlcEhvbGVzLmxlbmd0aCA+IDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
Y291bnRlciAtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjb3VudGVyIDwgMCApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coICJJbmZpbml0ZSBMb29wISBIb2xl
cyBsZWZ0OiIgKyBpbmRlcEhvbGVzLmxlbmd0aCArICIsIFByb2JhYmx5IEhvbGUgb3V0c2lkZSBT
aGFwZSEiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGZvciBzaGFwZS12ZXJ0
ZXggYW5kIGhvbGUtdmVydGV4LAorICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBjYW4gYmUg
Y29ubmVjdGVkIHdpdGhvdXQgaW50ZXJzZWN0aW9ucworICAgICAgICAgICAgICAgICAgICBmb3Ig
KCBzaGFwZUluZGV4ID0gbWluU2hhcGVJbmRleDsgc2hhcGVJbmRleCA8IHNoYXBlLmxlbmd0aDsg
c2hhcGVJbmRleCArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVQdCA9IHNo
YXBlWyBzaGFwZUluZGV4IF07CisgICAgICAgICAgICAgICAgICAgICAgICBob2xlSW5kZXggICA9
IC0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGZvciBob2xlIHdoaWNo
IGNhbiBiZSByZWFjaGVkIHdpdGhvdXQgaW50ZXJzZWN0aW9ucworICAgICAgICAgICAgICAgICAg
ICAgICAgZm9yICggdmFyIGggPSAwOyBoIDwgaW5kZXBIb2xlcy5sZW5ndGg7IGggKysgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xlSWR4ID0gaW5kZXBIb2xlc1sgaCBdOwor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBtdWx0aXBsZSBjaGVja3MK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRLZXkgPSBzaGFwZVB0LnggKyAiOiIgKyBz
aGFwZVB0LnkgKyAiOiIgKyBob2xlSWR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICggZmFpbGVkQ3V0c1sgY3V0S2V5IF0gIT09IHVuZGVmaW5lZCApICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGUgPSBob2xlc1sgaG9sZUlkeCBd
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIHZhciBoMiA9IDA7IGgyIDwgaG9s
ZS5sZW5ndGg7IGgyICsrICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhv
bGVQdCA9IGhvbGVbIGgyIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgg
ISBpc0N1dExpbmVJbnNpZGVBbmdsZXMoIHNoYXBlSW5kZXgsIGgyICkgKSAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW50ZXJzZWN0c1NoYXBl
RWRnZSggc2hhcGVQdCwgaG9sZVB0ICkgKSAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCBpbnRlcnNlY3RzSG9sZUVkZ2UoIHNoYXBlUHQsIGhvbGVQ
dCApICkgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGhvbGVJbmRleCA9IGgyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlcEhv
bGVzLnNwbGljZSggaCwgMSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRt
cFNoYXBlMSA9IHNoYXBlLnNsaWNlKCAwLCBzaGFwZUluZGV4ICsgMSApOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB0bXBTaGFwZTIgPSBzaGFwZS5zbGljZSggc2hhcGVJbmRleCAp
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBIb2xlMSA9IGhvbGUuc2xpY2Uo
IGhvbGVJbmRleCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBIb2xlMiA9
IGhvbGUuc2xpY2UoIDAsIGhvbGVJbmRleCArIDEgKTsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzaGFwZSA9IHRtcFNoYXBlMS5jb25jYXQoIHRtcEhvbGUxICkuY29uY2F0KCB0
bXBIb2xlMiApLmNvbmNhdCggdG1wU2hhcGUyICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbWluU2hhcGVJbmRleCA9IHNoYXBlSW5kZXg7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gRGVidWcgb25seSwgdG8gc2hvdyB0aGUgc2VsZWN0ZWQgY3V0cwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbG9iX0N1dExpbmVzLnB1c2goIFsg
c2hhcGVQdCwgaG9sZVB0IF0gKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIGhvbGVJbmRleCA+PSAwICkgICBicmVhazsgICAgICAvLyBob2xlLXZl
cnRleCBmb3VuZAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkQ3V0c1sgY3V0
S2V5IF0gPSB0cnVlOyAgICAgICAgICAgIC8vIHJlbWVtYmVyIGZhaWx1cmUKKworICAgICAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBob2xlSW5kZXgg
Pj0gMCApICAgYnJlYWs7ICAgICAgLy8gaG9sZS12ZXJ0ZXggZm91bmQKKworICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4g
c2hhcGU7ICAgICAgICAgICAvKiBzaGFwZSB3aXRoIG5vIGhvbGVzICovCisKKyAgICAgICAgICAg
IH0KKworCisgICAgICAgICAgICB2YXIgaSwgaWwsIGYsIGZhY2UsCisgICAgICAgICAgICAgICAg
a2V5LCBpbmRleCwKKyAgICAgICAgICAgICAgICBhbGxQb2ludHNNYXAgPSB7fTsKKworICAgICAg
ICAgICAgLy8gVG8gbWFpbnRhaW4gcmVmZXJlbmNlIHRvIG9sZCBzaGFwZSwgb25lIG11c3QgbWF0
Y2ggY29vcmRpbmF0ZXMsIG9yIG9mZnNldCB0aGUgaW5kaWNlcyBmcm9tIG9yaWdpbmFsIGFycmF5
cy4gSXQncyBwcm9iYWJseSBlYXNpZXIgdG8gZG8gdGhlIGZpcnN0LgorCisgICAgICAgICAgICB2
YXIgYWxscG9pbnRzID0gY29udG91ci5jb25jYXQoKTsKKworICAgICAgICAgICAgZm9yICggdmFy
IGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkgeworCisgICAgICAgICAg
ICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIGFsbHBvaW50cywgaG9sZXNbIGggXSAp
OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vY29uc29sZS5sb2coICJhbGxwb2lu
dHMiLGFsbHBvaW50cywgYWxscG9pbnRzLmxlbmd0aCApOworCisgICAgICAgICAgICAvLyBwcmVw
YXJlIGFsbCBwb2ludHMgbWFwCisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwLCBpbCA9IGFsbHBv
aW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIGtleSA9IGFs
bHBvaW50c1sgaSBdLnggKyAiOiIgKyBhbGxwb2ludHNbIGkgXS55OworCisgICAgICAgICAgICAg
ICAgaWYgKCBhbGxQb2ludHNNYXBbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgY29uc29sZS53YXJuKCAiVEhSRUUuU2hhcGVVdGlsczogRHVwbGljYXRlIHBv
aW50Iiwga2V5LCBpICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBh
bGxQb2ludHNNYXBbIGtleSBdID0gaTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAv
LyByZW1vdmUgaG9sZXMgYnkgY3V0dGluZyBwYXRocyB0byBob2xlcyBhbmQgYWRkaW5nIHRoZW0g
dG8gdGhlIHNoYXBlCisgICAgICAgICAgICB2YXIgc2hhcGVXaXRob3V0SG9sZXMgPSByZW1vdmVI
b2xlcyggY29udG91ciwgaG9sZXMgKTsKKworICAgICAgICAgICAgdmFyIHRyaWFuZ2xlcyA9IFNo
YXBlVXRpbHMudHJpYW5ndWxhdGUoIHNoYXBlV2l0aG91dEhvbGVzLCBmYWxzZSApOyAvLyBUcnVl
IHJldHVybnMgaW5kaWNlcyBmb3IgcG9pbnRzIG9mIHNwb29sZWQgc2hhcGUKKyAgICAgICAgICAg
IC8vY29uc29sZS5sb2coICJ0cmlhbmdsZXMiLHRyaWFuZ2xlcywgdHJpYW5nbGVzLmxlbmd0aCAp
OworCisgICAgICAgICAgICAvLyBjaGVjayBhbGwgZmFjZSB2ZXJ0aWNlcyBhZ2FpbnN0IGFsbCBw
b2ludHMgbWFwCisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwLCBpbCA9IHRyaWFuZ2xlcy5sZW5n
dGg7IGkgPCBpbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIGZhY2UgPSB0cmlhbmdsZXNb
IGkgXTsKKworICAgICAgICAgICAgICAgIGZvciAoIGYgPSAwOyBmIDwgMzsgZiArKyApIHsKKwor
ICAgICAgICAgICAgICAgICAgICBrZXkgPSBmYWNlWyBmIF0ueCArICI6IiArIGZhY2VbIGYgXS55
OworCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYWxsUG9pbnRzTWFwWyBrZXkgXTsKKwor
ICAgICAgICAgICAgICAgICAgICBpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGZhY2VbIGYgXSA9IGluZGV4OworCisgICAgICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICByZXR1cm4gdHJpYW5nbGVzLmNvbmNhdCgpOworCisgICAgICAgIH0sCisKKyAgICAgICAgaXND
bG9ja1dpc2U6IGZ1bmN0aW9uICggcHRzICkgeworCisgICAgICAgICAgICByZXR1cm4gU2hhcGVV
dGlscy5hcmVhKCBwdHMgKSA8IDA7CisKKyAgICAgICAgfQorCisgICAgfTsKKworICAgIC8qKgor
ICAgICAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cK
KyAgICAgKgorICAgICAqIENyZWF0ZXMgZXh0cnVkZWQgZ2VvbWV0cnkgZnJvbSBhIHBhdGggc2hh
cGUuCisgICAgICoKKyAgICAgKiBwYXJhbWV0ZXJzID0geworICAgICAqCisgICAgICogIGN1cnZl
U2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXMKKyAgICAg
KiAgc3RlcHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIGZvciB6LXNpZGUgZXh0cnVzaW9u
cyAvIHVzZWQgZm9yIHN1YmRpdmlkaW5nIHNlZ21lbnRzIG9mIGV4dHJ1ZGUgc3BsaW5lIHRvbwor
ICAgICAqICBhbW91bnQ6IDxpbnQ+LCAvLyBEZXB0aCB0byBleHRydWRlIHRoZSBzaGFwZQorICAg
ICAqCisgICAgICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsCisgICAg
ICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRoZSBvcmlnaW5h
bCBzaGFwZSBiZXZlbCBnb2VzCisgICAgICogIGJldmVsU2l6ZTogPGZsb2F0PiwgLy8gaG93IGZh
ciBmcm9tIHNoYXBlIG91dGxpbmUgaXMgYmV2ZWwKKyAgICAgKiAgYmV2ZWxTZWdtZW50czogPGlu
dD4sIC8vIG51bWJlciBvZiBiZXZlbCBsYXllcnMKKyAgICAgKgorICAgICAqICBleHRydWRlUGF0
aDogPFRIUkVFLkN1cnZlPiAvLyBjdXJ2ZSB0byBleHRydWRlIHNoYXBlIGFsb25nCisgICAgICog
IGZyYW1lczogPE9iamVjdD4gLy8gY29udGFpbmluZyBhcnJheXMgb2YgdGFuZ2VudHMsIG5vcm1h
bHMsIGJpbm9ybWFscworICAgICAqCisgICAgICogIFVWR2VuZXJhdG9yOiA8T2JqZWN0PiAvLyBv
YmplY3QgdGhhdCBwcm92aWRlcyBVViBnZW5lcmF0b3IgZnVuY3Rpb25zCisgICAgICoKKyAgICAg
KiB9CisgICAgICovCisKKyAgICAvLyBFeHRydWRlR2VvbWV0cnkKKworICAgIGZ1bmN0aW9uIEV4
dHJ1ZGVHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkgeworCisgICAgICAgIEdlb21ldHJ5LmNh
bGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnRXh0cnVkZUdlb21ldHJ5JzsKKwor
ICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CisgICAgICAgICAgICBzaGFwZXM6IHNoYXBlcywK
KyAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMKKyAgICAgICAgfTsKKworICAgICAgICB0aGlz
LmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBv
cHRpb25zICkgKTsKKyAgICAgICAgdGhpcy5tZXJnZVZlcnRpY2VzKCk7CisKKyAgICB9CisKKyAg
ICBFeHRydWRlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJv
dG90eXBlICk7CisgICAgRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4
dHJ1ZGVHZW9tZXRyeTsKKworICAgIC8vIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeQorCisgICAgZnVu
Y3Rpb24gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7CisKKyAgICAg
ICAgaWYgKCB0eXBlb2YgKCBzaGFwZXMgKSA9PT0gInVuZGVmaW5lZCIgKSB7CisKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICB9CisKKyAgICAgICAgQnVmZmVyR2VvbWV0cnkuY2FsbCgg
dGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdFeHRydWRlQnVmZmVyR2VvbWV0cnknOwor
CisgICAgICAgIHNoYXBlcyA9IEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID8gc2hhcGVzIDogWyBz
aGFwZXMgXTsKKworICAgICAgICB0aGlzLmFkZFNoYXBlTGlzdCggc2hhcGVzLCBvcHRpb25zICk7
CisKKyAgICAgICAgdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOworCisgICAgICAgIC8vIGNh
bid0IHJlYWxseSB1c2UgYXV0b21hdGljIHZlcnRleCBub3JtYWxzCisgICAgICAgIC8vIGFzIHRo
ZW4gZnJvbnQgYW5kIGJhY2sgc2lkZXMgZ2V0IHNtb290aGVkIHRvbworICAgICAgICAvLyBzaG91
bGQgZG8gc2VwYXJhdGUgc21vb3RoaW5nIGp1c3QgZm9yIHNpZGVzCisKKyAgICAgICAgLy90aGlz
LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7CisKKyAgICAgICAgLy9jb25zb2xlLmxvZyggInRvb2si
LCAoIERhdGUubm93KCkgLSBzdGFydFRpbWUgKSApOworCisgICAgfQorCisgICAgRXh0cnVkZUJ1
ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnBy
b3RvdHlwZSApOworICAgIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0
b3IgPSBFeHRydWRlQnVmZmVyR2VvbWV0cnk7CisKKyAgICBFeHRydWRlQnVmZmVyR2VvbWV0cnku
cHJvdG90eXBlLmdldEFycmF5cyA9IGZ1bmN0aW9uICgpIHsKKworICAgICAgICB2YXIgcG9zaXRp
b25BdHRyaWJ1dGUgPSB0aGlzLmdldEF0dHJpYnV0ZSggInBvc2l0aW9uIiApOworICAgICAgICB2
YXIgdmVydGljZXNBcnJheSA9IHBvc2l0aW9uQXR0cmlidXRlID8gQXJyYXkucHJvdG90eXBlLnNs
aWNlLmNhbGwoIHBvc2l0aW9uQXR0cmlidXRlLmFycmF5ICkgOiBbXTsKKworICAgICAgICB2YXIg
dXZBdHRyaWJ1dGUgPSB0aGlzLmdldEF0dHJpYnV0ZSggInV2IiApOworICAgICAgICB2YXIgdXZB
cnJheSA9IHV2QXR0cmlidXRlID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIHV2QXR0cmli
dXRlLmFycmF5ICkgOiBbXTsKKworICAgICAgICB2YXIgSW5kZXhBdHRyaWJ1dGUgPSB0aGlzLmlu
ZGV4OworICAgICAgICB2YXIgaW5kaWNlc0FycmF5ID0gSW5kZXhBdHRyaWJ1dGUgPyBBcnJheS5w
cm90b3R5cGUuc2xpY2UuY2FsbCggSW5kZXhBdHRyaWJ1dGUuYXJyYXkgKSA6IFtdOworCisgICAg
ICAgIHJldHVybiB7CisgICAgICAgICAgICBwb3NpdGlvbjogdmVydGljZXNBcnJheSwKKyAgICAg
ICAgICAgIHV2OiB1dkFycmF5LAorICAgICAgICAgICAgaW5kZXg6IGluZGljZXNBcnJheQorICAg
ICAgICB9OworCisgICAgfTsKKworICAgIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUu
YWRkU2hhcGVMaXN0ID0gZnVuY3Rpb24gKCBzaGFwZXMsIG9wdGlvbnMgKSB7CisKKyAgICAgICAg
dmFyIHNsID0gc2hhcGVzLmxlbmd0aDsKKyAgICAgICAgb3B0aW9ucy5hcnJheXMgPSB0aGlzLmdl
dEFycmF5cygpOworCisgICAgICAgIGZvciAoIHZhciBzID0gMDsgcyA8IHNsOyBzICsrICkgewor
CisgICAgICAgICAgICB2YXIgc2hhcGUgPSBzaGFwZXNbIHMgXTsKKyAgICAgICAgICAgIHRoaXMu
YWRkU2hhcGUoIHNoYXBlLCBvcHRpb25zICk7CisKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMu
c2V0SW5kZXgoIG9wdGlvbnMuYXJyYXlzLmluZGV4ICk7CisgICAgICAgIHRoaXMuYWRkQXR0cmli
dXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggb3B0aW9ucy5hcnJh
eXMucG9zaXRpb24sIDMgKSApOworICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3
IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG9wdGlvbnMuYXJyYXlzLnV2LCAyICkgKTsKKworICAg
IH07CisKKyAgICBFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmFkZFNoYXBlID0gZnVu
Y3Rpb24gKCBzaGFwZSwgb3B0aW9ucyApIHsKKworICAgICAgICB2YXIgYXJyYXlzID0gb3B0aW9u
cy5hcnJheXMgPyBvcHRpb25zLmFycmF5cyA6IHRoaXMuZ2V0QXJyYXlzKCk7CisgICAgICAgIHZh
ciB2ZXJ0aWNlc0FycmF5ID0gYXJyYXlzLnBvc2l0aW9uOworICAgICAgICB2YXIgaW5kaWNlc0Fy
cmF5ID0gYXJyYXlzLmluZGV4OworICAgICAgICB2YXIgdXZBcnJheSA9IGFycmF5cy51djsKKwor
ICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSBbXTsKKworCisgICAgICAgIHZhciBhbW91bnQgPSBv
cHRpb25zLmFtb3VudCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5hbW91bnQgOiAxMDA7CisKKyAg
ICAgICAgdmFyIGJldmVsVGhpY2tuZXNzID0gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyAhPT0gdW5k
ZWZpbmVkID8gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyA6IDY7IC8vIDEwCisgICAgICAgIHZhciBi
ZXZlbFNpemUgPSBvcHRpb25zLmJldmVsU2l6ZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZl
bFNpemUgOiBiZXZlbFRoaWNrbmVzcyAtIDI7IC8vIDgKKyAgICAgICAgdmFyIGJldmVsU2VnbWVu
dHMgPSBvcHRpb25zLmJldmVsU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxT
ZWdtZW50cyA6IDM7CisKKyAgICAgICAgdmFyIGJldmVsRW5hYmxlZCA9IG9wdGlvbnMuYmV2ZWxF
bmFibGVkICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsRW5hYmxlZCA6IHRydWU7IC8vIGZh
bHNlCisKKyAgICAgICAgdmFyIGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMg
IT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyOworCisgICAgICAgIHZh
ciBzdGVwcyA9IG9wdGlvbnMuc3RlcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlcHMgOiAx
OworCisgICAgICAgIHZhciBleHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGg7CisgICAg
ICAgIHZhciBleHRydWRlUHRzLCBleHRydWRlQnlQYXRoID0gZmFsc2U7CisKKyAgICAgICAgLy8g
VXNlIGRlZmF1bHQgV29ybGRVVkdlbmVyYXRvciBpZiBubyBVViBnZW5lcmF0b3JzIGFyZSBzcGVj
aWZpZWQuCisgICAgICAgIHZhciB1dmdlbiA9IG9wdGlvbnMuVVZHZW5lcmF0b3IgIT09IHVuZGVm
aW5lZCA/IG9wdGlvbnMuVVZHZW5lcmF0b3IgOiBFeHRydWRlR2VvbWV0cnkuV29ybGRVVkdlbmVy
YXRvcjsKKworICAgICAgICB2YXIgc3BsaW5lVHViZSwgYmlub3JtYWwsIG5vcm1hbCwgcG9zaXRp
b24yOworICAgICAgICBpZiAoIGV4dHJ1ZGVQYXRoICkgeworCisgICAgICAgICAgICBleHRydWRl
UHRzID0gZXh0cnVkZVBhdGguZ2V0U3BhY2VkUG9pbnRzKCBzdGVwcyApOworCisgICAgICAgICAg
ICBleHRydWRlQnlQYXRoID0gdHJ1ZTsKKyAgICAgICAgICAgIGJldmVsRW5hYmxlZCA9IGZhbHNl
OyAvLyBiZXZlbHMgbm90IHN1cHBvcnRlZCBmb3IgcGF0aCBleHRydXNpb24KKworICAgICAgICAg
ICAgLy8gU0VUVVAgVE5CIHZhcmlhYmxlcworCisgICAgICAgICAgICAvLyBUT0RPMSAtIGhhdmUg
YSAuaXNDbG9zZWQgaW4gc3BsaW5lPworCisgICAgICAgICAgICBzcGxpbmVUdWJlID0gb3B0aW9u
cy5mcmFtZXMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZnJhbWVzIDogZXh0cnVkZVBhdGguY29t
cHV0ZUZyZW5ldEZyYW1lcyggc3RlcHMsIGZhbHNlICk7CisKKyAgICAgICAgICAgIC8vIGNvbnNv
bGUubG9nKHNwbGluZVR1YmUsICdzcGxpbmVUdWJlJywgc3BsaW5lVHViZS5ub3JtYWxzLmxlbmd0
aCwgJ3N0ZXBzJywgc3RlcHMsICdleHRydWRlUHRzJywgZXh0cnVkZVB0cy5sZW5ndGgpOworCisg
ICAgICAgICAgICBiaW5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICBub3JtYWwg
PSBuZXcgVmVjdG9yMygpOworICAgICAgICAgICAgcG9zaXRpb24yID0gbmV3IFZlY3RvcjMoKTsK
KworICAgICAgICB9CisKKyAgICAgICAgLy8gU2FmZWd1YXJkcyBpZiBiZXZlbHMgYXJlIG5vdCBl
bmFibGVkCisKKyAgICAgICAgaWYgKCAhIGJldmVsRW5hYmxlZCApIHsKKworICAgICAgICAgICAg
YmV2ZWxTZWdtZW50cyA9IDA7CisgICAgICAgICAgICBiZXZlbFRoaWNrbmVzcyA9IDA7CisgICAg
ICAgICAgICBiZXZlbFNpemUgPSAwOworCisgICAgICAgIH0KKworICAgICAgICAvLyBWYXJpYWJs
ZXMgaW5pdGlhbGl6YXRpb24KKworICAgICAgICB2YXIgYWhvbGUsIGgsIGhsOyAvLyBsb29waW5n
IG9mIGhvbGVzCisgICAgICAgIHZhciBzY29wZSA9IHRoaXM7CisKKyAgICAgICAgdmFyIHNoYXBl
UG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApOworCisgICAgICAg
IHZhciB2ZXJ0aWNlcyA9IHNoYXBlUG9pbnRzLnNoYXBlOworICAgICAgICB2YXIgaG9sZXMgPSBz
aGFwZVBvaW50cy5ob2xlczsKKworICAgICAgICB2YXIgcmV2ZXJzZSA9ICEgU2hhcGVVdGlscy5p
c0Nsb2NrV2lzZSggdmVydGljZXMgKTsKKworICAgICAgICBpZiAoIHJldmVyc2UgKSB7CisKKyAg
ICAgICAgICAgIHZlcnRpY2VzID0gdmVydGljZXMucmV2ZXJzZSgpOworCisgICAgICAgICAgICAv
LyBNYXliZSB3ZSBzaG91bGQgYWxzbyBjaGVjayBpZiBob2xlcyBhcmUgaW4gdGhlIG9wcG9zaXRl
IGRpcmVjdGlvbiwganVzdCB0byBiZSBzYWZlIC4uLgorCisgICAgICAgICAgICBmb3IgKCBoID0g
MCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHsKKworICAgICAgICAgICAgICAg
IGFob2xlID0gaG9sZXNbIGggXTsKKworICAgICAgICAgICAgICAgIGlmICggU2hhcGVVdGlscy5p
c0Nsb2NrV2lzZSggYWhvbGUgKSApIHsKKworICAgICAgICAgICAgICAgICAgICBob2xlc1sgaCBd
ID0gYWhvbGUucmV2ZXJzZSgpOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9
CisKKyAgICAgICAgfQorCisKKyAgICAgICAgdmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1
bGF0ZVNoYXBlKCB2ZXJ0aWNlcywgaG9sZXMgKTsKKworICAgICAgICAvKiBWZXJ0aWNlcyAqLwor
CisgICAgICAgIHZhciBjb250b3VyID0gdmVydGljZXM7IC8vIHZlcnRpY2VzIGhhcyBhbGwgcG9p
bnRzIGJ1dCBjb250b3VyIGhhcyBvbmx5IHBvaW50cyBvZiBjaXJjdW1mZXJlbmNlCisKKyAgICAg
ICAgZm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7CisKKyAg
ICAgICAgICAgIGFob2xlID0gaG9sZXNbIGggXTsKKworICAgICAgICAgICAgdmVydGljZXMgPSB2
ZXJ0aWNlcy5jb25jYXQoIGFob2xlICk7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgZnVuY3Rp
b24gc2NhbGVQdDIoIHB0LCB2ZWMsIHNpemUgKSB7CisKKyAgICAgICAgICAgIGlmICggISB2ZWMg
KSBjb25zb2xlLmVycm9yKCAiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhp
c3QiICk7CisKKyAgICAgICAgICAgIHJldHVybiB2ZWMuY2xvbmUoKS5tdWx0aXBseVNjYWxhcigg
c2l6ZSApLmFkZCggcHQgKTsKKworICAgICAgICB9CisKKyAgICAgICAgdmFyIGIsIGJzLCB0LCB6
LAorICAgICAgICAgICAgdmVydCwgdmxlbiA9IHZlcnRpY2VzLmxlbmd0aCwKKyAgICAgICAgICAg
IGZhY2UsIGZsZW4gPSBmYWNlcy5sZW5ndGg7CisKKworICAgICAgICAvLyBGaW5kIGRpcmVjdGlv
bnMgZm9yIHBvaW50IG1vdmVtZW50CisKKworICAgICAgICBmdW5jdGlvbiBnZXRCZXZlbFZlYygg
aW5QdCwgaW5QcmV2LCBpbk5leHQgKSB7CisKKyAgICAgICAgICAgIC8vIGNvbXB1dGVzIGZvciBp
blB0IHRoZSBjb3JyZXNwb25kaW5nIHBvaW50IGluUHQnIG9uIGEgbmV3IGNvbnRvdXIKKyAgICAg
ICAgICAgIC8vICAgc2hpZnRlZCBieSAxIHVuaXQgKGxlbmd0aCBvZiBub3JtYWxpemVkIHZlY3Rv
cikgdG8gdGhlIGxlZnQKKyAgICAgICAgICAgIC8vIGlmIHdlIHdhbGsgYWxvbmcgY29udG91ciBj
bG9ja3dpc2UsIHRoaXMgbmV3IGNvbnRvdXIgaXMgb3V0c2lkZSB0aGUgb2xkIG9uZQorICAgICAg
ICAgICAgLy8KKyAgICAgICAgICAgIC8vIGluUHQnIGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhl
IHR3byBsaW5lcyBwYXJhbGxlbCB0byB0aGUgdHdvCisgICAgICAgICAgICAvLyAgYWRqYWNlbnQg
ZWRnZXMgb2YgaW5QdCBhdCBhIGRpc3RhbmNlIG9mIDEgdW5pdCBvbiB0aGUgbGVmdCBzaWRlLgor
CisgICAgICAgICAgICB2YXIgdl90cmFuc194LCB2X3RyYW5zX3ksIHNocmlua19ieTsgLy8gcmVz
dWx0aW5nIHRyYW5zbGF0aW9uIHZlY3RvciBmb3IgaW5QdAorCisgICAgICAgICAgICAvLyBnb29k
IHJlYWRpbmcgZm9yIGdlb21ldHJ5IGFsZ29yaXRobXMgKGhlcmU6IGxpbmUtbGluZSBpbnRlcnNl
Y3Rpb24pCisgICAgICAgICAgICAvLyBodHRwOi8vZ2VvbWFsZ29yaXRobXMuY29tL2EwNS1faW50
ZXJzZWN0LTEuaHRtbAorCisgICAgICAgICAgICB2YXIgdl9wcmV2X3ggPSBpblB0LnggLSBpblBy
ZXYueCwKKyAgICAgICAgICAgICAgICB2X3ByZXZfeSA9IGluUHQueSAtIGluUHJldi55OworICAg
ICAgICAgICAgdmFyIHZfbmV4dF94ID0gaW5OZXh0LnggLSBpblB0LngsCisgICAgICAgICAgICAg
ICAgdl9uZXh0X3kgPSBpbk5leHQueSAtIGluUHQueTsKKworICAgICAgICAgICAgdmFyIHZfcHJl
dl9sZW5zcSA9ICggdl9wcmV2X3ggKiB2X3ByZXZfeCArIHZfcHJldl95ICogdl9wcmV2X3kgKTsK
KworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGNvbGxpbmVhciBlZGdlcworICAgICAgICAgICAg
dmFyIGNvbGxpbmVhcjAgPSAoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4
dF94ICk7CisKKyAgICAgICAgICAgIGlmICggTWF0aC5hYnMoIGNvbGxpbmVhcjAgKSA+IE51bWJl
ci5FUFNJTE9OICkgeworCisgICAgICAgICAgICAgICAgLy8gbm90IGNvbGxpbmVhcgorCisgICAg
ICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIHZlY3RvcnMgZm9yIG5vcm1hbGl6aW5nCisKKyAgICAg
ICAgICAgICAgICB2YXIgdl9wcmV2X2xlbiA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxICk7Cisg
ICAgICAgICAgICAgICAgdmFyIHZfbmV4dF9sZW4gPSBNYXRoLnNxcnQoIHZfbmV4dF94ICogdl9u
ZXh0X3ggKyB2X25leHRfeSAqIHZfbmV4dF95ICk7CisKKyAgICAgICAgICAgICAgICAvLyBzaGlm
dCBhZGphY2VudCBwb2ludHMgYnkgdW5pdCB2ZWN0b3JzIHRvIHRoZSBsZWZ0CisKKyAgICAgICAg
ICAgICAgICB2YXIgcHRQcmV2U2hpZnRfeCA9ICggaW5QcmV2LnggLSB2X3ByZXZfeSAvIHZfcHJl
dl9sZW4gKTsKKyAgICAgICAgICAgICAgICB2YXIgcHRQcmV2U2hpZnRfeSA9ICggaW5QcmV2Lnkg
KyB2X3ByZXZfeCAvIHZfcHJldl9sZW4gKTsKKworICAgICAgICAgICAgICAgIHZhciBwdE5leHRT
aGlmdF94ID0gKCBpbk5leHQueCAtIHZfbmV4dF95IC8gdl9uZXh0X2xlbiApOworICAgICAgICAg
ICAgICAgIHZhciBwdE5leHRTaGlmdF95ID0gKCBpbk5leHQueSArIHZfbmV4dF94IC8gdl9uZXh0
X2xlbiApOworCisgICAgICAgICAgICAgICAgLy8gc2NhbGluZyBmYWN0b3IgZm9yIHZfcHJldiB0
byBpbnRlcnNlY3Rpb24gcG9pbnQKKworICAgICAgICAgICAgICAgIHZhciBzZiA9ICggKCBwdE5l
eHRTaGlmdF94IC0gcHRQcmV2U2hpZnRfeCApICogdl9uZXh0X3kgLQorICAgICAgICAgICAgICAg
ICAgICAgICAgKCBwdE5leHRTaGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAv
CisgICAgICAgICAgICAgICAgICAgICggdl9wcmV2X3ggKiB2X25leHRfeSAtIHZfcHJldl95ICog
dl9uZXh0X3ggKTsKKworICAgICAgICAgICAgICAgIC8vIHZlY3RvciBmcm9tIGluUHQgdG8gaW50
ZXJzZWN0aW9uIHBvaW50CisKKyAgICAgICAgICAgICAgICB2X3RyYW5zX3ggPSAoIHB0UHJldlNo
aWZ0X3ggKyB2X3ByZXZfeCAqIHNmIC0gaW5QdC54ICk7CisgICAgICAgICAgICAgICAgdl90cmFu
c195ID0gKCBwdFByZXZTaGlmdF95ICsgdl9wcmV2X3kgKiBzZiAtIGluUHQueSApOworCisgICAg
ICAgICAgICAgICAgLy8gRG9uJ3Qgbm9ybWFsaXplISwgb3RoZXJ3aXNlIHNoYXJwIGNvcm5lcnMg
YmVjb21lIHVnbHkKKyAgICAgICAgICAgICAgICAvLyAgYnV0IHByZXZlbnQgY3Jhenkgc3Bpa2Vz
CisgICAgICAgICAgICAgICAgdmFyIHZfdHJhbnNfbGVuc3EgPSAoIHZfdHJhbnNfeCAqIHZfdHJh
bnNfeCArIHZfdHJhbnNfeSAqIHZfdHJhbnNfeSApOworICAgICAgICAgICAgICAgIGlmICggdl90
cmFuc19sZW5zcSA8PSAyICkgeworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmVj
dG9yMiggdl90cmFuc194LCB2X3RyYW5zX3kgKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7
CisKKyAgICAgICAgICAgICAgICAgICAgc2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3RyYW5zX2xl
bnNxIC8gMiApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2Ugewor
CisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBjb2xsaW5lYXIgZWRn
ZXMKKworICAgICAgICAgICAgICAgIHZhciBkaXJlY3Rpb25fZXEgPSBmYWxzZTsgLy8gYXNzdW1l
czogb3Bwb3NpdGUKKyAgICAgICAgICAgICAgICBpZiAoIHZfcHJldl94ID4gTnVtYmVyLkVQU0lM
T04gKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB2X25leHRfeCA+IE51bWJlci5FUFNJ
TE9OICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb25fZXEgPSB0cnVlOwor
CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCB2X3ByZXZfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdl9uZXh0X3ggPCAtIE51bWJlci5FUFNJTE9O
ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uX2VxID0gdHJ1ZTsK
KworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0gZWxz
ZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggTWF0aC5zaWduKCB2X3ByZXZfeSAp
ID09PSBNYXRoLnNpZ24oIHZfbmV4dF95ICkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBkaXJlY3Rpb25fZXEgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgaWYgKCBkaXJlY3Rpb25fZXEgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY29u
c29sZS5sb2coIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNlcXVlbmNlIik7CisgICAg
ICAgICAgICAgICAgICAgIHZfdHJhbnNfeCA9IC0gdl9wcmV2X3k7CisgICAgICAgICAgICAgICAg
ICAgIHZfdHJhbnNfeSA9IHZfcHJldl94OworICAgICAgICAgICAgICAgICAgICBzaHJpbmtfYnkg
PSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsK
KworICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiV2FybmluZzogbGluZXMgYXJl
IGEgc3RyYWlnaHQgc3Bpa2UiKTsKKyAgICAgICAgICAgICAgICAgICAgdl90cmFuc194ID0gdl9w
cmV2X3g7CisgICAgICAgICAgICAgICAgICAgIHZfdHJhbnNfeSA9IHZfcHJldl95OworICAgICAg
ICAgICAgICAgICAgICBzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSAvIDIgKTsK
KworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1
cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCAvIHNocmlua19ieSwgdl90cmFuc195IC8gc2hyaW5r
X2J5ICk7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgdmFyIGNvbnRvdXJNb3ZlbWVudHMgPSBb
XTsKKworICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGgsIGogPSBp
bCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkgeworCisgICAgICAg
ICAgICBpZiAoIGogPT09IGlsICkgaiA9IDA7CisgICAgICAgICAgICBpZiAoIGsgPT09IGlsICkg
ayA9IDA7CisKKyAgICAgICAgICAgIC8vICAoaiktLS0oaSktLS0oaykKKyAgICAgICAgICAgIC8v
IGNvbnNvbGUubG9nKCdpLGosaycsIGksIGogLCBrKQorCisgICAgICAgICAgICBjb250b3VyTW92
ZW1lbnRzWyBpIF0gPSBnZXRCZXZlbFZlYyggY29udG91clsgaSBdLCBjb250b3VyWyBqIF0sIGNv
bnRvdXJbIGsgXSApOworCisgICAgICAgIH0KKworICAgICAgICB2YXIgaG9sZXNNb3ZlbWVudHMg
PSBbXSwKKyAgICAgICAgICAgIG9uZUhvbGVNb3ZlbWVudHMsIHZlcnRpY2VzTW92ZW1lbnRzID0g
Y29udG91ck1vdmVtZW50cy5jb25jYXQoKTsKKworICAgICAgICBmb3IgKCBoID0gMCwgaGwgPSBo
b2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHsKKworICAgICAgICAgICAgYWhvbGUgPSBob2xl
c1sgaCBdOworCisgICAgICAgICAgICBvbmVIb2xlTW92ZW1lbnRzID0gW107CisKKyAgICAgICAg
ICAgIGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAx
OyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoIGog
PT09IGlsICkgaiA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCBrID09PSBpbCApIGsgPSAwOwor
CisgICAgICAgICAgICAgICAgLy8gIChqKS0tLShpKS0tLShrKQorICAgICAgICAgICAgICAgIG9u
ZUhvbGVNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBhaG9sZVsgaSBdLCBhaG9sZVsgaiBd
LCBhaG9sZVsgayBdICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaG9sZXNNb3Zl
bWVudHMucHVzaCggb25lSG9sZU1vdmVtZW50cyApOworICAgICAgICAgICAgdmVydGljZXNNb3Zl
bWVudHMgPSB2ZXJ0aWNlc01vdmVtZW50cy5jb25jYXQoIG9uZUhvbGVNb3ZlbWVudHMgKTsKKwor
ICAgICAgICB9CisKKworICAgICAgICAvLyBMb29wIGJldmVsU2VnbWVudHMsIDEgZm9yIHRoZSBm
cm9udCwgMSBmb3IgdGhlIGJhY2sKKworICAgICAgICBmb3IgKCBiID0gMDsgYiA8IGJldmVsU2Vn
bWVudHM7IGIgKysgKSB7CisKKyAgICAgICAgICAgIC8vZm9yICggYiA9IGJldmVsU2VnbWVudHM7
IGIgPiAwOyBiIC0tICkgeworCisgICAgICAgICAgICB0ID0gYiAvIGJldmVsU2VnbWVudHM7Cisg
ICAgICAgICAgICB6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAy
ICk7CisgICAgICAgICAgICBicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAv
IDIgKTsKKworICAgICAgICAgICAgLy8gY29udHJhY3Qgc2hhcGUKKworICAgICAgICAgICAgZm9y
ICggaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKKworICAgICAg
ICAgICAgICAgIHZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRz
WyBpIF0sIGJzICk7CisKKyAgICAgICAgICAgICAgICB2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZXhwYW5kIGhvbGVzCisKKyAgICAg
ICAgICAgIGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkgewor
CisgICAgICAgICAgICAgICAgYWhvbGUgPSBob2xlc1sgaCBdOworICAgICAgICAgICAgICAgIG9u
ZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdOworCisgICAgICAgICAgICAgICAg
Zm9yICggaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgdmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1l
bnRzWyBpIF0sIGJzICk7CisKKyAgICAgICAgICAgICAgICAgICAgdiggdmVydC54LCB2ZXJ0Lnks
IC0geiApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAg
fQorCisgICAgICAgIGJzID0gYmV2ZWxTaXplOworCisgICAgICAgIC8vIEJhY2sgZmFjaW5nIHZl
cnRpY2VzCisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCB2bGVuOyBpICsrICkgeworCisgICAg
ICAgICAgICB2ZXJ0ID0gYmV2ZWxFbmFibGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZl
cnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJzICkgOiB2ZXJ0aWNlc1sgaSBdOworCisgICAgICAgICAg
ICBpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHsKKworICAgICAgICAgICAgICAgIHYoIHZlcnQueCwg
dmVydC55LCAwICk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAv
LyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIDAgXS55LCBleHRydWRlUHRzWyAwIF0u
eCApOworCisgICAgICAgICAgICAgICAgbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sg
MCBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApOworICAgICAgICAgICAgICAgIGJpbm9ybWFs
LmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55
ICk7CisKKyAgICAgICAgICAgICAgICBwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgMCBdICku
YWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7CisKKyAgICAgICAgICAgICAgICB2KCBwb3Np
dGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHN0ZXBwZWQgdmVydGljZXMuLi4KKyAgICAgICAg
Ly8gSW5jbHVkaW5nIGZyb250IGZhY2luZyB2ZXJ0aWNlcworCisgICAgICAgIHZhciBzOworCisg
ICAgICAgIGZvciAoIHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkgeworCisgICAgICAgICAgICBm
b3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2ZXJ0ID0g
YmV2ZWxFbmFibGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRz
WyBpIF0sIGJzICkgOiB2ZXJ0aWNlc1sgaSBdOworCisgICAgICAgICAgICAgICAgaWYgKCAhIGV4
dHJ1ZGVCeVBhdGggKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdiggdmVydC54LCB2ZXJ0Lnks
IGFtb3VudCAvIHN0ZXBzICogcyApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAg
ICAgICAgICAgICAgICAgICAvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHMgLSAx
IF0ueSwgZXh0cnVkZVB0c1sgcyAtIDEgXS54ICk7CisKKyAgICAgICAgICAgICAgICAgICAgbm9y
bWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQu
eCApOworICAgICAgICAgICAgICAgICAgICBiaW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLmJpbm9y
bWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSApOworCisgICAgICAgICAgICAgICAg
ICAgIHBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyBzIF0gKS5hZGQoIG5vcm1hbCApLmFkZCgg
Ymlub3JtYWwgKTsKKworICAgICAgICAgICAgICAgICAgICB2KCBwb3NpdGlvbjIueCwgcG9zaXRp
b24yLnksIHBvc2l0aW9uMi56ICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IH0KKworICAgICAgICB9CisKKworICAgICAgICAvLyBBZGQgYmV2ZWwgc2VnbWVudHMgcGxhbmVz
CisKKyAgICAgICAgLy9mb3IgKCBiID0gMTsgYiA8PSBiZXZlbFNlZ21lbnRzOyBiICsrICkgewor
ICAgICAgICBmb3IgKCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHsKKwor
ICAgICAgICAgICAgdCA9IGIgLyBiZXZlbFNlZ21lbnRzOworICAgICAgICAgICAgeiA9IGJldmVs
VGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApOworICAgICAgICAgICAgYnMg
PSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICk7CisKKyAgICAgICAgICAg
IC8vIGNvbnRyYWN0IHNoYXBlCisKKyAgICAgICAgICAgIGZvciAoIGkgPSAwLCBpbCA9IGNvbnRv
dXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2ZXJ0ID0gc2Nh
bGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApOworICAgICAg
ICAgICAgICAgIHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7CisKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgLy8gZXhwYW5kIGhvbGVzCisKKyAgICAgICAgICAgIGZvciAoIGgg
PSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkgeworCisgICAgICAgICAgICAg
ICAgYWhvbGUgPSBob2xlc1sgaCBdOworICAgICAgICAgICAgICAgIG9uZUhvbGVNb3ZlbWVudHMg
PSBob2xlc01vdmVtZW50c1sgaCBdOworCisgICAgICAgICAgICAgICAgZm9yICggaSA9IDAsIGls
ID0gYWhvbGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
dmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7
CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7CisKKyAg
ICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdigg
dmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS55LCBleHRydWRlUHRzWyBz
dGVwcyAtIDEgXS54ICsgeiApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKiBGYWNl
cyAqLworCisgICAgICAgIC8vIFRvcCBhbmQgYm90dG9tIGZhY2VzCisKKyAgICAgICAgYnVpbGRM
aWRGYWNlcygpOworCisgICAgICAgIC8vIFNpZGVzIGZhY2VzCisKKyAgICAgICAgYnVpbGRTaWRl
RmFjZXMoKTsKKworCisgICAgICAgIC8vLy8vICBJbnRlcm5hbCBmdW5jdGlvbnMKKworICAgICAg
ICBmdW5jdGlvbiBidWlsZExpZEZhY2VzKCkgeworCisgICAgICAgICAgICB2YXIgc3RhcnQgPSB2
ZXJ0aWNlc0FycmF5Lmxlbmd0aC8zOworCisgICAgICAgICAgICBpZiAoIGJldmVsRW5hYmxlZCAp
IHsKKworICAgICAgICAgICAgICAgIHZhciBsYXllciA9IDA7IC8vIHN0ZXBzICsgMQorICAgICAg
ICAgICAgICAgIHZhciBvZmZzZXQgPSB2bGVuICogbGF5ZXI7CisKKyAgICAgICAgICAgICAgICAv
LyBCb3R0b20gZmFjZXMKKworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZmxlbjsg
aSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICBmYWNlID0gZmFjZXNbIGkgXTsKKyAgICAg
ICAgICAgICAgICAgICAgZjMoIGZhY2VbIDIgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0
LCBmYWNlWyAwIF0gKyBvZmZzZXQgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIGxheWVyID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjsKKyAgICAgICAgICAgICAg
ICBvZmZzZXQgPSB2bGVuICogbGF5ZXI7CisKKyAgICAgICAgICAgICAgICAvLyBUb3AgZmFjZXMK
KworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHsKKworICAg
ICAgICAgICAgICAgICAgICBmYWNlID0gZmFjZXNbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAg
ZjMoIGZhY2VbIDAgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAyIF0gKyBv
ZmZzZXQgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKwor
ICAgICAgICAgICAgICAgIC8vIEJvdHRvbSBmYWNlcworCisgICAgICAgICAgICAgICAgZm9yICgg
aSA9IDA7IGkgPCBmbGVuOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBm
YWNlc1sgaSBdOworICAgICAgICAgICAgICAgICAgICBmMyggZmFjZVsgMiBdLCBmYWNlWyAxIF0s
IGZhY2VbIDAgXSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8g
VG9wIGZhY2VzCisKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGZhY2VzWyBpIF07CisgICAgICAgICAg
ICAgICAgICAgIGYzKCBmYWNlWyAwIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDEgXSArIHZsZW4g
KiBzdGVwcywgZmFjZVsgMiBdICsgdmxlbiAqIHN0ZXBzICk7CisKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2
ZXJ0aWNlc0FycmF5Lmxlbmd0aC8zIC1zdGFydCwgb3B0aW9ucy5tYXRlcmlhbCAhPT0gdW5kZWZp
bmVkID8gb3B0aW9ucy5tYXRlcmlhbCA6IDApOworCisgICAgICAgIH0KKworICAgICAgICAvLyBD
cmVhdGUgZmFjZXMgZm9yIHRoZSB6LXNpZGVzIG9mIHRoZSBzaGFwZQorCisgICAgICAgIGZ1bmN0
aW9uIGJ1aWxkU2lkZUZhY2VzKCkgeworCisgICAgICAgICAgICB2YXIgc3RhcnQgPSB2ZXJ0aWNl
c0FycmF5Lmxlbmd0aC8zOworICAgICAgICAgICAgdmFyIGxheWVyb2Zmc2V0ID0gMDsKKyAgICAg
ICAgICAgIHNpZGV3YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKTsKKyAgICAgICAgICAgIGxh
eWVyb2Zmc2V0ICs9IGNvbnRvdXIubGVuZ3RoOworCisgICAgICAgICAgICBmb3IgKCBoID0gMCwg
aGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHsKKworICAgICAgICAgICAgICAgIGFo
b2xlID0gaG9sZXNbIGggXTsKKyAgICAgICAgICAgICAgICBzaWRld2FsbHMoIGFob2xlLCBsYXll
cm9mZnNldCApOworCisgICAgICAgICAgICAgICAgLy8sIHRydWUKKyAgICAgICAgICAgICAgICBs
YXllcm9mZnNldCArPSBhaG9sZS5sZW5ndGg7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAg
ICAgICBzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoLzMgLXN0YXJ0
LCBvcHRpb25zLmV4dHJ1ZGVNYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5leHRydWRl
TWF0ZXJpYWwgOiAxKTsKKworCisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBzaWRld2Fs
bHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICkgeworCisgICAgICAgICAgICB2YXIgaiwgazsKKyAg
ICAgICAgICAgIGkgPSBjb250b3VyLmxlbmd0aDsKKworICAgICAgICAgICAgd2hpbGUgKCAtLSBp
ID49IDAgKSB7CisKKyAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICBrID0g
aSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKCBrIDwgMCApIGsgPSBjb250b3VyLmxlbmd0aCAt
IDE7CisKKyAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdiJywgaSxqLCBpLTEsIGssdmVy
dGljZXMubGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIHZhciBzID0gMCwKKyAgICAgICAgICAg
ICAgICAgICAgc2wgPSBzdGVwcyArIGJldmVsU2VnbWVudHMgKiAyOworCisgICAgICAgICAgICAg
ICAgZm9yICggcyA9IDA7IHMgPCBzbDsgcyArKyApIHsKKworICAgICAgICAgICAgICAgICAgICB2
YXIgc2xlbjEgPSB2bGVuICogczsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNsZW4yID0gdmxl
biAqICggcyArIDEgKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGxheWVyb2Zmc2V0
ICsgaiArIHNsZW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGxheWVyb2Zmc2V0ICsg
ayArIHNsZW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGxheWVyb2Zmc2V0ICsgayAr
IHNsZW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGxheWVyb2Zmc2V0ICsgaiArIHNs
ZW4yOworCisgICAgICAgICAgICAgICAgICAgIGY0KCBhLCBiLCBjLCBkLCBjb250b3VyLCBzLCBz
bCwgaiwgayApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHYoIHgsIHksIHogKSB7CisKKyAgICAgICAgICAgIHBs
YWNlaG9sZGVyLnB1c2goIHggKTsKKyAgICAgICAgICAgIHBsYWNlaG9sZGVyLnB1c2goIHkgKTsK
KyAgICAgICAgICAgIHBsYWNlaG9sZGVyLnB1c2goIHogKTsKKworICAgICAgICB9CisKKworICAg
ICAgICBmdW5jdGlvbiBmMyggYSwgYiwgYyApIHsKKworICAgICAgICAgICAgYWRkVmVydGV4KCBh
ICk7CisgICAgICAgICAgICBhZGRWZXJ0ZXgoIGIgKTsKKyAgICAgICAgICAgIGFkZFZlcnRleCgg
YyApOworCisgICAgICAgICAgICB2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGgg
LyAzOworICAgICAgICAgICAgdmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlVG9wVVYoIHNjb3BlLCB2
ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAx
ICk7CisKKyAgICAgICAgICAgIGFkZFVWKCB1dnNbIDAgXSApOworICAgICAgICAgICAgYWRkVVYo
IHV2c1sgMSBdICk7CisgICAgICAgICAgICBhZGRVViggdXZzWyAyIF0gKTsKKworICAgICAgICB9
CisKKyAgICAgICAgZnVuY3Rpb24gZjQoIGEsIGIsIGMsIGQsIHdhbGxDb250b3VyLCBzdGVwSW5k
ZXgsIHN0ZXBzTGVuZ3RoLCBjb250b3VySW5kZXgxLCBjb250b3VySW5kZXgyICkgeworCisgICAg
ICAgICAgICBhZGRWZXJ0ZXgoIGEgKTsKKyAgICAgICAgICAgIGFkZFZlcnRleCggYiApOworICAg
ICAgICAgICAgYWRkVmVydGV4KCBkICk7CisKKyAgICAgICAgICAgIGFkZFZlcnRleCggYiApOwor
ICAgICAgICAgICAgYWRkVmVydGV4KCBjICk7CisgICAgICAgICAgICBhZGRWZXJ0ZXgoIGQgKTsK
KworCisgICAgICAgICAgICB2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAz
OworICAgICAgICAgICAgdmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlU2lkZVdhbGxVViggc2NvcGUs
IHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDYsIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAt
IDIsIG5leHRJbmRleCAtIDEgKTsKKworICAgICAgICAgICAgYWRkVVYoIHV2c1sgMCBdICk7Cisg
ICAgICAgICAgICBhZGRVViggdXZzWyAxIF0gKTsKKyAgICAgICAgICAgIGFkZFVWKCB1dnNbIDMg
XSApOworCisgICAgICAgICAgICBhZGRVViggdXZzWyAxIF0gKTsKKyAgICAgICAgICAgIGFkZFVW
KCB1dnNbIDIgXSApOworICAgICAgICAgICAgYWRkVVYoIHV2c1sgMyBdICk7CisKKyAgICAgICAg
fQorCisgICAgICAgIGZ1bmN0aW9uIGFkZFZlcnRleCggaW5kZXggKSB7CisKKyAgICAgICAgICAg
IGluZGljZXNBcnJheS5wdXNoKCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgKTsKKyAgICAgICAg
ICAgIHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDAgXSApOwor
ICAgICAgICAgICAgdmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsg
MSBdICk7CisgICAgICAgICAgICB2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRl
eCAqIDMgKyAyIF0gKTsKKworICAgICAgICB9CisKKworICAgICAgICBmdW5jdGlvbiBhZGRVVigg
dmVjdG9yMiApIHsKKworICAgICAgICAgICAgdXZBcnJheS5wdXNoKCB2ZWN0b3IyLnggKTsKKyAg
ICAgICAgICAgIHV2QXJyYXkucHVzaCggdmVjdG9yMi55ICk7CisKKyAgICAgICAgfQorCisgICAg
ICAgIGlmICggISBvcHRpb25zLmFycmF5cyApIHsKKworICAgICAgICAgICAgdGhpcy5zZXRJbmRl
eCggaW5kaWNlc0FycmF5ICk7CisgICAgICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0
aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzQXJyYXksIDMgKSApOwor
ICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0
cmlidXRlKCBvcHRpb25zLmFycmF5cy51diwgMiApICk7CisKKyAgICAgICAgfQorCisgICAgfTsK
KworICAgIEV4dHJ1ZGVHZW9tZXRyeS5Xb3JsZFVWR2VuZXJhdG9yID0geworCisgICAgICAgIGdl
bmVyYXRlVG9wVVY6IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4
QiwgaW5kZXhDICkgeworCisgICAgICAgICAgICB2YXIgYV94ID0gdmVydGljZXNbIGluZGV4QSAq
IDMgXTsKKyAgICAgICAgICAgIHZhciBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTsK
KyAgICAgICAgICAgIHZhciBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdOworICAgICAgICAg
ICAgdmFyIGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdOworICAgICAgICAgICAgdmFy
IGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07CisgICAgICAgICAgICB2YXIgY195ID0gdmVy
dGljZXNbIGluZGV4QyAqIDMgKyAxIF07CisKKyAgICAgICAgICAgIHJldHVybiBbCisgICAgICAg
ICAgICAgICAgbmV3IFZlY3RvcjIoIGFfeCwgYV95ICksCisgICAgICAgICAgICAgICAgbmV3IFZl
Y3RvcjIoIGJfeCwgYl95ICksCisgICAgICAgICAgICAgICAgbmV3IFZlY3RvcjIoIGNfeCwgY195
ICkKKyAgICAgICAgICAgIF07CisKKyAgICAgICAgfSwKKworICAgICAgICBnZW5lcmF0ZVNpZGVX
YWxsVVY6IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5k
ZXhDLCBpbmRleEQgKSB7CisKKyAgICAgICAgICAgIHZhciBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhB
ICogMyBdOworICAgICAgICAgICAgdmFyIGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBd
OworICAgICAgICAgICAgdmFyIGFfeiA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMiBdOworICAg
ICAgICAgICAgdmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07CisgICAgICAgICAgICB2
YXIgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07CisgICAgICAgICAgICB2YXIgYl96
ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAyIF07CisgICAgICAgICAgICB2YXIgY194ID0gdmVy
dGljZXNbIGluZGV4QyAqIDMgXTsKKyAgICAgICAgICAgIHZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5k
ZXhDICogMyArIDEgXTsKKyAgICAgICAgICAgIHZhciBjX3ogPSB2ZXJ0aWNlc1sgaW5kZXhDICog
MyArIDIgXTsKKyAgICAgICAgICAgIHZhciBkX3ggPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyBdOwor
ICAgICAgICAgICAgdmFyIGRfeSA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMSBdOworICAgICAg
ICAgICAgdmFyIGRfeiA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMiBdOworCisgICAgICAgICAg
ICBpZiAoIE1hdGguYWJzKCBhX3kgLSBiX3kgKSA8IDAuMDEgKSB7CisKKyAgICAgICAgICAgICAg
ICByZXR1cm4gWworICAgICAgICAgICAgICAgICAgICBuZXcgVmVjdG9yMiggYV94LCAxIC0gYV96
ICksCisgICAgICAgICAgICAgICAgICAgIG5ldyBWZWN0b3IyKCBiX3gsIDEgLSBiX3ogKSwKKyAg
ICAgICAgICAgICAgICAgICAgbmV3IFZlY3RvcjIoIGNfeCwgMSAtIGNfeiApLAorICAgICAgICAg
ICAgICAgICAgICBuZXcgVmVjdG9yMiggZF94LCAxIC0gZF96ICkKKyAgICAgICAgICAgICAgICBd
OworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIFsKKyAg
ICAgICAgICAgICAgICAgICAgbmV3IFZlY3RvcjIoIGFfeSwgMSAtIGFfeiApLAorICAgICAgICAg
ICAgICAgICAgICBuZXcgVmVjdG9yMiggYl95LCAxIC0gYl96ICksCisgICAgICAgICAgICAgICAg
ICAgIG5ldyBWZWN0b3IyKCBjX3ksIDEgLSBjX3ogKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3
IFZlY3RvcjIoIGRfeSwgMSAtIGRfeiApCisgICAgICAgICAgICAgICAgXTsKKworICAgICAgICAg
ICAgfQorCisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQGF1dGhvciB6ejg1
IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZworICAgICAqIEBhdXRob3IgYWx0
ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAgICoKKyAgICAgKiBUZXh0ID0g
M0QgVGV4dAorICAgICAqCisgICAgICogcGFyYW1ldGVycyA9IHsKKyAgICAgKiAgZm9udDogPFRI
UkVFLkZvbnQ+LCAvLyBmb250CisgICAgICoKKyAgICAgKiAgc2l6ZTogPGZsb2F0PiwgLy8gc2l6
ZSBvZiB0aGUgdGV4dAorICAgICAqICBoZWlnaHQ6IDxmbG9hdD4sIC8vIHRoaWNrbmVzcyB0byBl
eHRydWRlIHRleHQKKyAgICAgKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBw
b2ludHMgb24gdGhlIGN1cnZlcworICAgICAqCisgICAgICogIGJldmVsRW5hYmxlZDogPGJvb2w+
LCAvLyB0dXJuIG9uIGJldmVsCisgICAgICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBo
b3cgZGVlcCBpbnRvIHRleHQgYmV2ZWwgZ29lcworICAgICAqICBiZXZlbFNpemU6IDxmbG9hdD4g
Ly8gaG93IGZhciBmcm9tIHRleHQgb3V0bGluZSBpcyBiZXZlbAorICAgICAqIH0KKyAgICAgKi8K
KworICAgIC8vIFRleHRHZW9tZXRyeQorCisgICAgZnVuY3Rpb24gVGV4dEdlb21ldHJ5KCAgdGV4
dCwgcGFyYW1ldGVycyApIHsKKworICAgICAgICBHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAg
ICAgICAgdGhpcy50eXBlID0gJ1RleHRHZW9tZXRyeSc7CisKKyAgICAgICAgdGhpcy5wYXJhbWV0
ZXJzID0geworICAgICAgICAgICAgdGV4dDogdGV4dCwKKyAgICAgICAgICAgIHBhcmFtZXRlcnM6
IHBhcmFtZXRlcnMKKyAgICAgICAgfTsKKworICAgICAgICB0aGlzLmZyb21CdWZmZXJHZW9tZXRy
eSggbmV3IFRleHRCdWZmZXJHZW9tZXRyeSggdGV4dCwgcGFyYW1ldGVycyApICk7CisgICAgICAg
IHRoaXMubWVyZ2VWZXJ0aWNlcygpOworCisgICAgfQorCisgICAgVGV4dEdlb21ldHJ5LnByb3Rv
dHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOworICAgIFRleHRHZW9t
ZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0R2VvbWV0cnk7CisKKyAgICAvLyBUZXh0
QnVmZmVyR2VvbWV0cnkKKworICAgIGZ1bmN0aW9uIFRleHRCdWZmZXJHZW9tZXRyeSggdGV4dCwg
cGFyYW1ldGVycyApIHsKKworICAgICAgICBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTsK
KworICAgICAgICB2YXIgZm9udCA9IHBhcmFtZXRlcnMuZm9udDsKKworICAgICAgICBpZiAoICEg
KCBmb250ICYmIGZvbnQuaXNGb250ICkgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Io
ICdUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBv
ZiBUSFJFRS5Gb250LicgKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnkoKTsKKwor
ICAgICAgICB9CisKKyAgICAgICAgdmFyIHNoYXBlcyA9IGZvbnQuZ2VuZXJhdGVTaGFwZXMoIHRl
eHQsIHBhcmFtZXRlcnMuc2l6ZSwgcGFyYW1ldGVycy5jdXJ2ZVNlZ21lbnRzICk7CisKKyAgICAg
ICAgLy8gdHJhbnNsYXRlIHBhcmFtZXRlcnMgdG8gRXh0cnVkZUdlb21ldHJ5IEFQSQorCisgICAg
ICAgIHBhcmFtZXRlcnMuYW1vdW50ID0gcGFyYW1ldGVycy5oZWlnaHQgIT09IHVuZGVmaW5lZCA/
IHBhcmFtZXRlcnMuaGVpZ2h0IDogNTA7CisKKyAgICAgICAgLy8gZGVmYXVsdHMKKworICAgICAg
ICBpZiAoIHBhcmFtZXRlcnMuYmV2ZWxUaGlja25lc3MgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRl
cnMuYmV2ZWxUaGlja25lc3MgPSAxMDsKKyAgICAgICAgaWYgKCBwYXJhbWV0ZXJzLmJldmVsU2l6
ZSA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbFNpemUgPSA4OworICAgICAgICBpZiAo
IHBhcmFtZXRlcnMuYmV2ZWxFbmFibGVkID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVs
RW5hYmxlZCA9IGZhbHNlOworCisgICAgICAgIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5jYWxsKCB0
aGlzLCBzaGFwZXMsIHBhcmFtZXRlcnMgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnVGV4dEJ1
ZmZlckdlb21ldHJ5JzsKKworICAgIH0KKworICAgIFRleHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5
cGUgPSBPYmplY3QuY3JlYXRlKCBFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7Cisg
ICAgVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRleHRCdWZmZXJH
ZW9tZXRyeTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9v
Yi5jb20vCisgICAgICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jl
bl9hX2FkYW1zCisgICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011
Z2VuODcKKyAgICAgKi8KKworICAgIC8vIFNwaGVyZUdlb21ldHJ5CisKKyAgICBmdW5jdGlvbiBT
cGhlcmVHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhp
U3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CisKKyAgICAgICAg
R2VvbWV0cnkuY2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdTcGhlcmVHZW9t
ZXRyeSc7CisKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0geworICAgICAgICAgICAgcmFkaXVz
OiByYWRpdXMsCisgICAgICAgICAgICB3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLAorICAg
ICAgICAgICAgaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAorICAgICAgICAgICAgcGhp
U3RhcnQ6IHBoaVN0YXJ0LAorICAgICAgICAgICAgcGhpTGVuZ3RoOiBwaGlMZW5ndGgsCisgICAg
ICAgICAgICB0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAorICAgICAgICAgICAgdGhldGFMZW5ndGg6
IHRoZXRhTGVuZ3RoCisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5mcm9tQnVmZmVyR2VvbWV0
cnkoIG5ldyBTcGhlcmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWln
aHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGgg
KSApOworICAgICAgICB0aGlzLm1lcmdlVmVydGljZXMoKTsKKworICAgIH0KKworICAgIFNwaGVy
ZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSAp
OworICAgIFNwaGVyZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwaGVyZUdlb21l
dHJ5OworCisgICAgLy8gU3BoZXJlQnVmZmVyR2VvbWV0cnkKKworICAgIGZ1bmN0aW9uIFNwaGVy
ZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBw
aGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKKworICAgICAg
ICBCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhpcy50eXBlID0gJ1Nw
aGVyZUJ1ZmZlckdlb21ldHJ5JzsKKworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CisgICAg
ICAgICAgICByYWRpdXM6IHJhZGl1cywKKyAgICAgICAgICAgIHdpZHRoU2VnbWVudHM6IHdpZHRo
U2VnbWVudHMsCisgICAgICAgICAgICBoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCisg
ICAgICAgICAgICBwaGlTdGFydDogcGhpU3RhcnQsCisgICAgICAgICAgICBwaGlMZW5ndGg6IHBo
aUxlbmd0aCwKKyAgICAgICAgICAgIHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCisgICAgICAgICAg
ICB0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKKyAgICAgICAgfTsKKworICAgICAgICByYWRpdXMg
PSByYWRpdXMgfHwgNTA7CisKKyAgICAgICAgd2lkdGhTZWdtZW50cyA9IE1hdGgubWF4KCAzLCBN
YXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgOCApOworICAgICAgICBoZWlnaHRTZWdtZW50
cyA9IE1hdGgubWF4KCAyLCBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDYgKTsKKwor
ICAgICAgICBwaGlTdGFydCA9IHBoaVN0YXJ0ICE9PSB1bmRlZmluZWQgPyBwaGlTdGFydCA6IDA7
CisgICAgICAgIHBoaUxlbmd0aCA9IHBoaUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gcGhpTGVuZ3Ro
IDogTWF0aC5QSSAqIDI7CisKKyAgICAgICAgdGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVu
ZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwOworICAgICAgICB0aGV0YUxlbmd0aCA9IHRoZXRhTGVu
Z3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEk7CisKKyAgICAgICAgdmFy
IHRoZXRhRW5kID0gdGhldGFTdGFydCArIHRoZXRhTGVuZ3RoOworCisgICAgICAgIHZhciBpeCwg
aXk7CisKKyAgICAgICAgdmFyIGluZGV4ID0gMDsKKyAgICAgICAgdmFyIGdyaWQgPSBbXTsKKwor
ICAgICAgICB2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgdmFyIG5vcm1hbCA9
IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgLy8gYnVmZmVycworCisgICAgICAgIHZhciBpbmRp
Y2VzID0gW107CisgICAgICAgIHZhciB2ZXJ0aWNlcyA9IFtdOworICAgICAgICB2YXIgbm9ybWFs
cyA9IFtdOworICAgICAgICB2YXIgdXZzID0gW107CisKKyAgICAgICAgLy8gZ2VuZXJhdGUgdmVy
dGljZXMsIG5vcm1hbHMgYW5kIHV2cworCisgICAgICAgIGZvciAoIGl5ID0gMDsgaXkgPD0gaGVp
Z2h0U2VnbWVudHM7IGl5ICsrICkgeworCisgICAgICAgICAgICB2YXIgdmVydGljZXNSb3cgPSBb
XTsKKworICAgICAgICAgICAgdmFyIHYgPSBpeSAvIGhlaWdodFNlZ21lbnRzOworCisgICAgICAg
ICAgICBmb3IgKCBpeCA9IDA7IGl4IDw9IHdpZHRoU2VnbWVudHM7IGl4ICsrICkgeworCisgICAg
ICAgICAgICAgICAgdmFyIHUgPSBpeCAvIHdpZHRoU2VnbWVudHM7CisKKyAgICAgICAgICAgICAg
ICAvLyB2ZXJ0ZXgKKworICAgICAgICAgICAgICAgIHZlcnRleC54ID0gLSByYWRpdXMgKiBNYXRo
LmNvcyggcGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoICkgKiBNYXRoLnNpbiggdGhldGFTdGFydCAr
IHYgKiB0aGV0YUxlbmd0aCApOworICAgICAgICAgICAgICAgIHZlcnRleC55ID0gcmFkaXVzICog
TWF0aC5jb3MoIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTsKKyAgICAgICAgICAgICAg
ICB2ZXJ0ZXgueiA9IHJhZGl1cyAqIE1hdGguc2luKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGgg
KSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7CisKKyAgICAgICAg
ICAgICAgICB2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CisK
KyAgICAgICAgICAgICAgICAvLyBub3JtYWwKKworICAgICAgICAgICAgICAgIG5vcm1hbC5zZXQo
IHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKS5ub3JtYWxpemUoKTsKKyAgICAgICAgICAg
ICAgICBub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTsKKworICAg
ICAgICAgICAgICAgIC8vIHV2CisKKyAgICAgICAgICAgICAgICB1dnMucHVzaCggdSwgMSAtIHYg
KTsKKworICAgICAgICAgICAgICAgIHZlcnRpY2VzUm93LnB1c2goIGluZGV4ICsrICk7CisKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3JpZC5wdXNoKCB2ZXJ0aWNlc1JvdyApOworCisg
ICAgICAgIH0KKworICAgICAgICAvLyBpbmRpY2VzCisKKyAgICAgICAgZm9yICggaXkgPSAwOyBp
eSA8IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHsKKworICAgICAgICAgICAgZm9yICggaXggPSAw
OyBpeCA8IHdpZHRoU2VnbWVudHM7IGl4ICsrICkgeworCisgICAgICAgICAgICAgICAgdmFyIGEg
PSBncmlkWyBpeSBdWyBpeCArIDEgXTsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IGdyaWRbIGl5
IF1bIGl4IF07CisgICAgICAgICAgICAgICAgdmFyIGMgPSBncmlkWyBpeSArIDEgXVsgaXggXTsK
KyAgICAgICAgICAgICAgICB2YXIgZCA9IGdyaWRbIGl5ICsgMSBdWyBpeCArIDEgXTsKKworICAg
ICAgICAgICAgICAgIGlmICggaXkgIT09IDAgfHwgdGhldGFTdGFydCA+IDAgKSBpbmRpY2VzLnB1
c2goIGEsIGIsIGQgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGl5ICE9PSBoZWlnaHRTZWdtZW50
cyAtIDEgfHwgdGhldGFFbmQgPCBNYXRoLlBJICkgaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgZ2VvbWV0cnkK
KworICAgICAgICB0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7CisgICAgICAgIHRoaXMuYWRkQXR0
cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMs
IDMgKSApOworICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMy
QnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKKyAgICAgICAgdGhpcy5hZGRBdHRyaWJ1
dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApOworCisgICAg
fQorCisgICAgU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSgg
QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisgICAgU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJv
dG90eXBlLmNvbnN0cnVjdG9yID0gU3BoZXJlQnVmZmVyR2VvbWV0cnk7CisKKyAgICAvKioKKyAg
ICAgKiBAYXV0aG9yIEthbGViIE11cnBoeQorICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBz
Oi8vZ2l0aHViLmNvbS9NdWdlbjg3CisgICAgICovCisKKyAgICAvLyBSaW5nR2VvbWV0cnkKKwor
ICAgIGZ1bmN0aW9uIFJpbmdHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0
YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CisKKyAg
ICAgICAgR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdSaW5n
R2VvbWV0cnknOworCisgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKKyAgICAgICAgICAgIGlu
bmVyUmFkaXVzOiBpbm5lclJhZGl1cywKKyAgICAgICAgICAgIG91dGVyUmFkaXVzOiBvdXRlclJh
ZGl1cywKKyAgICAgICAgICAgIHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsCisgICAgICAg
ICAgICBwaGlTZWdtZW50czogcGhpU2VnbWVudHMsCisgICAgICAgICAgICB0aGV0YVN0YXJ0OiB0
aGV0YVN0YXJ0LAorICAgICAgICAgICAgdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoCisgICAgICAg
IH07CisKKyAgICAgICAgdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBSaW5nQnVmZmVyR2Vv
bWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVu
dHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTsKKyAgICAgICAgdGhpcy5tZXJnZVZlcnRp
Y2VzKCk7CisKKyAgICB9CisKKyAgICBSaW5nR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNy
ZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisgICAgUmluZ0dlb21ldHJ5LnByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IFJpbmdHZW9tZXRyeTsKKworICAgIC8vIFJpbmdCdWZmZXJHZW9tZXRyeQor
CisgICAgZnVuY3Rpb24gUmluZ0J1ZmZlckdlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRp
dXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCAp
IHsKKworICAgICAgICBCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhp
cy50eXBlID0gJ1JpbmdCdWZmZXJHZW9tZXRyeSc7CisKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJz
ID0geworICAgICAgICAgICAgaW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLAorICAgICAgICAgICAg
b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLAorICAgICAgICAgICAgdGhldGFTZWdtZW50czogdGhl
dGFTZWdtZW50cywKKyAgICAgICAgICAgIHBoaVNlZ21lbnRzOiBwaGlTZWdtZW50cywKKyAgICAg
ICAgICAgIHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCisgICAgICAgICAgICB0aGV0YUxlbmd0aDog
dGhldGFMZW5ndGgKKyAgICAgICAgfTsKKworICAgICAgICBpbm5lclJhZGl1cyA9IGlubmVyUmFk
aXVzIHx8IDIwOworICAgICAgICBvdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzIHx8IDUwOworCisg
ICAgICAgIHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0
IDogMDsKKyAgICAgICAgdGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8g
dGhldGFMZW5ndGggOiBNYXRoLlBJICogMjsKKworICAgICAgICB0aGV0YVNlZ21lbnRzID0gdGhl
dGFTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDMsIHRoZXRhU2VnbWVudHMgKSA6
IDg7CisgICAgICAgIHBoaVNlZ21lbnRzID0gcGhpU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1h
dGgubWF4KCAxLCBwaGlTZWdtZW50cyApIDogMTsKKworICAgICAgICAvLyBidWZmZXJzCisKKyAg
ICAgICAgdmFyIGluZGljZXMgPSBbXTsKKyAgICAgICAgdmFyIHZlcnRpY2VzID0gW107CisgICAg
ICAgIHZhciBub3JtYWxzID0gW107CisgICAgICAgIHZhciB1dnMgPSBbXTsKKworICAgICAgICAv
LyBzb21lIGhlbHBlciB2YXJpYWJsZXMKKworICAgICAgICB2YXIgc2VnbWVudDsKKyAgICAgICAg
dmFyIHJhZGl1cyA9IGlubmVyUmFkaXVzOworICAgICAgICB2YXIgcmFkaXVzU3RlcCA9ICggKCBv
dXRlclJhZGl1cyAtIGlubmVyUmFkaXVzICkgLyBwaGlTZWdtZW50cyApOworICAgICAgICB2YXIg
dmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgdmFyIHV2ID0gbmV3IFZlY3RvcjIoKTsK
KyAgICAgICAgdmFyIGosIGk7CisKKyAgICAgICAgLy8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1h
bHMgYW5kIHV2cworCisgICAgICAgIGZvciAoIGogPSAwOyBqIDw9IHBoaVNlZ21lbnRzOyBqICsr
ICkgeworCisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSB0aGV0YVNlZ21lbnRzOyBpICsr
ICkgeworCisgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGFyZSBnZW5lcmF0ZSBmcm9tIHRoZSBp
bnNpZGUgb2YgdGhlIHJpbmcgdG8gdGhlIG91dHNpZGUKKworICAgICAgICAgICAgICAgIHNlZ21l
bnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDsKKworICAg
ICAgICAgICAgICAgIC8vIHZlcnRleAorCisgICAgICAgICAgICAgICAgdmVydGV4LnggPSByYWRp
dXMgKiBNYXRoLmNvcyggc2VnbWVudCApOworICAgICAgICAgICAgICAgIHZlcnRleC55ID0gcmFk
aXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTsKKworICAgICAgICAgICAgICAgIHZlcnRpY2VzLnB1
c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworICAgICAgICAgICAgICAgIC8v
IG5vcm1hbAorCisgICAgICAgICAgICAgICAgbm9ybWFscy5wdXNoKCAwLCAwLCAxICk7CisKKyAg
ICAgICAgICAgICAgICAvLyB1dgorCisgICAgICAgICAgICAgICAgdXYueCA9ICggdmVydGV4Lngg
LyBvdXRlclJhZGl1cyArIDEgKSAvIDI7CisgICAgICAgICAgICAgICAgdXYueSA9ICggdmVydGV4
LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7CisKKyAgICAgICAgICAgICAgICB1dnMucHVzaCgg
dXYueCwgdXYueSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGluY3JlYXNl
IHRoZSByYWRpdXMgZm9yIG5leHQgcm93IG9mIHZlcnRpY2VzCisKKyAgICAgICAgICAgIHJhZGl1
cyArPSByYWRpdXNTdGVwOworCisgICAgICAgIH0KKworICAgICAgICAvLyBpbmRpY2VzCisKKyAg
ICAgICAgZm9yICggaiA9IDA7IGogPCBwaGlTZWdtZW50czsgaiArKyApIHsKKworICAgICAgICAg
ICAgdmFyIHRoZXRhU2VnbWVudExldmVsID0gaiAqICggdGhldGFTZWdtZW50cyArIDEgKTsKKwor
ICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCB0aGV0YVNlZ21lbnRzOyBpICsrICkgeworCisg
ICAgICAgICAgICAgICAgc2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDsKKworICAgICAg
ICAgICAgICAgIHZhciBhID0gc2VnbWVudDsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IHNlZ21l
bnQgKyB0aGV0YVNlZ21lbnRzICsgMTsKKyAgICAgICAgICAgICAgICB2YXIgYyA9IHNlZ21lbnQg
KyB0aGV0YVNlZ21lbnRzICsgMjsKKyAgICAgICAgICAgICAgICB2YXIgZCA9IHNlZ21lbnQgKyAx
OworCisgICAgICAgICAgICAgICAgLy8gZmFjZXMKKworICAgICAgICAgICAgICAgIGluZGljZXMu
cHVzaCggYSwgYiwgZCApOworICAgICAgICAgICAgICAgIGluZGljZXMucHVzaCggYiwgYywgZCAp
OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJ1aWxkIGdlb21l
dHJ5CisKKyAgICAgICAgdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOworICAgICAgICB0aGlzLmFk
ZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRp
Y2VzLCAzICkgKTsKKyAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxv
YXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CisgICAgICAgIHRoaXMuYWRkQXR0
cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKKwor
ICAgIH0KKworICAgIFJpbmdCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRl
KCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKyAgICBSaW5nQnVmZmVyR2VvbWV0cnkucHJv
dG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0J1ZmZlckdlb21ldHJ5OworCisgICAgLyoqCisgICAg
ICogQGF1dGhvciBhc3Ryb2R1ZCAvIGh0dHA6Ly9hc3Ryb2R1ZC5pc2dyZWF0Lm9yZy8KKyAgICAg
KiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NQorICAgICAqIEBhdXRob3Ig
YmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KKyAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRw
czovL2dpdGh1Yi5jb20vTXVnZW44NworICAgICAqLworCisgICAgLy8gTGF0aGVHZW9tZXRyeQor
CisgICAgZnVuY3Rpb24gTGF0aGVHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQs
IHBoaUxlbmd0aCApIHsKKworICAgICAgICBHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAg
ICAgdGhpcy50eXBlID0gJ0xhdGhlR2VvbWV0cnknOworCisgICAgICAgIHRoaXMucGFyYW1ldGVy
cyA9IHsKKyAgICAgICAgICAgIHBvaW50czogcG9pbnRzLAorICAgICAgICAgICAgc2VnbWVudHM6
IHNlZ21lbnRzLAorICAgICAgICAgICAgcGhpU3RhcnQ6IHBoaVN0YXJ0LAorICAgICAgICAgICAg
cGhpTGVuZ3RoOiBwaGlMZW5ndGgKKyAgICAgICAgfTsKKworICAgICAgICB0aGlzLmZyb21CdWZm
ZXJHZW9tZXRyeSggbmV3IExhdGhlQnVmZmVyR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBo
aVN0YXJ0LCBwaGlMZW5ndGggKSApOworICAgICAgICB0aGlzLm1lcmdlVmVydGljZXMoKTsKKwor
ICAgIH0KKworICAgIExhdGhlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2Vv
bWV0cnkucHJvdG90eXBlICk7CisgICAgTGF0aGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0
b3IgPSBMYXRoZUdlb21ldHJ5OworCisgICAgLy8gTGF0aGVCdWZmZXJHZW9tZXRyeQorCisgICAg
ZnVuY3Rpb24gTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQs
IHBoaUxlbmd0aCApIHsKKworICAgICAgICBCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisK
KyAgICAgICAgdGhpcy50eXBlID0gJ0xhdGhlQnVmZmVyR2VvbWV0cnknOworCisgICAgICAgIHRo
aXMucGFyYW1ldGVycyA9IHsKKyAgICAgICAgICAgIHBvaW50czogcG9pbnRzLAorICAgICAgICAg
ICAgc2VnbWVudHM6IHNlZ21lbnRzLAorICAgICAgICAgICAgcGhpU3RhcnQ6IHBoaVN0YXJ0LAor
ICAgICAgICAgICAgcGhpTGVuZ3RoOiBwaGlMZW5ndGgKKyAgICAgICAgfTsKKworICAgICAgICBz
ZWdtZW50cyA9IE1hdGguZmxvb3IoIHNlZ21lbnRzICkgfHwgMTI7CisgICAgICAgIHBoaVN0YXJ0
ID0gcGhpU3RhcnQgfHwgMDsKKyAgICAgICAgcGhpTGVuZ3RoID0gcGhpTGVuZ3RoIHx8IE1hdGgu
UEkgKiAyOworCisgICAgICAgIC8vIGNsYW1wIHBoaUxlbmd0aCBzbyBpdCdzIGluIHJhbmdlIG9m
IFsgMCwgMlBJIF0KKworICAgICAgICBwaGlMZW5ndGggPSBfTWF0aC5jbGFtcCggcGhpTGVuZ3Ro
LCAwLCBNYXRoLlBJICogMiApOworCisKKyAgICAgICAgLy8gYnVmZmVycworCisgICAgICAgIHZh
ciBpbmRpY2VzID0gW107CisgICAgICAgIHZhciB2ZXJ0aWNlcyA9IFtdOworICAgICAgICB2YXIg
dXZzID0gW107CisKKyAgICAgICAgLy8gaGVscGVyIHZhcmlhYmxlcworCisgICAgICAgIHZhciBi
YXNlOworICAgICAgICB2YXIgaW52ZXJzZVNlZ21lbnRzID0gMS4wIC8gc2VnbWVudHM7CisgICAg
ICAgIHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOworICAgICAgICB2YXIgdXYgPSBuZXcgVmVj
dG9yMigpOworICAgICAgICB2YXIgaSwgajsKKworICAgICAgICAvLyBnZW5lcmF0ZSB2ZXJ0aWNl
cyBhbmQgdXZzCisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7
CisKKyAgICAgICAgICAgIHZhciBwaGkgPSBwaGlTdGFydCArIGkgKiBpbnZlcnNlU2VnbWVudHMg
KiBwaGlMZW5ndGg7CisKKyAgICAgICAgICAgIHZhciBzaW4gPSBNYXRoLnNpbiggcGhpICk7Cisg
ICAgICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MoIHBoaSApOworCisgICAgICAgICAgICBmb3Ig
KCBqID0gMDsgaiA8PSAoIHBvaW50cy5sZW5ndGggLSAxICk7IGogKysgKSB7CisKKyAgICAgICAg
ICAgICAgICAvLyB2ZXJ0ZXgKKworICAgICAgICAgICAgICAgIHZlcnRleC54ID0gcG9pbnRzWyBq
IF0ueCAqIHNpbjsKKyAgICAgICAgICAgICAgICB2ZXJ0ZXgueSA9IHBvaW50c1sgaiBdLnk7Cisg
ICAgICAgICAgICAgICAgdmVydGV4LnogPSBwb2ludHNbIGogXS54ICogY29zOworCisgICAgICAg
ICAgICAgICAgdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwor
CisgICAgICAgICAgICAgICAgLy8gdXYKKworICAgICAgICAgICAgICAgIHV2LnggPSBpIC8gc2Vn
bWVudHM7CisgICAgICAgICAgICAgICAgdXYueSA9IGogLyAoIHBvaW50cy5sZW5ndGggLSAxICk7
CisKKyAgICAgICAgICAgICAgICB1dnMucHVzaCggdXYueCwgdXYueSApOworCisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gaW5kaWNlcworCisgICAgICAgIGZvciAo
IGkgPSAwOyBpIDwgc2VnbWVudHM7IGkgKysgKSB7CisKKyAgICAgICAgICAgIGZvciAoIGogPSAw
OyBqIDwgKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkgeworCisgICAgICAgICAgICAgICAg
YmFzZSA9IGogKyBpICogcG9pbnRzLmxlbmd0aDsKKworICAgICAgICAgICAgICAgIHZhciBhID0g
YmFzZTsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IGJhc2UgKyBwb2ludHMubGVuZ3RoOworICAg
ICAgICAgICAgICAgIHZhciBjID0gYmFzZSArIHBvaW50cy5sZW5ndGggKyAxOworICAgICAgICAg
ICAgICAgIHZhciBkID0gYmFzZSArIDE7CisKKyAgICAgICAgICAgICAgICAvLyBmYWNlcworCisg
ICAgICAgICAgICAgICAgaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CisgICAgICAgICAgICAgICAg
aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisK
KyAgICAgICAgLy8gYnVpbGQgZ2VvbWV0cnkKKworICAgICAgICB0aGlzLnNldEluZGV4KCBpbmRp
Y2VzICk7CisgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQz
MkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworICAgICAgICB0aGlzLmFkZEF0dHJp
YnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CisKKyAg
ICAgICAgLy8gZ2VuZXJhdGUgbm9ybWFscworCisgICAgICAgIHRoaXMuY29tcHV0ZVZlcnRleE5v
cm1hbHMoKTsKKworICAgICAgICAvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCB3ZSBuZWVk
IHRvIGF2ZXJhZ2UgdGhlIG5vcm1hbHMgYWxvbmcgdGhlIHNlYW0uCisgICAgICAgIC8vIGJlY2F1
c2UgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGljZXMgYXJlIGlkZW50aWNhbCAoYnV0IHN0aWxsIGhh
dmUgZGlmZmVyZW50IFVWcykuCisKKyAgICAgICAgaWYgKCBwaGlMZW5ndGggPT09IE1hdGguUEkg
KiAyICkgeworCisgICAgICAgICAgICB2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3Jt
YWwuYXJyYXk7CisgICAgICAgICAgICB2YXIgbjEgPSBuZXcgVmVjdG9yMygpOworICAgICAgICAg
ICAgdmFyIG4yID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAgIHZhciBuID0gbmV3IFZlY3Rv
cjMoKTsKKworICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgYnVmZmVyIG9mZnNldCBmb3IgdGhl
IGxhc3QgbGluZSBvZiB2ZXJ0aWNlcworCisgICAgICAgICAgICBiYXNlID0gc2VnbWVudHMgKiBw
b2ludHMubGVuZ3RoICogMzsKKworICAgICAgICAgICAgZm9yICggaSA9IDAsIGogPSAwOyBpIDwg
cG9pbnRzLmxlbmd0aDsgaSArKywgaiArPSAzICkgeworCisgICAgICAgICAgICAgICAgLy8gc2Vs
ZWN0IHRoZSBub3JtYWwgb2YgdGhlIHZlcnRleCBpbiB0aGUgZmlyc3QgbGluZQorCisgICAgICAg
ICAgICAgICAgbjEueCA9IG5vcm1hbHNbIGogKyAwIF07CisgICAgICAgICAgICAgICAgbjEueSA9
IG5vcm1hbHNbIGogKyAxIF07CisgICAgICAgICAgICAgICAgbjEueiA9IG5vcm1hbHNbIGogKyAy
IF07CisKKyAgICAgICAgICAgICAgICAvLyBzZWxlY3QgdGhlIG5vcm1hbCBvZiB0aGUgdmVydGV4
IGluIHRoZSBsYXN0IGxpbmUKKworICAgICAgICAgICAgICAgIG4yLnggPSBub3JtYWxzWyBiYXNl
ICsgaiArIDAgXTsKKyAgICAgICAgICAgICAgICBuMi55ID0gbm9ybWFsc1sgYmFzZSArIGogKyAx
IF07CisgICAgICAgICAgICAgICAgbjIueiA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMiBdOworCisg
ICAgICAgICAgICAgICAgLy8gYXZlcmFnZSBub3JtYWxzCisKKyAgICAgICAgICAgICAgICBuLmFk
ZFZlY3RvcnMoIG4xLCBuMiApLm5vcm1hbGl6ZSgpOworCisgICAgICAgICAgICAgICAgLy8gYXNz
aWduIHRoZSBuZXcgdmFsdWVzIHRvIGJvdGggbm9ybWFscworCisgICAgICAgICAgICAgICAgbm9y
bWFsc1sgaiArIDAgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMCBdID0gbi54OworICAgICAgICAg
ICAgICAgIG5vcm1hbHNbIGogKyAxIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXSA9IG4ueTsK
KyAgICAgICAgICAgICAgICBub3JtYWxzWyBqICsgMiBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAy
IF0gPSBuLno7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICBM
YXRoZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21l
dHJ5LnByb3RvdHlwZSApOworICAgIExhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0
cnVjdG9yID0gTGF0aGVCdWZmZXJHZW9tZXRyeTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3Ig
am9ub2JyMSAvIGh0dHA6Ly9qb25vYnIxLmNvbQorICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0
dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisgICAgICovCisKKyAgICAvLyBTaGFwZUdlb21ldHJ5
CisKKyAgICBmdW5jdGlvbiBTaGFwZUdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7
CisKKyAgICAgICAgR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9
ICdTaGFwZUdlb21ldHJ5JzsKKworICAgICAgICBpZiAoIHR5cGVvZiBjdXJ2ZVNlZ21lbnRzID09
PSAnb2JqZWN0JyApIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGVH
ZW9tZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKyAgICAg
ICAgICAgIGN1cnZlU2VnbWVudHMgPSBjdXJ2ZVNlZ21lbnRzLmN1cnZlU2VnbWVudHM7CisKKyAg
ICAgICAgfQorCisgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKKyAgICAgICAgICAgIHNoYXBl
czogc2hhcGVzLAorICAgICAgICAgICAgY3VydmVTZWdtZW50czogY3VydmVTZWdtZW50cworICAg
ICAgICB9OworCisgICAgICAgIHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU2hhcGVCdWZm
ZXJHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkgKTsKKyAgICAgICAgdGhpcy5tZXJn
ZVZlcnRpY2VzKCk7CisKKyAgICB9CisKKyAgICBTaGFwZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9i
amVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOworICAgIFNoYXBlR2VvbWV0cnkucHJv
dG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVHZW9tZXRyeTsKKworICAgIC8vIFNoYXBlQnVmZmVy
R2VvbWV0cnkKKworICAgIGZ1bmN0aW9uIFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3Vy
dmVTZWdtZW50cyApIHsKKworICAgICAgICBCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CisK
KyAgICAgICAgdGhpcy50eXBlID0gJ1NoYXBlQnVmZmVyR2VvbWV0cnknOworCisgICAgICAgIHRo
aXMucGFyYW1ldGVycyA9IHsKKyAgICAgICAgICAgIHNoYXBlczogc2hhcGVzLAorICAgICAgICAg
ICAgY3VydmVTZWdtZW50czogY3VydmVTZWdtZW50cworICAgICAgICB9OworCisgICAgICAgIGN1
cnZlU2VnbWVudHMgPSBjdXJ2ZVNlZ21lbnRzIHx8IDEyOworCisgICAgICAgIC8vIGJ1ZmZlcnMK
KworICAgICAgICB2YXIgaW5kaWNlcyA9IFtdOworICAgICAgICB2YXIgdmVydGljZXMgPSBbXTsK
KyAgICAgICAgdmFyIG5vcm1hbHMgPSBbXTsKKyAgICAgICAgdmFyIHV2cyA9IFtdOworCisgICAg
ICAgIC8vIGhlbHBlciB2YXJpYWJsZXMKKworICAgICAgICB2YXIgZ3JvdXBTdGFydCA9IDA7Cisg
ICAgICAgIHZhciBncm91cENvdW50ID0gMDsKKworICAgICAgICAvLyBhbGxvdyBzaW5nbGUgYW5k
IGFycmF5IHZhbHVlcyBmb3IgInNoYXBlcyIgcGFyYW1ldGVyCisKKyAgICAgICAgaWYgKCBBcnJh
eS5pc0FycmF5KCBzaGFwZXMgKSA9PT0gZmFsc2UgKSB7CisKKyAgICAgICAgICAgIGFkZFNoYXBl
KCBzaGFwZXMgKTsKKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBmb3IgKCB2YXIg
aSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgYWRk
U2hhcGUoIHNoYXBlc1sgaSBdICk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmFkZEdyb3VwKCBn
cm91cFN0YXJ0LCBncm91cENvdW50LCBpICk7IC8vIGVuYWJsZXMgTXVsdGlNYXRlcmlhbCBzdXBw
b3J0CisKKyAgICAgICAgICAgICAgICBncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7CisgICAgICAg
ICAgICAgICAgZ3JvdXBDb3VudCA9IDA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisK
KyAgICAgICAgLy8gYnVpbGQgZ2VvbWV0cnkKKworICAgICAgICB0aGlzLnNldEluZGV4KCBpbmRp
Y2VzICk7CisgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQz
MkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworICAgICAgICB0aGlzLmFkZEF0dHJp
YnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkg
KTsKKyAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0
cmlidXRlKCB1dnMsIDIgKSApOworCisKKyAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9ucworCisg
ICAgICAgIGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHsKKworICAgICAgICAgICAgdmFyIGks
IGwsIHNoYXBlSG9sZTsKKworICAgICAgICAgICAgdmFyIGluZGV4T2Zmc2V0ID0gdmVydGljZXMu
bGVuZ3RoIC8gMzsKKyAgICAgICAgICAgIHZhciBwb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRz
KCBjdXJ2ZVNlZ21lbnRzICk7CisKKyAgICAgICAgICAgIHZhciBzaGFwZVZlcnRpY2VzID0gcG9p
bnRzLnNoYXBlOworICAgICAgICAgICAgdmFyIHNoYXBlSG9sZXMgPSBwb2ludHMuaG9sZXM7CisK
KyAgICAgICAgICAgIC8vIGNoZWNrIGRpcmVjdGlvbiBvZiB2ZXJ0aWNlcworCisgICAgICAgICAg
ICBpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlVmVydGljZXMgKSA9PT0gZmFsc2Ug
KSB7CisKKyAgICAgICAgICAgICAgICBzaGFwZVZlcnRpY2VzID0gc2hhcGVWZXJ0aWNlcy5yZXZl
cnNlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBhbHNvIGNoZWNrIGlmIGhvbGVzIGFyZSBpbiB0
aGUgb3Bwb3NpdGUgZGlyZWN0aW9uCisKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMCwgbCA9
IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAg
ICBzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYg
KCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZUhvbGUgKSA9PT0gdHJ1ZSApIHsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgc2hhcGVIb2xlc1sgaSBdID0gc2hhcGVIb2xlLnJldmVyc2Uo
KTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0
ZVNoYXBlKCBzaGFwZVZlcnRpY2VzLCBzaGFwZUhvbGVzICk7CisKKyAgICAgICAgICAgIC8vIGpv
aW4gdmVydGljZXMgb2YgaW5uZXIgYW5kIG91dGVyIHBhdGhzIHRvIGEgc2luZ2xlIGFycmF5CisK
KyAgICAgICAgICAgIGZvciAoIGkgPSAwLCBsID0gc2hhcGVIb2xlcy5sZW5ndGg7IGkgPCBsOyBp
ICsrICkgeworCisgICAgICAgICAgICAgICAgc2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdOwor
ICAgICAgICAgICAgICAgIHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLmNvbmNhdCggc2hh
cGVIb2xlICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdmVydGljZXMsIG5v
cm1hbHMsIHV2cworCisgICAgICAgICAgICBmb3IgKCBpID0gMCwgbCA9IHNoYXBlVmVydGljZXMu
bGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHZhciB2ZXJ0ZXggPSBz
aGFwZVZlcnRpY2VzWyBpIF07CisKKyAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKCB2ZXJ0
ZXgueCwgdmVydGV4LnksIDAgKTsKKyAgICAgICAgICAgICAgICBub3JtYWxzLnB1c2goIDAsIDAs
IDEgKTsKKyAgICAgICAgICAgICAgICB1dnMucHVzaCggdmVydGV4LngsIHZlcnRleC55ICk7IC8v
IHdvcmxkIHV2cworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGluY2lkZXMKKwor
ICAgICAgICAgICAgZm9yICggaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkg
eworCisgICAgICAgICAgICAgICAgdmFyIGZhY2UgPSBmYWNlc1sgaSBdOworCisgICAgICAgICAg
ICAgICAgdmFyIGEgPSBmYWNlWyAwIF0gKyBpbmRleE9mZnNldDsKKyAgICAgICAgICAgICAgICB2
YXIgYiA9IGZhY2VbIDEgXSArIGluZGV4T2Zmc2V0OworICAgICAgICAgICAgICAgIHZhciBjID0g
ZmFjZVsgMiBdICsgaW5kZXhPZmZzZXQ7CisKKyAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2go
IGEsIGIsIGMgKTsKKyAgICAgICAgICAgICAgICBncm91cENvdW50ICs9IDM7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICBTaGFwZUJ1ZmZlckdlb21ldHJ5LnBy
b3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOworICAg
IFNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVCdWZmZXJH
ZW9tZXRyeTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8v
Z2l0aHViLmNvbS9XZXN0TGFuZ2xleQorICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8v
Z2l0aHViLmNvbS9NdWdlbjg3CisgICAgICovCisKKyAgICBmdW5jdGlvbiBFZGdlc0dlb21ldHJ5
KCBnZW9tZXRyeSwgdGhyZXNob2xkQW5nbGUgKSB7CisKKyAgICAgICAgQnVmZmVyR2VvbWV0cnku
Y2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdFZGdlc0dlb21ldHJ5JzsKKwor
ICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CisgICAgICAgICAgICB0aHJlc2hvbGRBbmdsZTog
dGhyZXNob2xkQW5nbGUKKyAgICAgICAgfTsKKworICAgICAgICB0aHJlc2hvbGRBbmdsZSA9ICgg
dGhyZXNob2xkQW5nbGUgIT09IHVuZGVmaW5lZCApID8gdGhyZXNob2xkQW5nbGUgOiAxOworCisg
ICAgICAgIC8vIGJ1ZmZlcgorCisgICAgICAgIHZhciB2ZXJ0aWNlcyA9IFtdOworCisgICAgICAg
IC8vIGhlbHBlciB2YXJpYWJsZXMKKworICAgICAgICB2YXIgdGhyZXNob2xkRG90ID0gTWF0aC5j
b3MoIF9NYXRoLkRFRzJSQUQgKiB0aHJlc2hvbGRBbmdsZSApOworICAgICAgICB2YXIgZWRnZSA9
IFsgMCwgMCBdLCBlZGdlcyA9IHt9LCBlZGdlMSwgZWRnZTI7CisgICAgICAgIHZhciBrZXksIGtl
eXMgPSBbICdhJywgJ2InLCAnYycgXTsKKworICAgICAgICAvLyBwcmVwYXJlIHNvdXJjZSBnZW9t
ZXRyeQorCisgICAgICAgIHZhciBnZW9tZXRyeTI7CisKKyAgICAgICAgaWYgKCBnZW9tZXRyeS5p
c0J1ZmZlckdlb21ldHJ5ICkgeworCisgICAgICAgICAgICBnZW9tZXRyeTIgPSBuZXcgR2VvbWV0
cnkoKTsKKyAgICAgICAgICAgIGdlb21ldHJ5Mi5mcm9tQnVmZmVyR2VvbWV0cnkoIGdlb21ldHJ5
ICk7CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgZ2VvbWV0cnkyID0gZ2VvbWV0
cnkuY2xvbmUoKTsKKworICAgICAgICB9CisKKyAgICAgICAgZ2VvbWV0cnkyLm1lcmdlVmVydGlj
ZXMoKTsKKyAgICAgICAgZ2VvbWV0cnkyLmNvbXB1dGVGYWNlTm9ybWFscygpOworCisgICAgICAg
IHZhciBzb3VyY2VWZXJ0aWNlcyA9IGdlb21ldHJ5Mi52ZXJ0aWNlczsKKyAgICAgICAgdmFyIGZh
Y2VzID0gZ2VvbWV0cnkyLmZhY2VzOworCisgICAgICAgIC8vIG5vdyBjcmVhdGUgYSBkYXRhIHN0
cnVjdHVyZSB3aGVyZSBlYWNoIGVudHJ5IHJlcHJlc2VudHMgYW4gZWRnZSB3aXRoIGl0cyBhZGpv
aW5pbmcgZmFjZXMKKworICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7
IGkgPCBsOyBpICsrICkgeworCisgICAgICAgICAgICB2YXIgZmFjZSA9IGZhY2VzWyBpIF07CisK
KyAgICAgICAgICAgIGZvciAoIHZhciBqID0gMDsgaiA8IDM7IGogKysgKSB7CisKKyAgICAgICAg
ICAgICAgICBlZGdlMSA9IGZhY2VbIGtleXNbIGogXSBdOworICAgICAgICAgICAgICAgIGVkZ2Uy
ID0gZmFjZVsga2V5c1sgKCBqICsgMSApICUgMyBdIF07CisgICAgICAgICAgICAgICAgZWRnZVsg
MCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOworICAgICAgICAgICAgICAgIGVkZ2VbIDEg
XSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTsKKworICAgICAgICAgICAgICAgIGtleSA9IGVk
Z2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTsKKworICAgICAgICAgICAgICAgIGlmICggZWRnZXNb
IGtleSBdID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZWRnZXNbIGtl
eSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0sIGZhY2UxOiBpLCBm
YWNlMjogdW5kZWZpbmVkIH07CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAg
ICAgICAgICAgICAgIGVkZ2VzWyBrZXkgXS5mYWNlMiA9IGk7CisKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2VuZXJhdGUgdmVy
dGljZXMKKworICAgICAgICBmb3IgKCBrZXkgaW4gZWRnZXMgKSB7CisKKyAgICAgICAgICAgIHZh
ciBlID0gZWRnZXNbIGtleSBdOworCisgICAgICAgICAgICAvLyBhbiBlZGdlIGlzIG9ubHkgcmVu
ZGVyZWQgaWYgdGhlIGFuZ2xlIChpbiBkZWdyZWVzKSBiZXR3ZWVuIHRoZSBmYWNlIG5vcm1hbHMg
b2YgdGhlIGFkam9pbmluZyBmYWNlcyBleGNlZWRzIHRoaXMgdmFsdWUuIGRlZmF1bHQgPSAxIGRl
Z3JlZS4KKworICAgICAgICAgICAgaWYgKCBlLmZhY2UyID09PSB1bmRlZmluZWQgfHwgZmFjZXNb
IGUuZmFjZTEgXS5ub3JtYWwuZG90KCBmYWNlc1sgZS5mYWNlMiBdLm5vcm1hbCApIDw9IHRocmVz
aG9sZERvdCApIHsKKworICAgICAgICAgICAgICAgIHZhciB2ZXJ0ZXggPSBzb3VyY2VWZXJ0aWNl
c1sgZS5pbmRleDEgXTsKKyAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwg
dmVydGV4LnksIHZlcnRleC56ICk7CisKKyAgICAgICAgICAgICAgICB2ZXJ0ZXggPSBzb3VyY2VW
ZXJ0aWNlc1sgZS5pbmRleDIgXTsKKyAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKCB2ZXJ0
ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9
CisKKyAgICAgICAgLy8gYnVpbGQgZ2VvbWV0cnkKKworICAgICAgICB0aGlzLmFkZEF0dHJpYnV0
ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkg
KTsKKworICAgIH0KKworICAgIEVkZ2VzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0
ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisgICAgRWRnZXNHZW9tZXRyeS5wcm90b3R5
cGUuY29uc3RydWN0b3IgPSBFZGdlc0dlb21ldHJ5OworCisgICAgLyoqCisgICAgICogQGF1dGhv
ciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBo
dHRwczovL2dpdGh1Yi5jb20vTXVnZW44NworICAgICAqLworCisgICAgLy8gQ3lsaW5kZXJHZW9t
ZXRyeQorCisgICAgZnVuY3Rpb24gQ3lsaW5kZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNC
b3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQs
IHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgeworCisgICAgICAgIEdlb21ldHJ5LmNhbGwoIHRo
aXMgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnQ3lsaW5kZXJHZW9tZXRyeSc7CisKKyAgICAg
ICAgdGhpcy5wYXJhbWV0ZXJzID0geworICAgICAgICAgICAgcmFkaXVzVG9wOiByYWRpdXNUb3As
CisgICAgICAgICAgICByYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSwKKyAgICAgICAgICAgIGhl
aWdodDogaGVpZ2h0LAorICAgICAgICAgICAgcmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRz
LAorICAgICAgICAgICAgaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAorICAgICAgICAg
ICAgb3BlbkVuZGVkOiBvcGVuRW5kZWQsCisgICAgICAgICAgICB0aGV0YVN0YXJ0OiB0aGV0YVN0
YXJ0LAorICAgICAgICAgICAgdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoCisgICAgICAgIH07CisK
KyAgICAgICAgdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBDeWxpbmRlckJ1ZmZlckdlb21l
dHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVp
Z2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApOworICAg
ICAgICB0aGlzLm1lcmdlVmVydGljZXMoKTsKKworICAgIH0KKworICAgIEN5bGluZGVyR2VvbWV0
cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CisgICAg
Q3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDeWxpbmRlckdlb21ldHJ5
OworCisgICAgLy8gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeQorCisgICAgZnVuY3Rpb24gQ3lsaW5k
ZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFs
U2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVu
Z3RoICkgeworCisgICAgICAgIEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworICAgICAg
ICB0aGlzLnR5cGUgPSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc7CisKKyAgICAgICAgdGhpcy5w
YXJhbWV0ZXJzID0geworICAgICAgICAgICAgcmFkaXVzVG9wOiByYWRpdXNUb3AsCisgICAgICAg
ICAgICByYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSwKKyAgICAgICAgICAgIGhlaWdodDogaGVp
Z2h0LAorICAgICAgICAgICAgcmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLAorICAgICAg
ICAgICAgaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAorICAgICAgICAgICAgb3BlbkVu
ZGVkOiBvcGVuRW5kZWQsCisgICAgICAgICAgICB0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAorICAg
ICAgICAgICAgdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoCisgICAgICAgIH07CisKKyAgICAgICAg
dmFyIHNjb3BlID0gdGhpczsKKworICAgICAgICByYWRpdXNUb3AgPSByYWRpdXNUb3AgIT09IHVu
ZGVmaW5lZCA/IHJhZGl1c1RvcCA6IDIwOworICAgICAgICByYWRpdXNCb3R0b20gPSByYWRpdXNC
b3R0b20gIT09IHVuZGVmaW5lZCA/IHJhZGl1c0JvdHRvbSA6IDIwOworICAgICAgICBoZWlnaHQg
PSBoZWlnaHQgIT09IHVuZGVmaW5lZCA/IGhlaWdodCA6IDEwMDsKKworICAgICAgICByYWRpYWxT
ZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODsKKyAgICAgICAgaGVp
Z2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7CisKKyAgICAg
ICAgb3BlbkVuZGVkID0gb3BlbkVuZGVkICE9PSB1bmRlZmluZWQgPyBvcGVuRW5kZWQgOiBmYWxz
ZTsKKyAgICAgICAgdGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRh
U3RhcnQgOiAwLjA7CisgICAgICAgIHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVm
aW5lZCA/IHRoZXRhTGVuZ3RoIDogMi4wICogTWF0aC5QSTsKKworICAgICAgICAvLyBidWZmZXJz
CisKKyAgICAgICAgdmFyIGluZGljZXMgPSBbXTsKKyAgICAgICAgdmFyIHZlcnRpY2VzID0gW107
CisgICAgICAgIHZhciBub3JtYWxzID0gW107CisgICAgICAgIHZhciB1dnMgPSBbXTsKKworICAg
ICAgICAvLyBoZWxwZXIgdmFyaWFibGVzCisKKyAgICAgICAgdmFyIGluZGV4ID0gMDsKKyAgICAg
ICAgdmFyIGluZGV4QXJyYXkgPSBbXTsKKyAgICAgICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQg
LyAyOworICAgICAgICB2YXIgZ3JvdXBTdGFydCA9IDA7CisKKyAgICAgICAgLy8gZ2VuZXJhdGUg
Z2VvbWV0cnkKKworICAgICAgICBnZW5lcmF0ZVRvcnNvKCk7CisKKyAgICAgICAgaWYgKCBvcGVu
RW5kZWQgPT09IGZhbHNlICkgeworCisgICAgICAgICAgICBpZiAoIHJhZGl1c1RvcCA+IDAgKSBn
ZW5lcmF0ZUNhcCggdHJ1ZSApOworICAgICAgICAgICAgaWYgKCByYWRpdXNCb3R0b20gPiAwICkg
Z2VuZXJhdGVDYXAoIGZhbHNlICk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJ1aWxkIGdl
b21ldHJ5CisKKyAgICAgICAgdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOworICAgICAgICB0aGlz
LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZl
cnRpY2VzLCAzICkgKTsKKyAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcg
RmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CisgICAgICAgIHRoaXMuYWRk
QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsK
KworICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVRvcnNvKCkgeworCisgICAgICAgICAgICB2YXIg
eCwgeTsKKyAgICAgICAgICAgIHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOworICAgICAgICAg
ICAgdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgIHZhciBncm91cENv
dW50ID0gMDsKKworICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRl
IHRoZSBub3JtYWwKKyAgICAgICAgICAgIHZhciBzbG9wZSA9ICggcmFkaXVzQm90dG9tIC0gcmFk
aXVzVG9wICkgLyBoZWlnaHQ7CisKKyAgICAgICAgICAgIC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBu
b3JtYWxzIGFuZCB1dnMKKworICAgICAgICAgICAgZm9yICggeSA9IDA7IHkgPD0gaGVpZ2h0U2Vn
bWVudHM7IHkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgaW5kZXhSb3cgPSBbXTsKKwor
ICAgICAgICAgICAgICAgIHZhciB2ID0geSAvIGhlaWdodFNlZ21lbnRzOworCisgICAgICAgICAg
ICAgICAgLy8gY2FsY3VsYXRlIHRoZSByYWRpdXMgb2YgdGhlIGN1cnJlbnQgcm93CisKKyAgICAg
ICAgICAgICAgICB2YXIgcmFkaXVzID0gdiAqICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkg
KyByYWRpdXNUb3A7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxT
ZWdtZW50czsgeCArKyApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHggLyByYWRp
YWxTZWdtZW50czsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdGhldGEgPSB1ICogdGhldGFM
ZW5ndGggKyB0aGV0YVN0YXJ0OworCisgICAgICAgICAgICAgICAgICAgIHZhciBzaW5UaGV0YSA9
IE1hdGguc2luKCB0aGV0YSApOworICAgICAgICAgICAgICAgICAgICB2YXIgY29zVGhldGEgPSBN
YXRoLmNvcyggdGhldGEgKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJ0ZXgKKworICAg
ICAgICAgICAgICAgICAgICB2ZXJ0ZXgueCA9IHJhZGl1cyAqIHNpblRoZXRhOworICAgICAgICAg
ICAgICAgICAgICB2ZXJ0ZXgueSA9IC0gdiAqIGhlaWdodCArIGhhbGZIZWlnaHQ7CisgICAgICAg
ICAgICAgICAgICAgIHZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7CisgICAgICAgICAgICAg
ICAgICAgIHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKwor
ICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWwKKworICAgICAgICAgICAgICAgICAgICBub3Jt
YWwuc2V0KCBzaW5UaGV0YSwgc2xvcGUsIGNvc1RoZXRhICkubm9ybWFsaXplKCk7CisgICAgICAg
ICAgICAgICAgICAgIG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiAp
OworCisgICAgICAgICAgICAgICAgICAgIC8vIHV2CisKKyAgICAgICAgICAgICAgICAgICAgdXZz
LnB1c2goIHUsIDEgLSB2ICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBpbmRleCBv
ZiB2ZXJ0ZXggaW4gcmVzcGVjdGl2ZSByb3cKKworICAgICAgICAgICAgICAgICAgICBpbmRleFJv
dy5wdXNoKCBpbmRleCArKyApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgLy8gbm93IHNhdmUgdmVydGljZXMgb2YgdGhlIHJvdyBpbiBvdXIgaW5kZXggYXJyYXkKKwor
ICAgICAgICAgICAgICAgIGluZGV4QXJyYXkucHVzaCggaW5kZXhSb3cgKTsKKworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAvLyBnZW5lcmF0ZSBpbmRpY2VzCisKKyAgICAgICAgICAgIGZv
ciAoIHggPSAwOyB4IDwgcmFkaWFsU2VnbWVudHM7IHggKysgKSB7CisKKyAgICAgICAgICAgICAg
ICBmb3IgKCB5ID0gMDsgeSA8IGhlaWdodFNlZ21lbnRzOyB5ICsrICkgeworCisgICAgICAgICAg
ICAgICAgICAgIC8vIHdlIHVzZSB0aGUgaW5kZXggYXJyYXkgdG8gYWNjZXNzIHRoZSBjb3JyZWN0
IGluZGljZXMKKworICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGluZGV4QXJyYXlbIHkgXVsg
eCBdOworICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHgg
XTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4ICsg
MSBdOworICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGluZGV4QXJyYXlbIHkgXVsgeCArIDEg
XTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmYWNlcworCisgICAgICAgICAgICAgICAgICAg
IGluZGljZXMucHVzaCggYSwgYiwgZCApOworICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnB1
c2goIGIsIGMsIGQgKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZ3JvdXAgY291
bnRlcgorCisgICAgICAgICAgICAgICAgICAgIGdyb3VwQ291bnQgKz0gNjsKKworICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhZGQgYSBncm91cCB0
byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydAor
CisgICAgICAgICAgICBzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgMCAp
OworCisgICAgICAgICAgICAvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHMK
KworICAgICAgICAgICAgZ3JvdXBTdGFydCArPSBncm91cENvdW50OworCisgICAgICAgIH0KKwor
ICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZUNhcCggdG9wICkgeworCisgICAgICAgICAgICB2YXIg
eCwgY2VudGVySW5kZXhTdGFydCwgY2VudGVySW5kZXhFbmQ7CisKKyAgICAgICAgICAgIHZhciB1
diA9IG5ldyBWZWN0b3IyKCk7CisgICAgICAgICAgICB2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMo
KTsKKworICAgICAgICAgICAgdmFyIGdyb3VwQ291bnQgPSAwOworCisgICAgICAgICAgICB2YXIg
cmFkaXVzID0gKCB0b3AgPT09IHRydWUgKSA/IHJhZGl1c1RvcCA6IHJhZGl1c0JvdHRvbTsKKyAg
ICAgICAgICAgIHZhciBzaWduID0gKCB0b3AgPT09IHRydWUgKSA/IDEgOiAtIDE7CisKKyAgICAg
ICAgICAgIC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjZW50ZXIgdmVydGV4CisgICAg
ICAgICAgICBjZW50ZXJJbmRleFN0YXJ0ID0gaW5kZXg7CisKKyAgICAgICAgICAgIC8vIGZpcnN0
IHdlIGdlbmVyYXRlIHRoZSBjZW50ZXIgdmVydGV4IGRhdGEgb2YgdGhlIGNhcC4KKyAgICAgICAg
ICAgIC8vIGJlY2F1c2UgdGhlIGdlb21ldHJ5IG5lZWRzIG9uZSBzZXQgb2YgdXZzIHBlciBmYWNl
LAorICAgICAgICAgICAgLy8gd2UgbXVzdCBnZW5lcmF0ZSBhIGNlbnRlciB2ZXJ0ZXggcGVyIGZh
Y2Uvc2VnbWVudAorCisgICAgICAgICAgICBmb3IgKCB4ID0gMTsgeCA8PSByYWRpYWxTZWdtZW50
czsgeCArKyApIHsKKworICAgICAgICAgICAgICAgIC8vIHZlcnRleAorCisgICAgICAgICAgICAg
ICAgdmVydGljZXMucHVzaCggMCwgaGFsZkhlaWdodCAqIHNpZ24sIDAgKTsKKworICAgICAgICAg
ICAgICAgIC8vIG5vcm1hbAorCisgICAgICAgICAgICAgICAgbm9ybWFscy5wdXNoKCAwLCBzaWdu
LCAwICk7CisKKyAgICAgICAgICAgICAgICAvLyB1dgorCisgICAgICAgICAgICAgICAgdXZzLnB1
c2goIDAuNSwgMC41ICk7CisKKyAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZSBpbmRleAorCisg
ICAgICAgICAgICAgICAgaW5kZXggKys7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Ly8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2VudGVyIHZlcnRleAorCisgICAgICAgICAg
ICBjZW50ZXJJbmRleEVuZCA9IGluZGV4OworCisgICAgICAgICAgICAvLyBub3cgd2UgZ2VuZXJh
dGUgdGhlIHN1cnJvdW5kaW5nIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKKworICAgICAgICAg
ICAgZm9yICggeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7CisKKyAgICAgICAg
ICAgICAgICB2YXIgdSA9IHggLyByYWRpYWxTZWdtZW50czsKKyAgICAgICAgICAgICAgICB2YXIg
dGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0OworCisgICAgICAgICAgICAgICAg
dmFyIGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7CisgICAgICAgICAgICAgICAgdmFyIHNp
blRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7CisKKyAgICAgICAgICAgICAgICAvLyB2ZXJ0ZXgK
KworICAgICAgICAgICAgICAgIHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7CisgICAgICAg
ICAgICAgICAgdmVydGV4LnkgPSBoYWxmSGVpZ2h0ICogc2lnbjsKKyAgICAgICAgICAgICAgICB2
ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhOworICAgICAgICAgICAgICAgIHZlcnRpY2VzLnB1
c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKKworICAgICAgICAgICAgICAgIC8v
IG5vcm1hbAorCisgICAgICAgICAgICAgICAgbm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7CisK
KyAgICAgICAgICAgICAgICAvLyB1dgorCisgICAgICAgICAgICAgICAgdXYueCA9ICggY29zVGhl
dGEgKiAwLjUgKSArIDAuNTsKKyAgICAgICAgICAgICAgICB1di55ID0gKCBzaW5UaGV0YSAqIDAu
NSAqIHNpZ24gKSArIDAuNTsKKyAgICAgICAgICAgICAgICB1dnMucHVzaCggdXYueCwgdXYueSAp
OworCisgICAgICAgICAgICAgICAgLy8gaW5jcmVhc2UgaW5kZXgKKworICAgICAgICAgICAgICAg
IGluZGV4ICsrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGdlbmVyYXRlIGlu
ZGljZXMKKworICAgICAgICAgICAgZm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCAr
KyApIHsKKworICAgICAgICAgICAgICAgIHZhciBjID0gY2VudGVySW5kZXhTdGFydCArIHg7Cisg
ICAgICAgICAgICAgICAgdmFyIGkgPSBjZW50ZXJJbmRleEVuZCArIHg7CisKKyAgICAgICAgICAg
ICAgICBpZiAoIHRvcCA9PT0gdHJ1ZSApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBmYWNl
IHRvcAorCisgICAgICAgICAgICAgICAgICAgIGluZGljZXMucHVzaCggaSwgaSArIDEsIGMgKTsK
KworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFj
ZSBib3R0b20KKworICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goIGkgKyAxLCBpLCBj
ICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBncm91cENvdW50ICs9
IDM7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYWRkIGEgZ3JvdXAgdG8gdGhl
IGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnQKKworICAg
ICAgICAgICAgc2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIHRvcCA9PT0g
dHJ1ZSA/IDEgOiAyICk7CisKKyAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFs
dWUgZm9yIGdyb3VwcworCisgICAgICAgICAgICBncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7CisK
KyAgICAgICAgfQorCisgICAgfQorCisgICAgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5
cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKyAgICBDeWxp
bmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN5bGluZGVyQnVmZmVy
R2VvbWV0cnk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8v
Z2l0aHViLmNvbS9hYmVsbmF0aW9uCisgICAgICovCisKKyAgICAvLyBDb25lR2VvbWV0cnkKKwor
ICAgIGZ1bmN0aW9uIENvbmVHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRz
LCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsK
KworICAgICAgICBDeWxpbmRlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0
LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwg
dGhldGFMZW5ndGggKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnQ29uZUdlb21ldHJ5JzsKKwor
ICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CisgICAgICAgICAgICByYWRpdXM6IHJhZGl1cywK
KyAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAorICAgICAgICAgICAgcmFkaWFsU2VnbWVudHM6
IHJhZGlhbFNlZ21lbnRzLAorICAgICAgICAgICAgaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21l
bnRzLAorICAgICAgICAgICAgb3BlbkVuZGVkOiBvcGVuRW5kZWQsCisgICAgICAgICAgICB0aGV0
YVN0YXJ0OiB0aGV0YVN0YXJ0LAorICAgICAgICAgICAgdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3Ro
CisgICAgICAgIH07CisKKyAgICB9CisKKyAgICBDb25lR2VvbWV0cnkucHJvdG90eXBlID0gT2Jq
ZWN0LmNyZWF0ZSggQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKKyAgICBDb25lR2VvbWV0
cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uZUdlb21ldHJ5OworCisgICAgLy8gQ29uZUJ1
ZmZlckdlb21ldHJ5CisKKyAgICBmdW5jdGlvbiBDb25lQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywg
aGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFT
dGFydCwgdGhldGFMZW5ndGggKSB7CisKKyAgICAgICAgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5j
YWxsKCB0aGlzLCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21l
bnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7CisKKyAgICAgICAgdGhp
cy50eXBlID0gJ0NvbmVCdWZmZXJHZW9tZXRyeSc7CisKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJz
ID0geworICAgICAgICAgICAgcmFkaXVzOiByYWRpdXMsCisgICAgICAgICAgICBoZWlnaHQ6IGhl
aWdodCwKKyAgICAgICAgICAgIHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKKyAgICAg
ICAgICAgIGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cywKKyAgICAgICAgICAgIG9wZW5F
bmRlZDogb3BlbkVuZGVkLAorICAgICAgICAgICAgdGhldGFTdGFydDogdGhldGFTdGFydCwKKyAg
ICAgICAgICAgIHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAorICAgICAgICB9OworCisgICAgfQor
CisgICAgQ29uZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN5bGlu
ZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CisgICAgQ29uZUJ1ZmZlckdlb21ldHJ5LnBy
b3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVCdWZmZXJHZW9tZXRyeTsKKworICAgIC8qKgorICAg
ICAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtcwor
ICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisgICAg
ICogQGF1dGhvciBodWdoZXMKKyAgICAgKi8KKworICAgIC8vIENpcmNsZUdlb21ldHJ5CisKKyAg
ICBmdW5jdGlvbiBDaXJjbGVHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwg
dGhldGFMZW5ndGggKSB7CisKKyAgICAgICAgR2VvbWV0cnkuY2FsbCggdGhpcyApOworCisgICAg
ICAgIHRoaXMudHlwZSA9ICdDaXJjbGVHZW9tZXRyeSc7CisKKyAgICAgICAgdGhpcy5wYXJhbWV0
ZXJzID0geworICAgICAgICAgICAgcmFkaXVzOiByYWRpdXMsCisgICAgICAgICAgICBzZWdtZW50
czogc2VnbWVudHMsCisgICAgICAgICAgICB0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAorICAgICAg
ICAgICAgdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoCisgICAgICAgIH07CisKKyAgICAgICAgdGhp
cy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBz
ZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApOworICAgICAgICB0aGlzLm1lcmdl
VmVydGljZXMoKTsKKworICAgIH0KKworICAgIENpcmNsZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9i
amVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOworICAgIENpcmNsZUdlb21ldHJ5LnBy
b3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZUdlb21ldHJ5OworCisgICAgLy8gQ2lyY2xlQnVm
ZmVyR2VvbWV0cnkKKworICAgIGZ1bmN0aW9uIENpcmNsZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMs
IHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKKworICAgICAgICBCdWZmZXJH
ZW9tZXRyeS5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhpcy50eXBlID0gJ0NpcmNsZUJ1ZmZl
ckdlb21ldHJ5JzsKKworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CisgICAgICAgICAgICBy
YWRpdXM6IHJhZGl1cywKKyAgICAgICAgICAgIHNlZ21lbnRzOiBzZWdtZW50cywKKyAgICAgICAg
ICAgIHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCisgICAgICAgICAgICB0aGV0YUxlbmd0aDogdGhl
dGFMZW5ndGgKKyAgICAgICAgfTsKKworICAgICAgICByYWRpdXMgPSByYWRpdXMgfHwgNTA7Cisg
ICAgICAgIHNlZ21lbnRzID0gc2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCBz
ZWdtZW50cyApIDogODsKKworICAgICAgICB0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5k
ZWZpbmVkID8gdGhldGFTdGFydCA6IDA7CisgICAgICAgIHRoZXRhTGVuZ3RoID0gdGhldGFMZW5n
dGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7CisKKyAgICAgICAg
Ly8gYnVmZmVycworCisgICAgICAgIHZhciBpbmRpY2VzID0gW107CisgICAgICAgIHZhciB2ZXJ0
aWNlcyA9IFtdOworICAgICAgICB2YXIgbm9ybWFscyA9IFtdOworICAgICAgICB2YXIgdXZzID0g
W107CisKKyAgICAgICAgLy8gaGVscGVyIHZhcmlhYmxlcworCisgICAgICAgIHZhciBpLCBzOwor
ICAgICAgICB2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgdmFyIHV2ID0gbmV3
IFZlY3RvcjIoKTsKKworICAgICAgICAvLyBjZW50ZXIgcG9pbnQKKworICAgICAgICB2ZXJ0aWNl
cy5wdXNoKCAwLCAwLCAwICk7CisgICAgICAgIG5vcm1hbHMucHVzaCggMCwgMCwgMSApOworICAg
ICAgICB1dnMucHVzaCggMC41LCAwLjUgKTsKKworICAgICAgICBmb3IgKCBzID0gMCwgaSA9IDM7
IHMgPD0gc2VnbWVudHM7IHMgKyssIGkgKz0gMyApIHsKKworICAgICAgICAgICAgdmFyIHNlZ21l
bnQgPSB0aGV0YVN0YXJ0ICsgcyAvIHNlZ21lbnRzICogdGhldGFMZW5ndGg7CisKKyAgICAgICAg
ICAgIC8vIHZlcnRleAorCisgICAgICAgICAgICB2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29z
KCBzZWdtZW50ICk7CisgICAgICAgICAgICB2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBz
ZWdtZW50ICk7CisKKyAgICAgICAgICAgIHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgu
eSwgdmVydGV4LnogKTsKKworICAgICAgICAgICAgLy8gbm9ybWFsCisKKyAgICAgICAgICAgIG5v
cm1hbHMucHVzaCggMCwgMCwgMSApOworCisgICAgICAgICAgICAvLyB1dnMKKworICAgICAgICAg
ICAgdXYueCA9ICggdmVydGljZXNbIGkgXSAvIHJhZGl1cyArIDEgKSAvIDI7CisgICAgICAgICAg
ICB1di55ID0gKCB2ZXJ0aWNlc1sgaSArIDEgXSAvIHJhZGl1cyArIDEgKSAvIDI7CisKKyAgICAg
ICAgICAgIHV2cy5wdXNoKCB1di54LCB1di55ICk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8v
IGluZGljZXMKKworICAgICAgICBmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHsK
KworICAgICAgICAgICAgaW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgMCApOworCisgICAgICAgIH0K
KworICAgICAgICAvLyBidWlsZCBnZW9tZXRyeQorCisgICAgICAgIHRoaXMuc2V0SW5kZXgoIGlu
ZGljZXMgKTsKKyAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9h
dDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CisgICAgICAgIHRoaXMuYWRkQXR0
cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMg
KSApOworICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJB
dHRyaWJ1dGUoIHV2cywgMiApICk7CisKKyAgICB9CisKKyAgICBDaXJjbGVCdWZmZXJHZW9tZXRy
eS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsK
KyAgICBDaXJjbGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDaXJjbGVC
dWZmZXJHZW9tZXRyeTsKKworCisKKyAgICB2YXIgR2VvbWV0cmllcyA9IE9iamVjdC5mcmVlemUo
eworICAgICAgICBXaXJlZnJhbWVHZW9tZXRyeTogV2lyZWZyYW1lR2VvbWV0cnksCisgICAgICAg
IFBhcmFtZXRyaWNHZW9tZXRyeTogUGFyYW1ldHJpY0dlb21ldHJ5LAorICAgICAgICBQYXJhbWV0
cmljQnVmZmVyR2VvbWV0cnk6IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSwKKyAgICAgICAgVGV0
cmFoZWRyb25HZW9tZXRyeTogVGV0cmFoZWRyb25HZW9tZXRyeSwKKyAgICAgICAgVGV0cmFoZWRy
b25CdWZmZXJHZW9tZXRyeTogVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSwKKyAgICAgICAgT2N0
YWhlZHJvbkdlb21ldHJ5OiBPY3RhaGVkcm9uR2VvbWV0cnksCisgICAgICAgIE9jdGFoZWRyb25C
dWZmZXJHZW9tZXRyeTogT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LAorICAgICAgICBJY29zYWhl
ZHJvbkdlb21ldHJ5OiBJY29zYWhlZHJvbkdlb21ldHJ5LAorICAgICAgICBJY29zYWhlZHJvbkJ1
ZmZlckdlb21ldHJ5OiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LAorICAgICAgICBEb2RlY2Fo
ZWRyb25HZW9tZXRyeTogRG9kZWNhaGVkcm9uR2VvbWV0cnksCisgICAgICAgIERvZGVjYWhlZHJv
bkJ1ZmZlckdlb21ldHJ5OiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSwKKyAgICAgICAgUG9s
eWhlZHJvbkdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksCisgICAgICAgIFBvbHloZWRyb25C
dWZmZXJHZW9tZXRyeTogUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LAorICAgICAgICBUdWJlR2Vv
bWV0cnk6IFR1YmVHZW9tZXRyeSwKKyAgICAgICAgVHViZUJ1ZmZlckdlb21ldHJ5OiBUdWJlQnVm
ZmVyR2VvbWV0cnksCisgICAgICAgIFRvcnVzS25vdEdlb21ldHJ5OiBUb3J1c0tub3RHZW9tZXRy
eSwKKyAgICAgICAgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk6IFRvcnVzS25vdEJ1ZmZlckdlb21l
dHJ5LAorICAgICAgICBUb3J1c0dlb21ldHJ5OiBUb3J1c0dlb21ldHJ5LAorICAgICAgICBUb3J1
c0J1ZmZlckdlb21ldHJ5OiBUb3J1c0J1ZmZlckdlb21ldHJ5LAorICAgICAgICBUZXh0R2VvbWV0
cnk6IFRleHRHZW9tZXRyeSwKKyAgICAgICAgVGV4dEJ1ZmZlckdlb21ldHJ5OiBUZXh0QnVmZmVy
R2VvbWV0cnksCisgICAgICAgIFNwaGVyZUdlb21ldHJ5OiBTcGhlcmVHZW9tZXRyeSwKKyAgICAg
ICAgU3BoZXJlQnVmZmVyR2VvbWV0cnk6IFNwaGVyZUJ1ZmZlckdlb21ldHJ5LAorICAgICAgICBS
aW5nR2VvbWV0cnk6IFJpbmdHZW9tZXRyeSwKKyAgICAgICAgUmluZ0J1ZmZlckdlb21ldHJ5OiBS
aW5nQnVmZmVyR2VvbWV0cnksCisgICAgICAgIFBsYW5lR2VvbWV0cnk6IFBsYW5lR2VvbWV0cnks
CisgICAgICAgIFBsYW5lQnVmZmVyR2VvbWV0cnk6IFBsYW5lQnVmZmVyR2VvbWV0cnksCisgICAg
ICAgIExhdGhlR2VvbWV0cnk6IExhdGhlR2VvbWV0cnksCisgICAgICAgIExhdGhlQnVmZmVyR2Vv
bWV0cnk6IExhdGhlQnVmZmVyR2VvbWV0cnksCisgICAgICAgIFNoYXBlR2VvbWV0cnk6IFNoYXBl
R2VvbWV0cnksCisgICAgICAgIFNoYXBlQnVmZmVyR2VvbWV0cnk6IFNoYXBlQnVmZmVyR2VvbWV0
cnksCisgICAgICAgIEV4dHJ1ZGVHZW9tZXRyeTogRXh0cnVkZUdlb21ldHJ5LAorICAgICAgICBF
eHRydWRlQnVmZmVyR2VvbWV0cnk6IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSwKKyAgICAgICAgRWRn
ZXNHZW9tZXRyeTogRWRnZXNHZW9tZXRyeSwKKyAgICAgICAgQ29uZUdlb21ldHJ5OiBDb25lR2Vv
bWV0cnksCisgICAgICAgIENvbmVCdWZmZXJHZW9tZXRyeTogQ29uZUJ1ZmZlckdlb21ldHJ5LAor
ICAgICAgICBDeWxpbmRlckdlb21ldHJ5OiBDeWxpbmRlckdlb21ldHJ5LAorICAgICAgICBDeWxp
bmRlckJ1ZmZlckdlb21ldHJ5OiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LAorICAgICAgICBDaXJj
bGVHZW9tZXRyeTogQ2lyY2xlR2VvbWV0cnksCisgICAgICAgIENpcmNsZUJ1ZmZlckdlb21ldHJ5
OiBDaXJjbGVCdWZmZXJHZW9tZXRyeSwKKyAgICAgICAgQm94R2VvbWV0cnk6IEJveEdlb21ldHJ5
LAorICAgICAgICBCb3hCdWZmZXJHZW9tZXRyeTogQm94QnVmZmVyR2VvbWV0cnkKKyAgICB9KTsK
KworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisg
ICAgICoKKyAgICAgKiBwYXJhbWV0ZXJzID0geworICAgICAqICBvcGFjaXR5OiA8ZmxvYXQ+Cisg
ICAgICogfQorICAgICAqLworCisgICAgZnVuY3Rpb24gU2hhZG93TWF0ZXJpYWwoIHBhcmFtZXRl
cnMgKSB7CisKKyAgICAgICAgU2hhZGVyTWF0ZXJpYWwuY2FsbCggdGhpcywgeworICAgICAgICAg
ICAgdW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFsKKyAgICAgICAgICAgICAgICBVbmlm
b3Jtc0xpYi5saWdodHMsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBv
cGFjaXR5OiB7IHZhbHVlOiAxLjAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0g
KSwKKyAgICAgICAgICAgIHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmtbICdzaGFkb3dfdmVydCcg
XSwKKyAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVua1sgJ3NoYWRvd19mcmFn
JyBdCisgICAgICAgIH0gKTsKKworICAgICAgICB0aGlzLmxpZ2h0cyA9IHRydWU7CisgICAgICAg
IHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlOworCisgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0
aWVzKCB0aGlzLCB7CisgICAgICAgICAgICBvcGFjaXR5OiB7CisgICAgICAgICAgICAgICAgZW51
bWVyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudW5pZm9ybXMub3BhY2l0eS52YWx1ZTsKKyAgICAg
ICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsK
KyAgICAgICAgICAgICAgICAgICAgdGhpcy51bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gdmFsdWU7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICk7CisKKyAgICAg
ICAgdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKKworICAgIH0KKworICAgIFNoYWRvd01h
dGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlw
ZSApOworICAgIFNoYWRvd01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYWRvd01h
dGVyaWFsOworCisgICAgU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWwg
PSB0cnVlOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29i
LmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFJhd1NoYWRlck1hdGVyaWFsKCBwYXJhbWV0
ZXJzICkgeworCisgICAgICAgIFNoYWRlck1hdGVyaWFsLmNhbGwoIHRoaXMsIHBhcmFtZXRlcnMg
KTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnUmF3U2hhZGVyTWF0ZXJpYWwnOworCisgICAgfQor
CisgICAgUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2hhZGVy
TWF0ZXJpYWwucHJvdG90eXBlICk7CisgICAgUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNv
bnN0cnVjdG9yID0gUmF3U2hhZGVyTWF0ZXJpYWw7CisKKyAgICBSYXdTaGFkZXJNYXRlcmlhbC5w
cm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBA
YXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKyAgICAg
KgorICAgICAqIHBhcmFtZXRlcnMgPSB7CisgICAgICogIGNvbG9yOiA8aGV4PiwKKyAgICAgKiAg
cm91Z2huZXNzOiA8ZmxvYXQ+LAorICAgICAqICBtZXRhbG5lc3M6IDxmbG9hdD4sCisgICAgICog
IG9wYWNpdHk6IDxmbG9hdD4sCisgICAgICoKKyAgICAgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVy
ZSggPEltYWdlPiApLAorICAgICAqCisgICAgICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVy
ZSggPEltYWdlPiApLAorICAgICAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PgorICAgICAq
CisgICAgICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorICAgICAqICBh
b01hcEludGVuc2l0eTogPGZsb2F0PgorICAgICAqCisgICAgICogIGVtaXNzaXZlOiA8aGV4PiwK
KyAgICAgKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD4KKyAgICAgKiAgZW1pc3NpdmVNYXA6
IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisgICAgICoKKyAgICAgKiAgYnVtcE1hcDog
bmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKyAgICAgKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+
LAorICAgICAqCisgICAgICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4g
KSwKKyAgICAgKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPiwKKyAgICAgKgorICAgICAqICBkaXNw
bGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisgICAgICogIGRpc3Bs
YWNlbWVudFNjYWxlOiA8ZmxvYXQ+LAorICAgICAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+
LAorICAgICAqCisgICAgICogIHJvdWdobmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFn
ZT4gKSwKKyAgICAgKgorICAgICAqICBtZXRhbG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8
SW1hZ2U+ICksCisgICAgICoKKyAgICAgKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8
SW1hZ2U+ICksCisgICAgICoKKyAgICAgKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUo
IFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLAorICAgICAqICBlbnZNYXBJ
bnRlbnNpdHk6IDxmbG9hdD4KKyAgICAgKgorICAgICAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9h
dD4sCisgICAgICoKKyAgICAgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCisgICAgICogIHdpcmVm
cmFtZUxpbmV3aWR0aDogPGZsb2F0PiwKKyAgICAgKgorICAgICAqICBza2lubmluZzogPGJvb2w+
LAorICAgICAqICBtb3JwaFRhcmdldHM6IDxib29sPiwKKyAgICAgKiAgbW9ycGhOb3JtYWxzOiA8
Ym9vbD4KKyAgICAgKiB9CisgICAgICovCisKKyAgICBmdW5jdGlvbiBNZXNoU3RhbmRhcmRNYXRl
cmlhbCggcGFyYW1ldGVycyApIHsKKworICAgICAgICBNYXRlcmlhbC5jYWxsKCB0aGlzICk7CisK
KyAgICAgICAgdGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQnOiAnJyB9OworCisgICAgICAgIHRo
aXMudHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7CisKKyAgICAgICAgdGhpcy5jb2xvciA9
IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZQorICAgICAgICB0aGlzLnJvdWdobmVz
cyA9IDAuNTsKKyAgICAgICAgdGhpcy5tZXRhbG5lc3MgPSAwLjU7CisKKyAgICAgICAgdGhpcy5t
YXAgPSBudWxsOworCisgICAgICAgIHRoaXMubGlnaHRNYXAgPSBudWxsOworICAgICAgICB0aGlz
LmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wOworCisgICAgICAgIHRoaXMuYW9NYXAgPSBudWxsOwor
ICAgICAgICB0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wOworCisgICAgICAgIHRoaXMuZW1pc3Np
dmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7CisgICAgICAgIHRoaXMuZW1pc3NpdmVJbnRlbnNp
dHkgPSAxLjA7CisgICAgICAgIHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsOworCisgICAgICAgIHRo
aXMuYnVtcE1hcCA9IG51bGw7CisgICAgICAgIHRoaXMuYnVtcFNjYWxlID0gMTsKKworICAgICAg
ICB0aGlzLm5vcm1hbE1hcCA9IG51bGw7CisgICAgICAgIHRoaXMubm9ybWFsU2NhbGUgPSBuZXcg
VmVjdG9yMiggMSwgMSApOworCisgICAgICAgIHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDsK
KyAgICAgICAgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7CisgICAgICAgIHRoaXMuZGlzcGxh
Y2VtZW50QmlhcyA9IDA7CisKKyAgICAgICAgdGhpcy5yb3VnaG5lc3NNYXAgPSBudWxsOworCisg
ICAgICAgIHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDsKKworICAgICAgICB0aGlzLmFscGhhTWFw
ID0gbnVsbDsKKworICAgICAgICB0aGlzLmVudk1hcCA9IG51bGw7CisgICAgICAgIHRoaXMuZW52
TWFwSW50ZW5zaXR5ID0gMS4wOworCisgICAgICAgIHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45
ODsKKworICAgICAgICB0aGlzLndpcmVmcmFtZSA9IGZhbHNlOworICAgICAgICB0aGlzLndpcmVm
cmFtZUxpbmV3aWR0aCA9IDE7CisgICAgICAgIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3Vu
ZCc7CisgICAgICAgIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnOworCisgICAgICAg
IHRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5tb3JwaFRhcmdldHMgPSBmYWxz
ZTsKKyAgICAgICAgdGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsKKworICAgICAgICB0aGlzLnNl
dFZhbHVlcyggcGFyYW1ldGVycyApOworCisgICAgfQorCisgICAgTWVzaFN0YW5kYXJkTWF0ZXJp
YWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CisgICAg
TWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFN0YW5kYXJk
TWF0ZXJpYWw7CisKKyAgICBNZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoU3Rh
bmRhcmRNYXRlcmlhbCA9IHRydWU7CisKKyAgICBNZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5
cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgeworCisgICAgICAgIE1hdGVyaWFsLnByb3Rv
dHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOworCisgICAgICAgIHRoaXMuZGVmaW5lcyA9
IHsgJ1NUQU5EQVJEJzogJycgfTsKKworICAgICAgICB0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5j
b2xvciApOworICAgICAgICB0aGlzLnJvdWdobmVzcyA9IHNvdXJjZS5yb3VnaG5lc3M7CisgICAg
ICAgIHRoaXMubWV0YWxuZXNzID0gc291cmNlLm1ldGFsbmVzczsKKworICAgICAgICB0aGlzLm1h
cCA9IHNvdXJjZS5tYXA7CisKKyAgICAgICAgdGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1h
cDsKKyAgICAgICAgdGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVu
c2l0eTsKKworICAgICAgICB0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwOworICAgICAgICB0aGlz
LmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5OworCisgICAgICAgIHRoaXMu
ZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7CisgICAgICAgIHRoaXMuZW1pc3NpdmVN
YXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7CisgICAgICAgIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkg
PSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7CisKKyAgICAgICAgdGhpcy5idW1wTWFwID0gc291
cmNlLmJ1bXBNYXA7CisgICAgICAgIHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTsK
KworICAgICAgICB0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7CisgICAgICAgIHRo
aXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7CisKKyAgICAgICAgdGhp
cy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwOworICAgICAgICB0aGlz
LmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlOworICAgICAgICB0
aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhczsKKworICAgICAg
ICB0aGlzLnJvdWdobmVzc01hcCA9IHNvdXJjZS5yb3VnaG5lc3NNYXA7CisKKyAgICAgICAgdGhp
cy5tZXRhbG5lc3NNYXAgPSBzb3VyY2UubWV0YWxuZXNzTWFwOworCisgICAgICAgIHRoaXMuYWxw
aGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7CisKKyAgICAgICAgdGhpcy5lbnZNYXAgPSBzb3VyY2Uu
ZW52TWFwOworICAgICAgICB0aGlzLmVudk1hcEludGVuc2l0eSA9IHNvdXJjZS5lbnZNYXBJbnRl
bnNpdHk7CisKKyAgICAgICAgdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlv
blJhdGlvOworCisgICAgICAgIHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKKyAg
ICAgICAgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRo
OworICAgICAgICB0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNh
cDsKKyAgICAgICAgdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5l
am9pbjsKKworICAgICAgICB0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nOworICAgICAg
ICB0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CisgICAgICAgIHRoaXMu
bW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFsczsKKworICAgICAgICByZXR1cm4gdGhp
czsKKworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0
cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKyAgICAgKgorICAgICAqIHBhcmFtZXRlcnMgPSB7
CisgICAgICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PgorICAgICAqIH0KKyAgICAgKi8KKworICAg
IGZ1bmN0aW9uIE1lc2hQaHlzaWNhbE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisgICAgICAg
IE1lc2hTdGFuZGFyZE1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLmRlZmlu
ZXMgPSB7ICdQSFlTSUNBTCc6ICcnIH07CisKKyAgICAgICAgdGhpcy50eXBlID0gJ01lc2hQaHlz
aWNhbE1hdGVyaWFsJzsKKworICAgICAgICB0aGlzLnJlZmxlY3Rpdml0eSA9IDAuNTsgLy8gbWFw
cyB0byBGMCA9IDAuMDQKKworICAgICAgICB0aGlzLmNsZWFyQ29hdCA9IDAuMDsKKyAgICAgICAg
dGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgPSAwLjA7CisKKyAgICAgICAgdGhpcy5zZXRWYWx1ZXMo
IHBhcmFtZXRlcnMgKTsKKworICAgIH0KKworICAgIE1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3Rv
dHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSApOwor
ICAgIE1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hQaHlz
aWNhbE1hdGVyaWFsOworCisgICAgTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVz
aFBoeXNpY2FsTWF0ZXJpYWwgPSB0cnVlOworCisgICAgTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJv
dG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworICAgICAgICBNZXNoU3RhbmRh
cmRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworICAgICAg
ICB0aGlzLmRlZmluZXMgPSB7ICdQSFlTSUNBTCc6ICcnIH07CisKKyAgICAgICAgdGhpcy5yZWZs
ZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5OworCisgICAgICAgIHRoaXMuY2xlYXJDb2F0
ID0gc291cmNlLmNsZWFyQ29hdDsKKyAgICAgICAgdGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgPSBz
b3VyY2UuY2xlYXJDb2F0Um91Z2huZXNzOworCisgICAgICAgIHJldHVybiB0aGlzOworCisgICAg
fTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20v
CisgICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAg
ICAgKgorICAgICAqIHBhcmFtZXRlcnMgPSB7CisgICAgICogIGNvbG9yOiA8aGV4PiwKKyAgICAg
KiAgc3BlY3VsYXI6IDxoZXg+LAorICAgICAqICBzaGluaW5lc3M6IDxmbG9hdD4sCisgICAgICog
IG9wYWNpdHk6IDxmbG9hdD4sCisgICAgICoKKyAgICAgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVy
ZSggPEltYWdlPiApLAorICAgICAqCisgICAgICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVy
ZSggPEltYWdlPiApLAorICAgICAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PgorICAgICAq
CisgICAgICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorICAgICAqICBh
b01hcEludGVuc2l0eTogPGZsb2F0PgorICAgICAqCisgICAgICogIGVtaXNzaXZlOiA8aGV4PiwK
KyAgICAgKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD4KKyAgICAgKiAgZW1pc3NpdmVNYXA6
IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisgICAgICoKKyAgICAgKiAgYnVtcE1hcDog
bmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKyAgICAgKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+
LAorICAgICAqCisgICAgICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4g
KSwKKyAgICAgKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPiwKKyAgICAgKgorICAgICAqICBkaXNw
bGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisgICAgICogIGRpc3Bs
YWNlbWVudFNjYWxlOiA8ZmxvYXQ+LAorICAgICAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+
LAorICAgICAqCisgICAgICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdl
PiApLAorICAgICAqCisgICAgICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdl
PiApLAorICAgICAqCisgICAgICogIGVudk1hcDogbmV3IFRIUkVFLlRleHR1cmVDdWJlKCBbcG9z
eCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSwKKyAgICAgKiAgY29tYmluZTogVEhS
RUUuTXVsdGlwbHksCisgICAgICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PiwKKyAgICAgKiAgcmVm
cmFjdGlvblJhdGlvOiA8ZmxvYXQ+LAorICAgICAqCisgICAgICogIHdpcmVmcmFtZTogPGJvb2xl
YW4+LAorICAgICAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sCisgICAgICoKKyAgICAg
KiAgc2tpbm5pbmc6IDxib29sPiwKKyAgICAgKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sCisgICAg
ICogIG1vcnBoTm9ybWFsczogPGJvb2w+CisgICAgICogfQorICAgICAqLworCisgICAgZnVuY3Rp
b24gTWVzaFBob25nTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CisKKyAgICAgICAgTWF0ZXJpYWwu
Y2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdNZXNoUGhvbmdNYXRlcmlhbCc7
CisKKyAgICAgICAgdGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVz
ZQorICAgICAgICB0aGlzLnNwZWN1bGFyID0gbmV3IENvbG9yKCAweDExMTExMSApOworICAgICAg
ICB0aGlzLnNoaW5pbmVzcyA9IDMwOworCisgICAgICAgIHRoaXMubWFwID0gbnVsbDsKKworICAg
ICAgICB0aGlzLmxpZ2h0TWFwID0gbnVsbDsKKyAgICAgICAgdGhpcy5saWdodE1hcEludGVuc2l0
eSA9IDEuMDsKKworICAgICAgICB0aGlzLmFvTWFwID0gbnVsbDsKKyAgICAgICAgdGhpcy5hb01h
cEludGVuc2l0eSA9IDEuMDsKKworICAgICAgICB0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAw
eDAwMDAwMCApOworICAgICAgICB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wOworICAgICAg
ICB0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDsKKworICAgICAgICB0aGlzLmJ1bXBNYXAgPSBudWxs
OworICAgICAgICB0aGlzLmJ1bXBTY2FsZSA9IDE7CisKKyAgICAgICAgdGhpcy5ub3JtYWxNYXAg
PSBudWxsOworICAgICAgICB0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTsK
KworICAgICAgICB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CisgICAgICAgIHRoaXMuZGlz
cGxhY2VtZW50U2NhbGUgPSAxOworICAgICAgICB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwOwor
CisgICAgICAgIHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsOworCisgICAgICAgIHRoaXMuYWxwaGFN
YXAgPSBudWxsOworCisgICAgICAgIHRoaXMuZW52TWFwID0gbnVsbDsKKyAgICAgICAgdGhpcy5j
b21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247CisgICAgICAgIHRoaXMucmVmbGVjdGl2aXR5ID0g
MTsKKyAgICAgICAgdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4OworCisgICAgICAgIHRoaXMu
d2lyZWZyYW1lID0gZmFsc2U7CisgICAgICAgIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTsK
KyAgICAgICAgdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJzsKKyAgICAgICAgdGhpcy53
aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CisKKyAgICAgICAgdGhpcy5za2lubmluZyA9IGZh
bHNlOworICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOworICAgICAgICB0aGlzLm1v
cnBoTm9ybWFscyA9IGZhbHNlOworCisgICAgICAgIHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJz
ICk7CisKKyAgICB9CisKKyAgICBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3Qu
Y3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKKyAgICBNZXNoUGhvbmdNYXRlcmlhbC5wcm90
b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGhvbmdNYXRlcmlhbDsKKworICAgIE1lc2hQaG9uZ01h
dGVyaWFsLnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsID0gdHJ1ZTsKKworICAgIE1lc2hQ
aG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKyAg
ICAgICAgTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CisKKyAg
ICAgICAgdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKKyAgICAgICAgdGhpcy5zcGVj
dWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTsKKyAgICAgICAgdGhpcy5zaGluaW5lc3MgPSBz
b3VyY2Uuc2hpbmluZXNzOworCisgICAgICAgIHRoaXMubWFwID0gc291cmNlLm1hcDsKKworICAg
ICAgICB0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwOworICAgICAgICB0aGlzLmxpZ2h0
TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5OworCisgICAgICAgIHRoaXMu
YW9NYXAgPSBzb3VyY2UuYW9NYXA7CisgICAgICAgIHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3Vy
Y2UuYW9NYXBJbnRlbnNpdHk7CisKKyAgICAgICAgdGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2Uu
ZW1pc3NpdmUgKTsKKyAgICAgICAgdGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1h
cDsKKyAgICAgICAgdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVu
c2l0eTsKKworICAgICAgICB0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDsKKyAgICAgICAg
dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlOworCisgICAgICAgIHRoaXMubm9ybWFs
TWFwID0gc291cmNlLm5vcm1hbE1hcDsKKyAgICAgICAgdGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBz
b3VyY2Uubm9ybWFsU2NhbGUgKTsKKworICAgICAgICB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNv
dXJjZS5kaXNwbGFjZW1lbnRNYXA7CisgICAgICAgIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBz
b3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7CisgICAgICAgIHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9
IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzOworCisgICAgICAgIHRoaXMuc3BlY3VsYXJNYXAgPSBz
b3VyY2Uuc3BlY3VsYXJNYXA7CisKKyAgICAgICAgdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBo
YU1hcDsKKworICAgICAgICB0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7CisgICAgICAgIHRo
aXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lOworICAgICAgICB0aGlzLnJlZmxlY3Rpdml0eSA9
IHNvdXJjZS5yZWZsZWN0aXZpdHk7CisgICAgICAgIHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291
cmNlLnJlZnJhY3Rpb25SYXRpbzsKKworICAgICAgICB0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53
aXJlZnJhbWU7CisgICAgICAgIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVm
cmFtZUxpbmV3aWR0aDsKKyAgICAgICAgdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndp
cmVmcmFtZUxpbmVjYXA7CisgICAgICAgIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uu
d2lyZWZyYW1lTGluZWpvaW47CisKKyAgICAgICAgdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lu
bmluZzsKKyAgICAgICAgdGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzOwor
ICAgICAgICB0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7CisKKyAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICB9OworCisgICAgLyoqCisgICAgICogQGF1dGhvciB0YWth
aGlyb3ggLyBodHRwOi8vZ2l0aHViLmNvbS90YWthaGlyb3gKKyAgICAgKgorICAgICAqIHBhcmFt
ZXRlcnMgPSB7CisgICAgICogIGdyYWRpZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdl
PiApCisgICAgICogfQorICAgICAqLworCisgICAgZnVuY3Rpb24gTWVzaFRvb25NYXRlcmlhbCgg
cGFyYW1ldGVycyApIHsKKworICAgICAgICBNZXNoUGhvbmdNYXRlcmlhbC5jYWxsKCB0aGlzICk7
CisKKyAgICAgICAgdGhpcy5kZWZpbmVzID0geyAnVE9PTic6ICcnIH07CisKKyAgICAgICAgdGhp
cy50eXBlID0gJ01lc2hUb29uTWF0ZXJpYWwnOworCisgICAgICAgIHRoaXMuZ3JhZGllbnRNYXAg
PSBudWxsOworCisgICAgICAgIHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CisKKyAgICB9
CisKKyAgICBNZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2hQ
aG9uZ01hdGVyaWFsLnByb3RvdHlwZSApOworICAgIE1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBl
LmNvbnN0cnVjdG9yID0gTWVzaFRvb25NYXRlcmlhbDsKKworICAgIE1lc2hUb29uTWF0ZXJpYWwu
cHJvdG90eXBlLmlzTWVzaFRvb25NYXRlcmlhbCA9IHRydWU7CisKKyAgICBNZXNoVG9vbk1hdGVy
aWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKyAgICAgICAgTWVz
aFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CisKKyAg
ICAgICAgdGhpcy5ncmFkaWVudE1hcCA9IHNvdXJjZS5ncmFkaWVudE1hcDsKKworICAgICAgICBy
ZXR1cm4gdGhpczsKKworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAv
IGh0dHA6Ly9tcmRvb2IuY29tLworICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8v
Z2l0aHViLmNvbS9XZXN0TGFuZ2xleQorICAgICAqCisgICAgICogcGFyYW1ldGVycyA9IHsKKyAg
ICAgKiAgb3BhY2l0eTogPGZsb2F0PiwKKyAgICAgKgorICAgICAqICBidW1wTWFwOiBuZXcgVEhS
RUUuVGV4dHVyZSggPEltYWdlPiApLAorICAgICAqICBidW1wU2NhbGU6IDxmbG9hdD4sCisgICAg
ICoKKyAgICAgKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAorICAg
ICAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LAorICAgICAqCisgICAgICogIGRpc3BsYWNlbWVu
dE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKyAgICAgKiAgZGlzcGxhY2VtZW50
U2NhbGU6IDxmbG9hdD4sCisgICAgICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sCisgICAg
ICoKKyAgICAgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCisgICAgICogIHdpcmVmcmFtZUxpbmV3
aWR0aDogPGZsb2F0PgorICAgICAqCisgICAgICogIHNraW5uaW5nOiA8Ym9vbD4sCisgICAgICog
IG1vcnBoVGFyZ2V0czogPGJvb2w+LAorICAgICAqICBtb3JwaE5vcm1hbHM6IDxib29sPgorICAg
ICAqIH0KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIE1lc2hOb3JtYWxNYXRlcmlhbCggcGFyYW1l
dGVycyApIHsKKworICAgICAgICBNYXRlcmlhbC5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhp
cy50eXBlID0gJ01lc2hOb3JtYWxNYXRlcmlhbCc7CisKKyAgICAgICAgdGhpcy5idW1wTWFwID0g
bnVsbDsKKyAgICAgICAgdGhpcy5idW1wU2NhbGUgPSAxOworCisgICAgICAgIHRoaXMubm9ybWFs
TWFwID0gbnVsbDsKKyAgICAgICAgdGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAx
ICk7CisKKyAgICAgICAgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsOworICAgICAgICB0aGlz
LmRpc3BsYWNlbWVudFNjYWxlID0gMTsKKyAgICAgICAgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0g
MDsKKworICAgICAgICB0aGlzLndpcmVmcmFtZSA9IGZhbHNlOworICAgICAgICB0aGlzLndpcmVm
cmFtZUxpbmV3aWR0aCA9IDE7CisKKyAgICAgICAgdGhpcy5mb2cgPSBmYWxzZTsKKyAgICAgICAg
dGhpcy5saWdodHMgPSBmYWxzZTsKKworICAgICAgICB0aGlzLnNraW5uaW5nID0gZmFsc2U7Cisg
ICAgICAgIHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7CisgICAgICAgIHRoaXMubW9ycGhOb3Jt
YWxzID0gZmFsc2U7CisKKyAgICAgICAgdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKKwor
ICAgIH0KKworICAgIE1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRl
KCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKKyAgICBNZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBl
LmNvbnN0cnVjdG9yID0gTWVzaE5vcm1hbE1hdGVyaWFsOworCisgICAgTWVzaE5vcm1hbE1hdGVy
aWFsLnByb3RvdHlwZS5pc01lc2hOb3JtYWxNYXRlcmlhbCA9IHRydWU7CisKKyAgICBNZXNoTm9y
bWFsTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKKworICAg
ICAgICBNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworICAg
ICAgICB0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDsKKyAgICAgICAgdGhpcy5idW1wU2Nh
bGUgPSBzb3VyY2UuYnVtcFNjYWxlOworCisgICAgICAgIHRoaXMubm9ybWFsTWFwID0gc291cmNl
Lm5vcm1hbE1hcDsKKyAgICAgICAgdGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFs
U2NhbGUgKTsKKworICAgICAgICB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFj
ZW1lbnRNYXA7CisgICAgICAgIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxh
Y2VtZW50U2NhbGU7CisgICAgICAgIHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNw
bGFjZW1lbnRCaWFzOworCisgICAgICAgIHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFt
ZTsKKyAgICAgICAgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGlu
ZXdpZHRoOworCisgICAgICAgIHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7CisgICAg
ICAgIHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0czsKKyAgICAgICAgdGhp
cy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzOworCisgICAgICAgIHJldHVybiB0
aGlzOworCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDov
L21yZG9vYi5jb20vCisgICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVh
bGlhLmNvbS8KKyAgICAgKgorICAgICAqIHBhcmFtZXRlcnMgPSB7CisgICAgICogIGNvbG9yOiA8
aGV4PiwKKyAgICAgKiAgb3BhY2l0eTogPGZsb2F0PiwKKyAgICAgKgorICAgICAqICBtYXA6IG5l
dyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisgICAgICoKKyAgICAgKiAgbGlnaHRNYXA6IG5l
dyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCisgICAgICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8
ZmxvYXQ+CisgICAgICoKKyAgICAgKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+
ICksCisgICAgICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CisgICAgICoKKyAgICAgKiAgZW1p
c3NpdmU6IDxoZXg+LAorICAgICAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PgorICAgICAq
ICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKyAgICAgKgorICAg
ICAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKyAgICAgKgor
ICAgICAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKKyAgICAgKgor
ICAgICAqICBlbnZNYXA6IG5ldyBUSFJFRS5UZXh0dXJlQ3ViZSggW3Bvc3gsIG5lZ3gsIHBvc3ks
IG5lZ3ksIHBvc3osIG5lZ3pdICksCisgICAgICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LAor
ICAgICAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sCisgICAgICogIHJlZnJhY3Rpb25SYXRpbzog
PGZsb2F0PiwKKyAgICAgKgorICAgICAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKKyAgICAgKiAg
d2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LAorICAgICAqCisgICAgICogIHNraW5uaW5nOiA8
Ym9vbD4sCisgICAgICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LAorICAgICAqICBtb3JwaE5vcm1h
bHM6IDxib29sPgorICAgICAqIH0KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIE1lc2hMYW1iZXJ0
TWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CisKKyAgICAgICAgTWF0ZXJpYWwuY2FsbCggdGhpcyAp
OworCisgICAgICAgIHRoaXMudHlwZSA9ICdNZXNoTGFtYmVydE1hdGVyaWFsJzsKKworICAgICAg
ICB0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlCisKKyAgICAg
ICAgdGhpcy5tYXAgPSBudWxsOworCisgICAgICAgIHRoaXMubGlnaHRNYXAgPSBudWxsOworICAg
ICAgICB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wOworCisgICAgICAgIHRoaXMuYW9NYXAg
PSBudWxsOworICAgICAgICB0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wOworCisgICAgICAgIHRo
aXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7CisgICAgICAgIHRoaXMuZW1pc3Np
dmVJbnRlbnNpdHkgPSAxLjA7CisgICAgICAgIHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsOworCisg
ICAgICAgIHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsOworCisgICAgICAgIHRoaXMuYWxwaGFNYXAg
PSBudWxsOworCisgICAgICAgIHRoaXMuZW52TWFwID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb21i
aW5lID0gTXVsdGlwbHlPcGVyYXRpb247CisgICAgICAgIHRoaXMucmVmbGVjdGl2aXR5ID0gMTsK
KyAgICAgICAgdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4OworCisgICAgICAgIHRoaXMud2ly
ZWZyYW1lID0gZmFsc2U7CisgICAgICAgIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTsKKyAg
ICAgICAgdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJzsKKyAgICAgICAgdGhpcy53aXJl
ZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CisKKyAgICAgICAgdGhpcy5za2lubmluZyA9IGZhbHNl
OworICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOworICAgICAgICB0aGlzLm1vcnBo
Tm9ybWFscyA9IGZhbHNlOworCisgICAgICAgIHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7
CisKKyAgICB9CisKKyAgICBNZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5j
cmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOworICAgIE1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJv
dG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaExhbWJlcnRNYXRlcmlhbDsKKworICAgIE1lc2hMYW1i
ZXJ0TWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbCA9IHRydWU7CisKKyAg
ICBNZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2Ug
KSB7CisKKyAgICAgICAgTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNl
ICk7CisKKyAgICAgICAgdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKKworICAgICAg
ICB0aGlzLm1hcCA9IHNvdXJjZS5tYXA7CisKKyAgICAgICAgdGhpcy5saWdodE1hcCA9IHNvdXJj
ZS5saWdodE1hcDsKKyAgICAgICAgdGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdo
dE1hcEludGVuc2l0eTsKKworICAgICAgICB0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwOworICAg
ICAgICB0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5OworCisgICAg
ICAgIHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7CisgICAgICAgIHRoaXMu
ZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7CisgICAgICAgIHRoaXMuZW1pc3NpdmVJ
bnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7CisKKyAgICAgICAgdGhpcy5zcGVj
dWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKKworICAgICAgICB0aGlzLmFscGhhTWFwID0g
c291cmNlLmFscGhhTWFwOworCisgICAgICAgIHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDsK
KyAgICAgICAgdGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7CisgICAgICAgIHRoaXMucmVm
bGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTsKKyAgICAgICAgdGhpcy5yZWZyYWN0aW9u
UmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvOworCisgICAgICAgIHRoaXMud2lyZWZyYW1l
ID0gc291cmNlLndpcmVmcmFtZTsKKyAgICAgICAgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBz
b3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoOworICAgICAgICB0aGlzLndpcmVmcmFtZUxpbmVjYXAg
PSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDsKKyAgICAgICAgdGhpcy53aXJlZnJhbWVMaW5lam9p
biA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKKworICAgICAgICB0aGlzLnNraW5uaW5nID0g
c291cmNlLnNraW5uaW5nOworICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3Jw
aFRhcmdldHM7CisgICAgICAgIHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFs
czsKKworICAgICAgICByZXR1cm4gdGhpczsKKworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBA
YXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworICAgICAqCisgICAg
ICogcGFyYW1ldGVycyA9IHsKKyAgICAgKiAgY29sb3I6IDxoZXg+LAorICAgICAqICBvcGFjaXR5
OiA8ZmxvYXQ+LAorICAgICAqCisgICAgICogIGxpbmV3aWR0aDogPGZsb2F0PiwKKyAgICAgKgor
ICAgICAqICBzY2FsZTogPGZsb2F0PiwKKyAgICAgKiAgZGFzaFNpemU6IDxmbG9hdD4sCisgICAg
ICogIGdhcFNpemU6IDxmbG9hdD4KKyAgICAgKiB9CisgICAgICovCisKKyAgICBmdW5jdGlvbiBM
aW5lRGFzaGVkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CisKKyAgICAgICAgTWF0ZXJpYWwuY2Fs
bCggdGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdMaW5lRGFzaGVkTWF0ZXJpYWwnOwor
CisgICAgICAgIHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7CisKKyAgICAgICAg
dGhpcy5saW5ld2lkdGggPSAxOworCisgICAgICAgIHRoaXMuc2NhbGUgPSAxOworICAgICAgICB0
aGlzLmRhc2hTaXplID0gMzsKKyAgICAgICAgdGhpcy5nYXBTaXplID0gMTsKKworICAgICAgICB0
aGlzLmxpZ2h0cyA9IGZhbHNlOworCisgICAgICAgIHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJz
ICk7CisKKyAgICB9CisKKyAgICBMaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0
LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CisgICAgTGluZURhc2hlZE1hdGVyaWFsLnBy
b3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVEYXNoZWRNYXRlcmlhbDsKKworICAgIExpbmVEYXNo
ZWRNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgPSB0cnVlOworCisgICAg
TGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7
CisKKyAgICAgICAgTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7
CisKKyAgICAgICAgdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKKworICAgICAgICB0
aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7CisKKyAgICAgICAgdGhpcy5zY2FsZSA9
IHNvdXJjZS5zY2FsZTsKKyAgICAgICAgdGhpcy5kYXNoU2l6ZSA9IHNvdXJjZS5kYXNoU2l6ZTsK
KyAgICAgICAgdGhpcy5nYXBTaXplID0gc291cmNlLmdhcFNpemU7CisKKyAgICAgICAgcmV0dXJu
IHRoaXM7CisKKyAgICB9OworCisKKworICAgIHZhciBNYXRlcmlhbHMgPSBPYmplY3QuZnJlZXpl
KHsKKyAgICAgICAgU2hhZG93TWF0ZXJpYWw6IFNoYWRvd01hdGVyaWFsLAorICAgICAgICBTcHJp
dGVNYXRlcmlhbDogU3ByaXRlTWF0ZXJpYWwsCisgICAgICAgIFJhd1NoYWRlck1hdGVyaWFsOiBS
YXdTaGFkZXJNYXRlcmlhbCwKKyAgICAgICAgU2hhZGVyTWF0ZXJpYWw6IFNoYWRlck1hdGVyaWFs
LAorICAgICAgICBQb2ludHNNYXRlcmlhbDogUG9pbnRzTWF0ZXJpYWwsCisgICAgICAgIE1lc2hQ
aHlzaWNhbE1hdGVyaWFsOiBNZXNoUGh5c2ljYWxNYXRlcmlhbCwKKyAgICAgICAgTWVzaFN0YW5k
YXJkTWF0ZXJpYWw6IE1lc2hTdGFuZGFyZE1hdGVyaWFsLAorICAgICAgICBNZXNoUGhvbmdNYXRl
cmlhbDogTWVzaFBob25nTWF0ZXJpYWwsCisgICAgICAgIE1lc2hUb29uTWF0ZXJpYWw6IE1lc2hU
b29uTWF0ZXJpYWwsCisgICAgICAgIE1lc2hOb3JtYWxNYXRlcmlhbDogTWVzaE5vcm1hbE1hdGVy
aWFsLAorICAgICAgICBNZXNoTGFtYmVydE1hdGVyaWFsOiBNZXNoTGFtYmVydE1hdGVyaWFsLAor
ICAgICAgICBNZXNoRGVwdGhNYXRlcmlhbDogTWVzaERlcHRoTWF0ZXJpYWwsCisgICAgICAgIE1l
c2hCYXNpY01hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCwKKyAgICAgICAgTGluZURhc2hlZE1h
dGVyaWFsOiBMaW5lRGFzaGVkTWF0ZXJpYWwsCisgICAgICAgIExpbmVCYXNpY01hdGVyaWFsOiBM
aW5lQmFzaWNNYXRlcmlhbCwKKyAgICAgICAgTWF0ZXJpYWw6IE1hdGVyaWFsCisgICAgfSk7CisK
KyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworICAg
ICAqLworCisgICAgdmFyIENhY2hlID0geworCisgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorCisg
ICAgICAgIGZpbGVzOiB7fSwKKworICAgICAgICBhZGQ6IGZ1bmN0aW9uICgga2V5LCBmaWxlICkg
eworCisgICAgICAgICAgICBpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47CisK
KyAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQ2FjaGUnLCAnQWRkaW5nIGtleTon
LCBrZXkgKTsKKworICAgICAgICAgICAgdGhpcy5maWxlc1sga2V5IF0gPSBmaWxlOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgZ2V0OiBmdW5jdGlvbiAoIGtleSApIHsKKworICAgICAgICAgICAg
aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuOworCisgICAgICAgICAgICAvLyBj
b25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0NoZWNraW5nIGtleTonLCBrZXkgKTsKKworICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZXNbIGtleSBdOworCisgICAgICAgIH0sCisKKyAgICAg
ICAgcmVtb3ZlOiBmdW5jdGlvbiAoIGtleSApIHsKKworICAgICAgICAgICAgZGVsZXRlIHRoaXMu
ZmlsZXNbIGtleSBdOworCisgICAgICAgIH0sCisKKyAgICAgICAgY2xlYXI6IGZ1bmN0aW9uICgp
IHsKKworICAgICAgICAgICAgdGhpcy5maWxlcyA9IHt9OworCisgICAgICAgIH0KKworICAgIH07
CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwor
ICAgICAqLworCisgICAgZnVuY3Rpb24gTG9hZGluZ01hbmFnZXIoIG9uTG9hZCwgb25Qcm9ncmVz
cywgb25FcnJvciApIHsKKworICAgICAgICB2YXIgc2NvcGUgPSB0aGlzOworCisgICAgICAgIHZh
ciBpc0xvYWRpbmcgPSBmYWxzZSwgaXRlbXNMb2FkZWQgPSAwLCBpdGVtc1RvdGFsID0gMDsKKwor
ICAgICAgICB0aGlzLm9uU3RhcnQgPSB1bmRlZmluZWQ7CisgICAgICAgIHRoaXMub25Mb2FkID0g
b25Mb2FkOworICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzOworICAgICAgICB0
aGlzLm9uRXJyb3IgPSBvbkVycm9yOworCisgICAgICAgIHRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rp
b24gKCB1cmwgKSB7CisKKyAgICAgICAgICAgIGl0ZW1zVG90YWwgKys7CisKKyAgICAgICAgICAg
IGlmICggaXNMb2FkaW5nID09PSBmYWxzZSApIHsKKworICAgICAgICAgICAgICAgIGlmICggc2Nv
cGUub25TdGFydCAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIHNjb3Bl
Lm9uU3RhcnQoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTsKKworICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpc0xvYWRpbmcgPSB0cnVlOwor
CisgICAgICAgIH07CisKKyAgICAgICAgdGhpcy5pdGVtRW5kID0gZnVuY3Rpb24gKCB1cmwgKSB7
CisKKyAgICAgICAgICAgIGl0ZW1zTG9hZGVkICsrOworCisgICAgICAgICAgICBpZiAoIHNjb3Bl
Lm9uUHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIHNjb3BlLm9u
UHJvZ3Jlc3MoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTsKKworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBpZiAoIGl0ZW1zTG9hZGVkID09PSBpdGVtc1RvdGFsICkgeworCisg
ICAgICAgICAgICAgICAgaXNMb2FkaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAo
IHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIHNj
b3BlLm9uTG9hZCgpOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAg
ICAgICAgfTsKKworICAgICAgICB0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICggdXJsICkgewor
CisgICAgICAgICAgICBpZiAoIHNjb3BlLm9uRXJyb3IgIT09IHVuZGVmaW5lZCApIHsKKworICAg
ICAgICAgICAgICAgIHNjb3BlLm9uRXJyb3IoIHVybCApOworCisgICAgICAgICAgICB9CisKKyAg
ICAgICAgfTsKKworICAgIH0KKworICAgIHZhciBEZWZhdWx0TG9hZGluZ01hbmFnZXIgPSBuZXcg
TG9hZGluZ01hbmFnZXIoKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0
cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBGaWxlTG9hZGVyKCBtYW5h
Z2VyICkgeworCisgICAgICAgIHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVk
ICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyOworCisgICAgfQorCisgICAgT2Jq
ZWN0LmFzc2lnbiggRmlsZUxvYWRlci5wcm90b3R5cGUsIHsKKworICAgICAgICBsb2FkOiBmdW5j
dGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgeworCisgICAgICAgICAg
ICBpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7CisKKyAgICAgICAgICAgIGlmICgg
dGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7CisKKyAgICAg
ICAgICAgIHZhciBzY29wZSA9IHRoaXM7CisKKyAgICAgICAgICAgIHZhciBjYWNoZWQgPSBDYWNo
ZS5nZXQoIHVybCApOworCisgICAgICAgICAgICBpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkg
eworCisgICAgICAgICAgICAgICAgc2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApOworCisg
ICAgICAgICAgICAgICAgc2V0VGltZW91dCggZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAg
ICAgICAgIGlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTsKKworICAgICAgICAgICAgICAg
ICAgICBzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOworCisgICAgICAgICAgICAgICAgfSwg
MCApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAvLyBDaGVjayBmb3IgZGF0YTogVVJJCisgICAgICAgICAgICB2YXIgZGF0
YVVyaVJlZ2V4ID0gL15kYXRhOiguKj8pKDtiYXNlNjQpPywoLiopJC87CisgICAgICAgICAgICB2
YXIgZGF0YVVyaVJlZ2V4UmVzdWx0ID0gdXJsLm1hdGNoKCBkYXRhVXJpUmVnZXggKTsKKworICAg
ICAgICAgICAgLy8gU2FmYXJpIGNhbiBub3QgaGFuZGxlIERhdGEgVVJJcyB0aHJvdWdoIFhNTEh0
dHBSZXF1ZXN0IHNvIHByb2Nlc3MgbWFudWFsbHkKKyAgICAgICAgICAgIGlmICggZGF0YVVyaVJl
Z2V4UmVzdWx0ICkgeworCisgICAgICAgICAgICAgICAgdmFyIG1pbWVUeXBlID0gZGF0YVVyaVJl
Z2V4UmVzdWx0WyAxIF07CisgICAgICAgICAgICAgICAgdmFyIGlzQmFzZTY0ID0gISEgZGF0YVVy
aVJlZ2V4UmVzdWx0WyAyIF07CisgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBkYXRhVXJpUmVn
ZXhSZXN1bHRbIDMgXTsKKworICAgICAgICAgICAgICAgIGRhdGEgPSB3aW5kb3cuZGVjb2RlVVJJ
Q29tcG9uZW50KCBkYXRhICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGlzQmFzZTY0ICkgZGF0
YSA9IHdpbmRvdy5hdG9iKCBkYXRhICk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworCisgICAg
ICAgICAgICAgICAgICAgIHZhciByZXNwb25zZTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJl
c3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpOwor
CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIHJlc3BvbnNlVHlwZSApIHsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgY2FzZSAnYXJyYXlidWZmZXInOgorICAgICAgICAgICAgICAgICAg
ICAgICAgY2FzZSAnYmxvYic6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25z
ZSA9IG5ldyBBcnJheUJ1ZmZlciggZGF0YS5sZW5ndGggKTsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoIHJlc3BvbnNlICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsg
aSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3WyBpIF0gPSBk
YXRhLmNoYXJDb2RlQXQoIGkgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVzcG9uc2VUeXBlID09PSAnYmxvYicg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBuZXcgQmxv
YiggWyByZXNwb25zZSBdLCB7IHR5cGU6IG1pbWVUeXBlIH0gKTsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyggZGF0YSwg
bWltZVR5cGUgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAg
ICAgICAgICAgICAgICAgICAgICBjYXNlICdqc29uJzoKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZSggZGF0YSApOworCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8v
ICd0ZXh0JyBvciBvdGhlcgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Ug
PSBkYXRhOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIG5leHQgYnJv
d3NlciB0aWNrCisgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlv
biAoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggb25Mb2FkICkgb25Mb2FkKCBy
ZXNwb25zZSApOworCisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1F
bmQoIHVybCApOworCisgICAgICAgICAgICAgICAgICAgIH0sIDAgKTsKKworICAgICAgICAgICAg
ICAgIH0gY2F0Y2ggKCBlcnJvciApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IGZv
ciBuZXh0IGJyb3dzZXIgdGljaworICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91
dCggZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG9uRXJyb3Ig
KSBvbkVycm9yKCBlcnJvciApOworCisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5tYW5h
Z2VyLml0ZW1FbmQoIHVybCApOworICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubWFuYWdl
ci5pdGVtRXJyb3IoIHVybCApOworCisgICAgICAgICAgICAgICAgICAgIH0sIDAgKTsKKworICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAg
IHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgcmVx
dWVzdC5vcGVuKCAnR0VUJywgdXJsLCB0cnVlICk7CisKKyAgICAgICAgICAgICAgICByZXF1ZXN0
LmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgZnVuY3Rpb24gKCBldmVudCApIHsKKworICAgICAg
ICAgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBldmVudC50YXJnZXQucmVzcG9uc2U7CisKKyAg
ICAgICAgICAgICAgICAgICAgQ2FjaGUuYWRkKCB1cmwsIHJlc3BvbnNlICk7CisKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCB0aGlzLnN0YXR1cyA9PT0gMjAwICkgeworCisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIG9uTG9hZCApIG9uTG9hZCggcmVzcG9uc2UgKTsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKKworICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UgaWYgKCB0aGlzLnN0YXR1cyA9PT0gMCApIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gU29tZSBicm93c2VycyByZXR1cm4gSFRUUCBTdGF0dXMgMCB3aGVu
IHVzaW5nIG5vbi1odHRwIHByb3RvY29sCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcu
ICdmaWxlOi8vJyBvciAnZGF0YTovLycuIEhhbmRsZSBhcyBzdWNjZXNzLgorCisgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1
cyAwIHJlY2VpdmVkLicgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBvbkxvYWQg
KSBvbkxvYWQoIHJlc3BvbnNlICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm1h
bmFnZXIuaXRlbUVuZCggdXJsICk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBvbkVycm9yICkgb25FcnJvciggZXZlbnQgKTsK
KworICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTsK
KworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9LCBmYWxzZSApOwor
CisgICAgICAgICAgICAgICAgaWYgKCBvblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3MnLCBm
dW5jdGlvbiAoIGV2ZW50ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBvblByb2dyZXNz
KCBldmVudCApOworCisgICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlICk7CisKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdl
cnJvcicsIGZ1bmN0aW9uICggZXZlbnQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBv
bkVycm9yICkgb25FcnJvciggZXZlbnQgKTsKKworICAgICAgICAgICAgICAgICAgICBzY29wZS5t
YW5hZ2VyLml0ZW1FbmQoIHVybCApOworICAgICAgICAgICAgICAgICAgICBzY29wZS5tYW5hZ2Vy
Lml0ZW1FcnJvciggdXJsICk7CisKKyAgICAgICAgICAgICAgICB9LCBmYWxzZSApOworCisgICAg
ICAgICAgICAgICAgaWYgKCB0aGlzLnJlc3BvbnNlVHlwZSAhPT0gdW5kZWZpbmVkICkgcmVxdWVz
dC5yZXNwb25zZVR5cGUgPSB0aGlzLnJlc3BvbnNlVHlwZTsKKyAgICAgICAgICAgICAgICBpZiAo
IHRoaXMud2l0aENyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LndpdGhDcmVkZW50
aWFscyA9IHRoaXMud2l0aENyZWRlbnRpYWxzOworCisgICAgICAgICAgICAgICAgaWYgKCByZXF1
ZXN0Lm92ZXJyaWRlTWltZVR5cGUgKSByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUoIHRoaXMubWlt
ZVR5cGUgIT09IHVuZGVmaW5lZCA/IHRoaXMubWltZVR5cGUgOiAndGV4dC9wbGFpbicgKTsKKwor
ICAgICAgICAgICAgICAgIGZvciAoIHZhciBoZWFkZXIgaW4gdGhpcy5yZXF1ZXN0SGVhZGVyICkg
eworCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlciggaGVhZGVy
LCB0aGlzLnJlcXVlc3RIZWFkZXJbIGhlYWRlciBdICk7CisKKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICByZXF1ZXN0LnNlbmQoIG51bGwgKTsKKworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7CisKKyAgICAgICAg
ICAgIHJldHVybiByZXF1ZXN0OworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0UGF0aDogZnVu
Y3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgdGhpcy5wYXRoID0gdmFsdWU7CisgICAg
ICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNldFJlc3BvbnNl
VHlwZTogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgdGhpcy5yZXNwb25zZVR5
cGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgc2V0V2l0aENyZWRlbnRpYWxzOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAg
ICAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIHRo
aXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRNaW1lVHlwZTogZnVuY3Rpb24gKCB2YWx1
ZSApIHsKKworICAgICAgICAgICAgdGhpcy5taW1lVHlwZSA9IHZhbHVlOworICAgICAgICAgICAg
cmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRSZXF1ZXN0SGVhZGVyOiBm
dW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAgICB0aGlzLnJlcXVlc3RIZWFkZXIgPSB2
YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0KKworICAgIH0gKTsK
KworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisg
ICAgICoKKyAgICAgKiBBYnN0cmFjdCBCYXNlIGNsYXNzIHRvIGJsb2NrIGJhc2VkIHRleHR1cmVz
IGxvYWRlciAoZGRzLCBwdnIsIC4uLikKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIENvbXByZXNz
ZWRUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkgeworCisgICAgICAgIHRoaXMubWFuYWdlciA9ICgg
bWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2Vy
OworCisgICAgICAgIC8vIG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzCisgICAgICAgIHRoaXMuX3Bh
cnNlciA9IG51bGw7CisKKyAgICB9CisKKyAgICBPYmplY3QuYXNzaWduKCBDb21wcmVzc2VkVGV4
dHVyZUxvYWRlci5wcm90b3R5cGUsIHsKKworICAgICAgICBsb2FkOiBmdW5jdGlvbiAoIHVybCwg
b25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgeworCisgICAgICAgICAgICB2YXIgc2NvcGUg
PSB0aGlzOworCisgICAgICAgICAgICB2YXIgaW1hZ2VzID0gW107CisKKyAgICAgICAgICAgIHZh
ciB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7CisgICAgICAgICAgICB0ZXh0dXJl
LmltYWdlID0gaW1hZ2VzOworCisgICAgICAgICAgICB2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2Fk
ZXIoIHRoaXMubWFuYWdlciApOworICAgICAgICAgICAgbG9hZGVyLnNldFBhdGgoIHRoaXMucGF0
aCApOworICAgICAgICAgICAgbG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyAp
OworCisgICAgICAgICAgICBmdW5jdGlvbiBsb2FkVGV4dHVyZSggaSApIHsKKworICAgICAgICAg
ICAgICAgIGxvYWRlci5sb2FkKCB1cmxbIGkgXSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgdmFyIHRleERhdGFzID0gc2NvcGUuX3BhcnNlciggYnVmZmVyLCB0
cnVlICk7CisKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VzWyBpIF0gPSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICB3aWR0aDogdGV4RGF0YXMud2lkdGgsCisgICAgICAgICAgICAgICAgICAg
ICAgICBoZWlnaHQ6IHRleERhdGFzLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZv
cm1hdDogdGV4RGF0YXMuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgbWlwbWFwczog
dGV4RGF0YXMubWlwbWFwcworICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAg
ICAgICAgIGxvYWRlZCArPSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmICggbG9hZGVkID09
PSA2ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRleERhdGFzLm1pcG1hcENv
dW50ID09PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLm1pbkZpbHRl
ciA9IExpbmVhckZpbHRlcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5mb3Jt
YXQgPSB0ZXhEYXRhcy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLm5l
ZWRzVXBkYXRlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBvbkxvYWQg
KSBvbkxvYWQoIHRleHR1cmUgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICB9LCBvblByb2dyZXNzLCBvbkVycm9yICk7CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHsKKworICAgICAgICAgICAgICAg
IHZhciBsb2FkZWQgPSAwOworCisgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBpbCA9
IHVybC5sZW5ndGg7IGkgPCBpbDsgKysgaSApIHsKKworICAgICAgICAgICAgICAgICAgICBsb2Fk
VGV4dHVyZSggaSApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2Ug
eworCisgICAgICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVk
IGluIGEgc2luZ2xlIEREUyBmaWxlCisKKyAgICAgICAgICAgICAgICBsb2FkZXIubG9hZCggdXJs
LCBmdW5jdGlvbiAoIGJ1ZmZlciApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdGV4RGF0
YXMgPSBzY29wZS5fcGFyc2VyKCBidWZmZXIsIHRydWUgKTsKKworICAgICAgICAgICAgICAgICAg
ICBpZiAoIHRleERhdGFzLmlzQ3ViZW1hcCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
dmFyIGZhY2VzID0gdGV4RGF0YXMubWlwbWFwcy5sZW5ndGggLyB0ZXhEYXRhcy5taXBtYXBDb3Vu
dDsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGYgPSAwOyBmIDwgZmFjZXM7
IGYgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXNbIGYgXSA9IHsg
bWlwbWFwcyA6IFtdIH07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIg
aSA9IDA7IGkgPCB0ZXhEYXRhcy5taXBtYXBDb3VudDsgaSArKyApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpbWFnZXNbIGYgXS5taXBtYXBzLnB1c2goIHRleERhdGFzLm1p
cG1hcHNbIGYgKiB0ZXhEYXRhcy5taXBtYXBDb3VudCArIGkgXSApOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpbWFnZXNbIGYgXS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlc1sgZiBdLndpZHRoID0gdGV4RGF0
YXMud2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlc1sgZiBdLmhl
aWdodCA9IHRleERhdGFzLmhlaWdodDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0gZWxz
ZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuaW1hZ2Uud2lkdGggPSB0ZXhE
YXRhcy53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuaW1hZ2UuaGVpZ2h0
ID0gdGV4RGF0YXMuaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5taXBt
YXBzID0gdGV4RGF0YXMubWlwbWFwczsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCB0ZXhEYXRhcy5taXBtYXBDb3VudCA9PT0gMSApIHsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CisK
KyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuZm9y
bWF0ID0gdGV4RGF0YXMuZm9ybWF0OworICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLm5lZWRz
VXBkYXRlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIG9uTG9hZCApIG9uTG9h
ZCggdGV4dHVyZSApOworCisgICAgICAgICAgICAgICAgfSwgb25Qcm9ncmVzcywgb25FcnJvciAp
OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgc2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAg
ICAgICAgdGhpcy5wYXRoID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAg
ICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIE5pa29zIE0uIC8g
aHR0cHM6Ly9naXRodWIuY29tL2ZvbzEyMy8KKyAgICAgKgorICAgICAqIEFic3RyYWN0IEJhc2Ug
Y2xhc3MgdG8gbG9hZCBnZW5lcmljIGJpbmFyeSB0ZXh0dXJlcyBmb3JtYXRzIChyZ2JlLCBoZHIs
IC4uLikKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2Vy
ICkgeworCisgICAgICAgIHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkg
PyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyOworCisgICAgICAgIC8vIG92ZXJyaWRl
IGluIHN1YiBjbGFzc2VzCisgICAgICAgIHRoaXMuX3BhcnNlciA9IG51bGw7CisKKyAgICB9CisK
KyAgICBPYmplY3QuYXNzaWduKCBEYXRhVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHsKKworICAg
ICAgICBsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkg
eworCisgICAgICAgICAgICB2YXIgc2NvcGUgPSB0aGlzOworCisgICAgICAgICAgICB2YXIgdGV4
dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSgpOworCisgICAgICAgICAgICB2YXIgbG9hZGVyID0gbmV3
IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApOworICAgICAgICAgICAgbG9hZGVyLnNldFJlc3Bv
bnNlVHlwZSggJ2FycmF5YnVmZmVyJyApOworCisgICAgICAgICAgICBsb2FkZXIubG9hZCggdXJs
LCBmdW5jdGlvbiAoIGJ1ZmZlciApIHsKKworICAgICAgICAgICAgICAgIHZhciB0ZXhEYXRhID0g
c2NvcGUuX3BhcnNlciggYnVmZmVyICk7CisKKyAgICAgICAgICAgICAgICBpZiAoICEgdGV4RGF0
YSApIHJldHVybjsKKworICAgICAgICAgICAgICAgIGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRh
LmltYWdlICkgeworCisgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuaW1hZ2UgPSB0ZXhEYXRh
LmltYWdlOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdW5kZWZpbmVkICE9PSB0ZXhE
YXRhLmRhdGEgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5pbWFnZS53aWR0aCA9
IHRleERhdGEud2lkdGg7CisgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuaW1hZ2UuaGVpZ2h0
ID0gdGV4RGF0YS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuaW1hZ2UuZGF0
YSA9IHRleERhdGEuZGF0YTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IHRleHR1cmUud3JhcFMgPSB1bmRlZmluZWQgIT09IHRleERhdGEud3JhcFMgPyB0ZXhEYXRhLndy
YXBTIDogQ2xhbXBUb0VkZ2VXcmFwcGluZzsKKyAgICAgICAgICAgICAgICB0ZXh0dXJlLndyYXBU
ID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBUID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9F
ZGdlV3JhcHBpbmc7CisKKyAgICAgICAgICAgICAgICB0ZXh0dXJlLm1hZ0ZpbHRlciA9IHVuZGVm
aW5lZCAhPT0gdGV4RGF0YS5tYWdGaWx0ZXIgPyB0ZXhEYXRhLm1hZ0ZpbHRlciA6IExpbmVhckZp
bHRlcjsKKyAgICAgICAgICAgICAgICB0ZXh0dXJlLm1pbkZpbHRlciA9IHVuZGVmaW5lZCAhPT0g
dGV4RGF0YS5taW5GaWx0ZXIgPyB0ZXhEYXRhLm1pbkZpbHRlciA6IExpbmVhck1pcE1hcExpbmVh
ckZpbHRlcjsKKworICAgICAgICAgICAgICAgIHRleHR1cmUuYW5pc290cm9weSA9IHVuZGVmaW5l
ZCAhPT0gdGV4RGF0YS5hbmlzb3Ryb3B5ID8gdGV4RGF0YS5hbmlzb3Ryb3B5IDogMTsKKworICAg
ICAgICAgICAgICAgIGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmZvcm1hdCApIHsKKworICAg
ICAgICAgICAgICAgICAgICB0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGEuZm9ybWF0OworCisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRh
LnR5cGUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS50eXBlID0gdGV4RGF0YS50
eXBlOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCB1bmRlZmlu
ZWQgIT09IHRleERhdGEubWlwbWFwcyApIHsKKworICAgICAgICAgICAgICAgICAgICB0ZXh0dXJl
Lm1pcG1hcHMgPSB0ZXhEYXRhLm1pcG1hcHM7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICBpZiAoIDEgPT09IHRleERhdGEubWlwbWFwQ291bnQgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CisKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsK
KworICAgICAgICAgICAgICAgIGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlLCB0ZXhEYXRh
ICk7CisKKyAgICAgICAgICAgIH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKKworCisgICAgICAg
ICAgICByZXR1cm4gdGV4dHVyZTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioK
KyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLworICAgICAqLworCisg
ICAgZnVuY3Rpb24gSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKSB7CisKKyAgICAgICAgdGhpcy5tYW5h
Z2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGlu
Z01hbmFnZXI7CisKKyAgICB9CisKKyAgICBPYmplY3QuYXNzaWduKCBJbWFnZUxvYWRlci5wcm90
b3R5cGUsIHsKKworICAgICAgICBsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dy
ZXNzLCBvbkVycm9yICkgeworCisgICAgICAgICAgICBpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkg
dXJsID0gJyc7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1
cmwgPSB0aGlzLnBhdGggKyB1cmw7CisKKyAgICAgICAgICAgIHZhciBzY29wZSA9IHRoaXM7CisK
KyAgICAgICAgICAgIHZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApOworCisgICAgICAgICAg
ICBpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgc2NvcGUu
bWFuYWdlci5pdGVtU3RhcnQoIHVybCApOworCisgICAgICAgICAgICAgICAgc2V0VGltZW91dCgg
ZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAgICAgICAgIGlmICggb25Mb2FkICkgb25Mb2Fk
KCBjYWNoZWQgKTsKKworICAgICAgICAgICAgICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1FbmQo
IHVybCApOworCisgICAgICAgICAgICAgICAgfSwgMCApOworCisgICAgICAgICAgICAgICAgcmV0
dXJuIGNhY2hlZDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaW1hZ2UgPSBk
b2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywg
J2ltZycgKTsKKworICAgICAgICAgICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBm
dW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgICAgICBDYWNoZS5hZGQoIHVybCwgdGhpcyApOwor
CisgICAgICAgICAgICAgICAgaWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTsKKworICAgICAg
ICAgICAgICAgIHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CisKKyAgICAgICAgICAgIH0s
IGZhbHNlICk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBpbWFnZS5hZGRFdmVudExp
c3RlbmVyKCAncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoIGV2ZW50ICkgeworCisgICAgICAgICAgICAg
ICAgaWYgKCBvblByb2dyZXNzICkgb25Qcm9ncmVzcyggZXZlbnQgKTsKKworICAgICAgICAgICAg
fSwgZmFsc2UgKTsKKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGltYWdlLmFkZEV2ZW50
TGlzdGVuZXIoICdlcnJvcicsIGZ1bmN0aW9uICggZXZlbnQgKSB7CisKKyAgICAgICAgICAgICAg
ICBpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBldmVudCApOworCisgICAgICAgICAgICAgICAgc2Nv
cGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKKyAgICAgICAgICAgICAgICBzY29wZS5tYW5hZ2Vy
Lml0ZW1FcnJvciggdXJsICk7CisKKyAgICAgICAgICAgIH0sIGZhbHNlICk7CisKKyAgICAgICAg
ICAgIGlmICggdXJsLnN1YnN0ciggMCwgNSApICE9PSAnZGF0YTonICkgeworCisgICAgICAgICAg
ICAgICAgaWYgKCB0aGlzLmNyb3NzT3JpZ2luICE9PSB1bmRlZmluZWQgKSBpbWFnZS5jcm9zc09y
aWdpbiA9IHRoaXMuY3Jvc3NPcmlnaW47CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApOworCisgICAgICAgICAgICBpbWFnZS5zcmMg
PSB1cmw7CisKKyAgICAgICAgICAgIHJldHVybiBpbWFnZTsKKworICAgICAgICB9LAorCisgICAg
ICAgIHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAgICB0
aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAg
ICAgICB9LAorCisgICAgICAgIHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAg
ICAgICAgIHRoaXMucGF0aCA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAg
ICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBo
dHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIEN1YmVUZXh0dXJlTG9h
ZGVyKCBtYW5hZ2VyICkgeworCisgICAgICAgIHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0g
dW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyOworCisgICAgfQor
CisgICAgT2JqZWN0LmFzc2lnbiggQ3ViZVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7CisKKyAg
ICAgICAgbG9hZDogZnVuY3Rpb24gKCB1cmxzLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3Ig
KSB7CisKKyAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7CisKKyAg
ICAgICAgICAgIHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApOwor
ICAgICAgICAgICAgbG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7Cisg
ICAgICAgICAgICBsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7CisKKyAgICAgICAgICAgIHZh
ciBsb2FkZWQgPSAwOworCisgICAgICAgICAgICBmdW5jdGlvbiBsb2FkVGV4dHVyZSggaSApIHsK
KworICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkKCB1cmxzWyBpIF0sIGZ1bmN0aW9uICggaW1h
Z2UgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5pbWFnZXNbIGkgXSA9IGltYWdl
OworCisgICAgICAgICAgICAgICAgICAgIGxvYWRlZCArKzsKKworICAgICAgICAgICAgICAgICAg
ICBpZiAoIGxvYWRlZCA9PT0gNiApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVy
ZS5uZWVkc1VwZGF0ZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggb25M
b2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBvbkVycm9yICk7CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7ICsrIGkgKSB7CisK
KyAgICAgICAgICAgICAgICBsb2FkVGV4dHVyZSggaSApOworCisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIHJldHVybiB0ZXh0dXJlOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0Q3Jv
c3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAgIHRoaXMuY3Jvc3NP
cmlnaW4gPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisK
KyAgICAgICAgc2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgdGhp
cy5wYXRoID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9CisK
KyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRv
b2IuY29tLworICAgICAqLworCisgICAgZnVuY3Rpb24gVGV4dHVyZUxvYWRlciggbWFuYWdlciAp
IHsKKworICAgICAgICB0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8g
bWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKKworICAgIH0KKworICAgIE9iamVjdC5h
c3NpZ24oIFRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7CisKKyAgICAgICAgbG9hZDogZnVuY3Rp
b24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKKworICAgICAgICAgICAg
dmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7CisgICAgICAgICAg
ICBsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTsKKyAgICAgICAgICAg
IGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTsKKworICAgICAgICAgICAgdmFyIHRleHR1cmUg
PSBuZXcgVGV4dHVyZSgpOworICAgICAgICAgICAgdGV4dHVyZS5pbWFnZSA9IGxvYWRlci5sb2Fk
KCB1cmwsIGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgIC8vIEpQRUdzIGNhbid0IGhh
dmUgYW4gYWxwaGEgY2hhbm5lbCwgc28gbWVtb3J5IGNhbiBiZSBzYXZlZCBieSBzdG9yaW5nIHRo
ZW0gYXMgUkdCLgorICAgICAgICAgICAgICAgIHZhciBpc0pQRUcgPSB1cmwuc2VhcmNoKCAvXC4o
anBnfGpwZWcpJC8gKSA+IDAgfHwgdXJsLnNlYXJjaCggL15kYXRhXDppbWFnZVwvanBlZy8gKSA9
PT0gMDsKKworICAgICAgICAgICAgICAgIHRleHR1cmUuZm9ybWF0ID0gaXNKUEVHID8gUkdCRm9y
bWF0IDogUkdCQUZvcm1hdDsKKyAgICAgICAgICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0g
dHJ1ZTsKKworICAgICAgICAgICAgICAgIGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgb25Mb2FkKCB0ZXh0dXJlICk7CisKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKKworICAgICAgICAg
ICAgcmV0dXJuIHRleHR1cmU7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRDcm9zc09yaWdp
bjogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgdGhpcy5jcm9zc09yaWdpbiA9
IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAg
ICBzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAgICB0aGlzLnBhdGgg
PSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0KKworICAgIH0g
KTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20v
CisgICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAg
ICAgKi8KKworICAgIGZ1bmN0aW9uIExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkgeworCisgICAg
ICAgIE9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnTGlnaHQn
OworCisgICAgICAgIHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7CisgICAgICAgIHRo
aXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgPyBpbnRlbnNpdHkgOiAxOwor
CisgICAgICAgIHRoaXMucmVjZWl2ZVNoYWRvdyA9IHVuZGVmaW5lZDsKKworICAgIH0KKworICAg
IExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNE
LnByb3RvdHlwZSApLCB7CisKKyAgICAgICAgY29uc3RydWN0b3I6IExpZ2h0LAorCisgICAgICAg
IGlzTGlnaHQ6IHRydWUsCisKKyAgICAgICAgY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisK
KyAgICAgICAgICAgIE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSAp
OworCisgICAgICAgICAgICB0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOworICAgICAg
ICAgICAgdGhpcy5pbnRlbnNpdHkgPSBzb3VyY2UuaW50ZW5zaXR5OworCisgICAgICAgICAgICBy
ZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHRvSlNPTjogZnVuY3Rpb24gKCBt
ZXRhICkgeworCisgICAgICAgICAgICB2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pT
T04uY2FsbCggdGhpcywgbWV0YSApOworCisgICAgICAgICAgICBkYXRhLm9iamVjdC5jb2xvciA9
IHRoaXMuY29sb3IuZ2V0SGV4KCk7CisgICAgICAgICAgICBkYXRhLm9iamVjdC5pbnRlbnNpdHkg
PSB0aGlzLmludGVuc2l0eTsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmdyb3VuZENvbG9yICE9
PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3Iu
Z2V0SGV4KCk7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5kaXN0YW5jZSAhPT0gdW5kZWZpbmVk
ICkgZGF0YS5vYmplY3QuZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlOworICAgICAgICAgICAgaWYg
KCB0aGlzLmFuZ2xlICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5hbmdsZSA9IHRoaXMuYW5n
bGU7CisgICAgICAgICAgICBpZiAoIHRoaXMuZGVjYXkgIT09IHVuZGVmaW5lZCApIGRhdGEub2Jq
ZWN0LmRlY2F5ID0gdGhpcy5kZWNheTsKKyAgICAgICAgICAgIGlmICggdGhpcy5wZW51bWJyYSAh
PT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QucGVudW1icmEgPSB0aGlzLnBlbnVtYnJhOworCisg
ICAgICAgICAgICBpZiAoIHRoaXMuc2hhZG93ICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5z
aGFkb3cgPSB0aGlzLnNoYWRvdy50b0pTT04oKTsKKworICAgICAgICAgICAgcmV0dXJuIGRhdGE7
CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBhbHRl
cmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9u
IEhlbWlzcGhlcmVMaWdodCggc2t5Q29sb3IsIGdyb3VuZENvbG9yLCBpbnRlbnNpdHkgKSB7CisK
KyAgICAgICAgTGlnaHQuY2FsbCggdGhpcywgc2t5Q29sb3IsIGludGVuc2l0eSApOworCisgICAg
ICAgIHRoaXMudHlwZSA9ICdIZW1pc3BoZXJlTGlnaHQnOworCisgICAgICAgIHRoaXMuY2FzdFNo
YWRvdyA9IHVuZGVmaW5lZDsKKworICAgICAgICB0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNE
LkRlZmF1bHRVcCApOworICAgICAgICB0aGlzLnVwZGF0ZU1hdHJpeCgpOworCisgICAgICAgIHRo
aXMuZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IoIGdyb3VuZENvbG9yICk7CisKKyAgICB9CisKKyAg
ICBIZW1pc3BoZXJlTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0
ZSggTGlnaHQucHJvdG90eXBlICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogSGVtaXNwaGVy
ZUxpZ2h0LAorCisgICAgICAgIGlzSGVtaXNwaGVyZUxpZ2h0OiB0cnVlLAorCisgICAgICAgIGNv
cHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisgICAgICAgICAgICBMaWdodC5wcm90b3R5cGUu
Y29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworICAgICAgICAgICAgdGhpcy5ncm91bmRDb2xv
ci5jb3B5KCBzb3VyY2UuZ3JvdW5kQ29sb3IgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7
CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRv
b2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIExpZ2h0U2hh
ZG93KCBjYW1lcmEgKSB7CisKKyAgICAgICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7CisKKyAgICAg
ICAgdGhpcy5iaWFzID0gMDsKKyAgICAgICAgdGhpcy5yYWRpdXMgPSAxOworCisgICAgICAgIHRo
aXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCA1MTIsIDUxMiApOworCisgICAgICAgIHRoaXMubWFw
ID0gbnVsbDsKKyAgICAgICAgdGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpOworCisgICAgfQor
CisgICAgT2JqZWN0LmFzc2lnbiggTGlnaHRTaGFkb3cucHJvdG90eXBlLCB7CisKKyAgICAgICAg
Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKyAgICAgICAgICAgIHRoaXMuY2FtZXJhID0g
c291cmNlLmNhbWVyYS5jbG9uZSgpOworCisgICAgICAgICAgICB0aGlzLmJpYXMgPSBzb3VyY2Uu
YmlhczsKKyAgICAgICAgICAgIHRoaXMucmFkaXVzID0gc291cmNlLnJhZGl1czsKKworICAgICAg
ICAgICAgdGhpcy5tYXBTaXplLmNvcHkoIHNvdXJjZS5tYXBTaXplICk7CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgp
IHsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhp
cyApOworCisgICAgICAgIH0sCisKKyAgICAgICAgdG9KU09OOiBmdW5jdGlvbiAoKSB7CisKKyAg
ICAgICAgICAgIHZhciBvYmplY3QgPSB7fTsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmJpYXMg
IT09IDAgKSBvYmplY3QuYmlhcyA9IHRoaXMuYmlhczsKKyAgICAgICAgICAgIGlmICggdGhpcy5y
YWRpdXMgIT09IDEgKSBvYmplY3QucmFkaXVzID0gdGhpcy5yYWRpdXM7CisgICAgICAgICAgICBp
ZiAoIHRoaXMubWFwU2l6ZS54ICE9PSA1MTIgfHwgdGhpcy5tYXBTaXplLnkgIT09IDUxMiApIG9i
amVjdC5tYXBTaXplID0gdGhpcy5tYXBTaXplLnRvQXJyYXkoKTsKKworICAgICAgICAgICAgb2Jq
ZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7CisgICAgICAg
ICAgICBkZWxldGUgb2JqZWN0LmNhbWVyYS5tYXRyaXg7CisKKyAgICAgICAgICAgIHJldHVybiBv
YmplY3Q7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhv
ciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFNw
b3RMaWdodFNoYWRvdygpIHsKKworICAgICAgICBMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcg
UGVyc3BlY3RpdmVDYW1lcmEoIDUwLCAxLCAwLjUsIDUwMCApICk7CisKKyAgICB9CisKKyAgICBT
cG90TGlnaHRTaGFkb3cucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSgg
TGlnaHRTaGFkb3cucHJvdG90eXBlICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogU3BvdExp
Z2h0U2hhZG93LAorCisgICAgICAgIGlzU3BvdExpZ2h0U2hhZG93OiB0cnVlLAorCisgICAgICAg
IHVwZGF0ZTogZnVuY3Rpb24gKCBsaWdodCApIHsKKworICAgICAgICAgICAgdmFyIGNhbWVyYSA9
IHRoaXMuY2FtZXJhOworCisgICAgICAgICAgICB2YXIgZm92ID0gX01hdGguUkFEMkRFRyAqIDIg
KiBsaWdodC5hbmdsZTsKKyAgICAgICAgICAgIHZhciBhc3BlY3QgPSB0aGlzLm1hcFNpemUud2lk
dGggLyB0aGlzLm1hcFNpemUuaGVpZ2h0OworICAgICAgICAgICAgdmFyIGZhciA9IGxpZ2h0LmRp
c3RhbmNlIHx8IGNhbWVyYS5mYXI7CisKKyAgICAgICAgICAgIGlmICggZm92ICE9PSBjYW1lcmEu
Zm92IHx8IGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCB8fCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7
CisKKyAgICAgICAgICAgICAgICBjYW1lcmEuZm92ID0gZm92OworICAgICAgICAgICAgICAgIGNh
bWVyYS5hc3BlY3QgPSBhc3BlY3Q7CisgICAgICAgICAgICAgICAgY2FtZXJhLmZhciA9IGZhcjsK
KyAgICAgICAgICAgICAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOworCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1
dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKi8KKworICAg
IGZ1bmN0aW9uIFNwb3RMaWdodCggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UsIGFuZ2xlLCBw
ZW51bWJyYSwgZGVjYXkgKSB7CisKKyAgICAgICAgTGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGlu
dGVuc2l0eSApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdTcG90TGlnaHQnOworCisgICAgICAg
IHRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7CisgICAgICAgIHRoaXMu
dXBkYXRlTWF0cml4KCk7CisKKyAgICAgICAgdGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTsK
KworICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdwb3dlcicsIHsKKyAgICAg
ICAgICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIC8vIGludGVuc2l0eSA9
IHBvd2VyIHBlciBzb2xpZCBhbmdsZS4KKyAgICAgICAgICAgICAgICAvLyByZWY6IGVxdWF0aW9u
ICgxNykgZnJvbSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3AtY29udGVudC91cGxvYWRzLzIw
MTQvMTEvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyLnBkZgorICAgICAgICAg
ICAgICAgIHJldHVybiB0aGlzLmludGVuc2l0eSAqIE1hdGguUEk7CisgICAgICAgICAgICB9LAor
ICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHBvd2VyICkgeworICAgICAgICAgICAgICAgIC8v
IGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS4KKyAgICAgICAgICAgICAgICAvLyBy
ZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3AtY29udGVu
dC91cGxvYWRzLzIwMTQvMTEvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyLnBk
ZgorICAgICAgICAgICAgICAgIHRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyBNYXRoLlBJOworICAg
ICAgICAgICAgfQorICAgICAgICB9ICk7CisKKyAgICAgICAgdGhpcy5kaXN0YW5jZSA9ICggZGlz
dGFuY2UgIT09IHVuZGVmaW5lZCApID8gZGlzdGFuY2UgOiAwOworICAgICAgICB0aGlzLmFuZ2xl
ID0gKCBhbmdsZSAhPT0gdW5kZWZpbmVkICkgPyBhbmdsZSA6IE1hdGguUEkgLyAzOworICAgICAg
ICB0aGlzLnBlbnVtYnJhID0gKCBwZW51bWJyYSAhPT0gdW5kZWZpbmVkICkgPyBwZW51bWJyYSA6
IDA7CisgICAgICAgIHRoaXMuZGVjYXkgPSAoIGRlY2F5ICE9PSB1bmRlZmluZWQgKSA/IGRlY2F5
IDogMTsgICAvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuCisK
KyAgICAgICAgdGhpcy5zaGFkb3cgPSBuZXcgU3BvdExpZ2h0U2hhZG93KCk7CisKKyAgICB9CisK
KyAgICBTcG90TGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSgg
TGlnaHQucHJvdG90eXBlICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogU3BvdExpZ2h0LAor
CisgICAgICAgIGlzU3BvdExpZ2h0OiB0cnVlLAorCisgICAgICAgIGNvcHk6IGZ1bmN0aW9uICgg
c291cmNlICkgeworCisgICAgICAgICAgICBMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlz
LCBzb3VyY2UgKTsKKworICAgICAgICAgICAgdGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5j
ZTsKKyAgICAgICAgICAgIHRoaXMuYW5nbGUgPSBzb3VyY2UuYW5nbGU7CisgICAgICAgICAgICB0
aGlzLnBlbnVtYnJhID0gc291cmNlLnBlbnVtYnJhOworICAgICAgICAgICAgdGhpcy5kZWNheSA9
IHNvdXJjZS5kZWNheTsKKworICAgICAgICAgICAgdGhpcy50YXJnZXQgPSBzb3VyY2UudGFyZ2V0
LmNsb25lKCk7CisKKyAgICAgICAgICAgIHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9u
ZSgpOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9CisKKyAgICB9ICk7
CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwor
ICAgICAqLworCisKKyAgICBmdW5jdGlvbiBQb2ludExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCBk
aXN0YW5jZSwgZGVjYXkgKSB7CisKKyAgICAgICAgTGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGlu
dGVuc2l0eSApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdQb2ludExpZ2h0JzsKKworICAgICAg
ICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdwb3dlcicsIHsKKyAgICAgICAgICAgIGdl
dDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgIC8vIGludGVuc2l0eSA9IHBvd2VyIHBl
ciBzb2xpZCBhbmdsZS4KKyAgICAgICAgICAgICAgICAvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJv
bSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTQvMTEvY291
cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyLnBkZgorICAgICAgICAgICAgICAgIHJl
dHVybiB0aGlzLmludGVuc2l0eSAqIDQgKiBNYXRoLlBJOworCisgICAgICAgICAgICB9LAorICAg
ICAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHBvd2VyICkgeworICAgICAgICAgICAgICAgIC8vIGlu
dGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS4KKyAgICAgICAgICAgICAgICAvLyByZWY6
IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3AtY29udGVudC91
cGxvYWRzLzIwMTQvMTEvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyLnBkZgor
ICAgICAgICAgICAgICAgIHRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyAoIDQgKiBNYXRoLlBJICk7
CisgICAgICAgICAgICB9CisgICAgICAgIH0gKTsKKworICAgICAgICB0aGlzLmRpc3RhbmNlID0g
KCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7CisgICAgICAgIHRoaXMu
ZGVjYXkgPSAoIGRlY2F5ICE9PSB1bmRlZmluZWQgKSA/IGRlY2F5IDogMTsgICAvLyBmb3IgcGh5
c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuCisKKyAgICAgICAgdGhpcy5zaGFk
b3cgPSBuZXcgTGlnaHRTaGFkb3coIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwg
NTAwICkgKTsKKworICAgIH0KKworICAgIFBvaW50TGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFz
c2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHsKKworICAgICAgICBjb25z
dHJ1Y3RvcjogUG9pbnRMaWdodCwKKworICAgICAgICBpc1BvaW50TGlnaHQ6IHRydWUsCisKKyAg
ICAgICAgY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKyAgICAgICAgICAgIExpZ2h0LnBy
b3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOworCisgICAgICAgICAgICB0aGlzLmRp
c3RhbmNlID0gc291cmNlLmRpc3RhbmNlOworICAgICAgICAgICAgdGhpcy5kZWNheSA9IHNvdXJj
ZS5kZWNheTsKKworICAgICAgICAgICAgdGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25l
KCk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0KKworICAgIH0gKTsK
KworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisg
ICAgICovCisKKyAgICBmdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0U2hhZG93KCApIHsKKworICAg
ICAgICBMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCAtIDUs
IDUsIDUsIC0gNSwgMC41LCA1MDAgKSApOworCisgICAgfQorCisgICAgRGlyZWN0aW9uYWxMaWdo
dFNoYWRvdy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFNo
YWRvdy5wcm90b3R5cGUgKSwgeworCisgICAgICAgIGNvbnN0cnVjdG9yOiBEaXJlY3Rpb25hbExp
Z2h0U2hhZG93CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAv
IGh0dHA6Ly9tcmRvb2IuY29tLworICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0
ZXJlZHF1YWxpYS5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0
KCBjb2xvciwgaW50ZW5zaXR5ICkgeworCisgICAgICAgIExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9y
LCBpbnRlbnNpdHkgKTsKKworICAgICAgICB0aGlzLnR5cGUgPSAnRGlyZWN0aW9uYWxMaWdodCc7
CisKKyAgICAgICAgdGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTsKKyAg
ICAgICAgdGhpcy51cGRhdGVNYXRyaXgoKTsKKworICAgICAgICB0aGlzLnRhcmdldCA9IG5ldyBP
YmplY3QzRCgpOworCisgICAgICAgIHRoaXMuc2hhZG93ID0gbmV3IERpcmVjdGlvbmFsTGlnaHRT
aGFkb3coKTsKKworICAgIH0KKworICAgIERpcmVjdGlvbmFsTGlnaHQucHJvdG90eXBlID0gT2Jq
ZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHsKKworICAgICAg
ICBjb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodCwKKworICAgICAgICBpc0RpcmVjdGlvbmFs
TGlnaHQ6IHRydWUsCisKKyAgICAgICAgY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKyAg
ICAgICAgICAgIExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOworCisg
ICAgICAgICAgICB0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTsKKworICAgICAg
ICAgICAgdGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAq
IEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5j
dGlvbiBBbWJpZW50TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7CisKKyAgICAgICAgTGlnaHQu
Y2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdB
bWJpZW50TGlnaHQnOworCisgICAgICAgIHRoaXMuY2FzdFNoYWRvdyA9IHVuZGVmaW5lZDsKKwor
ICAgIH0KKworICAgIEFtYmllbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmpl
Y3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwgeworCisgICAgICAgIGNvbnN0cnVjdG9yOiBB
bWJpZW50TGlnaHQsCisKKyAgICAgICAgaXNBbWJpZW50TGlnaHQ6IHRydWUKKworICAgIH0gKTsK
KworICAgIC8qKgorICAgICAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29t
L2FiZWxuYXRpb24KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFJlY3RBcmVhTGlnaHQoIGNvbG9y
LCBpbnRlbnNpdHksIHdpZHRoLCBoZWlnaHQgKSB7CisKKyAgICAgICAgTGlnaHQuY2FsbCggdGhp
cywgY29sb3IsIGludGVuc2l0eSApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdSZWN0QXJlYUxp
Z2h0JzsKKworICAgICAgICB0aGlzLnBvc2l0aW9uLnNldCggMCwgMSwgMCApOworICAgICAgICB0
aGlzLnVwZGF0ZU1hdHJpeCgpOworCisgICAgICAgIHRoaXMud2lkdGggPSAoIHdpZHRoICE9PSB1
bmRlZmluZWQgKSA/IHdpZHRoIDogMTA7CisgICAgICAgIHRoaXMuaGVpZ2h0ID0gKCBoZWlnaHQg
IT09IHVuZGVmaW5lZCApID8gaGVpZ2h0IDogMTA7CisKKyAgICAgICAgLy8gVE9ETyAoYWJlbG5h
dGlvbik6IGRpc3RhbmNlL2RlY2F5CisKKyAgICAgICAgLy8gVE9ETyAoYWJlbG5hdGlvbik6IHVw
ZGF0ZSBtZXRob2QgZm9yIFJlY3RBcmVhTGlnaHQgdG8gdXBkYXRlIHRyYW5zZm9ybSB0byBsb29r
YXQgdGFyZ2V0CisKKyAgICAgICAgLy8gVE9ETyAoYWJlbG5hdGlvbik6IHNoYWRvd3MKKworICAg
IH0KKworICAgIC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IHVwZGF0ZSB3aGVu
IGxpZ2h0IHNoYXBlIGlzIGNoYW5nZWQKKyAgICBSZWN0QXJlYUxpZ2h0LnByb3RvdHlwZSA9IE9i
amVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7CisKKyAgICAg
ICAgY29uc3RydWN0b3I6IFJlY3RBcmVhTGlnaHQsCisKKyAgICAgICAgaXNSZWN0QXJlYUxpZ2h0
OiB0cnVlLAorCisgICAgICAgIGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisgICAgICAg
ICAgICBMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworICAgICAg
ICAgICAgdGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDsKKyAgICAgICAgICAgIHRoaXMuaGVpZ2h0
ID0gc291cmNlLmhlaWdodDsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAg
fSwKKworICAgICAgICB0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKKworICAgICAgICAgICAg
dmFyIGRhdGEgPSBMaWdodC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTsKKwor
ICAgICAgICAgICAgZGF0YS5vYmplY3Qud2lkdGggPSB0aGlzLndpZHRoOworICAgICAgICAgICAg
ZGF0YS5vYmplY3QuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisKKyAgICAgICAgICAgIHJldHVybiBk
YXRhOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3Ig
dHNjaHcKKyAgICAgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLworICAg
ICAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworICAgICAqLwor
CisgICAgdmFyIEFuaW1hdGlvblV0aWxzID0geworCisgICAgICAgIC8vIHNhbWUgYXMgQXJyYXku
cHJvdG90eXBlLnNsaWNlLCBidXQgYWxzbyB3b3JrcyBvbiB0eXBlZCBhcnJheXMKKyAgICAgICAg
YXJyYXlTbGljZTogZnVuY3Rpb24gKCBhcnJheSwgZnJvbSwgdG8gKSB7CisKKyAgICAgICAgICAg
IGlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCBhcnJheSApICkgeworCisgICAgICAg
ICAgICAgICAgLy8gaW4gaW9zOSBhcnJheS5zdWJhcnJheShmcm9tLCB1bmRlZmluZWQpIHdpbGwg
cmV0dXJuIGVtcHR5IGFycmF5CisgICAgICAgICAgICAgICAgLy8gYnV0IGFycmF5LnN1YmFycmF5
KGZyb20pIG9yIGFycmF5LnN1YmFycmF5KGZyb20sIGxlbikgaXMgY29ycmVjdAorICAgICAgICAg
ICAgICAgIHJldHVybiBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGFycmF5LnN1YmFycmF5KCBmcm9t
LCB0byAhPT0gdW5kZWZpbmVkID8gdG8gOiBhcnJheS5sZW5ndGggKSApOworCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIHJldHVybiBhcnJheS5zbGljZSggZnJvbSwgdG8gKTsKKworICAg
ICAgICB9LAorCisgICAgICAgIC8vIGNvbnZlcnRzIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdHlw
ZQorICAgICAgICBjb252ZXJ0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIHR5cGUsIGZvcmNlQ2xv
bmUgKSB7CisKKyAgICAgICAgICAgIGlmICggISBhcnJheSB8fCAvLyBsZXQgJ3VuZGVmaW5lZCcg
YW5kICdudWxsJyBwYXNzCisgICAgICAgICAgICAgICAgICAgICEgZm9yY2VDbG9uZSAmJiBhcnJh
eS5jb25zdHJ1Y3RvciA9PT0gdHlwZSApIHJldHVybiBhcnJheTsKKworICAgICAgICAgICAgaWYg
KCB0eXBlb2YgdHlwZS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7CisKKyAgICAg
ICAgICAgICAgICByZXR1cm4gbmV3IHR5cGUoIGFycmF5ICk7IC8vIGNyZWF0ZSB0eXBlZCBhcnJh
eQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUu
c2xpY2UuY2FsbCggYXJyYXkgKTsgLy8gY3JlYXRlIEFycmF5CisKKyAgICAgICAgfSwKKworICAg
ICAgICBpc1R5cGVkQXJyYXk6IGZ1bmN0aW9uICggb2JqZWN0ICkgeworCisgICAgICAgICAgICBy
ZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KCBvYmplY3QgKSAmJgorICAgICAgICAgICAgICAgICAg
ICAhICggb2JqZWN0IGluc3RhbmNlb2YgRGF0YVZpZXcgKTsKKworICAgICAgICB9LAorCisgICAg
ICAgIC8vIHJldHVybnMgYW4gYXJyYXkgYnkgd2hpY2ggdGltZXMgYW5kIHZhbHVlcyBjYW4gYmUg
c29ydGVkCisgICAgICAgIGdldEtleWZyYW1lT3JkZXI6IGZ1bmN0aW9uICggdGltZXMgKSB7CisK
KyAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXBhcmVUaW1lKCBpLCBqICkgeworCisgICAgICAgICAg
ICAgICAgcmV0dXJuIHRpbWVzWyBpIF0gLSB0aW1lc1sgaiBdOworCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIHZhciBuID0gdGltZXMubGVuZ3RoOworICAgICAgICAgICAgdmFyIHJlc3Vs
dCA9IG5ldyBBcnJheSggbiApOworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpICE9PSBu
OyArKyBpICkgcmVzdWx0WyBpIF0gPSBpOworCisgICAgICAgICAgICByZXN1bHQuc29ydCggY29t
cGFyZVRpbWUgKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgICAgICB9LAor
CisgICAgICAgIC8vIHVzZXMgdGhlIGFycmF5IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgJ2dldEtl
eWZyYW1lT3JkZXInIHRvIHNvcnQgZGF0YQorICAgICAgICBzb3J0ZWRBcnJheTogZnVuY3Rpb24g
KCB2YWx1ZXMsIHN0cmlkZSwgb3JkZXIgKSB7CisKKyAgICAgICAgICAgIHZhciBuVmFsdWVzID0g
dmFsdWVzLmxlbmd0aDsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgdmFsdWVzLmNvbnN0
cnVjdG9yKCBuVmFsdWVzICk7CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwgZHN0T2Zm
c2V0ID0gMDsgZHN0T2Zmc2V0ICE9PSBuVmFsdWVzOyArKyBpICkgeworCisgICAgICAgICAgICAg
ICAgdmFyIHNyY09mZnNldCA9IG9yZGVyWyBpIF0gKiBzdHJpZGU7CisKKyAgICAgICAgICAgICAg
ICBmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHsKKworICAgICAgICAgICAg
ICAgICAgICByZXN1bHRbIGRzdE9mZnNldCArKyBdID0gdmFsdWVzWyBzcmNPZmZzZXQgKyBqIF07
CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKworICAgICAgICB9LAorCisgICAgICAgIC8vIGZ1bmN0aW9uIGZvciBwYXJz
aW5nIEFPUyBrZXlmcmFtZSBmb3JtYXRzCisgICAgICAgIGZsYXR0ZW5KU09OOiBmdW5jdGlvbiAo
IGpzb25LZXlzLCB0aW1lcywgdmFsdWVzLCB2YWx1ZVByb3BlcnR5TmFtZSApIHsKKworICAgICAg
ICAgICAgdmFyIGkgPSAxLCBrZXkgPSBqc29uS2V5c1sgMCBdOworCisgICAgICAgICAgICB3aGls
ZSAoIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXSA9PT0gdW5k
ZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAga2V5ID0ganNvbktleXNbIGkgKysgXTsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgcmV0
dXJuOyAvLyBubyBkYXRhCisKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IGtleVsgdmFsdWVQcm9w
ZXJ0eU5hbWUgXTsKKyAgICAgICAgICAgIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVy
bjsgLy8gbm8gZGF0YQorCisgICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkg
KSB7CisKKyAgICAgICAgICAgICAgICBkbyB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUg
PSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB2
YWx1ZSAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcy5w
dXNoKCBrZXkudGltZSApOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2guYXBw
bHkoIHZhbHVlcywgdmFsdWUgKTsgLy8gcHVzaCBhbGwgZWxlbWVudHMKKworICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAga2V5ID0ganNvbktleXNbIGkgKysgXTsK
KworICAgICAgICAgICAgICAgIH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApOworCisgICAg
ICAgICAgICB9IGVsc2UgaWYgKCB2YWx1ZS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7CisKKyAg
ICAgICAgICAgICAgICAvLyAuLi5hc3N1bWUgVEhSRUUuTWF0aC1pc2gKKworICAgICAgICAgICAg
ICAgIGRvIHsKKworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0
eU5hbWUgXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzLnB1c2goIGtleS50aW1lICk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50b0FycmF5KCB2YWx1ZXMsIHZhbHVlcy5sZW5n
dGggKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAga2V5
ID0ganNvbktleXNbIGkgKysgXTsKKworICAgICAgICAgICAgICAgIH0gd2hpbGUgKCBrZXkgIT09
IHVuZGVmaW5lZCApOworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAg
Ly8gb3RoZXJ3aXNlIHB1c2ggYXMtaXMKKworICAgICAgICAgICAgICAgIGRvIHsKKworICAgICAg
ICAgICAgICAgICAgICB2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTsKKworICAgICAg
ICAgICAgICAgICAgICBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHRpbWVzLnB1c2goIGtleS50aW1lICk7CisgICAgICAgICAgICAgICAgICAg
ICAgICB2YWx1ZXMucHVzaCggdmFsdWUgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICAgICAga2V5ID0ganNvbktleXNbIGkgKysgXTsKKworICAgICAgICAgICAg
ICAgIH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApOworCisgICAgICAgICAgICB9CisKKyAg
ICAgICAgfQorCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFic3RyYWN0IGJhc2UgY2xhc3Mg
b2YgaW50ZXJwb2xhbnRzIG92ZXIgcGFyYW1ldHJpYyBzYW1wbGVzLgorICAgICAqCisgICAgICog
VGhlIHBhcmFtZXRlciBkb21haW4gaXMgb25lIGRpbWVuc2lvbmFsLCB0eXBpY2FsbHkgdGhlIHRp
bWUgb3IgYSBwYXRoCisgICAgICogYWxvbmcgYSBjdXJ2ZSBkZWZpbmVkIGJ5IHRoZSBkYXRhLgor
ICAgICAqCisgICAgICogVGhlIHNhbXBsZSB2YWx1ZXMgY2FuIGhhdmUgYW55IGRpbWVuc2lvbmFs
aXR5IGFuZCBkZXJpdmVkIGNsYXNzZXMgbWF5CisgICAgICogYXBwbHkgc3BlY2lhbCBpbnRlcnBy
ZXRhdGlvbnMgdG8gdGhlIGRhdGEuCisgICAgICoKKyAgICAgKiBUaGlzIGNsYXNzIHByb3ZpZGVz
IHRoZSBpbnRlcnZhbCBzZWVrIGluIGEgVGVtcGxhdGUgTWV0aG9kLCBkZWZlcnJpbmcKKyAgICAg
KiB0aGUgYWN0dWFsIGludGVycG9sYXRpb24gdG8gZGVyaXZlZCBjbGFzc2VzLgorICAgICAqCisg
ICAgICogVGltZSBjb21wbGV4aXR5IGlzIE8oMSkgZm9yIGxpbmVhciBhY2Nlc3MgY3Jvc3Npbmcg
YXQgbW9zdCB0d28gcG9pbnRzCisgICAgICogYW5kIE8obG9nIE4pIGZvciByYW5kb20gYWNjZXNz
LCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25zLgorICAgICAqCisgICAgICogUmVm
ZXJlbmNlczoKKyAgICAgKgorICAgICAqICAgICAgaHR0cDovL3d3dy5vb2Rlc2lnbi5jb20vdGVt
cGxhdGUtbWV0aG9kLXBhdHRlcm4uaHRtbAorICAgICAqCisgICAgICogQGF1dGhvciB0c2Nodwor
ICAgICAqLworCisgICAgZnVuY3Rpb24gSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywg
c2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7CisKKyAgICAgICAgdGhp
cy5wYXJhbWV0ZXJQb3NpdGlvbnMgPSBwYXJhbWV0ZXJQb3NpdGlvbnM7CisgICAgICAgIHRoaXMu
X2NhY2hlZEluZGV4ID0gMDsKKworICAgICAgICB0aGlzLnJlc3VsdEJ1ZmZlciA9IHJlc3VsdEJ1
ZmZlciAhPT0gdW5kZWZpbmVkID8KKyAgICAgICAgICAgICAgICByZXN1bHRCdWZmZXIgOiBuZXcg
c2FtcGxlVmFsdWVzLmNvbnN0cnVjdG9yKCBzYW1wbGVTaXplICk7CisgICAgICAgIHRoaXMuc2Ft
cGxlVmFsdWVzID0gc2FtcGxlVmFsdWVzOworICAgICAgICB0aGlzLnZhbHVlU2l6ZSA9IHNhbXBs
ZVNpemU7CisKKyAgICB9CisKKyAgICBPYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5
cGUsIHsKKworICAgICAgICBldmFsdWF0ZTogZnVuY3Rpb24oIHQgKSB7CisKKyAgICAgICAgICAg
IHZhciBwcCA9IHRoaXMucGFyYW1ldGVyUG9zaXRpb25zLAorICAgICAgICAgICAgICAgIGkxID0g
dGhpcy5fY2FjaGVkSW5kZXgsCisKKyAgICAgICAgICAgICAgICB0MSA9IHBwWyAgIGkxICAgXSwK
KyAgICAgICAgICAgICAgICB0MCA9IHBwWyBpMSAtIDEgXTsKKworICAgICAgICAgICAgdmFsaWRh
dGVfaW50ZXJ2YWw6IHsKKworICAgICAgICAgICAgICAgIHNlZWs6IHsKKworICAgICAgICAgICAg
ICAgICAgICB2YXIgcmlnaHQ7CisKKyAgICAgICAgICAgICAgICAgICAgbGluZWFyX3NjYW46IHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIC8vLSBTZWUgaHR0cDovL2pzcGVyZi5jb20vY29tcGFy
aXNvbi10by11bmRlZmluZWQvMworICAgICAgICAgICAgICAgICAgICAgICAgLy8tIHNsb3dlciBj
b2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8tCisgICAgICAgICAgICAgICAgICAgICAg
ICAvLy0gICAgICAgICAgICAgICAgIGlmICggdCA+PSB0MSB8fCB0MSA9PT0gdW5kZWZpbmVkICkg
eworICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9zY2FuOiBpZiAoICEgKCB0IDwgdDEg
KSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIHZhciBnaXZlVXBBdCA9
IGkxICsgMjsgOykgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdDEg
PT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCB0IDwgdDAgKSBicmVhayBmb3J3YXJkX3NjYW47CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGFmdGVyIGVuZAorCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpMSA9IHBwLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdCwgdDAgKTsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCBpMSA9PT0gZ2l2ZVVwQXQgKSBicmVhazsgLy8gdGhpcyBsb29wCisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDAgPSB0MTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdDEgPSBwcFsgKysgaTEgXTsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIHQgPCB0MSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNlZWs7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9u
IHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJpZ2h0ID0gcHAubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxp
bmVhcl9zY2FuOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIC8vLSBzbG93ZXIgY29kZToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLSAg
ICAgICAgICAgICAgICAgaWYgKCB0IDwgdDAgfHwgdDAgPT09IHVuZGVmaW5lZCApIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggISAoIHQgPj0gdDAgKSApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGxvb3Bpbmc/CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB2YXIgdDFnbG9iYWwgPSBwcFsgMSBdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCB0IDwgdDFnbG9iYWwgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aTEgPSAyOyAvLyArIDEsIHVzaW5nIHRoZSBzY2FuIGZvciB0aGUgZGV0YWlscworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB0MCA9IHQxZ2xvYmFsOworCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluZWFyIHJl
dmVyc2Ugc2NhbgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGdpdmVV
cEF0ID0gaTEgLSAyOyA7KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KCB0MCA9PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBiZWZvcmUgc3RhcnQKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGhpcy5fY2FjaGVkSW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApOworCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3AKKworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB0MSA9IHQwOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB0MCA9IHBwWyAtLSBpMSAtIDEgXTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoIHQgPj0gdDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIHdlIGhhdmUgYXJyaXZlZCBhdCB0aGUgc291Z2h0IGludGVydmFsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzZWVrOworCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0
aGUgbGVmdCBzaWRlIG9mIHRoZSBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJp
Z2h0ID0gaTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTEgPSAwOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrIGxpbmVhcl9zY2FuOworCisgICAgICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlcnZhbCBpcyB2
YWxpZAorCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayB2YWxpZGF0ZV9pbnRlcnZhbDsK
KworICAgICAgICAgICAgICAgICAgICB9IC8vIGxpbmVhciBzY2FuCisKKyAgICAgICAgICAgICAg
ICAgICAgLy8gYmluYXJ5IHNlYXJjaAorCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICggaTEg
PCByaWdodCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1pZCA9ICggaTEgKyBy
aWdodCApID4+PiAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHQgPCBwcFsgbWlk
IF0gKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IG1pZDsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGkxID0gbWlkICsgMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0MSA9IHBwWyAgIGkxICAgXTsK
KyAgICAgICAgICAgICAgICAgICAgdDAgPSBwcFsgaTEgLSAxIF07CisKKyAgICAgICAgICAgICAg
ICAgICAgLy8gY2hlY2sgYm91bmRhcnkgY2FzZXMsIGFnYWluCisKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCB0MCA9PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB0
aGlzLl9jYWNoZWRJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhp
cy5iZWZvcmVTdGFydF8oIDAsIHQsIHQxICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgICAgIGlmICggdDEgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgaTEgPSBwcC5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICB0
aGlzLl9jYWNoZWRJbmRleCA9IGkxOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRo
aXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQwLCB0ICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgfSAvLyBzZWVrCisKKyAgICAgICAgICAgICAgICB0aGlzLl9jYWNo
ZWRJbmRleCA9IGkxOworCisgICAgICAgICAgICAgICAgdGhpcy5pbnRlcnZhbENoYW5nZWRfKCBp
MSwgdDAsIHQxICk7CisKKyAgICAgICAgICAgIH0gLy8gdmFsaWRhdGVfaW50ZXJ2YWwKKworICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKCBpMSwgdDAsIHQsIHQxICk7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBzZXR0aW5nczogbnVsbCwgLy8gb3B0aW9uYWwsIHN1YmNsYXNz
LXNwZWNpZmljIHNldHRpbmdzIHN0cnVjdHVyZQorICAgICAgICAvLyBOb3RlOiBUaGUgaW5kaXJl
Y3Rpb24gYWxsb3dzIGNlbnRyYWwgY29udHJvbCBvZiBtYW55IGludGVycG9sYW50cy4KKworICAg
ICAgICAvLyAtLS0gUHJvdGVjdGVkIGludGVyZmFjZQorCisgICAgICAgIERlZmF1bHRTZXR0aW5n
c186IHt9LAorCisgICAgICAgIGdldFNldHRpbmdzXzogZnVuY3Rpb24oKSB7CisKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzLnNldHRpbmdzIHx8IHRoaXMuRGVmYXVsdFNldHRpbmdzXzsKKworICAg
ICAgICB9LAorCisgICAgICAgIGNvcHlTYW1wbGVWYWx1ZV86IGZ1bmN0aW9uKCBpbmRleCApIHsK
KworICAgICAgICAgICAgLy8gY29waWVzIGEgc2FtcGxlIHZhbHVlIHRvIHRoZSByZXN1bHQgYnVm
ZmVyCisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlciwKKyAgICAg
ICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcywKKyAgICAgICAgICAgICAgICBz
dHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBpbmRleCAq
IHN0cmlkZTsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsr
IGkgKSB7CisKKyAgICAgICAgICAgICAgICByZXN1bHRbIGkgXSA9IHZhbHVlc1sgb2Zmc2V0ICsg
aSBdOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAg
ICAgICAgfSwKKworICAgICAgICAvLyBUZW1wbGF0ZSBtZXRob2RzIGZvciBkZXJpdmVkIGNsYXNz
ZXM6CisKKyAgICAgICAgaW50ZXJwb2xhdGVfOiBmdW5jdGlvbiggaTEsIHQwLCB0LCB0MSApIHsK
KworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAiY2FsbCB0byBhYnN0cmFjdCBtZXRob2Qi
ICk7CisgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgc2hhbGwgcmV0dXJuIHRoaXMucmVz
dWx0QnVmZmVyCisKKyAgICAgICAgfSwKKworICAgICAgICBpbnRlcnZhbENoYW5nZWRfOiBmdW5j
dGlvbiggaTEsIHQwLCB0MSApIHsKKworICAgICAgICAgICAgLy8gZW1wdHkKKworICAgICAgICB9
CisKKyAgICB9ICk7CisKKyAgICAvLyFcIERFQ0xBUkUgQUxJQVMgQUZURVIgYXNzaWduIHByb3Rv
dHlwZSAhCisgICAgT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7CisKKyAg
ICAgICAgLy8oIDAsIHQsIHQwICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXIKKyAgICAgICAg
YmVmb3JlU3RhcnRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXywKKwor
ICAgICAgICAvLyggTi0xLCB0Ti0xLCB0ICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXIKKyAg
ICAgICAgYWZ0ZXJFbmRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXywK
KworICAgIH0gKTsKKworICAgIC8qKgorICAgICAqIEZhc3QgYW5kIHNpbXBsZSBjdWJpYyBzcGxp
bmUgaW50ZXJwb2xhbnQuCisgICAgICoKKyAgICAgKiBJdCB3YXMgZGVyaXZlZCBmcm9tIGEgSGVy
bWl0aWFuIGNvbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBmaXJzdCBkZXJpdmF0aXZlCisgICAgICog
YXQgZWFjaCBzYW1wbGUgcG9zaXRpb24gdG8gdGhlIGxpbmVhciBzbG9wZSBiZXR3ZWVuIG5laWdo
Ym9yaW5nIHBvc2l0aW9ucworICAgICAqIG92ZXIgdGhlaXIgcGFyYW1ldGVyIGludGVydmFsLgor
ICAgICAqCisgICAgICogQGF1dGhvciB0c2NodworICAgICAqLworCisgICAgZnVuY3Rpb24gQ3Vi
aWNJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNp
emUsIHJlc3VsdEJ1ZmZlciApIHsKKworICAgICAgICBJbnRlcnBvbGFudC5jYWxsKAorICAgICAg
ICAgICAgICAgIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVT
aXplLCByZXN1bHRCdWZmZXIgKTsKKworICAgICAgICB0aGlzLl93ZWlnaHRQcmV2ID0gLTA7Cisg
ICAgICAgIHRoaXMuX29mZnNldFByZXYgPSAtMDsKKyAgICAgICAgdGhpcy5fd2VpZ2h0TmV4dCA9
IC0wOworICAgICAgICB0aGlzLl9vZmZzZXROZXh0ID0gLTA7CisKKyAgICB9CisKKyAgICBDdWJp
Y0ludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIElu
dGVycG9sYW50LnByb3RvdHlwZSApLCB7CisKKyAgICAgICAgY29uc3RydWN0b3I6IEN1YmljSW50
ZXJwb2xhbnQsCisKKyAgICAgICAgRGVmYXVsdFNldHRpbmdzXzogeworCisgICAgICAgICAgICBl
bmRpbmdTdGFydDogICAgWmVyb0N1cnZhdHVyZUVuZGluZywKKyAgICAgICAgICAgIGVuZGluZ0Vu
ZDogICAgICBaZXJvQ3VydmF0dXJlRW5kaW5nCisKKyAgICAgICAgfSwKKworICAgICAgICBpbnRl
cnZhbENoYW5nZWRfOiBmdW5jdGlvbiggaTEsIHQwLCB0MSApIHsKKworICAgICAgICAgICAgdmFy
IHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsCisgICAgICAgICAgICAgICAgaVByZXYgPSBp
MSAtIDIsCisgICAgICAgICAgICAgICAgaU5leHQgPSBpMSArIDEsCisKKyAgICAgICAgICAgICAg
ICB0UHJldiA9IHBwWyBpUHJldiBdLAorICAgICAgICAgICAgICAgIHROZXh0ID0gcHBbIGlOZXh0
IF07CisKKyAgICAgICAgICAgIGlmICggdFByZXYgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAg
ICAgICAgICAgIHN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgY2FzZSBaZXJvU2xvcGVFbmRpbmc6CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIGYnKHQwKSA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlQcmV2
ID0gaTE7CisgICAgICAgICAgICAgICAgICAgICAgICB0UHJldiA9IDIgKiB0MCAtIHQxOworCisg
ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNl
IFdyYXBBcm91bmRFbmRpbmc6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUg
b3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZQorICAgICAgICAgICAgICAgICAgICAgICAgaVByZXYgPSBw
cC5sZW5ndGggLSAyOworICAgICAgICAgICAgICAgICAgICAgICAgdFByZXYgPSB0MCArIHBwWyBp
UHJldiBdIC0gcHBbIGlQcmV2ICsgMSBdOworCisgICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5n
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGYnJyh0MCkgPSAwIGEuay5hLiBOYXR1cmFs
IFNwbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgaVByZXYgPSBpMTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHRQcmV2ID0gdDE7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaWYgKCB0TmV4dCA9PT0gdW5kZWZpbmVkICkgeworCisgICAg
ICAgICAgICAgICAgc3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgY2FzZSBaZXJvU2xvcGVFbmRpbmc6CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIGYnKHROKSA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlOZXh0
ID0gaTE7CisgICAgICAgICAgICAgICAgICAgICAgICB0TmV4dCA9IDIgKiB0MSAtIHQwOworCisg
ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNl
IFdyYXBBcm91bmRFbmRpbmc6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUg
b3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZQorICAgICAgICAgICAgICAgICAgICAgICAgaU5leHQgPSAx
OworICAgICAgICAgICAgICAgICAgICAgICAgdE5leHQgPSB0MSArIHBwWyAxIF0gLSBwcFsgMCBd
OworCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAg
ICBkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nCisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIGYnJyh0TikgPSAwLCBhLmsuYS4gTmF0dXJhbCBTcGxpbmUKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlOZXh0ID0gaTEgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdE5leHQg
PSB0MDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICB2YXIgaGFsZkR0ID0gKCB0MSAtIHQwICkgKiAwLjUsCisgICAgICAgICAgICAgICAgc3RyaWRl
ID0gdGhpcy52YWx1ZVNpemU7CisKKyAgICAgICAgICAgIHRoaXMuX3dlaWdodFByZXYgPSBoYWxm
RHQgLyAoIHQwIC0gdFByZXYgKTsKKyAgICAgICAgICAgIHRoaXMuX3dlaWdodE5leHQgPSBoYWxm
RHQgLyAoIHROZXh0IC0gdDEgKTsKKyAgICAgICAgICAgIHRoaXMuX29mZnNldFByZXYgPSBpUHJl
diAqIHN0cmlkZTsKKyAgICAgICAgICAgIHRoaXMuX29mZnNldE5leHQgPSBpTmV4dCAqIHN0cmlk
ZTsKKworICAgICAgICB9LAorCisgICAgICAgIGludGVycG9sYXRlXzogZnVuY3Rpb24oIGkxLCB0
MCwgdCwgdDEgKSB7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZl
ciwKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcywKKyAgICAgICAg
ICAgICAgICBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKKworICAgICAgICAgICAgICAgIG8xID0g
aTEgKiBzdHJpZGUsICAgICAgIG8wID0gbzEgLSBzdHJpZGUsCisgICAgICAgICAgICAgICAgb1Ag
PSB0aGlzLl9vZmZzZXRQcmV2LCAgb04gPSB0aGlzLl9vZmZzZXROZXh0LAorICAgICAgICAgICAg
ICAgIHdQID0gdGhpcy5fd2VpZ2h0UHJldiwgIHdOID0gdGhpcy5fd2VpZ2h0TmV4dCwKKworICAg
ICAgICAgICAgICAgIHAgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICksCisgICAgICAgICAgICAg
ICAgcHAgPSBwICogcCwKKyAgICAgICAgICAgICAgICBwcHAgPSBwcCAqIHA7CisKKyAgICAgICAg
ICAgIC8vIGV2YWx1YXRlIHBvbHlub21pYWxzCisKKyAgICAgICAgICAgIHZhciBzUCA9ICAgICAt
IHdQICAgKiBwcHAgICArICAgICAgICAgMiAqIHdQICAgICogcHAgICAgLSAgICAgICAgICB3UCAg
ICogcDsKKyAgICAgICAgICAgIHZhciBzMCA9ICggMSArIHdQICkgKiBwcHAgICArICgtMS41IC0g
MiAqIHdQICkgICogcHAgICAgKyAoIC0wLjUgKyB3UCApICogcCAgICAgKyAxOworICAgICAgICAg
ICAgdmFyIHMxID0gKC0xIC0gd04gKSAqIHBwcCAgICsgKCAxLjUgKyAgIHdOICAgKSAgKiBwcCAg
ICArICAgIDAuNSAgICAgICAgKiBwOworICAgICAgICAgICAgdmFyIHNOID0gICAgICAgd04gICAq
IHBwcCAgIC0gICAgICAgICAgIHdOICAgICAgKiBwcDsKKworICAgICAgICAgICAgLy8gY29tYmlu
ZSBkYXRhIGxpbmVhcmx5CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3Ry
aWRlOyArKyBpICkgeworCisgICAgICAgICAgICAgICAgcmVzdWx0WyBpIF0gPQorICAgICAgICAg
ICAgICAgICAgICAgICAgc1AgKiB2YWx1ZXNbIG9QICsgaSBdICsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHMwICogdmFsdWVzWyBvMCArIGkgXSArCisgICAgICAgICAgICAgICAgICAgICAgICBz
MSAqIHZhbHVlc1sgbzEgKyBpIF0gKworICAgICAgICAgICAgICAgICAgICAgICAgc04gKiB2YWx1
ZXNbIG9OICsgaSBdOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1
bHQ7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhvciB0
c2NodworICAgICAqLworCisgICAgZnVuY3Rpb24gTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRl
clBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7CisK
KyAgICAgICAgSW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1w
bGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApOworCisgICAgfQorCisgICAgTGlu
ZWFySW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSgg
SW50ZXJwb2xhbnQucHJvdG90eXBlICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogTGluZWFy
SW50ZXJwb2xhbnQsCisKKyAgICAgICAgaW50ZXJwb2xhdGVfOiBmdW5jdGlvbiggaTEsIHQwLCB0
LCB0MSApIHsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLAor
ICAgICAgICAgICAgICAgIHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLAorICAgICAgICAgICAg
ICAgIHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLAorCisgICAgICAgICAgICAgICAgb2Zmc2V0MSA9
IGkxICogc3RyaWRlLAorICAgICAgICAgICAgICAgIG9mZnNldDAgPSBvZmZzZXQxIC0gc3RyaWRl
LAorCisgICAgICAgICAgICAgICAgd2VpZ2h0MSA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKSwK
KyAgICAgICAgICAgICAgICB3ZWlnaHQwID0gMSAtIHdlaWdodDE7CisKKyAgICAgICAgICAgIGZv
ciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkgeworCisgICAgICAgICAgICAgICAg
cmVzdWx0WyBpIF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzWyBvZmZzZXQwICsg
aSBdICogd2VpZ2h0MCArCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbIG9mZnNldDEg
KyBpIF0gKiB3ZWlnaHQxOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBy
ZXN1bHQ7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICoKKyAgICAg
KiBJbnRlcnBvbGFudCB0aGF0IGV2YWx1YXRlcyB0byB0aGUgc2FtcGxlIHZhbHVlIGF0IHRoZSBw
b3NpdGlvbiBwcmVjZWVkaW5nCisgICAgICogdGhlIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAq
IEBhdXRob3IgdHNjaHcKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIERpc2NyZXRlSW50ZXJwb2xh
bnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRC
dWZmZXIgKSB7CisKKyAgICAgICAgSW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9z
aXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApOworCisgICAg
fQorCisgICAgRGlzY3JldGVJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBP
YmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwgeworCisgICAgICAgIGNvbnN0
cnVjdG9yOiBEaXNjcmV0ZUludGVycG9sYW50LAorCisgICAgICAgIGludGVycG9sYXRlXzogZnVu
Y3Rpb24oIGkxLCB0MCwgdCwgdDEgKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmNvcHlT
YW1wbGVWYWx1ZV8oIGkxIC0gMSApOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIHZh
ciBLZXlmcmFtZVRyYWNrUHJvdG90eXBlOworCisgICAgS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSA9
IHsKKworICAgICAgICBUaW1lQnVmZmVyVHlwZTogRmxvYXQzMkFycmF5LAorICAgICAgICBWYWx1
ZUJ1ZmZlclR5cGU6IEZsb2F0MzJBcnJheSwKKworICAgICAgICBEZWZhdWx0SW50ZXJwb2xhdGlv
bjogSW50ZXJwb2xhdGVMaW5lYXIsCisKKyAgICAgICAgSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9k
RGlzY3JldGU6IGZ1bmN0aW9uICggcmVzdWx0ICkgeworCisgICAgICAgICAgICByZXR1cm4gbmV3
IERpc2NyZXRlSW50ZXJwb2xhbnQoCisgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXMsIHRo
aXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTsKKworICAgICAgICB9LAor
CisgICAgICAgIEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogZnVuY3Rpb24gKCByZXN1
bHQgKSB7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGluZWFySW50ZXJwb2xhbnQoCisgICAg
ICAgICAgICAgICAgICAgIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6
ZSgpLCByZXN1bHQgKTsKKworICAgICAgICB9LAorCisgICAgICAgIEludGVycG9sYW50RmFjdG9y
eU1ldGhvZFNtb290aDogZnVuY3Rpb24gKCByZXN1bHQgKSB7CisKKyAgICAgICAgICAgIHJldHVy
biBuZXcgQ3ViaWNJbnRlcnBvbGFudCgKKyAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcywg
dGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApOworCisgICAgICAgIH0s
CisKKyAgICAgICAgc2V0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKCBpbnRlcnBvbGF0aW9uICkg
eworCisgICAgICAgICAgICB2YXIgZmFjdG9yeU1ldGhvZDsKKworICAgICAgICAgICAgc3dpdGNo
ICggaW50ZXJwb2xhdGlvbiApIHsKKworICAgICAgICAgICAgICAgIGNhc2UgSW50ZXJwb2xhdGVE
aXNjcmV0ZToKKworICAgICAgICAgICAgICAgICAgICBmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRl
cnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTsKKworICAgICAgICAgICAgICAgICAgICBicmVh
azsKKworICAgICAgICAgICAgICAgIGNhc2UgSW50ZXJwb2xhdGVMaW5lYXI6CisKKyAgICAgICAg
ICAgICAgICAgICAgZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9k
TGluZWFyOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAg
Y2FzZSBJbnRlcnBvbGF0ZVNtb290aDoKKworICAgICAgICAgICAgICAgICAgICBmYWN0b3J5TWV0
aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg7CisKKyAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBmYWN0
b3J5TWV0aG9kID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgbWVzc2Fn
ZSA9ICJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiICsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHRoaXMuVmFsdWVUeXBlTmFtZSArICIga2V5ZnJhbWUgdHJhY2sgbmFtZWQgIiArIHRo
aXMubmFtZTsKKworICAgICAgICAgICAgICAgIGlmICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9
PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBk
ZWZhdWx0LCB1bmxlc3MgdGhlIGRlZmF1bHQgaXRzZWxmIGlzIG1lc3NlZCB1cAorICAgICAgICAg
ICAgICAgICAgICBpZiAoIGludGVycG9sYXRpb24gIT09IHRoaXMuRGVmYXVsdEludGVycG9sYXRp
b24gKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SW50ZXJwb2xhdGlvbigg
dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxz
ZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciggbWVzc2FnZSAp
OyAvLyBmYXRhbCwgaW4gdGhpcyBjYXNlCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuS2V5
ZnJhbWVUcmFja1Byb3RvdHlwZTonLCBtZXNzYWdlICk7CisgICAgICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQg
PSBmYWN0b3J5TWV0aG9kOworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0SW50ZXJwb2xhdGlv
bjogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBzd2l0Y2ggKCB0aGlzLmNyZWF0ZUludGVy
cG9sYW50ICkgeworCisgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9y
eU1ldGhvZERpc2NyZXRlOgorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlcnBvbGF0
ZURpc2NyZXRlOworCisgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9y
eU1ldGhvZExpbmVhcjoKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJwb2xhdGVM
aW5lYXI7CisKKyAgICAgICAgICAgICAgICBjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0
aG9kU21vb3RoOgorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlcnBvbGF0ZVNtb290
aDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0VmFsdWVTaXpl
OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgg
LyB0aGlzLnRpbWVzLmxlbmd0aDsKKworICAgICAgICB9LAorCisgICAgICAgIC8vIG1vdmUgYWxs
IGtleWZyYW1lcyBlaXRoZXIgZm9yd2FyZHMgb3IgYmFja3dhcmRzIGluIHRpbWUKKyAgICAgICAg
c2hpZnQ6IGZ1bmN0aW9uICggdGltZU9mZnNldCApIHsKKworICAgICAgICAgICAgaWYgKCB0aW1l
T2Zmc2V0ICE9PSAwLjAgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgdGltZXMgPSB0aGlzLnRp
bWVzOworCisgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3Ro
OyBpICE9PSBuOyArKyBpICkgeworCisgICAgICAgICAgICAgICAgICAgIHRpbWVzWyBpIF0gKz0g
dGltZU9mZnNldDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIC8vIHNjYWxlIGFs
bCBrZXlmcmFtZSB0aW1lcyBieSBhIGZhY3RvciAodXNlZnVsIGZvciBmcmFtZSA8LT4gc2Vjb25k
cyBjb252ZXJzaW9ucykKKyAgICAgICAgc2NhbGU6IGZ1bmN0aW9uICggdGltZVNjYWxlICkgewor
CisgICAgICAgICAgICBpZiAoIHRpbWVTY2FsZSAhPT0gMS4wICkgeworCisgICAgICAgICAgICAg
ICAgdmFyIHRpbWVzID0gdGhpcy50aW1lczsKKworICAgICAgICAgICAgICAgIGZvciAoIHZhciBp
ID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworICAgICAgICAgICAg
ICAgICAgICB0aW1lc1sgaSBdICo9IHRpbWVTY2FsZTsKKworICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAor
CisgICAgICAgIC8vIHJlbW92ZXMga2V5ZnJhbWVzIGJlZm9yZSBhbmQgYWZ0ZXIgYW5pbWF0aW9u
IHdpdGhvdXQgY2hhbmdpbmcgYW55IHZhbHVlcyB3aXRoaW4gdGhlIHJhbmdlIFtzdGFydFRpbWUs
IGVuZFRpbWVdLgorICAgICAgICAvLyBJTVBPUlRBTlQ6IFdlIGRvIG5vdCBzaGlmdCBhcm91bmQg
a2V5cyB0byB0aGUgc3RhcnQgb2YgdGhlIHRyYWNrIHRpbWUsIGJlY2F1c2UgZm9yIGludGVycG9s
YXRlZCBrZXlzIHRoaXMgd2lsbCBjaGFuZ2UgdGhlaXIgdmFsdWVzCisgICAgICAgIHRyaW06IGZ1
bmN0aW9uICggc3RhcnRUaW1lLCBlbmRUaW1lICkgeworCisgICAgICAgICAgICB2YXIgdGltZXMg
PSB0aGlzLnRpbWVzLAorICAgICAgICAgICAgICAgIG5LZXlzID0gdGltZXMubGVuZ3RoLAorICAg
ICAgICAgICAgICAgIGZyb20gPSAwLAorICAgICAgICAgICAgICAgIHRvID0gbktleXMgLSAxOwor
CisgICAgICAgICAgICB3aGlsZSAoIGZyb20gIT09IG5LZXlzICYmIHRpbWVzWyBmcm9tIF0gPCBz
dGFydFRpbWUgKSArKyBmcm9tOworICAgICAgICAgICAgd2hpbGUgKCB0byAhPT0gLSAxICYmIHRp
bWVzWyB0byBdID4gZW5kVGltZSApIC0tIHRvOworCisgICAgICAgICAgICArKyB0bzsgLy8gaW5j
bHVzaXZlIC0+IGV4Y2x1c2l2ZSBib3VuZAorCisgICAgICAgICAgICBpZiAoIGZyb20gIT09IDAg
fHwgdG8gIT09IG5LZXlzICkgeworCisgICAgICAgICAgICAgICAgLy8gZW1wdHkgdHJhY2tzIGFy
ZSBmb3JiaWRkZW4sIHNvIGtlZXAgYXQgbGVhc3Qgb25lIGtleWZyYW1lCisgICAgICAgICAgICAg
ICAgaWYgKCBmcm9tID49IHRvICkgdG8gPSBNYXRoLm1heCggdG8sIDEgKSwgZnJvbSA9IHRvIC0g
MTsKKworICAgICAgICAgICAgICAgIHZhciBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpOwor
ICAgICAgICAgICAgICAgIHRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0
aW1lcywgZnJvbSwgdG8gKTsKKyAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcyA9IEFuaW1hdGlv
blV0aWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlTbGljZSggdGhpcy52YWx1ZXMs
IGZyb20gKiBzdHJpZGUsIHRvICogc3RyaWRlICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICAvLyBlbnN1cmUgd2Ug
ZG8gbm90IGdldCBhIEdhcmJhZ2VJbkdhcmJhZ2VPdXQgc2l0dWF0aW9uLCBtYWtlIHN1cmUgdHJh
Y2tzIGFyZSBhdCBsZWFzdCBtaW5pbWFsbHkgdmlhYmxlCisgICAgICAgIHZhbGlkYXRlOiBmdW5j
dGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciB2YWxpZCA9IHRydWU7CisKKyAgICAgICAgICAg
IHZhciB2YWx1ZVNpemUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpOworICAgICAgICAgICAgaWYgKCB2
YWx1ZVNpemUgLSBNYXRoLmZsb29yKCB2YWx1ZVNpemUgKSAhPT0gMCApIHsKKworICAgICAgICAg
ICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrUHJvdG90eXBlOiBJbnZh
bGlkIHZhbHVlIHNpemUgaW4gdHJhY2suJywgdGhpcyApOworICAgICAgICAgICAgICAgIHZhbGlk
ID0gZmFsc2U7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHRpbWVzID0gdGhp
cy50aW1lcywKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnZhbHVlcywKKworICAgICAg
ICAgICAgICAgIG5LZXlzID0gdGltZXMubGVuZ3RoOworCisgICAgICAgICAgICBpZiAoIG5LZXlz
ID09PSAwICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvciggJ1RIUkVFLktleWZy
YW1lVHJhY2tQcm90b3R5cGU6IFRyYWNrIGlzIGVtcHR5LicsIHRoaXMgKTsKKyAgICAgICAgICAg
ICAgICB2YWxpZCA9IGZhbHNlOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBw
cmV2VGltZSA9IG51bGw7CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMDsgaSAhPT0gbktl
eXM7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgY3VyclRpbWUgPSB0aW1lc1sgaSBd
OworCisgICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgY3VyclRpbWUgPT09ICdudW1iZXInICYm
IGlzTmFOKCBjdXJyVGltZSApICkgeworCisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJy
b3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrUHJvdG90eXBlOiBUaW1lIGlzIG5vdCBhIHZhbGlkIG51
bWJlci4nLCB0aGlzLCBpLCBjdXJyVGltZSApOworICAgICAgICAgICAgICAgICAgICB2YWxpZCA9
IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIGlmICggcHJldlRpbWUgIT09IG51bGwgJiYgcHJldlRpbWUgPiBj
dXJyVGltZSApIHsKKworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUu
S2V5ZnJhbWVUcmFja1Byb3RvdHlwZTogT3V0IG9mIG9yZGVyIGtleXMuJywgdGhpcywgaSwgY3Vy
clRpbWUsIHByZXZUaW1lICk7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Cisg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgcHJldlRpbWUgPSBjdXJyVGltZTsKKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAoIHZhbHVlcyAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgaWYg
KCBBbmltYXRpb25VdGlscy5pc1R5cGVkQXJyYXkoIHZhbHVlcyApICkgeworCisgICAgICAgICAg
ICAgICAgICAgIGZvciAoIHZhciBpID0gMCwgbiA9IHZhbHVlcy5sZW5ndGg7IGkgIT09IG47ICsr
IGkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1sgaSBd
OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlzTmFOKCB2YWx1ZSApICkgeworCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1l
VHJhY2tQcm90b3R5cGU6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0aGlzLCBpLCB2
YWx1ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZhbGlkOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgLy8gcmVtb3ZlcyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyBhcyBjb21tb24gaW4g
bW9ycGggdGFyZ2V0IHNlcXVlbmNlcworICAgICAgICAvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCww
LDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKQorICAgICAgICBvcHRpbWl6ZTogZnVuY3Rpb24gKCkg
eworCisgICAgICAgICAgICB2YXIgdGltZXMgPSB0aGlzLnRpbWVzLAorICAgICAgICAgICAgICAg
IHZhbHVlcyA9IHRoaXMudmFsdWVzLAorICAgICAgICAgICAgICAgIHN0cmlkZSA9IHRoaXMuZ2V0
VmFsdWVTaXplKCksCisKKyAgICAgICAgICAgICAgICBzbW9vdGhJbnRlcnBvbGF0aW9uID0gdGhp
cy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IEludGVycG9sYXRlU21vb3RoLAorCisgICAgICAgICAg
ICAgICAgd3JpdGVJbmRleCA9IDEsCisgICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gdGltZXMu
bGVuZ3RoIC0gMTsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAxOyBpIDwgbGFzdEluZGV4
OyArKyBpICkgeworCisgICAgICAgICAgICAgICAgdmFyIGtlZXAgPSBmYWxzZTsKKworICAgICAg
ICAgICAgICAgIHZhciB0aW1lID0gdGltZXNbIGkgXTsKKyAgICAgICAgICAgICAgICB2YXIgdGlt
ZU5leHQgPSB0aW1lc1sgaSArIDEgXTsKKworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhZGph
Y2VudCBrZXlmcmFtZXMgc2NoZWR1bGVkIGF0IHRoZSBzYW1lIHRpbWUKKworICAgICAgICAgICAg
ICAgIGlmICggdGltZSAhPT0gdGltZU5leHQgJiYgKCBpICE9PSAxIHx8IHRpbWUgIT09IHRpbWVb
IDAgXSApICkgeworCisgICAgICAgICAgICAgICAgICAgIGlmICggISBzbW9vdGhJbnRlcnBvbGF0
aW9uICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdW5uZWNlc3Nhcnkg
a2V5ZnJhbWVzIHNhbWUgYXMgdGhlaXIgbmVpZ2hib3JzCisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHZhciBvZmZzZXQgPSBpICogc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG9mZnNldFAgPSBvZmZzZXQgLSBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
b2Zmc2V0TiA9IG9mZnNldCArIHN0cmlkZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9y
ICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbIG9mZnNldCArIGogXTsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggdmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0UCArIGogXSB8
fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgIT09IHZhbHVlc1sg
b2Zmc2V0TiArIGogXSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVw
ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uga2VlcCA9IHRydWU7CisKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAvLyBpbi1wbGFjZSBjb21wYWN0aW9uCisKKyAgICAgICAg
ICAgICAgICBpZiAoIGtlZXAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpICE9PSB3
cml0ZUluZGV4ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc1sgd3JpdGVJbmRl
eCBdID0gdGltZXNbIGkgXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlYWRPZmZz
ZXQgPSBpICogc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlT2Zmc2V0
ID0gd3JpdGVJbmRleCAqIHN0cmlkZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgg
dmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKQorCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGog
XTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgKysgd3Jp
dGVJbmRleDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAvLyBmbHVzaCBsYXN0IGtleWZyYW1lIChjb21wYWN0aW9uIGxvb2tzIGFoZWFkKQorCisg
ICAgICAgICAgICBpZiAoIGxhc3RJbmRleCA+IDAgKSB7CisKKyAgICAgICAgICAgICAgICB0aW1l
c1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGxhc3RJbmRleCBdOworCisgICAgICAgICAgICAgICAg
Zm9yICggdmFyIHJlYWRPZmZzZXQgPSBsYXN0SW5kZXggKiBzdHJpZGUsIHdyaXRlT2Zmc2V0ID0g
d3JpdGVJbmRleCAqIHN0cmlkZSwgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApCisKKyAgICAg
ICAgICAgICAgICAgICAgdmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9m
ZnNldCArIGogXTsKKworICAgICAgICAgICAgICAgICsrIHdyaXRlSW5kZXg7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaWYgKCB3cml0ZUluZGV4ICE9PSB0aW1lcy5sZW5ndGggKSB7
CisKKyAgICAgICAgICAgICAgICB0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGlj
ZSggdGltZXMsIDAsIHdyaXRlSW5kZXggKTsKKyAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcyA9
IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHZhbHVlcywgMCwgd3JpdGVJbmRleCAqIHN0cmlk
ZSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAg
ICAgIH0KKworICAgIH07CisKKyAgICBmdW5jdGlvbiBLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3Io
IG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7CisKKyAgICAgICAgaWYgKCBu
YW1lID09PSB1bmRlZmluZWQgKSB0aHJvdyBuZXcgRXJyb3IoICJ0cmFjayBuYW1lIGlzIHVuZGVm
aW5lZCIgKTsKKworICAgICAgICBpZiAoIHRpbWVzID09PSB1bmRlZmluZWQgfHwgdGltZXMubGVu
Z3RoID09PSAwICkgeworCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoICJubyBrZXlmcmFt
ZXMgaW4gdHJhY2sgbmFtZWQgIiArIG5hbWUgKTsKKworICAgICAgICB9CisKKyAgICAgICAgdGhp
cy5uYW1lID0gbmFtZTsKKworICAgICAgICB0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuY29u
dmVydEFycmF5KCB0aW1lcywgdGhpcy5UaW1lQnVmZmVyVHlwZSApOworICAgICAgICB0aGlzLnZh
bHVlcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdmFsdWVzLCB0aGlzLlZhbHVlQnVm
ZmVyVHlwZSApOworCisgICAgICAgIHRoaXMuc2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlv
biB8fCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7CisKKyAgICAgICAgdGhpcy52YWxpZGF0
ZSgpOworICAgICAgICB0aGlzLm9wdGltaXplKCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAg
KgorICAgICAqIEEgVHJhY2sgb2YgdmVjdG9yZWQga2V5ZnJhbWUgdmFsdWVzLgorICAgICAqCisg
ICAgICoKKyAgICAgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLworICAg
ICAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworICAgICAqIEBh
dXRob3IgdHNjaHcKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFZlY3RvcktleWZyYW1lVHJhY2so
IG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7CisKKyAgICAgICAgS2V5ZnJh
bWVUcmFja0NvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVy
cG9sYXRpb24gKTsKKworICAgIH0KKworICAgIFZlY3RvcktleWZyYW1lVHJhY2sucHJvdG90eXBl
ID0KKyAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJh
Y2tQcm90b3R5cGUgKSwgeworCisgICAgICAgIGNvbnN0cnVjdG9yOiBWZWN0b3JLZXlmcmFtZVRy
YWNrLAorCisgICAgICAgIFZhbHVlVHlwZU5hbWU6ICd2ZWN0b3InCisKKyAgICAgICAgLy8gVmFs
dWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZAorCisgICAgICAgIC8vIERlZmF1bHRJbnRlcnBvbGF0
aW9uIGlzIGluaGVyaXRlZAorCisgICAgfSApOworCisgICAgLyoqCisgICAgICogU3BoZXJpY2Fs
IGxpbmVhciB1bml0IHF1YXRlcm5pb24gaW50ZXJwb2xhbnQuCisgICAgICoKKyAgICAgKiBAYXV0
aG9yIHRzY2h3CisgICAgICovCisKKyAgICBmdW5jdGlvbiBRdWF0ZXJuaW9uTGluZWFySW50ZXJw
b2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1
bHRCdWZmZXIgKSB7CisKKyAgICAgICAgSW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVy
UG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApOworCisg
ICAgfQorCisgICAgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVj
dC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7CisKKyAg
ICAgICAgY29uc3RydWN0b3I6IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCwKKworICAgICAg
ICBpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uKCBpMSwgdDAsIHQsIHQxICkgeworCisgICAgICAgICAg
ICB2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsCisgICAgICAgICAgICAgICAgdmFsdWVz
ID0gdGhpcy5zYW1wbGVWYWx1ZXMsCisgICAgICAgICAgICAgICAgc3RyaWRlID0gdGhpcy52YWx1
ZVNpemUsCisKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBpMSAqIHN0cmlkZSwKKworICAgICAg
ICAgICAgICAgIGFscGhhID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApOworCisgICAgICAgICAg
ICBmb3IgKCB2YXIgZW5kID0gb2Zmc2V0ICsgc3RyaWRlOyBvZmZzZXQgIT09IGVuZDsgb2Zmc2V0
ICs9IDQgKSB7CisKKyAgICAgICAgICAgICAgICBRdWF0ZXJuaW9uLnNsZXJwRmxhdCggcmVzdWx0
LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBvZmZzZXQgLSBzdHJpZGUsIHZh
bHVlcywgb2Zmc2V0LCBhbHBoYSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJl
dHVybiByZXN1bHQ7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICoK
KyAgICAgKiBBIFRyYWNrIG9mIHF1YXRlcm5pb24ga2V5ZnJhbWUgdmFsdWVzLgorICAgICAqCisg
ICAgICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KKyAgICAgKiBAYXV0
aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KKyAgICAgKiBAYXV0aG9yIHRz
Y2h3CisgICAgICovCisKKyAgICBmdW5jdGlvbiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayggbmFt
ZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHsKKworICAgICAgICBLZXlmcmFtZVRy
YWNrQ29uc3RydWN0b3IuY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xh
dGlvbiApOworCisgICAgfQorCisgICAgUXVhdGVybmlvbktleWZyYW1lVHJhY2sucHJvdG90eXBl
ID0KKyAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJh
Y2tQcm90b3R5cGUgKSwgeworCisgICAgICAgIGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uS2V5ZnJh
bWVUcmFjaywKKworICAgICAgICBWYWx1ZVR5cGVOYW1lOiAncXVhdGVybmlvbicsCisKKyAgICAg
ICAgLy8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZAorCisgICAgICAgIERlZmF1bHRJbnRl
cnBvbGF0aW9uOiBJbnRlcnBvbGF0ZUxpbmVhciwKKworICAgICAgICBJbnRlcnBvbGFudEZhY3Rv
cnlNZXRob2RMaW5lYXI6IGZ1bmN0aW9uKCByZXN1bHQgKSB7CisKKyAgICAgICAgICAgIHJldHVy
biBuZXcgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50KAorICAgICAgICAgICAgICAgICAgICB0
aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7CisK
KyAgICAgICAgfSwKKworICAgICAgICBJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVu
ZGVmaW5lZCAvLyBub3QgeWV0IGltcGxlbWVudGVkCisKKyAgICB9ICk7CisKKyAgICAvKioKKyAg
ICAgKgorICAgICAqIEEgVHJhY2sgb2YgbnVtZXJpYyBrZXlmcmFtZSB2YWx1ZXMuCisgICAgICoK
KyAgICAgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLworICAgICAqIEBh
dXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworICAgICAqIEBhdXRob3Ig
dHNjaHcKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIE51bWJlcktleWZyYW1lVHJhY2soIG5hbWUs
IHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7CisKKyAgICAgICAgS2V5ZnJhbWVUcmFj
a0NvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRp
b24gKTsKKworICAgIH0KKworICAgIE51bWJlcktleWZyYW1lVHJhY2sucHJvdG90eXBlID0KKyAg
ICAgICAgICAgIE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2tQcm90
b3R5cGUgKSwgeworCisgICAgICAgIGNvbnN0cnVjdG9yOiBOdW1iZXJLZXlmcmFtZVRyYWNrLAor
CisgICAgICAgIFZhbHVlVHlwZU5hbWU6ICdudW1iZXInCisKKyAgICAgICAgLy8gVmFsdWVCdWZm
ZXJUeXBlIGlzIGluaGVyaXRlZAorCisgICAgICAgIC8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlz
IGluaGVyaXRlZAorCisgICAgfSApOworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBBIFRyYWNr
IHRoYXQgaW50ZXJwb2xhdGVzIFN0cmluZ3MKKyAgICAgKgorICAgICAqCisgICAgICogQGF1dGhv
ciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KKyAgICAgKiBAYXV0aG9yIERhdmlkIFNh
cm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KKyAgICAgKiBAYXV0aG9yIHRzY2h3CisgICAgICov
CisKKyAgICBmdW5jdGlvbiBTdHJpbmdLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVz
LCBpbnRlcnBvbGF0aW9uICkgeworCisgICAgICAgIEtleWZyYW1lVHJhY2tDb25zdHJ1Y3Rvci5j
YWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7CisKKyAgICB9
CisKKyAgICBTdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9CisgICAgICAgICAgICBPYmpl
Y3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrUHJvdG90eXBlICksIHsKKwor
ICAgICAgICBjb25zdHJ1Y3RvcjogU3RyaW5nS2V5ZnJhbWVUcmFjaywKKworICAgICAgICBWYWx1
ZVR5cGVOYW1lOiAnc3RyaW5nJywKKyAgICAgICAgVmFsdWVCdWZmZXJUeXBlOiBBcnJheSwKKwor
ICAgICAgICBEZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSwKKworICAg
ICAgICBJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCwKKworICAgICAg
ICBJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZAorCisgICAgfSApOwor
CisgICAgLyoqCisgICAgICoKKyAgICAgKiBBIFRyYWNrIG9mIEJvb2xlYW4ga2V5ZnJhbWUgdmFs
dWVzLgorICAgICAqCisgICAgICoKKyAgICAgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDov
L2NsYXJhLmlvLworICAgICAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVz
LnVzLworICAgICAqIEBhdXRob3IgdHNjaHcKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIEJvb2xl
YW5LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzICkgeworCisgICAgICAgIEtleWZy
YW1lVHJhY2tDb25zdHJ1Y3Rvci5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzICk7CisK
KyAgICB9CisKKyAgICBCb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPQorICAgICAgICAg
ICAgT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSAp
LCB7CisKKyAgICAgICAgY29uc3RydWN0b3I6IEJvb2xlYW5LZXlmcmFtZVRyYWNrLAorCisgICAg
ICAgIFZhbHVlVHlwZU5hbWU6ICdib29sJywKKyAgICAgICAgVmFsdWVCdWZmZXJUeXBlOiBBcnJh
eSwKKworICAgICAgICBEZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSwK
KworICAgICAgICBJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCwKKyAg
ICAgICAgSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWQKKworICAgICAg
ICAvLyBOb3RlOiBBY3R1YWxseSB0aGlzIHRyYWNrIGNvdWxkIGhhdmUgYSBvcHRpbWl6ZWQgLyBj
b21wcmVzc2VkCisgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGFu
ZCBhIGN1c3RvbSBpbnRlcnBvbGFudCB0aGF0CisgICAgICAgIC8vIGNvbXB1dGVzICJmaXJzdFZh
bHVlIF4gaXNPZGQoIGluZGV4ICkiLgorCisgICAgfSApOworCisgICAgLyoqCisgICAgICoKKyAg
ICAgKiBBIFRyYWNrIG9mIGtleWZyYW1lIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBjb2xvci4KKyAg
ICAgKgorICAgICAqCisgICAgICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5p
by8KKyAgICAgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KKyAg
ICAgKiBAYXV0aG9yIHRzY2h3CisgICAgICovCisKKyAgICBmdW5jdGlvbiBDb2xvcktleWZyYW1l
VHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7CisKKyAgICAgICAg
S2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMs
IGludGVycG9sYXRpb24gKTsKKworICAgIH0KKworICAgIENvbG9yS2V5ZnJhbWVUcmFjay5wcm90
b3R5cGUgPQorICAgICAgICAgICAgT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJh
bWVUcmFja1Byb3RvdHlwZSApLCB7CisKKyAgICAgICAgY29uc3RydWN0b3I6IENvbG9yS2V5ZnJh
bWVUcmFjaywKKworICAgICAgICBWYWx1ZVR5cGVOYW1lOiAnY29sb3InCisKKyAgICAgICAgLy8g
VmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZAorCisgICAgICAgIC8vIERlZmF1bHRJbnRlcnBv
bGF0aW9uIGlzIGluaGVyaXRlZAorCisKKyAgICAgICAgLy8gTm90ZTogVmVyeSBiYXNpYyBpbXBs
ZW1lbnRhdGlvbiBhbmQgbm90aGluZyBzcGVjaWFsIHlldC4KKyAgICAgICAgLy8gSG93ZXZlciwg
dGhpcyBpcyB0aGUgcGxhY2UgZm9yIGNvbG9yIHNwYWNlIHBhcmFtZXRlcml6YXRpb24uCisKKyAg
ICB9ICk7CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEEgdGltZWQgc2VxdWVuY2Ugb2Yga2V5
ZnJhbWVzIGZvciBhIHNwZWNpZmljIHByb3BlcnR5LgorICAgICAqCisgICAgICoKKyAgICAgKiBA
YXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLworICAgICAqIEBhdXRob3IgRGF2
aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLworICAgICAqIEBhdXRob3IgdHNjaHcKKyAg
ICAgKi8KKworICAgIGZ1bmN0aW9uIEtleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMs
IGludGVycG9sYXRpb24gKSB7CisKKyAgICAgICAgS2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yLmFw
cGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKworICAgIH0KKworICAgIEtleWZyYW1lVHJhY2sucHJv
dG90eXBlID0gS2V5ZnJhbWVUcmFja1Byb3RvdHlwZTsKKyAgICBLZXlmcmFtZVRyYWNrUHJvdG90
eXBlLmNvbnN0cnVjdG9yID0gS2V5ZnJhbWVUcmFjazsKKworICAgIC8vIFN0YXRpYyBtZXRob2Rz
OgorCisgICAgT2JqZWN0LmFzc2lnbiggS2V5ZnJhbWVUcmFjaywgeworCisgICAgICAgIC8vIFNl
cmlhbGl6YXRpb24gKGluIHN0YXRpYyBjb250ZXh0LCBiZWNhdXNlIG9mIGNvbnN0cnVjdG9yIGlu
dm9jYXRpb24KKyAgICAgICAgLy8gYW5kIGF1dG9tYXRpYyBpbnZvY2F0aW9uIG9mIC50b0pTT04p
OgorCisgICAgICAgIHBhcnNlOiBmdW5jdGlvbigganNvbiApIHsKKworICAgICAgICAgICAgaWYo
IGpzb24udHlwZSA9PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3
IEVycm9yKCAidHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UiICk7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHRyYWNrVHlwZSA9IEtleWZyYW1lVHJhY2suX2dl
dFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUoIGpzb24udHlwZSApOworCisgICAgICAgICAgICBp
ZiAoIGpzb24udGltZXMgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIHZhciB0
aW1lcyA9IFtdLCB2YWx1ZXMgPSBbXTsKKworICAgICAgICAgICAgICAgIEFuaW1hdGlvblV0aWxz
LmZsYXR0ZW5KU09OKCBqc29uLmtleXMsIHRpbWVzLCB2YWx1ZXMsICd2YWx1ZScgKTsKKworICAg
ICAgICAgICAgICAgIGpzb24udGltZXMgPSB0aW1lczsKKyAgICAgICAgICAgICAgICBqc29uLnZh
bHVlcyA9IHZhbHVlczsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZXJpdmVk
IGNsYXNzZXMgY2FuIGRlZmluZSBhIHN0YXRpYyBwYXJzZSBtZXRob2QKKyAgICAgICAgICAgIGlm
ICggdHJhY2tUeXBlLnBhcnNlICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJhY2tUeXBlLnBhcnNlKCBqc29uICk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisK
KyAgICAgICAgICAgICAgICAvLyBieSBkZWZhdWx0LCB3ZSBhc3NzdW1lIGEgY29uc3RydWN0b3Ig
Y29tcGF0aWJsZSB3aXRoIHRoZSBiYXNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0cmFj
a1R5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICBqc29uLm5hbWUsIGpzb24udGltZXMsIGpz
b24udmFsdWVzLCBqc29uLmludGVycG9sYXRpb24gKTsKKworICAgICAgICAgICAgfQorCisgICAg
ICAgIH0sCisKKyAgICAgICAgdG9KU09OOiBmdW5jdGlvbiggdHJhY2sgKSB7CisKKyAgICAgICAg
ICAgIHZhciB0cmFja1R5cGUgPSB0cmFjay5jb25zdHJ1Y3RvcjsKKworICAgICAgICAgICAgdmFy
IGpzb247CisKKyAgICAgICAgICAgIC8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3Rh
dGljIHRvSlNPTiBtZXRob2QKKyAgICAgICAgICAgIGlmICggdHJhY2tUeXBlLnRvSlNPTiAhPT0g
dW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAganNvbiA9IHRyYWNrVHlwZS50b0pTT04o
IHRyYWNrICk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvLyBi
eSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhlIGRhdGEgY2FuIGJlIHNlcmlhbGl6ZWQgYXMtaXMKKyAg
ICAgICAgICAgICAgICBqc29uID0geworCisgICAgICAgICAgICAgICAgICAgICduYW1lJzogdHJh
Y2submFtZSwKKyAgICAgICAgICAgICAgICAgICAgJ3RpbWVzJzogQW5pbWF0aW9uVXRpbHMuY29u
dmVydEFycmF5KCB0cmFjay50aW1lcywgQXJyYXkgKSwKKyAgICAgICAgICAgICAgICAgICAgJ3Zh
bHVlcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudmFsdWVzLCBBcnJheSAp
CisKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgdmFyIGludGVycG9sYXRp
b24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGlu
dGVycG9sYXRpb24gIT09IHRyYWNrLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkgeworCisgICAgICAg
ICAgICAgICAgICAgIGpzb24uaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb247CisKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAganNvbi50eXBlID0g
dHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5CisKKyAgICAgICAgICAgIHJldHVybiBq
c29uOworCisgICAgICAgIH0sCisKKyAgICAgICAgX2dldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5h
bWU6IGZ1bmN0aW9uKCB0eXBlTmFtZSApIHsKKworICAgICAgICAgICAgc3dpdGNoKCB0eXBlTmFt
ZS50b0xvd2VyQ2FzZSgpICkgeworCisgICAgICAgICAgICAgICAgY2FzZSAic2NhbGFyIjoKKyAg
ICAgICAgICAgICAgICBjYXNlICJkb3VibGUiOgorICAgICAgICAgICAgICAgIGNhc2UgImZsb2F0
IjoKKyAgICAgICAgICAgICAgICBjYXNlICJudW1iZXIiOgorICAgICAgICAgICAgICAgIGNhc2Ug
ImludGVnZXIiOgorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXJLZXlmcmFtZVRy
YWNrOworCisgICAgICAgICAgICAgICAgY2FzZSAidmVjdG9yIjoKKyAgICAgICAgICAgICAgICBj
YXNlICJ2ZWN0b3IyIjoKKyAgICAgICAgICAgICAgICBjYXNlICJ2ZWN0b3IzIjoKKyAgICAgICAg
ICAgICAgICBjYXNlICJ2ZWN0b3I0IjoKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmVj
dG9yS2V5ZnJhbWVUcmFjazsKKworICAgICAgICAgICAgICAgIGNhc2UgImNvbG9yIjoKKworICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3JLZXlmcmFtZVRyYWNrOworCisgICAgICAgICAg
ICAgICAgY2FzZSAicXVhdGVybmlvbiI6CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFF1
YXRlcm5pb25LZXlmcmFtZVRyYWNrOworCisgICAgICAgICAgICAgICAgY2FzZSAiYm9vbCI6Cisg
ICAgICAgICAgICAgICAgY2FzZSAiYm9vbGVhbiI6CisKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIEJvb2xlYW5LZXlmcmFtZVRyYWNrOworCisgICAgICAgICAgICAgICAgY2FzZSAic3RyaW5n
IjoKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nS2V5ZnJhbWVUcmFjazsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoICJVbnN1cHBvcnRl
ZCB0eXBlTmFtZTogIiArIHR5cGVOYW1lICk7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisg
ICAgLyoqCisgICAgICoKKyAgICAgKiBSZXVzYWJsZSBzZXQgb2YgVHJhY2tzIHRoYXQgcmVwcmVz
ZW50IGFuIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBo
dHRwOi8vY2xhcmEuaW8vCisgICAgICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdo
dGhhdXMudXMvCisgICAgICovCisKKyAgICBmdW5jdGlvbiBBbmltYXRpb25DbGlwKCBuYW1lLCBk
dXJhdGlvbiwgdHJhY2tzICkgeworCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAg
IHRoaXMudHJhY2tzID0gdHJhY2tzOworICAgICAgICB0aGlzLmR1cmF0aW9uID0gKCBkdXJhdGlv
biAhPT0gdW5kZWZpbmVkICkgPyBkdXJhdGlvbiA6IC0gMTsKKworICAgICAgICB0aGlzLnV1aWQg
PSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKKworICAgICAgICAvLyB0aGlzIG1lYW5zIGl0IHNob3Vs
ZCBmaWd1cmUgb3V0IGl0cyBkdXJhdGlvbiBieSBzY2FubmluZyB0aGUgdHJhY2tzCisgICAgICAg
IGlmICggdGhpcy5kdXJhdGlvbiA8IDAgKSB7CisKKyAgICAgICAgICAgIHRoaXMucmVzZXREdXJh
dGlvbigpOworCisgICAgICAgIH0KKworICAgICAgICB0aGlzLm9wdGltaXplKCk7CisKKyAgICB9
CisKKyAgICBPYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLCB7CisKKyAgICAgICAgcGFyc2U6
IGZ1bmN0aW9uICgganNvbiApIHsKKworICAgICAgICAgICAgdmFyIHRyYWNrcyA9IFtdLAorICAg
ICAgICAgICAgICAgIGpzb25UcmFja3MgPSBqc29uLnRyYWNrcywKKyAgICAgICAgICAgICAgICBm
cmFtZVRpbWUgPSAxLjAgLyAoIGpzb24uZnBzIHx8IDEuMCApOworCisgICAgICAgICAgICBmb3Ig
KCB2YXIgaSA9IDAsIG4gPSBqc29uVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKwor
ICAgICAgICAgICAgICAgIHRyYWNrcy5wdXNoKCBLZXlmcmFtZVRyYWNrLnBhcnNlKCBqc29uVHJh
Y2tzWyBpIF0gKS5zY2FsZSggZnJhbWVUaW1lICkgKTsKKworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICByZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIGpzb24ubmFtZSwganNvbi5kdXJhdGlv
biwgdHJhY2tzICk7CisKKyAgICAgICAgfSwKKworICAgICAgICB0b0pTT046IGZ1bmN0aW9uICgg
Y2xpcCApIHsKKworICAgICAgICAgICAgdmFyIHRyYWNrcyA9IFtdLAorICAgICAgICAgICAgICAg
IGNsaXBUcmFja3MgPSBjbGlwLnRyYWNrczsKKworICAgICAgICAgICAgdmFyIGpzb24gPSB7CisK
KyAgICAgICAgICAgICAgICAnbmFtZSc6IGNsaXAubmFtZSwKKyAgICAgICAgICAgICAgICAnZHVy
YXRpb24nOiBjbGlwLmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICd0cmFja3MnOiB0cmFja3MK
KworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBuID0gY2xp
cFRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKyAgICAgICAgICAgICAgICB0cmFj
a3MucHVzaCggS2V5ZnJhbWVUcmFjay50b0pTT04oIGNsaXBUcmFja3NbIGkgXSApICk7CisKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGpzb247CisKKyAgICAgICAgfSwKKwor
ICAgICAgICBDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZTogZnVuY3Rpb24gKCBuYW1lLCBt
b3JwaFRhcmdldFNlcXVlbmNlLCBmcHMsIG5vTG9vcCApIHsKKworICAgICAgICAgICAgdmFyIG51
bU1vcnBoVGFyZ2V0cyA9IG1vcnBoVGFyZ2V0U2VxdWVuY2UubGVuZ3RoOworICAgICAgICAgICAg
dmFyIHRyYWNrcyA9IFtdOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBudW1N
b3JwaFRhcmdldHM7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgdGltZXMgPSBbXTsK
KyAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gW107CisKKyAgICAgICAgICAgICAgICB0aW1l
cy5wdXNoKAorICAgICAgICAgICAgICAgICAgICAgICAgKCBpICsgbnVtTW9ycGhUYXJnZXRzIC0g
MSApICUgbnVtTW9ycGhUYXJnZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICggaSArIDEgKSAlIG51bU1vcnBoVGFyZ2V0cyApOworCisgICAg
ICAgICAgICAgICAgdmFsdWVzLnB1c2goIDAsIDEsIDAgKTsKKworICAgICAgICAgICAgICAgIHZh
ciBvcmRlciA9IEFuaW1hdGlvblV0aWxzLmdldEtleWZyYW1lT3JkZXIoIHRpbWVzICk7CisgICAg
ICAgICAgICAgICAgdGltZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdGltZXMsIDEs
IG9yZGVyICk7CisgICAgICAgICAgICAgICAgdmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuc29ydGVk
QXJyYXkoIHZhbHVlcywgMSwgb3JkZXIgKTsKKworICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJl
IGlzIGEga2V5IGF0IHRoZSBmaXJzdCBmcmFtZSwgZHVwbGljYXRlIGl0IGFzIHRoZQorICAgICAg
ICAgICAgICAgIC8vIGxhc3QgZnJhbWUgYXMgd2VsbCBmb3IgcGVyZmVjdCBsb29wLgorICAgICAg
ICAgICAgICAgIGlmICggISBub0xvb3AgJiYgdGltZXNbIDAgXSA9PT0gMCApIHsKKworICAgICAg
ICAgICAgICAgICAgICB0aW1lcy5wdXNoKCBudW1Nb3JwaFRhcmdldHMgKTsKKyAgICAgICAgICAg
ICAgICAgICAgdmFsdWVzLnB1c2goIHZhbHVlc1sgMCBdICk7CisKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICB0cmFja3MucHVzaCgKKyAgICAgICAgICAgICAgICAgICAgICAg
IG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcu
bW9ycGhUYXJnZXRJbmZsdWVuY2VzWycgKyBtb3JwaFRhcmdldFNlcXVlbmNlWyBpIF0ubmFtZSAr
ICddJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcywgdmFsdWVzCisgICAgICAg
ICAgICAgICAgICAgICAgICApLnNjYWxlKCAxLjAgLyBmcHMgKSApOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uQ2xpcCggbmFtZSwgLSAxLCB0cmFj
a3MgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGZpbmRCeU5hbWU6IGZ1bmN0aW9uICggb2Jq
ZWN0T3JDbGlwQXJyYXksIG5hbWUgKSB7CisKKyAgICAgICAgICAgIHZhciBjbGlwQXJyYXkgPSBv
YmplY3RPckNsaXBBcnJheTsKKworICAgICAgICAgICAgaWYgKCAhIEFycmF5LmlzQXJyYXkoIG9i
amVjdE9yQ2xpcEFycmF5ICkgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgbyA9IG9iamVjdE9y
Q2xpcEFycmF5OworICAgICAgICAgICAgICAgIGNsaXBBcnJheSA9IG8uZ2VvbWV0cnkgJiYgby5n
ZW9tZXRyeS5hbmltYXRpb25zIHx8IG8uYW5pbWF0aW9uczsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBjbGlwQXJyYXkubGVuZ3RoOyBpICsrICkg
eworCisgICAgICAgICAgICAgICAgaWYgKCBjbGlwQXJyYXlbIGkgXS5uYW1lID09PSBuYW1lICkg
eworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGlwQXJyYXlbIGkgXTsKKworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsK
KworICAgICAgICB9LAorCisgICAgICAgIENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVu
Y2VzOiBmdW5jdGlvbiAoIG1vcnBoVGFyZ2V0cywgZnBzLCBub0xvb3AgKSB7CisKKyAgICAgICAg
ICAgIHZhciBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyA9IHt9OworCisgICAgICAgICAgICAvLyB0
ZXN0ZWQgd2l0aCBodHRwczovL3JlZ2V4MTAxLmNvbS8gb24gdHJpY2sgc2VxdWVuY2VzCisgICAg
ICAgICAgICAvLyBzdWNoIGZsYW1pbmdvX2ZseUFfMDAzLCBmbGFtaW5nb19ydW4xXzAwMywgY3Jk
ZWF0aDAwNTkKKyAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gL14oW1x3LV0qPykoW1xkXSspJC87
CisKKyAgICAgICAgICAgIC8vIHNvcnQgbW9ycGggdGFyZ2V0IG5hbWVzIGludG8gYW5pbWF0aW9u
IGdyb3VwcyBiYXNlZAorICAgICAgICAgICAgLy8gcGF0dGVybnMgbGlrZSBXYWxrXzAwMSwgV2Fs
a18wMDIsIFJ1bl8wMDEsIFJ1bl8wMDIKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwgaWwg
PSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAg
ICB2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTsKKyAgICAgICAgICAgICAgICB2
YXIgcGFydHMgPSBtb3JwaFRhcmdldC5uYW1lLm1hdGNoKCBwYXR0ZXJuICk7CisKKyAgICAgICAg
ICAgICAgICBpZiAoIHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgdmFyIG5hbWUgPSBwYXJ0c1sgMSBdOworCisgICAgICAgICAgICAgICAgICAgIHZh
ciBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBd
OworICAgICAgICAgICAgICAgICAgICBpZiAoICEgYW5pbWF0aW9uTW9ycGhUYXJnZXRzICkgewor
CisgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBd
ID0gYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gW107CisKKyAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cy5wdXNoKCBtb3JwaFRh
cmdldCApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIHZhciBjbGlwcyA9IFtdOworCisgICAgICAgICAgICBmb3IgKCB2YXIgbmFtZSBpbiBhbmlt
YXRpb25Ub01vcnBoVGFyZ2V0cyApIHsKKworICAgICAgICAgICAgICAgIGNsaXBzLnB1c2goIEFu
aW1hdGlvbkNsaXAuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoIG5hbWUsIGFuaW1hdGlv
blRvTW9ycGhUYXJnZXRzWyBuYW1lIF0sIGZwcywgbm9Mb29wICkgKTsKKworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICByZXR1cm4gY2xpcHM7CisKKyAgICAgICAgfSwKKworICAgICAgICAv
LyBwYXJzZSB0aGUgYW5pbWF0aW9uLmhpZXJhcmNoeSBmb3JtYXQKKyAgICAgICAgcGFyc2VBbmlt
YXRpb246IGZ1bmN0aW9uICggYW5pbWF0aW9uLCBib25lcyApIHsKKworICAgICAgICAgICAgaWYg
KCAhIGFuaW1hdGlvbiApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJF
RS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLicgKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICB2YXIgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uICggdHJhY2tUeXBlLCB0cmFja05hbWUs
IGFuaW1hdGlvbktleXMsIHByb3BlcnR5TmFtZSwgZGVzdFRyYWNrcyApIHsKKworICAgICAgICAg
ICAgICAgIC8vIG9ubHkgcmV0dXJuIHRyYWNrIGlmIHRoZXJlIGFyZSBhY3R1YWxseSBrZXlzLgor
ICAgICAgICAgICAgICAgIGlmICggYW5pbWF0aW9uS2V5cy5sZW5ndGggIT09IDAgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgdmFyIHRpbWVzID0gW107CisgICAgICAgICAgICAgICAgICAgIHZh
ciB2YWx1ZXMgPSBbXTsKKworICAgICAgICAgICAgICAgICAgICBBbmltYXRpb25VdGlscy5mbGF0
dGVuSlNPTiggYW5pbWF0aW9uS2V5cywgdGltZXMsIHZhbHVlcywgcHJvcGVydHlOYW1lICk7CisK
KyAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkga2V5cyBhcmUgZmlsdGVyZWQgb3V0LCBzbyBj
aGVjayBhZ2FpbgorICAgICAgICAgICAgICAgICAgICBpZiAoIHRpbWVzLmxlbmd0aCAhPT0gMCAp
IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFRyYWNrcy5wdXNoKCBuZXcgdHJhY2tU
eXBlKCB0cmFja05hbWUsIHRpbWVzLCB2YWx1ZXMgKSApOworCisgICAgICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAg
dmFyIHRyYWNrcyA9IFtdOworCisgICAgICAgICAgICB2YXIgY2xpcE5hbWUgPSBhbmltYXRpb24u
bmFtZSB8fCAnZGVmYXVsdCc7CisgICAgICAgICAgICAvLyBhdXRvbWF0aWMgbGVuZ3RoIGRldGVy
bWluYXRpb24gaW4gQW5pbWF0aW9uQ2xpcC4KKyAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IGFu
aW1hdGlvbi5sZW5ndGggfHwgLSAxOworICAgICAgICAgICAgdmFyIGZwcyA9IGFuaW1hdGlvbi5m
cHMgfHwgMzA7CisKKyAgICAgICAgICAgIHZhciBoaWVyYXJjaHlUcmFja3MgPSBhbmltYXRpb24u
aGllcmFyY2h5IHx8IFtdOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaCA9IDA7IGggPCBoaWVy
YXJjaHlUcmFja3MubGVuZ3RoOyBoICsrICkgeworCisgICAgICAgICAgICAgICAgdmFyIGFuaW1h
dGlvbktleXMgPSBoaWVyYXJjaHlUcmFja3NbIGggXS5rZXlzOworCisgICAgICAgICAgICAgICAg
Ly8gc2tpcCBlbXB0eSB0cmFja3MKKyAgICAgICAgICAgICAgICBpZiAoICEgYW5pbWF0aW9uS2V5
cyB8fCBhbmltYXRpb25LZXlzLmxlbmd0aCA9PT0gMCApIGNvbnRpbnVlOworCisgICAgICAgICAg
ICAgICAgLy8gcHJvY2VzcyBtb3JwaCB0YXJnZXRzCisgICAgICAgICAgICAgICAgaWYgKCBhbmlt
YXRpb25LZXlzWyAwIF0ubW9ycGhUYXJnZXRzICkgeworCisgICAgICAgICAgICAgICAgICAgIC8v
IGZpZ3VyZSBvdXQgYWxsIG1vcnBoIHRhcmdldHMgdXNlZCBpbiB0aGlzIHRyYWNrCisgICAgICAg
ICAgICAgICAgICAgIHZhciBtb3JwaFRhcmdldE5hbWVzID0ge307CisKKyAgICAgICAgICAgICAg
ICAgICAgZm9yICggdmFyIGsgPSAwOyBrIDwgYW5pbWF0aW9uS2V5cy5sZW5ndGg7IGsgKysgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBo
VGFyZ2V0cyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIHZhciBtID0g
MDsgbSA8IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyBtICsrICkgewor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoVGFyZ2V0TmFtZXNbIGFuaW1h
dGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHNbIG0gXSBdID0gLSAxOworCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHRyYWNrIGZv
ciBlYWNoIG1vcnBoIHRhcmdldCB3aXRoIGFsbCB6ZXJvCisgICAgICAgICAgICAgICAgICAgIC8v
IG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBleGNlcHQgZm9yIHRoZSBrZXlzIGluIHdoaWNoCisgICAg
ICAgICAgICAgICAgICAgIC8vIHRoZSBtb3JwaFRhcmdldCBpcyBuYW1lZC4KKyAgICAgICAgICAg
ICAgICAgICAgZm9yICggdmFyIG1vcnBoVGFyZ2V0TmFtZSBpbiBtb3JwaFRhcmdldE5hbWVzICkg
eworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGltZXMgPSBbXTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBbXTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
Zm9yICggdmFyIG0gPSAwOyBtICE9PSBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxl
bmd0aDsgKysgbSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbmltYXRp
b25LZXkgPSBhbmltYXRpb25LZXlzWyBrIF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0aW1lcy5wdXNoKCBhbmltYXRpb25LZXkudGltZSApOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHZhbHVlcy5wdXNoKCAoIGFuaW1hdGlvbktleS5tb3JwaFRhcmdldCA9PT0gbW9ycGhU
YXJnZXROYW1lICkgPyAxIDogMCApOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHRyYWNrcy5wdXNoKCBuZXcgTnVtYmVyS2V5ZnJhbWVUcmFj
ayggJy5tb3JwaFRhcmdldEluZmx1ZW5jZVsnICsgbW9ycGhUYXJnZXROYW1lICsgJ10nLCB0aW1l
cywgdmFsdWVzICkgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAgICAgZHVyYXRpb24gPSBtb3JwaFRhcmdldE5hbWVzLmxlbmd0aCAqICggZnBzIHx8IDEuMCAp
OworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAvLyAu
Li5hc3N1bWUgc2tlbGV0YWwgYW5pbWF0aW9uCisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGJv
bmVOYW1lID0gJy5ib25lc1snICsgYm9uZXNbIGggXS5uYW1lICsgJ10nOworCisgICAgICAgICAg
ICAgICAgICAgIGFkZE5vbmVtcHR5VHJhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
VmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnBvc2l0aW9uJywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBhbmltYXRpb25LZXlzLCAncG9zJywgdHJhY2tzICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgYWRkTm9uZW1wdHlUcmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnF1YXRlcm5pb24nLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbktleXMsICdyb3QnLCB0cmFja3Mg
KTsKKworICAgICAgICAgICAgICAgICAgICBhZGROb25lbXB0eVRyYWNrKAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5zY2FsZScs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uS2V5cywgJ3NjbCcsIHRyYWNr
cyApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IGlmICggdHJhY2tzLmxlbmd0aCA9PT0gMCApIHsKKworICAgICAgICAgICAgICAgIHJldHVybiBu
dWxsOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBjbGlwID0gbmV3IEFuaW1h
dGlvbkNsaXAoIGNsaXBOYW1lLCBkdXJhdGlvbiwgdHJhY2tzICk7CisKKyAgICAgICAgICAgIHJl
dHVybiBjbGlwOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIE9iamVjdC5hc3NpZ24o
IEFuaW1hdGlvbkNsaXAucHJvdG90eXBlLCB7CisKKyAgICAgICAgcmVzZXREdXJhdGlvbjogZnVu
Y3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdHJhY2tzID0gdGhpcy50cmFja3MsIGR1cmF0
aW9uID0gMDsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBuID0gdHJhY2tzLmxlbmd0
aDsgaSAhPT0gbjsgKysgaSApIHsKKworICAgICAgICAgICAgICAgIHZhciB0cmFjayA9IHRoaXMu
dHJhY2tzWyBpIF07CisKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgubWF4KCBkdXJh
dGlvbiwgdHJhY2sudGltZXNbIHRyYWNrLnRpbWVzLmxlbmd0aCAtIDEgXSApOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjsKKworICAgICAg
ICB9LAorCisgICAgICAgIHRyaW06IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgZm9yICgg
dmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkgeworCisgICAgICAgICAg
ICAgICAgdGhpcy50cmFja3NbIGkgXS50cmltKCAwLCB0aGlzLmR1cmF0aW9uICk7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAg
ICAgICBvcHRpbWl6ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9
IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB0
aGlzLnRyYWNrc1sgaSBdLm9wdGltaXplKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAg
ICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1
bmN0aW9uIE1hdGVyaWFsTG9hZGVyKCBtYW5hZ2VyICkgeworCisgICAgICAgIHRoaXMubWFuYWdl
ciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdN
YW5hZ2VyOworICAgICAgICB0aGlzLnRleHR1cmVzID0ge307CisKKyAgICB9CisKKyAgICBPYmpl
Y3QuYXNzaWduKCBNYXRlcmlhbExvYWRlci5wcm90b3R5cGUsIHsKKworICAgICAgICBsb2FkOiBm
dW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgeworCisgICAgICAg
ICAgICB2YXIgc2NvcGUgPSB0aGlzOworCisgICAgICAgICAgICB2YXIgbG9hZGVyID0gbmV3IEZp
bGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTsKKyAgICAgICAgICAgIGxvYWRlci5sb2FkKCB1cmws
IGZ1bmN0aW9uICggdGV4dCApIHsKKworICAgICAgICAgICAgICAgIG9uTG9hZCggc2NvcGUucGFy
c2UoIEpTT04ucGFyc2UoIHRleHQgKSApICk7CisKKyAgICAgICAgICAgIH0sIG9uUHJvZ3Jlc3Ms
IG9uRXJyb3IgKTsKKworICAgICAgICB9LAorCisgICAgICAgIHNldFRleHR1cmVzOiBmdW5jdGlv
biAoIHZhbHVlICkgeworCisgICAgICAgICAgICB0aGlzLnRleHR1cmVzID0gdmFsdWU7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBwYXJzZTogZnVuY3Rpb24gKCBqc29uICkgeworCisgICAgICAg
ICAgICB2YXIgdGV4dHVyZXMgPSB0aGlzLnRleHR1cmVzOworCisgICAgICAgICAgICBmdW5jdGlv
biBnZXRUZXh0dXJlKCBuYW1lICkgeworCisgICAgICAgICAgICAgICAgaWYgKCB0ZXh0dXJlc1sg
bmFtZSBdID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS53
YXJuKCAnVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlJywgbmFtZSApOwor
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHR1cmVzWyBu
YW1lIF07CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIG1hdGVyaWFsID0gbmV3
IE1hdGVyaWFsc1sganNvbi50eXBlIF0oKTsKKworICAgICAgICAgICAgaWYgKCBqc29uLnV1aWQg
IT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnV1aWQgPSBqc29uLnV1aWQ7CisgICAgICAgICAgICBp
ZiAoIGpzb24ubmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubmFtZSA9IGpzb24ubmFtZTsK
KyAgICAgICAgICAgIGlmICgganNvbi5jb2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29s
b3Iuc2V0SGV4KCBqc29uLmNvbG9yICk7CisgICAgICAgICAgICBpZiAoIGpzb24ucm91Z2huZXNz
ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3VnaG5lc3MgPSBqc29uLnJvdWdobmVzczsKKyAg
ICAgICAgICAgIGlmICgganNvbi5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1l
dGFsbmVzcyA9IGpzb24ubWV0YWxuZXNzOworICAgICAgICAgICAgaWYgKCBqc29uLmVtaXNzaXZl
ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZS5zZXRIZXgoIGpzb24uZW1pc3NpdmUg
KTsKKyAgICAgICAgICAgIGlmICgganNvbi5zcGVjdWxhciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJp
YWwuc3BlY3VsYXIuc2V0SGV4KCBqc29uLnNwZWN1bGFyICk7CisgICAgICAgICAgICBpZiAoIGpz
b24uc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGluaW5lc3MgPSBqc29uLnNo
aW5pbmVzczsKKyAgICAgICAgICAgIGlmICgganNvbi5jbGVhckNvYXQgIT09IHVuZGVmaW5lZCAp
IG1hdGVyaWFsLmNsZWFyQ29hdCA9IGpzb24uY2xlYXJDb2F0OworICAgICAgICAgICAgaWYgKCBq
c29uLmNsZWFyQ29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJDb2F0
Um91Z2huZXNzID0ganNvbi5jbGVhckNvYXRSb3VnaG5lc3M7CisgICAgICAgICAgICBpZiAoIGpz
b24udW5pZm9ybXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnVuaWZvcm1zID0ganNvbi51bmlm
b3JtczsKKyAgICAgICAgICAgIGlmICgganNvbi52ZXJ0ZXhTaGFkZXIgIT09IHVuZGVmaW5lZCAp
IG1hdGVyaWFsLnZlcnRleFNoYWRlciA9IGpzb24udmVydGV4U2hhZGVyOworICAgICAgICAgICAg
aWYgKCBqc29uLmZyYWdtZW50U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mcmFnbWVu
dFNoYWRlciA9IGpzb24uZnJhZ21lbnRTaGFkZXI7CisgICAgICAgICAgICBpZiAoIGpzb24udmVy
dGV4Q29sb3JzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBqc29uLnZl
cnRleENvbG9yczsKKyAgICAgICAgICAgIGlmICgganNvbi5mb2cgIT09IHVuZGVmaW5lZCApIG1h
dGVyaWFsLmZvZyA9IGpzb24uZm9nOworICAgICAgICAgICAgaWYgKCBqc29uLnNoYWRpbmcgIT09
IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoYWRpbmcgPSBqc29uLnNoYWRpbmc7CisgICAgICAgICAg
ICBpZiAoIGpzb24uYmxlbmRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kaW5nID0g
anNvbi5ibGVuZGluZzsKKyAgICAgICAgICAgIGlmICgganNvbi5zaWRlICE9PSB1bmRlZmluZWQg
KSBtYXRlcmlhbC5zaWRlID0ganNvbi5zaWRlOworICAgICAgICAgICAgaWYgKCBqc29uLm9wYWNp
dHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm9wYWNpdHkgPSBqc29uLm9wYWNpdHk7CisgICAg
ICAgICAgICBpZiAoIGpzb24udHJhbnNwYXJlbnQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRy
YW5zcGFyZW50ID0ganNvbi50cmFuc3BhcmVudDsKKyAgICAgICAgICAgIGlmICgganNvbi5hbHBo
YVRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhVGVzdCA9IGpzb24uYWxwaGFUZXN0
OworICAgICAgICAgICAgaWYgKCBqc29uLmRlcHRoVGVzdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJp
YWwuZGVwdGhUZXN0ID0ganNvbi5kZXB0aFRlc3Q7CisgICAgICAgICAgICBpZiAoIGpzb24uZGVw
dGhXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGpzb24uZGVwdGhX
cml0ZTsKKyAgICAgICAgICAgIGlmICgganNvbi5jb2xvcldyaXRlICE9PSB1bmRlZmluZWQgKSBt
YXRlcmlhbC5jb2xvcldyaXRlID0ganNvbi5jb2xvcldyaXRlOworICAgICAgICAgICAgaWYgKCBq
c29uLndpcmVmcmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lID0ganNvbi53
aXJlZnJhbWU7CisgICAgICAgICAgICBpZiAoIGpzb24ud2lyZWZyYW1lTGluZXdpZHRoICE9PSB1
bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggPSBqc29uLndpcmVmcmFtZUxp
bmV3aWR0aDsKKyAgICAgICAgICAgIGlmICgganNvbi53aXJlZnJhbWVMaW5lY2FwICE9PSB1bmRl
ZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lY2FwID0ganNvbi53aXJlZnJhbWVMaW5lY2Fw
OworICAgICAgICAgICAgaWYgKCBqc29uLndpcmVmcmFtZUxpbmVqb2luICE9PSB1bmRlZmluZWQg
KSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lam9pbiA9IGpzb24ud2lyZWZyYW1lTGluZWpvaW47Cisg
ICAgICAgICAgICBpZiAoIGpzb24uc2tpbm5pbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNr
aW5uaW5nID0ganNvbi5za2lubmluZzsKKyAgICAgICAgICAgIGlmICgganNvbi5tb3JwaFRhcmdl
dHMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9IGpzb24ubW9ycGhUYXJn
ZXRzOworCisgICAgICAgICAgICAvLyBmb3IgUG9pbnRzTWF0ZXJpYWwKKworICAgICAgICAgICAg
aWYgKCBqc29uLnNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemUgPSBqc29uLnNpemU7
CisgICAgICAgICAgICBpZiAoIGpzb24uc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBt
YXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPSBqc29uLnNpemVBdHRlbnVhdGlvbjsKKworICAgICAg
ICAgICAgLy8gbWFwcworCisgICAgICAgICAgICBpZiAoIGpzb24ubWFwICE9PSB1bmRlZmluZWQg
KSBtYXRlcmlhbC5tYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1hcCApOworCisgICAgICAgICAgICBp
ZiAoIGpzb24uYWxwaGFNYXAgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIG1h
dGVyaWFsLmFscGhhTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hbHBoYU1hcCApOworICAgICAgICAg
ICAgICAgIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBpZiAoIGpzb24uYnVtcE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVt
cE1hcCA9IGdldFRleHR1cmUoIGpzb24uYnVtcE1hcCApOworICAgICAgICAgICAgaWYgKCBqc29u
LmJ1bXBTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcFNjYWxlID0ganNvbi5idW1w
U2NhbGU7CisKKyAgICAgICAgICAgIGlmICgganNvbi5ub3JtYWxNYXAgIT09IHVuZGVmaW5lZCAp
IG1hdGVyaWFsLm5vcm1hbE1hcCA9IGdldFRleHR1cmUoIGpzb24ubm9ybWFsTWFwICk7CisgICAg
ICAgICAgICBpZiAoIGpzb24ubm9ybWFsU2NhbGUgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAg
ICAgICAgICAgIHZhciBub3JtYWxTY2FsZSA9IGpzb24ubm9ybWFsU2NhbGU7CisKKyAgICAgICAg
ICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkoIG5vcm1hbFNjYWxlICkgPT09IGZhbHNlICkgewor
CisgICAgICAgICAgICAgICAgICAgIC8vIEJsZW5kZXIgZXhwb3J0ZXIgdXNlZCB0byBleHBvcnQg
YSBzY2FsYXIuIFNlZSAjNzQ1OQorCisgICAgICAgICAgICAgICAgICAgIG5vcm1hbFNjYWxlID0g
WyBub3JtYWxTY2FsZSwgbm9ybWFsU2NhbGUgXTsKKworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIG1hdGVyaWFsLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoKS5mcm9tQXJy
YXkoIG5vcm1hbFNjYWxlICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBq
c29uLmRpc3BsYWNlbWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50
TWFwID0gZ2V0VGV4dHVyZSgganNvbi5kaXNwbGFjZW1lbnRNYXAgKTsKKyAgICAgICAgICAgIGlm
ICgganNvbi5kaXNwbGFjZW1lbnRTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxh
Y2VtZW50U2NhbGUgPSBqc29uLmRpc3BsYWNlbWVudFNjYWxlOworICAgICAgICAgICAgaWYgKCBq
c29uLmRpc3BsYWNlbWVudEJpYXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVu
dEJpYXMgPSBqc29uLmRpc3BsYWNlbWVudEJpYXM7CisKKyAgICAgICAgICAgIGlmICgganNvbi5y
b3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzc01hcCA9IGdldFRl
eHR1cmUoIGpzb24ucm91Z2huZXNzTWFwICk7CisgICAgICAgICAgICBpZiAoIGpzb24ubWV0YWxu
ZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgPSBnZXRUZXh0dXJl
KCBqc29uLm1ldGFsbmVzc01hcCApOworCisgICAgICAgICAgICBpZiAoIGpzb24uZW1pc3NpdmVN
YXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gZ2V0VGV4dHVyZSgganNv
bi5lbWlzc2l2ZU1hcCApOworICAgICAgICAgICAgaWYgKCBqc29uLmVtaXNzaXZlSW50ZW5zaXR5
ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSA9IGpzb24uZW1pc3Np
dmVJbnRlbnNpdHk7CisKKyAgICAgICAgICAgIGlmICgganNvbi5zcGVjdWxhck1hcCAhPT0gdW5k
ZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXJNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnNwZWN1bGFy
TWFwICk7CisKKyAgICAgICAgICAgIGlmICgganNvbi5lbnZNYXAgIT09IHVuZGVmaW5lZCApIG1h
dGVyaWFsLmVudk1hcCA9IGdldFRleHR1cmUoIGpzb24uZW52TWFwICk7CisKKyAgICAgICAgICAg
IGlmICgganNvbi5yZWZsZWN0aXZpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZmxlY3Rp
dml0eSA9IGpzb24ucmVmbGVjdGl2aXR5OworCisgICAgICAgICAgICBpZiAoIGpzb24ubGlnaHRN
YXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwID0gZ2V0VGV4dHVyZSgganNvbi5s
aWdodE1hcCApOworICAgICAgICAgICAgaWYgKCBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5ICE9PSB1
bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eSA9IGpzb24ubGlnaHRNYXBJbnRl
bnNpdHk7CisKKyAgICAgICAgICAgIGlmICgganNvbi5hb01hcCAhPT0gdW5kZWZpbmVkICkgbWF0
ZXJpYWwuYW9NYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFvTWFwICk7CisgICAgICAgICAgICBpZiAo
IGpzb24uYW9NYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwSW50ZW5z
aXR5ID0ganNvbi5hb01hcEludGVuc2l0eTsKKworICAgICAgICAgICAgaWYgKCBqc29uLmdyYWRp
ZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ncmFkaWVudE1hcCA9IGdldFRleHR1cmUo
IGpzb24uZ3JhZGllbnRNYXAgKTsKKworICAgICAgICAgICAgcmV0dXJuIG1hdGVyaWFsOworCisg
ICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8g
aHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBCdWZmZXJHZW9tZXRy
eUxvYWRlciggbWFuYWdlciApIHsKKworICAgICAgICB0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIg
IT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKKworICAg
IH0KKworICAgIE9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLnByb3RvdHlwZSwg
eworCisgICAgICAgIGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9u
RXJyb3IgKSB7CisKKyAgICAgICAgICAgIHZhciBzY29wZSA9IHRoaXM7CisKKyAgICAgICAgICAg
IHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdlciApOworICAgICAgICAg
ICAgbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkgeworCisgICAgICAgICAgICAg
ICAgb25Mb2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTsKKworICAgICAg
ICAgICAgfSwgb25Qcm9ncmVzcywgb25FcnJvciApOworCisgICAgICAgIH0sCisKKyAgICAgICAg
cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHsKKworICAgICAgICAgICAgdmFyIGdlb21ldHJ5ID0g
bmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisKKyAgICAgICAgICAgIHZhciBpbmRleCA9IGpzb24uZGF0
YS5pbmRleDsKKworICAgICAgICAgICAgaWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgeworCisg
ICAgICAgICAgICAgICAgdmFyIHR5cGVkQXJyYXkgPSBuZXcgVFlQRURfQVJSQVlTWyBpbmRleC50
eXBlIF0oIGluZGV4LmFycmF5ICk7CisgICAgICAgICAgICAgICAgZ2VvbWV0cnkuc2V0SW5kZXgo
IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHR5cGVkQXJyYXksIDEgKSApOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0ganNvbi5kYXRhLmF0dHJpYnV0ZXM7CisK
KyAgICAgICAgICAgIGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHsKKworICAgICAgICAg
ICAgICAgIHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTsKKyAgICAgICAgICAgICAg
ICB2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGF0dHJpYnV0ZS50eXBlIF0oIGF0
dHJpYnV0ZS5hcnJheSApOworCisgICAgICAgICAgICAgICAgZ2VvbWV0cnkuYWRkQXR0cmlidXRl
KCBrZXksIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHR5cGVkQXJyYXksIGF0dHJpYnV0ZS5pdGVtU2l6
ZSwgYXR0cmlidXRlLm5vcm1hbGl6ZWQgKSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIHZhciBncm91cHMgPSBqc29uLmRhdGEuZ3JvdXBzIHx8IGpzb24uZGF0YS5kcmF3Y2FsbHMg
fHwganNvbi5kYXRhLm9mZnNldHM7CisKKyAgICAgICAgICAgIGlmICggZ3JvdXBzICE9PSB1bmRl
ZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIG4gPSBncm91cHMu
bGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBncm91
cCA9IGdyb3Vwc1sgaSBdOworCisgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmFkZEdyb3Vw
KCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTsKKworICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYm91bmRp
bmdTcGhlcmUgPSBqc29uLmRhdGEuYm91bmRpbmdTcGhlcmU7CisKKyAgICAgICAgICAgIGlmICgg
Ym91bmRpbmdTcGhlcmUgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIHZhciBj
ZW50ZXIgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICAgICAgaWYgKCBib3VuZGluZ1Nw
aGVyZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICBjZW50
ZXIuZnJvbUFycmF5KCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgKTsKKworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVy
ZSggY2VudGVyLCBib3VuZGluZ1NwaGVyZS5yYWRpdXMgKTsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnk7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisg
ICAgdmFyIFRZUEVEX0FSUkFZUyA9IHsKKyAgICAgICAgSW50OEFycmF5OiBJbnQ4QXJyYXksCisg
ICAgICAgIFVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXksCisgICAgICAgIC8vIFdvcmthcm91bmQgZm9y
IElFMTEgcHJlIEtCMjkyOTQzNy4gU2VlICMxMTQ0MAorICAgICAgICBVaW50OENsYW1wZWRBcnJh
eTogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4Q2xhbXBl
ZEFycmF5IDogVWludDhBcnJheSwKKyAgICAgICAgSW50MTZBcnJheTogSW50MTZBcnJheSwKKyAg
ICAgICAgVWludDE2QXJyYXk6IFVpbnQxNkFycmF5LAorICAgICAgICBJbnQzMkFycmF5OiBJbnQz
MkFycmF5LAorICAgICAgICBVaW50MzJBcnJheTogVWludDMyQXJyYXksCisgICAgICAgIEZsb2F0
MzJBcnJheTogRmxvYXQzMkFycmF5LAorICAgICAgICBGbG9hdDY0QXJyYXk6IEZsb2F0NjRBcnJh
eQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2Fs
dGVyZWRxdWFsaWEuY29tLworICAgICAqLworCisgICAgZnVuY3Rpb24gTG9hZGVyKCkgeworCisg
ICAgICAgIHRoaXMub25Mb2FkU3RhcnQgPSBmdW5jdGlvbiAoKSB7fTsKKyAgICAgICAgdGhpcy5v
bkxvYWRQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHt9OworICAgICAgICB0aGlzLm9uTG9hZENvbXBs
ZXRlID0gZnVuY3Rpb24gKCkge307CisKKyAgICB9CisKKyAgICBMb2FkZXIuSGFuZGxlcnMgPSB7
CisKKyAgICAgICAgaGFuZGxlcnM6IFtdLAorCisgICAgICAgIGFkZDogZnVuY3Rpb24gKCByZWdl
eCwgbG9hZGVyICkgeworCisgICAgICAgICAgICB0aGlzLmhhbmRsZXJzLnB1c2goIHJlZ2V4LCBs
b2FkZXIgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGdldDogZnVuY3Rpb24gKCBmaWxlICkg
eworCisgICAgICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzOworCisgICAgICAg
ICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIg
KSB7CisKKyAgICAgICAgICAgICAgICB2YXIgcmVnZXggPSBoYW5kbGVyc1sgaSBdOworICAgICAg
ICAgICAgICAgIHZhciBsb2FkZXIgPSBoYW5kbGVyc1sgaSArIDEgXTsKKworICAgICAgICAgICAg
ICAgIGlmICggcmVnZXgudGVzdCggZmlsZSApICkgeworCisgICAgICAgICAgICAgICAgICAgIHJl
dHVybiBsb2FkZXI7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgfQorCisgICAgfTsKKworICAgIE9iamVj
dC5hc3NpZ24oIExvYWRlci5wcm90b3R5cGUsIHsKKworICAgICAgICBjcm9zc09yaWdpbjogdW5k
ZWZpbmVkLAorCisgICAgICAgIGV4dHJhY3RVcmxCYXNlOiBmdW5jdGlvbiAoIHVybCApIHsKKwor
ICAgICAgICAgICAgdmFyIHBhcnRzID0gdXJsLnNwbGl0KCAnLycgKTsKKworICAgICAgICAgICAg
aWYgKCBwYXJ0cy5sZW5ndGggPT09IDEgKSByZXR1cm4gJy4vJzsKKworICAgICAgICAgICAgcGFy
dHMucG9wKCk7CisKKyAgICAgICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCAnLycgKSArICcvJzsK
KworICAgICAgICB9LAorCisgICAgICAgIGluaXRNYXRlcmlhbHM6IGZ1bmN0aW9uICggbWF0ZXJp
YWxzLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKSB7CisKKyAgICAgICAgICAgIHZhciBhcnJh
eSA9IFtdOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBtYXRlcmlhbHMubGVu
Z3RoOyArKyBpICkgeworCisgICAgICAgICAgICAgICAgYXJyYXlbIGkgXSA9IHRoaXMuY3JlYXRl
TWF0ZXJpYWwoIG1hdGVyaWFsc1sgaSBdLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKTsKKwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYXJyYXk7CisKKyAgICAgICAgfSwK
KworICAgICAgICBjcmVhdGVNYXRlcmlhbDogKCBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAg
IHZhciBCbGVuZGluZ01vZGUgPSB7CisgICAgICAgICAgICAgICAgTm9CbGVuZGluZzogTm9CbGVu
ZGluZywKKyAgICAgICAgICAgICAgICBOb3JtYWxCbGVuZGluZzogTm9ybWFsQmxlbmRpbmcsCisg
ICAgICAgICAgICAgICAgQWRkaXRpdmVCbGVuZGluZzogQWRkaXRpdmVCbGVuZGluZywKKyAgICAg
ICAgICAgICAgICBTdWJ0cmFjdGl2ZUJsZW5kaW5nOiBTdWJ0cmFjdGl2ZUJsZW5kaW5nLAorICAg
ICAgICAgICAgICAgIE11bHRpcGx5QmxlbmRpbmc6IE11bHRpcGx5QmxlbmRpbmcsCisgICAgICAg
ICAgICAgICAgQ3VzdG9tQmxlbmRpbmc6IEN1c3RvbUJsZW5kaW5nCisgICAgICAgICAgICB9Owor
CisgICAgICAgICAgICB2YXIgY29sb3IgPSBuZXcgQ29sb3IoKTsKKyAgICAgICAgICAgIHZhciB0
ZXh0dXJlTG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTsKKyAgICAgICAgICAgIHZhciBtYXRl
cmlhbExvYWRlciA9IG5ldyBNYXRlcmlhbExvYWRlcigpOworCisgICAgICAgICAgICByZXR1cm4g
ZnVuY3Rpb24gY3JlYXRlTWF0ZXJpYWwoIG0sIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiApIHsK
KworICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBvbGQgbWF0ZXJpYWwgZm9ybWF0CisK
KyAgICAgICAgICAgICAgICB2YXIgdGV4dHVyZXMgPSB7fTsKKworICAgICAgICAgICAgICAgIGZ1
bmN0aW9uIGxvYWRUZXh0dXJlKCBwYXRoLCByZXBlYXQsIG9mZnNldCwgd3JhcCwgYW5pc290cm9w
eSApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIgZnVsbFBhdGggPSB0ZXh0dXJlUGF0aCAr
IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIHZhciBsb2FkZXIgPSBMb2FkZXIuSGFuZGxlcnMu
Z2V0KCBmdWxsUGF0aCApOworCisgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlOworCisg
ICAgICAgICAgICAgICAgICAgIGlmICggbG9hZGVyICE9PSBudWxsICkgeworCisgICAgICAgICAg
ICAgICAgICAgICAgICB0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIGZ1bGxQYXRoICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVy
ZUxvYWRlci5zZXRDcm9zc09yaWdpbiggY3Jvc3NPcmlnaW4gKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHRleHR1cmUgPSB0ZXh0dXJlTG9hZGVyLmxvYWQoIGZ1bGxQYXRoICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggcmVwZWF0ICE9PSB1
bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUucmVwZWF0LmZy
b21BcnJheSggcmVwZWF0ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVwZWF0
WyAwIF0gIT09IDEgKSB0ZXh0dXJlLndyYXBTID0gUmVwZWF0V3JhcHBpbmc7CisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAoIHJlcGVhdFsgMSBdICE9PSAxICkgdGV4dHVyZS53cmFwVCA9IFJl
cGVhdFdyYXBwaW5nOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
ICAgICBpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICB0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIG9mZnNldCApOworCisgICAgICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdyYXAgIT09IHVuZGVmaW5lZCAp
IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB3cmFwWyAwIF0gPT09ICdyZXBlYXQn
ICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nOworICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKCB3cmFwWyAwIF0gPT09ICdtaXJyb3InICkgdGV4dHVyZS53cmFwUyA9IE1pcnJvcmVk
UmVwZWF0V3JhcHBpbmc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggd3JhcFsgMSBd
ID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFQgPSBSZXBlYXRXcmFwcGluZzsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICggd3JhcFsgMSBdID09PSAnbWlycm9yJyApIHRleHR1cmUud3Jh
cFQgPSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOworCisgICAgICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgICAgICBpZiAoIGFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5hbmlzb3Ryb3B5ID0gYW5pc290cm9weTsK
KworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHV1aWQg
PSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKKworICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlc1sg
dXVpZCBdID0gdGV4dHVyZTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXVpZDsKKwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgICAg
ICB2YXIganNvbiA9IHsKKyAgICAgICAgICAgICAgICAgICAgdXVpZDogX01hdGguZ2VuZXJhdGVV
VUlEKCksCisgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNZXNoTGFtYmVydE1hdGVyaWFsJwor
ICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgbmFtZSBpbiBt
ICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG1bIG5hbWUgXTsKKworICAg
ICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBuYW1lICkgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICBjYXNlICdEYmdDb2xvcic6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEYmdJ
bmRleCc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvcHRpY2FsRGVuc2l0eSc6Cisg
ICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbGx1bWluYXRpb24nOgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRGJn
TmFtZSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbi5uYW1lID0gdmFsdWU7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAg
ICBjYXNlICdibGVuZGluZyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbi5ibGVu
ZGluZyA9IEJsZW5kaW5nTW9kZVsgdmFsdWUgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbG9yQW1iaWVudCc6Cisg
ICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtYXBBbWJpZW50JzoKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6
JywgbmFtZSwgJ2lzIG5vIGxvbmdlciBzdXBwb3J0ZWQuJyApOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29sb3JEaWZm
dXNlJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uLmNvbG9yID0gY29sb3IuZnJv
bUFycmF5KCB2YWx1ZSApLmdldEhleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29sb3JTcGVjdWxhcic6CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAganNvbi5zcGVjdWxhciA9IGNvbG9yLmZyb21BcnJheSgg
dmFsdWUgKS5nZXRIZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbG9yRW1pc3NpdmUnOgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGpzb24uZW1pc3NpdmUgPSBjb2xvci5mcm9tQXJyYXkoIHZhbHVlICku
Z2V0SGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgICAgICAgICBjYXNlICdzcGVjdWxhckNvZWYnOgorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGpzb24uc2hpbmluZXNzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzaGFkaW5nJzoKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdiYXNp
YycgKSBqc29uLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3Bob25nJyApIGpzb24udHlw
ZSA9ICdNZXNoUGhvbmdNYXRlcmlhbCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAnc3RhbmRhcmQnICkganNvbi50eXBlID0gJ01lc2hT
dGFuZGFyZE1hdGVyaWFsJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21hcERpZmZ1c2UnOgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGpzb24ubWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcERpZmZ1c2VS
ZXBlYXQsIG0ubWFwRGlmZnVzZU9mZnNldCwgbS5tYXBEaWZmdXNlV3JhcCwgbS5tYXBEaWZmdXNl
QW5pc290cm9weSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgICAgICAgICAgY2FzZSAnbWFwRGlmZnVzZVJlcGVhdCc6CisgICAgICAgICAgICAg
ICAgICAgICAgICBjYXNlICdtYXBEaWZmdXNlT2Zmc2V0JzoKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGNhc2UgJ21hcERpZmZ1c2VXcmFwJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ug
J21hcERpZmZ1c2VBbmlzb3Ryb3B5JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21hcEVtaXNzaXZlJzoKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBqc29uLmVtaXNzaXZlTWFwID0gbG9hZFRleHR1cmUoIHZhbHVl
LCBtLm1hcEVtaXNzaXZlUmVwZWF0LCBtLm1hcEVtaXNzaXZlT2Zmc2V0LCBtLm1hcEVtaXNzaXZl
V3JhcCwgbS5tYXBFbWlzc2l2ZUFuaXNvdHJvcHkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21hcEVtaXNzaXZlUmVw
ZWF0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21hcEVtaXNzaXZlT2Zmc2V0JzoK
KyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21hcEVtaXNzaXZlV3JhcCc6CisgICAgICAg
ICAgICAgICAgICAgICAgICBjYXNlICdtYXBFbWlzc2l2ZUFuaXNvdHJvcHknOgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAn
bWFwTGlnaHQnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24ubGlnaHRNYXAgPSBs
b2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTGlnaHRSZXBlYXQsIG0ubWFwTGlnaHRPZmZzZXQsIG0u
bWFwTGlnaHRXcmFwLCBtLm1hcExpZ2h0QW5pc290cm9weSApOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFwTGlnaHRS
ZXBlYXQnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFwTGlnaHRPZmZzZXQnOgor
ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFwTGlnaHRXcmFwJzoKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGNhc2UgJ21hcExpZ2h0QW5pc290cm9weSc6CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtYXBBTyc6
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbi5hb01hcCA9IGxvYWRUZXh0dXJlKCB2
YWx1ZSwgbS5tYXBBT1JlcGVhdCwgbS5tYXBBT09mZnNldCwgbS5tYXBBT1dyYXAsIG0ubWFwQU9B
bmlzb3Ryb3B5ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgICAgICAgICBjYXNlICdtYXBBT1JlcGVhdCc6CisgICAgICAgICAgICAgICAgICAg
ICAgICBjYXNlICdtYXBBT09mZnNldCc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdt
YXBBT1dyYXAnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFwQU9Bbmlzb3Ryb3B5
JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNhc2UgJ21hcEJ1bXAnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24u
YnVtcE1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBCdW1wUmVwZWF0LCBtLm1hcEJ1bXBP
ZmZzZXQsIG0ubWFwQnVtcFdyYXAsIG0ubWFwQnVtcEFuaXNvdHJvcHkgKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21h
cEJ1bXBTY2FsZSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbi5idW1wU2NhbGUg
PSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGNhc2UgJ21hcEJ1bXBSZXBlYXQnOgorICAgICAgICAgICAgICAgICAgICAg
ICAgY2FzZSAnbWFwQnVtcE9mZnNldCc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdt
YXBCdW1wV3JhcCc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtYXBCdW1wQW5pc290
cm9weSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgICAgICAgICBjYXNlICdtYXBOb3JtYWwnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGpzb24ubm9ybWFsTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE5vcm1hbFJlcGVhdCwg
bS5tYXBOb3JtYWxPZmZzZXQsIG0ubWFwTm9ybWFsV3JhcCwgbS5tYXBOb3JtYWxBbmlzb3Ryb3B5
ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
ICAgICAgICBjYXNlICdtYXBOb3JtYWxGYWN0b3InOgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGpzb24ubm9ybWFsU2NhbGUgPSBbIHZhbHVlLCB2YWx1ZSBdOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFwTm9y
bWFsUmVwZWF0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21hcE5vcm1hbE9mZnNl
dCc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtYXBOb3JtYWxXcmFwJzoKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNhc2UgJ21hcE5vcm1hbEFuaXNvdHJvcHknOgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAn
bWFwU3BlY3VsYXInOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24uc3BlY3VsYXJN
YXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwU3BlY3VsYXJSZXBlYXQsIG0ubWFwU3BlY3Vs
YXJPZmZzZXQsIG0ubWFwU3BlY3VsYXJXcmFwLCBtLm1hcFNwZWN1bGFyQW5pc290cm9weSApOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAg
ICAgY2FzZSAnbWFwU3BlY3VsYXJSZXBlYXQnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2Fz
ZSAnbWFwU3BlY3VsYXJPZmZzZXQnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFw
U3BlY3VsYXJXcmFwJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21hcFNwZWN1bGFy
QW5pc290cm9weSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgICAgICAgICBjYXNlICdtYXBNZXRhbG5lc3MnOgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGpzb24ubWV0YWxuZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE1l
dGFsbmVzc1JlcGVhdCwgbS5tYXBNZXRhbG5lc3NPZmZzZXQsIG0ubWFwTWV0YWxuZXNzV3JhcCwg
bS5tYXBNZXRhbG5lc3NBbmlzb3Ryb3B5ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtYXBNZXRhbG5lc3NSZXBlYXQn
OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFwTWV0YWxuZXNzT2Zmc2V0JzoKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21hcE1ldGFsbmVzc1dyYXAnOgorICAgICAgICAg
ICAgICAgICAgICAgICAgY2FzZSAnbWFwTWV0YWxuZXNzQW5pc290cm9weSc6CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdt
YXBSb3VnaG5lc3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24ucm91Z2huZXNz
TWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFJvdWdobmVzc1JlcGVhdCwgbS5tYXBSb3Vn
aG5lc3NPZmZzZXQsIG0ubWFwUm91Z2huZXNzV3JhcCwgbS5tYXBSb3VnaG5lc3NBbmlzb3Ryb3B5
ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
ICAgICAgICBjYXNlICdtYXBSb3VnaG5lc3NSZXBlYXQnOgorICAgICAgICAgICAgICAgICAgICAg
ICAgY2FzZSAnbWFwUm91Z2huZXNzT2Zmc2V0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNh
c2UgJ21hcFJvdWdobmVzc1dyYXAnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFw
Um91Z2huZXNzQW5pc290cm9weSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtYXBBbHBoYSc6CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAganNvbi5hbHBoYU1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBB
bHBoYVJlcGVhdCwgbS5tYXBBbHBoYU9mZnNldCwgbS5tYXBBbHBoYVdyYXAsIG0ubWFwQWxwaGFB
bmlzb3Ryb3B5ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgICAgICAgICBjYXNlICdtYXBBbHBoYVJlcGVhdCc6CisgICAgICAgICAgICAgICAg
ICAgICAgICBjYXNlICdtYXBBbHBoYU9mZnNldCc6CisgICAgICAgICAgICAgICAgICAgICAgICBj
YXNlICdtYXBBbHBoYVdyYXAnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFwQWxw
aGFBbmlzb3Ryb3B5JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZsaXBTaWRlZCc6CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAganNvbi5zaWRlID0gQmFja1NpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkb3VibGVTaWRlZCc6Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbi5zaWRlID0gRG91YmxlU2lkZTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNh
c2UgJ3RyYW5zcGFyZW5jeSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53
YXJuKCAnVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOiB0cmFuc3BhcmVuY3kgaGFzIGJlZW4g
cmVuYW1lZCB0byBvcGFjaXR5JyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24u
b3BhY2l0eSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVwdGhUZXN0JzoKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNhc2UgJ2RlcHRoV3JpdGUnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAn
Y29sb3JXcml0ZSc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvcGFjaXR5JzoKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlZmxlY3Rpdml0eSc6CisgICAgICAgICAgICAg
ICAgICAgICAgICBjYXNlICd0cmFuc3BhcmVudCc6CisgICAgICAgICAgICAgICAgICAgICAgICBj
YXNlICd2aXNpYmxlJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3dpcmVmcmFtZSc6
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvblsgbmFtZSBdID0gdmFsdWU7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBj
YXNlICd2ZXJ0ZXhDb2xvcnMnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdmFs
dWUgPT09IHRydWUgKSBqc29uLnZlcnRleENvbG9ycyA9IFZlcnRleENvbG9yczsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIHZhbHVlID09PSAnZmFjZScgKSBqc29uLnZlcnRleENv
bG9ycyA9IEZhY2VDb2xvcnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6IFVuc3VwcG9y
dGVkJywgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK
KworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICBpZiAoIGpzb24udHlwZSA9PT0gJ01lc2hCYXNpY01hdGVyaWFsJyApIGRlbGV0ZSBq
c29uLmVtaXNzaXZlOworICAgICAgICAgICAgICAgIGlmICgganNvbi50eXBlICE9PSAnTWVzaFBo
b25nTWF0ZXJpYWwnICkgZGVsZXRlIGpzb24uc3BlY3VsYXI7CisKKyAgICAgICAgICAgICAgICBp
ZiAoIGpzb24ub3BhY2l0eSA8IDEgKSBqc29uLnRyYW5zcGFyZW50ID0gdHJ1ZTsKKworICAgICAg
ICAgICAgICAgIG1hdGVyaWFsTG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApOworCisgICAg
ICAgICAgICAgICAgcmV0dXJuIG1hdGVyaWFsTG9hZGVyLnBhcnNlKCBqc29uICk7CisKKyAgICAg
ICAgICAgIH07CisKKyAgICAgICAgfSApKCkKKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAq
IEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1dGhvciBhbHRl
cmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9u
IEpTT05Mb2FkZXIoIG1hbmFnZXIgKSB7CisKKyAgICAgICAgaWYgKCB0eXBlb2YgbWFuYWdlciA9
PT0gJ2Jvb2xlYW4nICkgeworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5KU09O
TG9hZGVyOiBzaG93U3RhdHVzIHBhcmFtZXRlciBoYXMgYmVlbiByZW1vdmVkIGZyb20gY29uc3Ry
dWN0b3IuJyApOworICAgICAgICAgICAgbWFuYWdlciA9IHVuZGVmaW5lZDsKKworICAgICAgICB9
CisKKyAgICAgICAgdGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1h
bmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CisKKyAgICAgICAgdGhpcy53aXRoQ3JlZGVu
dGlhbHMgPSBmYWxzZTsKKworICAgIH0KKworICAgIE9iamVjdC5hc3NpZ24oIEpTT05Mb2FkZXIu
cHJvdG90eXBlLCB7CisKKyAgICAgICAgbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Q
cm9ncmVzcywgb25FcnJvciApIHsKKworICAgICAgICAgICAgdmFyIHNjb3BlID0gdGhpczsKKwor
ICAgICAgICAgICAgdmFyIHRleHR1cmVQYXRoID0gdGhpcy50ZXh0dXJlUGF0aCAmJiAoIHR5cGVv
ZiB0aGlzLnRleHR1cmVQYXRoID09PSAic3RyaW5nIiApID8gdGhpcy50ZXh0dXJlUGF0aCA6IExv
YWRlci5wcm90b3R5cGUuZXh0cmFjdFVybEJhc2UoIHVybCApOworCisgICAgICAgICAgICB2YXIg
bG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApOworICAgICAgICAgICAgbG9h
ZGVyLnNldFdpdGhDcmVkZW50aWFscyggdGhpcy53aXRoQ3JlZGVudGlhbHMgKTsKKyAgICAgICAg
ICAgIGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHsKKworICAgICAgICAgICAg
ICAgIHZhciBqc29uID0gSlNPTi5wYXJzZSggdGV4dCApOworICAgICAgICAgICAgICAgIHZhciBt
ZXRhZGF0YSA9IGpzb24ubWV0YWRhdGE7CisKKyAgICAgICAgICAgICAgICBpZiAoIG1ldGFkYXRh
ICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBtZXRh
ZGF0YS50eXBlOworCisgICAgICAgICAgICAgICAgICAgIGlmICggdHlwZSAhPT0gdW5kZWZpbmVk
ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHR5cGUudG9Mb3dlckNhc2UoKSA9
PT0gJ29iamVjdCcgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVy
cm9yKCAnVEhSRUUuSlNPTkxvYWRlcjogJyArIHVybCArICcgc2hvdWxkIGJlIGxvYWRlZCB3aXRo
IFRIUkVFLk9iamVjdExvYWRlciBpbnN0ZWFkLicgKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKCB0eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdzY2VuZScgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUuSlNPTkxvYWRl
cjogJyArIHVybCArICcgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIFRIUkVFLlNjZW5lTG9hZGVyIGlu
c3RlYWQuJyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBvYmplY3QgPSBzY29wZS5wYXJzZSgganNv
biwgdGV4dHVyZVBhdGggKTsKKyAgICAgICAgICAgICAgICBvbkxvYWQoIG9iamVjdC5nZW9tZXRy
eSwgb2JqZWN0Lm1hdGVyaWFscyApOworCisgICAgICAgICAgICB9LCBvblByb2dyZXNzLCBvbkVy
cm9yICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRUZXh0dXJlUGF0aDogZnVuY3Rpb24g
KCB2YWx1ZSApIHsKKworICAgICAgICAgICAgdGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlOworCisg
ICAgICAgIH0sCisKKyAgICAgICAgcGFyc2U6ICggZnVuY3Rpb24gKCkgeworCisgICAgICAgICAg
ICBmdW5jdGlvbiBwYXJzZU1vZGVsKCBqc29uLCBnZW9tZXRyeSApIHsKKworICAgICAgICAgICAg
ICAgIGZ1bmN0aW9uIGlzQml0U2V0KCB2YWx1ZSwgcG9zaXRpb24gKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHZhbHVlICYgKCAxIDw8IHBvc2l0aW9uICk7CisKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgaSwgaiwgZmksCisKKyAgICAgICAgICAgICAg
ICAgICAgb2Zmc2V0LCB6TGVuZ3RoLAorCisgICAgICAgICAgICAgICAgICAgIGNvbG9ySW5kZXgs
IG5vcm1hbEluZGV4LCB1dkluZGV4LCBtYXRlcmlhbEluZGV4LAorCisgICAgICAgICAgICAgICAg
ICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgIGlzUXVhZCwKKyAgICAgICAgICAgICAgICAg
ICAgaGFzTWF0ZXJpYWwsCisgICAgICAgICAgICAgICAgICAgIGhhc0ZhY2VWZXJ0ZXhVdiwKKyAg
ICAgICAgICAgICAgICAgICAgaGFzRmFjZU5vcm1hbCwgaGFzRmFjZVZlcnRleE5vcm1hbCwKKyAg
ICAgICAgICAgICAgICAgICAgaGFzRmFjZUNvbG9yLCBoYXNGYWNlVmVydGV4Q29sb3IsCisKKyAg
ICAgICAgICAgICAgICAgICAgdmVydGV4LCBmYWNlLCBmYWNlQSwgZmFjZUIsIGhleCwgbm9ybWFs
LAorCisgICAgICAgICAgICAgICAgICAgIHV2TGF5ZXIsIHV2LCB1LCB2LAorCisgICAgICAgICAg
ICAgICAgICAgIGZhY2VzID0ganNvbi5mYWNlcywKKyAgICAgICAgICAgICAgICAgICAgdmVydGlj
ZXMgPSBqc29uLnZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgICBub3JtYWxzID0ganNvbi5u
b3JtYWxzLAorICAgICAgICAgICAgICAgICAgICBjb2xvcnMgPSBqc29uLmNvbG9ycywKKworICAg
ICAgICAgICAgICAgICAgICBzY2FsZSA9IGpzb24uc2NhbGUsCisKKyAgICAgICAgICAgICAgICAg
ICAgblV2TGF5ZXJzID0gMDsKKworCisgICAgICAgICAgICAgICAgaWYgKCBqc29uLnV2cyAhPT0g
dW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIGRpc3JlZ2FyZCBlbXB0eSBh
cnJheXMKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGpzb24udXZzLmxl
bmd0aDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBqc29uLnV2c1sg
aSBdLmxlbmd0aCApIG5VdkxheWVycyArKzsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXSA9IFtd
OworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgekxlbmd0aCA9IHZlcnRpY2Vz
Lmxlbmd0aDsKKworICAgICAgICAgICAgICAgIHdoaWxlICggb2Zmc2V0IDwgekxlbmd0aCApIHsK
KworICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOworCisgICAgICAg
ICAgICAgICAgICAgIHZlcnRleC54ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2NhbGU7Cisg
ICAgICAgICAgICAgICAgICAgIHZlcnRleC55ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2Nh
bGU7CisgICAgICAgICAgICAgICAgICAgIHZlcnRleC56ID0gdmVydGljZXNbIG9mZnNldCArKyBd
ICogc2NhbGU7CisKKyAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudmVydGljZXMucHVzaCgg
dmVydGV4ICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvZmZzZXQg
PSAwOworICAgICAgICAgICAgICAgIHpMZW5ndGggPSBmYWNlcy5sZW5ndGg7CisKKyAgICAgICAg
ICAgICAgICB3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgdHlwZSA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKworICAgICAgICAgICAgICAgICAgICBpc1F1
YWQgPSBpc0JpdFNldCggdHlwZSwgMCApOworICAgICAgICAgICAgICAgICAgICBoYXNNYXRlcmlh
bCA9IGlzQml0U2V0KCB0eXBlLCAxICk7CisgICAgICAgICAgICAgICAgICAgIGhhc0ZhY2VWZXJ0
ZXhVdiA9IGlzQml0U2V0KCB0eXBlLCAzICk7CisgICAgICAgICAgICAgICAgICAgIGhhc0ZhY2VO
b3JtYWwgPSBpc0JpdFNldCggdHlwZSwgNCApOworICAgICAgICAgICAgICAgICAgICBoYXNGYWNl
VmVydGV4Tm9ybWFsID0gaXNCaXRTZXQoIHR5cGUsIDUgKTsKKyAgICAgICAgICAgICAgICAgICAg
aGFzRmFjZUNvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDYgKTsKKyAgICAgICAgICAgICAgICAgICAg
aGFzRmFjZVZlcnRleENvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDcgKTsKKworICAgICAgICAgICAg
ICAgICAgICAvLyBjb25zb2xlLmxvZygidHlwZSIsIHR5cGUsICJiaXRzIiwgaXNRdWFkLCBoYXNN
YXRlcmlhbCwgaGFzRmFjZVZlcnRleFV2LCBoYXNGYWNlTm9ybWFsLCBoYXNGYWNlVmVydGV4Tm9y
bWFsLCBoYXNGYWNlQ29sb3IsIGhhc0ZhY2VWZXJ0ZXhDb2xvcik7CisKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCBpc1F1YWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VBID0g
bmV3IEZhY2UzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWNlQS5hID0gZmFjZXNbIG9m
ZnNldCBdOworICAgICAgICAgICAgICAgICAgICAgICAgZmFjZUEuYiA9IGZhY2VzWyBvZmZzZXQg
KyAxIF07CisgICAgICAgICAgICAgICAgICAgICAgICBmYWNlQS5jID0gZmFjZXNbIG9mZnNldCAr
IDMgXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmFjZUIgPSBuZXcgRmFjZTMoKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGZhY2VCLmEgPSBmYWNlc1sgb2Zmc2V0ICsgMSBdOworICAg
ICAgICAgICAgICAgICAgICAgICAgZmFjZUIuYiA9IGZhY2VzWyBvZmZzZXQgKyAyIF07CisgICAg
ICAgICAgICAgICAgICAgICAgICBmYWNlQi5jID0gZmFjZXNbIG9mZnNldCArIDMgXTsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICggaGFzTWF0ZXJpYWwgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBt
YXRlcmlhbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGZhY2VBLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4OworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZhY2VCLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4OworCisg
ICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRv
IGdldCBmYWNlIDw9PiB1diBpbmRleCBjb3JyZXNwb25kZW5jZQorCisgICAgICAgICAgICAgICAg
ICAgICAgICBmaSA9IGdlb21ldHJ5LmZhY2VzLmxlbmd0aDsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmb3IgKCBpID0gMDsgaSA8IG5VdkxheWVyczsgaSArKyApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB1dkxheWVyID0ganNvbi51dnNbIGkgXTsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0g
PSBbXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuZmFjZVZlcnRl
eFV2c1sgaSBdWyBmaSArIDEgXSA9IFtdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGZvciAoIGogPSAwOyBqIDwgNDsgaiArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdXZJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyIF07Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdXZMYXllclsgdXZJbmRleCAq
IDIgKyAxIF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2ID0gbmV3
IFZlY3RvcjIoIHUsIHYgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCBqICE9PSAyICkgZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdLnB1c2goIHV2
ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGogIT09IDAgKSBn
ZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdLnB1c2goIHV2ICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICggaGFzRmFjZU5vcm1hbCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMzsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGZhY2VBLm5vcm1hbC5zZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG5vcm1hbHNbIG5vcm1hbEluZGV4IF0KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZUIubm9ybWFsLmNv
cHkoIGZhY2VBLm5vcm1hbCApOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQg
KysgXSAqIDM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsID0gbmV3
IFZlY3RvcjMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxzWyBu
b3JtYWxJbmRleCArKyBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9y
bWFsc1sgbm9ybWFsSW5kZXggKysgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG5vcm1hbHNbIG5vcm1hbEluZGV4IF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaSAhPT0gMiAp
IGZhY2VBLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICggaSAhPT0gMCApIGZhY2VCLnZlcnRleE5vcm1hbHMucHVzaCggbm9y
bWFsICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGhhc0ZhY2VDb2xv
ciApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ySW5kZXggPSBmYWNlc1sg
b2Zmc2V0ICsrIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ID0gY29sb3JzWyBj
b2xvckluZGV4IF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlQS5jb2xvci5z
ZXRIZXgoIGhleCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VCLmNvbG9yLnNl
dEhleCggaGV4ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXggPSBjb2xvcnNbIGNvbG9ySW5kZXgg
XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGkgIT09IDIgKSBmYWNl
QS52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBoZXggKSApOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoIGkgIT09IDAgKSBmYWNlQi52ZXJ0ZXhDb2xvcnMucHVzaCgg
bmV3IENvbG9yKCBoZXggKSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlb21l
dHJ5LmZhY2VzLnB1c2goIGZhY2VBICk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRy
eS5mYWNlcy5wdXNoKCBmYWNlQiApOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBuZXcgRmFjZTMoKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGZhY2UuYSA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGZhY2UuYiA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGZhY2UuYyA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCBoYXNNYXRlcmlhbCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG1hdGVyaWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZmFjZS5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBnZXQgZmFj
ZSA8PT4gdXYgaW5kZXggY29ycmVzcG9uZGVuY2UKKworICAgICAgICAgICAgICAgICAgICAgICAg
ZmkgPSBnZW9tZXRyeS5mYWNlcy5sZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICggaGFzRmFjZVZlcnRleFV2ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9y
ICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdXZMYXllciA9IGpzb24udXZzWyBpIF07CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdID0gW107CisK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCAzOyBqICsr
ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dkluZGV4ID0gZmFj
ZXNbIG9mZnNldCArKyBdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1
ID0gdXZMYXllclsgdXZJbmRleCAqIDIgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdXYgPSBuZXcgVmVjdG9yMiggdSwgdiApOworCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1b
IGZpIF0ucHVzaCggdXYgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBoYXNGYWNlTm9ybWFsICkgeworCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsr
IF0gKiAzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS5ub3JtYWwuc2V0KAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxzWyBub3JtYWxJbmRleCArKyBd
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxzWyBub3JtYWxJbmRleCAr
KyBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxzWyBub3JtYWxJbmRl
eCBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3Jt
YWwgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDM7
IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsSW5kZXgg
PSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG5vcm1hbCA9IG5ldyBWZWN0b3IzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBub3JtYWxzWyBub3JtYWxJbmRleCBdCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZmFjZS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApOworCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKCBoYXNGYWNlQ29sb3IgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGZhY2UuY29sb3Iuc2V0SGV4KCBjb2xvcnNbIGNvbG9ySW5kZXggXSApOwor
CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCBoYXNGYWNlVmVydGV4Q29sb3IgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmb3IgKCBpID0gMDsgaSA8IDM7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZmFjZS52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBjb2xv
cnNbIGNvbG9ySW5kZXggXSApICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZ2Vv
bWV0cnkuZmFjZXMucHVzaCggZmFjZSApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdW5jdGlvbiBw
YXJzZVNraW4oIGpzb24sIGdlb21ldHJ5ICkgeworCisgICAgICAgICAgICAgICAgdmFyIGluZmx1
ZW5jZXNQZXJWZXJ0ZXggPSAoIGpzb24uaW5mbHVlbmNlc1BlclZlcnRleCAhPT0gdW5kZWZpbmVk
ICkgPyBqc29uLmluZmx1ZW5jZXNQZXJWZXJ0ZXggOiAyOworCisgICAgICAgICAgICAgICAgaWYg
KCBqc29uLnNraW5XZWlnaHRzICkgeworCisgICAgICAgICAgICAgICAgICAgIGZvciAoIHZhciBp
ID0gMCwgbCA9IGpzb24uc2tpbldlaWdodHMubGVuZ3RoOyBpIDwgbDsgaSArPSBpbmZsdWVuY2Vz
UGVyVmVydGV4ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IGpzb24uc2tp
bldlaWdodHNbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ID0gKCBpbmZsdWVu
Y2VzUGVyVmVydGV4ID4gMSApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDEgXSA6IDA7CisgICAg
ICAgICAgICAgICAgICAgICAgICB2YXIgeiA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDIgKSA/
IGpzb24uc2tpbldlaWdodHNbIGkgKyAyIF0gOiAwOworICAgICAgICAgICAgICAgICAgICAgICAg
dmFyIHcgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBqc29uLnNraW5XZWlnaHRzWyBp
ICsgMyBdIDogMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuc2tpbldlaWdo
dHMucHVzaCggbmV3IFZlY3RvcjQoIHgsIHksIHosIHcgKSApOworCisgICAgICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgganNvbi5z
a2luSW5kaWNlcyApIHsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwg
PSBqc29uLnNraW5JbmRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKz0gaW5mbHVlbmNlc1BlclZlcnRl
eCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBqc29uLnNraW5JbmRpY2Vz
WyBpIF07CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9ICggaW5mbHVlbmNlc1BlclZl
cnRleCA+IDEgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAxIF0gOiAwOworICAgICAgICAgICAg
ICAgICAgICAgICAgdmFyIGMgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAyICkgPyBqc29uLnNr
aW5JbmRpY2VzWyBpICsgMiBdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0g
KCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMyApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDMgXSA6
IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LnNraW5JbmRpY2VzLnB1c2go
IG5ldyBWZWN0b3I0KCBhLCBiLCBjLCBkICkgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBnZW9tZXRyeS5ib25lcyA9IGpz
b24uYm9uZXM7CisKKyAgICAgICAgICAgICAgICBpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21l
dHJ5LmJvbmVzLmxlbmd0aCA+IDAgJiYgKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggIT09
IGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCB8fCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5n
dGggIT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApICkgeworCisgICAgICAgICAgICAgICAg
ICAgIGNvbnNvbGUud2FybiggJ1doZW4gc2tpbm5pbmcsIG51bWJlciBvZiB2ZXJ0aWNlcyAoJyAr
IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCArICcpLCBza2luSW5kaWNlcyAoJyArCisgICAgICAg
ICAgICAgICAgICAgICAgICBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggKyAnKSwgYW5kIHNr
aW5XZWlnaHRzICgnICsgZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICsgJykgc2hvdWxkIG1h
dGNoLicgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBmdW5jdGlvbiBwYXJzZU1vcnBoaW5nKCBqc29uLCBnZW9tZXRyeSApIHsKKworICAgICAg
ICAgICAgICAgIHZhciBzY2FsZSA9IGpzb24uc2NhbGU7CisKKyAgICAgICAgICAgICAgICBpZiAo
IGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgbDsg
aSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkubW9ycGhUYXJnZXRz
WyBpIF0gPSB7fTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0
c1sgaSBdLm5hbWUgPSBqc29uLm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWU7CisgICAgICAgICAgICAg
ICAgICAgICAgICBnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyA9IFtdOworCisg
ICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHN0VmVydGljZXMgPSBnZW9tZXRyeS5tb3JwaFRh
cmdldHNbIGkgXS52ZXJ0aWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcmNWZXJ0
aWNlcyA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGZvciAoIHZhciB2ID0gMCwgdmwgPSBzcmNWZXJ0aWNlcy5sZW5ndGg7IHYgPCB2
bDsgdiArPSAzICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZlcnRleCA9
IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4LnggPSBz
cmNWZXJ0aWNlc1sgdiBdICogc2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVy
dGV4LnkgPSBzcmNWZXJ0aWNlc1sgdiArIDEgXSAqIHNjYWxlOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHZlcnRleC56ID0gc3JjVmVydGljZXNbIHYgKyAyIF0gKiBzY2FsZTsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFZlcnRpY2VzLnB1c2goIHZlcnRleCApOworCisg
ICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBqc29uLm1vcnBoQ29sb3JzICE9
PSB1bmRlZmluZWQgJiYganNvbi5tb3JwaENvbG9ycy5sZW5ndGggPiAwICkgeworCisgICAgICAg
ICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkpTT05Mb2FkZXI6ICJtb3JwaENvbG9y
cyIgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNpbmcgdGhlbSBhcyBmYWNlIGNvbG9ycy4nICk7CisK
KyAgICAgICAgICAgICAgICAgICAgdmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7CisgICAgICAg
ICAgICAgICAgICAgIHZhciBtb3JwaENvbG9ycyA9IGpzb24ubW9ycGhDb2xvcnNbIDAgXS5jb2xv
cnM7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVu
Z3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNbIGkg
XS5jb2xvci5mcm9tQXJyYXkoIG1vcnBoQ29sb3JzLCBpICogMyApOworCisgICAgICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBmdW5jdGlvbiBwYXJzZUFuaW1hdGlvbnMoIGpzb24sIGdlb21ldHJ5ICkgeworCisgICAg
ICAgICAgICAgICAgdmFyIG91dHB1dEFuaW1hdGlvbnMgPSBbXTsKKworICAgICAgICAgICAgICAg
IC8vIHBhcnNlIG9sZCBzdHlsZSBCb25lL0hpZXJhcmNoeSBhbmltYXRpb25zCisgICAgICAgICAg
ICAgICAgdmFyIGFuaW1hdGlvbnMgPSBbXTsKKworICAgICAgICAgICAgICAgIGlmICgganNvbi5h
bmltYXRpb24gIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICBhbmltYXRp
b25zLnB1c2goIGpzb24uYW5pbWF0aW9uICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICBpZiAoIGpzb24uYW5pbWF0aW9ucyAhPT0gdW5kZWZpbmVkICkgeworCisgICAg
ICAgICAgICAgICAgICAgIGlmICgganNvbi5hbmltYXRpb25zLmxlbmd0aCApIHsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgYW5pbWF0aW9ucyA9IGFuaW1hdGlvbnMuY29uY2F0KCBqc29uLmFu
aW1hdGlvbnMgKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAg
ICAgICAgICAgICAgICBhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9ucyApOworCisgICAg
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IGZvciAoIHZhciBpID0gMDsgaSA8IGFuaW1hdGlvbnMubGVuZ3RoOyBpICsrICkgeworCisgICAg
ICAgICAgICAgICAgICAgIHZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZUFuaW1hdGlvbigg
YW5pbWF0aW9uc1sgaSBdLCBnZW9tZXRyeS5ib25lcyApOworICAgICAgICAgICAgICAgICAgICBp
ZiAoIGNsaXAgKSBvdXRwdXRBbmltYXRpb25zLnB1c2goIGNsaXAgKTsKKworICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHBhcnNlIGltcGxpY2l0IG1vcnBoIGFuaW1hdGlv
bnMKKyAgICAgICAgICAgICAgICBpZiAoIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHsKKworICAg
ICAgICAgICAgICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgYW4gYXBwcm9wcmFpdGUg
RlBTIGlzIGZvciBtb3JwaCB0YXJnZXQgYW5pbWF0aW9ucyAtLSBkZWZhdWx0aW5nIHRvIDEwLCBi
dXQgcmVhbGx5IGl0IGlzIGNvbXBsZXRlbHkgYXJiaXRyYXJ5LgorICAgICAgICAgICAgICAgICAg
ICB2YXIgbW9ycGhBbmltYXRpb25DbGlwcyA9IEFuaW1hdGlvbkNsaXAuQ3JlYXRlQ2xpcHNGcm9t
TW9ycGhUYXJnZXRTZXF1ZW5jZXMoIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cywgMTAgKTsKKyAgICAg
ICAgICAgICAgICAgICAgb3V0cHV0QW5pbWF0aW9ucyA9IG91dHB1dEFuaW1hdGlvbnMuY29uY2F0
KCBtb3JwaEFuaW1hdGlvbkNsaXBzICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICBpZiAoIG91dHB1dEFuaW1hdGlvbnMubGVuZ3RoID4gMCApIGdlb21ldHJ5LmFuaW1h
dGlvbnMgPSBvdXRwdXRBbmltYXRpb25zOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IHJldHVybiBmdW5jdGlvbiAoIGpzb24sIHRleHR1cmVQYXRoICkgeworCisgICAgICAgICAgICAg
ICAgaWYgKCBqc29uLmRhdGEgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAg
ICAvLyBHZW9tZXRyeSA0LjAgc3BlYworICAgICAgICAgICAgICAgICAgICBqc29uID0ganNvbi5k
YXRhOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBqc29uLnNj
YWxlICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAganNvbi5zY2FsZSA9
IDEuMCAvIGpzb24uc2NhbGU7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAg
ICAgICAgICAgICAgIGpzb24uc2NhbGUgPSAxLjA7CisKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTsKKworICAgICAgICAg
ICAgICAgIHBhcnNlTW9kZWwoIGpzb24sIGdlb21ldHJ5ICk7CisgICAgICAgICAgICAgICAgcGFy
c2VTa2luKCBqc29uLCBnZW9tZXRyeSApOworICAgICAgICAgICAgICAgIHBhcnNlTW9ycGhpbmco
IGpzb24sIGdlb21ldHJ5ICk7CisgICAgICAgICAgICAgICAgcGFyc2VBbmltYXRpb25zKCBqc29u
LCBnZW9tZXRyeSApOworCisgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29tcHV0ZUZhY2VOb3Jt
YWxzKCk7CisgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7
CisKKyAgICAgICAgICAgICAgICBpZiAoIGpzb24ubWF0ZXJpYWxzID09PSB1bmRlZmluZWQgfHwg
anNvbi5tYXRlcmlhbHMubGVuZ3RoID09PSAwICkgeworCisgICAgICAgICAgICAgICAgICAgIHJl
dHVybiB7IGdlb21ldHJ5OiBnZW9tZXRyeSB9OworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsK
KworICAgICAgICAgICAgICAgICAgICB2YXIgbWF0ZXJpYWxzID0gTG9hZGVyLnByb3RvdHlwZS5p
bml0TWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZVBhdGgsIHRoaXMuY3Jvc3NPcmln
aW4gKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBnZW9tZXRyeTogZ2VvbWV0cnks
IG1hdGVyaWFsczogbWF0ZXJpYWxzIH07CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIH07CisKKyAgICAgICAgfSApKCkKKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAqIEBh
dXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlv
biBPYmplY3RMb2FkZXIoIG1hbmFnZXIgKSB7CisKKyAgICAgICAgdGhpcy5tYW5hZ2VyID0gKCBt
YW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7
CisgICAgICAgIHRoaXMudGV4dHVyZVBhdGggPSAnJzsKKworICAgIH0KKworICAgIE9iamVjdC5h
c3NpZ24oIE9iamVjdExvYWRlci5wcm90b3R5cGUsIHsKKworICAgICAgICBsb2FkOiBmdW5jdGlv
biAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgeworCisgICAgICAgICAgICBp
ZiAoIHRoaXMudGV4dHVyZVBhdGggPT09ICcnICkgeworCisgICAgICAgICAgICAgICAgdGhpcy50
ZXh0dXJlUGF0aCA9IHVybC5zdWJzdHJpbmcoIDAsIHVybC5sYXN0SW5kZXhPZiggJy8nICkgKyAx
ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHNjb3BlID0gdGhpczsKKwor
ICAgICAgICAgICAgdmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7
CisgICAgICAgICAgICBsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7CisKKyAg
ICAgICAgICAgICAgICB2YXIganNvbiA9IG51bGw7CisKKyAgICAgICAgICAgICAgICB0cnkgewor
CisgICAgICAgICAgICAgICAgICAgIGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7CisKKyAgICAg
ICAgICAgICAgICB9IGNhdGNoICggZXJyb3IgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYg
KCBvbkVycm9yICE9PSB1bmRlZmluZWQgKSBvbkVycm9yKCBlcnJvciApOworCisgICAgICAgICAg
ICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRTpPYmplY3RMb2FkZXI6IENhblwndCBwYXJz
ZSAnICsgdXJsICsgJy4nLCBlcnJvci5tZXNzYWdlICk7CisKKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIG1ldGFk
YXRhID0ganNvbi5tZXRhZGF0YTsKKworICAgICAgICAgICAgICAgIGlmICggbWV0YWRhdGEgPT09
IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlw
ZS50b0xvd2VyQ2FzZSgpID09PSAnZ2VvbWV0cnknICkgeworCisgICAgICAgICAgICAgICAgICAg
IGNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3RMb2FkZXI6IENhblwndCBsb2FkICcgKyB1cmwg
KyAnLiBVc2UgVEhSRUUuSlNPTkxvYWRlciBpbnN0ZWFkLicgKTsKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2NvcGUu
cGFyc2UoIGpzb24sIG9uTG9hZCApOworCisgICAgICAgICAgICB9LCBvblByb2dyZXNzLCBvbkVy
cm9yICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBzZXRUZXh0dXJlUGF0aDogZnVuY3Rpb24g
KCB2YWx1ZSApIHsKKworICAgICAgICAgICAgdGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlOworCisg
ICAgICAgIH0sCisKKyAgICAgICAgc2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7
CisKKyAgICAgICAgICAgIHRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTsKKworICAgICAgICB9LAor
CisgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9hZCApIHsKKworICAgICAgICAg
ICAgdmFyIGdlb21ldHJpZXMgPSB0aGlzLnBhcnNlR2VvbWV0cmllcygganNvbi5nZW9tZXRyaWVz
ICk7CisKKyAgICAgICAgICAgIHZhciBpbWFnZXMgPSB0aGlzLnBhcnNlSW1hZ2VzKCBqc29uLmlt
YWdlcywgZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAgICAgaWYgKCBvbkxvYWQgIT09IHVu
ZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7CisKKyAgICAgICAgICAgIH0gKTsKKworICAgICAg
ICAgICAgdmFyIHRleHR1cmVzID0gdGhpcy5wYXJzZVRleHR1cmVzKCBqc29uLnRleHR1cmVzLCBp
bWFnZXMgKTsKKyAgICAgICAgICAgIHZhciBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxz
KCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTsKKworICAgICAgICAgICAgdmFyIG9iamVjdCA9
IHRoaXMucGFyc2VPYmplY3QoIGpzb24ub2JqZWN0LCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKTsK
KworICAgICAgICAgICAgaWYgKCBqc29uLmFuaW1hdGlvbnMgKSB7CisKKyAgICAgICAgICAgICAg
ICBvYmplY3QuYW5pbWF0aW9ucyA9IHRoaXMucGFyc2VBbmltYXRpb25zKCBqc29uLmFuaW1hdGlv
bnMgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGpzb24uaW1hZ2VzID09
PSB1bmRlZmluZWQgfHwganNvbi5pbWFnZXMubGVuZ3RoID09PSAwICkgeworCisgICAgICAgICAg
ICAgICAgaWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7CisKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKworICAgICAgICB9LAor
CisgICAgICAgIHBhcnNlR2VvbWV0cmllczogZnVuY3Rpb24gKCBqc29uICkgeworCisgICAgICAg
ICAgICB2YXIgZ2VvbWV0cmllcyA9IHt9OworCisgICAgICAgICAgICBpZiAoIGpzb24gIT09IHVu
ZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIHZhciBnZW9tZXRyeUxvYWRlciA9IG5ldyBK
U09OTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlckdlb21ldHJ5TG9hZGVyID0g
bmV3IEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIg
aSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgdmFyIGdlb21ldHJ5OworICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGpzb25b
IGkgXTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1BsYW5lR2VvbWV0cnknOgorICAgICAgICAgICAg
ICAgICAgICAgICAgY2FzZSAnUGxhbmVCdWZmZXJHZW9tZXRyeSc6CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS53aWR0aCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZGF0YS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRhdGEud2lkdGhTZWdtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZGF0YS5oZWlnaHRTZWdtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgY2FzZSAnQm94R2VvbWV0cnknOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAn
Qm94QnVmZmVyR2VvbWV0cnknOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ3ViZUdl
b21ldHJ5JzogLy8gYmFja3dhcmRzIGNvbXBhdGlibGUKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBkYXRhLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkYXRhLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGF0YS5kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS53aWR0aFNl
Z21lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmhlaWdodFNlZ21l
bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRlcHRoU2VnbWVudHMK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0NpcmNsZUdlb21l
dHJ5JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0NpcmNsZUJ1ZmZlckdlb21ldHJ5
JzoKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gbmV3IEdlb21ldHJp
ZXNbIGRhdGEudHlwZSBdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJh
ZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zZWdtZW50cywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS50aGV0YVN0YXJ0LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnRoZXRhTGVuZ3RoCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDeWxpbmRlckdlb21ldHJ5JzoKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGNhc2UgJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknOgorCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBl
IF0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmFkaXVzVG9wLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJhZGl1c0JvdHRvbSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGRhdGEucmFkaWFsU2VnbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGRhdGEuaGVpZ2h0U2VnbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRhdGEub3BlbkVuZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk
YXRhLnRoZXRhU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudGhl
dGFMZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0Nv
bmVHZW9tZXRyeSc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDb25lQnVmZmVyR2Vv
bWV0cnknOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBuZXcgR2Vv
bWV0cmllc1sgZGF0YS50eXBlIF0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRh
dGEucmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmhlaWdodCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yYWRpYWxTZWdtZW50cywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5oZWlnaHRTZWdtZW50cywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5vcGVuRW5kZWQsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRhdGEudGhldGFTdGFydCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZGF0YS50aGV0YUxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgY2FzZSAnU3BoZXJlR2VvbWV0cnknOgorICAgICAgICAgICAgICAgICAgICAg
ICAgY2FzZSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknOgorCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkYXRhLndpZHRoU2VnbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRhdGEuaGVpZ2h0U2VnbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRhdGEucGhpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEu
cGhpTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnRoZXRhU3Rh
cnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudGhldGFMZW5ndGgKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RvZGVjYWhlZHJvbkdl
b21ldHJ5JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0ljb3NhaGVkcm9uR2VvbWV0
cnknOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnT2N0YWhlZHJvbkdlb21ldHJ5JzoK
KyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1RldHJhaGVkcm9uR2VvbWV0cnknOgorCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0
YS50eXBlIF0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmFkaXVzLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRldGFpbAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK
KworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUmluZ0dlb21ldHJ5JzoKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGNhc2UgJ1JpbmdCdWZmZXJHZW9tZXRyeSc6CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pbm5lclJhZGl1cywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5vdXRlclJhZGl1cywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZGF0YS50aGV0YVNlZ21lbnRzLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkYXRhLnBoaVNlZ21lbnRzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkYXRhLnRoZXRhU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRhdGEudGhldGFMZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGNhc2UgJ1RvcnVzR2VvbWV0cnknOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAn
VG9ydXNCdWZmZXJHZW9tZXRyeSc6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9t
ZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZGF0YS5yYWRpdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRhdGEudHViZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yYWRpYWxT
ZWdtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS50dWJ1bGFyU2Vn
bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuYXJjCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUb3J1c0tub3RHZW9tZXRyeSc6
CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSc6
CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVz
WyBkYXRhLnR5cGUgXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yYWRp
dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudHViZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS50dWJ1bGFyU2VnbWVudHMsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmFkaWFsU2VnbWVudHMsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRhdGEucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZGF0YS5xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdM
YXRoZUdlb21ldHJ5JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0xhdGhlQnVmZmVy
R2VvbWV0cnknOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBuZXcg
R2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRhdGEucG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnNlZ21l
bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBoaVN0YXJ0LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBoaUxlbmd0aAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK
KworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQnVmZmVyR2VvbWV0cnknOgorCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBidWZmZXJHZW9tZXRyeUxvYWRlci5w
YXJzZSggZGF0YSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0dlb21ldHJ5JzoKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEsIHRoaXMu
dGV4dHVyZVBhdGggKS5nZW9tZXRyeTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBv
cnRlZCBnZW9tZXRyeSB0eXBlICInICsgZGF0YS50eXBlICsgJyInICk7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudXVpZCA9IGRhdGEudXVpZDsKKworICAgICAgICAg
ICAgICAgICAgICBpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkubmFtZSA9
IGRhdGEubmFtZTsKKworICAgICAgICAgICAgICAgICAgICBnZW9tZXRyaWVzWyBkYXRhLnV1aWQg
XSA9IGdlb21ldHJ5OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIHJldHVybiBnZW9tZXRyaWVzOworCisgICAgICAgIH0sCisKKyAgICAgICAgcGFy
c2VNYXRlcmlhbHM6IGZ1bmN0aW9uICgganNvbiwgdGV4dHVyZXMgKSB7CisKKyAgICAgICAgICAg
IHZhciBtYXRlcmlhbHMgPSB7fTsKKworICAgICAgICAgICAgaWYgKCBqc29uICE9PSB1bmRlZmlu
ZWQgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgbG9hZGVyID0gbmV3IE1hdGVyaWFsTG9hZGVy
KCk7CisgICAgICAgICAgICAgICAgbG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApOworCisg
ICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBp
ICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ganNvblsgaSBdOworCisg
ICAgICAgICAgICAgICAgICAgIGlmICggZGF0YS50eXBlID09PSAnTXVsdGlNYXRlcmlhbCcgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlcHJlY2F0ZWQKKworICAgICAgICAgICAg
ICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZv
ciAoIHZhciBqID0gMDsgaiA8IGRhdGEubWF0ZXJpYWxzLmxlbmd0aDsgaiArKyApIHsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goIGxvYWRlci5wYXJzZSggZGF0YS5t
YXRlcmlhbHNbIGogXSApICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGFycmF5OworCisgICAg
ICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVy
aWFsc1sgZGF0YS51dWlkIF0gPSBsb2FkZXIucGFyc2UoIGRhdGEgKTsKKworICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgcmV0dXJuIG1hdGVyaWFsczsKKworICAgICAgICB9LAorCisgICAgICAgIHBhcnNlQW5p
bWF0aW9uczogZnVuY3Rpb24gKCBqc29uICkgeworCisgICAgICAgICAgICB2YXIgYW5pbWF0aW9u
cyA9IFtdOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBqc29uLmxlbmd0aDsg
aSArKyApIHsKKworICAgICAgICAgICAgICAgIHZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJz
ZSgganNvblsgaSBdICk7CisKKyAgICAgICAgICAgICAgICBhbmltYXRpb25zLnB1c2goIGNsaXAg
KTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYW5pbWF0aW9uczsKKwor
ICAgICAgICB9LAorCisgICAgICAgIHBhcnNlSW1hZ2VzOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9h
ZCApIHsKKworICAgICAgICAgICAgdmFyIHNjb3BlID0gdGhpczsKKyAgICAgICAgICAgIHZhciBp
bWFnZXMgPSB7fTsKKworICAgICAgICAgICAgZnVuY3Rpb24gbG9hZEltYWdlKCB1cmwgKSB7CisK
KyAgICAgICAgICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7CisKKyAgICAg
ICAgICAgICAgICByZXR1cm4gbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCkgeworCisgICAg
ICAgICAgICAgICAgICAgIHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CisKKyAgICAgICAg
ICAgICAgICB9LCB1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgICAg
ICBzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOworICAgICAgICAgICAgICAgICAgICBzY29w
ZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7CisKKyAgICAgICAgICAgICAgICB9ICk7CisKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBqc29uICE9PSB1bmRlZmluZWQgJiYganNv
bi5sZW5ndGggPiAwICkgeworCisgICAgICAgICAgICAgICAgdmFyIG1hbmFnZXIgPSBuZXcgTG9h
ZGluZ01hbmFnZXIoIG9uTG9hZCApOworCisgICAgICAgICAgICAgICAgdmFyIGxvYWRlciA9IG5l
dyBJbWFnZUxvYWRlciggbWFuYWdlciApOworICAgICAgICAgICAgICAgIGxvYWRlci5zZXRDcm9z
c09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApOworCisgICAgICAgICAgICAgICAgZm9yICggdmFy
IGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisgICAgICAgICAgICAg
ICAgICAgIHZhciBpbWFnZSA9IGpzb25bIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBh
dGggPSAvXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdCggaW1hZ2UudXJsICkgPyBpbWFn
ZS51cmwgOiBzY29wZS50ZXh0dXJlUGF0aCArIGltYWdlLnVybDsKKworICAgICAgICAgICAgICAg
ICAgICBpbWFnZXNbIGltYWdlLnV1aWQgXSA9IGxvYWRJbWFnZSggcGF0aCApOworCisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBpbWFnZXM7
CisKKyAgICAgICAgfSwKKworICAgICAgICBwYXJzZVRleHR1cmVzOiBmdW5jdGlvbiAoIGpzb24s
IGltYWdlcyApIHsKKworICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VDb25zdGFudCggdmFsdWUs
IHR5cGUgKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiggdmFsdWUgKSA9PT0gJ251
bWJlcicgKSByZXR1cm4gdmFsdWU7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdU
SFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVt
ZXJpYyBmb3JtLicsIHZhbHVlICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZVsgdmFs
dWUgXTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdGV4dHVyZXMgPSB7fTsK
KworICAgICAgICAgICAgaWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAg
ICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBqc29uWyBpIF07CisKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKCBkYXRhLmltYWdlID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gImltYWdl
IiBzcGVjaWZpZWQgZm9yJywgZGF0YS51dWlkICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgICAgIGlmICggaW1hZ2VzWyBkYXRhLmltYWdlIF0gPT09IHVuZGVm
aW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUu
T2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UnLCBkYXRhLmltYWdlICk7CisKKyAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gbmV3IFRl
eHR1cmUoIGltYWdlc1sgZGF0YS5pbWFnZSBdICk7CisgICAgICAgICAgICAgICAgICAgIHRleHR1
cmUubmVlZHNVcGRhdGUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIHRleHR1cmUudXVp
ZCA9IGRhdGEudXVpZDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGRhdGEubmFtZSAhPT0g
dW5kZWZpbmVkICkgdGV4dHVyZS5uYW1lID0gZGF0YS5uYW1lOworCisgICAgICAgICAgICAgICAg
ICAgIGlmICggZGF0YS5tYXBwaW5nICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1hcHBpbmcgPSBw
YXJzZUNvbnN0YW50KCBkYXRhLm1hcHBpbmcsIFRFWFRVUkVfTUFQUElORyApOworCisgICAgICAg
ICAgICAgICAgICAgIGlmICggZGF0YS5vZmZzZXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUub2Zm
c2V0LmZyb21BcnJheSggZGF0YS5vZmZzZXQgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBk
YXRhLnJlcGVhdCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5yZXBlYXQuZnJvbUFycmF5KCBkYXRh
LnJlcGVhdCApOworICAgICAgICAgICAgICAgICAgICBpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZp
bmVkICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLndyYXBTID0gcGFyc2VD
b25zdGFudCggZGF0YS53cmFwWyAwIF0sIFRFWFRVUkVfV1JBUFBJTkcgKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHRleHR1cmUud3JhcFQgPSBwYXJzZUNvbnN0YW50KCBkYXRhLndyYXBbIDEg
XSwgVEVYVFVSRV9XUkFQUElORyApOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgICAgICBpZiAoIGRhdGEubWluRmlsdGVyICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJl
Lm1pbkZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWluRmlsdGVyLCBURVhUVVJFX0ZJTFRF
UiApOworICAgICAgICAgICAgICAgICAgICBpZiAoIGRhdGEubWFnRmlsdGVyICE9PSB1bmRlZmlu
ZWQgKSB0ZXh0dXJlLm1hZ0ZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFnRmlsdGVyLCBU
RVhUVVJFX0ZJTFRFUiApOworICAgICAgICAgICAgICAgICAgICBpZiAoIGRhdGEuYW5pc290cm9w
eSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5hbmlzb3Ryb3B5ID0gZGF0YS5hbmlzb3Ryb3B5Owor
CisgICAgICAgICAgICAgICAgICAgIGlmICggZGF0YS5mbGlwWSAhPT0gdW5kZWZpbmVkICkgdGV4
dHVyZS5mbGlwWSA9IGRhdGEuZmxpcFk7CisKKyAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXNb
IGRhdGEudXVpZCBdID0gdGV4dHVyZTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGV4dHVyZXM7CisKKyAgICAgICAgfSwKKworICAg
ICAgICBwYXJzZU9iamVjdDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgbWF0cml4
ID0gbmV3IE1hdHJpeDQoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBhcnNlT2Jq
ZWN0KCBkYXRhLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKSB7CisKKyAgICAgICAgICAgICAgICB2
YXIgb2JqZWN0OworCisgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0R2VvbWV0cnkoIG5hbWUg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBnZW9tZXRyaWVzWyBuYW1lIF0gPT09IHVu
ZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhS
RUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnknLCBuYW1lICk7CisKKyAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW9tZXRyaWVzWyBu
YW1lIF07CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBn
ZXRNYXRlcmlhbCggbmFtZSApIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIG5hbWUgPT09
IHVuZGVmaW5lZCApIHJldHVybiB1bmRlZmluZWQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYg
KCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZh
ciBhcnJheSA9IFtdOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAs
IGwgPSBuYW1lLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB2YXIgdXVpZCA9IG5hbWVbIGkgXTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICggbWF0ZXJpYWxzWyB1dWlkIF0gPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6
IFVuZGVmaW5lZCBtYXRlcmlhbCcsIHV1aWQgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goIG1hdGVyaWFs
c1sgdXVpZCBdICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGFycmF5OworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgICAgICBpZiAoIG1hdGVyaWFsc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExv
YWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgbmFtZSApOworCisgICAgICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0ZXJpYWxzWyBuYW1lIF07CisKKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnU2NlbmUnOgorCisgICAgICAgICAgICAgICAg
ICAgICAgICBvYmplY3QgPSBuZXcgU2NlbmUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCBkYXRhLmJhY2tncm91bmQgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICggTnVtYmVyLmlzSW50ZWdlciggZGF0YS5iYWNrZ3JvdW5kICkgKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmJhY2tncm91bmQgPSBu
ZXcgQ29sb3IoIGRhdGEuYmFja2dyb3VuZCApOworCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICggZGF0YS5mb2cgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZycgKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmZvZyA9IG5ldyBGb2coIGRhdGEuZm9nLmNvbG9y
LCBkYXRhLmZvZy5uZWFyLCBkYXRhLmZvZy5mYXIgKTsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIH0gZWxzZSBpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2dFeHAyJyApIHsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZm9nID0gbmV3IEZvZ0V4cDIoIGRh
dGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5kZW5zaXR5ICk7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnUGVyc3BlY3RpdmVD
YW1lcmEnOgorCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgUGVyc3BlY3Rp
dmVDYW1lcmEoIGRhdGEuZm92LCBkYXRhLmFzcGVjdCwgZGF0YS5uZWFyLCBkYXRhLmZhciApOwor
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRhdGEuZm9jdXMgIT09IHVuZGVmaW5lZCAp
IG9iamVjdC5mb2N1cyA9IGRhdGEuZm9jdXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
IGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIGRhdGEuZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSBv
YmplY3QuZmlsbUdhdWdlID0gZGF0YS5maWxtR2F1Z2U7CisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIGRhdGEuZmlsbU9mZnNldCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1PZmZzZXQg
PSBkYXRhLmZpbG1PZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRhdGEudmll
dyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgZGF0YS52
aWV3ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAg
ICAgICAgIGNhc2UgJ09ydGhvZ3JhcGhpY0NhbWVyYSc6CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIG9iamVjdCA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIGRhdGEubGVmdCwgZGF0YS5yaWdo
dCwgZGF0YS50b3AsIGRhdGEuYm90dG9tLCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0Ft
YmllbnRMaWdodCc6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBBbWJp
ZW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RpcmVjdGlvbmFs
TGlnaHQnOgorCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgRGlyZWN0aW9u
YWxMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkgKTsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnUG9pbnRMaWdodCc6
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBQb2ludExpZ2h0KCBkYXRh
LmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5kZWNheSApOworCisg
ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNl
ICdSZWN0QXJlYUxpZ2h0JzoKKworICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gbmV3
IFJlY3RBcmVhTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLndpZHRoLCBk
YXRhLmhlaWdodCApOworCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAg
ICAgICAgICAgICAgICBjYXNlICdTcG90TGlnaHQnOgorCisgICAgICAgICAgICAgICAgICAgICAg
ICBvYmplY3QgPSBuZXcgU3BvdExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0
YS5kaXN0YW5jZSwgZGF0YS5hbmdsZSwgZGF0YS5wZW51bWJyYSwgZGF0YS5kZWNheSApOworCisg
ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNl
ICdIZW1pc3BoZXJlTGlnaHQnOgorCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBu
ZXcgSGVtaXNwaGVyZUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmdyb3VuZENvbG9yLCBkYXRhLmlu
dGVuc2l0eSApOworCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAg
ICAgICAgICAgICBjYXNlICdTa2lubmVkTWVzaCc6CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZU9iamVjdCgpIGRvZXMgbm90
IHN1cHBvcnQgU2tpbm5lZE1lc2ggeWV0LicgKTsKKworICAgICAgICAgICAgICAgICAgICBjYXNl
ICdNZXNoJzoKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdlb21ldHJ5ID0gZ2V0R2Vv
bWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRl
cmlhbCA9IGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICk7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGlmICggZ2VvbWV0cnkuYm9uZXMgJiYgZ2VvbWV0cnkuYm9uZXMubGVuZ3RoID4gMCAp
IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBTa2lubmVkTWVz
aCggZ2VvbWV0cnksIG1hdGVyaWFsICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxz
ZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgTWVzaCggZ2Vv
bWV0cnksIG1hdGVyaWFsICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnTE9E
JzoKKworICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gbmV3IExPRCgpOworCisgICAg
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdM
aW5lJzoKKworICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gbmV3IExpbmUoIGdldEdl
b21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICksIGRh
dGEubW9kZSApOworCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAg
ICAgICAgICAgICBjYXNlICdMaW5lTG9vcCc6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9i
amVjdCA9IG5ldyBMaW5lTG9vcCggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0
ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApOworCisgICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdMaW5lU2VnbWVudHMnOgorCisgICAgICAg
ICAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgTGluZVNlZ21lbnRzKCBnZXRHZW9tZXRyeSgg
ZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1Bv
aW50Q2xvdWQnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdQb2ludHMnOgorCisgICAgICAg
ICAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgUG9pbnRzKCBnZXRHZW9tZXRyeSggZGF0YS5n
ZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1Nwcml0ZSc6
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBTcHJpdGUoIGdldE1hdGVy
aWFsKCBkYXRhLm1hdGVyaWFsICkgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnR3JvdXAnOgorCisgICAgICAgICAgICAgICAg
ICAgICAgICBvYmplY3QgPSBuZXcgR3JvdXAoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgICAg
ICAgICAgICAgb2JqZWN0ID0gbmV3IE9iamVjdDNEKCk7CisKKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICBvYmplY3QudXVpZCA9IGRhdGEudXVpZDsKKworICAgICAgICAgICAg
ICAgIGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSBvYmplY3QubmFtZSA9IGRhdGEubmFt
ZTsKKyAgICAgICAgICAgICAgICBpZiAoIGRhdGEubWF0cml4ICE9PSB1bmRlZmluZWQgKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgbWF0cml4LmZyb21BcnJheSggZGF0YS5tYXRyaXggKTsKKyAg
ICAgICAgICAgICAgICAgICAgbWF0cml4LmRlY29tcG9zZSggb2JqZWN0LnBvc2l0aW9uLCBvYmpl
Y3QucXVhdGVybmlvbiwgb2JqZWN0LnNjYWxlICk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2Ug
eworCisgICAgICAgICAgICAgICAgICAgIGlmICggZGF0YS5wb3NpdGlvbiAhPT0gdW5kZWZpbmVk
ICkgb2JqZWN0LnBvc2l0aW9uLmZyb21BcnJheSggZGF0YS5wb3NpdGlvbiApOworICAgICAgICAg
ICAgICAgICAgICBpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5yb3Rh
dGlvbi5mcm9tQXJyYXkoIGRhdGEucm90YXRpb24gKTsKKyAgICAgICAgICAgICAgICAgICAgaWYg
KCBkYXRhLnF1YXRlcm5pb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5xdWF0ZXJuaW9uLmZyb21B
cnJheSggZGF0YS5xdWF0ZXJuaW9uICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggZGF0YS5z
Y2FsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNjYWxlLmZyb21BcnJheSggZGF0YS5zY2FsZSAp
OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBkYXRhLmNhc3RT
aGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5jYXN0U2hhZG93ID0gZGF0YS5jYXN0U2hhZG93
OworICAgICAgICAgICAgICAgIGlmICggZGF0YS5yZWNlaXZlU2hhZG93ICE9PSB1bmRlZmluZWQg
KSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IGRhdGEucmVjZWl2ZVNoYWRvdzsKKworICAgICAgICAg
ICAgICAgIGlmICggZGF0YS5zaGFkb3cgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBk
YXRhLnNoYWRvdy5iaWFzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmJpYXMgPSBkYXRh
LnNoYWRvdy5iaWFzOworICAgICAgICAgICAgICAgICAgICBpZiAoIGRhdGEuc2hhZG93LnJhZGl1
cyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5yYWRpdXMgPSBkYXRhLnNoYWRvdy5yYWRp
dXM7CisgICAgICAgICAgICAgICAgICAgIGlmICggZGF0YS5zaGFkb3cubWFwU2l6ZSAhPT0gdW5k
ZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5tYXBTaXplLmZyb21BcnJheSggZGF0YS5zaGFkb3cubWFw
U2l6ZSApOworICAgICAgICAgICAgICAgICAgICBpZiAoIGRhdGEuc2hhZG93LmNhbWVyYSAhPT0g
dW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KCBkYXRh
LnNoYWRvdy5jYW1lcmEgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IGlmICggZGF0YS52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlzaWJsZSA9IGRhdGEu
dmlzaWJsZTsKKyAgICAgICAgICAgICAgICBpZiAoIGRhdGEudXNlckRhdGEgIT09IHVuZGVmaW5l
ZCApIG9iamVjdC51c2VyRGF0YSA9IGRhdGEudXNlckRhdGE7CisKKyAgICAgICAgICAgICAgICBp
ZiAoIGRhdGEuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAg
ICBmb3IgKCB2YXIgY2hpbGQgaW4gZGF0YS5jaGlsZHJlbiApIHsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgb2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCggZGF0YS5jaGlsZHJlblsgY2hp
bGQgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkgKTsKKworICAgICAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGRhdGEudHlwZSA9
PT0gJ0xPRCcgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxldmVscyA9IGRhdGEubGV2
ZWxzOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoIHZhciBsID0gMDsgbCA8IGxldmVscy5s
ZW5ndGg7IGwgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZXZlbCA9IGxl
dmVsc1sgbCBdOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gb2JqZWN0Lmdl
dE9iamVjdEJ5UHJvcGVydHkoICd1dWlkJywgbGV2ZWwub2JqZWN0ICk7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICggY2hpbGQgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG9iamVjdC5hZGRMZXZlbCggY2hpbGQsIGxldmVsLmRpc3RhbmNlICk7
CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OworCisg
ICAgICAgICAgICB9OworCisgICAgICAgIH0oKQorCisgICAgfSApOworCisgICAgdmFyIFRFWFRV
UkVfTUFQUElORyA9IHsKKyAgICAgICAgVVZNYXBwaW5nOiBVVk1hcHBpbmcsCisgICAgICAgIEN1
YmVSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLAorICAgICAgICBDdWJl
UmVmcmFjdGlvbk1hcHBpbmc6IEN1YmVSZWZyYWN0aW9uTWFwcGluZywKKyAgICAgICAgRXF1aXJl
Y3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBw
aW5nLAorICAgICAgICBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzogRXF1aXJlY3Rh
bmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcsCisgICAgICAgIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBw
aW5nOiBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZywKKyAgICAgICAgQ3ViZVVWUmVmbGVjdGlv
bk1hcHBpbmc6IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLAorICAgICAgICBDdWJlVVZSZWZyYWN0
aW9uTWFwcGluZzogQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcKKyAgICB9OworCisgICAgdmFyIFRF
WFRVUkVfV1JBUFBJTkcgPSB7CisgICAgICAgIFJlcGVhdFdyYXBwaW5nOiBSZXBlYXRXcmFwcGlu
ZywKKyAgICAgICAgQ2xhbXBUb0VkZ2VXcmFwcGluZzogQ2xhbXBUb0VkZ2VXcmFwcGluZywKKyAg
ICAgICAgTWlycm9yZWRSZXBlYXRXcmFwcGluZzogTWlycm9yZWRSZXBlYXRXcmFwcGluZworICAg
IH07CisKKyAgICB2YXIgVEVYVFVSRV9GSUxURVIgPSB7CisgICAgICAgIE5lYXJlc3RGaWx0ZXI6
IE5lYXJlc3RGaWx0ZXIsCisgICAgICAgIE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyOiBOZWFy
ZXN0TWlwTWFwTmVhcmVzdEZpbHRlciwKKyAgICAgICAgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRl
cjogTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciwKKyAgICAgICAgTGluZWFyRmlsdGVyOiBMaW5l
YXJGaWx0ZXIsCisgICAgICAgIExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI6IExpbmVhck1pcE1h
cE5lYXJlc3RGaWx0ZXIsCisgICAgICAgIExpbmVhck1pcE1hcExpbmVhckZpbHRlcjogTGluZWFy
TWlwTWFwTGluZWFyRmlsdGVyCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3Igeno4
NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKKyAgICAgKgorICAgICAqIEJl
emllciBDdXJ2ZXMgZm9ybXVsYXMgb2J0YWluZWQgZnJvbQorICAgICAqIGh0dHA6Ly9lbi53aWtp
cGVkaWEub3JnL3dpa2kvQsOpemllcl9jdXJ2ZQorICAgICAqLworCisgICAgZnVuY3Rpb24gQ2F0
bXVsbFJvbSggdCwgcDAsIHAxLCBwMiwgcDMgKSB7CisKKyAgICAgICAgdmFyIHYwID0gKCBwMiAt
IHAwICkgKiAwLjU7CisgICAgICAgIHZhciB2MSA9ICggcDMgLSBwMSApICogMC41OworICAgICAg
ICB2YXIgdDIgPSB0ICogdDsKKyAgICAgICAgdmFyIHQzID0gdCAqIHQyOworICAgICAgICByZXR1
cm4gKCAyICogcDEgLSAyICogcDIgKyB2MCArIHYxICkgKiB0MyArICggLSAzICogcDEgKyAzICog
cDIgLSAyICogdjAgLSB2MSApICogdDIgKyB2MCAqIHQgKyBwMTsKKworICAgIH0KKworICAgIC8v
CisKKyAgICBmdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcCApIHsKKworICAgICAgICB2
YXIgayA9IDEgLSB0OworICAgICAgICByZXR1cm4gayAqIGsgKiBwOworCisgICAgfQorCisgICAg
ZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAgKSB7CisKKyAgICAgICAgcmV0dXJuIDIg
KiAoIDEgLSB0ICkgKiB0ICogcDsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIFF1YWRyYXRpY0Jl
emllclAyKCB0LCBwICkgeworCisgICAgICAgIHJldHVybiB0ICogdCAqIHA7CisKKyAgICB9CisK
KyAgICBmdW5jdGlvbiBRdWFkcmF0aWNCZXppZXIoIHQsIHAwLCBwMSwgcDIgKSB7CisKKyAgICAg
ICAgcmV0dXJuIFF1YWRyYXRpY0JlemllclAwKCB0LCBwMCApICsgUXVhZHJhdGljQmV6aWVyUDEo
IHQsIHAxICkgKworICAgICAgICAgICAgUXVhZHJhdGljQmV6aWVyUDIoIHQsIHAyICk7CisKKyAg
ICB9CisKKyAgICAvLworCisgICAgZnVuY3Rpb24gQ3ViaWNCZXppZXJQMCggdCwgcCApIHsKKwor
ICAgICAgICB2YXIgayA9IDEgLSB0OworICAgICAgICByZXR1cm4gayAqIGsgKiBrICogcDsKKwor
ICAgIH0KKworICAgIGZ1bmN0aW9uIEN1YmljQmV6aWVyUDEoIHQsIHAgKSB7CisKKyAgICAgICAg
dmFyIGsgPSAxIC0gdDsKKyAgICAgICAgcmV0dXJuIDMgKiBrICogayAqIHQgKiBwOworCisgICAg
fQorCisgICAgZnVuY3Rpb24gQ3ViaWNCZXppZXJQMiggdCwgcCApIHsKKworICAgICAgICByZXR1
cm4gMyAqICggMSAtIHQgKSAqIHQgKiB0ICogcDsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIEN1
YmljQmV6aWVyUDMoIHQsIHAgKSB7CisKKyAgICAgICAgcmV0dXJuIHQgKiB0ICogdCAqIHA7CisK
KyAgICB9CisKKyAgICBmdW5jdGlvbiBDdWJpY0JlemllciggdCwgcDAsIHAxLCBwMiwgcDMgKSB7
CisKKyAgICAgICAgcmV0dXJuIEN1YmljQmV6aWVyUDAoIHQsIHAwICkgKyBDdWJpY0JlemllclAx
KCB0LCBwMSApICsgQ3ViaWNCZXppZXJQMiggdCwgcDIgKSArCisgICAgICAgICAgICBDdWJpY0Jl
emllclAzKCB0LCBwMyApOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQGF1dGhvciB6ejg1
IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZworICAgICAqIEV4dGVuc2libGUg
Y3VydmUgb2JqZWN0CisgICAgICoKKyAgICAgKiBTb21lIGNvbW1vbiBvZiBjdXJ2ZSBtZXRob2Rz
OgorICAgICAqIC5nZXRQb2ludCh0KSwgZ2V0VGFuZ2VudCh0KQorICAgICAqIC5nZXRQb2ludEF0
KHUpLCBnZXRUYW5nZW50QXQodSkKKyAgICAgKiAuZ2V0UG9pbnRzKCksIC5nZXRTcGFjZWRQb2lu
dHMoKQorICAgICAqIC5nZXRMZW5ndGgoKQorICAgICAqIC51cGRhdGVBcmNMZW5ndGhzKCkKKyAg
ICAgKgorICAgICAqIFRoaXMgZm9sbG93aW5nIGN1cnZlcyBpbmhlcml0IGZyb20gVEhSRUUuQ3Vy
dmU6CisgICAgICoKKyAgICAgKiAtLSAyRCBjdXJ2ZXMgLS0KKyAgICAgKiBUSFJFRS5BcmNDdXJ2
ZQorICAgICAqIFRIUkVFLkN1YmljQmV6aWVyQ3VydmUKKyAgICAgKiBUSFJFRS5FbGxpcHNlQ3Vy
dmUKKyAgICAgKiBUSFJFRS5MaW5lQ3VydmUKKyAgICAgKiBUSFJFRS5RdWFkcmF0aWNCZXppZXJD
dXJ2ZQorICAgICAqIFRIUkVFLlNwbGluZUN1cnZlCisgICAgICoKKyAgICAgKiAtLSAzRCBjdXJ2
ZXMgLS0KKyAgICAgKiBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzCisgICAgICogVEhSRUUuQ3ViaWNC
ZXppZXJDdXJ2ZTMKKyAgICAgKiBUSFJFRS5MaW5lQ3VydmUzCisgICAgICogVEhSRUUuUXVhZHJh
dGljQmV6aWVyQ3VydmUzCisgICAgICoKKyAgICAgKiBBIHNlcmllcyBvZiBjdXJ2ZXMgY2FuIGJl
IHJlcHJlc2VudGVkIGFzIGEgVEhSRUUuQ3VydmVQYXRoLgorICAgICAqCisgICAgICoqLworCisg
ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqCisgICAgICogIEFic3RyYWN0IEN1cnZlIGJhc2UgY2xhc3MKKyAgICAgKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov
CisKKyAgICBmdW5jdGlvbiBDdXJ2ZSgpIHsKKworICAgICAgICB0aGlzLmFyY0xlbmd0aERpdmlz
aW9ucyA9IDIwMDsKKworICAgIH0KKworICAgIE9iamVjdC5hc3NpZ24oIEN1cnZlLnByb3RvdHlw
ZSwgeworCisgICAgICAgIC8vIFZpcnR1YWwgYmFzZSBjbGFzcyBtZXRob2QgdG8gb3ZlcndyaXRl
IGFuZCBpbXBsZW1lbnQgaW4gc3ViY2xhc3NlcworICAgICAgICAvLyAgLSB0IFswIC4uIDFdCisK
KyAgICAgICAgZ2V0UG9pbnQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgY29uc29sZS53
YXJuKCAnVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4nICk7CisgICAg
ICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICB9LAorCisgICAgICAgIC8vIEdldCBwb2lu
dCBhdCByZWxhdGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gYXJjIGxlbmd0aAor
ICAgICAgICAvLyAtIHUgWzAgLi4gMV0KKworICAgICAgICBnZXRQb2ludEF0OiBmdW5jdGlvbiAo
IHUgKSB7CisKKyAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApOwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHQgKTsKKworICAgICAgICB9LAorCisg
ICAgICAgIC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnQoIHQgKQorCisg
ICAgICAgIGdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CisKKyAgICAgICAgICAg
IGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1OworCisgICAgICAg
ICAgICB2YXIgcG9pbnRzID0gW107CisKKyAgICAgICAgICAgIGZvciAoIHZhciBkID0gMDsgZCA8
PSBkaXZpc2lvbnM7IGQgKysgKSB7CisKKyAgICAgICAgICAgICAgICBwb2ludHMucHVzaCggdGhp
cy5nZXRQb2ludCggZCAvIGRpdmlzaW9ucyApICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgcmV0dXJuIHBvaW50czsKKworICAgICAgICB9LAorCisgICAgICAgIC8vIEdldCBzZXF1
ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnRBdCggdSApCisKKyAgICAgICAgZ2V0U3BhY2Vk
UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKKworICAgICAgICAgICAgaWYgKCBkaXZp
c2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDU7CisKKyAgICAgICAgICAgIHZhciBw
b2ludHMgPSBbXTsKKworICAgICAgICAgICAgZm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9u
czsgZCArKyApIHsKKworICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50
QXQoIGQgLyBkaXZpc2lvbnMgKSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJl
dHVybiBwb2ludHM7CisKKyAgICAgICAgfSwKKworICAgICAgICAvLyBHZXQgdG90YWwgY3VydmUg
YXJjIGxlbmd0aAorCisgICAgICAgIGdldExlbmd0aDogZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICB2YXIgbGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpOworICAgICAgICAgICAgcmV0dXJu
IGxlbmd0aHNbIGxlbmd0aHMubGVuZ3RoIC0gMSBdOworCisgICAgICAgIH0sCisKKyAgICAgICAg
Ly8gR2V0IGxpc3Qgb2YgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHMKKworICAgICAgICBnZXRM
ZW5ndGhzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKKworICAgICAgICAgICAgaWYgKCBkaXZp
c2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25z
OworCisgICAgICAgICAgICBpZiAoIHRoaXMuY2FjaGVBcmNMZW5ndGhzICYmCisgICAgICAgICAg
ICAgICAgKCB0aGlzLmNhY2hlQXJjTGVuZ3Rocy5sZW5ndGggPT09IGRpdmlzaW9ucyArIDEgKSAm
JgorICAgICAgICAgICAgICAgICEgdGhpcy5uZWVkc1VwZGF0ZSApIHsKKworICAgICAgICAgICAg
ICAgIHJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3RoczsKKworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICB0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7CisKKyAgICAgICAgICAgIHZhciBjYWNo
ZSA9IFtdOworICAgICAgICAgICAgdmFyIGN1cnJlbnQsIGxhc3QgPSB0aGlzLmdldFBvaW50KCAw
ICk7CisgICAgICAgICAgICB2YXIgcCwgc3VtID0gMDsKKworICAgICAgICAgICAgY2FjaGUucHVz
aCggMCApOworCisgICAgICAgICAgICBmb3IgKCBwID0gMTsgcCA8PSBkaXZpc2lvbnM7IHAgKysg
KSB7CisKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpcy5nZXRQb2ludCggcCAvIGRpdmlz
aW9ucyApOworICAgICAgICAgICAgICAgIHN1bSArPSBjdXJyZW50LmRpc3RhbmNlVG8oIGxhc3Qg
KTsKKyAgICAgICAgICAgICAgICBjYWNoZS5wdXNoKCBzdW0gKTsKKyAgICAgICAgICAgICAgICBs
YXN0ID0gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmNhY2hl
QXJjTGVuZ3RocyA9IGNhY2hlOworCisgICAgICAgICAgICByZXR1cm4gY2FjaGU7IC8vIHsgc3Vt
czogY2FjaGUsIHN1bTogc3VtIH07IFN1bSBpcyBpbiB0aGUgbGFzdCBlbGVtZW50LgorCisgICAg
ICAgIH0sCisKKyAgICAgICAgdXBkYXRlQXJjTGVuZ3RoczogZnVuY3Rpb24gKCkgeworCisgICAg
ICAgICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuZ2V0TGVu
Z3RocygpOworCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gR2l2ZW4gdSAoIDAgLi4gMSApLCBn
ZXQgYSB0IHRvIGZpbmQgcC4gVGhpcyBnaXZlcyB5b3UgcG9pbnRzIHdoaWNoIGFyZSBlcXVpZGlz
dGFudAorCisgICAgICAgIGdldFV0b1RtYXBwaW5nOiBmdW5jdGlvbiAoIHUsIGRpc3RhbmNlICkg
eworCisgICAgICAgICAgICB2YXIgYXJjTGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpOworCisg
ICAgICAgICAgICB2YXIgaSA9IDAsIGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7CisKKyAgICAgICAg
ICAgIHZhciB0YXJnZXRBcmNMZW5ndGg7IC8vIFRoZSB0YXJnZXRlZCB1IGRpc3RhbmNlIHZhbHVl
IHRvIGdldAorCisgICAgICAgICAgICBpZiAoIGRpc3RhbmNlICkgeworCisgICAgICAgICAgICAg
ICAgdGFyZ2V0QXJjTGVuZ3RoID0gZGlzdGFuY2U7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisK
KyAgICAgICAgICAgICAgICB0YXJnZXRBcmNMZW5ndGggPSB1ICogYXJjTGVuZ3Roc1sgaWwgLSAx
IF07CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYmluYXJ5IHNlYXJjaCBmb3Ig
dGhlIGluZGV4IHdpdGggbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gdGFyZ2V0IHUgZGlzdGFu
Y2UKKworICAgICAgICAgICAgdmFyIGxvdyA9IDAsIGhpZ2ggPSBpbCAtIDEsIGNvbXBhcmlzb247
CisKKyAgICAgICAgICAgIHdoaWxlICggbG93IDw9IGhpZ2ggKSB7CisKKyAgICAgICAgICAgICAg
ICBpID0gTWF0aC5mbG9vciggbG93ICsgKCBoaWdoIC0gbG93ICkgLyAyICk7IC8vIGxlc3MgbGlr
ZWx5IHRvIG92ZXJmbG93LCB0aG91Z2ggcHJvYmFibHkgbm90IGlzc3VlIGhlcmUsIEpTIGRvZXNu
J3QgcmVhbGx5IGhhdmUgaW50ZWdlcnMsIGFsbCBudW1iZXJzIGFyZSBmbG9hdHMKKworICAgICAg
ICAgICAgICAgIGNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0YXJnZXRBcmNMZW5ndGg7
CisKKyAgICAgICAgICAgICAgICBpZiAoIGNvbXBhcmlzb24gPCAwICkgeworCisgICAgICAgICAg
ICAgICAgICAgIGxvdyA9IGkgKyAxOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggY29t
cGFyaXNvbiA+IDAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaGlnaCA9IGkgLSAxOworCisg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICBoaWdoID0gaTsK
KyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRE9O
RQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGkg
PSBoaWdoOworCisgICAgICAgICAgICBpZiAoIGFyY0xlbmd0aHNbIGkgXSA9PT0gdGFyZ2V0QXJj
TGVuZ3RoICkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIGkgLyAoIGlsIC0gMSApOworCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdlIGNvdWxkIGdldCBmaW5lciBncmFpbiBh
dCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRz
CisKKyAgICAgICAgICAgIHZhciBsZW5ndGhCZWZvcmUgPSBhcmNMZW5ndGhzWyBpIF07CisgICAg
ICAgICAgICB2YXIgbGVuZ3RoQWZ0ZXIgPSBhcmNMZW5ndGhzWyBpICsgMSBdOworCisgICAgICAg
ICAgICB2YXIgc2VnbWVudExlbmd0aCA9IGxlbmd0aEFmdGVyIC0gbGVuZ3RoQmVmb3JlOworCisg
ICAgICAgICAgICAvLyBkZXRlcm1pbmUgd2hlcmUgd2UgYXJlIGJldHdlZW4gdGhlICdiZWZvcmUn
IGFuZCAnYWZ0ZXInIHBvaW50cworCisgICAgICAgICAgICB2YXIgc2VnbWVudEZyYWN0aW9uID0g
KCB0YXJnZXRBcmNMZW5ndGggLSBsZW5ndGhCZWZvcmUgKSAvIHNlZ21lbnRMZW5ndGg7CisKKyAg
ICAgICAgICAgIC8vIGFkZCB0aGF0IGZyYWN0aW9uYWwgYW1vdW50IHRvIHQKKworICAgICAgICAg
ICAgdmFyIHQgPSAoIGkgKyBzZWdtZW50RnJhY3Rpb24gKSAvICggaWwgLSAxICk7CisKKyAgICAg
ICAgICAgIHJldHVybiB0OworCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gUmV0dXJucyBhIHVu
aXQgdmVjdG9yIHRhbmdlbnQgYXQgdAorICAgICAgICAvLyBJbiBjYXNlIGFueSBzdWIgY3VydmUg
ZG9lcyBub3QgaW1wbGVtZW50IGl0cyB0YW5nZW50IGRlcml2YXRpb24sCisgICAgICAgIC8vIDIg
cG9pbnRzIGEgc21hbGwgZGVsdGEgYXBhcnQgd2lsbCBiZSB1c2VkIHRvIGZpbmQgaXRzIGdyYWRp
ZW50CisgICAgICAgIC8vIHdoaWNoIHNlZW1zIHRvIGdpdmUgYSByZWFzb25hYmxlIGFwcHJveGlt
YXRpb24KKworICAgICAgICBnZXRUYW5nZW50OiBmdW5jdGlvbiAoIHQgKSB7CisKKyAgICAgICAg
ICAgIHZhciBkZWx0YSA9IDAuMDAwMTsKKyAgICAgICAgICAgIHZhciB0MSA9IHQgLSBkZWx0YTsK
KyAgICAgICAgICAgIHZhciB0MiA9IHQgKyBkZWx0YTsKKworICAgICAgICAgICAgLy8gQ2FwcGlu
ZyBpbiBjYXNlIG9mIGRhbmdlcgorCisgICAgICAgICAgICBpZiAoIHQxIDwgMCApIHQxID0gMDsK
KyAgICAgICAgICAgIGlmICggdDIgPiAxICkgdDIgPSAxOworCisgICAgICAgICAgICB2YXIgcHQx
ID0gdGhpcy5nZXRQb2ludCggdDEgKTsKKyAgICAgICAgICAgIHZhciBwdDIgPSB0aGlzLmdldFBv
aW50KCB0MiApOworCisgICAgICAgICAgICB2YXIgdmVjID0gcHQyLmNsb25lKCkuc3ViKCBwdDEg
KTsKKyAgICAgICAgICAgIHJldHVybiB2ZWMubm9ybWFsaXplKCk7CisKKyAgICAgICAgfSwKKwor
ICAgICAgICBnZXRUYW5nZW50QXQ6IGZ1bmN0aW9uICggdSApIHsKKworICAgICAgICAgICAgdmFy
IHQgPSB0aGlzLmdldFV0b1RtYXBwaW5nKCB1ICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5n
ZXRUYW5nZW50KCB0ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBjb21wdXRlRnJlbmV0RnJh
bWVzOiBmdW5jdGlvbiAoIHNlZ21lbnRzLCBjbG9zZWQgKSB7CisKKyAgICAgICAgICAgIC8vIHNl
ZSBodHRwOi8vd3d3LmNzLmluZGlhbmEuZWR1L3B1Yi90ZWNocmVwb3J0cy9UUjQyNS5wZGYKKwor
ICAgICAgICAgICAgdmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgICAgIHZh
ciB0YW5nZW50cyA9IFtdOworICAgICAgICAgICAgdmFyIG5vcm1hbHMgPSBbXTsKKyAgICAgICAg
ICAgIHZhciBiaW5vcm1hbHMgPSBbXTsKKworICAgICAgICAgICAgdmFyIHZlYyA9IG5ldyBWZWN0
b3IzKCk7CisgICAgICAgICAgICB2YXIgbWF0ID0gbmV3IE1hdHJpeDQoKTsKKworICAgICAgICAg
ICAgdmFyIGksIHUsIHRoZXRhOworCisgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSB0YW5nZW50
IHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmUKKworICAgICAgICAgICAgZm9y
ICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB1ID0g
aSAvIHNlZ21lbnRzOworCisgICAgICAgICAgICAgICAgdGFuZ2VudHNbIGkgXSA9IHRoaXMuZ2V0
VGFuZ2VudEF0KCB1ICk7CisgICAgICAgICAgICAgICAgdGFuZ2VudHNbIGkgXS5ub3JtYWxpemUo
KTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWxlY3QgYW4gaW5pdGlhbCBu
b3JtYWwgdmVjdG9yIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGZpcnN0IHRhbmdlbnQgdmVjdG9yLAor
ICAgICAgICAgICAgLy8gYW5kIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1pbmltdW0gdGFuZ2Vu
dCB4eXogY29tcG9uZW50CisKKyAgICAgICAgICAgIG5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3Iz
KCk7CisgICAgICAgICAgICBiaW5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAg
ICAgICB2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIHZhciB0eCA9IE1h
dGguYWJzKCB0YW5nZW50c1sgMCBdLnggKTsKKyAgICAgICAgICAgIHZhciB0eSA9IE1hdGguYWJz
KCB0YW5nZW50c1sgMCBdLnkgKTsKKyAgICAgICAgICAgIHZhciB0eiA9IE1hdGguYWJzKCB0YW5n
ZW50c1sgMCBdLnogKTsKKworICAgICAgICAgICAgaWYgKCB0eCA8PSBtaW4gKSB7CisKKyAgICAg
ICAgICAgICAgICBtaW4gPSB0eDsKKyAgICAgICAgICAgICAgICBub3JtYWwuc2V0KCAxLCAwLCAw
ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB0eSA8PSBtaW4gKSB7CisK
KyAgICAgICAgICAgICAgICBtaW4gPSB0eTsKKyAgICAgICAgICAgICAgICBub3JtYWwuc2V0KCAw
LCAxLCAwICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB0eiA8PSBtaW4g
KSB7CisKKyAgICAgICAgICAgICAgICBub3JtYWwuc2V0KCAwLCAwLCAxICk7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgdmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9y
bWFsICkubm9ybWFsaXplKCk7CisKKyAgICAgICAgICAgIG5vcm1hbHNbIDAgXS5jcm9zc1ZlY3Rv
cnMoIHRhbmdlbnRzWyAwIF0sIHZlYyApOworICAgICAgICAgICAgYmlub3JtYWxzWyAwIF0uY3Jv
c3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWxzWyAwIF0gKTsKKworCisgICAgICAgICAg
ICAvLyBjb21wdXRlIHRoZSBzbG93bHktdmFyeWluZyBub3JtYWwgYW5kIGJpbm9ybWFsIHZlY3Rv
cnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmUKKworICAgICAgICAgICAgZm9yICggaSA9
IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICBub3JtYWxzWyBp
IF0gPSBub3JtYWxzWyBpIC0gMSBdLmNsb25lKCk7CisKKyAgICAgICAgICAgICAgICBiaW5vcm1h
bHNbIGkgXSA9IGJpbm9ybWFsc1sgaSAtIDEgXS5jbG9uZSgpOworCisgICAgICAgICAgICAgICAg
dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTsKKwor
ICAgICAgICAgICAgICAgIGlmICggdmVjLmxlbmd0aCgpID4gTnVtYmVyLkVQU0lMT04gKSB7CisK
KyAgICAgICAgICAgICAgICAgICAgdmVjLm5vcm1hbGl6ZSgpOworCisgICAgICAgICAgICAgICAg
ICAgIHRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGFuZ2VudHNbIGkgLSAxIF0uZG90
KCB0YW5nZW50c1sgaSBdICksIC0gMSwgMSApICk7IC8vIGNsYW1wIGZvciBmbG9hdGluZyBwdCBl
cnJvcnMKKworICAgICAgICAgICAgICAgICAgICBub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBt
YXQubWFrZVJvdGF0aW9uQXhpcyggdmVjLCB0aGV0YSApICk7CisKKyAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICBiaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRz
WyBpIF0sIG5vcm1hbHNbIGkgXSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8v
IGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQsIHBvc3Rwcm9jZXNzIHRoZSB2ZWN0b3JzIHNvIHRoZSBm
aXJzdCBhbmQgbGFzdCBub3JtYWwgdmVjdG9ycyBhcmUgdGhlIHNhbWUKKworICAgICAgICAgICAg
aWYgKCBjbG9zZWQgPT09IHRydWUgKSB7CisKKyAgICAgICAgICAgICAgICB0aGV0YSA9IE1hdGgu
YWNvcyggX01hdGguY2xhbXAoIG5vcm1hbHNbIDAgXS5kb3QoIG5vcm1hbHNbIHNlZ21lbnRzIF0g
KSwgLSAxLCAxICkgKTsKKyAgICAgICAgICAgICAgICB0aGV0YSAvPSBzZWdtZW50czsKKworICAg
ICAgICAgICAgICAgIGlmICggdGFuZ2VudHNbIDAgXS5kb3QoIHZlYy5jcm9zc1ZlY3RvcnMoIG5v
cm1hbHNbIDAgXSwgbm9ybWFsc1sgc2VnbWVudHMgXSApICkgPiAwICkgeworCisgICAgICAgICAg
ICAgICAgICAgIHRoZXRhID0gLSB0aGV0YTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIGZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkgeworCisgICAgICAg
ICAgICAgICAgICAgIC8vIHR3aXN0IGEgbGl0dGxlLi4uCisgICAgICAgICAgICAgICAgICAgIG5v
cm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB0YW5nZW50c1sg
aSBdLCB0aGV0YSAqIGkgKSApOworICAgICAgICAgICAgICAgICAgICBiaW5vcm1hbHNbIGkgXS5j
cm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApOworCisgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB7CisgICAgICAg
ICAgICAgICAgdGFuZ2VudHM6IHRhbmdlbnRzLAorICAgICAgICAgICAgICAgIG5vcm1hbHM6IG5v
cm1hbHMsCisgICAgICAgICAgICAgICAgYmlub3JtYWxzOiBiaW5vcm1hbHMKKyAgICAgICAgICAg
IH07CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgZnVuY3Rpb24gTGluZUN1cnZlKCB2
MSwgdjIgKSB7CisKKyAgICAgICAgQ3VydmUuY2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMu
djEgPSB2MTsKKyAgICAgICAgdGhpcy52MiA9IHYyOworCisgICAgfQorCisgICAgTGluZUN1cnZl
LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApOworICAgIExpbmVD
dXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQ3VydmU7CisKKyAgICBMaW5lQ3VydmUu
cHJvdG90eXBlLmlzTGluZUN1cnZlID0gdHJ1ZTsKKworICAgIExpbmVDdXJ2ZS5wcm90b3R5cGUu
Z2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7CisKKyAgICAgICAgaWYgKCB0ID09PSAxICkgewor
CisgICAgICAgICAgICByZXR1cm4gdGhpcy52Mi5jbG9uZSgpOworCisgICAgICAgIH0KKworICAg
ICAgICB2YXIgcG9pbnQgPSB0aGlzLnYyLmNsb25lKCkuc3ViKCB0aGlzLnYxICk7CisgICAgICAg
IHBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7CisKKyAgICAgICAgcmV0
dXJuIHBvaW50OworCisgICAgfTsKKworICAgIC8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3
ZSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdAorCisgICAgTGluZUN1cnZlLnByb3Rv
dHlwZS5nZXRQb2ludEF0ID0gZnVuY3Rpb24gKCB1ICkgeworCisgICAgICAgIHJldHVybiB0aGlz
LmdldFBvaW50KCB1ICk7CisKKyAgICB9OworCisgICAgTGluZUN1cnZlLnByb3RvdHlwZS5nZXRU
YW5nZW50ID0gZnVuY3Rpb24gKCB0ICkgeworCisgICAgICAgIHZhciB0YW5nZW50ID0gdGhpcy52
Mi5jbG9uZSgpLnN1YiggdGhpcy52MSApOworCisgICAgICAgIHJldHVybiB0YW5nZW50Lm5vcm1h
bGl6ZSgpOworCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3Igeno4NSAvIGh0dHA6
Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKKyAgICAgKgorICAgICAqKi8KKworICAgIC8q
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKgorICAgICAqICBDdXJ2ZWQgUGF0aCAtIGEgY3VydmUgcGF0aCBpcyBzaW1wbHkgYSBhcnJh
eSBvZiBjb25uZWN0ZWQKKyAgICAgKiAgY3VydmVzLCBidXQgcmV0YWlucyB0aGUgYXBpIG9mIGEg
Y3VydmUKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKiovCisKKyAgICBmdW5jdGlvbiBDdXJ2ZVBhdGgoKSB7CisKKyAgICAg
ICAgQ3VydmUuY2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMuY3VydmVzID0gW107CisKKyAg
ICAgICAgdGhpcy5hdXRvQ2xvc2UgPSBmYWxzZTsgLy8gQXV0b21hdGljYWxseSBjbG9zZXMgdGhl
IHBhdGgKKworICAgIH0KKworICAgIEN1cnZlUGF0aC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWdu
KCBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKSwgeworCisgICAgICAgIGNvbnN0cnVj
dG9yOiBDdXJ2ZVBhdGgsCisKKyAgICAgICAgYWRkOiBmdW5jdGlvbiAoIGN1cnZlICkgeworCisg
ICAgICAgICAgICB0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgY2xvc2VQYXRoOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIC8vIEFkZCBhIGxp
bmUgY3VydmUgaWYgc3RhcnQgYW5kIGVuZCBvZiBsaW5lcyBhcmUgbm90IGNvbm5lY3RlZAorICAg
ICAgICAgICAgdmFyIHN0YXJ0UG9pbnQgPSB0aGlzLmN1cnZlc1sgMCBdLmdldFBvaW50KCAwICk7
CisgICAgICAgICAgICB2YXIgZW5kUG9pbnQgPSB0aGlzLmN1cnZlc1sgdGhpcy5jdXJ2ZXMubGVu
Z3RoIC0gMSBdLmdldFBvaW50KCAxICk7CisKKyAgICAgICAgICAgIGlmICggISBzdGFydFBvaW50
LmVxdWFscyggZW5kUG9pbnQgKSApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuY3VydmVzLnB1
c2goIG5ldyBMaW5lQ3VydmUoIGVuZFBvaW50LCBzdGFydFBvaW50ICkgKTsKKworICAgICAgICAg
ICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gVG8gZ2V0IGFjY3VyYXRlIHBvaW50IHdp
dGggcmVmZXJlbmNlIHRvCisgICAgICAgIC8vIGVudGlyZSBwYXRoIGRpc3RhbmNlIGF0IHRpbWUg
dCwKKyAgICAgICAgLy8gZm9sbG93aW5nIGhhcyB0byBiZSBkb25lOgorCisgICAgICAgIC8vIDEu
IExlbmd0aCBvZiBlYWNoIHN1YiBwYXRoIGhhdmUgdG8gYmUga25vd24KKyAgICAgICAgLy8gMi4g
TG9jYXRlIGFuZCBpZGVudGlmeSB0eXBlIG9mIGN1cnZlCisgICAgICAgIC8vIDMuIEdldCB0IGZv
ciB0aGUgY3VydmUKKyAgICAgICAgLy8gNC4gUmV0dXJuIGN1cnZlLmdldFBvaW50QXQodCcpCisK
KyAgICAgICAgZ2V0UG9pbnQ6IGZ1bmN0aW9uICggdCApIHsKKworICAgICAgICAgICAgdmFyIGQg
PSB0ICogdGhpcy5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIHZhciBjdXJ2ZUxlbmd0aHMgPSB0
aGlzLmdldEN1cnZlTGVuZ3RocygpOworICAgICAgICAgICAgdmFyIGkgPSAwOworCisgICAgICAg
ICAgICAvLyBUbyB0aGluayBhYm91dCBib3VuZGFyaWVzIHBvaW50cy4KKworICAgICAgICAgICAg
d2hpbGUgKCBpIDwgY3VydmVMZW5ndGhzLmxlbmd0aCApIHsKKworICAgICAgICAgICAgICAgIGlm
ICggY3VydmVMZW5ndGhzWyBpIF0gPj0gZCApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIg
ZGlmZiA9IGN1cnZlTGVuZ3Roc1sgaSBdIC0gZDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGN1
cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgc2VnbWVu
dExlbmd0aCA9IGN1cnZlLmdldExlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICB2YXIgdSA9
IHNlZ21lbnRMZW5ndGggPT09IDAgPyAwIDogMSAtIGRpZmYgLyBzZWdtZW50TGVuZ3RoOworCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KCB1ICk7CisKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpICsrOworCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAvLyBsb29wIHdoZXJlIHN1
bSAhPSAwLCBzdW0gPiBkICwgc3VtKzEgPGQKKworICAgICAgICB9LAorCisgICAgICAgIC8vIFdl
IGNhbm5vdCB1c2UgdGhlIGRlZmF1bHQgVEhSRUUuQ3VydmUgZ2V0UG9pbnQoKSB3aXRoIGdldExl
bmd0aCgpIGJlY2F1c2UgaW4KKyAgICAgICAgLy8gVEhSRUUuQ3VydmUsIGdldExlbmd0aCgpIGRl
cGVuZHMgb24gZ2V0UG9pbnQoKSBidXQgaW4gVEhSRUUuQ3VydmVQYXRoCisgICAgICAgIC8vIGdl
dFBvaW50KCkgZGVwZW5kcyBvbiBnZXRMZW5ndGgKKworICAgICAgICBnZXRMZW5ndGg6IGZ1bmN0
aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIGxlbnMgPSB0aGlzLmdldEN1cnZlTGVuZ3Rocygp
OworICAgICAgICAgICAgcmV0dXJuIGxlbnNbIGxlbnMubGVuZ3RoIC0gMSBdOworCisgICAgICAg
IH0sCisKKyAgICAgICAgLy8gY2FjaGVMZW5ndGhzIG11c3QgYmUgcmVjYWxjdWxhdGVkLgorICAg
ICAgICB1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHRoaXMu
bmVlZHNVcGRhdGUgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5jYWNoZUxlbmd0aHMgPSBudWxs
OworICAgICAgICAgICAgdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTsKKworICAgICAgICB9LAorCisg
ICAgICAgIC8vIENvbXB1dGUgbGVuZ3RocyBhbmQgY2FjaGUgdGhlbQorICAgICAgICAvLyBXZSBj
YW5ub3Qgb3ZlcndyaXRlIGdldExlbmd0aHMoKSBiZWNhdXNlIFV0b1QgbWFwcGluZyB1c2VzIGl0
LgorCisgICAgICAgIGdldEN1cnZlTGVuZ3RoczogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAg
ICAvLyBXZSB1c2UgY2FjaGUgdmFsdWVzIGlmIGN1cnZlcyBhbmQgY2FjaGUgYXJyYXkgYXJlIHNh
bWUgbGVuZ3RoCisKKyAgICAgICAgICAgIGlmICggdGhpcy5jYWNoZUxlbmd0aHMgJiYgdGhpcy5j
YWNoZUxlbmd0aHMubGVuZ3RoID09PSB0aGlzLmN1cnZlcy5sZW5ndGggKSB7CisKKyAgICAgICAg
ICAgICAgICByZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgLy8gR2V0IGxlbmd0aCBvZiBzdWItY3VydmUKKyAgICAgICAgICAgIC8vIFB1c2gg
c3VtcyBpbnRvIGNhY2hlZCBhcnJheQorCisgICAgICAgICAgICB2YXIgbGVuZ3RocyA9IFtdLCBz
dW1zID0gMDsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMu
bGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHN1bXMgKz0gdGhpcy5j
dXJ2ZXNbIGkgXS5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBsZW5ndGhzLnB1c2goIHN1
bXMgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmNhY2hlTGVuZ3RocyA9
IGxlbmd0aHM7CisKKyAgICAgICAgICAgIHJldHVybiBsZW5ndGhzOworCisgICAgICAgIH0sCisK
KyAgICAgICAgZ2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKKworICAg
ICAgICAgICAgaWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDQwOwor
CisgICAgICAgICAgICB2YXIgcG9pbnRzID0gW107CisKKyAgICAgICAgICAgIGZvciAoIHZhciBp
ID0gMDsgaSA8PSBkaXZpc2lvbnM7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICBwb2ludHMu
cHVzaCggdGhpcy5nZXRQb2ludCggaSAvIGRpdmlzaW9ucyApICk7CisKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgaWYgKCB0aGlzLmF1dG9DbG9zZSApIHsKKworICAgICAgICAgICAgICAg
IHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIHJldHVybiBwb2ludHM7CisKKyAgICAgICAgfSwKKworICAgICAgICBnZXRQb2ludHM6IGZ1
bmN0aW9uICggZGl2aXNpb25zICkgeworCisgICAgICAgICAgICBkaXZpc2lvbnMgPSBkaXZpc2lv
bnMgfHwgMTI7CisKKyAgICAgICAgICAgIHZhciBwb2ludHMgPSBbXSwgbGFzdDsKKworICAgICAg
ICAgICAgZm9yICggdmFyIGkgPSAwLCBjdXJ2ZXMgPSB0aGlzLmN1cnZlczsgaSA8IGN1cnZlcy5s
ZW5ndGg7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgY3VydmUgPSBjdXJ2ZXNbIGkg
XTsKKyAgICAgICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IChjdXJ2ZSAmJiBjdXJ2ZS5pc0Vs
bGlwc2VDdXJ2ZSkgPyBkaXZpc2lvbnMgKiAyCisgICAgICAgICAgICAgICAgICAgIDogKGN1cnZl
ICYmIGN1cnZlLmlzTGluZUN1cnZlKSA/IDEKKyAgICAgICAgICAgICAgICAgICAgOiAoY3VydmUg
JiYgY3VydmUuaXNTcGxpbmVDdXJ2ZSkgPyBkaXZpc2lvbnMgKiBjdXJ2ZS5wb2ludHMubGVuZ3Ro
CisgICAgICAgICAgICAgICAgICAgIDogZGl2aXNpb25zOworCisgICAgICAgICAgICAgICAgdmFy
IHB0cyA9IGN1cnZlLmdldFBvaW50cyggcmVzb2x1dGlvbiApOworCisgICAgICAgICAgICAgICAg
Zm9yICggdmFyIGogPSAwOyBqIDwgcHRzLmxlbmd0aDsgaisrICkgeworCisgICAgICAgICAgICAg
ICAgICAgIHZhciBwb2ludCA9IHB0c1sgaiBdOworCisgICAgICAgICAgICAgICAgICAgIGlmICgg
bGFzdCAmJiBsYXN0LmVxdWFscyggcG9pbnQgKSApIGNvbnRpbnVlOyAvLyBlbnN1cmVzIG5vIGNv
bnNlY3V0aXZlIHBvaW50cyBhcmUgZHVwbGljYXRlcworCisgICAgICAgICAgICAgICAgICAgIHBv
aW50cy5wdXNoKCBwb2ludCApOworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gcG9pbnQ7CisK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB0
aGlzLmF1dG9DbG9zZSAmJiBwb2ludHMubGVuZ3RoID4gMSAmJiAhcG9pbnRzWyBwb2ludHMubGVu
Z3RoIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHsKKworICAgICAgICAgICAgICAgIHBv
aW50cy5wdXNoKCBwb2ludHNbIDAgXSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IHJldHVybiBwb2ludHM7CisKKyAgICAgICAgfSwKKworICAgICAgICAvKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAg
ICogIENyZWF0ZSBHZW9tZXRyaWVzIEhlbHBlcnMKKyAgICAgICAgICoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAg
IC8vLyBHZW5lcmF0ZSBnZW9tZXRyeSBmcm9tIHBhdGggcG9pbnRzIChmb3IgTGluZSBvciBQb2lu
dHMgb2JqZWN0cykKKworICAgICAgICBjcmVhdGVQb2ludHNHZW9tZXRyeTogZnVuY3Rpb24gKCBk
aXZpc2lvbnMgKSB7CisKKyAgICAgICAgICAgIHZhciBwdHMgPSB0aGlzLmdldFBvaW50cyggZGl2
aXNpb25zICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7
CisKKyAgICAgICAgfSwKKworICAgICAgICAvLyBHZW5lcmF0ZSBnZW9tZXRyeSBmcm9tIGVxdWlk
aXN0YW50IHNhbXBsaW5nIGFsb25nIHRoZSBwYXRoCisKKyAgICAgICAgY3JlYXRlU3BhY2VkUG9p
bnRzR2VvbWV0cnk6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgeworCisgICAgICAgICAgICB2YXIg
cHRzID0gdGhpcy5nZXRTcGFjZWRQb2ludHMoIGRpdmlzaW9ucyApOworICAgICAgICAgICAgcmV0
dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoIHB0cyApOworCisgICAgICAgIH0sCisKKyAgICAgICAg
Y3JlYXRlR2VvbWV0cnk6IGZ1bmN0aW9uICggcG9pbnRzICkgeworCisgICAgICAgICAgICB2YXIg
Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAw
LCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB2
YXIgcG9pbnQgPSBwb2ludHNbIGkgXTsKKyAgICAgICAgICAgICAgICBnZW9tZXRyeS52ZXJ0aWNl
cy5wdXNoKCBuZXcgVmVjdG9yMyggcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICkgKTsK
KworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnk7CisKKyAgICAg
ICAgfQorCisgICAgfSApOworCisgICAgZnVuY3Rpb24gRWxsaXBzZUN1cnZlKCBhWCwgYVksIHhS
YWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3Rh
dGlvbiApIHsKKworICAgICAgICBDdXJ2ZS5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhpcy5h
WCA9IGFYOworICAgICAgICB0aGlzLmFZID0gYVk7CisKKyAgICAgICAgdGhpcy54UmFkaXVzID0g
eFJhZGl1czsKKyAgICAgICAgdGhpcy55UmFkaXVzID0geVJhZGl1czsKKworICAgICAgICB0aGlz
LmFTdGFydEFuZ2xlID0gYVN0YXJ0QW5nbGU7CisgICAgICAgIHRoaXMuYUVuZEFuZ2xlID0gYUVu
ZEFuZ2xlOworCisgICAgICAgIHRoaXMuYUNsb2Nrd2lzZSA9IGFDbG9ja3dpc2U7CisKKyAgICAg
ICAgdGhpcy5hUm90YXRpb24gPSBhUm90YXRpb24gfHwgMDsKKworICAgIH0KKworICAgIEVsbGlw
c2VDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKKyAg
ICBFbGxpcHNlQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRWxsaXBzZUN1cnZlOworCisg
ICAgRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5pc0VsbGlwc2VDdXJ2ZSA9IHRydWU7CisKKyAgICBF
bGxpcHNlQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkgeworCisgICAg
ICAgIHZhciB0d29QaSA9IE1hdGguUEkgKiAyOworICAgICAgICB2YXIgZGVsdGFBbmdsZSA9IHRo
aXMuYUVuZEFuZ2xlIC0gdGhpcy5hU3RhcnRBbmdsZTsKKyAgICAgICAgdmFyIHNhbWVQb2ludHMg
PSBNYXRoLmFicyggZGVsdGFBbmdsZSApIDwgTnVtYmVyLkVQU0lMT047CisKKyAgICAgICAgLy8g
ZW5zdXJlcyB0aGF0IGRlbHRhQW5nbGUgaXMgMCAuLiAyIFBJCisgICAgICAgIHdoaWxlICggZGVs
dGFBbmdsZSA8IDAgKSBkZWx0YUFuZ2xlICs9IHR3b1BpOworICAgICAgICB3aGlsZSAoIGRlbHRh
QW5nbGUgPiB0d29QaSApIGRlbHRhQW5nbGUgLT0gdHdvUGk7CisKKyAgICAgICAgaWYgKCBkZWx0
YUFuZ2xlIDwgTnVtYmVyLkVQU0lMT04gKSB7CisKKyAgICAgICAgICAgIGlmICggc2FtZVBvaW50
cyApIHsKKworICAgICAgICAgICAgICAgIGRlbHRhQW5nbGUgPSAwOworCisgICAgICAgICAgICB9
IGVsc2UgeworCisgICAgICAgICAgICAgICAgZGVsdGFBbmdsZSA9IHR3b1BpOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdGhpcy5hQ2xvY2t3aXNlID09PSB0
cnVlICYmICEgc2FtZVBvaW50cyApIHsKKworICAgICAgICAgICAgaWYgKCBkZWx0YUFuZ2xlID09
PSB0d29QaSApIHsKKworICAgICAgICAgICAgICAgIGRlbHRhQW5nbGUgPSAtIHR3b1BpOworCisg
ICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgZGVsdGFBbmdsZSA9IGRlbHRh
QW5nbGUgLSB0d29QaTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICB2
YXIgYW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlICsgdCAqIGRlbHRhQW5nbGU7CisgICAgICAgIHZh
ciB4ID0gdGhpcy5hWCArIHRoaXMueFJhZGl1cyAqIE1hdGguY29zKCBhbmdsZSApOworICAgICAg
ICB2YXIgeSA9IHRoaXMuYVkgKyB0aGlzLnlSYWRpdXMgKiBNYXRoLnNpbiggYW5nbGUgKTsKKwor
ICAgICAgICBpZiAoIHRoaXMuYVJvdGF0aW9uICE9PSAwICkgeworCisgICAgICAgICAgICB2YXIg
Y29zID0gTWF0aC5jb3MoIHRoaXMuYVJvdGF0aW9uICk7CisgICAgICAgICAgICB2YXIgc2luID0g
TWF0aC5zaW4oIHRoaXMuYVJvdGF0aW9uICk7CisKKyAgICAgICAgICAgIHZhciB0eCA9IHggLSB0
aGlzLmFYOworICAgICAgICAgICAgdmFyIHR5ID0geSAtIHRoaXMuYVk7CisKKyAgICAgICAgICAg
IC8vIFJvdGF0ZSB0aGUgcG9pbnQgYWJvdXQgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS4KKyAg
ICAgICAgICAgIHggPSB0eCAqIGNvcyAtIHR5ICogc2luICsgdGhpcy5hWDsKKyAgICAgICAgICAg
IHkgPSB0eCAqIHNpbiArIHR5ICogY29zICsgdGhpcy5hWTsKKworICAgICAgICB9CisKKyAgICAg
ICAgcmV0dXJuIG5ldyBWZWN0b3IyKCB4LCB5ICk7CisKKyAgICB9OworCisgICAgZnVuY3Rpb24g
U3BsaW5lQ3VydmUoIHBvaW50cyAvKiBhcnJheSBvZiBWZWN0b3IyICovICkgeworCisgICAgICAg
IEN1cnZlLmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnBvaW50cyA9ICggcG9pbnRzID09
PSB1bmRlZmluZWQgKSA/IFtdIDogcG9pbnRzOworCisgICAgfQorCisgICAgU3BsaW5lQ3VydmUu
cHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CisgICAgU3BsaW5l
Q3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BsaW5lQ3VydmU7CisKKyAgICBTcGxpbmVD
dXJ2ZS5wcm90b3R5cGUuaXNTcGxpbmVDdXJ2ZSA9IHRydWU7CisKKyAgICBTcGxpbmVDdXJ2ZS5w
cm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7CisKKyAgICAgICAgdmFyIHBvaW50
cyA9IHRoaXMucG9pbnRzOworICAgICAgICB2YXIgcG9pbnQgPSAoIHBvaW50cy5sZW5ndGggLSAx
ICkgKiB0OworCisgICAgICAgIHZhciBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHBvaW50ICk7Cisg
ICAgICAgIHZhciB3ZWlnaHQgPSBwb2ludCAtIGludFBvaW50OworCisgICAgICAgIHZhciBwb2lu
dDAgPSBwb2ludHNbIGludFBvaW50ID09PSAwID8gaW50UG9pbnQgOiBpbnRQb2ludCAtIDEgXTsK
KyAgICAgICAgdmFyIHBvaW50MSA9IHBvaW50c1sgaW50UG9pbnQgXTsKKyAgICAgICAgdmFyIHBv
aW50MiA9IHBvaW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMiA/IHBvaW50cy5sZW5n
dGggLSAxIDogaW50UG9pbnQgKyAxIF07CisgICAgICAgIHZhciBwb2ludDMgPSBwb2ludHNbIGlu
dFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDMgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50
ICsgMiBdOworCisgICAgICAgIHJldHVybiBuZXcgVmVjdG9yMigKKyAgICAgICAgICAgIENhdG11
bGxSb20oIHdlaWdodCwgcG9pbnQwLngsIHBvaW50MS54LCBwb2ludDIueCwgcG9pbnQzLnggKSwK
KyAgICAgICAgICAgIENhdG11bGxSb20oIHdlaWdodCwgcG9pbnQwLnksIHBvaW50MS55LCBwb2lu
dDIueSwgcG9pbnQzLnkgKQorICAgICAgICApOworCisgICAgfTsKKworICAgIGZ1bmN0aW9uIEN1
YmljQmV6aWVyQ3VydmUoIHYwLCB2MSwgdjIsIHYzICkgeworCisgICAgICAgIEN1cnZlLmNhbGwo
IHRoaXMgKTsKKworICAgICAgICB0aGlzLnYwID0gdjA7CisgICAgICAgIHRoaXMudjEgPSB2MTsK
KyAgICAgICAgdGhpcy52MiA9IHYyOworICAgICAgICB0aGlzLnYzID0gdjM7CisKKyAgICB9CisK
KyAgICBDdWJpY0JlemllckN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnBy
b3RvdHlwZSApOworICAgIEN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0g
Q3ViaWNCZXppZXJDdXJ2ZTsKKworICAgIEN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBv
aW50ID0gZnVuY3Rpb24gKCB0ICkgeworCisgICAgICAgIHZhciB2MCA9IHRoaXMudjAsIHYxID0g
dGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7CisKKyAgICAgICAgcmV0dXJuIG5l
dyBWZWN0b3IyKAorICAgICAgICAgICAgQ3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngs
IHYzLnggKSwKKyAgICAgICAgICAgIEN1YmljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55LCB2
My55ICkKKyAgICAgICAgKTsKKworICAgIH07CisKKyAgICBmdW5jdGlvbiBRdWFkcmF0aWNCZXpp
ZXJDdXJ2ZSggdjAsIHYxLCB2MiApIHsKKworICAgICAgICBDdXJ2ZS5jYWxsKCB0aGlzICk7CisK
KyAgICAgICAgdGhpcy52MCA9IHYwOworICAgICAgICB0aGlzLnYxID0gdjE7CisgICAgICAgIHRo
aXMudjIgPSB2MjsKKworICAgIH0KKworICAgIFF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlw
ZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApOworICAgIFF1YWRyYXRpY0Jlemll
ckN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFF1YWRyYXRpY0JlemllckN1cnZlOworCisg
ICAgUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0
ICkgeworCisgICAgICAgIHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlz
LnYyOworCisgICAgICAgIHJldHVybiBuZXcgVmVjdG9yMigKKyAgICAgICAgICAgIFF1YWRyYXRp
Y0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCApLAorICAgICAgICAgICAgUXVhZHJhdGljQmV6
aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55ICkKKyAgICAgICAgKTsKKworICAgIH07CisKKyAgICB2
YXIgUGF0aFByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEN1cnZlUGF0
aC5wcm90b3R5cGUgKSwgeworCisgICAgICAgIGZyb21Qb2ludHM6IGZ1bmN0aW9uICggdmVjdG9y
cyApIHsKKworICAgICAgICAgICAgdGhpcy5tb3ZlVG8oIHZlY3RvcnNbIDAgXS54LCB2ZWN0b3Jz
WyAwIF0ueSApOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDEsIGwgPSB2ZWN0b3JzLmxl
bmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLmxpbmVUbyggdmVj
dG9yc1sgaSBdLngsIHZlY3RvcnNbIGkgXS55ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICB9LAorCisgICAgICAgIG1vdmVUbzogZnVuY3Rpb24gKCB4LCB5ICkgeworCisgICAgICAgICAg
ICB0aGlzLmN1cnJlbnRQb2ludC5zZXQoIHgsIHkgKTsgLy8gVE9ETyBjb25zaWRlciByZWZlcmVu
Y2luZyB2ZWN0b3JzIGluc3RlYWQgb2YgY29weWluZz8KKworICAgICAgICB9LAorCisgICAgICAg
IGxpbmVUbzogZnVuY3Rpb24gKCB4LCB5ICkgeworCisgICAgICAgICAgICB2YXIgY3VydmUgPSBu
ZXcgTGluZUN1cnZlKCB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLCBuZXcgVmVjdG9yMiggeCwg
eSApICk7CisgICAgICAgICAgICB0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApOworCisgICAgICAg
ICAgICB0aGlzLmN1cnJlbnRQb2ludC5zZXQoIHgsIHkgKTsKKworICAgICAgICB9LAorCisgICAg
ICAgIHF1YWRyYXRpY0N1cnZlVG86IGZ1bmN0aW9uICggYUNQeCwgYUNQeSwgYVgsIGFZICkgewor
CisgICAgICAgICAgICB2YXIgY3VydmUgPSBuZXcgUXVhZHJhdGljQmV6aWVyQ3VydmUoCisgICAg
ICAgICAgICAgICAgdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICBu
ZXcgVmVjdG9yMiggYUNQeCwgYUNQeSApLAorICAgICAgICAgICAgICAgIG5ldyBWZWN0b3IyKCBh
WCwgYVkgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgdGhpcy5jdXJ2ZXMucHVzaCgg
Y3VydmUgKTsKKworICAgICAgICAgICAgdGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTsK
KworICAgICAgICB9LAorCisgICAgICAgIGJlemllckN1cnZlVG86IGZ1bmN0aW9uICggYUNQMXgs
IGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHsKKworICAgICAgICAgICAgdmFyIGN1cnZl
ID0gbmV3IEN1YmljQmV6aWVyQ3VydmUoCisgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UG9p
bnQuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICBuZXcgVmVjdG9yMiggYUNQMXgsIGFDUDF5ICks
CisgICAgICAgICAgICAgICAgbmV3IFZlY3RvcjIoIGFDUDJ4LCBhQ1AyeSApLAorICAgICAgICAg
ICAgICAgIG5ldyBWZWN0b3IyKCBhWCwgYVkgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAg
ICAgdGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTsKKworICAgICAgICAgICAgdGhpcy5jdXJyZW50
UG9pbnQuc2V0KCBhWCwgYVkgKTsKKworICAgICAgICB9LAorCisgICAgICAgIHNwbGluZVRocnU6
IGZ1bmN0aW9uICggcHRzIC8qQXJyYXkgb2YgVmVjdG9yKi8gKSB7CisKKyAgICAgICAgICAgIHZh
ciBucHRzID0gWyB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpIF0uY29uY2F0KCBwdHMgKTsKKwor
ICAgICAgICAgICAgdmFyIGN1cnZlID0gbmV3IFNwbGluZUN1cnZlKCBucHRzICk7CisgICAgICAg
ICAgICB0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApOworCisgICAgICAgICAgICB0aGlzLmN1cnJl
bnRQb2ludC5jb3B5KCBwdHNbIHB0cy5sZW5ndGggLSAxIF0gKTsKKworICAgICAgICB9LAorCisg
ICAgICAgIGFyYzogZnVuY3Rpb24gKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5k
QW5nbGUsIGFDbG9ja3dpc2UgKSB7CisKKyAgICAgICAgICAgIHZhciB4MCA9IHRoaXMuY3VycmVu
dFBvaW50Lng7CisgICAgICAgICAgICB2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55OworCisg
ICAgICAgICAgICB0aGlzLmFic2FyYyggYVggKyB4MCwgYVkgKyB5MCwgYVJhZGl1cywKKyAgICAg
ICAgICAgICAgICBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7CisKKyAgICAg
ICAgfSwKKworICAgICAgICBhYnNhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3Rh
cnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkgeworCisgICAgICAgICAgICB0aGlzLmFi
c2VsbGlwc2UoIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmds
ZSwgYUNsb2Nrd2lzZSApOworCisgICAgICAgIH0sCisKKyAgICAgICAgZWxsaXBzZTogZnVuY3Rp
b24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFD
bG9ja3dpc2UsIGFSb3RhdGlvbiApIHsKKworICAgICAgICAgICAgdmFyIHgwID0gdGhpcy5jdXJy
ZW50UG9pbnQueDsKKyAgICAgICAgICAgIHZhciB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7CisK
KyAgICAgICAgICAgIHRoaXMuYWJzZWxsaXBzZSggYVggKyB4MCwgYVkgKyB5MCwgeFJhZGl1cywg
eVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7
CisKKyAgICAgICAgfSwKKworICAgICAgICBhYnNlbGxpcHNlOiBmdW5jdGlvbiAoIGFYLCBhWSwg
eFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJv
dGF0aW9uICkgeworCisgICAgICAgICAgICB2YXIgY3VydmUgPSBuZXcgRWxsaXBzZUN1cnZlKCBh
WCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dp
c2UsIGFSb3RhdGlvbiApOworCisgICAgICAgICAgICBpZiAoIHRoaXMuY3VydmVzLmxlbmd0aCA+
IDAgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBpZiBhIHByZXZpb3VzIGN1cnZlIGlzIHByZXNl
bnQsIGF0dGVtcHQgdG8gam9pbgorICAgICAgICAgICAgICAgIHZhciBmaXJzdFBvaW50ID0gY3Vy
dmUuZ2V0UG9pbnQoIDAgKTsKKworICAgICAgICAgICAgICAgIGlmICggISBmaXJzdFBvaW50LmVx
dWFscyggdGhpcy5jdXJyZW50UG9pbnQgKSApIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlz
LmxpbmVUbyggZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnkgKTsKKworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2
ZSApOworCisgICAgICAgICAgICB2YXIgbGFzdFBvaW50ID0gY3VydmUuZ2V0UG9pbnQoIDEgKTsK
KyAgICAgICAgICAgIHRoaXMuY3VycmVudFBvaW50LmNvcHkoIGxhc3RQb2ludCApOworCisgICAg
ICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3Igeno4NSAvIGh0dHA6
Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKKyAgICAgKiBDcmVhdGVzIGZyZWUgZm9ybSAy
ZCBwYXRoIHVzaW5nIHNlcmllcyBvZiBwb2ludHMsIGxpbmVzIG9yIGN1cnZlcy4KKyAgICAgKiov
CisKKyAgICBmdW5jdGlvbiBQYXRoKCBwb2ludHMgKSB7CisKKyAgICAgICAgQ3VydmVQYXRoLmNh
bGwoIHRoaXMgKTsKKyAgICAgICAgdGhpcy5jdXJyZW50UG9pbnQgPSBuZXcgVmVjdG9yMigpOwor
CisgICAgICAgIGlmICggcG9pbnRzICkgeworCisgICAgICAgICAgICB0aGlzLmZyb21Qb2ludHMo
IHBvaW50cyApOworCisgICAgICAgIH0KKworICAgIH0KKworICAgIFBhdGgucHJvdG90eXBlID0g
UGF0aFByb3RvdHlwZTsKKyAgICBQYXRoUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGF0aDsKKwor
ICAgIC8qKgorICAgICAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96
ejg1L2Jsb2cKKyAgICAgKiBEZWZpbmVzIGEgMmQgc2hhcGUgcGxhbmUgdXNpbmcgcGF0aHMuCisg
ICAgICoqLworCisgICAgLy8gU1RFUCAxIENyZWF0ZSBhIHBhdGguCisgICAgLy8gU1RFUCAyIFR1
cm4gcGF0aCBpbnRvIHNoYXBlLgorICAgIC8vIFNURVAgMyBFeHRydWRlR2VvbWV0cnkgdGFrZXMg
aW4gU2hhcGUvU2hhcGVzCisgICAgLy8gU1RFUCAzYSAtIEV4dHJhY3QgcG9pbnRzIGZyb20gZWFj
aCBzaGFwZSwgdHVybiB0byB2ZXJ0aWNlcworICAgIC8vIFNURVAgM2IgLSBUcmlhbmd1bGF0ZSBl
YWNoIHNoYXBlLCBhZGQgZmFjZXMuCisKKyAgICBmdW5jdGlvbiBTaGFwZSgpIHsKKworICAgICAg
ICBQYXRoLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKworICAgICAgICB0aGlzLmhvbGVzID0g
W107CisKKyAgICB9CisKKyAgICBTaGFwZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmpl
Y3QuY3JlYXRlKCBQYXRoUHJvdG90eXBlICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogU2hh
cGUsCisKKyAgICAgICAgZ2V0UG9pbnRzSG9sZXM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgewor
CisgICAgICAgICAgICB2YXIgaG9sZXNQdHMgPSBbXTsKKworICAgICAgICAgICAgZm9yICggdmFy
IGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisgICAgICAg
ICAgICAgICAgaG9sZXNQdHNbIGkgXSA9IHRoaXMuaG9sZXNbIGkgXS5nZXRQb2ludHMoIGRpdmlz
aW9ucyApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBob2xlc1B0czsK
KworICAgICAgICB9LAorCisgICAgICAgIC8vIEdldCBwb2ludHMgb2Ygc2hhcGUgYW5kIGhvbGVz
IChrZXlwb2ludHMgYmFzZWQgb24gc2VnbWVudHMgcGFyYW1ldGVyKQorCisgICAgICAgIGV4dHJh
Y3RBbGxQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgeworCisgICAgICAgICAgICByZXR1
cm4geworCisgICAgICAgICAgICAgICAgc2hhcGU6IHRoaXMuZ2V0UG9pbnRzKCBkaXZpc2lvbnMg
KSwKKyAgICAgICAgICAgICAgICBob2xlczogdGhpcy5nZXRQb2ludHNIb2xlcyggZGl2aXNpb25z
ICkKKworICAgICAgICAgICAgfTsKKworICAgICAgICB9LAorCisgICAgICAgIGV4dHJhY3RQb2lu
dHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgeworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5l
eHRyYWN0QWxsUG9pbnRzKCBkaXZpc2lvbnMgKTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisK
KyAgICAvKioKKyAgICAgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQv
eno4NS9ibG9nCisgICAgICogbWluaW1hbCBjbGFzcyBmb3IgcHJveGluZyBmdW5jdGlvbnMgdG8g
UGF0aC4gUmVwbGFjZXMgb2xkICJleHRyYWN0U3VicGF0aHMoKSIKKyAgICAgKiovCisKKyAgICBm
dW5jdGlvbiBTaGFwZVBhdGgoKSB7CisKKyAgICAgICAgdGhpcy5zdWJQYXRocyA9IFtdOworICAg
ICAgICB0aGlzLmN1cnJlbnRQYXRoID0gbnVsbDsKKworICAgIH0KKworICAgIE9iamVjdC5hc3Np
Z24oIFNoYXBlUGF0aC5wcm90b3R5cGUsIHsKKworICAgICAgICBtb3ZlVG86IGZ1bmN0aW9uICgg
eCwgeSApIHsKKworICAgICAgICAgICAgdGhpcy5jdXJyZW50UGF0aCA9IG5ldyBQYXRoKCk7Cisg
ICAgICAgICAgICB0aGlzLnN1YlBhdGhzLnB1c2goIHRoaXMuY3VycmVudFBhdGggKTsKKyAgICAg
ICAgICAgIHRoaXMuY3VycmVudFBhdGgubW92ZVRvKCB4LCB5ICk7CisKKyAgICAgICAgfSwKKwor
ICAgICAgICBsaW5lVG86IGZ1bmN0aW9uICggeCwgeSApIHsKKworICAgICAgICAgICAgdGhpcy5j
dXJyZW50UGF0aC5saW5lVG8oIHgsIHkgKTsKKworICAgICAgICB9LAorCisgICAgICAgIHF1YWRy
YXRpY0N1cnZlVG86IGZ1bmN0aW9uICggYUNQeCwgYUNQeSwgYVgsIGFZICkgeworCisgICAgICAg
ICAgICB0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBh
WSApOworCisgICAgICAgIH0sCisKKyAgICAgICAgYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24gKCBh
Q1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkgeworCisgICAgICAgICAgICB0aGlz
LmN1cnJlbnRQYXRoLmJlemllckN1cnZlVG8oIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBh
WCwgYVkgKTsKKworICAgICAgICB9LAorCisgICAgICAgIHNwbGluZVRocnU6IGZ1bmN0aW9uICgg
cHRzICkgeworCisgICAgICAgICAgICB0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUoIHB0cyAp
OworCisgICAgICAgIH0sCisKKyAgICAgICAgdG9TaGFwZXM6IGZ1bmN0aW9uICggaXNDQ1csIG5v
SG9sZXMgKSB7CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIHRvU2hhcGVzTm9Ib2xlcyggaW5TdWJw
YXRocyApIHsKKworICAgICAgICAgICAgICAgIHZhciBzaGFwZXMgPSBbXTsKKworICAgICAgICAg
ICAgICAgIGZvciAoIHZhciBpID0gMCwgbCA9IGluU3VicGF0aHMubGVuZ3RoOyBpIDwgbDsgaSAr
KyApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdG1wUGF0aCA9IGluU3VicGF0aHNbIGkg
XTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdG1wU2hhcGUgPSBuZXcgU2hhcGUoKTsKKyAg
ICAgICAgICAgICAgICAgICAgdG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7CisKKyAg
ICAgICAgICAgICAgICAgICAgc2hhcGVzLnB1c2goIHRtcFNoYXBlICk7CisKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc2hhcGVzOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIGlzUG9pbnRJbnNpZGVQb2x5Z29uKCBpblB0LCBpblBv
bHlnb24gKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgcG9seUxlbiA9IGluUG9seWdvbi5sZW5n
dGg7CisKKyAgICAgICAgICAgICAgICAvLyBpblB0IG9uIHBvbHlnb24gY29udG91ciA9PiBpbW1l
ZGlhdGUgc3VjY2VzcyAgICBvcgorICAgICAgICAgICAgICAgIC8vIHRvZ2dsaW5nIG9mIGluc2lk
ZS9vdXRzaWRlIGF0IGV2ZXJ5IHNpbmdsZSEgaW50ZXJzZWN0aW9uIHBvaW50IG9mIGFuIGVkZ2UK
KyAgICAgICAgICAgICAgICAvLyAgd2l0aCB0aGUgaG9yaXpvbnRhbCBsaW5lIHRocm91Z2ggaW5Q
dCwgbGVmdCBvZiBpblB0CisgICAgICAgICAgICAgICAgLy8gIG5vdCBjb3VudGluZyBsb3dlclkg
ZW5kcG9pbnRzIG9mIGVkZ2VzIGFuZCB3aG9sZSBlZGdlcyBvbiB0aGF0IGxpbmUKKyAgICAgICAg
ICAgICAgICB2YXIgaW5zaWRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yICggdmFyIHAg
PSBwb2x5TGVuIC0gMSwgcSA9IDA7IHEgPCBwb2x5TGVuOyBwID0gcSArKyApIHsKKworICAgICAg
ICAgICAgICAgICAgICB2YXIgZWRnZUxvd1B0ICA9IGluUG9seWdvblsgcCBdOworICAgICAgICAg
ICAgICAgICAgICB2YXIgZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcSBdOworCisgICAgICAgICAg
ICAgICAgICAgIHZhciBlZGdlRHggPSBlZGdlSGlnaFB0LnggLSBlZGdlTG93UHQueDsKKyAgICAg
ICAgICAgICAgICAgICAgdmFyIGVkZ2VEeSA9IGVkZ2VIaWdoUHQueSAtIGVkZ2VMb3dQdC55Owor
CisgICAgICAgICAgICAgICAgICAgIGlmICggTWF0aC5hYnMoIGVkZ2VEeSApID4gTnVtYmVyLkVQ
U0lMT04gKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBwYXJhbGxlbAorICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCBlZGdlRHkgPCAwICkgeworCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZWRnZUxvd1B0ICA9IGluUG9seWdvblsgcSBdOyBlZGdlRHggPSAtIGVk
Z2VEeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlSGlnaFB0ID0gaW5Qb2x5Z29u
WyBwIF07IGVkZ2VEeSA9IC0gZWRnZUR5OworCisgICAgICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggaW5QdC55IDwgZWRnZUxvd1B0LnkgKSB8fCAo
IGluUHQueSA+IGVkZ2VIaWdoUHQueSApICkgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAoIGluUHQueSA9PT0gZWRnZUxvd1B0LnkgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIGluUHQueCA9PT0gZWRnZUxvd1B0LnggKSAgICAgICBy
ZXR1cm4gIHRydWU7ICAgICAgIC8vIGluUHQgaXMgb24gY29udG91ciA/CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gY29udGludWU7ICAgICAgICAgICAgICAgIC8vIG5vIGludGVyc2Vj
dGlvbiBvciBlZGdlTG93UHQgPT4gZG9lc24ndCBjb3VudCAhISEKKworICAgICAgICAgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwZXJw
RWRnZSA9IGVkZ2VEeSAqICggaW5QdC54IC0gZWRnZUxvd1B0LnggKSAtIGVkZ2VEeCAqICggaW5Q
dC55IC0gZWRnZUxvd1B0LnkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBl
cnBFZGdlID09PSAwICkgICAgICAgICAgICAgICByZXR1cm4gIHRydWU7ICAgICAgIC8vIGluUHQg
aXMgb24gY29udG91ciA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwZXJwRWRn
ZSA8IDAgKSAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaW5zaWRlID0gISBpbnNpZGU7ICAgICAgLy8gdHJ1ZSBpbnRlcnNlY3Rpb24gbGVmdCBv
ZiBpblB0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAg
ICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbGxlbCBvciBjb2xs
aW5lYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5QdC55ICE9PSBlZGdlTG93UHQu
eSApICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLy8gcGFyYWxsZWwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIGVkZ2UgbGllcyBvbiB0aGUgc2FtZSBob3Jpem9udGFsIGxpbmUgYXMgaW5Q
dAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoICggZWRnZUhpZ2hQdC54IDw9IGluUHQu
eCApICYmICggaW5QdC54IDw9IGVkZ2VMb3dQdC54ICkgKSB8fAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoICggZWRnZUxvd1B0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRn
ZUhpZ2hQdC54ICkgKSApICAgICAgcmV0dXJuICB0cnVlOyAgIC8vIGluUHQ6IFBvaW50IG9uIGNv
bnRvdXIgIQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWU7CisKKyAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0
dXJuICBpbnNpZGU7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGlzQ2xvY2tX
aXNlID0gU2hhcGVVdGlscy5pc0Nsb2NrV2lzZTsKKworICAgICAgICAgICAgdmFyIHN1YlBhdGhz
ID0gdGhpcy5zdWJQYXRoczsKKyAgICAgICAgICAgIGlmICggc3ViUGF0aHMubGVuZ3RoID09PSAw
ICkgcmV0dXJuIFtdOworCisgICAgICAgICAgICBpZiAoIG5vSG9sZXMgPT09IHRydWUgKSByZXR1
cm4gIHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTsKKworCisgICAgICAgICAgICB2YXIgc29s
aWQsIHRtcFBhdGgsIHRtcFNoYXBlLCBzaGFwZXMgPSBbXTsKKworICAgICAgICAgICAgaWYgKCBz
dWJQYXRocy5sZW5ndGggPT09IDEgKSB7CisKKyAgICAgICAgICAgICAgICB0bXBQYXRoID0gc3Vi
UGF0aHNbIDAgXTsKKyAgICAgICAgICAgICAgICB0bXBTaGFwZSA9IG5ldyBTaGFwZSgpOworICAg
ICAgICAgICAgICAgIHRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzOworICAgICAgICAg
ICAgICAgIHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApOworICAgICAgICAgICAgICAgIHJldHVybiBz
aGFwZXM7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGhvbGVzRmlyc3QgPSAh
IGlzQ2xvY2tXaXNlKCBzdWJQYXRoc1sgMCBdLmdldFBvaW50cygpICk7CisgICAgICAgICAgICBo
b2xlc0ZpcnN0ID0gaXNDQ1cgPyAhIGhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0OworCisgICAgICAg
ICAgICAvLyBjb25zb2xlLmxvZygiSG9sZXMgZmlyc3QiLCBob2xlc0ZpcnN0KTsKKworICAgICAg
ICAgICAgdmFyIGJldHRlclNoYXBlSG9sZXMgPSBbXTsKKyAgICAgICAgICAgIHZhciBuZXdTaGFw
ZXMgPSBbXTsKKyAgICAgICAgICAgIHZhciBuZXdTaGFwZUhvbGVzID0gW107CisgICAgICAgICAg
ICB2YXIgbWFpbklkeCA9IDA7CisgICAgICAgICAgICB2YXIgdG1wUG9pbnRzOworCisgICAgICAg
ICAgICBuZXdTaGFwZXNbIG1haW5JZHggXSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICAgIG5ld1No
YXBlSG9sZXNbIG1haW5JZHggXSA9IFtdOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAs
IGwgPSBzdWJQYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAg
dG1wUGF0aCA9IHN1YlBhdGhzWyBpIF07CisgICAgICAgICAgICAgICAgdG1wUG9pbnRzID0gdG1w
UGF0aC5nZXRQb2ludHMoKTsKKyAgICAgICAgICAgICAgICBzb2xpZCA9IGlzQ2xvY2tXaXNlKCB0
bXBQb2ludHMgKTsKKyAgICAgICAgICAgICAgICBzb2xpZCA9IGlzQ0NXID8gISBzb2xpZCA6IHNv
bGlkOworCisgICAgICAgICAgICAgICAgaWYgKCBzb2xpZCApIHsKKworICAgICAgICAgICAgICAg
ICAgICBpZiAoICggISBob2xlc0ZpcnN0ICkgJiYgKCBuZXdTaGFwZXNbIG1haW5JZHggXSApICkg
bWFpbklkeCArKzsKKworICAgICAgICAgICAgICAgICAgICBuZXdTaGFwZXNbIG1haW5JZHggXSA9
IHsgczogbmV3IFNoYXBlKCksIHA6IHRtcFBvaW50cyB9OworICAgICAgICAgICAgICAgICAgICBu
ZXdTaGFwZXNbIG1haW5JZHggXS5zLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzOworCisgICAgICAg
ICAgICAgICAgICAgIGlmICggaG9sZXNGaXJzdCApICAgbWFpbklkeCArKzsKKyAgICAgICAgICAg
ICAgICAgICAgbmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107CisKKyAgICAgICAgICAgICAg
ICAgICAgLy9jb25zb2xlLmxvZygnY3cnLCBpKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7
CisKKyAgICAgICAgICAgICAgICAgICAgbmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdLnB1c2goIHsg
aDogdG1wUGF0aCwgcDogdG1wUG9pbnRzWyAwIF0gfSApOworCisgICAgICAgICAgICAgICAgICAg
IC8vY29uc29sZS5sb2coJ2NjdycsIGkpOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIC8vIG9ubHkgSG9sZXM/IC0+IHByb2JhYmx5IGFsbCBTaGFw
ZXMgd2l0aCB3cm9uZyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaWYgKCAhIG5ld1NoYXBlc1sg
MCBdICkgcmV0dXJuICB0b1NoYXBlc05vSG9sZXMoIHN1YlBhdGhzICk7CisKKworICAgICAgICAg
ICAgaWYgKCBuZXdTaGFwZXMubGVuZ3RoID4gMSApIHsKKworICAgICAgICAgICAgICAgIHZhciBh
bWJpZ3VvdXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB2YXIgdG9DaGFuZ2UgPSBbXTsKKwor
ICAgICAgICAgICAgICAgIGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5n
dGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIGJldHRl
clNoYXBlSG9sZXNbIHNJZHggXSA9IFtdOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgZm9yICggdmFyIHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lk
eCA8IHNMZW47IHNJZHggKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNobyA9IG5l
d1NoYXBlSG9sZXNbIHNJZHggXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaElk
eCA9IDA7IGhJZHggPCBzaG8ubGVuZ3RoOyBoSWR4ICsrICkgeworCisgICAgICAgICAgICAgICAg
ICAgICAgICB2YXIgaG8gPSBzaG9bIGhJZHggXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZh
ciBob2xlX3VuYXNzaWduZWQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3Ig
KCB2YXIgczJJZHggPSAwOyBzMklkeCA8IG5ld1NoYXBlcy5sZW5ndGg7IHMySWR4ICsrICkgewor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpc1BvaW50SW5zaWRlUG9seWdvbigg
aG8ucCwgbmV3U2hhcGVzWyBzMklkeCBdLnAgKSApIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoIHNJZHggIT09IHMySWR4ICkgICB0b0NoYW5nZS5wdXNoKCB7IGZyb21z
OiBzSWR4LCB0b3M6IHMySWR4LCBob2xlOiBoSWR4IH0gKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKCBob2xlX3VuYXNzaWduZWQgKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYmV0dGVyU2hhcGVIb2xlc1sgczJJZHggXS5wdXNoKCBo
byApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtYmlndW91cyA9IHRydWU7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJldHRlclNoYXBlSG9sZXNbIHNJZHggXS5wdXNoKCBobyApOworCisgICAgICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJhbWJpZ3VvdXM6ICIsIGFtYmlndW91cyk7
CisgICAgICAgICAgICAgICAgaWYgKCB0b0NoYW5nZS5sZW5ndGggPiAwICkgeworCisgICAgICAg
ICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJ0byBjaGFuZ2U6ICIsIHRvQ2hhbmdlKTsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCAhIGFtYmlndW91cyApICBuZXdTaGFwZUhvbGVzID0gYmV0
dGVyU2hhcGVIb2xlczsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB2YXIgdG1wSG9sZXM7CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwg
aWwgPSBuZXdTaGFwZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAg
ICB0bXBTaGFwZSA9IG5ld1NoYXBlc1sgaSBdLnM7CisgICAgICAgICAgICAgICAgc2hhcGVzLnB1
c2goIHRtcFNoYXBlICk7CisgICAgICAgICAgICAgICAgdG1wSG9sZXMgPSBuZXdTaGFwZUhvbGVz
WyBpIF07CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaiA9IDAsIGpsID0gdG1wSG9sZXMu
bGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wU2hhcGUu
aG9sZXMucHVzaCggdG1wSG9sZXNbIGogXS5oICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9jb25zb2xlLmxvZygic2hhcGUiLCBzaGFwZXMp
OworCisgICAgICAgICAgICByZXR1cm4gc2hhcGVzOworCisgICAgICAgIH0KKworICAgIH0gKTsK
KworICAgIC8qKgorICAgICAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5l
dC96ejg1L2Jsb2cKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwor
ICAgICAqLworCisgICAgZnVuY3Rpb24gRm9udCggZGF0YSApIHsKKworICAgICAgICB0aGlzLmRh
dGEgPSBkYXRhOworCisgICAgfQorCisgICAgT2JqZWN0LmFzc2lnbiggRm9udC5wcm90b3R5cGUs
IHsKKworICAgICAgICBpc0ZvbnQ6IHRydWUsCisKKyAgICAgICAgZ2VuZXJhdGVTaGFwZXM6IGZ1
bmN0aW9uICggdGV4dCwgc2l6ZSwgZGl2aXNpb25zICkgeworCisgICAgICAgICAgICBmdW5jdGlv
biBjcmVhdGVQYXRocyggdGV4dCApIHsKKworICAgICAgICAgICAgICAgIHZhciBjaGFycyA9IFN0
cmluZyggdGV4dCApLnNwbGl0KCAnJyApOworICAgICAgICAgICAgICAgIHZhciBzY2FsZSA9IHNp
emUgLyBkYXRhLnJlc29sdXRpb247CisgICAgICAgICAgICAgICAgdmFyIGxpbmVfaGVpZ2h0ID0g
KCBkYXRhLmJvdW5kaW5nQm94LnlNYXggLSBkYXRhLmJvdW5kaW5nQm94LnlNaW4gKyBkYXRhLnVu
ZGVybGluZVRoaWNrbmVzcyApICogc2NhbGU7CisKKyAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0
WCA9IDAsIG9mZnNldFkgPSAwOworCisgICAgICAgICAgICAgICAgdmFyIHBhdGhzID0gW107CisK
KyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkgKysg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXIgPSBjaGFyc1sgaSBdOworCisgICAg
ICAgICAgICAgICAgICAgIGlmICggY2hhciA9PT0gJ1xuJyApIHsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgb2Zmc2V0WCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRZIC09
IGxpbmVfaGVpZ2h0OworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHZhciByZXQgPSBjcmVhdGVQYXRoKCBjaGFyLCBzY2FsZSwgb2Zmc2V0
WCwgb2Zmc2V0WSApOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WCArPSByZXQub2Zm
c2V0WDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goIHJldC5wYXRoICk7CisK
KyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgcmV0dXJuIHBhdGhzOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0
aW9uIGNyZWF0ZVBhdGgoIGMsIHNjYWxlLCBvZmZzZXRYLCBvZmZzZXRZICkgeworCisgICAgICAg
ICAgICAgICAgdmFyIGdseXBoID0gZGF0YS5nbHlwaHNbIGMgXSB8fCBkYXRhLmdseXBoc1sgJz8n
IF07CisKKyAgICAgICAgICAgICAgICBpZiAoICEgZ2x5cGggKSByZXR1cm47CisKKyAgICAgICAg
ICAgICAgICB2YXIgcGF0aCA9IG5ldyBTaGFwZVBhdGgoKTsKKworICAgICAgICAgICAgICAgIHZh
ciBwdHMgPSBbXTsKKyAgICAgICAgICAgICAgICB2YXIgeCwgeSwgY3B4LCBjcHksIGNweDAsIGNw
eTAsIGNweDEsIGNweTEsIGNweDIsIGNweTIsIGxhc3RlOworCisgICAgICAgICAgICAgICAgaWYg
KCBnbHlwaC5vICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBvdXRsaW5lID0gZ2x5cGgu
X2NhY2hlZE91dGxpbmUgfHwgKCBnbHlwaC5fY2FjaGVkT3V0bGluZSA9IGdseXBoLm8uc3BsaXQo
ICcgJyApICk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0gb3V0
bGluZS5sZW5ndGg7IGkgPCBsOyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFj
dGlvbiA9IG91dGxpbmVbIGkgKysgXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNo
ICggYWN0aW9uICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6IC8v
IG1vdmVUbworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBvdXRsaW5lWyBp
ICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcGF0aC5tb3ZlVG8oIHgsIHkgKTsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNh
c2UgJ2wnOiAvLyBsaW5lVG8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0g
b3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZOworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgubGluZVRvKCB4LCB5ICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjYXNlICdxJzogLy8gcXVhZHJhdGljQ3VydmVUbworCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNweCAgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNweSAgPSBvdXRsaW5lWyBpICsrIF0g
KiBzY2FsZSArIG9mZnNldFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNweDEg
PSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CisK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKCBj
cHgxLCBjcHkxLCBjcHgsIGNweSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGxhc3RlID0gcHRzWyBwdHMubGVuZ3RoIC0gMSBdOworCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICggbGFzdGUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNweDAgPSBsYXN0ZS54OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY3B5MCA9IGxhc3RlLnk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGZvciAoIHZhciBpMiA9IDE7IGkyIDw9IGRpdmlzaW9uczsgaTIgKysgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGkyIC8gZGl2aXNpb25zOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWRyYXRpY0Jlemllcigg
dCwgY3B4MCwgY3B4MSwgY3B4ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgUXVhZHJhdGljQmV6aWVyKCB0LCBjcHkwLCBjcHkxLCBjcHkgKTsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOiAvLyBiZXppZXJDdXJ2ZVRvCisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICA9IG91dGxpbmVbIGkgKysgXSAqIHNj
YWxlICsgb2Zmc2V0WDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B5ICA9IG91
dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY3B4MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxl
ICsgb2Zmc2V0WTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B4MiA9IG91dGxp
bmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY3B5MiA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8oIGNweDEsIGNweTEs
IGNweDIsIGNweTIsIGNweCwgY3B5ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbGFzdGUgPSBwdHNbIHB0cy5sZW5ndGggLSAxIF07CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKCBsYXN0ZSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY3B4MCA9IGxhc3RlLng7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjcHkwID0gbGFzdGUueTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZm9yICggdmFyIGkyID0gMTsgaTIgPD0gZGl2aXNpb25zOyBpMiArKyApIHsKKworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gaTIgLyBkaXZpc2lvbnM7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ViaWNCZXppZXIoIHQs
IGNweDAsIGNweDEsIGNweDIsIGNweCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIEN1YmljQmV6aWVyKCB0LCBjcHkwLCBjcHkxLCBjcHkyLCBjcHkgKTsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK
KworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB7IG9mZnNldFg6IGds
eXBoLmhhICogc2NhbGUsIHBhdGg6IHBhdGggfTsKKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAvLworCisgICAgICAgICAgICBpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAx
MDA7CisgICAgICAgICAgICBpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25z
ID0gNDsKKworICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7CisKKyAgICAgICAgICAg
IHZhciBwYXRocyA9IGNyZWF0ZVBhdGhzKCB0ZXh0ICk7CisgICAgICAgICAgICB2YXIgc2hhcGVz
ID0gW107CisKKyAgICAgICAgICAgIGZvciAoIHZhciBwID0gMCwgcGwgPSBwYXRocy5sZW5ndGg7
IHAgPCBwbDsgcCArKyApIHsKKworICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNo
LmFwcGx5KCBzaGFwZXMsIHBhdGhzWyBwIF0udG9TaGFwZXMoKSApOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIHJldHVybiBzaGFwZXM7CisKKyAgICAgICAgfQorCisgICAgfSApOwor
CisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAg
ICAgKi8KKworICAgIGZ1bmN0aW9uIEZvbnRMb2FkZXIoIG1hbmFnZXIgKSB7CisKKyAgICAgICAg
dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZh
dWx0TG9hZGluZ01hbmFnZXI7CisKKyAgICB9CisKKyAgICBPYmplY3QuYXNzaWduKCBGb250TG9h
ZGVyLnByb3RvdHlwZSwgeworCisgICAgICAgIGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQs
IG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CisKKyAgICAgICAgICAgIHZhciBzY29wZSA9IHRoaXM7
CisKKyAgICAgICAgICAgIHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2Vy
ICk7CisgICAgICAgICAgICBsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7CisK
KyAgICAgICAgICAgICAgICB2YXIganNvbjsKKworICAgICAgICAgICAgICAgIHRyeSB7CisKKyAg
ICAgICAgICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTsKKworICAgICAgICAg
ICAgICAgIH0gY2F0Y2ggKCBlICkgeworCisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fy
biggJ1RIUkVFLkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVj
YXRlZC4gVXNlIHR5cGVmYWNlLmpzb24gaW5zdGVhZC4nICk7CisgICAgICAgICAgICAgICAgICAg
IGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0LnN1YnN0cmluZyggNjUsIHRleHQubGVuZ3RoIC0gMiAp
ICk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgZm9udCA9IHNj
b3BlLnBhcnNlKCBqc29uICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIG9uTG9hZCApIG9uTG9h
ZCggZm9udCApOworCisgICAgICAgICAgICB9LCBvblByb2dyZXNzLCBvbkVycm9yICk7CisKKyAg
ICAgICAgfSwKKworICAgICAgICBwYXJzZTogZnVuY3Rpb24gKCBqc29uICkgeworCisgICAgICAg
ICAgICByZXR1cm4gbmV3IEZvbnQoIGpzb24gKTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisK
KyAgICB2YXIgY29udGV4dDsKKworICAgIHZhciBBdWRpb0NvbnRleHQgPSB7CisKKyAgICAgICAg
Z2V0Q29udGV4dDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBpZiAoIGNvbnRleHQgPT09
IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgKCB3aW5kb3cu
QXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQgKSgpOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0OworCisgICAgICAgIH0sCisKKyAg
ICAgICAgc2V0Q29udGV4dDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgY29u
dGV4dCA9IHZhbHVlOworCisgICAgICAgIH0KKworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBA
YXV0aG9yIFJlZWNlIEFhcm9uIExlY3JpdmFpbiAvIGh0dHA6Ly9yZWVjZW5vdGVzLmNvbS8KKyAg
ICAgKi8KKworICAgIGZ1bmN0aW9uIEF1ZGlvTG9hZGVyKCBtYW5hZ2VyICkgeworCisgICAgICAg
IHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVm
YXVsdExvYWRpbmdNYW5hZ2VyOworCisgICAgfQorCisgICAgT2JqZWN0LmFzc2lnbiggQXVkaW9M
b2FkZXIucHJvdG90eXBlLCB7CisKKyAgICAgICAgbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9h
ZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKKworICAgICAgICAgICAgdmFyIGxvYWRlciA9IG5l
dyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTsKKyAgICAgICAgICAgIGxvYWRlci5zZXRSZXNw
b25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTsKKyAgICAgICAgICAgIGxvYWRlci5sb2FkKCB1cmws
IGZ1bmN0aW9uICggYnVmZmVyICkgeworCisgICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBB
dWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpOworCisgICAgICAgICAgICAgICAgY29udGV4dC5kZWNv
ZGVBdWRpb0RhdGEoIGJ1ZmZlciwgZnVuY3Rpb24gKCBhdWRpb0J1ZmZlciApIHsKKworICAgICAg
ICAgICAgICAgICAgICBvbkxvYWQoIGF1ZGlvQnVmZmVyICk7CisKKyAgICAgICAgICAgICAgICB9
ICk7CisKKyAgICAgICAgICAgIH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKKworICAgICAgICB9
CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9t
cmRvb2IuY29tLworICAgICAqLworCisgICAgZnVuY3Rpb24gU3RlcmVvQ2FtZXJhKCkgeworCisg
ICAgICAgIHRoaXMudHlwZSA9ICdTdGVyZW9DYW1lcmEnOworCisgICAgICAgIHRoaXMuYXNwZWN0
ID0gMTsKKworICAgICAgICB0aGlzLmV5ZVNlcCA9IDAuMDY0OworCisgICAgICAgIHRoaXMuY2Ft
ZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpOworICAgICAgICB0aGlzLmNhbWVyYUwubGF5
ZXJzLmVuYWJsZSggMSApOworICAgICAgICB0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZSA9
IGZhbHNlOworCisgICAgICAgIHRoaXMuY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgp
OworICAgICAgICB0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApOworICAgICAgICB0aGlz
LmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworCisgICAgfQorCisgICAgT2JqZWN0
LmFzc2lnbiggU3RlcmVvQ2FtZXJhLnByb3RvdHlwZSwgeworCisgICAgICAgIHVwZGF0ZTogKCBm
dW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZhciBpbnN0YW5jZSwgZm9jdXMsIGZvdiwgYXNw
ZWN0LCBuZWFyLCBmYXIsIHpvb20sIGV5ZVNlcDsKKworICAgICAgICAgICAgdmFyIGV5ZVJpZ2h0
ID0gbmV3IE1hdHJpeDQoKTsKKyAgICAgICAgICAgIHZhciBleWVMZWZ0ID0gbmV3IE1hdHJpeDQo
KTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkgeworCisg
ICAgICAgICAgICAgICAgdmFyIG5lZWRzVXBkYXRlID0gaW5zdGFuY2UgIT09IHRoaXMgfHwgZm9j
dXMgIT09IGNhbWVyYS5mb2N1cyB8fCBmb3YgIT09IGNhbWVyYS5mb3YgfHwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3QgIT09IGNhbWVy
YS5hc3BlY3QgKiB0aGlzLmFzcGVjdCB8fCBuZWFyICE9PSBjYW1lcmEubmVhciB8fAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhciAhPT0gY2Ft
ZXJhLmZhciB8fCB6b29tICE9PSBjYW1lcmEuem9vbSB8fCBleWVTZXAgIT09IHRoaXMuZXllU2Vw
OworCisgICAgICAgICAgICAgICAgaWYgKCBuZWVkc1VwZGF0ZSApIHsKKworICAgICAgICAgICAg
ICAgICAgICBpbnN0YW5jZSA9IHRoaXM7CisgICAgICAgICAgICAgICAgICAgIGZvY3VzID0gY2Ft
ZXJhLmZvY3VzOworICAgICAgICAgICAgICAgICAgICBmb3YgPSBjYW1lcmEuZm92OworICAgICAg
ICAgICAgICAgICAgICBhc3BlY3QgPSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3Q7CisgICAg
ICAgICAgICAgICAgICAgIG5lYXIgPSBjYW1lcmEubmVhcjsKKyAgICAgICAgICAgICAgICAgICAg
ZmFyID0gY2FtZXJhLmZhcjsKKyAgICAgICAgICAgICAgICAgICAgem9vbSA9IGNhbWVyYS56b29t
OworCisgICAgICAgICAgICAgICAgICAgIC8vIE9mZi1heGlzIHN0ZXJlb3Njb3BpYyBlZmZlY3Qg
YmFzZWQgb24KKyAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL3BhdWxib3Vya2UubmV0L3N0
ZXJlb2dyYXBoaWNzL3N0ZXJlb3JlbmRlci8KKworICAgICAgICAgICAgICAgICAgICB2YXIgcHJv
amVjdGlvbk1hdHJpeCA9IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCk7CisgICAgICAg
ICAgICAgICAgICAgIGV5ZVNlcCA9IHRoaXMuZXllU2VwIC8gMjsKKyAgICAgICAgICAgICAgICAg
ICAgdmFyIGV5ZVNlcE9uUHJvamVjdGlvbiA9IGV5ZVNlcCAqIG5lYXIgLyBmb2N1czsKKyAgICAg
ICAgICAgICAgICAgICAgdmFyIHltYXggPSAoIG5lYXIgKiBNYXRoLnRhbiggX01hdGguREVHMlJB
RCAqIGZvdiAqIDAuNSApICkgLyB6b29tOworICAgICAgICAgICAgICAgICAgICB2YXIgeG1pbiwg
eG1heDsKKworICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2xhdGUgeE9mZnNldAorCisgICAg
ICAgICAgICAgICAgICAgIGV5ZUxlZnQuZWxlbWVudHNbIDEyIF0gPSAtIGV5ZVNlcDsKKyAgICAg
ICAgICAgICAgICAgICAgZXllUmlnaHQuZWxlbWVudHNbIDEyIF0gPSBleWVTZXA7CisKKyAgICAg
ICAgICAgICAgICAgICAgLy8gZm9yIGxlZnQgZXllCisKKyAgICAgICAgICAgICAgICAgICAgeG1p
biA9IC0geW1heCAqIGFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjsKKyAgICAgICAgICAgICAg
ICAgICAgeG1heCA9IHltYXggKiBhc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247CisKKyAgICAg
ICAgICAgICAgICAgICAgcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdID0gMiAqIG5lYXIg
LyAoIHhtYXggLSB4bWluICk7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25NYXRyaXgu
ZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTsKKworICAg
ICAgICAgICAgICAgICAgICB0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBwcm9q
ZWN0aW9uTWF0cml4ICk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHJpZ2h0IGV5ZQor
CisgICAgICAgICAgICAgICAgICAgIHhtaW4gPSAtIHltYXggKiBhc3BlY3QgLSBleWVTZXBPblBy
b2plY3Rpb247CisgICAgICAgICAgICAgICAgICAgIHhtYXggPSB5bWF4ICogYXNwZWN0IC0gZXll
U2VwT25Qcm9qZWN0aW9uOworCisgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25NYXRyaXgu
ZWxlbWVudHNbIDAgXSA9IDIgKiBuZWFyIC8gKCB4bWF4IC0geG1pbiApOworICAgICAgICAgICAg
ICAgICAgICBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkg
LyAoIHhtYXggLSB4bWluICk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW1lcmFSLnBy
b2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApOworCisgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoIGNh
bWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBleWVMZWZ0ICk7CisgICAgICAgICAgICAgICAg
dGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRp
cGx5KCBleWVSaWdodCApOworCisgICAgICAgICAgICB9OworCisgICAgICAgIH0gKSgpCisKKyAg
ICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBDYW1lcmEgZm9yIHJlbmRlcmluZyBjdWJlIG1hcHMK
KyAgICAgKiAgLSByZW5kZXJzIHNjZW5lIGludG8gYXhpcy1hbGlnbmVkIGN1YmUKKyAgICAgKgor
ICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAg
ICovCisKKyAgICBmdW5jdGlvbiBDdWJlQ2FtZXJhKCBuZWFyLCBmYXIsIGN1YmVSZXNvbHV0aW9u
ICkgeworCisgICAgICAgIE9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnR5
cGUgPSAnQ3ViZUNhbWVyYSc7CisKKyAgICAgICAgdmFyIGZvdiA9IDkwLCBhc3BlY3QgPSAxOwor
CisgICAgICAgIHZhciBjYW1lcmFQWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3Bl
Y3QsIG5lYXIsIGZhciApOworICAgICAgICBjYW1lcmFQWC51cC5zZXQoIDAsIC0gMSwgMCApOwor
ICAgICAgICBjYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAxLCAwLCAwICkgKTsKKyAgICAg
ICAgdGhpcy5hZGQoIGNhbWVyYVBYICk7CisKKyAgICAgICAgdmFyIGNhbWVyYU5YID0gbmV3IFBl
cnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CisgICAgICAgIGNhbWVy
YU5YLnVwLnNldCggMCwgLSAxLCAwICk7CisgICAgICAgIGNhbWVyYU5YLmxvb2tBdCggbmV3IFZl
Y3RvcjMoIC0gMSwgMCwgMCApICk7CisgICAgICAgIHRoaXMuYWRkKCBjYW1lcmFOWCApOworCisg
ICAgICAgIHZhciBjYW1lcmFQWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3Qs
IG5lYXIsIGZhciApOworICAgICAgICBjYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTsKKyAgICAg
ICAgY2FtZXJhUFkubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMSwgMCApICk7CisgICAgICAgIHRo
aXMuYWRkKCBjYW1lcmFQWSApOworCisgICAgICAgIHZhciBjYW1lcmFOWSA9IG5ldyBQZXJzcGVj
dGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApOworICAgICAgICBjYW1lcmFOWS51
cC5zZXQoIDAsIDAsIC0gMSApOworICAgICAgICBjYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0b3Iz
KCAwLCAtIDEsIDAgKSApOworICAgICAgICB0aGlzLmFkZCggY2FtZXJhTlkgKTsKKworICAgICAg
ICB2YXIgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFy
LCBmYXIgKTsKKyAgICAgICAgY2FtZXJhUFoudXAuc2V0KCAwLCAtIDEsIDAgKTsKKyAgICAgICAg
Y2FtZXJhUFoubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMCwgMSApICk7CisgICAgICAgIHRoaXMu
YWRkKCBjYW1lcmFQWiApOworCisgICAgICAgIHZhciBjYW1lcmFOWiA9IG5ldyBQZXJzcGVjdGl2
ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApOworICAgICAgICBjYW1lcmFOWi51cC5z
ZXQoIDAsIC0gMSwgMCApOworICAgICAgICBjYW1lcmFOWi5sb29rQXQoIG5ldyBWZWN0b3IzKCAw
LCAwLCAtIDEgKSApOworICAgICAgICB0aGlzLmFkZCggY2FtZXJhTlogKTsKKworICAgICAgICB2
YXIgb3B0aW9ucyA9IHsgZm9ybWF0OiBSR0JGb3JtYXQsIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVy
LCBtaW5GaWx0ZXI6IExpbmVhckZpbHRlciB9OworCisgICAgICAgIHRoaXMucmVuZGVyVGFyZ2V0
ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggY3ViZVJlc29sdXRpb24sIGN1YmVSZXNvbHV0
aW9uLCBvcHRpb25zICk7CisgICAgICAgIHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9
ICJDdWJlQ2FtZXJhIjsKKworICAgICAgICB0aGlzLnVwZGF0ZUN1YmVNYXAgPSBmdW5jdGlvbiAo
IHJlbmRlcmVyLCBzY2VuZSApIHsKKworICAgICAgICAgICAgaWYgKCB0aGlzLnBhcmVudCA9PT0g
bnVsbCApIHRoaXMudXBkYXRlTWF0cml4V29ybGQoKTsKKworICAgICAgICAgICAgdmFyIHJlbmRl
clRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0OworICAgICAgICAgICAgdmFyIGdlbmVyYXRlTWlw
bWFwcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwczsKKworICAgICAgICAg
ICAgcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CisKKyAgICAg
ICAgICAgIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDA7CisgICAgICAgICAgICByZW5k
ZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWCwgcmVuZGVyVGFyZ2V0ICk7CisKKyAgICAgICAg
ICAgIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDE7CisgICAgICAgICAgICByZW5kZXJl
ci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWCwgcmVuZGVyVGFyZ2V0ICk7CisKKyAgICAgICAgICAg
IHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDI7CisgICAgICAgICAgICByZW5kZXJlci5y
ZW5kZXIoIHNjZW5lLCBjYW1lcmFQWSwgcmVuZGVyVGFyZ2V0ICk7CisKKyAgICAgICAgICAgIHJl
bmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDM7CisgICAgICAgICAgICByZW5kZXJlci5yZW5k
ZXIoIHNjZW5lLCBjYW1lcmFOWSwgcmVuZGVyVGFyZ2V0ICk7CisKKyAgICAgICAgICAgIHJlbmRl
clRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDQ7CisgICAgICAgICAgICByZW5kZXJlci5yZW5kZXIo
IHNjZW5lLCBjYW1lcmFQWiwgcmVuZGVyVGFyZ2V0ICk7CisKKyAgICAgICAgICAgIHJlbmRlclRh
cmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGdlbmVyYXRlTWlwbWFwczsKKworICAgICAg
ICAgICAgcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gNTsKKyAgICAgICAgICAgIHJlbmRl
cmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aLCByZW5kZXJUYXJnZXQgKTsKKworICAgICAgICAg
ICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBudWxsICk7CisKKyAgICAgICAgfTsKKworICAg
IH0KKworICAgIEN1YmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0Qu
cHJvdG90eXBlICk7CisgICAgQ3ViZUNhbWVyYS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJl
Q2FtZXJhOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29i
LmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIEF1ZGlvTGlzdGVuZXIoKSB7CisKKyAgICAg
ICAgT2JqZWN0M0QuY2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMudHlwZSA9ICdBdWRpb0xp
c3RlbmVyJzsKKworICAgICAgICB0aGlzLmNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4
dCgpOworCisgICAgICAgIHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7Cisg
ICAgICAgIHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTsKKwor
ICAgICAgICB0aGlzLmZpbHRlciA9IG51bGw7CisKKyAgICB9CisKKyAgICBBdWRpb0xpc3RlbmVy
LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3Rv
dHlwZSApLCB7CisKKyAgICAgICAgY29uc3RydWN0b3I6IEF1ZGlvTGlzdGVuZXIsCisKKyAgICAg
ICAgZ2V0SW5wdXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2Fp
bjsKKworICAgICAgICB9LAorCisgICAgICAgIHJlbW92ZUZpbHRlcjogZnVuY3Rpb24gKCApIHsK
KworICAgICAgICAgICAgaWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHsKKworICAgICAgICAg
ICAgICAgIHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApOworICAgICAgICAgICAg
ICAgIHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApOwor
ICAgICAgICAgICAgICAgIHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRp
b24gKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZpbHRlciA9IG51bGw7CisKKyAgICAgICAgICAg
IH0KKworICAgICAgICB9LAorCisgICAgICAgIGdldEZpbHRlcjogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXI7CisKKyAgICAgICAgfSwKKworICAgICAgICBz
ZXRGaWx0ZXI6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5m
aWx0ZXIgIT09IG51bGwgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLmdhaW4uZGlzY29ubmVj
dCggdGhpcy5maWx0ZXIgKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZpbHRlci5kaXNjb25uZWN0
KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKwor
ICAgICAgICAgICAgICAgIHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGlu
YXRpb24gKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmZpbHRlciA9IHZh
bHVlOworICAgICAgICAgICAgdGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuZmlsdGVyICk7CisgICAg
ICAgICAgICB0aGlzLmZpbHRlci5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTsK
KworICAgICAgICB9LAorCisgICAgICAgIGdldE1hc3RlclZvbHVtZTogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICByZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7CisKKyAgICAgICAgfSwK
KworICAgICAgICBzZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAg
ICAgICAgIHRoaXMuZ2Fpbi5nYWluLnZhbHVlID0gdmFsdWU7CisKKyAgICAgICAgfSwKKworICAg
ICAgICB1cGRhdGVNYXRyaXhXb3JsZDogKCBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHZh
ciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgICAgICB2YXIgcXVhdGVybmlvbiA9
IG5ldyBRdWF0ZXJuaW9uKCk7CisgICAgICAgICAgICB2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMygp
OworCisgICAgICAgICAgICB2YXIgb3JpZW50YXRpb24gPSBuZXcgVmVjdG9yMygpOworCisgICAg
ICAgICAgICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkgeworCisg
ICAgICAgICAgICAgICAgT2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwo
IHRoaXMsIGZvcmNlICk7CisKKyAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSB0aGlzLmNv
bnRleHQubGlzdGVuZXI7CisgICAgICAgICAgICAgICAgdmFyIHVwID0gdGhpcy51cDsKKworICAg
ICAgICAgICAgICAgIHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVy
bmlvbiwgc2NhbGUgKTsKKworICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLnNldCggMCwgMCwg
LSAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7CisKKyAgICAgICAgICAgICAgICBp
ZiAoIGxpc3RlbmVyLnBvc2l0aW9uWCApIHsKKworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5l
ci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLngsIHRoaXMuY29udGV4dC5jdXJy
ZW50VGltZSApOworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5wb3NpdGlvblkuc2V0VmFs
dWVBdFRpbWUoIHBvc2l0aW9uLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOworICAgICAg
ICAgICAgICAgICAgICBsaXN0ZW5lci5wb3NpdGlvblouc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9u
LnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOworICAgICAgICAgICAgICAgICAgICBsaXN0
ZW5lci5mb3J3YXJkWC5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueCwgdGhpcy5jb250ZXh0
LmN1cnJlbnRUaW1lICk7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmZvcndhcmRZLnNl
dFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTsK
KyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuZm9yd2FyZFouc2V0VmFsdWVBdFRpbWUoIG9y
aWVudGF0aW9uLnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOworICAgICAgICAgICAgICAg
ICAgICBsaXN0ZW5lci51cFguc2V0VmFsdWVBdFRpbWUoIHVwLngsIHRoaXMuY29udGV4dC5jdXJy
ZW50VGltZSApOworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci51cFkuc2V0VmFsdWVBdFRp
bWUoIHVwLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOworICAgICAgICAgICAgICAgICAg
ICBsaXN0ZW5lci51cFouc2V0VmFsdWVBdFRpbWUoIHVwLnosIHRoaXMuY29udGV4dC5jdXJyZW50
VGltZSApOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAg
ICBsaXN0ZW5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24u
eiApOworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXRPcmllbnRhdGlvbiggb3JpZW50
YXRpb24ueCwgb3JpZW50YXRpb24ueSwgb3JpZW50YXRpb24ueiwgdXAueCwgdXAueSwgdXAueiAp
OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9OworCisgICAgICAgIH0gKSgp
CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9t
cmRvb2IuY29tLworICAgICAqIEBhdXRob3IgUmVlY2UgQWFyb24gTGVjcml2YWluIC8gaHR0cDov
L3JlZWNlbm90ZXMuY29tLworICAgICAqLworCisgICAgZnVuY3Rpb24gQXVkaW8oIGxpc3RlbmVy
ICkgeworCisgICAgICAgIE9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0aGlzLnR5
cGUgPSAnQXVkaW8nOworCisgICAgICAgIHRoaXMuY29udGV4dCA9IGxpc3RlbmVyLmNvbnRleHQ7
CisKKyAgICAgICAgdGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTsKKyAgICAg
ICAgdGhpcy5nYWluLmNvbm5lY3QoIGxpc3RlbmVyLmdldElucHV0KCkgKTsKKworICAgICAgICB0
aGlzLmF1dG9wbGF5ID0gZmFsc2U7CisKKyAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsOworICAg
ICAgICB0aGlzLmxvb3AgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5zdGFydFRpbWUgPSAwOworICAg
ICAgICB0aGlzLnBsYXliYWNrUmF0ZSA9IDE7CisgICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFs
c2U7CisgICAgICAgIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gdHJ1ZTsKKyAgICAgICAgdGhp
cy5zb3VyY2VUeXBlID0gJ2VtcHR5JzsKKworICAgICAgICB0aGlzLmZpbHRlcnMgPSBbXTsKKwor
ICAgIH0KKworICAgIEF1ZGlvLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVh
dGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CisKKyAgICAgICAgY29uc3RydWN0b3I6IEF1ZGlv
LAorCisgICAgICAgIGdldE91dHB1dDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICByZXR1
cm4gdGhpcy5nYWluOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0Tm9kZVNvdXJjZTogZnVu
Y3Rpb24gKCBhdWRpb05vZGUgKSB7CisKKyAgICAgICAgICAgIHRoaXMuaGFzUGxheWJhY2tDb250
cm9sID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLnNvdXJjZVR5cGUgPSAnYXVkaW9Ob2RlJzsK
KyAgICAgICAgICAgIHRoaXMuc291cmNlID0gYXVkaW9Ob2RlOworICAgICAgICAgICAgdGhpcy5j
b25uZWN0KCk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgc2V0QnVmZmVyOiBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkgeworCisgICAgICAgICAg
ICB0aGlzLmJ1ZmZlciA9IGF1ZGlvQnVmZmVyOworICAgICAgICAgICAgdGhpcy5zb3VyY2VUeXBl
ID0gJ2J1ZmZlcic7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5hdXRvcGxheSApIHRoaXMucGxh
eSgpOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAg
IHBsYXk6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmlzUGxheWluZyA9
PT0gdHJ1ZSApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlv
OiBBdWRpbyBpcyBhbHJlYWR5IHBsYXlpbmcuJyApOworICAgICAgICAgICAgICAgIHJldHVybjsK
KworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250
cm9sID09PSBmYWxzZSApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVF
LkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHNvdXJj
ZSA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTsKKworICAgICAgICAgICAgc291
cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyOworICAgICAgICAgICAgc291cmNlLmxvb3AgPSB0aGlz
Lmxvb3A7CisgICAgICAgICAgICBzb3VyY2Uub25lbmRlZCA9IHRoaXMub25FbmRlZC5iaW5kKCB0
aGlzICk7CisgICAgICAgICAgICBzb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKCB0
aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5zdGFydFRpbWUgKTsKKyAgICAgICAgICAgIHNvdXJjZS5z
dGFydCggMCwgdGhpcy5zdGFydFRpbWUgKTsKKworICAgICAgICAgICAgdGhpcy5pc1BsYXlpbmcg
PSB0cnVlOworCisgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuY29ubmVjdCgpOworCisgICAgICAgIH0sCisKKyAgICAgICAgcGF1c2U6
IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJv
bCA9PT0gZmFsc2UgKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5B
dWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7CisgICAgICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuc291cmNl
LnN0b3AoKTsKKyAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJl
bnRUaW1lOworICAgICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBzdG9wOiBmdW5jdGlvbiAo
KSB7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNl
ICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMg
QXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApOworICAgICAgICAgICAgICAgIHJldHVy
bjsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnNvdXJjZS5zdG9wKCk7Cisg
ICAgICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IDA7CisgICAgICAgICAgICB0aGlzLmlzUGxheWlu
ZyA9IGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisg
ICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmZp
bHRlcnMubGVuZ3RoID4gMCApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuc291cmNlLmNvbm5l
Y3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9
IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAg
ICAgICAgICAgICB0aGlzLmZpbHRlcnNbIGkgLSAxIF0uY29ubmVjdCggdGhpcy5maWx0ZXJzWyBp
IF0gKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVy
c1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5jb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7
CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZS5j
b25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBkaXNjb25uZWN0OiBmdW5j
dGlvbiAoKSB7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7
CisKKyAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNb
IDAgXSApOworCisgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0
ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5m
aWx0ZXJzWyBpIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7CisKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNbIHRoaXMuZmlsdGVy
cy5sZW5ndGggLSAxIF0uZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApOworCisgICAgICAg
ICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCgg
dGhpcy5nZXRPdXRwdXQoKSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVy
biB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0RmlsdGVyczogZnVuY3Rpb24gKCkg
eworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgc2V0RmlsdGVyczogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgaWYg
KCAhIHZhbHVlICkgdmFsdWUgPSBbXTsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmlzUGxheWlu
ZyA9PT0gdHJ1ZSApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdCgpOworICAg
ICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IHZhbHVlOworICAgICAgICAgICAgICAgIHRoaXMu
Y29ubmVjdCgpOworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgdGhp
cy5maWx0ZXJzID0gdmFsdWU7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJu
IHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHsK
KworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWyAwIF07CisKKyAgICAgICAg
fSwKKworICAgICAgICBzZXRGaWx0ZXI6IGZ1bmN0aW9uICggZmlsdGVyICkgeworCisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5zZXRGaWx0ZXJzKCBmaWx0ZXIgPyBbIGZpbHRlciBdIDogW10gKTsK
KworICAgICAgICB9LAorCisgICAgICAgIHNldFBsYXliYWNrUmF0ZTogZnVuY3Rpb24gKCB2YWx1
ZSApIHsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFs
c2UgKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhp
cyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7CisgICAgICAgICAgICAgICAgcmV0
dXJuOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMucGxheWJhY2tSYXRlID0g
dmFsdWU7CisKKyAgICAgICAgICAgIGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7CisK
KyAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUo
IHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTsKKworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAg
ICAgIGdldFBsYXliYWNrUmF0ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICByZXR1cm4g
dGhpcy5wbGF5YmFja1JhdGU7CisKKyAgICAgICAgfSwKKworICAgICAgICBvbkVuZGVkOiBmdW5j
dGlvbiAoKSB7CisKKyAgICAgICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7CisKKyAgICAg
ICAgfSwKKworICAgICAgICBnZXRMb29wOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGlm
ICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkgeworCisgICAgICAgICAgICAg
ICAgY29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNr
IGNvbnRyb2wuJyApOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpcy5sb29wOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgc2V0TG9vcDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgaWYgKCB0
aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7CisKKyAgICAgICAgICAgICAgICBj
b25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29u
dHJvbC4nICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIHRoaXMubG9vcCA9IHZhbHVlOworCisgICAgICAgICAgICBpZiAoIHRoaXMuaXNQ
bGF5aW5nID09PSB0cnVlICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UubG9vcCA9
IHRoaXMubG9vcDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsK
KworICAgICAgICB9LAorCisgICAgICAgIGdldFZvbHVtZTogZnVuY3Rpb24gKCkgeworCisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7CisKKyAgICAgICAgfSwKKworICAg
ICAgICBzZXRWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAgIHRoaXMu
Z2Fpbi5nYWluLnZhbHVlID0gdmFsdWU7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisg
ICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8g
aHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBQb3NpdGlvbmFsQXVk
aW8oIGxpc3RlbmVyICkgeworCisgICAgICAgIEF1ZGlvLmNhbGwoIHRoaXMsIGxpc3RlbmVyICk7
CisKKyAgICAgICAgdGhpcy5wYW5uZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCk7Cisg
ICAgICAgIHRoaXMucGFubmVyLmNvbm5lY3QoIHRoaXMuZ2FpbiApOworCisgICAgfQorCisgICAg
UG9zaXRpb25hbEF1ZGlvLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUo
IEF1ZGlvLnByb3RvdHlwZSApLCB7CisKKyAgICAgICAgY29uc3RydWN0b3I6IFBvc2l0aW9uYWxB
dWRpbywKKworICAgICAgICBnZXRPdXRwdXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAg
cmV0dXJuIHRoaXMucGFubmVyOworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0UmVmRGlzdGFu
Y2U6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFubmVyLnJlZkRp
c3RhbmNlOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9u
ICggdmFsdWUgKSB7CisKKyAgICAgICAgICAgIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlID0gdmFs
dWU7CisKKyAgICAgICAgfSwKKworICAgICAgICBnZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAo
KSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yOworCisg
ICAgICAgIH0sCisKKyAgICAgICAgc2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rpb24gKCB2YWx1ZSAp
IHsKKworICAgICAgICAgICAgdGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHZhbHVlOworCisg
ICAgICAgIH0sCisKKyAgICAgICAgZ2V0RGlzdGFuY2VNb2RlbDogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICByZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbDsKKworICAgICAgICB9
LAorCisgICAgICAgIHNldERpc3RhbmNlTW9kZWw6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAg
ICAgICAgICAgIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWwgPSB2YWx1ZTsKKworICAgICAgICB9
LAorCisgICAgICAgIGdldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZTsKKworICAgICAgICB9LAorCisgICAgICAg
IHNldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAgICB0aGlz
LnBhbm5lci5tYXhEaXN0YW5jZSA9IHZhbHVlOworCisgICAgICAgIH0sCisKKyAgICAgICAgdXBk
YXRlTWF0cml4V29ybGQ6ICggZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgcG9zaXRp
b24gPSBuZXcgVmVjdG9yMygpOworCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gdXBkYXRl
TWF0cml4V29ybGQoIGZvcmNlICkgeworCisgICAgICAgICAgICAgICAgT2JqZWN0M0QucHJvdG90
eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CisKKyAgICAgICAgICAg
ICAgICBwb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTsK
KworICAgICAgICAgICAgICAgIHRoaXMucGFubmVyLnNldFBvc2l0aW9uKCBwb3NpdGlvbi54LCBw
b3NpdGlvbi55LCBwb3NpdGlvbi56ICk7CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSAp
KCkKKworCisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRw
Oi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIEF1ZGlvQW5hbHlzZXIoIGF1
ZGlvLCBmZnRTaXplICkgeworCisgICAgICAgIHRoaXMuYW5hbHlzZXIgPSBhdWRpby5jb250ZXh0
LmNyZWF0ZUFuYWx5c2VyKCk7CisgICAgICAgIHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZSA9IGZmdFNp
emUgIT09IHVuZGVmaW5lZCA/IGZmdFNpemUgOiAyMDQ4OworCisgICAgICAgIHRoaXMuZGF0YSA9
IG5ldyBVaW50OEFycmF5KCB0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50ICk7CisKKyAg
ICAgICAgYXVkaW8uZ2V0T3V0cHV0KCkuY29ubmVjdCggdGhpcy5hbmFseXNlciApOworCisgICAg
fQorCisgICAgT2JqZWN0LmFzc2lnbiggQXVkaW9BbmFseXNlci5wcm90b3R5cGUsIHsKKworICAg
ICAgICBnZXRGcmVxdWVuY3lEYXRhOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIHRoaXMu
YW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEoIHRoaXMuZGF0YSApOworCisgICAgICAgICAg
ICByZXR1cm4gdGhpcy5kYXRhOworCisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0QXZlcmFnZUZy
ZXF1ZW5jeTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdmFsdWUgPSAwLCBkYXRh
ID0gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0g
MDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgdmFsdWUgKz0g
ZGF0YVsgaSBdOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSAv
IGRhdGEubGVuZ3RoOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAq
CisgICAgICogQnVmZmVyZWQgc2NlbmUgZ3JhcGggcHJvcGVydHkgdGhhdCBhbGxvd3Mgd2VpZ2h0
ZWQgYWNjdW11bGF0aW9uLgorICAgICAqCisgICAgICoKKyAgICAgKiBAYXV0aG9yIEJlbiBIb3Vz
dG9uIC8gaHR0cDovL2NsYXJhLmlvLworICAgICAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRw
Oi8vbGlnaHRoYXVzLnVzLworICAgICAqIEBhdXRob3IgdHNjaHcKKyAgICAgKi8KKworICAgIGZ1
bmN0aW9uIFByb3BlcnR5TWl4ZXIoIGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUgKSB7CisK
KyAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKKyAgICAgICAgdGhpcy52YWx1ZVNpemUg
PSB2YWx1ZVNpemU7CisKKyAgICAgICAgdmFyIGJ1ZmZlclR5cGUgPSBGbG9hdDY0QXJyYXksCisg
ICAgICAgICAgICBtaXhGdW5jdGlvbjsKKworICAgICAgICBzd2l0Y2ggKCB0eXBlTmFtZSApIHsK
KworICAgICAgICAgICAgY2FzZSAncXVhdGVybmlvbic6CisgICAgICAgICAgICAgICAgbWl4RnVu
Y3Rpb24gPSB0aGlzLl9zbGVycDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAg
ICAgY2FzZSAnc3RyaW5nJzoKKyAgICAgICAgICAgIGNhc2UgJ2Jvb2wnOgorICAgICAgICAgICAg
ICAgIGJ1ZmZlclR5cGUgPSBBcnJheTsKKyAgICAgICAgICAgICAgICBtaXhGdW5jdGlvbiA9IHRo
aXMuX3NlbGVjdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVs
dDoKKyAgICAgICAgICAgICAgICBtaXhGdW5jdGlvbiA9IHRoaXMuX2xlcnA7CisKKyAgICAgICAg
fQorCisgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IGJ1ZmZlclR5cGUoIHZhbHVlU2l6ZSAqIDQg
KTsKKyAgICAgICAgLy8gbGF5b3V0OiBbIGluY29taW5nIHwgYWNjdTAgfCBhY2N1MSB8IG9yaWcg
XQorICAgICAgICAvLworICAgICAgICAvLyBpbnRlcnBvbGF0b3JzIGNhbiB1c2UgLmJ1ZmZlciBh
cyB0aGVpciAucmVzdWx0CisgICAgICAgIC8vIHRoZSBkYXRhIHRoZW4gZ29lcyB0byAnaW5jb21p
bmcnCisgICAgICAgIC8vCisgICAgICAgIC8vICdhY2N1MCcgYW5kICdhY2N1MScgYXJlIHVzZWQg
ZnJhbWUtaW50ZXJsZWF2ZWQgZm9yCisgICAgICAgIC8vIHRoZSBjdW11bGF0aXZlIHJlc3VsdCBh
bmQgYXJlIGNvbXBhcmVkIHRvIGRldGVjdAorICAgICAgICAvLyBjaGFuZ2VzCisgICAgICAgIC8v
CisgICAgICAgIC8vICdvcmlnJyBzdG9yZXMgdGhlIG9yaWdpbmFsIHN0YXRlIG9mIHRoZSBwcm9w
ZXJ0eQorCisgICAgICAgIHRoaXMuX21peEJ1ZmZlclJlZ2lvbiA9IG1peEZ1bmN0aW9uOworCisg
ICAgICAgIHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7CisKKyAgICAgICAgdGhpcy51c2VDb3Vu
dCA9IDA7CisgICAgICAgIHRoaXMucmVmZXJlbmNlQ291bnQgPSAwOworCisgICAgfQorCisgICAg
T2JqZWN0LmFzc2lnbiggUHJvcGVydHlNaXhlci5wcm90b3R5cGUsIHsKKworICAgICAgICAvLyBh
Y2N1bXVsYXRlIGRhdGEgaW4gdGhlICdpbmNvbWluZycgcmVnaW9uIGludG8gJ2FjY3U8aT4nCisg
ICAgICAgIGFjY3VtdWxhdGU6IGZ1bmN0aW9uICggYWNjdUluZGV4LCB3ZWlnaHQgKSB7CisKKyAg
ICAgICAgICAgIC8vIG5vdGU6IGhhcHBpbHkgYWNjdW11bGF0aW5nIG5vdGhpbmcgd2hlbiB3ZWln
aHQgPSAwLCB0aGUgY2FsbGVyIGtub3dzCisgICAgICAgICAgICAvLyB0aGUgd2VpZ2h0IGFuZCBz
aG91bGRuJ3QgaGF2ZSBtYWRlIHRoZSBjYWxsIGluIHRoZSBmaXJzdCBwbGFjZQorCisgICAgICAg
ICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsCisgICAgICAgICAgICAgICAgc3RyaWRlID0g
dGhpcy52YWx1ZVNpemUsCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gYWNjdUluZGV4ICogc3Ry
aWRlICsgc3RyaWRlLAorCisgICAgICAgICAgICAgICAgY3VycmVudFdlaWdodCA9IHRoaXMuY3Vt
dWxhdGl2ZVdlaWdodDsKKworICAgICAgICAgICAgaWYgKCBjdXJyZW50V2VpZ2h0ID09PSAwICkg
eworCisgICAgICAgICAgICAgICAgLy8gYWNjdU4gOj0gaW5jb21pbmcgKiB3ZWlnaHQKKworICAg
ICAgICAgICAgICAgIGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkgeworCisg
ICAgICAgICAgICAgICAgICAgIGJ1ZmZlclsgb2Zmc2V0ICsgaSBdID0gYnVmZmVyWyBpIF07CisK
KyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjdXJyZW50V2VpZ2h0ID0gd2Vp
Z2h0OworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgLy8gYWNjdU4g
Oj0gYWNjdU4gKyBpbmNvbWluZyAqIHdlaWdodAorCisgICAgICAgICAgICAgICAgY3VycmVudFdl
aWdodCArPSB3ZWlnaHQ7CisgICAgICAgICAgICAgICAgdmFyIG1peCA9IHdlaWdodCAvIGN1cnJl
bnRXZWlnaHQ7CisgICAgICAgICAgICAgICAgdGhpcy5fbWl4QnVmZmVyUmVnaW9uKCBidWZmZXIs
IG9mZnNldCwgMCwgbWl4LCBzdHJpZGUgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICB0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSBjdXJyZW50V2VpZ2h0OworCisgICAgICAgIH0sCisK
KyAgICAgICAgLy8gYXBwbHkgdGhlIHN0YXRlIG9mICdhY2N1PGk+JyB0byB0aGUgYmluZGluZyB3
aGVuIGFjY3VzIGRpZmZlcgorICAgICAgICBhcHBseTogZnVuY3Rpb24gKCBhY2N1SW5kZXggKSB7
CisKKyAgICAgICAgICAgIHZhciBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKKyAgICAgICAgICAg
ICAgICBidWZmZXIgPSB0aGlzLmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBhY2N1
SW5kZXggKiBzdHJpZGUgKyBzdHJpZGUsCisKKyAgICAgICAgICAgICAgICB3ZWlnaHQgPSB0aGlz
LmN1bXVsYXRpdmVXZWlnaHQsCisKKyAgICAgICAgICAgICAgICBiaW5kaW5nID0gdGhpcy5iaW5k
aW5nOworCisgICAgICAgICAgICB0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwOworCisgICAgICAg
ICAgICBpZiAoIHdlaWdodCA8IDEgKSB7CisKKyAgICAgICAgICAgICAgICAvLyBhY2N1TiA6PSBh
Y2N1TiArIG9yaWdpbmFsICogKCAxIC0gY3VtdWxhdGl2ZVdlaWdodCApCisKKyAgICAgICAgICAg
ICAgICB2YXIgb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7CisKKyAgICAgICAgICAg
ICAgICB0aGlzLl9taXhCdWZmZXJSZWdpb24oCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwg
b2Zmc2V0LCBvcmlnaW5hbFZhbHVlT2Zmc2V0LCAxIC0gd2VpZ2h0LCBzdHJpZGUgKTsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IHN0cmlk
ZSArIHN0cmlkZTsgaSAhPT0gZTsgKysgaSApIHsKKworICAgICAgICAgICAgICAgIGlmICggYnVm
ZmVyWyBpIF0gIT09IGJ1ZmZlclsgaSArIHN0cmlkZSBdICkgeworCisgICAgICAgICAgICAgICAg
ICAgIC8vIHZhbHVlIGhhcyBjaGFuZ2VkIC0+IHVwZGF0ZSBzY2VuZSBncmFwaAorCisgICAgICAg
ICAgICAgICAgICAgIGJpbmRpbmcuc2V0VmFsdWUoIGJ1ZmZlciwgb2Zmc2V0ICk7CisgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9
CisKKyAgICAgICAgfSwKKworICAgICAgICAvLyByZW1lbWJlciB0aGUgc3RhdGUgb2YgdGhlIGJv
dW5kIHByb3BlcnR5IGFuZCBjb3B5IGl0IHRvIGJvdGggYWNjdXMKKyAgICAgICAgc2F2ZU9yaWdp
bmFsU3RhdGU6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIGJpbmRpbmcgPSB0aGlz
LmJpbmRpbmc7CisKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlciwKKyAgICAg
ICAgICAgICAgICBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKKworICAgICAgICAgICAgICAgIG9y
aWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiAzOworCisgICAgICAgICAgICBiaW5kaW5nLmdl
dFZhbHVlKCBidWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTsKKworICAgICAgICAgICAgLy8g
YWNjdVswLi4xXSA6PSBvcmlnIC0tIGluaXRpYWxseSBkZXRlY3QgY2hhbmdlcyBhZ2FpbnN0IHRo
ZSBvcmlnaW5hbAorICAgICAgICAgICAgZm9yICggdmFyIGkgPSBzdHJpZGUsIGUgPSBvcmlnaW5h
bFZhbHVlT2Zmc2V0OyBpICE9PSBlOyArKyBpICkgeworCisgICAgICAgICAgICAgICAgYnVmZmVy
WyBpIF0gPSBidWZmZXJbIG9yaWdpbmFsVmFsdWVPZmZzZXQgKyAoIGkgJSBzdHJpZGUgKSBdOwor
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7
CisKKyAgICAgICAgfSwKKworICAgICAgICAvLyBhcHBseSB0aGUgc3RhdGUgcHJldmlvdXNseSB0
YWtlbiB2aWEgJ3NhdmVPcmlnaW5hbFN0YXRlJyB0byB0aGUgYmluZGluZworICAgICAgICByZXN0
b3JlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgb3JpZ2lu
YWxWYWx1ZU9mZnNldCA9IHRoaXMudmFsdWVTaXplICogMzsKKyAgICAgICAgICAgIHRoaXMuYmlu
ZGluZy5zZXRWYWx1ZSggdGhpcy5idWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTsKKworICAg
ICAgICB9LAorCisKKyAgICAgICAgLy8gbWl4IGZ1bmN0aW9ucworCisgICAgICAgIF9zZWxlY3Q6
IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkgewor
CisgICAgICAgICAgICBpZiAoIHQgPj0gMC41ICkgeworCisgICAgICAgICAgICAgICAgZm9yICgg
dmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
YnVmZmVyWyBkc3RPZmZzZXQgKyBpIF0gPSBidWZmZXJbIHNyY09mZnNldCArIGkgXTsKKworICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAg
X3NsZXJwOiBmdW5jdGlvbiAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQgKSB7CisK
KyAgICAgICAgICAgIFF1YXRlcm5pb24uc2xlcnBGbGF0KCBidWZmZXIsIGRzdE9mZnNldCwgYnVm
ZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgc3JjT2Zmc2V0LCB0ICk7CisKKyAgICAgICAgfSwKKwor
ICAgICAgICBfbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0
LCBzdHJpZGUgKSB7CisKKyAgICAgICAgICAgIHZhciBzID0gMSAtIHQ7CisKKyAgICAgICAgICAg
IGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkgeworCisgICAgICAgICAgICAg
ICAgdmFyIGogPSBkc3RPZmZzZXQgKyBpOworCisgICAgICAgICAgICAgICAgYnVmZmVyWyBqIF0g
PSBidWZmZXJbIGogXSAqIHMgKyBidWZmZXJbIHNyY09mZnNldCArIGkgXSAqIHQ7CisKKyAgICAg
ICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKgorICAg
ICAqIEEgcmVmZXJlbmNlIHRvIGEgcmVhbCBwcm9wZXJ0eSBpbiB0aGUgc2NlbmUgZ3JhcGguCisg
ICAgICoKKyAgICAgKgorICAgICAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEu
aW8vCisgICAgICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCisg
ICAgICogQGF1dGhvciB0c2NodworICAgICAqLworCisgICAgZnVuY3Rpb24gQ29tcG9zaXRlKCB0
YXJnZXRHcm91cCwgcGF0aCwgb3B0aW9uYWxQYXJzZWRQYXRoICkgeworCisgICAgICAgIHZhciBw
YXJzZWRQYXRoID0gb3B0aW9uYWxQYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRy
YWNrTmFtZSggcGF0aCApOworCisgICAgICAgIHRoaXMuX3RhcmdldEdyb3VwID0gdGFyZ2V0R3Jv
dXA7CisgICAgICAgIHRoaXMuX2JpbmRpbmdzID0gdGFyZ2V0R3JvdXAuc3Vic2NyaWJlXyggcGF0
aCwgcGFyc2VkUGF0aCApOworCisgICAgfQorCisgICAgT2JqZWN0LmFzc2lnbiggQ29tcG9zaXRl
LnByb3RvdHlwZSwgeworCisgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoIGFycmF5LCBvZmZz
ZXQgKSB7CisKKyAgICAgICAgICAgIHRoaXMuYmluZCgpOyAvLyBiaW5kIGFsbCBiaW5kaW5nCisK
KyAgICAgICAgICAgIHZhciBmaXJzdFZhbGlkSW5kZXggPSB0aGlzLl90YXJnZXRHcm91cC5uQ2Fj
aGVkT2JqZWN0c18sCisgICAgICAgICAgICAgICAgYmluZGluZyA9IHRoaXMuX2JpbmRpbmdzWyBm
aXJzdFZhbGlkSW5kZXggXTsKKworICAgICAgICAgICAgLy8gYW5kIG9ubHkgY2FsbCAuZ2V0VmFs
dWUgb24gdGhlIGZpcnN0CisgICAgICAgICAgICBpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCAp
IGJpbmRpbmcuZ2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTsKKworICAgICAgICB9LAorCisgICAg
ICAgIHNldFZhbHVlOiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAg
IHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzOworCisgICAgICAgICAgICBmb3IgKCB2YXIg
aSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywKKyAgICAgICAgICAgICAgICAg
ICAgICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisgICAgICAgICAg
ICAgICAgYmluZGluZ3NbIGkgXS5zZXRWYWx1ZSggYXJyYXksIG9mZnNldCApOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgfSwKKworICAgICAgICBiaW5kOiBmdW5jdGlvbiAoKSB7CisKKyAg
ICAgICAgICAgIHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzOworCisgICAgICAgICAgICBm
b3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywKKyAgICAgICAg
ICAgICAgICAgICAgICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisg
ICAgICAgICAgICAgICAgYmluZGluZ3NbIGkgXS5iaW5kKCk7CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICB9LAorCisgICAgICAgIHVuYmluZDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAg
ICB2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5nczsKKworICAgICAgICAgICAgZm9yICggdmFy
IGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sCisgICAgICAgICAgICAgICAg
ICAgICAgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworICAgICAgICAg
ICAgICAgIGJpbmRpbmdzWyBpIF0udW5iaW5kKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICB9CisKKyAgICB9ICk7CisKKworICAgIGZ1bmN0aW9uIFByb3BlcnR5QmluZGluZyggcm9vdE5v
ZGUsIHBhdGgsIHBhcnNlZFBhdGggKSB7CisKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAg
ICAgICAgdGhpcy5wYXJzZWRQYXRoID0gcGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFy
c2VUcmFja05hbWUoIHBhdGggKTsKKworICAgICAgICB0aGlzLm5vZGUgPSBQcm9wZXJ0eUJpbmRp
bmcuZmluZE5vZGUoIHJvb3ROb2RlLCB0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCByb290
Tm9kZTsKKworICAgICAgICB0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7CisKKyAgICB9CisKKyAg
ICBPYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcsIHsKKworICAgICAgICBDb21wb3NpdGU6
IENvbXBvc2l0ZSwKKworICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uICggcm9vdCwgcGF0aCwgcGFy
c2VkUGF0aCApIHsKKworICAgICAgICAgICAgaWYgKCAhICggcm9vdCAmJiByb290LmlzQW5pbWF0
aW9uT2JqZWN0R3JvdXAgKSApIHsKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVy
dHlCaW5kaW5nKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7CisKKyAgICAgICAgICAgIH0gZWxz
ZSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZy5Db21wb3Np
dGUoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTsKKworICAgICAgICAgICAgfQorCisgICAgICAg
IH0sCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcGxhY2VzIHNwYWNlcyB3aXRoIHVuZGVy
c2NvcmVzIGFuZCByZW1vdmVzIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMgZnJvbQorICAgICAgICAg
KiBub2RlIG5hbWVzLCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIHBhcnNlVHJhY2tOYW1l
KCkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSBOb2RlIG5h
bWUgdG8gYmUgc2FuaXRpemVkLgorICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CisgICAgICAg
ICAqLworICAgICAgICBzYW5pdGl6ZU5vZGVOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7CisKKyAg
ICAgICAgICAgIHJldHVybiBuYW1lLnJlcGxhY2UoIC9ccy9nLCAnXycgKS5yZXBsYWNlKCAvW15c
dy1dL2csICcnICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBwYXJzZVRyYWNrTmFtZTogZnVu
Y3Rpb24gKCkgeworCisgICAgICAgICAgICAvLyBQYXJlbnQgZGlyZWN0b3JpZXMsIGRlbGltaXRl
ZCBieSAnLycgb3IgJzonLiBDdXJyZW50bHkgdW51c2VkLCBidXQgbXVzdAorICAgICAgICAgICAg
Ly8gYmUgbWF0Y2hlZCB0byBwYXJzZSB0aGUgcmVzdCBvZiB0aGUgdHJhY2sgbmFtZS4KKyAgICAg
ICAgICAgIHZhciBkaXJlY3RvcnlSZSA9IC8oKD86W1x3LV0rW1wvOl0pKikvOworCisgICAgICAg
ICAgICAvLyBUYXJnZXQgbm9kZS4gTWF5IGNvbnRhaW4gd29yZCBjaGFyYWN0ZXJzIChhLXpBLVow
LTlfKSBhbmQgJy4nIG9yICctJy4KKyAgICAgICAgICAgIHZhciBub2RlUmUgPSAvKFtcdy1cLl0r
KT8vOworCisgICAgICAgICAgICAvLyBPYmplY3Qgb24gdGFyZ2V0IG5vZGUsIGFuZCBhY2Nlc3Nv
ci4gTmFtZSBtYXkgY29udGFpbiBvbmx5IHdvcmQKKyAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMu
IEFjY2Vzc29yIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXIgZXhjZXB0IGNsb3NpbmcgYnJhY2tl
dC4KKyAgICAgICAgICAgIHZhciBvYmplY3RSZSA9IC8oPzpcLihbXHctXSspKD86XFsoLispXF0p
Pyk/LzsKKworICAgICAgICAgICAgLy8gUHJvcGVydHkgYW5kIGFjY2Vzc29yLiBNYXkgY29udGFp
biBvbmx5IHdvcmQgY2hhcmFjdGVycy4gQWNjZXNzb3IgbWF5CisgICAgICAgICAgICAvLyBjb250
YWluIGFueSBub24tYnJhY2tldCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgdmFyIHByb3BlcnR5
UmUgPSAvXC4oW1x3LV0rKSg/OlxbKC4rKVxdKT8vOworCisgICAgICAgICAgICB2YXIgdHJhY2tS
ZSA9IG5ldyBSZWdFeHAoJycKKyAgICAgICAgICAgICAgICArICdeJworICAgICAgICAgICAgICAg
ICsgZGlyZWN0b3J5UmUuc291cmNlCisgICAgICAgICAgICAgICAgKyBub2RlUmUuc291cmNlCisg
ICAgICAgICAgICAgICAgKyBvYmplY3RSZS5zb3VyY2UKKyAgICAgICAgICAgICAgICArIHByb3Bl
cnR5UmUuc291cmNlCisgICAgICAgICAgICAgICAgKyAnJCcKKyAgICAgICAgICAgICk7CisKKyAg
ICAgICAgICAgIHZhciBzdXBwb3J0ZWRPYmplY3ROYW1lcyA9IFsgJ21hdGVyaWFsJywgJ21hdGVy
aWFscycsICdib25lcycgXTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICggdHJhY2tO
YW1lICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gdHJhY2tSZS5leGVj
KCB0cmFja05hbWUgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICEgbWF0Y2hlcyApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAnUHJvcGVydHlCaW5k
aW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7CisKKyAgICAgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0geworICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0b3J5TmFtZTogbWF0Y2hlc1sgMSBdLCAvLyAo
dHNjaHcpIGN1cnJlbnRseSB1bnVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1l
OiBtYXRjaGVzWyAyIF0sCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiBtYXRj
aGVzWyAzIF0sCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmRleDogbWF0Y2hlc1sg
NCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBtYXRjaGVzWyA1IF0s
ICAgICAvLyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbmRleDog
bWF0Y2hlc1sgNiBdCisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAg
ICAgdmFyIGxhc3REb3QgPSByZXN1bHRzLm5vZGVOYW1lICYmIHJlc3VsdHMubm9kZU5hbWUubGFz
dEluZGV4T2YoICcuJyApOworCisgICAgICAgICAgICAgICAgICAgIGlmICggbGFzdERvdCAhPT0g
dW5kZWZpbmVkICYmIGxhc3REb3QgIT09IC0xICkgeworCisgICAgICAgICAgICAgICAgICAgICAg
ICB2YXIgb2JqZWN0TmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCBsYXN0RG90ICsg
MSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYmplY3QgbmFtZXMgbXVzdCBiZSBj
aGVja2VkIGFnYWluc3QgYSB3aGl0ZWxpc3QuIE90aGVyd2lzZSwgdGhlcmUKKyAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIGlzIG5vIHdheSB0byBwYXJzZSAnZm9vLmJhci5iYXonOiAnYmF6JyBt
dXN0IGJlIGEgcHJvcGVydHksIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2Jhcicg
Y291bGQgYmUgdGhlIG9iamVjdE5hbWUsIG9yIHBhcnQgb2YgYSBub2RlTmFtZSAod2hpY2ggY2Fu
CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlICcuJyBjaGFyYWN0ZXJzKS4KKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmICggc3VwcG9ydGVkT2JqZWN0TmFtZXMuaW5kZXhPZigg
b2JqZWN0TmFtZSApICE9PSAtMSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
c3VsdHMubm9kZU5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZyggMCwgbGFzdERvdCAp
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMub2JqZWN0TmFtZSA9IG9iamVj
dE5hbWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCByZXN1bHRzLnByb3BlcnR5TmFtZSA9PT0g
bnVsbCB8fCByZXN1bHRzLnByb3BlcnR5TmFtZS5sZW5ndGggPT09IDAgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogY2FuIG5v
dCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTsKKwor
ICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dHM7CisKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgIH0oKSwKKworICAgICAgICBmaW5k
Tm9kZTogZnVuY3Rpb24gKCByb290LCBub2RlTmFtZSApIHsKKworICAgICAgICAgICAgaWYgKCAh
IG5vZGVOYW1lIHx8IG5vZGVOYW1lID09PSAiIiB8fCBub2RlTmFtZSA9PT0gInJvb3QiIHx8IG5v
ZGVOYW1lID09PSAiLiIgfHwgbm9kZU5hbWUgPT09IC0gMSB8fCBub2RlTmFtZSA9PT0gcm9vdC5u
YW1lIHx8IG5vZGVOYW1lID09PSByb290LnV1aWQgKSB7CisKKyAgICAgICAgICAgICAgICByZXR1
cm4gcm9vdDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWFyY2ggaW50byBz
a2VsZXRvbiBib25lcy4KKyAgICAgICAgICAgIGlmICggcm9vdC5za2VsZXRvbiApIHsKKworICAg
ICAgICAgICAgICAgIHZhciBzZWFyY2hTa2VsZXRvbiA9IGZ1bmN0aW9uICggc2tlbGV0b24gKSB7
CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgc2tlbGV0b24uYm9u
ZXMubGVuZ3RoOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYm9uZSA9
IHNrZWxldG9uLmJvbmVzWyBpIF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYm9u
ZS5uYW1lID09PSBub2RlTmFtZSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiBib25lOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAg
ICAgICAgfTsKKworICAgICAgICAgICAgICAgIHZhciBib25lID0gc2VhcmNoU2tlbGV0b24oIHJv
b3Quc2tlbGV0b24gKTsKKworICAgICAgICAgICAgICAgIGlmICggYm9uZSApIHsKKworICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gYm9uZTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWFyY2ggaW50byBub2RlIHN1YnRyZWUuCisgICAg
ICAgICAgICBpZiAoIHJvb3QuY2hpbGRyZW4gKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgc2Vh
cmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbiAoIGNoaWxkcmVuICkgeworCisgICAgICAgICAgICAg
ICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHsKKwor
ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkTm9kZSA9IGNoaWxkcmVuWyBpIF07CisK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2hpbGROb2RlLm5hbWUgPT09IG5vZGVOYW1l
IHx8IGNoaWxkTm9kZS51dWlkID09PSBub2RlTmFtZSApIHsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBjaGlsZE5vZGU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNlYXJjaE5vZGVTdWJ0cmVl
KCBjaGlsZE5vZGUuY2hpbGRyZW4gKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBy
ZXN1bHQgKSByZXR1cm4gcmVzdWx0OworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIH07CisKKyAgICAg
ICAgICAgICAgICB2YXIgc3ViVHJlZU5vZGUgPSBzZWFyY2hOb2RlU3VidHJlZSggcm9vdC5jaGls
ZHJlbiApOworCisgICAgICAgICAgICAgICAgaWYgKCBzdWJUcmVlTm9kZSApIHsKKworICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gc3ViVHJlZU5vZGU7CisKKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgfQor
CisgICAgfSApOworCisgICAgT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlw
ZSwgeyAvLyBwcm90b3R5cGUsIGNvbnRpbnVlZAorCisgICAgICAgIC8vIHRoZXNlIGFyZSB1c2Vk
IHRvICJiaW5kIiBhIG5vbmV4aXN0ZW50IHByb3BlcnR5CisgICAgICAgIF9nZXRWYWx1ZV91bmF2
YWlsYWJsZTogZnVuY3Rpb24gKCkge30sCisgICAgICAgIF9zZXRWYWx1ZV91bmF2YWlsYWJsZTog
ZnVuY3Rpb24gKCkge30sCisKKyAgICAgICAgQmluZGluZ1R5cGU6IHsKKyAgICAgICAgICAgIERp
cmVjdDogMCwKKyAgICAgICAgICAgIEVudGlyZUFycmF5OiAxLAorICAgICAgICAgICAgQXJyYXlF
bGVtZW50OiAyLAorICAgICAgICAgICAgSGFzRnJvbVRvQXJyYXk6IDMKKyAgICAgICAgfSwKKwor
ICAgICAgICBWZXJzaW9uaW5nOiB7CisgICAgICAgICAgICBOb25lOiAwLAorICAgICAgICAgICAg
TmVlZHNVcGRhdGU6IDEsCisgICAgICAgICAgICBNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOiAyCisg
ICAgICAgIH0sCisKKyAgICAgICAgR2V0dGVyQnlCaW5kaW5nVHlwZTogWworCisgICAgICAgICAg
ICBmdW5jdGlvbiBnZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkgeworCisgICAgICAg
ICAgICAgICAgYnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUg
XTsKKworICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgZnVuY3Rpb24gZ2V0VmFsdWVfYXJy
YXkoIGJ1ZmZlciwgb2Zmc2V0ICkgeworCisgICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHRo
aXMucmVzb2x2ZWRQcm9wZXJ0eTsKKworICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwg
biA9IHNvdXJjZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgYnVmZmVyWyBvZmZzZXQgKysgXSA9IHNvdXJjZVsgaSBdOworCisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICBmdW5jdGlvbiBnZXRWYWx1ZV9hcnJh
eUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkgeworCisgICAgICAgICAgICAgICAgYnVmZmVyWyBv
ZmZzZXQgXSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF07CisK
KyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlX3RvQXJyYXko
IGJ1ZmZlciwgb2Zmc2V0ICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlZFByb3Bl
cnR5LnRvQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICBdLAorCisgICAgICAgIFNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nOiBbCisKKyAg
ICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAvLyBEaXJlY3QKKworICAgICAgICAgICAgICAg
IGZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdCggYnVmZmVyLCBvZmZzZXQgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgdGhpcy5ub2RlWyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZz
ZXQgXTsKKworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBz
ZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkgeworCisgICAg
ICAgICAgICAgICAgICAgIHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsg
b2Zmc2V0IF07CisgICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBk
YXRlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICBmdW5j
dGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBv
ZmZzZXQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlWyB0aGlzLnByb3BlcnR5
TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJn
ZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7CisKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIF0sIFsKKworICAgICAgICAgICAgICAgIC8vIEVudGlyZUFycmF5
CisKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZz
ZXQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJv
cGVydHk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5s
ZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rb
IGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldFZhbHVlX2Fy
cmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHsKKworICAgICAgICAgICAgICAg
ICAgICB2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTsKKworICAgICAgICAgICAgICAg
ICAgICBmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysg
XTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy50
YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgfSwKKwor
ICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVl
ZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBk
ZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5OworCisgICAgICAgICAgICAgICAgICAgIGZvciAo
IHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisgICAgICAg
ICAgICAgICAgICAgICAgICBkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdOworCisgICAg
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldE9iamVj
dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgXSwgWworCisgICAgICAgICAgICAgICAgLy8gQXJyYXlFbGVtZW50CisKKyAg
ICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zm
c2V0ICkgeworCisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhp
cy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdOworCisgICAgICAgICAgICAgICAg
fSwKKworICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudF9zZXRO
ZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGhp
cy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0
IF07CisgICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0g
dHJ1ZTsKKworICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBz
ZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBv
ZmZzZXQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0
aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07CisgICAgICAgICAgICAgICAg
ICAgIHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOworCisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBdLCBbCisKKyAgICAgICAgICAgICAgICAv
LyBIYXNUb0Zyb21BcnJheQorCisgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2V0VmFsdWVfZnJv
bUFycmF5KCBidWZmZXIsIG9mZnNldCApIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLnJl
c29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApOworCisgICAgICAgICAg
ICAgICAgfSwKKworICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheV9z
ZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAg
dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTsKKyAgICAg
ICAgICAgICAgICAgICAgdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlOworCisg
ICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldFZhbHVlX2Zy
b21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHsKKwor
ICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZm
ZXIsIG9mZnNldCApOworICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldE9iamVjdC5tYXRy
aXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgXQorCisgICAgICAgIF0sCisKKyAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZh
bHVlX3VuYm91bmQoIHRhcmdldEFycmF5LCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAgIHRoaXMu
YmluZCgpOworICAgICAgICAgICAgdGhpcy5nZXRWYWx1ZSggdGFyZ2V0QXJyYXksIG9mZnNldCAp
OworCisgICAgICAgICAgICAvLyBOb3RlOiBUaGlzIGNsYXNzIHVzZXMgYSBTdGF0ZSBwYXR0ZXJu
IG9uIGEgcGVyLW1ldGhvZCBiYXNpczoKKyAgICAgICAgICAgIC8vICdiaW5kJyBzZXRzICd0aGlz
LmdldFZhbHVlJyAvICdzZXRWYWx1ZScgYW5kIHNoYWRvd3MgdGhlCisgICAgICAgICAgICAvLyBw
cm90b3R5cGUgdmVyc2lvbiBvZiB0aGVzZSBtZXRob2RzIHdpdGggb25lIHRoYXQgcmVwcmVzZW50
cworICAgICAgICAgICAgLy8gdGhlIGJvdW5kIHN0YXRlLiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBu
b3QgZm91bmQsIHRoZSBtZXRob2RzCisgICAgICAgICAgICAvLyBiZWNvbWUgbm8tb3BzLgorCisg
ICAgICAgIH0sCisKKyAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQo
IHNvdXJjZUFycmF5LCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAgIHRoaXMuYmluZCgpOworICAg
ICAgICAgICAgdGhpcy5zZXRWYWx1ZSggc291cmNlQXJyYXksIG9mZnNldCApOworCisgICAgICAg
IH0sCisKKyAgICAgICAgLy8gY3JlYXRlIGdldHRlciAvIHNldHRlciBwYWlyIGZvciBhIHByb3Bl
cnR5IGluIHRoZSBzY2VuZSBncmFwaAorICAgICAgICBiaW5kOiBmdW5jdGlvbiAoKSB7CisKKyAg
ICAgICAgICAgIHZhciB0YXJnZXRPYmplY3QgPSB0aGlzLm5vZGUsCisgICAgICAgICAgICAgICAg
cGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aCwKKworICAgICAgICAgICAgICAgIG9iamVjdE5h
bWUgPSBwYXJzZWRQYXRoLm9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1l
ID0gcGFyc2VkUGF0aC5wcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgcHJvcGVydHlJbmRl
eCA9IHBhcnNlZFBhdGgucHJvcGVydHlJbmRleDsKKworICAgICAgICAgICAgaWYgKCAhIHRhcmdl
dE9iamVjdCApIHsKKworICAgICAgICAgICAgICAgIHRhcmdldE9iamVjdCA9IFByb3BlcnR5Qmlu
ZGluZy5maW5kTm9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdE5vZGUsIHBh
cnNlZFBhdGgubm9kZU5hbWUgKSB8fCB0aGlzLnJvb3ROb2RlOworCisgICAgICAgICAgICAgICAg
dGhpcy5ub2RlID0gdGFyZ2V0T2JqZWN0OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IC8vIHNldCBmYWlsIHN0YXRlIHNvIHdlIGNhbiBqdXN0ICdyZXR1cm4nIG9uIGVycm9yCisgICAg
ICAgICAgICB0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGU7CisgICAg
ICAgICAgICB0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5hdmFpbGFibGU7CisKKyAg
ICAgICAgICAgIC8vIGVuc3VyZSB0aGVyZSBpcyBhIHZhbHVlIG5vZGUKKyAgICAgICAgICAgIGlm
ICggISB0YXJnZXRPYmplY3QgKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAn
VEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIG5vZGUgZm9yIHRyYWNrOiAn
ICsgdGhpcy5wYXRoICsgJyBidXQgaXQgd2FzblwndCBmb3VuZC4nICk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggb2JqZWN0TmFt
ZSApIHsKKworICAgICAgICAgICAgICAgIHZhciBvYmplY3RJbmRleCA9IHBhcnNlZFBhdGgub2Jq
ZWN0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2VzIHdlcmUgd2UgbmVl
ZCB0byByZWFjaCBkZWVwZXIgaW50byB0aGUgaGllcmFyY2h5IHRvIGdldCB0aGUgZmFjZSBtYXRl
cmlhbHMuLi4uCisgICAgICAgICAgICAgICAgc3dpdGNoICggb2JqZWN0TmFtZSApIHsKKworICAg
ICAgICAgICAgICAgICAgICBjYXNlICdtYXRlcmlhbHMnOgorCisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsICkgeworCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5v
dCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLicsIHRo
aXMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHRhcmdldE9i
amVjdC5tYXRlcmlhbC5tYXRlcmlhbHMgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8g
bWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVy
aWFscyBhcnJheS4nLCB0aGlzICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHM7CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Jv
bmVzJzoKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHRhcmdldE9iamVjdC5za2Vs
ZXRvbiApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdU
SFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBib25lcyBhcyBub2RlIGRvZXMg
bm90IGhhdmUgYSBza2VsZXRvbi4nLCB0aGlzICk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIHBvdGVudGlhbCBmdXR1cmUgb3B0aW1pemF0aW9uOiBza2lwIHRoaXMgaWYg
cHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci4K
KworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0LnNr
ZWxldG9uLmJvbmVzOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IHJlc29s
dmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuCisgICAgICAgICAgICAgICAgICAg
ICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCB0YXJnZXRPYmplY3QubGVuZ3RoOyBpICsrICkgewor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0YXJnZXRPYmplY3RbIGkgXS5uYW1l
ID09PSBvYmplY3RJbmRleCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBv
YmplY3RJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAg
ICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdGFyZ2V0T2JqZWN0
WyBvYmplY3ROYW1lIF0gPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmlu
ZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLicsIHRoaXMgKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmpl
Y3ROYW1lIF07CisKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIGlmICgg
b2JqZWN0SW5kZXggIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAo
IHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXSA9PT0gdW5kZWZpbmVkICkgeworCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBU
cnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZp
bmVkLicsIHRoaXMsIHRhcmdldE9iamVjdCApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0YXJn
ZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF07CisKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmVzb2x2ZSBwcm9wZXJ0eQor
ICAgICAgICAgICAgdmFyIG5vZGVQcm9wZXJ0eSA9IHRhcmdldE9iamVjdFsgcHJvcGVydHlOYW1l
IF07CisKKyAgICAgICAgICAgIGlmICggbm9kZVByb3BlcnR5ID09PSB1bmRlZmluZWQgKSB7CisK
KyAgICAgICAgICAgICAgICB2YXIgbm9kZU5hbWUgPSBwYXJzZWRQYXRoLm5vZGVOYW1lOworCisg
ICAgICAgICAgICAgICAgY29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5
aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICcgKyBub2RlTmFtZSArCisgICAgICAg
ICAgICAgICAgICAgICcuJyArIHByb3BlcnR5TmFtZSArICcgYnV0IGl0IHdhc25cJ3QgZm91bmQu
JywgdGFyZ2V0T2JqZWN0ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIC8vIGRldGVybWluZSB2ZXJzaW9uaW5nIHNjaGVtZQorICAgICAg
ICAgICAgdmFyIHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTm9uZTsKKworICAgICAgICAg
ICAgaWYgKCB0YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbWF0
ZXJpYWwKKworICAgICAgICAgICAgICAgIHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTmVl
ZHNVcGRhdGU7CisgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmpl
Y3Q7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5l
ZWRzVXBkYXRlICE9PSB1bmRlZmluZWQgKSB7IC8vIG5vZGUgdHJhbnNmb3JtCisKKyAgICAgICAg
ICAgICAgICB2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk1hdHJpeFdvcmxkTmVlZHNVcGRh
dGU7CisgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7CisK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGhvdyB0aGUgcHJvcGVy
dHkgZ2V0cyBib3VuZAorICAgICAgICAgICAgdmFyIGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5n
VHlwZS5EaXJlY3Q7CisKKyAgICAgICAgICAgIGlmICggcHJvcGVydHlJbmRleCAhPT0gdW5kZWZp
bmVkICkgeworCisgICAgICAgICAgICAgICAgLy8gYWNjZXNzIGEgc3ViIGVsZW1lbnQgb2YgdGhl
IHByb3BlcnR5IGFycmF5IChvbmx5IHByaW1pdGl2ZXMgYXJlIHN1cHBvcnRlZCByaWdodCBub3cp
CisKKyAgICAgICAgICAgICAgICBpZiAoIHByb3BlcnR5TmFtZSA9PT0gIm1vcnBoVGFyZ2V0SW5m
bHVlbmNlcyIgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcG90ZW50aWFsIG9wdGltaXph
dGlvbiwgc2tpcCB0aGlzIGlmIHByb3BlcnR5SW5kZXggaXMgYWxyZWFkeSBhbiBpbnRlZ2VyLCBh
bmQgY29udmVydCB0aGUgaW50ZWdlciBzdHJpbmcgdG8gYSB0cnVlIGludGVnZXIuCisKKyAgICAg
ICAgICAgICAgICAgICAgLy8gc3VwcG9ydCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50
byBpbmRpY2VzLgorICAgICAgICAgICAgICAgICAgICBpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21l
dHJ5ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUu
UHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJl
Y2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuJywgdGhpcyApOworICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgICAgICBpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5
ICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21l
dHJ5Lm1vcnBoQXR0cmlidXRlcyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3Jw
aFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5t
b3JwaEF0dHJpYnV0ZXMuJywgdGhpcyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAg
ICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1
dGVzLnBvc2l0aW9uLmxlbmd0aDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvblsg
aSBdLm5hbWUgPT09IHByb3BlcnR5SW5kZXggKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcHJvcGVydHlJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoVGFy
Z2V0cyApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdU
SFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5j
ZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaFRhcmdldHMuJywg
dGhpcyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9
IDA7IGkgPCB0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSArKyApIHsK
KworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5
Lm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWUgPT09IHByb3BlcnR5SW5kZXggKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbmRleCA9IGk7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmluZGluZ1R5cGUgPSB0aGlz
LkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudDsKKworICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2
ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTsKKyAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5
SW5kZXggPSBwcm9wZXJ0eUluZGV4OworCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBub2RlUHJv
cGVydHkuZnJvbUFycmF5ICE9PSB1bmRlZmluZWQgJiYgbm9kZVByb3BlcnR5LnRvQXJyYXkgIT09
IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIC8vIG11c3QgdXNlIGNvcHkgZm9yIE9i
amVjdDNELkV1bGVyL1F1YXRlcm5pb24KKworICAgICAgICAgICAgICAgIGJpbmRpbmdUeXBlID0g
dGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheTsKKworICAgICAgICAgICAgICAgIHRoaXMu
cmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTsKKworICAgICAgICAgICAgfSBlbHNlIGlm
ICggQXJyYXkuaXNBcnJheSggbm9kZVByb3BlcnR5ICkgKSB7CisKKyAgICAgICAgICAgICAgICBi
aW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXk7CisKKyAgICAgICAgICAg
ICAgICB0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7CisKKyAgICAgICAgICAg
IH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5
TmFtZTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWxlY3QgZ2V0dGVyIC8g
c2V0dGVyCisgICAgICAgICAgICB0aGlzLmdldFZhbHVlID0gdGhpcy5HZXR0ZXJCeUJpbmRpbmdU
eXBlWyBiaW5kaW5nVHlwZSBdOworICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSA9IHRoaXMuU2V0
dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbIGJpbmRpbmdUeXBlIF1bIHZlcnNpb25pbmcg
XTsKKworICAgICAgICB9LAorCisgICAgICAgIHVuYmluZDogZnVuY3Rpb24gKCkgeworCisgICAg
ICAgICAgICB0aGlzLm5vZGUgPSBudWxsOworCisgICAgICAgICAgICAvLyBiYWNrIHRvIHRoZSBw
cm90b3R5cGUgdmVyc2lvbiBvZiBnZXRWYWx1ZSAvIHNldFZhbHVlCisgICAgICAgICAgICAvLyBu
b3RlOiBhdm9pZGluZyB0byBtdXRhdGUgdGhlIHNoYXBlIG9mICd0aGlzJyB2aWEgJ2RlbGV0ZScK
KyAgICAgICAgICAgIHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmJvdW5kOworICAg
ICAgICAgICAgdGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYm91bmQ7CisKKyAgICAg
ICAgfQorCisgICAgfSApOworCisgICAgLy8hXCBERUNMQVJFIEFMSUFTIEFGVEVSIGFzc2lnbiBw
cm90b3R5cGUgIQorICAgIE9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUs
IHsKKworICAgICAgICAvLyBpbml0aWFsIHN0YXRlIG9mIHRoZXNlIG1ldGhvZHMgdGhhdCBjYWxs
cyAnYmluZCcKKyAgICAgICAgX2dldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90
b3R5cGUuZ2V0VmFsdWUsCisgICAgICAgIF9zZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRp
bmcucHJvdG90eXBlLnNldFZhbHVlLAorCisgICAgfSApOworCisgICAgLyoqCisgICAgICoKKyAg
ICAgKiBBIGdyb3VwIG9mIG9iamVjdHMgdGhhdCByZWNlaXZlcyBhIHNoYXJlZCBhbmltYXRpb24g
c3RhdGUuCisgICAgICoKKyAgICAgKiBVc2FnZToKKyAgICAgKgorICAgICAqICAtICAgQWRkIG9i
amVjdHMgeW91IHdvdWxkIG90aGVyd2lzZSBwYXNzIGFzICdyb290JyB0byB0aGUKKyAgICAgKiAg
ICAgIGNvbnN0cnVjdG9yIG9yIHRoZSAuY2xpcEFjdGlvbiBtZXRob2Qgb2YgQW5pbWF0aW9uTWl4
ZXIuCisgICAgICoKKyAgICAgKiAgLSAgIEluc3RlYWQgcGFzcyB0aGlzIG9iamVjdCBhcyAncm9v
dCcuCisgICAgICoKKyAgICAgKiAgLSAgIFlvdSBjYW4gYWxzbyBhZGQgYW5kIHJlbW92ZSBvYmpl
Y3RzIGxhdGVyIHdoZW4gdGhlIG1peGVyCisgICAgICogICAgICBpcyBydW5uaW5nLgorICAgICAq
CisgICAgICogTm90ZToKKyAgICAgKgorICAgICAqICAgICAgT2JqZWN0cyBvZiB0aGlzIGNsYXNz
IGFwcGVhciBhcyBvbmUgb2JqZWN0IHRvIHRoZSBtaXhlciwKKyAgICAgKiAgICAgIHNvIGNhY2hl
IGNvbnRyb2wgb2YgdGhlIGluZGl2aWR1YWwgb2JqZWN0cyBtdXN0IGJlIGRvbmUKKyAgICAgKiAg
ICAgIG9uIHRoZSBncm91cC4KKyAgICAgKgorICAgICAqIExpbWl0YXRpb246CisgICAgICoKKyAg
ICAgKiAgLSAgIFRoZSBhbmltYXRlZCBwcm9wZXJ0aWVzIG11c3QgYmUgY29tcGF0aWJsZSBhbW9u
ZyB0aGUKKyAgICAgKiAgICAgIGFsbCBvYmplY3RzIGluIHRoZSBncm91cC4KKyAgICAgKgorICAg
ICAqICAtICAgQSBzaW5nbGUgcHJvcGVydHkgY2FuIGVpdGhlciBiZSBjb250cm9sbGVkIHRocm91
Z2ggYQorICAgICAqICAgICAgdGFyZ2V0IGdyb3VwIG9yIGRpcmVjdGx5LCBidXQgbm90IGJvdGgu
CisgICAgICoKKyAgICAgKiBAYXV0aG9yIHRzY2h3CisgICAgICovCisKKyAgICBmdW5jdGlvbiBB
bmltYXRpb25PYmplY3RHcm91cCggdmFyX2FyZ3MgKSB7CisKKyAgICAgICAgdGhpcy51dWlkID0g
X01hdGguZ2VuZXJhdGVVVUlEKCk7CisKKyAgICAgICAgLy8gY2FjaGVkIG9iamVjdHMgZm9sbG93
ZWQgYnkgdGhlIGFjdGl2ZSBvbmVzCisgICAgICAgIHRoaXMuX29iamVjdHMgPSBBcnJheS5wcm90
b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzICk7CisKKyAgICAgICAgdGhpcy5uQ2FjaGVkT2Jq
ZWN0c18gPSAwOyAgICAgICAgICAgLy8gdGhyZXNob2xkCisgICAgICAgIC8vIG5vdGU6IHJlYWQg
YnkgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZQorCisgICAgICAgIHZhciBpbmRpY2VzID0ge307
CisgICAgICAgIHRoaXMuX2luZGljZXNCeVVVSUQgPSBpbmRpY2VzOyAgICAgIC8vIGZvciBib29r
a2VlcGluZworCisgICAgICAgIGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7
IGkgIT09IG47ICsrIGkgKSB7CisKKyAgICAgICAgICAgIGluZGljZXNbIGFyZ3VtZW50c1sgaSBd
LnV1aWQgXSA9IGk7CisKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX3BhdGhzID0gW107ICAg
ICAgICAgICAgICAgICAgIC8vIGluc2lkZTogc3RyaW5nCisgICAgICAgIHRoaXMuX3BhcnNlZFBh
dGhzID0gW107ICAgICAgICAgICAgIC8vIGluc2lkZTogeyB3ZSBkb24ndCBjYXJlLCBoZXJlIH0K
KyAgICAgICAgdGhpcy5fYmluZGluZ3MgPSBbXTsgICAgICAgICAgICAgICAgLy8gaW5zaWRlOiBB
cnJheTwgUHJvcGVydHlCaW5kaW5nID4KKyAgICAgICAgdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQ
YXRoID0ge307ICAgLy8gaW5zaWRlOiBpbmRpY2VzIGluIHRoZXNlIGFycmF5cworCisgICAgICAg
IHZhciBzY29wZSA9IHRoaXM7CisKKyAgICAgICAgdGhpcy5zdGF0cyA9IHsKKworICAgICAgICAg
ICAgb2JqZWN0czogeworICAgICAgICAgICAgICAgIGdldCB0b3RhbCgpIHsgcmV0dXJuIHNjb3Bl
Ll9vYmplY3RzLmxlbmd0aDsgfSwKKyAgICAgICAgICAgICAgICBnZXQgaW5Vc2UoKSB7IHJldHVy
biB0aGlzLnRvdGFsIC0gc2NvcGUubkNhY2hlZE9iamVjdHNfOyB9CisgICAgICAgICAgICB9LAor
CisgICAgICAgICAgICBnZXQgYmluZGluZ3NQZXJPYmplY3QoKSB7IHJldHVybiBzY29wZS5fYmlu
ZGluZ3MubGVuZ3RoOyB9CisKKyAgICAgICAgfTsKKworICAgIH0KKworICAgIE9iamVjdC5hc3Np
Z24oIEFuaW1hdGlvbk9iamVjdEdyb3VwLnByb3RvdHlwZSwgeworCisgICAgICAgIGlzQW5pbWF0
aW9uT2JqZWN0R3JvdXA6IHRydWUsCisKKyAgICAgICAgYWRkOiBmdW5jdGlvbiggdmFyX2FyZ3Mg
KSB7CisKKyAgICAgICAgICAgIHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cywKKyAgICAgICAg
ICAgICAgICBuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLAorICAgICAgICAgICAgICAgIG5DYWNo
ZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sCisgICAgICAgICAgICAgICAgaW5kaWNl
c0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsCisgICAgICAgICAgICAgICAgcGF0aHMgPSB0
aGlzLl9wYXRocywKKyAgICAgICAgICAgICAgICBwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBh
dGhzLAorICAgICAgICAgICAgICAgIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCisgICAgICAg
ICAgICAgICAgbkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoOworCisgICAgICAgICAgICBmb3Ig
KCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisg
ICAgICAgICAgICAgICAgdmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLAorICAgICAgICAgICAg
ICAgICAgICB1dWlkID0gb2JqZWN0LnV1aWQsCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0g
aW5kaWNlc0J5VVVJRFsgdXVpZCBdLAorICAgICAgICAgICAgICAgICAgICBrbm93bk9iamVjdCA9
IHVuZGVmaW5lZDsKKworICAgICAgICAgICAgICAgIGlmICggaW5kZXggPT09IHVuZGVmaW5lZCAp
IHsKKworICAgICAgICAgICAgICAgICAgICAvLyB1bmtub3duIG9iamVjdCAtPiBhZGQgaXQgdG8g
dGhlIEFDVElWRSByZWdpb24KKworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG5PYmplY3Rz
ICsrOworICAgICAgICAgICAgICAgICAgICBpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBpbmRleDsK
KyAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5wdXNoKCBvYmplY3QgKTsKKworICAgICAgICAg
ICAgICAgICAgICAvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxs
IGJpbmRpbmdzCisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGogPSAwLCBtID0gbkJp
bmRpbmdzOyBqICE9PSBtOyArKyBqICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5k
aW5nc1sgaiBdLnB1c2goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9w
ZXJ0eUJpbmRpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Qs
IHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApOworCisgICAgICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAga25vd25PYmplY3QgPSBvYmplY3RzWyBpbmRleCBd
OworCisgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IHRvIHRoZSBB
Q1RJVkUgcmVnaW9uCisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0QWN0aXZlSW5kZXgg
PSAtLSBuQ2FjaGVkT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDYWNoZWRP
YmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF07CisKKyAgICAgICAgICAgICAgICAg
ICAgaW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDsKKyAgICAg
ICAgICAgICAgICAgICAgb2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7CisKKyAg
ICAgICAgICAgICAgICAgICAgaW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gZmlyc3RBY3RpdmVJbmRl
eDsKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gb2Jq
ZWN0OworCisgICAgICAgICAgICAgICAgICAgIC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRv
IHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3MKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCB2
YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0
QWN0aXZlSW5kZXggXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nID0gYmlu
ZGluZ3NGb3JQYXRoWyBpbmRleCBdOworCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5n
c0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkOworCisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIGJpbmRpbmcgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIHNpbmNlIHdlIGRvIG5vdCBib3RoZXIgdG8gY3JlYXRlIG5ldyBiaW5kaW5ncwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hl
ZCwgdGhlIGJpbmRpbmcgbWF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgbWF5
IG5vdCBleGlzdAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZyA9IG5ldyBQ
cm9wZXJ0eUJpbmRpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpl
Y3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKTsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0
QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgfSBlbHNlIGlmICggb2JqZWN0c1sgaW5kZXggXSAhPT0ga25vd25PYmplY3Qg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlv
bk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgJyArCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9y
IHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLicgKTsK
KworICAgICAgICAgICAgICAgIH0gLy8gZWxzZSB0aGUgb2JqZWN0IGlzIGFscmVhZHkgd2hlcmUg
d2Ugd2FudCBpdCB0byBiZQorCisgICAgICAgICAgICB9IC8vIGZvciBhcmd1bWVudHMKKworICAg
ICAgICAgICAgdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0czsKKworICAgICAg
ICB9LAorCisgICAgICAgIHJlbW92ZTogZnVuY3Rpb24oIHZhcl9hcmdzICkgeworCisgICAgICAg
ICAgICB2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsCisgICAgICAgICAgICAgICAgbkNhY2hl
ZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXywKKyAgICAgICAgICAgICAgICBpbmRpY2Vz
QnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCwKKyAgICAgICAgICAgICAgICBiaW5kaW5ncyA9
IHRoaXMuX2JpbmRpbmdzLAorICAgICAgICAgICAgICAgIG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxl
bmd0aDsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0
aDsgaSAhPT0gbjsgKysgaSApIHsKKworICAgICAgICAgICAgICAgIHZhciBvYmplY3QgPSBhcmd1
bWVudHNbIGkgXSwKKyAgICAgICAgICAgICAgICAgICAgdXVpZCA9IG9iamVjdC51dWlkLAorICAg
ICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTsKKworICAgICAg
ICAgICAgICAgIGlmICggaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+PSBuQ2FjaGVkT2Jq
ZWN0cyApIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGV4aXN0aW5nIG9iamVjdCBp
bnRvIHRoZSBDQUNIRUQgcmVnaW9uCisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RDYWNo
ZWRJbmRleCA9IG5DYWNoZWRPYmplY3RzICsrLAorICAgICAgICAgICAgICAgICAgICAgICAgZmly
c3RBY3RpdmVPYmplY3QgPSBvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXTsKKworICAgICAgICAg
ICAgICAgICAgICBpbmRpY2VzQnlVVUlEWyBmaXJzdEFjdGl2ZU9iamVjdC51dWlkIF0gPSBpbmRl
eDsKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0c1sgaW5kZXggXSA9IGZpcnN0QWN0aXZlT2Jq
ZWN0OworCisgICAgICAgICAgICAgICAgICAgIGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGxhc3RD
YWNoZWRJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0c1sgbGFzdENhY2hlZEluZGV4
IF0gPSBvYmplY3Q7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYWNjb3VudGluZyBpcyBkb25l
LCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5ncworCisgICAgICAgICAgICAgICAgICAg
IGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0s
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBh
dGhbIGxhc3RDYWNoZWRJbmRleCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRp
bmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlOworICAgICAgICAgICAgICAg
ICAgICAgICAgYmluZGluZ3NGb3JQYXRoWyBsYXN0Q2FjaGVkSW5kZXggXSA9IGJpbmRpbmc7CisK
KyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICB9IC8vIGZvciBhcmd1bWVudHMKKworICAgICAgICAgICAgdGhpcy5uQ2FjaGVkT2JqZWN0c18g
PSBuQ2FjaGVkT2JqZWN0czsKKworICAgICAgICB9LAorCisgICAgICAgIC8vIHJlbW92ZSAmIGZv
cmdldAorICAgICAgICB1bmNhY2hlOiBmdW5jdGlvbiggdmFyX2FyZ3MgKSB7CisKKyAgICAgICAg
ICAgIHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cywKKyAgICAgICAgICAgICAgICBuT2JqZWN0
cyA9IG9iamVjdHMubGVuZ3RoLAorICAgICAgICAgICAgICAgIG5DYWNoZWRPYmplY3RzID0gdGhp
cy5uQ2FjaGVkT2JqZWN0c18sCisgICAgICAgICAgICAgICAgaW5kaWNlc0J5VVVJRCA9IHRoaXMu
X2luZGljZXNCeVVVSUQsCisgICAgICAgICAgICAgICAgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5n
cywKKyAgICAgICAgICAgICAgICBuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7CisKKyAgICAg
ICAgICAgIGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsr
IGkgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sCisg
ICAgICAgICAgICAgICAgICAgIHV1aWQgPSBvYmplY3QudXVpZCwKKyAgICAgICAgICAgICAgICAg
ICAgaW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07CisKKyAgICAgICAgICAgICAgICBpZiAo
IGluZGV4ICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGlu
ZGljZXNCeVVVSURbIHV1aWQgXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGluZGV4IDwg
bkNhY2hlZE9iamVjdHMgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdCBp
cyBjYWNoZWQsIHNocmluayB0aGUgQ0FDSEVEIHJlZ2lvbgorCisgICAgICAgICAgICAgICAgICAg
ICAgICB2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2
ZUluZGV4IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gLS0gbk9i
amVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE9iamVjdCA9IG9iamVjdHNb
IGxhc3RJbmRleCBdOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IGNhY2hlZCBv
YmplY3QgdGFrZXMgdGhpcyBvYmplY3QncyBwbGFjZQorICAgICAgICAgICAgICAgICAgICAgICAg
aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0OworCisg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IG9iamVjdCBnb2VzIHRvIHRoZSBhY3RpdmF0
ZWQgc2xvdCBhbmQgcG9wCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzQnlVVUlEWyBs
YXN0T2JqZWN0LnV1aWQgXSA9IGZpcnN0QWN0aXZlSW5kZXg7CisgICAgICAgICAgICAgICAgICAg
ICAgICBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0T2JqZWN0OworICAgICAgICAg
ICAgICAgICAgICAgICAgb2JqZWN0cy5wb3AoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5ncwor
CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7
IGogIT09IG07ICsrIGogKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmlu
ZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbGFzdENhY2hlZCA9IGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gYmluZGluZ3NGb3JQYXRoWyBs
YXN0SW5kZXggXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzRm9yUGF0
aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlu
ZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0OworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJpbmRpbmdzRm9yUGF0aC5wb3AoKTsKKworICAgICAgICAgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIG9iamVjdCBpcyBhY3RpdmUsIGp1c3Qgc3dhcCB3aXRoIHRoZSBsYXN0IGFu
ZCBwb3AKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0tIG5PYmpl
Y3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RPYmplY3QgPSBvYmplY3RzWyBs
YXN0SW5kZXggXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc0J5VVVJRFsgbGFz
dE9iamVjdC51dWlkIF0gPSBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNb
IGluZGV4IF0gPSBsYXN0T2JqZWN0OworICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5w
b3AoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjb3VudGluZyBpcyBkb25lLCBu
b3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5ncworCisgICAgICAgICAgICAgICAgICAgICAg
ICBmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7CisKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3Nb
IGogXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzRm9yUGF0aFsgaW5k
ZXggXSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYmluZGluZ3NGb3JQYXRoLnBvcCgpOworCisgICAgICAgICAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBjYWNoZWQgb3IgYWN0aXZlCisKKyAgICAg
ICAgICAgICAgICB9IC8vIGlmIG9iamVjdCBpcyBrbm93bgorCisgICAgICAgICAgICB9IC8vIGZv
ciBhcmd1bWVudHMKKworICAgICAgICAgICAgdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVk
T2JqZWN0czsKKworICAgICAgICB9LAorCisgICAgICAgIC8vIEludGVybmFsIGludGVyZmFjZSB1
c2VkIGJ5IGJlZnJpZW5kZWQgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZToKKworICAgICAgICBz
dWJzY3JpYmVfOiBmdW5jdGlvbiAoIHBhdGgsIHBhcnNlZFBhdGggKSB7CisKKyAgICAgICAgICAg
IC8vIHJldHVybnMgYW4gYXJyYXkgb2YgYmluZGluZ3MgZm9yIHRoZSBnaXZlbiBwYXRoIHRoYXQg
aXMgY2hhbmdlZAorICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQgb2Jq
ZWN0cyBpbiB0aGUgZ3JvdXAKKworICAgICAgICAgICAgdmFyIGluZGljZXNCeVBhdGggPSB0aGlz
Ll9iaW5kaW5nc0luZGljZXNCeVBhdGgsCisgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRpY2Vz
QnlQYXRoWyBwYXRoIF0sCisgICAgICAgICAgICAgICAgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5n
czsKKworICAgICAgICAgICAgaWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGJpbmRp
bmdzWyBpbmRleCBdOworCisgICAgICAgICAgICB2YXIgcGF0aHMgPSB0aGlzLl9wYXRocywKKyAg
ICAgICAgICAgICAgICBwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLAorICAgICAgICAg
ICAgICAgIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLAorICAgICAgICAgICAgICAgIG5PYmplY3Rz
ID0gb2JqZWN0cy5sZW5ndGgsCisgICAgICAgICAgICAgICAgbkNhY2hlZE9iamVjdHMgPSB0aGlz
Lm5DYWNoZWRPYmplY3RzXywKKyAgICAgICAgICAgICAgICBiaW5kaW5nc0ZvclBhdGggPSBuZXcg
QXJyYXkoIG5PYmplY3RzICk7CisKKyAgICAgICAgICAgIGluZGV4ID0gYmluZGluZ3MubGVuZ3Ro
OworCisgICAgICAgICAgICBpbmRpY2VzQnlQYXRoWyBwYXRoIF0gPSBpbmRleDsKKworICAgICAg
ICAgICAgcGF0aHMucHVzaCggcGF0aCApOworICAgICAgICAgICAgcGFyc2VkUGF0aHMucHVzaCgg
cGFyc2VkUGF0aCApOworICAgICAgICAgICAgYmluZGluZ3MucHVzaCggYmluZGluZ3NGb3JQYXRo
ICk7CisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gbkNhY2hlZE9iamVjdHMsIG4gPSBvYmpl
Y3RzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworICAgICAgICAgICAgICAgIHZhciBvYmpl
Y3QgPSBvYmplY3RzWyBpIF07CisgICAgICAgICAgICAgICAgYmluZGluZ3NGb3JQYXRoWyBpIF0g
PSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGgsIHBhcnNlZFBhdGggKTsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYmluZGluZ3NGb3JQYXRoOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgdW5zdWJzY3JpYmVfOiBmdW5jdGlvbiAoIHBhdGggKSB7CisKKyAg
ICAgICAgICAgIC8vIHRlbGxzIHRoZSBncm91cCB0byBmb3JnZXQgYWJvdXQgYSBwcm9wZXJ0eSBw
YXRoIGFuZCBubyBsb25nZXIKKyAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYXJyYXkgcHJldmlv
dXNseSBvYnRhaW5lZCB3aXRoICdzdWJzY3JpYmVfJworCisgICAgICAgICAgICB2YXIgaW5kaWNl
c0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCwKKyAgICAgICAgICAgICAgICBp
bmRleCA9IGluZGljZXNCeVBhdGhbIHBhdGggXTsKKworICAgICAgICAgICAgaWYgKCBpbmRleCAh
PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgdmFyIHBhdGhzID0gdGhpcy5fcGF0
aHMsCisgICAgICAgICAgICAgICAgICAgIHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMs
CisgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCisgICAgICAg
ICAgICAgICAgICAgIGxhc3RCaW5kaW5nc0luZGV4ID0gYmluZGluZ3MubGVuZ3RoIC0gMSwKKyAg
ICAgICAgICAgICAgICAgICAgbGFzdEJpbmRpbmdzID0gYmluZGluZ3NbIGxhc3RCaW5kaW5nc0lu
ZGV4IF0sCisgICAgICAgICAgICAgICAgICAgIGxhc3RCaW5kaW5nc1BhdGggPSBwYXRoWyBsYXN0
QmluZGluZ3NJbmRleCBdOworCisgICAgICAgICAgICAgICAgaW5kaWNlc0J5UGF0aFsgbGFzdEJp
bmRpbmdzUGF0aCBdID0gaW5kZXg7CisKKyAgICAgICAgICAgICAgICBiaW5kaW5nc1sgaW5kZXgg
XSA9IGxhc3RCaW5kaW5nczsKKyAgICAgICAgICAgICAgICBiaW5kaW5ncy5wb3AoKTsKKworICAg
ICAgICAgICAgICAgIHBhcnNlZFBhdGhzWyBpbmRleCBdID0gcGFyc2VkUGF0aHNbIGxhc3RCaW5k
aW5nc0luZGV4IF07CisgICAgICAgICAgICAgICAgcGFyc2VkUGF0aHMucG9wKCk7CisKKyAgICAg
ICAgICAgICAgICBwYXRoc1sgaW5kZXggXSA9IHBhdGhzWyBsYXN0QmluZGluZ3NJbmRleCBdOwor
ICAgICAgICAgICAgICAgIHBhdGhzLnBvcCgpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAg
fQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBBY3Rpb24gcHJvdmlkZWQg
YnkgQW5pbWF0aW9uTWl4ZXIgZm9yIHNjaGVkdWxpbmcgY2xpcCBwbGF5YmFjayBvbiBzcGVjaWZp
YworICAgICAqIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8g
aHR0cDovL2NsYXJhLmlvLworICAgICAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGln
aHRoYXVzLnVzLworICAgICAqIEBhdXRob3IgdHNjaHcKKyAgICAgKgorICAgICAqLworCisgICAg
ZnVuY3Rpb24gQW5pbWF0aW9uQWN0aW9uKCBtaXhlciwgY2xpcCwgbG9jYWxSb290ICkgeworCisg
ICAgICAgIHRoaXMuX21peGVyID0gbWl4ZXI7CisgICAgICAgIHRoaXMuX2NsaXAgPSBjbGlwOwor
ICAgICAgICB0aGlzLl9sb2NhbFJvb3QgPSBsb2NhbFJvb3QgfHwgbnVsbDsKKworICAgICAgICB2
YXIgdHJhY2tzID0gY2xpcC50cmFja3MsCisgICAgICAgICAgICBuVHJhY2tzID0gdHJhY2tzLmxl
bmd0aCwKKyAgICAgICAgICAgIGludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApOwor
CisgICAgICAgIHZhciBpbnRlcnBvbGFudFNldHRpbmdzID0geworICAgICAgICAgICAgICAgIGVu
ZGluZ1N0YXJ0OiAgICBaZXJvQ3VydmF0dXJlRW5kaW5nLAorICAgICAgICAgICAgICAgIGVuZGlu
Z0VuZDogICAgICBaZXJvQ3VydmF0dXJlRW5kaW5nCisgICAgICAgIH07CisKKyAgICAgICAgZm9y
ICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkgeworCisgICAgICAgICAgICB2YXIg
aW50ZXJwb2xhbnQgPSB0cmFja3NbIGkgXS5jcmVhdGVJbnRlcnBvbGFudCggbnVsbCApOworICAg
ICAgICAgICAgaW50ZXJwb2xhbnRzWyBpIF0gPSBpbnRlcnBvbGFudDsKKyAgICAgICAgICAgIGlu
dGVycG9sYW50LnNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5nczsKKworICAgICAgICB9CisK
KyAgICAgICAgdGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7
CisKKyAgICAgICAgdGhpcy5faW50ZXJwb2xhbnRzID0gaW50ZXJwb2xhbnRzOyAgLy8gYm91bmQg
YnkgdGhlIG1peGVyCisKKyAgICAgICAgLy8gaW5zaWRlOiBQcm9wZXJ0eU1peGVyIChtYW5hZ2Vk
IGJ5IHRoZSBtaXhlcikKKyAgICAgICAgdGhpcy5fcHJvcGVydHlCaW5kaW5ncyA9IG5ldyBBcnJh
eSggblRyYWNrcyApOworCisgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSBudWxsOyAgICAgICAg
ICAgIC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXIKKyAgICAgICAgdGhpcy5fYnlDbGlwQ2FjaGVJ
bmRleCA9IG51bGw7ICAgICAgLy8gZm9yIHRoZSBtZW1vcnkgbWFuYWdlcgorCisgICAgICAgIHRo
aXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVsbDsKKyAgICAgICAgdGhpcy5fd2VpZ2h0SW50
ZXJwb2xhbnQgPSBudWxsOworCisgICAgICAgIHRoaXMubG9vcCA9IExvb3BSZXBlYXQ7CisgICAg
ICAgIHRoaXMuX2xvb3BDb3VudCA9IC0xOworCisgICAgICAgIC8vIGdsb2JhbCBtaXhlciB0aW1l
IHdoZW4gdGhlIGFjdGlvbiBpcyB0byBiZSBzdGFydGVkCisgICAgICAgIC8vIGl0J3Mgc2V0IGJh
Y2sgdG8gJ251bGwnIHVwb24gc3RhcnQgb2YgdGhlIGFjdGlvbgorICAgICAgICB0aGlzLl9zdGFy
dFRpbWUgPSBudWxsOworCisgICAgICAgIC8vIHNjYWxlZCBsb2NhbCB0aW1lIG9mIHRoZSBhY3Rp
b24KKyAgICAgICAgLy8gZ2V0cyBjbGFtcGVkIG9yIHdyYXBwZWQgdG8gMC4uY2xpcC5kdXJhdGlv
biBhY2NvcmRpbmcgdG8gbG9vcAorICAgICAgICB0aGlzLnRpbWUgPSAwOworCisgICAgICAgIHRo
aXMudGltZVNjYWxlID0gMTsKKyAgICAgICAgdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gMTsK
KworICAgICAgICB0aGlzLndlaWdodCA9IDE7CisgICAgICAgIHRoaXMuX2VmZmVjdGl2ZVdlaWdo
dCA9IDE7CisKKyAgICAgICAgdGhpcy5yZXBldGl0aW9ucyA9IEluZmluaXR5OyAgICAgICAgLy8g
bm8uIG9mIHJlcGV0aXRpb25zIHdoZW4gbG9vcGluZworCisgICAgICAgIHRoaXMucGF1c2VkID0g
ZmFsc2U7ICAgICAgICAgICAgICAgIC8vIHRydWUgLT4gemVybyBlZmZlY3RpdmUgdGltZSBzY2Fs
ZQorICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAvLyBmYWxzZSAt
PiB6ZXJvIGVmZmVjdGl2ZSB3ZWlnaHQKKworICAgICAgICB0aGlzLmNsYW1wV2hlbkZpbmlzaGVk
ICA9IGZhbHNlOyAgICAvLyBrZWVwIGZlZWRpbmcgdGhlIGxhc3QgZnJhbWU/CisKKyAgICAgICAg
dGhpcy56ZXJvU2xvcGVBdFN0YXJ0ICAgPSB0cnVlOyAgICAgLy8gZm9yIHNtb290aCBpbnRlcnBv
bGF0aW9uIHcvbyBzZXBhcmF0ZQorICAgICAgICB0aGlzLnplcm9TbG9wZUF0RW5kICAgICA9IHRy
dWU7ICAgICAvLyBjbGlwcyBmb3Igc3RhcnQsIGxvb3AgYW5kIGVuZAorCisgICAgfQorCisgICAg
T2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQWN0aW9uLnByb3RvdHlwZSwgeworCisgICAgICAgIC8v
IFN0YXRlICYgU2NoZWR1bGluZworCisgICAgICAgIHBsYXk6IGZ1bmN0aW9uKCkgeworCisgICAg
ICAgICAgICB0aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24oIHRoaXMgKTsKKworICAgICAgICAg
ICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBzdG9wOiBmdW5jdGlvbigp
IHsKKworICAgICAgICAgICAgdGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24oIHRoaXMgKTsK
KworICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzZXQoKTsKKworICAgICAgICB9LAorCisgICAg
ICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKKworICAgICAgICAgICAgdGhpcy5wYXVzZWQgPSBmYWxz
ZTsKKyAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7CisKKyAgICAgICAgICAgIHRoaXMu
dGltZSA9IDA7ICAgICAgICAgIC8vIHJlc3RhcnQgY2xpcAorICAgICAgICAgICAgdGhpcy5fbG9v
cENvdW50ID0gLTE7ICAgLy8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzCisgICAgICAgICAgICB0aGlz
Ll9zdGFydFRpbWUgPSBudWxsOyAvLyBmb3JnZXQgc2NoZWR1bGluZworCisgICAgICAgICAgICBy
ZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTsKKworICAgICAgICB9LAorCisg
ICAgICAgIGlzUnVubmluZzogZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlz
LmVuYWJsZWQgJiYgISB0aGlzLnBhdXNlZCAmJiB0aGlzLnRpbWVTY2FsZSAhPT0gMCAmJgorICAg
ICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFRpbWUgPT09IG51bGwgJiYgdGhpcy5fbWl4ZXIu
X2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7CisKKyAgICAgICAgfSwKKworICAgICAgICAvLyByZXR1
cm4gdHJ1ZSB3aGVuIHBsYXkgaGFzIGJlZW4gY2FsbGVkCisgICAgICAgIGlzU2NoZWR1bGVkOiBm
dW5jdGlvbigpIHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFj
dGlvbiggdGhpcyApOworCisgICAgICAgIH0sCisKKyAgICAgICAgc3RhcnRBdDogZnVuY3Rpb24o
IHRpbWUgKSB7CisKKyAgICAgICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IHRpbWU7CisKKyAgICAg
ICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0TG9vcDogZnVu
Y3Rpb24oIG1vZGUsIHJlcGV0aXRpb25zICkgeworCisgICAgICAgICAgICB0aGlzLmxvb3AgPSBt
b2RlOworICAgICAgICAgICAgdGhpcy5yZXBldGl0aW9ucyA9IHJlcGV0aXRpb25zOworCisgICAg
ICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIC8vIFdlaWdodAor
CisgICAgICAgIC8vIHNldCB0aGUgd2VpZ2h0IHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgZmFkaW5n
CisgICAgICAgIC8vIGFsdGhvdWdoIC5lbmFibGVkID0gZmFsc2UgeWllbGRzIGFuIGVmZmVjdGl2
ZSB3ZWlnaHQgb2YgemVybywgdGhpcworICAgICAgICAvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFu
Z2UgLmVuYWJsZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nCisgICAgICAgIHNldEVm
ZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24oIHdlaWdodCApIHsKKworICAgICAgICAgICAgdGhpcy53
ZWlnaHQgPSB3ZWlnaHQ7CisKKyAgICAgICAgICAgIC8vIG5vdGU6IHNhbWUgbG9naWMgYXMgd2hl
biB1cGRhdGVkIGF0IHJ1bnRpbWUKKyAgICAgICAgICAgIHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9
IHRoaXMuZW5hYmxlZCA/IHdlaWdodCA6IDA7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnN0
b3BGYWRpbmcoKTsKKworICAgICAgICB9LAorCisgICAgICAgIC8vIHJldHVybiB0aGUgd2VpZ2h0
IGNvbnNpZGVyaW5nIGZhZGluZyBhbmQgLmVuYWJsZWQKKyAgICAgICAgZ2V0RWZmZWN0aXZlV2Vp
Z2h0OiBmdW5jdGlvbigpIHsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdl
aWdodDsKKworICAgICAgICB9LAorCisgICAgICAgIGZhZGVJbjogZnVuY3Rpb24oIGR1cmF0aW9u
ICkgeworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9u
LCAwLCAxICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBmYWRlT3V0OiBmdW5jdGlvbiggZHVy
YXRpb24gKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVy
YXRpb24sIDEsIDAgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGNyb3NzRmFkZUZyb206IGZ1
bmN0aW9uKCBmYWRlT3V0QWN0aW9uLCBkdXJhdGlvbiwgd2FycCApIHsKKworICAgICAgICAgICAg
ZmFkZU91dEFjdGlvbi5mYWRlT3V0KCBkdXJhdGlvbiApOworICAgICAgICAgICAgdGhpcy5mYWRl
SW4oIGR1cmF0aW9uICk7CisKKyAgICAgICAgICAgIGlmKCB3YXJwICkgeworCisgICAgICAgICAg
ICAgICAgdmFyIGZhZGVJbkR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbiwKKyAgICAgICAg
ICAgICAgICAgICAgZmFkZU91dER1cmF0aW9uID0gZmFkZU91dEFjdGlvbi5fY2xpcC5kdXJhdGlv
biwKKworICAgICAgICAgICAgICAgICAgICBzdGFydEVuZFJhdGlvID0gZmFkZU91dER1cmF0aW9u
IC8gZmFkZUluRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIGVuZFN0YXJ0UmF0aW8gPSBm
YWRlSW5EdXJhdGlvbiAvIGZhZGVPdXREdXJhdGlvbjsKKworICAgICAgICAgICAgICAgIGZhZGVP
dXRBY3Rpb24ud2FycCggMS4wLCBzdGFydEVuZFJhdGlvLCBkdXJhdGlvbiApOworICAgICAgICAg
ICAgICAgIHRoaXMud2FycCggZW5kU3RhcnRSYXRpbywgMS4wLCBkdXJhdGlvbiApOworCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAg
ICAgICAgY3Jvc3NGYWRlVG86IGZ1bmN0aW9uKCBmYWRlSW5BY3Rpb24sIGR1cmF0aW9uLCB3YXJw
ICkgeworCisgICAgICAgICAgICByZXR1cm4gZmFkZUluQWN0aW9uLmNyb3NzRmFkZUZyb20oIHRo
aXMsIGR1cmF0aW9uLCB3YXJwICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBzdG9wRmFkaW5n
OiBmdW5jdGlvbigpIHsKKworICAgICAgICAgICAgdmFyIHdlaWdodEludGVycG9sYW50ID0gdGhp
cy5fd2VpZ2h0SW50ZXJwb2xhbnQ7CisKKyAgICAgICAgICAgIGlmICggd2VpZ2h0SW50ZXJwb2xh
bnQgIT09IG51bGwgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLl93ZWlnaHRJbnRlcnBvbGFu
dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbElu
dGVycG9sYW50KCB3ZWlnaHRJbnRlcnBvbGFudCApOworCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gVGltZSBTY2Fs
ZSBDb250cm9sCisKKyAgICAgICAgLy8gc2V0IHRoZSB0aW1lIHNjYWxlIHN0b3BwaW5nIGFueSBz
Y2hlZHVsZWQgd2FycGluZworICAgICAgICAvLyBhbHRob3VnaCAucGF1c2VkID0gdHJ1ZSB5aWVs
ZHMgYW4gZWZmZWN0aXZlIHRpbWUgc2NhbGUgb2YgemVybywgdGhpcworICAgICAgICAvLyBtZXRo
b2QgZG9lcyAqbm90KiBjaGFuZ2UgLnBhdXNlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNp
bmcKKyAgICAgICAgc2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbiggdGltZVNjYWxlICkg
eworCisgICAgICAgICAgICB0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTsKKyAgICAgICAgICAg
IHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRoaXMucGF1c2VkID8gMCA6dGltZVNjYWxlOwor
CisgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9wV2FycGluZygpOworCisgICAgICAgIH0sCisK
KyAgICAgICAgLy8gcmV0dXJuIHRoZSB0aW1lIHNjYWxlIGNvbnNpZGVyaW5nIHdhcnBpbmcgYW5k
IC5wYXVzZWQKKyAgICAgICAgZ2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbigpIHsKKwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZTsKKworICAgICAgICB9
LAorCisgICAgICAgIHNldER1cmF0aW9uOiBmdW5jdGlvbiggZHVyYXRpb24gKSB7CisKKyAgICAg
ICAgICAgIHRoaXMudGltZVNjYWxlID0gdGhpcy5fY2xpcC5kdXJhdGlvbiAvIGR1cmF0aW9uOwor
CisgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9wV2FycGluZygpOworCisgICAgICAgIH0sCisK
KyAgICAgICAgc3luY1dpdGg6IGZ1bmN0aW9uKCBhY3Rpb24gKSB7CisKKyAgICAgICAgICAgIHRo
aXMudGltZSA9IGFjdGlvbi50aW1lOworICAgICAgICAgICAgdGhpcy50aW1lU2NhbGUgPSBhY3Rp
b24udGltZVNjYWxlOworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9wV2FycGluZygpOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgaGFsdDogZnVuY3Rpb24oIGR1cmF0aW9uICkgeworCisg
ICAgICAgICAgICByZXR1cm4gdGhpcy53YXJwKCB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsIDAs
IGR1cmF0aW9uICk7CisKKyAgICAgICAgfSwKKworICAgICAgICB3YXJwOiBmdW5jdGlvbiggc3Rh
cnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7CisKKyAgICAgICAgICAgIHZh
ciBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBtaXhlci50aW1lLAorICAgICAgICAgICAgICAg
IGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsCisKKyAgICAgICAgICAg
ICAgICB0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTsKKworICAgICAgICAgICAgaWYgKCBpbnRl
cnBvbGFudCA9PT0gbnVsbCApIHsKKworICAgICAgICAgICAgICAgIGludGVycG9sYW50ID0gbWl4
ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTsKKyAgICAgICAgICAgICAgICB0aGlzLl90aW1l
U2NhbGVJbnRlcnBvbGFudCA9IGludGVycG9sYW50OworCisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIHZhciB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucywKKyAgICAg
ICAgICAgICAgICB2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7CisKKyAgICAgICAg
ICAgIHRpbWVzWyAwIF0gPSBub3c7CisgICAgICAgICAgICB0aW1lc1sgMSBdID0gbm93ICsgZHVy
YXRpb247CisKKyAgICAgICAgICAgIHZhbHVlc1sgMCBdID0gc3RhcnRUaW1lU2NhbGUgLyB0aW1l
U2NhbGU7CisgICAgICAgICAgICB2YWx1ZXNbIDEgXSA9IGVuZFRpbWVTY2FsZSAvIHRpbWVTY2Fs
ZTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBz
dG9wV2FycGluZzogZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIHZhciB0aW1lU2NhbGVJbnRl
cnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50OworCisgICAgICAgICAgICBpZiAo
IHRpbWVTY2FsZUludGVycG9sYW50ICE9PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgdGhp
cy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsOworICAgICAgICAgICAgICAgIHRoaXMuX21p
eGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggdGltZVNjYWxlSW50ZXJwb2xhbnQgKTsK
KworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9
LAorCisgICAgICAgIC8vIE9iamVjdCBBY2Nlc3NvcnMKKworICAgICAgICBnZXRNaXhlcjogZnVu
Y3Rpb24oKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9taXhlcjsKKworICAgICAgICB9
LAorCisgICAgICAgIGdldENsaXA6IGZ1bmN0aW9uKCkgeworCisgICAgICAgICAgICByZXR1cm4g
dGhpcy5fY2xpcDsKKworICAgICAgICB9LAorCisgICAgICAgIGdldFJvb3Q6IGZ1bmN0aW9uKCkg
eworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxSb290IHx8IHRoaXMuX21peGVyLl9y
b290OworCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gSW50ZXJuYQorCisgICAgICAgIF91cGRh
dGU6IGZ1bmN0aW9uKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCAp
IHsKKworICAgICAgICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBtaXhlcgorCisgICAgICAgICAgICBp
ZiAoICEgdGhpcy5lbmFibGVkICkgeworCisgICAgICAgICAgICAgICAgLy8gY2FsbCAuX3VwZGF0
ZVdlaWdodCgpIHRvIHVwZGF0ZSAuX2VmZmVjdGl2ZVdlaWdodAorCisgICAgICAgICAgICAgICAg
dGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworCisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzdGFydFRpbWUgPSB0aGlzLl9zdGFydFRp
bWU7CisKKyAgICAgICAgICAgIGlmICggc3RhcnRUaW1lICE9PSBudWxsICkgeworCisgICAgICAg
ICAgICAgICAgLy8gY2hlY2sgZm9yIHNjaGVkdWxlZCBzdGFydCBvZiBhY3Rpb24KKworICAgICAg
ICAgICAgICAgIHZhciB0aW1lUnVubmluZyA9ICggdGltZSAtIHN0YXJ0VGltZSApICogdGltZURp
cmVjdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAoIHRpbWVSdW5uaW5nIDwgMCB8fCB0aW1lRGly
ZWN0aW9uID09PSAwICkgeworCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8geWV0IHRv
IGNvbWUgLyBkb24ndCBkZWNpZGUgd2hlbiBkZWx0YSA9IDAKKworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIC8vIHN0YXJ0CisKKyAgICAgICAgICAgICAgICB0aGlzLl9zdGFy
dFRpbWUgPSBudWxsOyAvLyB1bnNjaGVkdWxlCisgICAgICAgICAgICAgICAgZGVsdGFUaW1lID0g
dGltZURpcmVjdGlvbiAqIHRpbWVSdW5uaW5nOworCisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIC8vIGFwcGx5IHRpbWUgc2NhbGUgYW5kIGFkdmFuY2UgdGltZQorCisgICAgICAgICAgICBk
ZWx0YVRpbWUgKj0gdGhpcy5fdXBkYXRlVGltZVNjYWxlKCB0aW1lICk7CisgICAgICAgICAgICB2
YXIgY2xpcFRpbWUgPSB0aGlzLl91cGRhdGVUaW1lKCBkZWx0YVRpbWUgKTsKKworICAgICAgICAg
ICAgLy8gbm90ZTogX3VwZGF0ZVRpbWUgbWF5IGRpc2FibGUgdGhlIGFjdGlvbiByZXN1bHRpbmcg
aW4KKyAgICAgICAgICAgIC8vIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgMAorCisgICAgICAgICAg
ICB2YXIgd2VpZ2h0ID0gdGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7CisKKyAgICAgICAgICAg
IGlmICggd2VpZ2h0ID4gMCApIHsKKworICAgICAgICAgICAgICAgIHZhciBpbnRlcnBvbGFudHMg
PSB0aGlzLl9pbnRlcnBvbGFudHM7CisgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TWl4ZXJz
ID0gdGhpcy5fcHJvcGVydHlCaW5kaW5nczsKKworICAgICAgICAgICAgICAgIGZvciAoIHZhciBq
ID0gMCwgbSA9IGludGVycG9sYW50cy5sZW5ndGg7IGogIT09IG07ICsrIGogKSB7CisKKyAgICAg
ICAgICAgICAgICAgICAgaW50ZXJwb2xhbnRzWyBqIF0uZXZhbHVhdGUoIGNsaXBUaW1lICk7Cisg
ICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWl4ZXJzWyBqIF0uYWNjdW11bGF0ZSggYWNjdUlu
ZGV4LCB3ZWlnaHQgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisg
ICAgICAgIH0sCisKKyAgICAgICAgX3VwZGF0ZVdlaWdodDogZnVuY3Rpb24oIHRpbWUgKSB7CisK
KyAgICAgICAgICAgIHZhciB3ZWlnaHQgPSAwOworCisgICAgICAgICAgICBpZiAoIHRoaXMuZW5h
YmxlZCApIHsKKworICAgICAgICAgICAgICAgIHdlaWdodCA9IHRoaXMud2VpZ2h0OworICAgICAg
ICAgICAgICAgIHZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50OworCisg
ICAgICAgICAgICAgICAgaWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCApIHsKKworICAgICAgICAg
ICAgICAgICAgICB2YXIgaW50ZXJwb2xhbnRWYWx1ZSA9IGludGVycG9sYW50LmV2YWx1YXRlKCB0
aW1lIClbIDAgXTsKKworICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgKj0gaW50ZXJwb2xhbnRW
YWx1ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHRpbWUgPiBpbnRlcnBvbGFudC5wYXJh
bWV0ZXJQb3NpdGlvbnNbIDEgXSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5z
dG9wRmFkaW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW50ZXJwb2xhbnRW
YWx1ZSA9PT0gMCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhZGVkIG91
dCwgZGlzYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IGZh
bHNlOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRo
aXMuX2VmZmVjdGl2ZVdlaWdodCA9IHdlaWdodDsKKyAgICAgICAgICAgIHJldHVybiB3ZWlnaHQ7
CisKKyAgICAgICAgfSwKKworICAgICAgICBfdXBkYXRlVGltZVNjYWxlOiBmdW5jdGlvbiggdGlt
ZSApIHsKKworICAgICAgICAgICAgdmFyIHRpbWVTY2FsZSA9IDA7CisKKyAgICAgICAgICAgIGlm
ICggISB0aGlzLnBhdXNlZCApIHsKKworICAgICAgICAgICAgICAgIHRpbWVTY2FsZSA9IHRoaXMu
dGltZVNjYWxlOworCisgICAgICAgICAgICAgICAgdmFyIGludGVycG9sYW50ID0gdGhpcy5fdGlt
ZVNjYWxlSW50ZXJwb2xhbnQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIGludGVycG9sYW50ICE9
PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnBvbGFudFZhbHVlID0g
aW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdOworCisgICAgICAgICAgICAgICAgICAg
IHRpbWVTY2FsZSAqPSBpbnRlcnBvbGFudFZhbHVlOworCisgICAgICAgICAgICAgICAgICAgIGlm
ICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkgeworCisgICAg
ICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BXYXJwaW5nKCk7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICggdGltZVNjYWxlID09PSAwICkgeworCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gbW90aW9uIGhhcyBoYWx0ZWQsIHBhdXNlCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdGhpcy5wYXVzZWQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICB9
IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FycCBkb25lIC0gYXBw
bHkgZmluYWwgdGltZSBzY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGlt
ZVNjYWxlID0gdGltZVNjYWxlOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRpbWVTY2FsZTsKKyAgICAg
ICAgICAgIHJldHVybiB0aW1lU2NhbGU7CisKKyAgICAgICAgfSwKKworICAgICAgICBfdXBkYXRl
VGltZTogZnVuY3Rpb24oIGRlbHRhVGltZSApIHsKKworICAgICAgICAgICAgdmFyIHRpbWUgPSB0
aGlzLnRpbWUgKyBkZWx0YVRpbWU7CisKKyAgICAgICAgICAgIGlmICggZGVsdGFUaW1lID09PSAw
ICkgcmV0dXJuIHRpbWU7CisKKyAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IHRoaXMuX2NsaXAu
ZHVyYXRpb24sCisKKyAgICAgICAgICAgICAgICBsb29wID0gdGhpcy5sb29wLAorICAgICAgICAg
ICAgICAgIGxvb3BDb3VudCA9IHRoaXMuX2xvb3BDb3VudDsKKworICAgICAgICAgICAgaWYgKCBs
b29wID09PSBMb29wT25jZSApIHsKKworICAgICAgICAgICAgICAgIGlmICggbG9vcENvdW50ID09
PSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBzdGFydGVkCisKKyAgICAgICAg
ICAgICAgICAgICAgdGhpcy5fbG9vcENvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdGhp
cy5fc2V0RW5kaW5ncyggdHJ1ZSwgdHJ1ZSwgZmFsc2UgKTsKKworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIGhhbmRsZV9zdG9wOiB7CisKKyAgICAgICAgICAgICAgICAgICAg
aWYgKCB0aW1lID49IGR1cmF0aW9uICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1l
ID0gZHVyYXRpb247CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdGltZSA8IDAg
KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgPSAwOworCisgICAgICAgICAgICAg
ICAgICAgIH0gZWxzZSBicmVhayBoYW5kbGVfc3RvcDsKKworICAgICAgICAgICAgICAgICAgICBp
ZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7CisgICAgICAg
ICAgICAgICAgICAgIGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAg
ICAgICAgdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCggeworICAgICAgICAgICAgICAgICAgICAg
ICAgdHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgZGlyZWN0aW9uOiBkZWx0YVRpbWUgPCAwID8gLTEgOiAxCisgICAgICAgICAgICAgICAgICAg
IH0gKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsgLy8gcmVw
ZXRpdGl2ZSBSZXBlYXQgb3IgUGluZ1BvbmcKKworICAgICAgICAgICAgICAgIHZhciBwaW5nUG9u
ZyA9ICggbG9vcCA9PT0gTG9vcFBpbmdQb25nICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGxv
b3BDb3VudCA9PT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGp1c3Qgc3RhcnRlZAor
CisgICAgICAgICAgICAgICAgICAgIGlmICggZGVsdGFUaW1lID49IDAgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGxvb3BDb3VudCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IHRoaXMuX3NldEVuZGluZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUs
IHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHBpbmdQb25nICk7CisKKyAgICAgICAgICAgICAgICAg
ICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBsb29waW5nIGlu
IHJldmVyc2UgZGlyZWN0aW9uLCB0aGUgaW5pdGlhbAorICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gdHJhbnNpdGlvbiB0aHJvdWdoIHplcm8gY291bnRzIGFzIGEgcmVwZXRpdGlvbiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIHNvIGxlYXZlIGxvb3BDb3VudCBhdCAtMQorCisgICAgICAg
ICAgICAgICAgICAgICAgICB0aGlzLl9zZXRFbmRpbmdzKAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0aGlzLnJlcGV0aXRpb25zID09PSAwLCB0cnVlLCBwaW5nUG9uZyApOworCisg
ICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIGlmICggdGltZSA+PSBkdXJhdGlvbiB8fCB0aW1lIDwgMCApIHsKKyAgICAgICAgICAgICAg
ICAgICAgLy8gd3JhcCBhcm91bmQKKworICAgICAgICAgICAgICAgICAgICB2YXIgbG9vcERlbHRh
ID0gTWF0aC5mbG9vciggdGltZSAvIGR1cmF0aW9uICk7IC8vIHNpZ25lZAorICAgICAgICAgICAg
ICAgICAgICB0aW1lIC09IGR1cmF0aW9uICogbG9vcERlbHRhOworCisgICAgICAgICAgICAgICAg
ICAgIGxvb3BDb3VudCArPSBNYXRoLmFicyggbG9vcERlbHRhICk7CisKKyAgICAgICAgICAgICAg
ICAgICAgdmFyIHBlbmRpbmcgPSB0aGlzLnJlcGV0aXRpb25zIC0gbG9vcENvdW50OworCisgICAg
ICAgICAgICAgICAgICAgIGlmICggcGVuZGluZyA8IDAgKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBoYXZlIHRvIHN0b3AgKHN3aXRjaCBzdGF0ZSwgY2xhbXAgdGltZSwgZmlyZSBldmVu
dCkKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVk
ICkgdGhpcy5wYXVzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB0aGlz
LmVuYWJsZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGltZSA9IGRlbHRh
VGltZSA+IDAgPyBkdXJhdGlvbiA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMu
X21peGVyLmRpc3BhdGNoRXZlbnQoIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBl
OiAnZmluaXNoZWQnLCBhY3Rpb246IHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGlyZWN0aW9uOiBkZWx0YVRpbWUgPiAwID8gMSA6IC0xCisgICAgICAgICAgICAgICAgICAgICAg
ICB9ICk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIGtlZXAgcnVubmluZworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBl
bmRpbmcgPT09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50ZXJpbmcg
dGhlIGxhc3Qgcm91bmQKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdFN0YXJ0
ID0gZGVsdGFUaW1lIDwgMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRF
bmRpbmdzKCBhdFN0YXJ0LCAhIGF0U3RhcnQsIHBpbmdQb25nICk7CisKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9z
ZXRFbmRpbmdzKCBmYWxzZSwgZmFsc2UsIHBpbmdQb25nICk7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9vcENvdW50ID0gbG9v
cENvdW50OworCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9taXhlci5kaXNwYXRjaEV2
ZW50KCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xvb3AnLCBhY3Rpb246
IHRoaXMsIGxvb3BEZWx0YTogbG9vcERlbHRhCisgICAgICAgICAgICAgICAgICAgICAgICB9ICk7
CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAgICAgaWYgKCBwaW5nUG9uZyAmJiAoIGxvb3BDb3VudCAmIDEgKSA9PT0gMSApIHsKKyAg
ICAgICAgICAgICAgICAgICAgLy8gaW52ZXJ0IHRpbWUgZm9yIHRoZSAicG9uZyByb3VuZCIKKwor
ICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUgPSB0aW1lOworICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZHVyYXRpb24gLSB0aW1lOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudGltZSA9IHRpbWU7CisgICAgICAgICAgICByZXR1
cm4gdGltZTsKKworICAgICAgICB9LAorCisgICAgICAgIF9zZXRFbmRpbmdzOiBmdW5jdGlvbigg
YXRTdGFydCwgYXRFbmQsIHBpbmdQb25nICkgeworCisgICAgICAgICAgICB2YXIgc2V0dGluZ3Mg
PSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzOworCisgICAgICAgICAgICBpZiAoIHBpbmdQb25n
ICkgeworCisgICAgICAgICAgICAgICAgc2V0dGluZ3MuZW5kaW5nU3RhcnQgICAgPSBaZXJvU2xv
cGVFbmRpbmc7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MuZW5kaW5nRW5kICAgICAgPSBaZXJv
U2xvcGVFbmRpbmc7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAv
LyBhc3N1bWluZyBmb3IgTG9vcE9uY2UgYXRTdGFydCA9PSBhdEVuZCA9PSB0cnVlCisKKyAgICAg
ICAgICAgICAgICBpZiAoIGF0U3RhcnQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgc2V0dGlu
Z3MuZW5kaW5nU3RhcnQgPSB0aGlzLnplcm9TbG9wZUF0U3RhcnQgPworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7CisKKyAg
ICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmVu
ZGluZ1N0YXJ0ID0gV3JhcEFyb3VuZEVuZGluZzsKKworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIGlmICggYXRFbmQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgc2V0dGlu
Z3MuZW5kaW5nRW5kID0gdGhpcy56ZXJvU2xvcGVBdEVuZCA/CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZzsKKworICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZW5kaW5n
RW5kICAgPSBXcmFwQXJvdW5kRW5kaW5nOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgfSwKKworICAgICAgICBfc2NoZWR1bGVGYWRpbmc6IGZ1bmN0aW9u
KCBkdXJhdGlvbiwgd2VpZ2h0Tm93LCB3ZWlnaHRUaGVuICkgeworCisgICAgICAgICAgICB2YXIg
bWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSwKKyAgICAgICAgICAgICAgICBp
bnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50OworCisgICAgICAgICAgICBpZiAo
IGludGVycG9sYW50ID09PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgaW50ZXJwb2xhbnQg
PSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpOworICAgICAgICAgICAgICAgIHRoaXMu
X3dlaWdodEludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgdmFyIHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLAorICAg
ICAgICAgICAgICAgIHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlczsKKworICAgICAg
ICAgICAgdGltZXNbIDAgXSA9IG5vdzsgICAgICAgICAgICAgICB2YWx1ZXNbIDAgXSA9IHdlaWdo
dE5vdzsKKyAgICAgICAgICAgIHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjsgICAgdmFsdWVz
WyAxIF0gPSB3ZWlnaHRUaGVuOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAg
ICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFBsYXllciBmb3IgQW5p
bWF0aW9uQ2xpcHMuCisgICAgICoKKyAgICAgKgorICAgICAqIEBhdXRob3IgQmVuIEhvdXN0b24g
LyBodHRwOi8vY2xhcmEuaW8vCisgICAgICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9s
aWdodGhhdXMudXMvCisgICAgICogQGF1dGhvciB0c2NodworICAgICAqLworCisgICAgZnVuY3Rp
b24gQW5pbWF0aW9uTWl4ZXIoIHJvb3QgKSB7CisKKyAgICAgICAgdGhpcy5fcm9vdCA9IHJvb3Q7
CisgICAgICAgIHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7CisgICAgICAgIHRoaXMuX2FjY3VJ
bmRleCA9IDA7CisKKyAgICAgICAgdGhpcy50aW1lID0gMDsKKworICAgICAgICB0aGlzLnRpbWVT
Y2FsZSA9IDEuMDsKKworICAgIH0KKworICAgIE9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbk1peGVy
LnByb3RvdHlwZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwgeworCisgICAgICAgIF9iaW5k
QWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiwgcHJvdG90eXBlQWN0aW9uICkgeworCisgICAgICAg
ICAgICB2YXIgcm9vdCA9IGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QsCisgICAgICAg
ICAgICAgICAgdHJhY2tzID0gYWN0aW9uLl9jbGlwLnRyYWNrcywKKyAgICAgICAgICAgICAgICBu
VHJhY2tzID0gdHJhY2tzLmxlbmd0aCwKKyAgICAgICAgICAgICAgICBiaW5kaW5ncyA9IGFjdGlv
bi5fcHJvcGVydHlCaW5kaW5ncywKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGFudHMgPSBhY3Rp
b24uX2ludGVycG9sYW50cywKKyAgICAgICAgICAgICAgICByb290VXVpZCA9IHJvb3QudXVpZCwK
KyAgICAgICAgICAgICAgICBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5k
TmFtZSwKKyAgICAgICAgICAgICAgICBiaW5kaW5nc0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyBy
b290VXVpZCBdOworCisgICAgICAgICAgICBpZiAoIGJpbmRpbmdzQnlOYW1lID09PSB1bmRlZmlu
ZWQgKSB7CisKKyAgICAgICAgICAgICAgICBiaW5kaW5nc0J5TmFtZSA9IHt9OworICAgICAgICAg
ICAgICAgIGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ3NCeU5hbWU7CisKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tz
OyArKyBpICkgeworCisgICAgICAgICAgICAgICAgdmFyIHRyYWNrID0gdHJhY2tzWyBpIF0sCisg
ICAgICAgICAgICAgICAgICAgIHRyYWNrTmFtZSA9IHRyYWNrLm5hbWUsCisgICAgICAgICAgICAg
ICAgICAgIGJpbmRpbmcgPSBiaW5kaW5nc0J5TmFtZVsgdHJhY2tOYW1lIF07CisKKyAgICAgICAg
ICAgICAgICBpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAg
ICAgICBiaW5kaW5nc1sgaSBdID0gYmluZGluZzsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7
CisKKyAgICAgICAgICAgICAgICAgICAgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07CisKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGJpbmRpbmcsIG1ha2Ugc3VyZSB0aGUgY2FjaGUg
a25vd3MKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBiaW5kaW5nLl9jYWNoZUluZGV4
ID09PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKysgYmluZGluZy5y
ZWZlcmVuY2VDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRJbmFj
dGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBw
cm90b3R5cGVBY3Rpb24gJiYgcHJvdG90eXBlQWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIF9wcm9wZXJ0eUJpbmRpbmdzWyBpIF0uYmluZGluZy5wYXJzZWRQYXRoOworCisgICAg
ICAgICAgICAgICAgICAgIGJpbmRpbmcgPSBuZXcgUHJvcGVydHlNaXhlcigKKyAgICAgICAgICAg
ICAgICAgICAgICAgIFByb3BlcnR5QmluZGluZy5jcmVhdGUoIHJvb3QsIHRyYWNrTmFtZSwgcGF0
aCApLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2suVmFsdWVUeXBlTmFtZSwgdHJhY2su
Z2V0VmFsdWVTaXplKCkgKTsKKworICAgICAgICAgICAgICAgICAgICArKyBiaW5kaW5nLnJlZmVy
ZW5jZUNvdW50OworICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmco
IGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTsKKworICAgICAgICAgICAgICAgICAgICBi
aW5kaW5nc1sgaSBdID0gYmluZGluZzsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIGludGVycG9sYW50c1sgaSBdLnJlc3VsdEJ1ZmZlciA9IGJpbmRpbmcuYnVmZmVyOwor
CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSwKKworICAgICAgICBfYWN0aXZhdGVBY3Rpb246
IGZ1bmN0aW9uICggYWN0aW9uICkgeworCisgICAgICAgICAgICBpZiAoICEgdGhpcy5faXNBY3Rp
dmVBY3Rpb24oIGFjdGlvbiApICkgeworCisgICAgICAgICAgICAgICAgaWYgKCBhY3Rpb24uX2Nh
Y2hlSW5kZXggPT09IG51bGwgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhY3Rp
b24gaGFzIGJlZW4gZm9yZ290dGVuIGJ5IHRoZSBjYWNoZSwgYnV0IHRoZSB1c2VyCisgICAgICAg
ICAgICAgICAgICAgIC8vIGFwcGVhcnMgdG8gYmUgc3RpbGwgdXNpbmcgaXQgLT4gcmViaW5kCisK
KyAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8
fCB0aGlzLl9yb290ICkudXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBVdWlkID0g
YWN0aW9uLl9jbGlwLnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zRm9yQ2xp
cCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CisKKyAgICAgICAgICAgICAgICAg
ICAgdGhpcy5fYmluZEFjdGlvbiggYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0
aW9uc0ZvckNsaXAgJiYgYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF0gKTsKKworICAg
ICAgICAgICAgICAgICAgICB0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggYWN0aW9uLCBjbGlwVXVp
ZCwgcm9vdFV1aWQgKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZh
ciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5nczsKKworICAgICAgICAgICAgICAg
IC8vIGluY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGUKKyAgICAgICAg
ICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsr
IGkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBd
OworCisgICAgICAgICAgICAgICAgICAgIGlmICggYmluZGluZy51c2VDb3VudCArKyA9PT0gMCAp
IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGVuZEJpbmRpbmcoIGJpbmRpbmcg
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuc2F2ZU9yaWdpbmFsU3RhdGUoKTsK
KworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICB0aGlzLl9sZW5kQWN0aW9uKCBhY3Rpb24gKTsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgIH0sCisKKyAgICAgICAgX2RlYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9u
ICkgeworCisgICAgICAgICAgICBpZiAoIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSAp
IHsKKworICAgICAgICAgICAgICAgIHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5k
aW5nczsKKworICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8g
c29ydCBvdXQgc3RhdGUKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5k
aW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdmFy
IGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdOworCisgICAgICAgICAgICAgICAgICAgIGlmICggLS0g
YmluZGluZy51c2VDb3VudCA9PT0gMCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgYmlu
ZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhp
cy5fdGFrZUJhY2tCaW5kaW5nKCBiaW5kaW5nICk7CisKKyAgICAgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy5fdGFrZUJhY2tBY3Rp
b24oIGFjdGlvbiApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSwKKworICAgICAgICAv
LyBNZW1vcnkgbWFuYWdlcgorCisgICAgICAgIF9pbml0TWVtb3J5TWFuYWdlcjogZnVuY3Rpb24g
KCkgeworCisgICAgICAgICAgICB0aGlzLl9hY3Rpb25zID0gW107IC8vICduQWN0aXZlQWN0aW9u
cycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lcworICAgICAgICAgICAgdGhpcy5fbkFjdGl2ZUFj
dGlvbnMgPSAwOworCisgICAgICAgICAgICB0aGlzLl9hY3Rpb25zQnlDbGlwID0ge307CisgICAg
ICAgICAgICAvLyBpbnNpZGU6CisgICAgICAgICAgICAvLyB7CisgICAgICAgICAgICAvLyAgICAg
IGtub3duQWN0aW9uczogQXJyYXk8IEFuaW1hdGlvbkFjdGlvbiA+ICAtIHVzZWQgYXMgcHJvdG90
eXBlcworICAgICAgICAgICAgLy8gICAgICBhY3Rpb25CeVJvb3Q6IEFuaW1hdGlvbkFjdGlvbiAg
ICAgICAgICAgLSBsb29rdXAKKyAgICAgICAgICAgIC8vIH0KKworCisgICAgICAgICAgICB0aGlz
Ll9iaW5kaW5ncyA9IFtdOyAvLyAnbkFjdGl2ZUJpbmRpbmdzJyBmb2xsb3dlZCBieSBpbmFjdGl2
ZSBvbmVzCisgICAgICAgICAgICB0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwOworCisgICAgICAg
ICAgICB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUgPSB7fTsgLy8gaW5zaWRlOiBNYXA8IG5h
bWUsIFByb3BlcnR5TWl4ZXIgPgorCisKKyAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xJbnRlcnBv
bGFudHMgPSBbXTsgLy8gc2FtZSBnYW1lIGFzIGFib3ZlCisgICAgICAgICAgICB0aGlzLl9uQWN0
aXZlQ29udHJvbEludGVycG9sYW50cyA9IDA7CisKKyAgICAgICAgICAgIHZhciBzY29wZSA9IHRo
aXM7CisKKyAgICAgICAgICAgIHRoaXMuc3RhdHMgPSB7CisKKyAgICAgICAgICAgICAgICBhY3Rp
b25zOiB7CisgICAgICAgICAgICAgICAgICAgIGdldCB0b3RhbCgpIHsgcmV0dXJuIHNjb3BlLl9h
Y3Rpb25zLmxlbmd0aDsgfSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0IGluVXNlKCkgeyByZXR1
cm4gc2NvcGUuX25BY3RpdmVBY3Rpb25zOyB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAg
ICAgICAgICBiaW5kaW5nczogeworICAgICAgICAgICAgICAgICAgICBnZXQgdG90YWwoKSB7IHJl
dHVybiBzY29wZS5fYmluZGluZ3MubGVuZ3RoOyB9LAorICAgICAgICAgICAgICAgICAgICBnZXQg
aW5Vc2UoKSB7IHJldHVybiBzY29wZS5fbkFjdGl2ZUJpbmRpbmdzOyB9CisgICAgICAgICAgICAg
ICAgfSwKKyAgICAgICAgICAgICAgICBjb250cm9sSW50ZXJwb2xhbnRzOiB7CisgICAgICAgICAg
ICAgICAgICAgIGdldCB0b3RhbCgpIHsgcmV0dXJuIHNjb3BlLl9jb250cm9sSW50ZXJwb2xhbnRz
Lmxlbmd0aDsgfSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0IGluVXNlKCkgeyByZXR1cm4gc2Nv
cGUuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzOyB9CisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB9OworCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gTWVtb3J5IG1hbmFnZW1l
bnQgZm9yIEFuaW1hdGlvbkFjdGlvbiBvYmplY3RzCisKKyAgICAgICAgX2lzQWN0aXZlQWN0aW9u
OiBmdW5jdGlvbiAoIGFjdGlvbiApIHsKKworICAgICAgICAgICAgdmFyIGluZGV4ID0gYWN0aW9u
Ll9jYWNoZUluZGV4OworICAgICAgICAgICAgcmV0dXJuIGluZGV4ICE9PSBudWxsICYmIGluZGV4
IDwgdGhpcy5fbkFjdGl2ZUFjdGlvbnM7CisKKyAgICAgICAgfSwKKworICAgICAgICBfYWRkSW5h
Y3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKSB7CisK
KyAgICAgICAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywKKyAgICAgICAgICAgICAg
ICBhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCwKKyAgICAgICAgICAgICAgICBh
Y3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CisKKyAgICAgICAgICAg
IGlmICggYWN0aW9uc0ZvckNsaXAgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAg
IGFjdGlvbnNGb3JDbGlwID0geworCisgICAgICAgICAgICAgICAgICAgIGtub3duQWN0aW9uczog
WyBhY3Rpb24gXSwKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uQnlSb290OiB7fQorCisgICAg
ICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRl
eCA9IDA7CisKKyAgICAgICAgICAgICAgICBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdID0gYWN0
aW9uc0ZvckNsaXA7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICB2
YXIga25vd25BY3Rpb25zID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zOworCisgICAgICAg
ICAgICAgICAgYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0ga25vd25BY3Rpb25zLmxlbmd0aDsK
KyAgICAgICAgICAgICAgICBrbm93bkFjdGlvbnMucHVzaCggYWN0aW9uICk7CisKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgYWN0aW9uLl9jYWNoZUluZGV4ID0gYWN0aW9ucy5sZW5ndGg7
CisgICAgICAgICAgICBhY3Rpb25zLnB1c2goIGFjdGlvbiApOworCisgICAgICAgICAgICBhY3Rp
b25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gPSBhY3Rpb247CisKKyAgICAgICAg
fSwKKworICAgICAgICBfcmVtb3ZlSW5hY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkg
eworCisgICAgICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsCisgICAgICAgICAg
ICAgICAgbGFzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgYWN0aW9ucy5sZW5ndGggLSAxIF0s
CisgICAgICAgICAgICAgICAgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDsKKworICAg
ICAgICAgICAgbGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDsKKyAg
ICAgICAgICAgIGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjsKKyAg
ICAgICAgICAgIGFjdGlvbnMucG9wKCk7CisKKyAgICAgICAgICAgIGFjdGlvbi5fY2FjaGVJbmRl
eCA9IG51bGw7CisKKworICAgICAgICAgICAgdmFyIGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1
aWQsCisgICAgICAgICAgICAgICAgYWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAs
CisgICAgICAgICAgICAgICAgYWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVp
ZCBdLAorICAgICAgICAgICAgICAgIGtub3duQWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zRm9yQ2xp
cC5rbm93bkFjdGlvbnMsCisKKyAgICAgICAgICAgICAgICBsYXN0S25vd25BY3Rpb24gPQorICAg
ICAgICAgICAgICAgICAgICBrbm93bkFjdGlvbnNGb3JDbGlwWyBrbm93bkFjdGlvbnNGb3JDbGlw
Lmxlbmd0aCAtIDEgXSwKKworICAgICAgICAgICAgICAgIGJ5Q2xpcENhY2hlSW5kZXggPSBhY3Rp
b24uX2J5Q2xpcENhY2hlSW5kZXg7CisKKyAgICAgICAgICAgIGxhc3RLbm93bkFjdGlvbi5fYnlD
bGlwQ2FjaGVJbmRleCA9IGJ5Q2xpcENhY2hlSW5kZXg7CisgICAgICAgICAgICBrbm93bkFjdGlv
bnNGb3JDbGlwWyBieUNsaXBDYWNoZUluZGV4IF0gPSBsYXN0S25vd25BY3Rpb247CisgICAgICAg
ICAgICBrbm93bkFjdGlvbnNGb3JDbGlwLnBvcCgpOworCisgICAgICAgICAgICBhY3Rpb24uX2J5
Q2xpcENhY2hlSW5kZXggPSBudWxsOworCisKKyAgICAgICAgICAgIHZhciBhY3Rpb25CeVJvb3Qg
PSBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3QsCisgICAgICAgICAgICAgICAgcm9vdFV1aWQg
PSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkOworCisgICAgICAgICAg
ICBkZWxldGUgYWN0aW9uQnlSb290WyByb290VXVpZCBdOworCisgICAgICAgICAgICBpZiAoIGtu
b3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoID09PSAwICkgeworCisgICAgICAgICAgICAgICAgZGVs
ZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7CisK
KyAgICAgICAgfSwKKworICAgICAgICBfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbjog
ZnVuY3Rpb24gKCBhY3Rpb24gKSB7CisKKyAgICAgICAgICAgIHZhciBiaW5kaW5ncyA9IGFjdGlv
bi5fcHJvcGVydHlCaW5kaW5nczsKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMCwgbiA9IGJp
bmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKKworICAgICAgICAgICAgICAgIHZhciBi
aW5kaW5nID0gYmluZGluZ3NbIGkgXTsKKworICAgICAgICAgICAgICAgIGlmICggLS0gYmluZGlu
Zy5yZWZlcmVuY2VDb3VudCA9PT0gMCApIHsKKworICAgICAgICAgICAgICAgICAgICB0aGlzLl9y
ZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKTsKKworICAgICAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAgX2xlbmRBY3Rpb246IGZ1bmN0
aW9uICggYWN0aW9uICkgeworCisgICAgICAgICAgICAvLyBbIGFjdGl2ZSBhY3Rpb25zIHwgIGlu
YWN0aXZlIGFjdGlvbnMgIF0KKyAgICAgICAgICAgIC8vIFsgIGFjdGl2ZSBhY3Rpb25zID58IGlu
YWN0aXZlIGFjdGlvbnMgXQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHMgICAgICAg
IGEKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgPC1zd2FwLT4KKyAgICAgICAgICAg
IC8vICAgICAgICAgICAgICAgICBhICAgICAgICBzCisKKyAgICAgICAgICAgIHZhciBhY3Rpb25z
ID0gdGhpcy5fYWN0aW9ucywKKyAgICAgICAgICAgICAgICBwcmV2SW5kZXggPSBhY3Rpb24uX2Nh
Y2hlSW5kZXgsCisKKyAgICAgICAgICAgICAgICBsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0
aXZlQWN0aW9ucyArKywKKworICAgICAgICAgICAgICAgIGZpcnN0SW5hY3RpdmVBY3Rpb24gPSBh
Y3Rpb25zWyBsYXN0QWN0aXZlSW5kZXggXTsKKworICAgICAgICAgICAgYWN0aW9uLl9jYWNoZUlu
ZGV4ID0gbGFzdEFjdGl2ZUluZGV4OworICAgICAgICAgICAgYWN0aW9uc1sgbGFzdEFjdGl2ZUlu
ZGV4IF0gPSBhY3Rpb247CisKKyAgICAgICAgICAgIGZpcnN0SW5hY3RpdmVBY3Rpb24uX2NhY2hl
SW5kZXggPSBwcmV2SW5kZXg7CisgICAgICAgICAgICBhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGZp
cnN0SW5hY3RpdmVBY3Rpb247CisKKyAgICAgICAgfSwKKworICAgICAgICBfdGFrZUJhY2tBY3Rp
b246IGZ1bmN0aW9uICggYWN0aW9uICkgeworCisgICAgICAgICAgICAvLyBbICBhY3RpdmUgYWN0
aW9ucyAgfCBpbmFjdGl2ZSBhY3Rpb25zIF0KKyAgICAgICAgICAgIC8vIFsgYWN0aXZlIGFjdGlv
bnMgfDwgaW5hY3RpdmUgYWN0aW9ucyAgXQorICAgICAgICAgICAgLy8gICAgICAgIGEgICAgICAg
IHMKKyAgICAgICAgICAgIC8vICAgICAgICAgPC1zd2FwLT4KKyAgICAgICAgICAgIC8vICAgICAg
ICBzICAgICAgICBhCisKKyAgICAgICAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywK
KyAgICAgICAgICAgICAgICBwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsCisKKyAgICAg
ICAgICAgICAgICBmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQWN0aW9ucywK
KworICAgICAgICAgICAgICAgIGxhc3RBY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBmaXJzdEluYWN0
aXZlSW5kZXggXTsKKworICAgICAgICAgICAgYWN0aW9uLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFj
dGl2ZUluZGV4OworICAgICAgICAgICAgYWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBh
Y3Rpb247CisKKyAgICAgICAgICAgIGxhc3RBY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2
SW5kZXg7CisgICAgICAgICAgICBhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVBY3Rp
b247CisKKyAgICAgICAgfSwKKworICAgICAgICAvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgUHJv
cGVydHlNaXhlciBvYmplY3RzCisKKyAgICAgICAgX2FkZEluYWN0aXZlQmluZGluZzogZnVuY3Rp
b24gKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICkgeworCisgICAgICAgICAgICB2YXIg
YmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsCisgICAgICAgICAg
ICAgICAgYmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLAorCisgICAg
ICAgICAgICAgICAgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5nczsKKworICAgICAgICAgICAgaWYg
KCBiaW5kaW5nQnlOYW1lID09PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICBiaW5k
aW5nQnlOYW1lID0ge307CisgICAgICAgICAgICAgICAgYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlk
IF0gPSBiaW5kaW5nQnlOYW1lOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJpbmRp
bmdCeU5hbWVbIHRyYWNrTmFtZSBdID0gYmluZGluZzsKKworICAgICAgICAgICAgYmluZGluZy5f
Y2FjaGVJbmRleCA9IGJpbmRpbmdzLmxlbmd0aDsKKyAgICAgICAgICAgIGJpbmRpbmdzLnB1c2go
IGJpbmRpbmcgKTsKKworICAgICAgICB9LAorCisgICAgICAgIF9yZW1vdmVJbmFjdGl2ZUJpbmRp
bmc6IGZ1bmN0aW9uICggYmluZGluZyApIHsKKworICAgICAgICAgICAgdmFyIGJpbmRpbmdzID0g
dGhpcy5fYmluZGluZ3MsCisgICAgICAgICAgICAgICAgcHJvcEJpbmRpbmcgPSBiaW5kaW5nLmJp
bmRpbmcsCisgICAgICAgICAgICAgICAgcm9vdFV1aWQgPSBwcm9wQmluZGluZy5yb290Tm9kZS51
dWlkLAorICAgICAgICAgICAgICAgIHRyYWNrTmFtZSA9IHByb3BCaW5kaW5nLnBhdGgsCisgICAg
ICAgICAgICAgICAgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUs
CisgICAgICAgICAgICAgICAgYmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVp
ZCBdLAorCisgICAgICAgICAgICAgICAgbGFzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBi
aW5kaW5ncy5sZW5ndGggLSAxIF0sCisgICAgICAgICAgICAgICAgY2FjaGVJbmRleCA9IGJpbmRp
bmcuX2NhY2hlSW5kZXg7CisKKyAgICAgICAgICAgIGxhc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hl
SW5kZXggPSBjYWNoZUluZGV4OworICAgICAgICAgICAgYmluZGluZ3NbIGNhY2hlSW5kZXggXSA9
IGxhc3RJbmFjdGl2ZUJpbmRpbmc7CisgICAgICAgICAgICBiaW5kaW5ncy5wb3AoKTsKKworICAg
ICAgICAgICAgZGVsZXRlIGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdOworCisgICAgICAgICAg
ICByZW1vdmVfZW1wdHlfbWFwOiB7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgXyBpbiBi
aW5kaW5nQnlOYW1lICkgYnJlYWsgcmVtb3ZlX2VtcHR5X21hcDsKKworICAgICAgICAgICAgICAg
IGRlbGV0ZSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTsKKworICAgICAgICAgICAgfQorCisg
ICAgICAgIH0sCisKKyAgICAgICAgX2xlbmRCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7
CisKKyAgICAgICAgICAgIHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLAorICAgICAgICAg
ICAgICAgIHByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsCisKKyAgICAgICAgICAgICAg
ICBsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQmluZGluZ3MgKyssCisKKyAgICAgICAg
ICAgICAgICBmaXJzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXgg
XTsKKworICAgICAgICAgICAgYmluZGluZy5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDsK
KyAgICAgICAgICAgIGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7CisKKyAg
ICAgICAgICAgIGZpcnN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4Owor
ICAgICAgICAgICAgYmluZGluZ3NbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUJpbmRpbmc7
CisKKyAgICAgICAgfSwKKworICAgICAgICBfdGFrZUJhY2tCaW5kaW5nOiBmdW5jdGlvbiAoIGJp
bmRpbmcgKSB7CisKKyAgICAgICAgICAgIHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLAor
ICAgICAgICAgICAgICAgIHByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsCisKKyAgICAg
ICAgICAgICAgICBmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQmluZGluZ3Ms
CisKKyAgICAgICAgICAgICAgICBsYXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdElu
YWN0aXZlSW5kZXggXTsKKworICAgICAgICAgICAgYmluZGluZy5fY2FjaGVJbmRleCA9IGZpcnN0
SW5hY3RpdmVJbmRleDsKKyAgICAgICAgICAgIGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXgg
XSA9IGJpbmRpbmc7CisKKyAgICAgICAgICAgIGxhc3RBY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4
ID0gcHJldkluZGV4OworICAgICAgICAgICAgYmluZGluZ3NbIHByZXZJbmRleCBdID0gbGFzdEFj
dGl2ZUJpbmRpbmc7CisKKyAgICAgICAgfSwKKworCisgICAgICAgIC8vIE1lbW9yeSBtYW5hZ2Vt
ZW50IG9mIEludGVycG9sYW50cyBmb3Igd2VpZ2h0IGFuZCB0aW1lIHNjYWxlCisKKyAgICAgICAg
X2xlbmRDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFy
IGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsCisgICAgICAgICAgICAg
ICAgbGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgKyss
CisgICAgICAgICAgICAgICAgaW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJ
bmRleCBdOworCisgICAgICAgICAgICBpZiAoIGludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7
CisKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudCgK
KyAgICAgICAgICAgICAgICAgICAgbmV3IEZsb2F0MzJBcnJheSggMiApLCBuZXcgRmxvYXQzMkFy
cmF5KCAyICksCisgICAgICAgICAgICAgICAgICAgIDEsIHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFu
dHNSZXN1bHRCdWZmZXIgKTsKKworICAgICAgICAgICAgICAgIGludGVycG9sYW50Ll9fY2FjaGVJ
bmRleCA9IGxhc3RBY3RpdmVJbmRleDsKKyAgICAgICAgICAgICAgICBpbnRlcnBvbGFudHNbIGxh
c3RBY3RpdmVJbmRleCBdID0gaW50ZXJwb2xhbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgcmV0dXJuIGludGVycG9sYW50OworCisgICAgICAgIH0sCisKKyAgICAgICAgX3Rha2VC
YWNrQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoIGludGVycG9sYW50ICkgeworCisgICAg
ICAgICAgICB2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cywKKyAg
ICAgICAgICAgICAgICBwcmV2SW5kZXggPSBpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXgsCisKKyAg
ICAgICAgICAgICAgICBmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQ29udHJv
bEludGVycG9sYW50cywKKworICAgICAgICAgICAgICAgIGxhc3RBY3RpdmVJbnRlcnBvbGFudCA9
IGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07CisKKyAgICAgICAgICAgIGludGVy
cG9sYW50Ll9fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDsKKyAgICAgICAgICAgIGlu
dGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBpbnRlcnBvbGFudDsKKworICAgICAg
ICAgICAgbGFzdEFjdGl2ZUludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IHByZXZJbmRleDsKKyAg
ICAgICAgICAgIGludGVycG9sYW50c1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlSW50ZXJwb2xh
bnQ7CisKKyAgICAgICAgfSwKKworICAgICAgICBfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1
ZmZlcjogbmV3IEZsb2F0MzJBcnJheSggMSApLAorCisgICAgICAgIC8vIHJldHVybiBhbiBhY3Rp
b24gZm9yIGEgY2xpcCBvcHRpb25hbGx5IHVzaW5nIGEgY3VzdG9tIHJvb3QgdGFyZ2V0CisgICAg
ICAgIC8vIG9iamVjdCAodGhpcyBtZXRob2QgYWxsb2NhdGVzIGEgbG90IG9mIGR5bmFtaWMgbWVt
b3J5IGluIGNhc2UgYQorICAgICAgICAvLyBwcmV2aW91c2x5IHVua25vd24gY2xpcC9yb290IGNv
bWJpbmF0aW9uIGlzIHNwZWNpZmllZCkKKyAgICAgICAgY2xpcEFjdGlvbjogZnVuY3Rpb24gKCBj
bGlwLCBvcHRpb25hbFJvb3QgKSB7CisKKyAgICAgICAgICAgIHZhciByb290ID0gb3B0aW9uYWxS
b290IHx8IHRoaXMuX3Jvb3QsCisgICAgICAgICAgICAgICAgcm9vdFV1aWQgPSByb290LnV1aWQs
CisKKyAgICAgICAgICAgICAgICBjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcn
ID8KKyAgICAgICAgICAgICAgICAgICAgQW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBj
bGlwICkgOiBjbGlwLAorCisgICAgICAgICAgICAgICAgY2xpcFV1aWQgPSBjbGlwT2JqZWN0ICE9
PSBudWxsID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCwKKworICAgICAgICAgICAgICAgIGFjdGlv
bnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSwKKyAgICAgICAgICAg
ICAgICBwcm90b3R5cGVBY3Rpb24gPSBudWxsOworCisgICAgICAgICAgICBpZiAoIGFjdGlvbnNG
b3JDbGlwICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdB
Y3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlS
b290WyByb290VXVpZCBdOworCisgICAgICAgICAgICAgICAgaWYgKCBleGlzdGluZ0FjdGlvbiAh
PT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0Fj
dGlvbjsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHdlIGtub3cg
dGhlIGNsaXAsIHNvIHdlIGRvbid0IGhhdmUgdG8gcGFyc2UgYWxsCisgICAgICAgICAgICAgICAg
Ly8gdGhlIGJpbmRpbmdzIGFnYWluIGJ1dCBjYW4ganVzdCBjb3B5CisgICAgICAgICAgICAgICAg
cHJvdG90eXBlQWN0aW9uID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF07CisKKyAg
ICAgICAgICAgICAgICAvLyBhbHNvLCB0YWtlIHRoZSBjbGlwIGZyb20gdGhlIHByb3RvdHlwZSBh
Y3Rpb24KKyAgICAgICAgICAgICAgICBpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKQorICAgICAg
ICAgICAgICAgICAgICBjbGlwT2JqZWN0ID0gcHJvdG90eXBlQWN0aW9uLl9jbGlwOworCisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNsaXAgbXVzdCBiZSBrbm93biB3aGVuIHNwZWNp
ZmllZCB2aWEgc3RyaW5nCisgICAgICAgICAgICBpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKSBy
ZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgLy8gYWxsb2NhdGUgYWxsIHJlc291cmNlcyByZXF1
aXJlZCB0byBydW4gaXQKKyAgICAgICAgICAgIHZhciBuZXdBY3Rpb24gPSBuZXcgQW5pbWF0aW9u
QWN0aW9uKCB0aGlzLCBjbGlwT2JqZWN0LCBvcHRpb25hbFJvb3QgKTsKKworICAgICAgICAgICAg
dGhpcy5fYmluZEFjdGlvbiggbmV3QWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKTsKKworICAgICAg
ICAgICAgLy8gYW5kIG1ha2UgdGhlIGFjdGlvbiBrbm93biB0byB0aGUgbWVtb3J5IG1hbmFnZXIK
KyAgICAgICAgICAgIHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBuZXdBY3Rpb24sIGNsaXBVdWlk
LCByb290VXVpZCApOworCisgICAgICAgICAgICByZXR1cm4gbmV3QWN0aW9uOworCisgICAgICAg
IH0sCisKKyAgICAgICAgLy8gZ2V0IGFuIGV4aXN0aW5nIGFjdGlvbgorICAgICAgICBleGlzdGlu
Z0FjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7CisKKyAgICAgICAgICAg
IHZhciByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsCisgICAgICAgICAgICAgICAg
cm9vdFV1aWQgPSByb290LnV1aWQsCisKKyAgICAgICAgICAgICAgICBjbGlwT2JqZWN0ID0gdHlw
ZW9mIGNsaXAgPT09ICdzdHJpbmcnID8KKyAgICAgICAgICAgICAgICAgICAgQW5pbWF0aW9uQ2xp
cC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLAorCisgICAgICAgICAgICAgICAgY2xp
cFV1aWQgPSBjbGlwT2JqZWN0ID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCwKKworICAgICAgICAg
ICAgICAgIGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTsK
KworICAgICAgICAgICAgaWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkgeworCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1
aWQgXSB8fCBudWxsOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBudWxs
OworCisgICAgICAgIH0sCisKKyAgICAgICAgLy8gZGVhY3RpdmF0ZXMgYWxsIHByZXZpb3VzbHkg
c2NoZWR1bGVkIGFjdGlvbnMKKyAgICAgICAgc3RvcEFsbEFjdGlvbjogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsCisgICAgICAgICAgICAg
ICAgbkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucywKKyAgICAgICAgICAgICAgICBiaW5k
aW5ncyA9IHRoaXMuX2JpbmRpbmdzLAorICAgICAgICAgICAgICAgIG5CaW5kaW5ncyA9IHRoaXMu
X25BY3RpdmVCaW5kaW5nczsKKworICAgICAgICAgICAgdGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAw
OworICAgICAgICAgICAgdGhpcy5fbkFjdGl2ZUJpbmRpbmdzID0gMDsKKworICAgICAgICAgICAg
Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQWN0aW9uczsgKysgaSApIHsKKworICAgICAgICAgICAg
ICAgIGFjdGlvbnNbIGkgXS5yZXNldCgpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkJpbmRpbmdzOyArKyBpICkgeworCisgICAgICAgICAg
ICAgICAgYmluZGluZ3NbIGkgXS51c2VDb3VudCA9IDA7CisKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICAvLyBhZHZhbmNl
IHRoZSB0aW1lIGFuZCB1cGRhdGUgYXBwbHkgdGhlIGFuaW1hdGlvbgorICAgICAgICB1cGRhdGU6
IGZ1bmN0aW9uICggZGVsdGFUaW1lICkgeworCisgICAgICAgICAgICBkZWx0YVRpbWUgKj0gdGhp
cy50aW1lU2NhbGU7CisKKyAgICAgICAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywK
KyAgICAgICAgICAgICAgICBuQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zLAorCisgICAg
ICAgICAgICAgICAgdGltZSA9IHRoaXMudGltZSArPSBkZWx0YVRpbWUsCisgICAgICAgICAgICAg
ICAgdGltZURpcmVjdGlvbiA9IE1hdGguc2lnbiggZGVsdGFUaW1lICksCisKKyAgICAgICAgICAg
ICAgICBhY2N1SW5kZXggPSB0aGlzLl9hY2N1SW5kZXggXj0gMTsKKworICAgICAgICAgICAgLy8g
cnVuIGFjdGl2ZSBhY3Rpb25zCisKKyAgICAgICAgICAgIGZvciAoIHZhciBpID0gMDsgaSAhPT0g
bkFjdGlvbnM7ICsrIGkgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gYWN0aW9u
c1sgaSBdOworCisgICAgICAgICAgICAgICAgYWN0aW9uLl91cGRhdGUoIHRpbWUsIGRlbHRhVGlt
ZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgLy8gdXBkYXRlIHNjZW5lIGdyYXBoCisKKyAgICAgICAgICAgIHZhciBiaW5kaW5ncyA9
IHRoaXMuX2JpbmRpbmdzLAorICAgICAgICAgICAgICAgIG5CaW5kaW5ncyA9IHRoaXMuX25BY3Rp
dmVCaW5kaW5nczsKKworICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGlu
Z3M7ICsrIGkgKSB7CisKKyAgICAgICAgICAgICAgICBiaW5kaW5nc1sgaSBdLmFwcGx5KCBhY2N1
SW5kZXggKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKwor
ICAgICAgICB9LAorCisgICAgICAgIC8vIHJldHVybiB0aGlzIG1peGVyJ3Mgcm9vdCB0YXJnZXQg
b2JqZWN0CisgICAgICAgIGdldFJvb3Q6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgcmV0
dXJuIHRoaXMuX3Jvb3Q7CisKKyAgICAgICAgfSwKKworICAgICAgICAvLyBmcmVlIGFsbCByZXNv
dXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGNsaXAKKyAgICAgICAgdW5jYWNoZUNsaXA6
IGZ1bmN0aW9uICggY2xpcCApIHsKKworICAgICAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLl9h
Y3Rpb25zLAorICAgICAgICAgICAgICAgIGNsaXBVdWlkID0gY2xpcC51dWlkLAorICAgICAgICAg
ICAgICAgIGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLAorICAgICAgICAgICAg
ICAgIGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTsKKworICAgICAg
ICAgICAgaWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAg
ICAgICAgLy8gbm90ZToganVzdCBjYWxsaW5nIF9yZW1vdmVJbmFjdGl2ZUFjdGlvbiB3b3VsZCBt
ZXNzIHVwIHRoZQorICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbiBzdGF0ZSBhbmQgYWxzbyBy
ZXF1aXJlIHVwZGF0aW5nIHRoZSBzdGF0ZSB3ZSBjYW4KKyAgICAgICAgICAgICAgICAvLyBqdXN0
IHRocm93IGF3YXkKKworICAgICAgICAgICAgICAgIHZhciBhY3Rpb25zVG9SZW1vdmUgPSBhY3Rp
b25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7CisKKyAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9
IDAsIG4gPSBhY3Rpb25zVG9SZW1vdmUubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgeworCisgICAg
ICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBhY3Rpb25zVG9SZW1vdmVbIGkgXTsKKworICAg
ICAgICAgICAgICAgICAgICB0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTsKKworICAg
ICAgICAgICAgICAgICAgICB2YXIgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlv
bnMubGVuZ3RoIC0gMSBdOworCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5fY2FjaGVJbmRl
eCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9
IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgbGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUlu
ZGV4ID0gY2FjaGVJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uc1sgY2FjaGVJbmRl
eCBdID0gbGFzdEluYWN0aXZlQWN0aW9uOworICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLnBv
cCgpOworCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NG
b3JBY3Rpb24oIGFjdGlvbiApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CisKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICB9LAorCisgICAgICAgIC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBh
IHBhcnRpY3VsYXIgcm9vdCB0YXJnZXQgb2JqZWN0CisgICAgICAgIHVuY2FjaGVSb290OiBmdW5j
dGlvbiAoIHJvb3QgKSB7CisKKyAgICAgICAgICAgIHZhciByb290VXVpZCA9IHJvb3QudXVpZCwK
KyAgICAgICAgICAgICAgICBhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcDsKKwor
ICAgICAgICAgICAgZm9yICggdmFyIGNsaXBVdWlkIGluIGFjdGlvbnNCeUNsaXAgKSB7CisKKyAg
ICAgICAgICAgICAgICB2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQg
XS5hY3Rpb25CeVJvb3QsCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IGFjdGlvbkJ5Um9v
dFsgcm9vdFV1aWQgXTsKKworICAgICAgICAgICAgICAgIGlmICggYWN0aW9uICE9PSB1bmRlZmlu
ZWQgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0
aW9uICk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKCBh
Y3Rpb24gKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICB2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsCisg
ICAgICAgICAgICAgICAgYmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBd
OworCisgICAgICAgICAgICBpZiAoIGJpbmRpbmdCeU5hbWUgIT09IHVuZGVmaW5lZCApIHsKKwor
ICAgICAgICAgICAgICAgIGZvciAoIHZhciB0cmFja05hbWUgaW4gYmluZGluZ0J5TmFtZSApIHsK
KworICAgICAgICAgICAgICAgICAgICB2YXIgYmluZGluZyA9IGJpbmRpbmdCeU5hbWVbIHRyYWNr
TmFtZSBdOworICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRl
KCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmlu
ZGluZyApOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAg
fSwKKworICAgICAgICAvLyByZW1vdmUgYSB0YXJnZXRlZCBjbGlwIGZyb20gdGhlIGNhY2hlCisg
ICAgICAgIHVuY2FjaGVBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkgewor
CisgICAgICAgICAgICB2YXIgYWN0aW9uID0gdGhpcy5leGlzdGluZ0FjdGlvbiggY2xpcCwgb3B0
aW9uYWxSb290ICk7CisKKyAgICAgICAgICAgIGlmICggYWN0aW9uICE9PSBudWxsICkgeworCisg
ICAgICAgICAgICAgICAgdGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7CisgICAgICAg
ICAgICAgICAgdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhv
ciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFVu
aWZvcm0oIHZhbHVlICkgeworCisgICAgICAgIGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5n
JyApIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogVHlwZSBw
YXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4nICk7CisgICAgICAgICAgICB2YWx1ZSA9IGFy
Z3VtZW50c1sgMSBdOworCisgICAgICAgIH0KKworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7
CisKKyAgICB9CisKKyAgICBVbmlmb3JtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHsK
KworICAgICAgICByZXR1cm4gbmV3IFVuaWZvcm0oIHRoaXMudmFsdWUuY2xvbmUgPT09IHVuZGVm
aW5lZCA/IHRoaXMudmFsdWUgOiB0aGlzLnZhbHVlLmNsb25lKCkgKTsKKworICAgIH07CisKKyAg
ICAvKioKKyAgICAgKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVu
X2FfYWRhbXMKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5
KCkgeworCisgICAgICAgIEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0
aGlzLnR5cGUgPSAnSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnknOworICAgICAgICB0aGlzLm1heElu
c3RhbmNlZENvdW50ID0gdW5kZWZpbmVkOworCisgICAgfQorCisgICAgSW5zdGFuY2VkQnVmZmVy
R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVy
R2VvbWV0cnkucHJvdG90eXBlICksIHsKKworICAgICAgICBjb25zdHJ1Y3RvcjogSW5zdGFuY2Vk
QnVmZmVyR2VvbWV0cnksCisKKyAgICAgICAgaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeTogdHJ1
ZSwKKworICAgICAgICBhZGRHcm91cDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIG1hdGVyaWFs
SW5kZXggKSB7CisKKyAgICAgICAgICAgIHRoaXMuZ3JvdXBzLnB1c2goIHsKKworICAgICAgICAg
ICAgICAgIHN0YXJ0OiBzdGFydCwKKyAgICAgICAgICAgICAgICBjb3VudDogY291bnQsCisgICAg
ICAgICAgICAgICAgbWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleAorCisgICAgICAgICAgICB9
ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsK
KworICAgICAgICAgICAgdmFyIGluZGV4ID0gc291cmNlLmluZGV4OworCisgICAgICAgICAgICBp
ZiAoIGluZGV4ICE9PSBudWxsICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5zZXRJbmRleCgg
aW5kZXguY2xvbmUoKSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBhdHRy
aWJ1dGVzID0gc291cmNlLmF0dHJpYnV0ZXM7CisKKyAgICAgICAgICAgIGZvciAoIHZhciBuYW1l
IGluIGF0dHJpYnV0ZXMgKSB7CisKKyAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gYXR0
cmlidXRlc1sgbmFtZSBdOworICAgICAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCBuYW1l
LCBhdHRyaWJ1dGUuY2xvbmUoKSApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZh
ciBncm91cHMgPSBzb3VyY2UuZ3JvdXBzOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAs
IGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgIHZh
ciBncm91cCA9IGdyb3Vwc1sgaSBdOworICAgICAgICAgICAgICAgIHRoaXMuYWRkR3JvdXAoIGdy
b3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApOworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0KKworICAgIH0g
KTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVy
LmNvbS9iZW5fYV9hZGFtcworICAgICAqLworCisgICAgZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZm
ZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBpdGVtU2l6ZSwgb2Zmc2V0LCBub3JtYWxp
emVkICkgeworCisgICAgICAgIHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOworCisg
ICAgICAgIHRoaXMuZGF0YSA9IGludGVybGVhdmVkQnVmZmVyOworICAgICAgICB0aGlzLml0ZW1T
aXplID0gaXRlbVNpemU7CisgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OworCisgICAgICAg
IHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7CisKKyAgICB9CisKKyAgICBP
YmplY3QuZGVmaW5lUHJvcGVydGllcyggSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90
eXBlLCB7CisKKyAgICAgICAgY291bnQ6IHsKKworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAo
KSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmNvdW50OworCisgICAgICAg
ICAgICB9CisKKyAgICAgICAgfSwKKworICAgICAgICBhcnJheTogeworCisgICAgICAgICAgICBn
ZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuYXJy
YXk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICBPYmpl
Y3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHsKKworICAg
ICAgICBpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLAorCisgICAgICAgIHNldFg6
IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7CisKKyAgICAgICAgICAgIHRoaXMuZGF0YS5hcnJheVsg
aW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXSA9IHg7CisKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0WTogZnVuY3Rpb24g
KCBpbmRleCwgeSApIHsKKworICAgICAgICAgICAgdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRo
aXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXSA9IHk7CisKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0WjogZnVuY3Rpb24gKCBpbmRl
eCwgeiApIHsKKworICAgICAgICAgICAgdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0
YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXSA9IHo7CisKKyAgICAgICAgICAgIHJldHVybiB0
aGlzOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyAp
IHsKKworICAgICAgICAgICAgdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJp
ZGUgKyB0aGlzLm9mZnNldCArIDMgXSA9IHc7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwor
CisgICAgICAgIH0sCisKKyAgICAgICAgZ2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHsKKworICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRl
ICsgdGhpcy5vZmZzZXQgXTsKKworICAgICAgICB9LAorCisgICAgICAgIGdldFk6IGZ1bmN0aW9u
ICggaW5kZXggKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4
ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdOworCisgICAgICAgIH0sCisK
KyAgICAgICAgZ2V0WjogZnVuY3Rpb24gKCBpbmRleCApIHsKKworICAgICAgICAgICAgcmV0dXJu
IHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQg
KyAyIF07CisKKyAgICAgICAgfSwKKworICAgICAgICBnZXRXOiBmdW5jdGlvbiAoIGluZGV4ICkg
eworCisgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0
YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXTsKKworICAgICAgICB9LAorCisgICAgICAgIHNl
dFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkgeworCisgICAgICAgICAgICBpbmRleCA9IGlu
ZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0OworCisgICAgICAgICAgICB0aGlz
LmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDsKKyAgICAgICAgICAgIHRoaXMuZGF0YS5hcnJh
eVsgaW5kZXggKyAxIF0gPSB5OworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAg
ICB9LAorCisgICAgICAgIHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHsKKwor
ICAgICAgICAgICAgaW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNl
dDsKKworICAgICAgICAgICAgdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7CisgICAg
ICAgICAgICB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTsKKyAgICAgICAgICAgIHRo
aXMuZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6OworCisgICAgICAgICAgICByZXR1cm4gdGhp
czsKKworICAgICAgICB9LAorCisgICAgICAgIHNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgs
IHksIHosIHcgKSB7CisKKyAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3Ry
aWRlICsgdGhpcy5vZmZzZXQ7CisKKyAgICAgICAgICAgIHRoaXMuZGF0YS5hcnJheVsgaW5kZXgg
KyAwIF0gPSB4OworICAgICAgICAgICAgdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7
CisgICAgICAgICAgICB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMiBdID0gejsKKyAgICAgICAg
ICAgIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAzIF0gPSB3OworCisgICAgICAgICAgICByZXR1
cm4gdGhpczsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0
aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXMKKyAgICAgKi8K
KworICAgIGZ1bmN0aW9uIEludGVybGVhdmVkQnVmZmVyKCBhcnJheSwgc3RyaWRlICkgeworCisg
ICAgICAgIHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOworCisgICAgICAgIHRoaXMu
YXJyYXkgPSBhcnJheTsKKyAgICAgICAgdGhpcy5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIHRo
aXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gc3RyaWRlIDog
MDsKKworICAgICAgICB0aGlzLmR5bmFtaWMgPSBmYWxzZTsKKyAgICAgICAgdGhpcy51cGRhdGVS
YW5nZSA9IHsgb2Zmc2V0OiAwLCBjb3VudDogLSAxIH07CisKKyAgICAgICAgdGhpcy5vblVwbG9h
ZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge307CisKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gMDsK
KworICAgIH0KKworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggSW50ZXJsZWF2ZWRCdWZmZXIu
cHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7CisKKyAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHZh
bHVlICkgeworCisgICAgICAgICAgICBpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9u
ICsrOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIE9iamVjdC5hc3NpZ24oIEludGVy
bGVhdmVkQnVmZmVyLnByb3RvdHlwZSwgeworCisgICAgICAgIGlzSW50ZXJsZWF2ZWRCdWZmZXI6
IHRydWUsCisKKyAgICAgICAgc2V0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7CisKKyAgICAg
ICAgICAgIGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHsKKworICAgICAgICAgICAgICAg
IHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3Vs
ZCBiZSBhIFR5cGVkIEFycmF5LicgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0
aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHRoaXMuc3Ry
aWRlIDogMDsKKyAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKKworICAgICAgICB9LAor
CisgICAgICAgIHNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAg
IHRoaXMuZHluYW1pYyA9IHZhbHVlOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAg
ICAgICB9LAorCisgICAgICAgIGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeworCisgICAgICAg
ICAgICB0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFy
cmF5ICk7CisgICAgICAgICAgICB0aGlzLmNvdW50ID0gc291cmNlLmNvdW50OworICAgICAgICAg
ICAgdGhpcy5zdHJpZGUgPSBzb3VyY2Uuc3RyaWRlOworICAgICAgICAgICAgdGhpcy5keW5hbWlj
ID0gc291cmNlLmR5bmFtaWM7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAg
IH0sCisKKyAgICAgICAgY29weUF0OiBmdW5jdGlvbiAoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRl
eDIgKSB7CisKKyAgICAgICAgICAgIGluZGV4MSAqPSB0aGlzLnN0cmlkZTsKKyAgICAgICAgICAg
IGluZGV4MiAqPSBhdHRyaWJ1dGUuc3RyaWRlOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9
IDAsIGwgPSB0aGlzLnN0cmlkZTsgaSA8IGw7IGkgKysgKSB7CisKKyAgICAgICAgICAgICAgICB0
aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTsK
KworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9
LAorCisgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSwgb2Zmc2V0ICkgeworCisgICAgICAg
ICAgICBpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKKworICAgICAgICAg
ICAgdGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTsKKworICAgICAgICAgICAgcmV0dXJu
IHRoaXM7CisKKyAgICAgICAgfSwKKworICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CisK
KyAgICAgICAgfSwKKworICAgICAgICBvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsK
KworICAgICAgICAgICAgdGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7CisKKyAgICAg
ICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgor
ICAgICAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFt
cworICAgICAqLworCisgICAgZnVuY3Rpb24gSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIoIGFy
cmF5LCBzdHJpZGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7CisKKyAgICAgICAgSW50ZXJsZWF2ZWRC
dWZmZXIuY2FsbCggdGhpcywgYXJyYXksIHN0cmlkZSApOworCisgICAgICAgIHRoaXMubWVzaFBl
ckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGUgfHwgMTsKKworICAgIH0KKworICAgIEluc3Rh
bmNlZEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5j
cmVhdGUoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSApLCB7CisKKyAgICAgICAgY29uc3Ry
dWN0b3I6IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLAorCisgICAgICAgIGlzSW5zdGFuY2Vk
SW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsCisKKyAgICAgICAgY29weTogZnVuY3Rpb24gKCBzb3Vy
Y2UgKSB7CisKKyAgICAgICAgICAgIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZS5jb3B5LmNh
bGwoIHRoaXMsIHNvdXJjZSApOworCisgICAgICAgICAgICB0aGlzLm1lc2hQZXJBdHRyaWJ1dGUg
PSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisK
KyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBiZW5hYWRh
bXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zCisgICAgICovCisKKyAgICBmdW5j
dGlvbiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbWVzaFBlckF0
dHJpYnV0ZSApIHsKKworICAgICAgICBCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgYXJyYXks
IGl0ZW1TaXplICk7CisKKyAgICAgICAgdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0
dHJpYnV0ZSB8fCAxOworCisgICAgfQorCisgICAgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLnBy
b3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5w
cm90b3R5cGUgKSwgeworCisgICAgICAgIGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJBdHRy
aWJ1dGUsCisKKyAgICAgICAgaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsCisKKyAg
ICAgICAgY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CisKKyAgICAgICAgICAgIEJ1ZmZlckF0
dHJpYnV0ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKKworICAgICAgICAg
ICAgdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7CisKKyAg
ICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8q
KgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1
dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KKyAgICAgKiBAYXV0aG9yIHN0ZXBob21p
IC8gaHR0cDovL3N0ZXBoYW5lZ2luaWVyLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFJh
eWNhc3Rlciggb3JpZ2luLCBkaXJlY3Rpb24sIG5lYXIsIGZhciApIHsKKworICAgICAgICB0aGlz
LnJheSA9IG5ldyBSYXkoIG9yaWdpbiwgZGlyZWN0aW9uICk7CisgICAgICAgIC8vIGRpcmVjdGlv
biBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQgKGZvciBhY2N1cmF0ZSBkaXN0YW5jZSBjYWxj
dWxhdGlvbnMpCisKKyAgICAgICAgdGhpcy5uZWFyID0gbmVhciB8fCAwOworICAgICAgICB0aGlz
LmZhciA9IGZhciB8fCBJbmZpbml0eTsKKworICAgICAgICB0aGlzLnBhcmFtcyA9IHsKKyAgICAg
ICAgICAgIE1lc2g6IHt9LAorICAgICAgICAgICAgTGluZToge30sCisgICAgICAgICAgICBMT0Q6
IHt9LAorICAgICAgICAgICAgUG9pbnRzOiB7IHRocmVzaG9sZDogMSB9LAorICAgICAgICAgICAg
U3ByaXRlOiB7fQorICAgICAgICB9OworCisgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVz
KCB0aGlzLnBhcmFtcywgeworICAgICAgICAgICAgUG9pbnRDbG91ZDogeworICAgICAgICAgICAg
ICAgIGdldDogZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4o
ICdUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8g
cGFyYW1zLlBvaW50cy4nICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlBvaW50
czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gKTsKKworICAg
IH0KKworICAgIGZ1bmN0aW9uIGFzY1NvcnQoIGEsIGIgKSB7CisKKyAgICAgICAgcmV0dXJuIGEu
ZGlzdGFuY2UgLSBiLmRpc3RhbmNlOworCisgICAgfQorCisgICAgZnVuY3Rpb24gaW50ZXJzZWN0
T2JqZWN0KCBvYmplY3QsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgcmVjdXJzaXZlICkgeworCisg
ICAgICAgIGlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuOworCisgICAgICAg
IG9iamVjdC5yYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKTsKKworICAgICAgICBpZiAo
IHJlY3Vyc2l2ZSA9PT0gdHJ1ZSApIHsKKworICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gb2Jq
ZWN0LmNoaWxkcmVuOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJl
bi5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgaW50ZXJzZWN0T2Jq
ZWN0KCBjaGlsZHJlblsgaSBdLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHRydWUgKTsKKworICAg
ICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIE9iamVjdC5hc3NpZ24oIFJh
eWNhc3Rlci5wcm90b3R5cGUsIHsKKworICAgICAgICBsaW5lUHJlY2lzaW9uOiAxLAorCisgICAg
ICAgIHNldDogZnVuY3Rpb24gKCBvcmlnaW4sIGRpcmVjdGlvbiApIHsKKworICAgICAgICAgICAg
Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRp
c3RhbmNlIGNhbGN1bGF0aW9ucykKKworICAgICAgICAgICAgdGhpcy5yYXkuc2V0KCBvcmlnaW4s
IGRpcmVjdGlvbiApOworCisgICAgICAgIH0sCisKKyAgICAgICAgc2V0RnJvbUNhbWVyYTogZnVu
Y3Rpb24gKCBjb29yZHMsIGNhbWVyYSApIHsKKworICAgICAgICAgICAgaWYgKCAoIGNhbWVyYSAm
JiBjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSApICkgeworCisgICAgICAgICAgICAgICAgdGhp
cy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7
CisgICAgICAgICAgICAgICAgdGhpcy5yYXkuZGlyZWN0aW9uLnNldCggY29vcmRzLngsIGNvb3Jk
cy55LCAwLjUgKS51bnByb2plY3QoIGNhbWVyYSApLnN1YiggdGhpcy5yYXkub3JpZ2luICkubm9y
bWFsaXplKCk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoICggY2FtZXJhICYmIGNhbWVyYS5p
c09ydGhvZ3JhcGhpY0NhbWVyYSApICkgeworCisgICAgICAgICAgICAgICAgdGhpcy5yYXkub3Jp
Z2luLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAoIGNhbWVyYS5uZWFyICsgY2FtZXJhLmZhciAp
IC8gKCBjYW1lcmEubmVhciAtIGNhbWVyYS5mYXIgKSApLnVucHJvamVjdCggY2FtZXJhICk7IC8v
IHNldCBvcmlnaW4gaW4gcGxhbmUgb2YgY2FtZXJhCisgICAgICAgICAgICAgICAgdGhpcy5yYXku
ZGlyZWN0aW9uLnNldCggMCwgMCwgLSAxICkudHJhbnNmb3JtRGlyZWN0aW9uKCBjYW1lcmEubWF0
cml4V29ybGQgKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGNv
bnNvbGUuZXJyb3IoICdUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlLicg
KTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0sCisKKyAgICAgICAgaW50ZXJzZWN0T2Jq
ZWN0OiBmdW5jdGlvbiAoIG9iamVjdCwgcmVjdXJzaXZlICkgeworCisgICAgICAgICAgICB2YXIg
aW50ZXJzZWN0cyA9IFtdOworCisgICAgICAgICAgICBpbnRlcnNlY3RPYmplY3QoIG9iamVjdCwg
dGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7CisKKyAgICAgICAgICAgIGludGVyc2VjdHMu
c29ydCggYXNjU29ydCApOworCisgICAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0czsKKworICAg
ICAgICB9LAorCisgICAgICAgIGludGVyc2VjdE9iamVjdHM6IGZ1bmN0aW9uICggb2JqZWN0cywg
cmVjdXJzaXZlICkgeworCisgICAgICAgICAgICB2YXIgaW50ZXJzZWN0cyA9IFtdOworCisgICAg
ICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdHMgKSA9PT0gZmFsc2UgKSB7CisKKyAg
ICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXIuaW50ZXJzZWN0T2Jq
ZWN0czogb2JqZWN0cyBpcyBub3QgYW4gQXJyYXkuJyApOworICAgICAgICAgICAgICAgIHJldHVy
biBpbnRlcnNlY3RzOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoIHZhciBp
ID0gMCwgbCA9IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAg
ICAgIGludGVyc2VjdE9iamVjdCggb2JqZWN0c1sgaSBdLCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1
cnNpdmUgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcnNlY3RzLnNvcnQo
IGFzY1NvcnQgKTsKKworICAgICAgICAgICAgcmV0dXJuIGludGVyc2VjdHM7CisKKyAgICAgICAg
fQorCisgICAgfSApOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6
Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIENsb2NrKCBhdXRv
U3RhcnQgKSB7CisKKyAgICAgICAgdGhpcy5hdXRvU3RhcnQgPSAoIGF1dG9TdGFydCAhPT0gdW5k
ZWZpbmVkICkgPyBhdXRvU3RhcnQgOiB0cnVlOworCisgICAgICAgIHRoaXMuc3RhcnRUaW1lID0g
MDsKKyAgICAgICAgdGhpcy5vbGRUaW1lID0gMDsKKyAgICAgICAgdGhpcy5lbGFwc2VkVGltZSA9
IDA7CisKKyAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7CisKKyAgICB9CisKKyAgICBPYmpl
Y3QuYXNzaWduKCBDbG9jay5wcm90b3R5cGUsIHsKKworICAgICAgICBzdGFydDogZnVuY3Rpb24g
KCkgeworCisgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZSA9ICggdHlwZW9mIHBlcmZvcm1hbmNl
ID09PSAndW5kZWZpbmVkJyA/IERhdGUgOiBwZXJmb3JtYW5jZSApLm5vdygpOyAvLyBzZWUgIzEw
NzMyCisKKyAgICAgICAgICAgIHRoaXMub2xkVGltZSA9IHRoaXMuc3RhcnRUaW1lOworICAgICAg
ICAgICAgdGhpcy5lbGFwc2VkVGltZSA9IDA7CisgICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0
cnVlOworCisgICAgICAgIH0sCisKKyAgICAgICAgc3RvcDogZnVuY3Rpb24gKCkgeworCisgICAg
ICAgICAgICB0aGlzLmdldEVsYXBzZWRUaW1lKCk7CisgICAgICAgICAgICB0aGlzLnJ1bm5pbmcg
PSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuYXV0b1N0YXJ0ID0gZmFsc2U7CisKKyAgICAgICAg
fSwKKworICAgICAgICBnZXRFbGFwc2VkVGltZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAg
ICB0aGlzLmdldERlbHRhKCk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5lbGFwc2VkVGltZTsK
KworICAgICAgICB9LAorCisgICAgICAgIGdldERlbHRhOiBmdW5jdGlvbiAoKSB7CisKKyAgICAg
ICAgICAgIHZhciBkaWZmID0gMDsKKworICAgICAgICAgICAgaWYgKCB0aGlzLmF1dG9TdGFydCAm
JiAhIHRoaXMucnVubmluZyApIHsKKworICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQoKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBp
ZiAoIHRoaXMucnVubmluZyApIHsKKworICAgICAgICAgICAgICAgIHZhciBuZXdUaW1lID0gKCB0
eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICku
bm93KCk7CisKKyAgICAgICAgICAgICAgICBkaWZmID0gKCBuZXdUaW1lIC0gdGhpcy5vbGRUaW1l
ICkgLyAxMDAwOworICAgICAgICAgICAgICAgIHRoaXMub2xkVGltZSA9IG5ld1RpbWU7CisKKyAg
ICAgICAgICAgICAgICB0aGlzLmVsYXBzZWRUaW1lICs9IGRpZmY7CisKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgcmV0dXJuIGRpZmY7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisg
ICAgLyoqCisgICAgICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbworICAgICAq
IEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQorICAg
ICAqCisgICAgICogUmVmOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TcGhlcmljYWxf
Y29vcmRpbmF0ZV9zeXN0ZW0KKyAgICAgKgorICAgICAqIFRoZSBwb2xlcyAocGhpKSBhcmUgYXQg
dGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB5IGF4aXMuCisgICAgICogVGhlIGVxdWF0b3Igc3Rh
cnRzIGF0IHBvc2l0aXZlIHouCisgICAgICovCisKKyAgICBmdW5jdGlvbiBTcGhlcmljYWwoIHJh
ZGl1cywgcGhpLCB0aGV0YSApIHsKKworICAgICAgICB0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9
PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDsKKyAgICAgICAgdGhpcy5waGkgPSAoIHBoaSAh
PT0gdW5kZWZpbmVkICkgPyBwaGkgOiAwOyAvLyB1cCAvIGRvd24gdG93YXJkcyB0b3AgYW5kIGJv
dHRvbSBwb2xlCisgICAgICAgIHRoaXMudGhldGEgPSAoIHRoZXRhICE9PSB1bmRlZmluZWQgKSA/
IHRoZXRhIDogMDsgLy8gYXJvdW5kIHRoZSBlcXVhdG9yIG9mIHRoZSBzcGhlcmUKKworICAgICAg
ICByZXR1cm4gdGhpczsKKworICAgIH0KKworICAgIE9iamVjdC5hc3NpZ24oIFNwaGVyaWNhbC5w
cm90b3R5cGUsIHsKKworICAgICAgICBzZXQ6IGZ1bmN0aW9uICggcmFkaXVzLCBwaGksIHRoZXRh
ICkgeworCisgICAgICAgICAgICB0aGlzLnJhZGl1cyA9IHJhZGl1czsKKyAgICAgICAgICAgIHRo
aXMucGhpID0gcGhpOworICAgICAgICAgICAgdGhpcy50aGV0YSA9IHRoZXRhOworCisgICAgICAg
ICAgICByZXR1cm4gdGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIGNsb25lOiBmdW5jdGlv
biAoKSB7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHko
IHRoaXMgKTsKKworICAgICAgICB9LAorCisgICAgICAgIGNvcHk6IGZ1bmN0aW9uICggb3RoZXIg
KSB7CisKKyAgICAgICAgICAgIHRoaXMucmFkaXVzID0gb3RoZXIucmFkaXVzOworICAgICAgICAg
ICAgdGhpcy5waGkgPSBvdGhlci5waGk7CisgICAgICAgICAgICB0aGlzLnRoZXRhID0gb3RoZXIu
dGhldGE7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0sCisKKyAgICAg
ICAgLy8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZSBFUFMgYW5kIFBJLUVQUworICAgICAgICBt
YWtlU2FmZTogZnVuY3Rpb24oKSB7CisKKyAgICAgICAgICAgIHZhciBFUFMgPSAwLjAwMDAwMTsK
KyAgICAgICAgICAgIHRoaXMucGhpID0gTWF0aC5tYXgoIEVQUywgTWF0aC5taW4oIE1hdGguUEkg
LSBFUFMsIHRoaXMucGhpICkgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAg
ICAgfSwKKworICAgICAgICBzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24oIHZlYzMgKSB7CisKKyAg
ICAgICAgICAgIHRoaXMucmFkaXVzID0gdmVjMy5sZW5ndGgoKTsKKworICAgICAgICAgICAgaWYg
KCB0aGlzLnJhZGl1cyA9PT0gMCApIHsKKworICAgICAgICAgICAgICAgIHRoaXMudGhldGEgPSAw
OworICAgICAgICAgICAgICAgIHRoaXMucGhpID0gMDsKKworICAgICAgICAgICAgfSBlbHNlIHsK
KworICAgICAgICAgICAgICAgIHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB2ZWMzLngsIHZlYzMu
eiApOyAvLyBlcXVhdG9yIGFuZ2xlIGFyb3VuZCB5LXVwIGF4aXMKKyAgICAgICAgICAgICAgICB0
aGlzLnBoaSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIHZlYzMueSAvIHRoaXMucmFkaXVzLCAt
IDEsIDEgKSApOyAvLyBwb2xhciBhbmdsZQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IHJldHVybiB0aGlzOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8qKgorICAgICAq
IEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisgICAgICoKKyAg
ICAgKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5bGluZHJpY2FsX2Nvb3Jk
aW5hdGVfc3lzdGVtCisgICAgICoKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIEN5bGluZHJpY2Fs
KCByYWRpdXMsIHRoZXRhLCB5ICkgeworCisgICAgICAgIHRoaXMucmFkaXVzID0gKCByYWRpdXMg
IT09IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMS4wOyAvLyBkaXN0YW5jZSBmcm9tIHRoZSBvcmln
aW4gdG8gYSBwb2ludCBpbiB0aGUgeC16IHBsYW5lCisgICAgICAgIHRoaXMudGhldGEgPSAoIHRo
ZXRhICE9PSB1bmRlZmluZWQgKSA/IHRoZXRhIDogMDsgLy8gY291bnRlcmNsb2Nrd2lzZSBhbmds
ZSBpbiB0aGUgeC16IHBsYW5lIG1lYXN1cmVkIGluIHJhZGlhbnMgZnJvbSB0aGUgcG9zaXRpdmUg
ei1heGlzCisgICAgICAgIHRoaXMueSA9ICggeSAhPT0gdW5kZWZpbmVkICkgPyB5IDogMDsgLy8g
aGVpZ2h0IGFib3ZlIHRoZSB4LXogcGxhbmUKKworICAgICAgICByZXR1cm4gdGhpczsKKworICAg
IH0KKworICAgIE9iamVjdC5hc3NpZ24oIEN5bGluZHJpY2FsLnByb3RvdHlwZSwgeworCisgICAg
ICAgIHNldDogZnVuY3Rpb24gKCByYWRpdXMsIHRoZXRhLCB5ICkgeworCisgICAgICAgICAgICB0
aGlzLnJhZGl1cyA9IHJhZGl1czsKKyAgICAgICAgICAgIHRoaXMudGhldGEgPSB0aGV0YTsKKyAg
ICAgICAgICAgIHRoaXMueSA9IHk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAg
ICAgIH0sCisKKyAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgcmV0
dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOworCisgICAgICAgIH0sCisK
KyAgICAgICAgY29weTogZnVuY3Rpb24gKCBvdGhlciApIHsKKworICAgICAgICAgICAgdGhpcy5y
YWRpdXMgPSBvdGhlci5yYWRpdXM7CisgICAgICAgICAgICB0aGlzLnRoZXRhID0gb3RoZXIudGhl
dGE7CisgICAgICAgICAgICB0aGlzLnkgPSBvdGhlci55OworCisgICAgICAgICAgICByZXR1cm4g
dGhpczsKKworICAgICAgICB9LAorCisgICAgICAgIHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbigg
dmVjMyApIHsKKworICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIHZlYzMueCAq
IHZlYzMueCArIHZlYzMueiAqIHZlYzMueiApOworICAgICAgICAgICAgdGhpcy50aGV0YSA9IE1h
dGguYXRhbjIoIHZlYzMueCwgdmVjMy56ICk7CisgICAgICAgICAgICB0aGlzLnkgPSB2ZWMzLnk7
CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIH0KKworICAgIH0gKTsKKwor
ICAgIC8qKgorICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5j
b20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBNb3JwaEJsZW5kTWVzaCggZ2VvbWV0cnksIG1h
dGVyaWFsICkgeworCisgICAgICAgIE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFs
ICk7CisKKyAgICAgICAgdGhpcy5hbmltYXRpb25zTWFwID0ge307CisgICAgICAgIHRoaXMuYW5p
bWF0aW9uc0xpc3QgPSBbXTsKKworICAgICAgICAvLyBwcmVwYXJlIGRlZmF1bHQgYW5pbWF0aW9u
CisgICAgICAgIC8vIChhbGwgZnJhbWVzIHBsYXllZCB0b2dldGhlciBpbiAxIHNlY29uZCkKKwor
ICAgICAgICB2YXIgbnVtRnJhbWVzID0gdGhpcy5nZW9tZXRyeS5tb3JwaFRhcmdldHMubGVuZ3Ro
OworCisgICAgICAgIHZhciBuYW1lID0gIl9fZGVmYXVsdCI7CisKKyAgICAgICAgdmFyIHN0YXJ0
RnJhbWUgPSAwOworICAgICAgICB2YXIgZW5kRnJhbWUgPSBudW1GcmFtZXMgLSAxOworCisgICAg
ICAgIHZhciBmcHMgPSBudW1GcmFtZXMgLyAxOworCisgICAgICAgIHRoaXMuY3JlYXRlQW5pbWF0
aW9uKCBuYW1lLCBzdGFydEZyYW1lLCBlbmRGcmFtZSwgZnBzICk7CisgICAgICAgIHRoaXMuc2V0
QW5pbWF0aW9uV2VpZ2h0KCBuYW1lLCAxICk7CisKKyAgICB9CisKKyAgICBNb3JwaEJsZW5kTWVz
aC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApOworICAgIE1vcnBo
QmxlbmRNZXNoLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1vcnBoQmxlbmRNZXNoOworCisgICAg
TW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLmNyZWF0ZUFuaW1hdGlvbiA9IGZ1bmN0aW9uICggbmFt
ZSwgc3RhcnQsIGVuZCwgZnBzICkgeworCisgICAgICAgIHZhciBhbmltYXRpb24gPSB7CisKKyAg
ICAgICAgICAgIHN0YXJ0OiBzdGFydCwKKyAgICAgICAgICAgIGVuZDogZW5kLAorCisgICAgICAg
ICAgICBsZW5ndGg6IGVuZCAtIHN0YXJ0ICsgMSwKKworICAgICAgICAgICAgZnBzOiBmcHMsCisg
ICAgICAgICAgICBkdXJhdGlvbjogKCBlbmQgLSBzdGFydCApIC8gZnBzLAorCisgICAgICAgICAg
ICBsYXN0RnJhbWU6IDAsCisgICAgICAgICAgICBjdXJyZW50RnJhbWU6IDAsCisKKyAgICAgICAg
ICAgIGFjdGl2ZTogZmFsc2UsCisKKyAgICAgICAgICAgIHRpbWU6IDAsCisgICAgICAgICAgICBk
aXJlY3Rpb246IDEsCisgICAgICAgICAgICB3ZWlnaHQ6IDEsCisKKyAgICAgICAgICAgIGRpcmVj
dGlvbkJhY2t3YXJkczogZmFsc2UsCisgICAgICAgICAgICBtaXJyb3JlZExvb3A6IGZhbHNlCisK
KyAgICAgICAgfTsKKworICAgICAgICB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXSA9IGFuaW1h
dGlvbjsKKyAgICAgICAgdGhpcy5hbmltYXRpb25zTGlzdC5wdXNoKCBhbmltYXRpb24gKTsKKwor
ICAgIH07CisKKyAgICBNb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuYXV0b0NyZWF0ZUFuaW1hdGlv
bnMgPSBmdW5jdGlvbiAoIGZwcyApIHsKKworICAgICAgICB2YXIgcGF0dGVybiA9IC8oW2Etel0r
KV8/KFxkKykvaTsKKworICAgICAgICB2YXIgZmlyc3RBbmltYXRpb24sIGZyYW1lUmFuZ2VzID0g
e307CisKKyAgICAgICAgdmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKKworICAgICAgICBm
b3IgKCB2YXIgaSA9IDAsIGlsID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGls
OyBpICsrICkgeworCisgICAgICAgICAgICB2YXIgbW9ycGggPSBnZW9tZXRyeS5tb3JwaFRhcmdl
dHNbIGkgXTsKKyAgICAgICAgICAgIHZhciBjaHVua3MgPSBtb3JwaC5uYW1lLm1hdGNoKCBwYXR0
ZXJuICk7CisKKyAgICAgICAgICAgIGlmICggY2h1bmtzICYmIGNodW5rcy5sZW5ndGggPiAxICkg
eworCisgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBjaHVua3NbIDEgXTsKKworICAgICAgICAg
ICAgICAgIGlmICggISBmcmFtZVJhbmdlc1sgbmFtZSBdICkgZnJhbWVSYW5nZXNbIG5hbWUgXSA9
IHsgc3RhcnQ6IEluZmluaXR5LCBlbmQ6IC0gSW5maW5pdHkgfTsKKworICAgICAgICAgICAgICAg
IHZhciByYW5nZSA9IGZyYW1lUmFuZ2VzWyBuYW1lIF07CisKKyAgICAgICAgICAgICAgICBpZiAo
IGkgPCByYW5nZS5zdGFydCApIHJhbmdlLnN0YXJ0ID0gaTsKKyAgICAgICAgICAgICAgICBpZiAo
IGkgPiByYW5nZS5lbmQgKSByYW5nZS5lbmQgPSBpOworCisgICAgICAgICAgICAgICAgaWYgKCAh
IGZpcnN0QW5pbWF0aW9uICkgZmlyc3RBbmltYXRpb24gPSBuYW1lOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIHZhciBuYW1lIGluIGZyYW1lUmFuZ2VzICkg
eworCisgICAgICAgICAgICB2YXIgcmFuZ2UgPSBmcmFtZVJhbmdlc1sgbmFtZSBdOworICAgICAg
ICAgICAgdGhpcy5jcmVhdGVBbmltYXRpb24oIG5hbWUsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQs
IGZwcyApOworCisgICAgICAgIH0KKworICAgICAgICB0aGlzLmZpcnN0QW5pbWF0aW9uID0gZmly
c3RBbmltYXRpb247CisKKyAgICB9OworCisgICAgTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnNl
dEFuaW1hdGlvbkRpcmVjdGlvbkZvcndhcmQgPSBmdW5jdGlvbiAoIG5hbWUgKSB7CisKKyAgICAg
ICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdOworCisgICAgICAg
IGlmICggYW5pbWF0aW9uICkgeworCisgICAgICAgICAgICBhbmltYXRpb24uZGlyZWN0aW9uID0g
MTsKKyAgICAgICAgICAgIGFuaW1hdGlvbi5kaXJlY3Rpb25CYWNrd2FyZHMgPSBmYWxzZTsKKwor
ICAgICAgICB9CisKKyAgICB9OworCisgICAgTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnNldEFu
aW1hdGlvbkRpcmVjdGlvbkJhY2t3YXJkID0gZnVuY3Rpb24gKCBuYW1lICkgeworCisgICAgICAg
IHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTsKKworICAgICAgICBp
ZiAoIGFuaW1hdGlvbiApIHsKKworICAgICAgICAgICAgYW5pbWF0aW9uLmRpcmVjdGlvbiA9IC0g
MTsKKyAgICAgICAgICAgIGFuaW1hdGlvbi5kaXJlY3Rpb25CYWNrd2FyZHMgPSB0cnVlOworCisg
ICAgICAgIH0KKworICAgIH07CisKKyAgICBNb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuc2V0QW5p
bWF0aW9uRlBTID0gZnVuY3Rpb24gKCBuYW1lLCBmcHMgKSB7CisKKyAgICAgICAgdmFyIGFuaW1h
dGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdOworCisgICAgICAgIGlmICggYW5pbWF0
aW9uICkgeworCisgICAgICAgICAgICBhbmltYXRpb24uZnBzID0gZnBzOworICAgICAgICAgICAg
YW5pbWF0aW9uLmR1cmF0aW9uID0gKCBhbmltYXRpb24uZW5kIC0gYW5pbWF0aW9uLnN0YXJ0ICkg
LyBhbmltYXRpb24uZnBzOworCisgICAgICAgIH0KKworICAgIH07CisKKyAgICBNb3JwaEJsZW5k
TWVzaC5wcm90b3R5cGUuc2V0QW5pbWF0aW9uRHVyYXRpb24gPSBmdW5jdGlvbiAoIG5hbWUsIGR1
cmF0aW9uICkgeworCisgICAgICAgIHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBb
IG5hbWUgXTsKKworICAgICAgICBpZiAoIGFuaW1hdGlvbiApIHsKKworICAgICAgICAgICAgYW5p
bWF0aW9uLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgICBhbmltYXRpb24uZnBzID0g
KCBhbmltYXRpb24uZW5kIC0gYW5pbWF0aW9uLnN0YXJ0ICkgLyBhbmltYXRpb24uZHVyYXRpb247
CisKKyAgICAgICAgfQorCisgICAgfTsKKworICAgIE1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5z
ZXRBbmltYXRpb25XZWlnaHQgPSBmdW5jdGlvbiAoIG5hbWUsIHdlaWdodCApIHsKKworICAgICAg
ICB2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07CisKKyAgICAgICAg
aWYgKCBhbmltYXRpb24gKSB7CisKKyAgICAgICAgICAgIGFuaW1hdGlvbi53ZWlnaHQgPSB3ZWln
aHQ7CisKKyAgICAgICAgfQorCisgICAgfTsKKworICAgIE1vcnBoQmxlbmRNZXNoLnByb3RvdHlw
ZS5zZXRBbmltYXRpb25UaW1lID0gZnVuY3Rpb24gKCBuYW1lLCB0aW1lICkgeworCisgICAgICAg
IHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTsKKworICAgICAgICBp
ZiAoIGFuaW1hdGlvbiApIHsKKworICAgICAgICAgICAgYW5pbWF0aW9uLnRpbWUgPSB0aW1lOwor
CisgICAgICAgIH0KKworICAgIH07CisKKyAgICBNb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuZ2V0
QW5pbWF0aW9uVGltZSA9IGZ1bmN0aW9uICggbmFtZSApIHsKKworICAgICAgICB2YXIgdGltZSA9
IDA7CisKKyAgICAgICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBd
OworCisgICAgICAgIGlmICggYW5pbWF0aW9uICkgeworCisgICAgICAgICAgICB0aW1lID0gYW5p
bWF0aW9uLnRpbWU7CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aW1lOworCisgICAg
fTsKKworICAgIE1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5nZXRBbmltYXRpb25EdXJhdGlvbiA9
IGZ1bmN0aW9uICggbmFtZSApIHsKKworICAgICAgICB2YXIgZHVyYXRpb24gPSAtIDE7CisKKyAg
ICAgICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdOworCisgICAg
ICAgIGlmICggYW5pbWF0aW9uICkgeworCisgICAgICAgICAgICBkdXJhdGlvbiA9IGFuaW1hdGlv
bi5kdXJhdGlvbjsKKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGR1cmF0aW9uOworCisg
ICAgfTsKKworICAgIE1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5wbGF5QW5pbWF0aW9uID0gZnVu
Y3Rpb24gKCBuYW1lICkgeworCisgICAgICAgIHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlv
bnNNYXBbIG5hbWUgXTsKKworICAgICAgICBpZiAoIGFuaW1hdGlvbiApIHsKKworICAgICAgICAg
ICAgYW5pbWF0aW9uLnRpbWUgPSAwOworICAgICAgICAgICAgYW5pbWF0aW9uLmFjdGl2ZSA9IHRy
dWU7CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJuKCAiVEhS
RUUuTW9ycGhCbGVuZE1lc2g6IGFuaW1hdGlvblsiICsgbmFtZSArICJdIHVuZGVmaW5lZCBpbiAu
cGxheUFuaW1hdGlvbigpIiApOworCisgICAgICAgIH0KKworICAgIH07CisKKyAgICBNb3JwaEJs
ZW5kTWVzaC5wcm90b3R5cGUuc3RvcEFuaW1hdGlvbiA9IGZ1bmN0aW9uICggbmFtZSApIHsKKwor
ICAgICAgICB2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07CisKKyAg
ICAgICAgaWYgKCBhbmltYXRpb24gKSB7CisKKyAgICAgICAgICAgIGFuaW1hdGlvbi5hY3RpdmUg
PSBmYWxzZTsKKworICAgICAgICB9CisKKyAgICB9OworCisgICAgTW9ycGhCbGVuZE1lc2gucHJv
dG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICggZGVsdGEgKSB7CisKKyAgICAgICAgZm9yICggdmFy
IGkgPSAwLCBpbCA9IHRoaXMuYW5pbWF0aW9uc0xpc3QubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7
CisKKyAgICAgICAgICAgIHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNMaXN0WyBpIF07
CisKKyAgICAgICAgICAgIGlmICggISBhbmltYXRpb24uYWN0aXZlICkgY29udGludWU7CisKKyAg
ICAgICAgICAgIHZhciBmcmFtZVRpbWUgPSBhbmltYXRpb24uZHVyYXRpb24gLyBhbmltYXRpb24u
bGVuZ3RoOworCisgICAgICAgICAgICBhbmltYXRpb24udGltZSArPSBhbmltYXRpb24uZGlyZWN0
aW9uICogZGVsdGE7CisKKyAgICAgICAgICAgIGlmICggYW5pbWF0aW9uLm1pcnJvcmVkTG9vcCAp
IHsKKworICAgICAgICAgICAgICAgIGlmICggYW5pbWF0aW9uLnRpbWUgPiBhbmltYXRpb24uZHVy
YXRpb24gfHwgYW5pbWF0aW9uLnRpbWUgPCAwICkgeworCisgICAgICAgICAgICAgICAgICAgIGFu
aW1hdGlvbi5kaXJlY3Rpb24gKj0gLSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmICggYW5p
bWF0aW9uLnRpbWUgPiBhbmltYXRpb24uZHVyYXRpb24gKSB7CisKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGFuaW1hdGlvbi50aW1lID0gYW5pbWF0aW9uLmR1cmF0aW9uOworICAgICAgICAgICAg
ICAgICAgICAgICAgYW5pbWF0aW9uLmRpcmVjdGlvbkJhY2t3YXJkcyA9IHRydWU7CisKKyAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggYW5pbWF0aW9uLnRp
bWUgPCAwICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24udGltZSA9IDA7
CisgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24uZGlyZWN0aW9uQmFja3dhcmRzID0g
ZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgYW5pbWF0aW9uLnRpbWUgPSBh
bmltYXRpb24udGltZSAlIGFuaW1hdGlvbi5kdXJhdGlvbjsKKworICAgICAgICAgICAgICAgIGlm
ICggYW5pbWF0aW9uLnRpbWUgPCAwICkgYW5pbWF0aW9uLnRpbWUgKz0gYW5pbWF0aW9uLmR1cmF0
aW9uOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBrZXlmcmFtZSA9IGFuaW1h
dGlvbi5zdGFydCArIF9NYXRoLmNsYW1wKCBNYXRoLmZsb29yKCBhbmltYXRpb24udGltZSAvIGZy
YW1lVGltZSApLCAwLCBhbmltYXRpb24ubGVuZ3RoIC0gMSApOworICAgICAgICAgICAgdmFyIHdl
aWdodCA9IGFuaW1hdGlvbi53ZWlnaHQ7CisKKyAgICAgICAgICAgIGlmICgga2V5ZnJhbWUgIT09
IGFuaW1hdGlvbi5jdXJyZW50RnJhbWUgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLm1vcnBo
VGFyZ2V0SW5mbHVlbmNlc1sgYW5pbWF0aW9uLmxhc3RGcmFtZSBdID0gMDsKKyAgICAgICAgICAg
ICAgICB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgYW5pbWF0aW9uLmN1cnJlbnRGcmFtZSBd
ID0gMSAqIHdlaWdodDsKKworICAgICAgICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXRJbmZsdWVu
Y2VzWyBrZXlmcmFtZSBdID0gMDsKKworICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5sYXN0RnJh
bWUgPSBhbmltYXRpb24uY3VycmVudEZyYW1lOworICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5j
dXJyZW50RnJhbWUgPSBrZXlmcmFtZTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2
YXIgbWl4ID0gKCBhbmltYXRpb24udGltZSAlIGZyYW1lVGltZSApIC8gZnJhbWVUaW1lOworCisg
ICAgICAgICAgICBpZiAoIGFuaW1hdGlvbi5kaXJlY3Rpb25CYWNrd2FyZHMgKSBtaXggPSAxIC0g
bWl4OworCisgICAgICAgICAgICBpZiAoIGFuaW1hdGlvbi5jdXJyZW50RnJhbWUgIT09IGFuaW1h
dGlvbi5sYXN0RnJhbWUgKSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0SW5m
bHVlbmNlc1sgYW5pbWF0aW9uLmN1cnJlbnRGcmFtZSBdID0gbWl4ICogd2VpZ2h0OworICAgICAg
ICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBhbmltYXRpb24ubGFzdEZyYW1l
IF0gPSAoIDEgLSBtaXggKSAqIHdlaWdodDsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAg
ICAgICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBhbmltYXRpb24uY3VycmVu
dEZyYW1lIF0gPSB3ZWlnaHQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9
OworCisgICAgLyoqCisgICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVh
bGlhLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIEltbWVkaWF0ZVJlbmRlck9iamVjdCgg
bWF0ZXJpYWwgKSB7CisKKyAgICAgICAgT2JqZWN0M0QuY2FsbCggdGhpcyApOworCisgICAgICAg
IHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDsKKyAgICAgICAgdGhpcy5yZW5kZXIgPSBmdW5jdGlv
biAoIHJlbmRlckNhbGxiYWNrICkge307CisKKyAgICB9CisKKyAgICBJbW1lZGlhdGVSZW5kZXJP
YmplY3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7Cisg
ICAgSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEltbWVkaWF0
ZVJlbmRlck9iamVjdDsKKworICAgIEltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90b3R5cGUuaXNJ
bW1lZGlhdGVSZW5kZXJPYmplY3QgPSB0cnVlOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBt
cmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8g
aHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKKyAgICAqLworCisgICAgZnVuY3Rpb24gVmVy
dGV4Tm9ybWFsc0hlbHBlciggb2JqZWN0LCBzaXplLCBoZXgsIGxpbmV3aWR0aCApIHsKKworICAg
ICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKKworICAgICAgICB0aGlzLnNpemUgPSAoIHNpemUg
IT09IHVuZGVmaW5lZCApID8gc2l6ZSA6IDE7CisKKyAgICAgICAgdmFyIGNvbG9yID0gKCBoZXgg
IT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZjAwMDA7CisKKyAgICAgICAgdmFyIHdpZHRoID0g
KCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8gbGluZXdpZHRoIDogMTsKKworICAgICAgICAv
LworCisgICAgICAgIHZhciBuTm9ybWFscyA9IDA7CisKKyAgICAgICAgdmFyIG9iakdlb21ldHJ5
ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7CisKKyAgICAgICAgaWYgKCBvYmpHZW9tZXRyeSAmJiBv
YmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkgeworCisgICAgICAgICAgICBuTm9ybWFscyA9IG9iakdl
b21ldHJ5LmZhY2VzLmxlbmd0aCAqIDM7CisKKyAgICAgICAgfSBlbHNlIGlmICggb2JqR2VvbWV0
cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKKworICAgICAgICAgICAgbk5v
cm1hbHMgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC5jb3VudDsKKworICAgICAgICB9
CisKKyAgICAgICAgLy8KKworICAgICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0
cnkoKTsKKworICAgICAgICB2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1
dGUoIG5Ob3JtYWxzICogMiAqIDMsIDMgKTsKKworICAgICAgICBnZW9tZXRyeS5hZGRBdHRyaWJ1
dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucyApOworCisgICAgICAgIExpbmVTZWdtZW50cy5jYWxs
KCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwg
bGluZXdpZHRoOiB3aWR0aCB9ICkgKTsKKworICAgICAgICAvLworCisgICAgICAgIHRoaXMubWF0
cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworCisgICAgICAgIHRoaXMudXBkYXRlKCk7CisKKyAgICB9
CisKKyAgICBWZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExp
bmVTZWdtZW50cy5wcm90b3R5cGUgKTsKKyAgICBWZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlw
ZS5jb25zdHJ1Y3RvciA9IFZlcnRleE5vcm1hbHNIZWxwZXI7CisKKyAgICBWZXJ0ZXhOb3JtYWxz
SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSAoIGZ1bmN0aW9uICgpIHsKKworICAgICAgICB2YXIg
djEgPSBuZXcgVmVjdG9yMygpOworICAgICAgICB2YXIgdjIgPSBuZXcgVmVjdG9yMygpOworICAg
ICAgICB2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKTsKKworICAgICAgICByZXR1cm4g
ZnVuY3Rpb24gdXBkYXRlKCkgeworCisgICAgICAgICAgICB2YXIga2V5cyA9IFsgJ2EnLCAnYics
ICdjJyBdOworCisgICAgICAgICAgICB0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1
ZSApOworCisgICAgICAgICAgICBub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB0aGlzLm9i
amVjdC5tYXRyaXhXb3JsZCApOworCisgICAgICAgICAgICB2YXIgbWF0cml4V29ybGQgPSB0aGlz
Lm9iamVjdC5tYXRyaXhXb3JsZDsKKworICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5n
ZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOworCisgICAgICAgICAgICAvLworCisgICAgICAg
ICAgICB2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTsKKworICAgICAgICAg
ICAgaWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkgeworCisgICAg
ICAgICAgICAgICAgdmFyIHZlcnRpY2VzID0gb2JqR2VvbWV0cnkudmVydGljZXM7CisKKyAgICAg
ICAgICAgICAgICB2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlczsKKworICAgICAgICAgICAg
ICAgIHZhciBpZHggPSAwOworCisgICAgICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0g
ZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAgICAgICAgICAgICB2YXIg
ZmFjZSA9IGZhY2VzWyBpIF07CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGogPSAw
LCBqbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKKworICAg
ICAgICAgICAgICAgICAgICAgICAgdmFyIHZlcnRleCA9IHZlcnRpY2VzWyBmYWNlWyBrZXlzWyBq
IF0gXSBdOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9ybWFsID0gZmFjZS52ZXJ0
ZXhOb3JtYWxzWyBqIF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHYxLmNvcHkoIHZlcnRl
eCApLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgdjIuY29weSggbm9ybWFsICkuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxp
emUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApOworCisgICAgICAgICAg
ICAgICAgICAgICAgICBwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApOwor
CisgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBpZHggKyAxOworCisgICAgICAgICAgICAg
ICAgICAgICAgICBwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApOworCisg
ICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBpZHggKyAxOworCisgICAgICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmICggb2Jq
R2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKKworICAgICAgICAg
ICAgICAgIHZhciBvYmpQb3MgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOworCisg
ICAgICAgICAgICAgICAgdmFyIG9iak5vcm0gPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1h
bDsKKworICAgICAgICAgICAgICAgIHZhciBpZHggPSAwOworCisgICAgICAgICAgICAgICAgLy8g
Zm9yIHNpbXBsaWNpdHksIGlnbm9yZSBpbmRleCBhbmQgZHJhd2NhbGxzLCBhbmQgcmVuZGVyIGV2
ZXJ5IG5vcm1hbAorCisgICAgICAgICAgICAgICAgZm9yICggdmFyIGogPSAwLCBqbCA9IG9ialBv
cy5jb3VudDsgaiA8IGpsOyBqICsrICkgeworCisgICAgICAgICAgICAgICAgICAgIHYxLnNldCgg
b2JqUG9zLmdldFgoIGogKSwgb2JqUG9zLmdldFkoIGogKSwgb2JqUG9zLmdldFooIGogKSApLmFw
cGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsKKworICAgICAgICAgICAgICAgICAgICB2Mi5zZXQo
IG9iak5vcm0uZ2V0WCggaiApLCBvYmpOb3JtLmdldFkoIGogKSwgb2JqTm9ybS5nZXRaKCBqICkg
KTsKKworICAgICAgICAgICAgICAgICAgICB2Mi5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCAp
Lm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7CisKKyAg
ICAgICAgICAgICAgICAgICAgcG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnog
KTsKKworICAgICAgICAgICAgICAgICAgICBpZHggPSBpZHggKyAxOworCisgICAgICAgICAgICAg
ICAgICAgIHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7CisKKyAgICAg
ICAgICAgICAgICAgICAgaWR4ID0gaWR4ICsgMTsKKworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7CisK
KyAgICAgICAgfTsKKworICAgIH0oKSApOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBhbHRl
cmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KKyAgICAgKiBAYXV0aG9yIG1yZG9vYiAv
IGh0dHA6Ly9tcmRvb2IuY29tLworICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8v
Z2l0aHViLmNvbS9XZXN0TGFuZ2xleQorICAgICovCisKKyAgICBmdW5jdGlvbiBTcG90TGlnaHRI
ZWxwZXIoIGxpZ2h0ICkgeworCisgICAgICAgIE9iamVjdDNELmNhbGwoIHRoaXMgKTsKKworICAg
ICAgICB0aGlzLmxpZ2h0ID0gbGlnaHQ7CisgICAgICAgIHRoaXMubGlnaHQudXBkYXRlTWF0cml4
V29ybGQoKTsKKworICAgICAgICB0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkOworICAg
ICAgICB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKKworICAgICAgICB2YXIgZ2VvbWV0
cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKworICAgICAgICB2YXIgcG9zaXRpb25zID0gWwor
ICAgICAgICAgICAgMCwgMCwgMCwgICAwLCAgIDAsICAgMSwKKyAgICAgICAgICAgIDAsIDAsIDAs
ICAgMSwgICAwLCAgIDEsCisgICAgICAgICAgICAwLCAwLCAwLCAtIDEsICAgMCwgICAxLAorICAg
ICAgICAgICAgMCwgMCwgMCwgICAwLCAgIDEsICAgMSwKKyAgICAgICAgICAgIDAsIDAsIDAsICAg
MCwgLSAxLCAgIDEKKyAgICAgICAgXTsKKworICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGogPSAx
LCBsID0gMzI7IGkgPCBsOyBpICsrLCBqICsrICkgeworCisgICAgICAgICAgICB2YXIgcDEgPSAo
IGkgLyBsICkgKiBNYXRoLlBJICogMjsKKyAgICAgICAgICAgIHZhciBwMiA9ICggaiAvIGwgKSAq
IE1hdGguUEkgKiAyOworCisgICAgICAgICAgICBwb3NpdGlvbnMucHVzaCgKKyAgICAgICAgICAg
ICAgICBNYXRoLmNvcyggcDEgKSwgTWF0aC5zaW4oIHAxICksIDEsCisgICAgICAgICAgICAgICAg
TWF0aC5jb3MoIHAyICksIE1hdGguc2luKCBwMiApLCAxCisgICAgICAgICAgICApOworCisgICAg
ICAgIH0KKworICAgICAgICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBG
bG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApOworCisgICAgICAgIHZhciBt
YXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZhbHNlIH0gKTsKKworICAg
ICAgICB0aGlzLmNvbmUgPSBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsK
KyAgICAgICAgdGhpcy5hZGQoIHRoaXMuY29uZSApOworCisgICAgICAgIHRoaXMudXBkYXRlKCk7
CisKKyAgICB9CisKKyAgICBTcG90TGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0
ZSggT2JqZWN0M0QucHJvdG90eXBlICk7CisgICAgU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IFNwb3RMaWdodEhlbHBlcjsKKworICAgIFNwb3RMaWdodEhlbHBlci5wcm90
b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsKKworICAgICAgICB0aGlzLmNvbmUuZ2VvbWV0
cnkuZGlzcG9zZSgpOworICAgICAgICB0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpOworCisg
ICAgfTsKKworICAgIFNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24g
KCkgeworCisgICAgICAgIHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpOworICAgICAgICB2YXIg
dmVjdG9yMiA9IG5ldyBWZWN0b3IzKCk7CisKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0
ZSgpIHsKKworICAgICAgICAgICAgdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOworCisg
ICAgICAgICAgICB2YXIgY29uZUxlbmd0aCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxp
Z2h0LmRpc3RhbmNlIDogMTAwMDsKKyAgICAgICAgICAgIHZhciBjb25lV2lkdGggPSBjb25lTGVu
Z3RoICogTWF0aC50YW4oIHRoaXMubGlnaHQuYW5nbGUgKTsKKworICAgICAgICAgICAgdGhpcy5j
b25lLnNjYWxlLnNldCggY29uZVdpZHRoLCBjb25lV2lkdGgsIGNvbmVMZW5ndGggKTsKKworICAg
ICAgICAgICAgdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhX
b3JsZCApOworICAgICAgICAgICAgdmVjdG9yMi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMu
bGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7CisKKyAgICAgICAgICAgIHRoaXMuY29uZS5sb29r
QXQoIHZlY3RvcjIuc3ViKCB2ZWN0b3IgKSApOworCisgICAgICAgICAgICB0aGlzLmNvbmUubWF0
ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApOworCisgICAgICAgIH07CisKKyAg
ICB9KCk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIFNlYW4gR3JpZmZpbiAvIGh0dHA6Ly90
d2l0dGVyLmNvbS9zZ3JpZgorICAgICAqIEBhdXRob3IgTWljaGFlbCBHdWVycmVybyAvIGh0dHA6
Ly9yZWFsaXR5bWVsdGRvd24uY29tCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJk
b29iLmNvbS8KKyAgICAgKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb20KKyAgICAg
KiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NworICAgICAqLwor
CisgICAgZnVuY3Rpb24gZ2V0Qm9uZUxpc3QoIG9iamVjdCApIHsKKworICAgICAgICB2YXIgYm9u
ZUxpc3QgPSBbXTsKKworICAgICAgICBpZiAoIG9iamVjdCAmJiBvYmplY3QuaXNCb25lICkgewor
CisgICAgICAgICAgICBib25lTGlzdC5wdXNoKCBvYmplY3QgKTsKKworICAgICAgICB9CisKKyAg
ICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0LmNoaWxkcmVuLmxlbmd0aDsgaSArKyAp
IHsKKworICAgICAgICAgICAgYm9uZUxpc3QucHVzaC5hcHBseSggYm9uZUxpc3QsIGdldEJvbmVM
aXN0KCBvYmplY3QuY2hpbGRyZW5bIGkgXSApICk7CisKKyAgICAgICAgfQorCisgICAgICAgIHJl
dHVybiBib25lTGlzdDsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIFNrZWxldG9uSGVscGVyKCBv
YmplY3QgKSB7CisKKyAgICAgICAgdmFyIGJvbmVzID0gZ2V0Qm9uZUxpc3QoIG9iamVjdCApOwor
CisgICAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOworCisgICAgICAg
IHZhciB2ZXJ0aWNlcyA9IFtdOworICAgICAgICB2YXIgY29sb3JzID0gW107CisKKyAgICAgICAg
dmFyIGNvbG9yMSA9IG5ldyBDb2xvciggMCwgMCwgMSApOworICAgICAgICB2YXIgY29sb3IyID0g
bmV3IENvbG9yKCAwLCAxLCAwICk7CisKKyAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgYm9u
ZXMubGVuZ3RoOyBpICsrICkgeworCisgICAgICAgICAgICB2YXIgYm9uZSA9IGJvbmVzWyBpIF07
CisKKyAgICAgICAgICAgIGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkg
eworCisgICAgICAgICAgICAgICAgdmVydGljZXMucHVzaCggMCwgMCwgMCApOworICAgICAgICAg
ICAgICAgIHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKKyAgICAgICAgICAgICAgICBjb2xvcnMu
cHVzaCggY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiApOworICAgICAgICAgICAgICAgIGNv
bG9ycy5wdXNoKCBjb2xvcjIuciwgY29sb3IyLmcsIGNvbG9yMi5iICk7CisKKyAgICAgICAgICAg
IH0KKworICAgICAgICB9CisKKyAgICAgICAgZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRp
b24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOworICAgICAg
ICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmli
dXRlKCBjb2xvcnMsIDMgKSApOworCisgICAgICAgIHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFz
aWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycywgZGVwdGhUZXN0OiBmYWxz
ZSwgZGVwdGhXcml0ZTogZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTsKKworICAgICAgICBM
aW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7CisKKyAgICAgICAg
dGhpcy5yb290ID0gb2JqZWN0OworICAgICAgICB0aGlzLmJvbmVzID0gYm9uZXM7CisKKyAgICAg
ICAgdGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7CisgICAgICAgIHRoaXMubWF0cml4
QXV0b1VwZGF0ZSA9IGZhbHNlOworCisgICAgICAgIHRoaXMub25CZWZvcmVSZW5kZXIoKTsKKwor
ICAgIH0KKworICAgIFNrZWxldG9uSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExp
bmVTZWdtZW50cy5wcm90b3R5cGUgKTsKKyAgICBTa2VsZXRvbkhlbHBlci5wcm90b3R5cGUuY29u
c3RydWN0b3IgPSBTa2VsZXRvbkhlbHBlcjsKKworICAgIFNrZWxldG9uSGVscGVyLnByb3RvdHlw
ZS5vbkJlZm9yZVJlbmRlciA9IGZ1bmN0aW9uICgpIHsKKworICAgICAgICB2YXIgdmVjdG9yID0g
bmV3IFZlY3RvcjMoKTsKKworICAgICAgICB2YXIgYm9uZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7
CisgICAgICAgIHZhciBtYXRyaXhXb3JsZEludiA9IG5ldyBNYXRyaXg0KCk7CisKKyAgICAgICAg
cmV0dXJuIGZ1bmN0aW9uIG9uQmVmb3JlUmVuZGVyKCkgeworCisgICAgICAgICAgICB2YXIgYm9u
ZXMgPSB0aGlzLmJvbmVzOworCisgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21l
dHJ5OworICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAn
cG9zaXRpb24nICk7CisKKyAgICAgICAgICAgIG1hdHJpeFdvcmxkSW52LmdldEludmVyc2UoIHRo
aXMucm9vdC5tYXRyaXhXb3JsZCApOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGog
PSAwOyBpIDwgYm9uZXMubGVuZ3RoOyBpICsrICkgeworCisgICAgICAgICAgICAgICAgdmFyIGJv
bmUgPSBib25lc1sgaSBdOworCisgICAgICAgICAgICAgICAgaWYgKCBib25lLnBhcmVudCAmJiBi
b25lLnBhcmVudC5pc0JvbmUgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgYm9uZU1hdHJpeC5t
dWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZEludiwgYm9uZS5tYXRyaXhXb3JsZCApOworICAg
ICAgICAgICAgICAgICAgICB2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBib25lTWF0cml4
ICk7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnNldFhZWiggaiwgdmVjdG9yLngsIHZl
Y3Rvci55LCB2ZWN0b3IueiApOworCisgICAgICAgICAgICAgICAgICAgIGJvbmVNYXRyaXgubXVs
dGlwbHlNYXRyaWNlcyggbWF0cml4V29ybGRJbnYsIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxkICk7
CisgICAgICAgICAgICAgICAgICAgIHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGJvbmVN
YXRyaXggKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24uc2V0WFlaKCBqICsgMSwgdmVj
dG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApOworCisgICAgICAgICAgICAgICAgICAgIGogKz0g
MjsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBn
ZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7CisK
KyAgICAgICAgfTsKKworICAgIH0oKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgYWx0ZXJl
ZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBo
dHRwOi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFBvaW50TGlnaHRIZWxw
ZXIoIGxpZ2h0LCBzcGhlcmVTaXplICkgeworCisgICAgICAgIHRoaXMubGlnaHQgPSBsaWdodDsK
KyAgICAgICAgdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOworCisgICAgICAgIHZhciBn
ZW9tZXRyeSA9IG5ldyBTcGhlcmVCdWZmZXJHZW9tZXRyeSggc3BoZXJlU2l6ZSwgNCwgMiApOwor
ICAgICAgICB2YXIgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1l
OiB0cnVlLCBmb2c6IGZhbHNlIH0gKTsKKyAgICAgICAgbWF0ZXJpYWwuY29sb3IuY29weSggdGhp
cy5saWdodC5jb2xvciApOworCisgICAgICAgIE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1h
dGVyaWFsICk7CisKKyAgICAgICAgdGhpcy5tYXRyaXggPSB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxk
OworICAgICAgICB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKKworICAgICAgICAvKgor
ICAgICAgICB2YXIgZGlzdGFuY2VHZW9tZXRyeSA9IG5ldyBUSFJFRS5JY29zYWhlZHJvbkdlb21l
dHJ5KCAxLCAyICk7CisgICAgICAgIHZhciBkaXN0YW5jZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1l
c2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXhDb2xvciwgZm9nOiBmYWxzZSwgd2lyZWZyYW1l
OiB0cnVlLCBvcGFjaXR5OiAwLjEsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTsKKworICAgICAgICB0
aGlzLmxpZ2h0U3BoZXJlID0gbmV3IFRIUkVFLk1lc2goIGJ1bGJHZW9tZXRyeSwgYnVsYk1hdGVy
aWFsICk7CisgICAgICAgIHRoaXMubGlnaHREaXN0YW5jZSA9IG5ldyBUSFJFRS5NZXNoKCBkaXN0
YW5jZUdlb21ldHJ5LCBkaXN0YW5jZU1hdGVyaWFsICk7CisKKyAgICAgICAgdmFyIGQgPSBsaWdo
dC5kaXN0YW5jZTsKKworICAgICAgICBpZiAoIGQgPT09IDAuMCApIHsKKworICAgICAgICAgICAg
dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTsKKworICAgICAgICB9IGVsc2Ugewor
CisgICAgICAgICAgICB0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7CisK
KyAgICAgICAgfQorCisgICAgICAgIHRoaXMuYWRkKCB0aGlzLmxpZ2h0RGlzdGFuY2UgKTsKKyAg
ICAgICAgKi8KKworICAgIH0KKworICAgIFBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2Jq
ZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKTsKKyAgICBQb2ludExpZ2h0SGVscGVyLnByb3Rv
dHlwZS5jb25zdHJ1Y3RvciA9IFBvaW50TGlnaHRIZWxwZXI7CisKKyAgICBQb2ludExpZ2h0SGVs
cGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgeworCisgICAgICAgIHRoaXMuZ2Vv
bWV0cnkuZGlzcG9zZSgpOworICAgICAgICB0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTsKKworICAg
IH07CisKKyAgICBQb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAo
KSB7CisKKyAgICAgICAgdGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9y
ICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgdmFyIGQgPSB0aGlzLmxpZ2h0LmRpc3RhbmNlOwor
CisgICAgICAgIGlmICggZCA9PT0gMC4wICkgeworCisgICAgICAgICAgICB0aGlzLmxpZ2h0RGlz
dGFuY2UudmlzaWJsZSA9IGZhbHNlOworCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAg
IHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMubGln
aHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTsKKworICAgICAgICB9CisgICAgICAgICov
CisKKyAgICB9OworCisgICAgLyoqCisgICAgICogQGF1dGhvciBhYmVsbmF0aW9uIC8gaHR0cDov
L2dpdGh1Yi5jb20vYWJlbG5hdGlvbgorICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9n
aXRodWIuY29tL011Z2VuODcKKyAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dp
dGh1Yi5jb20vV2VzdExhbmdsZXkKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIFJlY3RBcmVhTGln
aHRIZWxwZXIoIGxpZ2h0ICkgeworCisgICAgICAgIE9iamVjdDNELmNhbGwoIHRoaXMgKTsKKwor
ICAgICAgICB0aGlzLmxpZ2h0ID0gbGlnaHQ7CisgICAgICAgIHRoaXMubGlnaHQudXBkYXRlTWF0
cml4V29ybGQoKTsKKworICAgICAgICB0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkOwor
ICAgICAgICB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKKworICAgICAgICB2YXIgbWF0
ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGxpZ2h0LmNvbG9yIH0gKTsK
KworICAgICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKworICAgICAg
ICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUo
IG5ldyBGbG9hdDMyQXJyYXkoIDUgKiAzICksIDMgKSApOworCisgICAgICAgIHRoaXMuYWRkKCBu
ZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICkgKTsKKworICAgICAgICB0aGlzLnVwZGF0ZSgp
OworCisgICAgfQorCisgICAgUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3Qu
Y3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsKKyAgICBSZWN0QXJlYUxpZ2h0SGVscGVyLnBy
b3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlY3RBcmVhTGlnaHRIZWxwZXI7CisKKyAgICBSZWN0QXJl
YUxpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgeworCisgICAgICAg
IHRoaXMuY2hpbGRyZW5bIDAgXS5nZW9tZXRyeS5kaXNwb3NlKCk7CisgICAgICAgIHRoaXMuY2hp
bGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7CisKKyAgICB9OworCisgICAgUmVjdEFyZWFM
aWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkgeworCisgICAgICAgIHZh
ciBsaW5lID0gdGhpcy5jaGlsZHJlblsgMCBdOworCisgICAgICAgIC8vIHVwZGF0ZSBtYXRlcmlh
bAorCisgICAgICAgIGxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciAp
OworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgaGVscGVyCisK
KyAgICAgICAgdmFyIGh4ID0gdGhpcy5saWdodC53aWR0aCAqIDAuNTsKKyAgICAgICAgdmFyIGh5
ID0gdGhpcy5saWdodC5oZWlnaHQgKiAwLjU7CisKKyAgICAgICAgdmFyIHBvc2l0aW9uID0gbGlu
ZS5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOworICAgICAgICB2YXIgYXJyYXkgPSBwb3Np
dGlvbi5hcnJheTsKKworICAgICAgICAvLyB1cGRhdGUgdmVydGljZXMKKworICAgICAgICBhcnJh
eVsgIDAgXSA9ICAgaHg7IGFycmF5WyAgMSBdID0gLSBoeTsgYXJyYXlbICAyIF0gPSAwOworICAg
ICAgICBhcnJheVsgIDMgXSA9ICAgaHg7IGFycmF5WyAgNCBdID0gICBoeTsgYXJyYXlbICA1IF0g
PSAwOworICAgICAgICBhcnJheVsgIDYgXSA9IC0gaHg7IGFycmF5WyAgNyBdID0gICBoeTsgYXJy
YXlbICA4IF0gPSAwOworICAgICAgICBhcnJheVsgIDkgXSA9IC0gaHg7IGFycmF5WyAxMCBdID0g
LSBoeTsgYXJyYXlbIDExIF0gPSAwOworICAgICAgICBhcnJheVsgMTIgXSA9ICAgaHg7IGFycmF5
WyAxMyBdID0gLSBoeTsgYXJyYXlbIDE0IF0gPSAwOworCisgICAgICAgIHBvc2l0aW9uLm5lZWRz
VXBkYXRlID0gdHJ1ZTsKKworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIGFsdGVy
ZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworICAgICAqIEBhdXRob3IgbXJkb29iIC8g
aHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRo
dWIuY29tL011Z2VuODcKKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIEhlbWlzcGhlcmVMaWdodEhl
bHBlciggbGlnaHQsIHNpemUgKSB7CisKKyAgICAgICAgT2JqZWN0M0QuY2FsbCggdGhpcyApOwor
CisgICAgICAgIHRoaXMubGlnaHQgPSBsaWdodDsKKyAgICAgICAgdGhpcy5saWdodC51cGRhdGVN
YXRyaXhXb3JsZCgpOworCisgICAgICAgIHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7
CisgICAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworCisgICAgICAgIHZhciBn
ZW9tZXRyeSA9IG5ldyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHNpemUgKTsKKyAgICAgICAg
Z2VvbWV0cnkucm90YXRlWSggTWF0aC5QSSAqIDAuNSApOworCisgICAgICAgIHZhciBtYXRlcmlh
bCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycywg
d2lyZWZyYW1lOiB0cnVlIH0gKTsKKworICAgICAgICB2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5n
ZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTsKKyAgICAgICAgdmFyIGNvbG9ycyA9IG5ldyBGbG9h
dDMyQXJyYXkoIHBvc2l0aW9uLmNvdW50ICogMyApOworCisgICAgICAgIGdlb21ldHJ5LmFkZEF0
dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTsKKwor
ICAgICAgICB0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApICk7CisKKyAg
ICAgICAgdGhpcy51cGRhdGUoKTsKKworICAgIH0KKworICAgIEhlbWlzcGhlcmVMaWdodEhlbHBl
ci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsKKyAgICBI
ZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSGVtaXNwaGVyZUxp
Z2h0SGVscGVyOworCisgICAgSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3Nl
ID0gZnVuY3Rpb24gKCkgeworCisgICAgICAgIHRoaXMuY2hpbGRyZW5bIDAgXS5nZW9tZXRyeS5k
aXNwb3NlKCk7CisgICAgICAgIHRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7
CisKKyAgICB9OworCisgICAgSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUg
PSBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgdmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7CisK
KyAgICAgICAgdmFyIGNvbG9yMSA9IG5ldyBDb2xvcigpOworICAgICAgICB2YXIgY29sb3IyID0g
bmV3IENvbG9yKCk7CisKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHsKKworICAg
ICAgICAgICAgdmFyIG1lc2ggPSB0aGlzLmNoaWxkcmVuWyAwIF07CisKKyAgICAgICAgICAgIHZh
ciBjb2xvcnMgPSBtZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ2NvbG9yJyApOworCisgICAg
ICAgICAgICBjb2xvcjEuY29weSggdGhpcy5saWdodC5jb2xvciApOworICAgICAgICAgICAgY29s
b3IyLmNvcHkoIHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IgKTsKKworICAgICAgICAgICAgZm9yICgg
dmFyIGkgPSAwLCBsID0gY29sb3JzLmNvdW50OyBpIDwgbDsgaSArKyApIHsKKworICAgICAgICAg
ICAgICAgIHZhciBjb2xvciA9ICggaSA8ICggbCAvIDIgKSApID8gY29sb3IxIDogY29sb3IyOwor
CisgICAgICAgICAgICAgICAgY29sb3JzLnNldFhZWiggaSwgY29sb3IuciwgY29sb3IuZywgY29s
b3IuYiApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lc2gubG9va0F0KCB2ZWN0
b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICkubmVnYXRl
KCkgKTsKKworICAgICAgICAgICAgY29sb3JzLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworICAgICAg
ICB9OworCisgICAgfSgpOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRw
Oi8vbXJkb29iLmNvbS8KKyAgICAgKi8KKworICAgIGZ1bmN0aW9uIEdyaWRIZWxwZXIoIHNpemUs
IGRpdmlzaW9ucywgY29sb3IxLCBjb2xvcjIgKSB7CisKKyAgICAgICAgc2l6ZSA9IHNpemUgfHwg
MTA7CisgICAgICAgIGRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCAxMDsKKyAgICAgICAgY29sb3Ix
ID0gbmV3IENvbG9yKCBjb2xvcjEgIT09IHVuZGVmaW5lZCA/IGNvbG9yMSA6IDB4NDQ0NDQ0ICk7
CisgICAgICAgIGNvbG9yMiA9IG5ldyBDb2xvciggY29sb3IyICE9PSB1bmRlZmluZWQgPyBjb2xv
cjIgOiAweDg4ODg4OCApOworCisgICAgICAgIHZhciBjZW50ZXIgPSBkaXZpc2lvbnMgLyAyOwor
ICAgICAgICB2YXIgc3RlcCA9IHNpemUgLyBkaXZpc2lvbnM7CisgICAgICAgIHZhciBoYWxmU2l6
ZSA9IHNpemUgLyAyOworCisgICAgICAgIHZhciB2ZXJ0aWNlcyA9IFtdLCBjb2xvcnMgPSBbXTsK
KworICAgICAgICBmb3IgKCB2YXIgaSA9IDAsIGogPSAwLCBrID0gLSBoYWxmU2l6ZTsgaSA8PSBk
aXZpc2lvbnM7IGkgKyssIGsgKz0gc3RlcCApIHsKKworICAgICAgICAgICAgdmVydGljZXMucHVz
aCggLSBoYWxmU2l6ZSwgMCwgaywgaGFsZlNpemUsIDAsIGsgKTsKKyAgICAgICAgICAgIHZlcnRp
Y2VzLnB1c2goIGssIDAsIC0gaGFsZlNpemUsIGssIDAsIGhhbGZTaXplICk7CisKKyAgICAgICAg
ICAgIHZhciBjb2xvciA9IGkgPT09IGNlbnRlciA/IGNvbG9yMSA6IGNvbG9yMjsKKworICAgICAg
ICAgICAgY29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMzsKKyAgICAgICAgICAgIGNv
bG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7CisgICAgICAgICAgICBjb2xvci50b0Fy
cmF5KCBjb2xvcnMsIGogKTsgaiArPSAzOworICAgICAgICAgICAgY29sb3IudG9BcnJheSggY29s
b3JzLCBqICk7IGogKz0gMzsKKworICAgICAgICB9CisKKyAgICAgICAgdmFyIGdlb21ldHJ5ID0g
bmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisgICAgICAgIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bv
c2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKyAg
ICAgICAgZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0
dHJpYnV0ZSggY29sb3JzLCAzICkgKTsKKworICAgICAgICB2YXIgbWF0ZXJpYWwgPSBuZXcgTGlu
ZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApOworCisgICAg
ICAgIExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKKworICAg
IH0KKworICAgIEdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21l
bnRzLnByb3RvdHlwZSApOworICAgIEdyaWRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0g
R3JpZEhlbHBlcjsKKworICAgIC8qKgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21y
ZG9vYi5jb20vCisgICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVn
ZW44NworICAgICAqIEBhdXRob3IgSGVjdGF0ZSAvIGh0dHA6Ly93d3cuZ2l0aHViLmNvbS9IZWN0
YXRlCisgICAgICovCisKKyAgICBmdW5jdGlvbiBQb2xhckdyaWRIZWxwZXIoIHJhZGl1cywgcmFk
aWFscywgY2lyY2xlcywgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHsKKworICAgICAgICBy
YWRpdXMgPSByYWRpdXMgfHwgMTA7CisgICAgICAgIHJhZGlhbHMgPSByYWRpYWxzIHx8IDE2Owor
ICAgICAgICBjaXJjbGVzID0gY2lyY2xlcyB8fCA4OworICAgICAgICBkaXZpc2lvbnMgPSBkaXZp
c2lvbnMgfHwgNjQ7CisgICAgICAgIGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICE9PSB1bmRl
ZmluZWQgPyBjb2xvcjEgOiAweDQ0NDQ0NCApOworICAgICAgICBjb2xvcjIgPSBuZXcgQ29sb3Io
IGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTsKKworICAgICAgICB2
YXIgdmVydGljZXMgPSBbXTsKKyAgICAgICAgdmFyIGNvbG9ycyA9IFtdOworCisgICAgICAgIHZh
ciB4LCB6OworICAgICAgICB2YXIgdiwgaSwgaiwgciwgY29sb3I7CisKKyAgICAgICAgLy8gY3Jl
YXRlIHRoZSByYWRpYWxzCisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gcmFkaWFsczsgaSAr
KyApIHsKKworICAgICAgICAgICAgdiA9ICggaSAvIHJhZGlhbHMgKSAqICggTWF0aC5QSSAqIDIg
KTsKKworICAgICAgICAgICAgeCA9IE1hdGguc2luKCB2ICkgKiByYWRpdXM7CisgICAgICAgICAg
ICB6ID0gTWF0aC5jb3MoIHYgKSAqIHJhZGl1czsKKworICAgICAgICAgICAgdmVydGljZXMucHVz
aCggMCwgMCwgMCApOworICAgICAgICAgICAgdmVydGljZXMucHVzaCggeCwgMCwgeiApOworCisg
ICAgICAgICAgICBjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjsKKworICAgICAg
ICAgICAgY29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTsKKyAgICAgICAg
ICAgIGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7CisKKyAgICAgICAg
fQorCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgY2lyY2xlcworCisgICAgICAgIGZvciAoIGkgPSAw
OyBpIDw9IGNpcmNsZXM7IGkgKysgKSB7CisKKyAgICAgICAgICAgIGNvbG9yID0gKCBpICYgMSAp
ID8gY29sb3IxIDogY29sb3IyOworCisgICAgICAgICAgICByID0gcmFkaXVzIC0gKCByYWRpdXMg
LyBjaXJjbGVzICogaSApOworCisgICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGRpdmlzaW9u
czsgaiArKyApIHsKKworICAgICAgICAgICAgICAgIC8vIGZpcnN0IHZlcnRleAorCisgICAgICAg
ICAgICAgICAgdiA9ICggaiAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApOworCisgICAg
ICAgICAgICAgICAgeCA9IE1hdGguc2luKCB2ICkgKiByOworICAgICAgICAgICAgICAgIHogPSBN
YXRoLmNvcyggdiApICogcjsKKworICAgICAgICAgICAgICAgIHZlcnRpY2VzLnB1c2goIHgsIDAs
IHogKTsKKyAgICAgICAgICAgICAgICBjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29s
b3IuYiApOworCisgICAgICAgICAgICAgICAgLy8gc2Vjb25kIHZlcnRleAorCisgICAgICAgICAg
ICAgICAgdiA9ICggKCBqICsgMSApIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7CisK
KyAgICAgICAgICAgICAgICB4ID0gTWF0aC5zaW4oIHYgKSAqIHI7CisgICAgICAgICAgICAgICAg
eiA9IE1hdGguY29zKCB2ICkgKiByOworCisgICAgICAgICAgICAgICAgdmVydGljZXMucHVzaCgg
eCwgMCwgeiApOworICAgICAgICAgICAgICAgIGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5n
LCBjb2xvci5iICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgdmFy
IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisgICAgICAgIGdlb21ldHJ5LmFkZEF0
dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2Vz
LCAzICkgKTsKKyAgICAgICAgZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxv
YXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTsKKworICAgICAgICB2YXIgbWF0ZXJp
YWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMg
fSApOworCisgICAgICAgIExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJp
YWwgKTsKKworICAgIH0KKworICAgIFBvbGFyR3JpZEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3Qu
Y3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7CisgICAgUG9sYXJHcmlkSGVscGVyLnBy
b3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbGFyR3JpZEhlbHBlcjsKKworICAgIC8qKgorICAgICAq
IEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1dGhvciBXZXN0
TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CisgICAgKi8KKworICAgIGZ1
bmN0aW9uIEZhY2VOb3JtYWxzSGVscGVyKCBvYmplY3QsIHNpemUsIGhleCwgbGluZXdpZHRoICkg
eworCisgICAgICAgIC8vIEZhY2VOb3JtYWxzSGVscGVyIG9ubHkgc3VwcG9ydHMgVEhSRUUuR2Vv
bWV0cnkKKworICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKKworICAgICAgICB0aGlzLnNp
emUgPSAoIHNpemUgIT09IHVuZGVmaW5lZCApID8gc2l6ZSA6IDE7CisKKyAgICAgICAgdmFyIGNv
bG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7CisKKyAgICAgICAg
dmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8gbGluZXdpZHRoIDogMTsK
KworICAgICAgICAvLworCisgICAgICAgIHZhciBuTm9ybWFscyA9IDA7CisKKyAgICAgICAgdmFy
IG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7CisKKyAgICAgICAgaWYgKCBvYmpH
ZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkgeworCisgICAgICAgICAgICBuTm9y
bWFscyA9IG9iakdlb21ldHJ5LmZhY2VzLmxlbmd0aDsKKworICAgICAgICB9IGVsc2UgeworCisg
ICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5GYWNlTm9ybWFsc0hlbHBlcjogb25seSBU
SFJFRS5HZW9tZXRyeSBpcyBzdXBwb3J0ZWQuIFVzZSBUSFJFRS5WZXJ0ZXhOb3JtYWxzSGVscGVy
LCBpbnN0ZWFkLicgKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8KKworICAgICAgICB2YXIg
Z2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKworICAgICAgICB2YXIgcG9zaXRpb25z
ID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5Ob3JtYWxzICogMiAqIDMsIDMgKTsKKwor
ICAgICAgICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucyApOwor
CisgICAgICAgIExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNp
Y01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgbGluZXdpZHRoOiB3aWR0aCB9ICkgKTsKKworICAg
ICAgICAvLworCisgICAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworICAgICAg
ICB0aGlzLnVwZGF0ZSgpOworCisgICAgfQorCisgICAgRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90
eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApOworICAgIEZhY2VO
b3JtYWxzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZhY2VOb3JtYWxzSGVscGVyOwor
CisgICAgRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkg
eworCisgICAgICAgIHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CisgICAgICAgIHZhciB2MiA9IG5l
dyBWZWN0b3IzKCk7CisgICAgICAgIHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpOwor
CisgICAgICAgIHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7CisKKyAgICAgICAgICAgIHRoaXMu
b2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7CisKKyAgICAgICAgICAgIG5vcm1hbE1h
dHJpeC5nZXROb3JtYWxNYXRyaXgoIHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkICk7CisKKyAgICAg
ICAgICAgIHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkOworCisgICAg
ICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247
CisKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIHZhciBvYmpHZW9tZXRyeSA9IHRoaXMu
b2JqZWN0Lmdlb21ldHJ5OworCisgICAgICAgICAgICB2YXIgdmVydGljZXMgPSBvYmpHZW9tZXRy
eS52ZXJ0aWNlczsKKworICAgICAgICAgICAgdmFyIGZhY2VzID0gb2JqR2VvbWV0cnkuZmFjZXM7
CisKKyAgICAgICAgICAgIHZhciBpZHggPSAwOworCisgICAgICAgICAgICBmb3IgKCB2YXIgaSA9
IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgeworCisgICAgICAgICAgICAgICAg
dmFyIGZhY2UgPSBmYWNlc1sgaSBdOworCisgICAgICAgICAgICAgICAgdmFyIG5vcm1hbCA9IGZh
Y2Uubm9ybWFsOworCisgICAgICAgICAgICAgICAgdjEuY29weSggdmVydGljZXNbIGZhY2UuYSBd
ICkKKyAgICAgICAgICAgICAgICAgICAgLmFkZCggdmVydGljZXNbIGZhY2UuYiBdICkKKyAgICAg
ICAgICAgICAgICAgICAgLmFkZCggdmVydGljZXNbIGZhY2UuYyBdICkKKyAgICAgICAgICAgICAg
ICAgICAgLmRpdmlkZVNjYWxhciggMyApCisgICAgICAgICAgICAgICAgICAgIC5hcHBseU1hdHJp
eDQoIG1hdHJpeFdvcmxkICk7CisKKyAgICAgICAgICAgICAgICB2Mi5jb3B5KCBub3JtYWwgKS5h
cHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0
aGlzLnNpemUgKS5hZGQoIHYxICk7CisKKyAgICAgICAgICAgICAgICBwb3NpdGlvbi5zZXRYWVoo
IGlkeCwgdjEueCwgdjEueSwgdjEueiApOworCisgICAgICAgICAgICAgICAgaWR4ID0gaWR4ICsg
MTsKKworICAgICAgICAgICAgICAgIHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2
Mi56ICk7CisKKyAgICAgICAgICAgICAgICBpZHggPSBpZHggKyAxOworCisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTsKKworICAgICAgICB9
OworCisgICAgfSgpICk7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0
cDovL2FsdGVyZWRxdWFsaWEuY29tLworICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21y
ZG9vYi5jb20vCisgICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29t
L1dlc3RMYW5nbGV5CisgICAgICovCisKKyAgICBmdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0SGVs
cGVyKCBsaWdodCwgc2l6ZSApIHsKKworICAgICAgICBPYmplY3QzRC5jYWxsKCB0aGlzICk7CisK
KyAgICAgICAgdGhpcy5saWdodCA9IGxpZ2h0OworICAgICAgICB0aGlzLmxpZ2h0LnVwZGF0ZU1h
dHJpeFdvcmxkKCk7CisKKyAgICAgICAgdGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDsK
KyAgICAgICAgdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CisKKyAgICAgICAgaWYgKCBz
aXplID09PSB1bmRlZmluZWQgKSBzaXplID0gMTsKKworICAgICAgICB2YXIgZ2VvbWV0cnkgPSBu
ZXcgQnVmZmVyR2VvbWV0cnkoKTsKKyAgICAgICAgZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9z
aXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWworICAgICAgICAgICAgLSBzaXpl
LCAgIHNpemUsIDAsCisgICAgICAgICAgICAgIHNpemUsICAgc2l6ZSwgMCwKKyAgICAgICAgICAg
ICAgc2l6ZSwgLSBzaXplLCAwLAorICAgICAgICAgICAgLSBzaXplLCAtIHNpemUsIDAsCisgICAg
ICAgICAgICAtIHNpemUsICAgc2l6ZSwgMAorICAgICAgICBdLCAzICkgKTsKKworICAgICAgICB2
YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7CisK
KyAgICAgICAgdGhpcy5hZGQoIG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSApOworCisg
ICAgICAgIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CisgICAgICAgIGdlb21ldHJ5
LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsg
MCwgMCwgMCwgMCwgMCwgMSBdLCAzICkgKTsKKworICAgICAgICB0aGlzLmFkZCggbmV3IExpbmUo
IGdlb21ldHJ5LCBtYXRlcmlhbCApKTsKKworICAgICAgICB0aGlzLnVwZGF0ZSgpOworCisgICAg
fQorCisgICAgRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRl
KCBPYmplY3QzRC5wcm90b3R5cGUgKTsKKyAgICBEaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3Rv
dHlwZS5jb25zdHJ1Y3RvciA9IERpcmVjdGlvbmFsTGlnaHRIZWxwZXI7CisKKyAgICBEaXJlY3Rp
b25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgeworCisgICAg
ICAgIHZhciBsaWdodFBsYW5lID0gdGhpcy5jaGlsZHJlblsgMCBdOworICAgICAgICB2YXIgdGFy
Z2V0TGluZSA9IHRoaXMuY2hpbGRyZW5bIDEgXTsKKworICAgICAgICBsaWdodFBsYW5lLmdlb21l
dHJ5LmRpc3Bvc2UoKTsKKyAgICAgICAgbGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCk7Cisg
ICAgICAgIHRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpOworICAgICAgICB0YXJnZXRMaW5l
Lm1hdGVyaWFsLmRpc3Bvc2UoKTsKKworICAgIH07CisKKyAgICBEaXJlY3Rpb25hbExpZ2h0SGVs
cGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgdmFyIHYxID0g
bmV3IFZlY3RvcjMoKTsKKyAgICAgICAgdmFyIHYyID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAg
dmFyIHYzID0gbmV3IFZlY3RvcjMoKTsKKworICAgICAgICByZXR1cm4gZnVuY3Rpb24gdXBkYXRl
KCkgeworCisgICAgICAgICAgICB2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQu
bWF0cml4V29ybGQgKTsKKyAgICAgICAgICAgIHYyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhp
cy5saWdodC50YXJnZXQubWF0cml4V29ybGQgKTsKKyAgICAgICAgICAgIHYzLnN1YlZlY3RvcnMo
IHYyLCB2MSApOworCisgICAgICAgICAgICB2YXIgbGlnaHRQbGFuZSA9IHRoaXMuY2hpbGRyZW5b
IDAgXTsKKyAgICAgICAgICAgIHZhciB0YXJnZXRMaW5lID0gdGhpcy5jaGlsZHJlblsgMSBdOwor
CisgICAgICAgICAgICBsaWdodFBsYW5lLmxvb2tBdCggdjMgKTsKKyAgICAgICAgICAgIGxpZ2h0
UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApOworCisgICAgICAg
ICAgICB0YXJnZXRMaW5lLmxvb2tBdCggdjMgKTsKKyAgICAgICAgICAgIHRhcmdldExpbmUuc2Nh
bGUueiA9IHYzLmxlbmd0aCgpOworCisgICAgICAgIH07CisKKyAgICB9KCk7CisKKyAgICAvKioK
KyAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLworICAg
ICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CisgICAgICoK
KyAgICAgKiAgLSBzaG93cyBmcnVzdHVtLCBsaW5lIG9mIHNpZ2h0IGFuZCB1cCBvZiB0aGUgY2Ft
ZXJhCisgICAgICogIC0gc3VpdGFibGUgZm9yIGZhc3QgdXBkYXRlcworICAgICAqICAtIGJhc2Vk
IG9uIGZydXN0dW0gdmlzdWFsaXphdGlvbiBpbiBsaWdodGdsLmpzIHNoYWRvd21hcCBleGFtcGxl
CisgICAgICogICAgICBodHRwOi8vZXZhbncuZ2l0aHViLmNvbS9saWdodGdsLmpzL3Rlc3RzL3No
YWRvd21hcC5odG1sCisgICAgICovCisKKyAgICBmdW5jdGlvbiBDYW1lcmFIZWxwZXIoIGNhbWVy
YSApIHsKKworICAgICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKKyAg
ICAgICAgdmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZm
ZmZmZiwgdmVydGV4Q29sb3JzOiBGYWNlQ29sb3JzIH0gKTsKKworICAgICAgICB2YXIgdmVydGlj
ZXMgPSBbXTsKKyAgICAgICAgdmFyIGNvbG9ycyA9IFtdOworCisgICAgICAgIHZhciBwb2ludE1h
cCA9IHt9OworCisgICAgICAgIC8vIGNvbG9ycworCisgICAgICAgIHZhciBjb2xvckZydXN0dW0g
PSBuZXcgQ29sb3IoIDB4ZmZhYTAwICk7CisgICAgICAgIHZhciBjb2xvckNvbmUgPSBuZXcgQ29s
b3IoIDB4ZmYwMDAwICk7CisgICAgICAgIHZhciBjb2xvclVwID0gbmV3IENvbG9yKCAweDAwYWFm
ZiApOworICAgICAgICB2YXIgY29sb3JUYXJnZXQgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7Cisg
ICAgICAgIHZhciBjb2xvckNyb3NzID0gbmV3IENvbG9yKCAweDMzMzMzMyApOworCisgICAgICAg
IC8vIG5lYXIKKworICAgICAgICBhZGRMaW5lKCAibjEiLCAibjIiLCBjb2xvckZydXN0dW0gKTsK
KyAgICAgICAgYWRkTGluZSggIm4yIiwgIm40IiwgY29sb3JGcnVzdHVtICk7CisgICAgICAgIGFk
ZExpbmUoICJuNCIsICJuMyIsIGNvbG9yRnJ1c3R1bSApOworICAgICAgICBhZGRMaW5lKCAibjMi
LCAibjEiLCBjb2xvckZydXN0dW0gKTsKKworICAgICAgICAvLyBmYXIKKworICAgICAgICBhZGRM
aW5lKCAiZjEiLCAiZjIiLCBjb2xvckZydXN0dW0gKTsKKyAgICAgICAgYWRkTGluZSggImYyIiwg
ImY0IiwgY29sb3JGcnVzdHVtICk7CisgICAgICAgIGFkZExpbmUoICJmNCIsICJmMyIsIGNvbG9y
RnJ1c3R1bSApOworICAgICAgICBhZGRMaW5lKCAiZjMiLCAiZjEiLCBjb2xvckZydXN0dW0gKTsK
KworICAgICAgICAvLyBzaWRlcworCisgICAgICAgIGFkZExpbmUoICJuMSIsICJmMSIsIGNvbG9y
RnJ1c3R1bSApOworICAgICAgICBhZGRMaW5lKCAibjIiLCAiZjIiLCBjb2xvckZydXN0dW0gKTsK
KyAgICAgICAgYWRkTGluZSggIm4zIiwgImYzIiwgY29sb3JGcnVzdHVtICk7CisgICAgICAgIGFk
ZExpbmUoICJuNCIsICJmNCIsIGNvbG9yRnJ1c3R1bSApOworCisgICAgICAgIC8vIGNvbmUKKwor
ICAgICAgICBhZGRMaW5lKCAicCIsICJuMSIsIGNvbG9yQ29uZSApOworICAgICAgICBhZGRMaW5l
KCAicCIsICJuMiIsIGNvbG9yQ29uZSApOworICAgICAgICBhZGRMaW5lKCAicCIsICJuMyIsIGNv
bG9yQ29uZSApOworICAgICAgICBhZGRMaW5lKCAicCIsICJuNCIsIGNvbG9yQ29uZSApOworCisg
ICAgICAgIC8vIHVwCisKKyAgICAgICAgYWRkTGluZSggInUxIiwgInUyIiwgY29sb3JVcCApOwor
ICAgICAgICBhZGRMaW5lKCAidTIiLCAidTMiLCBjb2xvclVwICk7CisgICAgICAgIGFkZExpbmUo
ICJ1MyIsICJ1MSIsIGNvbG9yVXAgKTsKKworICAgICAgICAvLyB0YXJnZXQKKworICAgICAgICBh
ZGRMaW5lKCAiYyIsICJ0IiwgY29sb3JUYXJnZXQgKTsKKyAgICAgICAgYWRkTGluZSggInAiLCAi
YyIsIGNvbG9yQ3Jvc3MgKTsKKworICAgICAgICAvLyBjcm9zcworCisgICAgICAgIGFkZExpbmUo
ICJjbjEiLCAiY24yIiwgY29sb3JDcm9zcyApOworICAgICAgICBhZGRMaW5lKCAiY24zIiwgImNu
NCIsIGNvbG9yQ3Jvc3MgKTsKKworICAgICAgICBhZGRMaW5lKCAiY2YxIiwgImNmMiIsIGNvbG9y
Q3Jvc3MgKTsKKyAgICAgICAgYWRkTGluZSggImNmMyIsICJjZjQiLCBjb2xvckNyb3NzICk7CisK
KyAgICAgICAgZnVuY3Rpb24gYWRkTGluZSggYSwgYiwgY29sb3IgKSB7CisKKyAgICAgICAgICAg
IGFkZFBvaW50KCBhLCBjb2xvciApOworICAgICAgICAgICAgYWRkUG9pbnQoIGIsIGNvbG9yICk7
CisKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGFkZFBvaW50KCBpZCwgY29sb3IgKSB7
CisKKyAgICAgICAgICAgIHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKKyAgICAgICAgICAgIGNv
bG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7CisKKyAgICAgICAgICAgIGlm
ICggcG9pbnRNYXBbIGlkIF0gPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIHBv
aW50TWFwWyBpZCBdID0gW107CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9pbnRN
YXBbIGlkIF0ucHVzaCggKCB2ZXJ0aWNlcy5sZW5ndGggLyAzICkgLSAxICk7CisKKyAgICAgICAg
fQorCisgICAgICAgIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0
MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKKyAgICAgICAgZ2VvbWV0cnkuYWRk
QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAz
ICkgKTsKKworICAgICAgICBMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVy
aWFsICk7CisKKyAgICAgICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7CisgICAgICAgIGlmICggdGhp
cy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCApIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2pl
Y3Rpb25NYXRyaXgoKTsKKworICAgICAgICB0aGlzLm1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3Js
ZDsKKyAgICAgICAgdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CisKKyAgICAgICAgdGhp
cy5wb2ludE1hcCA9IHBvaW50TWFwOworCisgICAgICAgIHRoaXMudXBkYXRlKCk7CisKKyAgICB9
CisKKyAgICBDYW1lcmFIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21l
bnRzLnByb3RvdHlwZSApOworICAgIENhbWVyYUhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3Ig
PSBDYW1lcmFIZWxwZXI7CisKKyAgICBDYW1lcmFIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1
bmN0aW9uICgpIHsKKworICAgICAgICB2YXIgZ2VvbWV0cnksIHBvaW50TWFwOworCisgICAgICAg
IHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpOworICAgICAgICB2YXIgY2FtZXJhID0gbmV3IENh
bWVyYSgpOworCisgICAgICAgIGZ1bmN0aW9uIHNldFBvaW50KCBwb2ludCwgeCwgeSwgeiApIHsK
KworICAgICAgICAgICAgdmVjdG9yLnNldCggeCwgeSwgeiApLnVucHJvamVjdCggY2FtZXJhICk7
CisKKyAgICAgICAgICAgIHZhciBwb2ludHMgPSBwb2ludE1hcFsgcG9pbnQgXTsKKworICAgICAg
ICAgICAgaWYgKCBwb2ludHMgIT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIHZh
ciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApOworCisgICAg
ICAgICAgICAgICAgZm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkg
KysgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24uc2V0WFlaKCBwb2ludHNbIGkg
XSwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApOworCisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmdW5jdGlvbiB1
cGRhdGUoKSB7CisKKyAgICAgICAgICAgIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKKyAgICAg
ICAgICAgIHBvaW50TWFwID0gdGhpcy5wb2ludE1hcDsKKworICAgICAgICAgICAgdmFyIHcgPSAx
LCBoID0gMTsKKworICAgICAgICAgICAgLy8gd2UgbmVlZCBqdXN0IGNhbWVyYSBwcm9qZWN0aW9u
IG1hdHJpeAorICAgICAgICAgICAgLy8gd29ybGQgbWF0cml4IG11c3QgYmUgaWRlbnRpdHkKKwor
ICAgICAgICAgICAgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weSggdGhpcy5jYW1lcmEucHJv
amVjdGlvbk1hdHJpeCApOworCisgICAgICAgICAgICAvLyBjZW50ZXIgLyB0YXJnZXQKKworICAg
ICAgICAgICAgc2V0UG9pbnQoICJjIiwgMCwgMCwgLSAxICk7CisgICAgICAgICAgICBzZXRQb2lu
dCggInQiLCAwLCAwLCAgMSApOworCisgICAgICAgICAgICAvLyBuZWFyCisKKyAgICAgICAgICAg
IHNldFBvaW50KCAibjEiLCAtIHcsIC0gaCwgLSAxICk7CisgICAgICAgICAgICBzZXRQb2ludCgg
Im4yIiwgICB3LCAtIGgsIC0gMSApOworICAgICAgICAgICAgc2V0UG9pbnQoICJuMyIsIC0gdywg
ICBoLCAtIDEgKTsKKyAgICAgICAgICAgIHNldFBvaW50KCAibjQiLCAgIHcsICAgaCwgLSAxICk7
CisKKyAgICAgICAgICAgIC8vIGZhcgorCisgICAgICAgICAgICBzZXRQb2ludCggImYxIiwgLSB3
LCAtIGgsIDEgKTsKKyAgICAgICAgICAgIHNldFBvaW50KCAiZjIiLCAgIHcsIC0gaCwgMSApOwor
ICAgICAgICAgICAgc2V0UG9pbnQoICJmMyIsIC0gdywgICBoLCAxICk7CisgICAgICAgICAgICBz
ZXRQb2ludCggImY0IiwgICB3LCAgIGgsIDEgKTsKKworICAgICAgICAgICAgLy8gdXAKKworICAg
ICAgICAgICAgc2V0UG9pbnQoICJ1MSIsICAgdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7CisgICAg
ICAgICAgICBzZXRQb2ludCggInUyIiwgLSB3ICogMC43LCBoICogMS4xLCAtIDEgKTsKKyAgICAg
ICAgICAgIHNldFBvaW50KCAidTMiLCAgICAgICAgIDAsIGggKiAyLCAgIC0gMSApOworCisgICAg
ICAgICAgICAvLyBjcm9zcworCisgICAgICAgICAgICBzZXRQb2ludCggImNmMSIsIC0gdywgICAw
LCAxICk7CisgICAgICAgICAgICBzZXRQb2ludCggImNmMiIsICAgdywgICAwLCAxICk7CisgICAg
ICAgICAgICBzZXRQb2ludCggImNmMyIsICAgMCwgLSBoLCAxICk7CisgICAgICAgICAgICBzZXRQ
b2ludCggImNmNCIsICAgMCwgICBoLCAxICk7CisKKyAgICAgICAgICAgIHNldFBvaW50KCAiY24x
IiwgLSB3LCAgIDAsIC0gMSApOworICAgICAgICAgICAgc2V0UG9pbnQoICJjbjIiLCAgIHcsICAg
MCwgLSAxICk7CisgICAgICAgICAgICBzZXRQb2ludCggImNuMyIsICAgMCwgLSBoLCAtIDEgKTsK
KyAgICAgICAgICAgIHNldFBvaW50KCAiY240IiwgICAwLCAgIGgsIC0gMSApOworCisgICAgICAg
ICAgICBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRy
dWU7CisKKyAgICAgICAgfTsKKworICAgIH0oKTsKKworICAgIC8qKgorICAgICAqIEBhdXRob3Ig
bXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0
cDovL2dpdGh1Yi5jb20vTXVnZW44NworICAgICAqLworCisgICAgZnVuY3Rpb24gQm94SGVscGVy
KCBvYmplY3QsIGNvbG9yICkgeworCisgICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OworCisg
ICAgICAgIGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7CisKKyAg
ICAgICAgdmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywg
MywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7
CisgICAgICAgIHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCA4ICogMyApOworCisg
ICAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOworICAgICAgICBnZW9t
ZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApICk7CisgICAg
ICAgIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0
ZSggcG9zaXRpb25zLCAzICkgKTsKKworICAgICAgICBMaW5lU2VnbWVudHMuY2FsbCggdGhpcywg
Z2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7CisK
KyAgICAgICAgdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CisKKyAgICAgICAgdGhpcy51
cGRhdGUoKTsKKworICAgIH0KKworICAgIEJveEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3Jl
YXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7CisgICAgQm94SGVscGVyLnByb3RvdHlwZS5j
b25zdHJ1Y3RvciA9IEJveEhlbHBlcjsKKworICAgIEJveEhlbHBlci5wcm90b3R5cGUudXBkYXRl
ID0gKCBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgdmFyIGJveCA9IG5ldyBCb3gzKCk7CisKKyAg
ICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkgeworCisgICAgICAgICAgICBp
ZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53
YXJuKCAnVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMu
JyApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggdGhpcy5vYmplY3QgIT09
IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgICAgIGJveC5zZXRGcm9tT2JqZWN0KCB0aGlz
Lm9iamVjdCApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggYm94LmlzRW1w
dHkoKSApIHJldHVybjsKKworICAgICAgICAgICAgdmFyIG1pbiA9IGJveC5taW47CisgICAgICAg
ICAgICB2YXIgbWF4ID0gYm94Lm1heDsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAg
NV9fX180CisgICAgICAgICAgICAxL19fXzAvfAorICAgICAgICAgICAgfCA2X198XzcKKyAgICAg
ICAgICAgIDIvX19fMy8KKworICAgICAgICAgICAgMDogbWF4LngsIG1heC55LCBtYXguegorICAg
ICAgICAgICAgMTogbWluLngsIG1heC55LCBtYXguegorICAgICAgICAgICAgMjogbWluLngsIG1p
bi55LCBtYXguegorICAgICAgICAgICAgMzogbWF4LngsIG1pbi55LCBtYXguegorICAgICAgICAg
ICAgNDogbWF4LngsIG1heC55LCBtaW4uegorICAgICAgICAgICAgNTogbWluLngsIG1heC55LCBt
aW4uegorICAgICAgICAgICAgNjogbWluLngsIG1pbi55LCBtaW4uegorICAgICAgICAgICAgNzog
bWF4LngsIG1pbi55LCBtaW4uegorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHBv
c2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOworICAgICAgICAgICAg
dmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7CisKKyAgICAgICAgICAgIGFycmF5WyAgMCBdID0g
bWF4Lng7IGFycmF5WyAgMSBdID0gbWF4Lnk7IGFycmF5WyAgMiBdID0gbWF4Lno7CisgICAgICAg
ICAgICBhcnJheVsgIDMgXSA9IG1pbi54OyBhcnJheVsgIDQgXSA9IG1heC55OyBhcnJheVsgIDUg
XSA9IG1heC56OworICAgICAgICAgICAgYXJyYXlbICA2IF0gPSBtaW4ueDsgYXJyYXlbICA3IF0g
PSBtaW4ueTsgYXJyYXlbICA4IF0gPSBtYXguejsKKyAgICAgICAgICAgIGFycmF5WyAgOSBdID0g
bWF4Lng7IGFycmF5WyAxMCBdID0gbWluLnk7IGFycmF5WyAxMSBdID0gbWF4Lno7CisgICAgICAg
ICAgICBhcnJheVsgMTIgXSA9IG1heC54OyBhcnJheVsgMTMgXSA9IG1heC55OyBhcnJheVsgMTQg
XSA9IG1pbi56OworICAgICAgICAgICAgYXJyYXlbIDE1IF0gPSBtaW4ueDsgYXJyYXlbIDE2IF0g
PSBtYXgueTsgYXJyYXlbIDE3IF0gPSBtaW4uejsKKyAgICAgICAgICAgIGFycmF5WyAxOCBdID0g
bWluLng7IGFycmF5WyAxOSBdID0gbWluLnk7IGFycmF5WyAyMCBdID0gbWluLno7CisgICAgICAg
ICAgICBhcnJheVsgMjEgXSA9IG1heC54OyBhcnJheVsgMjIgXSA9IG1pbi55OyBhcnJheVsgMjMg
XSA9IG1pbi56OworCisgICAgICAgICAgICBwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7CisK
KyAgICAgICAgICAgIHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CisKKyAg
ICAgICAgfTsKKworICAgIH0gKSgpOworCisgICAgQm94SGVscGVyLnByb3RvdHlwZS5zZXRGcm9t
T2JqZWN0ID0gZnVuY3Rpb24gKCBvYmplY3QgKSB7CisKKyAgICAgICAgdGhpcy5vYmplY3QgPSBv
YmplY3Q7CisgICAgICAgIHRoaXMudXBkYXRlKCk7CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisK
KyAgICB9OworCisgICAgLyoqCisgICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9n
aXRodWIuY29tL1dlc3RMYW5nbGV5CisgICAgICogQGF1dGhvciB6ejg1IC8gaHR0cDovL2dpdGh1
Yi5jb20veno4NQorICAgICAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KKyAg
ICAgKgorICAgICAqIENyZWF0ZXMgYW4gYXJyb3cgZm9yIHZpc3VhbGl6aW5nIGRpcmVjdGlvbnMK
KyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogIGRpciAtIFZlY3RvcjMKKyAgICAg
KiAgb3JpZ2luIC0gVmVjdG9yMworICAgICAqICBsZW5ndGggLSBOdW1iZXIKKyAgICAgKiAgY29s
b3IgLSBjb2xvciBpbiBoZXggdmFsdWUKKyAgICAgKiAgaGVhZExlbmd0aCAtIE51bWJlcgorICAg
ICAqICBoZWFkV2lkdGggLSBOdW1iZXIKKyAgICAgKi8KKworICAgIHZhciBsaW5lR2VvbWV0cnk7
CisgICAgdmFyIGNvbmVHZW9tZXRyeTsKKworICAgIGZ1bmN0aW9uIEFycm93SGVscGVyKCBkaXIs
IG9yaWdpbiwgbGVuZ3RoLCBjb2xvciwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkgeworCisgICAg
ICAgIC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQKKworICAgICAgICBPYmplY3Qz
RC5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgaWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29s
b3IgPSAweGZmZmYwMDsKKyAgICAgICAgaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIGxlbmd0
aCA9IDE7CisgICAgICAgIGlmICggaGVhZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0
aCA9IDAuMiAqIGxlbmd0aDsKKyAgICAgICAgaWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCAp
IGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7CisKKyAgICAgICAgaWYgKCBsaW5lR2VvbWV0
cnkgPT09IHVuZGVmaW5lZCApIHsKKworICAgICAgICAgICAgbGluZUdlb21ldHJ5ID0gbmV3IEJ1
ZmZlckdlb21ldHJ5KCk7CisgICAgICAgICAgICBsaW5lR2VvbWV0cnkuYWRkQXR0cmlidXRlKCAn
cG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAxLCAw
IF0sIDMgKSApOworCisgICAgICAgICAgICBjb25lR2VvbWV0cnkgPSBuZXcgQ3lsaW5kZXJCdWZm
ZXJHZW9tZXRyeSggMCwgMC41LCAxLCA1LCAxICk7CisgICAgICAgICAgICBjb25lR2VvbWV0cnku
dHJhbnNsYXRlKCAwLCAtIDAuNSwgMCApOworCisgICAgICAgIH0KKworICAgICAgICB0aGlzLnBv
c2l0aW9uLmNvcHkoIG9yaWdpbiApOworCisgICAgICAgIHRoaXMubGluZSA9IG5ldyBMaW5lKCBs
aW5lR2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7
CisgICAgICAgIHRoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CisgICAgICAgIHRo
aXMuYWRkKCB0aGlzLmxpbmUgKTsKKworICAgICAgICB0aGlzLmNvbmUgPSBuZXcgTWVzaCggY29u
ZUdlb21ldHJ5LCBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApOwor
ICAgICAgICB0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOworICAgICAgICB0aGlz
LmFkZCggdGhpcy5jb25lICk7CisKKyAgICAgICAgdGhpcy5zZXREaXJlY3Rpb24oIGRpciApOwor
ICAgICAgICB0aGlzLnNldExlbmd0aCggbGVuZ3RoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKTsK
KworICAgIH0KKworICAgIEFycm93SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9i
amVjdDNELnByb3RvdHlwZSApOworICAgIEFycm93SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rv
ciA9IEFycm93SGVscGVyOworCisgICAgQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldERpcmVjdGlv
biA9ICggZnVuY3Rpb24gKCkgeworCisgICAgICAgIHZhciBheGlzID0gbmV3IFZlY3RvcjMoKTsK
KyAgICAgICAgdmFyIHJhZGlhbnM7CisKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldERpcmVj
dGlvbiggZGlyICkgeworCisgICAgICAgICAgICAvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3Jt
YWxpemVkCisKKyAgICAgICAgICAgIGlmICggZGlyLnkgPiAwLjk5OTk5ICkgeworCisgICAgICAg
ICAgICAgICAgdGhpcy5xdWF0ZXJuaW9uLnNldCggMCwgMCwgMCwgMSApOworCisgICAgICAgICAg
ICB9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5OSApIHsKKworICAgICAgICAgICAgICAgIHRo
aXMucXVhdGVybmlvbi5zZXQoIDEsIDAsIDAsIDAgKTsKKworICAgICAgICAgICAgfSBlbHNlIHsK
KworICAgICAgICAgICAgICAgIGF4aXMuc2V0KCBkaXIueiwgMCwgLSBkaXIueCApLm5vcm1hbGl6
ZSgpOworCisgICAgICAgICAgICAgICAgcmFkaWFucyA9IE1hdGguYWNvcyggZGlyLnkgKTsKKwor
ICAgICAgICAgICAgICAgIHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBy
YWRpYW5zICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9OworCisgICAgfSgpICk7CisK
KyAgICBBcnJvd0hlbHBlci5wcm90b3R5cGUuc2V0TGVuZ3RoID0gZnVuY3Rpb24gKCBsZW5ndGgs
IGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHsKKworICAgICAgICBpZiAoIGhlYWRMZW5ndGggPT09
IHVuZGVmaW5lZCApIGhlYWRMZW5ndGggPSAwLjIgKiBsZW5ndGg7CisgICAgICAgIGlmICggaGVh
ZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoOworCisg
ICAgICAgIHRoaXMubGluZS5zY2FsZS5zZXQoIDEsIE1hdGgubWF4KCAwLCBsZW5ndGggLSBoZWFk
TGVuZ3RoICksIDEgKTsKKyAgICAgICAgdGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpOworCisgICAg
ICAgIHRoaXMuY29uZS5zY2FsZS5zZXQoIGhlYWRXaWR0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRo
ICk7CisgICAgICAgIHRoaXMuY29uZS5wb3NpdGlvbi55ID0gbGVuZ3RoOworICAgICAgICB0aGlz
LmNvbmUudXBkYXRlTWF0cml4KCk7CisKKyAgICB9OworCisgICAgQXJyb3dIZWxwZXIucHJvdG90
eXBlLnNldENvbG9yID0gZnVuY3Rpb24gKCBjb2xvciApIHsKKworICAgICAgICB0aGlzLmxpbmUu
bWF0ZXJpYWwuY29sb3IuY29weSggY29sb3IgKTsKKyAgICAgICAgdGhpcy5jb25lLm1hdGVyaWFs
LmNvbG9yLmNvcHkoIGNvbG9yICk7CisKKyAgICB9OworCisgICAgLyoqCisgICAgICogQGF1dGhv
ciBzcm91Y2hlcmF5IC8gaHR0cDovL3Nyb3VjaGVyYXkub3JnLworICAgICAqIEBhdXRob3IgbXJk
b29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisKKyAgICBmdW5jdGlvbiBBeGlzSGVs
cGVyKCBzaXplICkgeworCisgICAgICAgIHNpemUgPSBzaXplIHx8IDE7CisKKyAgICAgICAgdmFy
IHZlcnRpY2VzID0gWworICAgICAgICAgICAgMCwgMCwgMCwgIHNpemUsIDAsIDAsCisgICAgICAg
ICAgICAwLCAwLCAwLCAgMCwgc2l6ZSwgMCwKKyAgICAgICAgICAgIDAsIDAsIDAsICAwLCAwLCBz
aXplCisgICAgICAgIF07CisKKyAgICAgICAgdmFyIGNvbG9ycyA9IFsKKyAgICAgICAgICAgIDEs
IDAsIDAsICAxLCAwLjYsIDAsCisgICAgICAgICAgICAwLCAxLCAwLCAgMC42LCAxLCAwLAorICAg
ICAgICAgICAgMCwgMCwgMSwgIDAsIDAuNiwgMQorICAgICAgICBdOworCisgICAgICAgIHZhciBn
ZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOworICAgICAgICBnZW9tZXRyeS5hZGRBdHRy
aWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywg
MyApICk7CisgICAgICAgIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0
MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7CisKKyAgICAgICAgdmFyIG1hdGVyaWFs
ID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0g
KTsKKworICAgICAgICBMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFs
ICk7CisKKyAgICB9CisKKyAgICBBeGlzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUo
IExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTsKKyAgICBBeGlzSGVscGVyLnByb3RvdHlwZS5jb25z
dHJ1Y3RvciA9IEF4aXNIZWxwZXI7CisKKyAgICAvKioKKyAgICAgKiBAYXV0aG9yIHp6ODUgaHR0
cHM6Ly9naXRodWIuY29tL3p6ODUKKyAgICAgKgorICAgICAqIENlbnRyaXBldGFsIENhdG11bGxS
b20gQ3VydmUgLSB3aGljaCBpcyB1c2VmdWwgZm9yIGF2b2lkaW5nCisgICAgICogY3VzcHMgYW5k
IHNlbGYtaW50ZXJzZWN0aW9ucyBpbiBub24tdW5pZm9ybSBjYXRtdWxsIHJvbSBjdXJ2ZXMuCisg
ICAgICogaHR0cDovL3d3dy5jZW15dWtzZWwuY29tL3Jlc2VhcmNoL2NhdG11bGxyb21fcGFyYW0v
Y2F0bXVsbHJvbS5wZGYKKyAgICAgKgorICAgICAqIGN1cnZlLnR5cGUgYWNjZXB0cyBjZW50cmlw
ZXRhbChkZWZhdWx0KSwgY2hvcmRhbCBhbmQgY2F0bXVsbHJvbQorICAgICAqIGN1cnZlLnRlbnNp
b24gaXMgdXNlZCBmb3IgY2F0bXVsbHJvbSB3aGljaCBkZWZhdWx0cyB0byAwLjUKKyAgICAgKi8K
KworCisgICAgLyoKKyAgICBCYXNlZCBvbiBhbiBvcHRpbWl6ZWQgYysrIHNvbHV0aW9uIGluCisg
ICAgIC0gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85NDg5NzM2L2NhdG11bGwt
cm9tLWN1cnZlLXdpdGgtbm8tY3VzcHMtYW5kLW5vLXNlbGYtaW50ZXJzZWN0aW9ucy8KKyAgICAg
LSBodHRwOi8vaWRlb25lLmNvbS9Ob0ViVk0KKworICAgIFRoaXMgQ3ViaWNQb2x5IGNsYXNzIGNv
dWxkIGJlIHVzZWQgZm9yIHJldXNpbmcgc29tZSB2YXJpYWJsZXMgYW5kIGNhbGN1bGF0aW9ucywK
KyAgICBidXQgZm9yIHRocmVlLmpzIGN1cnZlIHVzZSwgaXQgY291bGQgYmUgcG9zc2libGUgaW5s
aW5lZCBhbmQgZmxhdHRlbiBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwKKyAgICB3aGljaCBj
YW4gYmUgcGxhY2VkIGluIEN1cnZlVXRpbHMuCisgICAgKi8KKworICAgIGZ1bmN0aW9uIEN1Ymlj
UG9seSgpIHsKKworICAgICAgICB2YXIgYzAgPSAwLCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwOwor
CisgICAgICAgIC8qCisgICAgICAgICAqIENvbXB1dGUgY29lZmZpY2llbnRzIGZvciBhIGN1Ymlj
IHBvbHlub21pYWwKKyAgICAgICAgICogICBwKHMpID0gYzAgKyBjMSpzICsgYzIqc14yICsgYzMq
c14zCisgICAgICAgICAqIHN1Y2ggdGhhdAorICAgICAgICAgKiAgIHAoMCkgPSB4MCwgcCgxKSA9
IHgxCisgICAgICAgICAqICBhbmQKKyAgICAgICAgICogICBwJygwKSA9IHQwLCBwJygxKSA9IHQx
LgorICAgICAgICAgKi8KKyAgICAgICAgZnVuY3Rpb24gaW5pdCggeDAsIHgxLCB0MCwgdDEgKSB7
CisKKyAgICAgICAgICAgIGMwID0geDA7CisgICAgICAgICAgICBjMSA9IHQwOworICAgICAgICAg
ICAgYzIgPSAtIDMgKiB4MCArIDMgKiB4MSAtIDIgKiB0MCAtIHQxOworICAgICAgICAgICAgYzMg
PSAyICogeDAgLSAyICogeDEgKyB0MCArIHQxOworCisgICAgICAgIH0KKworICAgICAgICByZXR1
cm4geworCisgICAgICAgICAgICBpbml0Q2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgy
LCB4MywgdGVuc2lvbiApIHsKKworICAgICAgICAgICAgICAgIGluaXQoIHgxLCB4MiwgdGVuc2lv
biAqICggeDIgLSB4MCApLCB0ZW5zaW9uICogKCB4MyAtIHgxICkgKTsKKworICAgICAgICAgICAg
fSwKKworICAgICAgICAgICAgaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOiBmdW5jdGlvbiAoIHgw
LCB4MSwgeDIsIHgzLCBkdDAsIGR0MSwgZHQyICkgeworCisgICAgICAgICAgICAgICAgLy8gY29t
cHV0ZSB0YW5nZW50cyB3aGVuIHBhcmFtZXRlcml6ZWQgaW4gW3QxLHQyXQorICAgICAgICAgICAg
ICAgIHZhciB0MSA9ICggeDEgLSB4MCApIC8gZHQwIC0gKCB4MiAtIHgwICkgLyAoIGR0MCArIGR0
MSApICsgKCB4MiAtIHgxICkgLyBkdDE7CisgICAgICAgICAgICAgICAgdmFyIHQyID0gKCB4MiAt
IHgxICkgLyBkdDEgLSAoIHgzIC0geDEgKSAvICggZHQxICsgZHQyICkgKyAoIHgzIC0geDIgKSAv
IGR0MjsKKworICAgICAgICAgICAgICAgIC8vIHJlc2NhbGUgdGFuZ2VudHMgZm9yIHBhcmFtZXRy
aXphdGlvbiBpbiBbMCwxXQorICAgICAgICAgICAgICAgIHQxICo9IGR0MTsKKyAgICAgICAgICAg
ICAgICB0MiAqPSBkdDE7CisKKyAgICAgICAgICAgICAgICBpbml0KCB4MSwgeDIsIHQxLCB0MiAp
OworCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICBjYWxjOiBmdW5jdGlvbiAoIHQgKSB7
CisKKyAgICAgICAgICAgICAgICB2YXIgdDIgPSB0ICogdDsKKyAgICAgICAgICAgICAgICB2YXIg
dDMgPSB0MiAqIHQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0
MiArIGMzICogdDM7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9OworCisgICAgfQorCisg
ICAgLy8KKworICAgIHZhciB0bXAgPSBuZXcgVmVjdG9yMygpOworICAgIHZhciBweCA9IG5ldyBD
dWJpY1BvbHkoKTsKKyAgICB2YXIgcHkgPSBuZXcgQ3ViaWNQb2x5KCk7CisgICAgdmFyIHB6ID0g
bmV3IEN1YmljUG9seSgpOworCisgICAgZnVuY3Rpb24gQ2F0bXVsbFJvbUN1cnZlMyggcG9pbnRz
ICkgeworCisgICAgICAgIEN1cnZlLmNhbGwoIHRoaXMgKTsKKworICAgICAgICBpZiAoIHBvaW50
cy5sZW5ndGggPCAyICkgY29uc29sZS53YXJuKCAnVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMzogUG9p
bnRzIGFycmF5IG5lZWRzIGF0IGxlYXN0IHR3byBlbnRyaWVzLicgKTsKKworICAgICAgICB0aGlz
LnBvaW50cyA9IHBvaW50cyB8fCBbXTsKKyAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTsKKwor
ICAgIH0KKworICAgIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSgg
Q3VydmUucHJvdG90eXBlICk7CisgICAgQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuY29uc3Ry
dWN0b3IgPSBDYXRtdWxsUm9tQ3VydmUzOworCisgICAgQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5
cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7CisKKyAgICAgICAgdmFyIHBvaW50cyA9IHRo
aXMucG9pbnRzOworICAgICAgICB2YXIgbCA9IHBvaW50cy5sZW5ndGg7CisKKyAgICAgICAgdmFy
IHBvaW50ID0gKCBsIC0gKCB0aGlzLmNsb3NlZCA/IDAgOiAxICkgKSAqIHQ7CisgICAgICAgIHZh
ciBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHBvaW50ICk7CisgICAgICAgIHZhciB3ZWlnaHQgPSBw
b2ludCAtIGludFBvaW50OworCisgICAgICAgIGlmICggdGhpcy5jbG9zZWQgKSB7CisKKyAgICAg
ICAgICAgIGludFBvaW50ICs9IGludFBvaW50ID4gMCA/IDAgOiAoIE1hdGguZmxvb3IoIE1hdGgu
YWJzKCBpbnRQb2ludCApIC8gcG9pbnRzLmxlbmd0aCApICsgMSApICogcG9pbnRzLmxlbmd0aDsK
KworICAgICAgICB9IGVsc2UgaWYgKCB3ZWlnaHQgPT09IDAgJiYgaW50UG9pbnQgPT09IGwgLSAx
ICkgeworCisgICAgICAgICAgICBpbnRQb2ludCA9IGwgLSAyOworICAgICAgICAgICAgd2VpZ2h0
ID0gMTsKKworICAgICAgICB9CisKKyAgICAgICAgdmFyIHAwLCBwMSwgcDIsIHAzOyAvLyA0IHBv
aW50cworCisgICAgICAgIGlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgPiAwICkgeworCisg
ICAgICAgICAgICBwMCA9IHBvaW50c1sgKCBpbnRQb2ludCAtIDEgKSAlIGwgXTsKKworICAgICAg
ICB9IGVsc2UgeworCisgICAgICAgICAgICAvLyBleHRyYXBvbGF0ZSBmaXJzdCBwb2ludAorICAg
ICAgICAgICAgdG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgMCBdLCBwb2ludHNbIDEgXSApLmFkZCgg
cG9pbnRzWyAwIF0gKTsKKyAgICAgICAgICAgIHAwID0gdG1wOworCisgICAgICAgIH0KKworICAg
ICAgICBwMSA9IHBvaW50c1sgaW50UG9pbnQgJSBsIF07CisgICAgICAgIHAyID0gcG9pbnRzWyAo
IGludFBvaW50ICsgMSApICUgbCBdOworCisgICAgICAgIGlmICggdGhpcy5jbG9zZWQgfHwgaW50
UG9pbnQgKyAyIDwgbCApIHsKKworICAgICAgICAgICAgcDMgPSBwb2ludHNbICggaW50UG9pbnQg
KyAyICkgJSBsIF07CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gZXh0cmFw
b2xhdGUgbGFzdCBwb2ludAorICAgICAgICAgICAgdG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgbCAt
IDEgXSwgcG9pbnRzWyBsIC0gMiBdICkuYWRkKCBwb2ludHNbIGwgLSAxIF0gKTsKKyAgICAgICAg
ICAgIHAzID0gdG1wOworCisgICAgICAgIH0KKworICAgICAgICBpZiAoIHRoaXMudHlwZSA9PT0g
dW5kZWZpbmVkIHx8IHRoaXMudHlwZSA9PT0gJ2NlbnRyaXBldGFsJyB8fCB0aGlzLnR5cGUgPT09
ICdjaG9yZGFsJyApIHsKKworICAgICAgICAgICAgLy8gaW5pdCBDZW50cmlwZXRhbCAvIENob3Jk
YWwgQ2F0bXVsbC1Sb20KKyAgICAgICAgICAgIHZhciBwb3cgPSB0aGlzLnR5cGUgPT09ICdjaG9y
ZGFsJyA/IDAuNSA6IDAuMjU7CisgICAgICAgICAgICB2YXIgZHQwID0gTWF0aC5wb3coIHAwLmRp
c3RhbmNlVG9TcXVhcmVkKCBwMSApLCBwb3cgKTsKKyAgICAgICAgICAgIHZhciBkdDEgPSBNYXRo
LnBvdyggcDEuZGlzdGFuY2VUb1NxdWFyZWQoIHAyICksIHBvdyApOworICAgICAgICAgICAgdmFy
IGR0MiA9IE1hdGgucG93KCBwMi5kaXN0YW5jZVRvU3F1YXJlZCggcDMgKSwgcG93ICk7CisKKyAg
ICAgICAgICAgIC8vIHNhZmV0eSBjaGVjayBmb3IgcmVwZWF0ZWQgcG9pbnRzCisgICAgICAgICAg
ICBpZiAoIGR0MSA8IDFlLTQgKSBkdDEgPSAxLjA7CisgICAgICAgICAgICBpZiAoIGR0MCA8IDFl
LTQgKSBkdDAgPSBkdDE7CisgICAgICAgICAgICBpZiAoIGR0MiA8IDFlLTQgKSBkdDIgPSBkdDE7
CisKKyAgICAgICAgICAgIHB4LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueCwgcDEueCwg
cDIueCwgcDMueCwgZHQwLCBkdDEsIGR0MiApOworICAgICAgICAgICAgcHkuaW5pdE5vbnVuaWZv
cm1DYXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCBkdDAsIGR0MSwgZHQyICk7Cisg
ICAgICAgICAgICBwei5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnos
IHAzLnosIGR0MCwgZHQxLCBkdDIgKTsKKworICAgICAgICB9IGVsc2UgaWYgKCB0aGlzLnR5cGUg
PT09ICdjYXRtdWxscm9tJyApIHsKKworICAgICAgICAgICAgdmFyIHRlbnNpb24gPSB0aGlzLnRl
bnNpb24gIT09IHVuZGVmaW5lZCA/IHRoaXMudGVuc2lvbiA6IDAuNTsKKyAgICAgICAgICAgIHB4
LmluaXRDYXRtdWxsUm9tKCBwMC54LCBwMS54LCBwMi54LCBwMy54LCB0ZW5zaW9uICk7CisgICAg
ICAgICAgICBweS5pbml0Q2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgdGVuc2lv
biApOworICAgICAgICAgICAgcHouaW5pdENhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnosIHAz
LnosIHRlbnNpb24gKTsKKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3Iz
KCBweC5jYWxjKCB3ZWlnaHQgKSwgcHkuY2FsYyggd2VpZ2h0ICksIHB6LmNhbGMoIHdlaWdodCAp
ICk7CisKKyAgICB9OworCisgICAgZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZTMoIHYwLCB2MSwg
djIsIHYzICkgeworCisgICAgICAgIEN1cnZlLmNhbGwoIHRoaXMgKTsKKworICAgICAgICB0aGlz
LnYwID0gdjA7CisgICAgICAgIHRoaXMudjEgPSB2MTsKKyAgICAgICAgdGhpcy52MiA9IHYyOwor
ICAgICAgICB0aGlzLnYzID0gdjM7CisKKyAgICB9CisKKyAgICBDdWJpY0JlemllckN1cnZlMy5w
cm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKKyAgICBDdWJpY0Jl
emllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJpY0JlemllckN1cnZlMzsKKwor
ICAgIEN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCAp
IHsKKworICAgICAgICB2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52
MiwgdjMgPSB0aGlzLnYzOworCisgICAgICAgIHJldHVybiBuZXcgVmVjdG9yMygKKyAgICAgICAg
ICAgIEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksCisgICAgICAgICAg
ICBDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApLAorICAgICAgICAgICAg
Q3ViaWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnosIHYzLnogKQorICAgICAgICApOworCisg
ICAgfTsKKworICAgIGZ1bmN0aW9uIFF1YWRyYXRpY0JlemllckN1cnZlMyggdjAsIHYxLCB2MiAp
IHsKKworICAgICAgICBDdXJ2ZS5jYWxsKCB0aGlzICk7CisKKyAgICAgICAgdGhpcy52MCA9IHYw
OworICAgICAgICB0aGlzLnYxID0gdjE7CisgICAgICAgIHRoaXMudjIgPSB2MjsKKworICAgIH0K
KworICAgIFF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBD
dXJ2ZS5wcm90b3R5cGUgKTsKKyAgICBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNv
bnN0cnVjdG9yID0gUXVhZHJhdGljQmV6aWVyQ3VydmUzOworCisgICAgUXVhZHJhdGljQmV6aWVy
Q3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHsKKworICAgICAgICB2
YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MjsKKworICAgICAgICBy
ZXR1cm4gbmV3IFZlY3RvcjMoCisgICAgICAgICAgICBRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngs
IHYxLngsIHYyLnggKSwKKyAgICAgICAgICAgIFF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEu
eSwgdjIueSApLAorICAgICAgICAgICAgUXVhZHJhdGljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2
Mi56ICkKKyAgICAgICAgKTsKKworICAgIH07CisKKyAgICBmdW5jdGlvbiBMaW5lQ3VydmUzKCB2
MSwgdjIgKSB7CisKKyAgICAgICAgQ3VydmUuY2FsbCggdGhpcyApOworCisgICAgICAgIHRoaXMu
djEgPSB2MTsKKyAgICAgICAgdGhpcy52MiA9IHYyOworCisgICAgfQorCisgICAgTGluZUN1cnZl
My5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKKyAgICBMaW5l
Q3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVDdXJ2ZTM7CisKKyAgICBMaW5lQ3Vy
dmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHsKKworICAgICAgICBpZiAo
IHQgPT09IDEgKSB7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnYyLmNsb25lKCk7CisKKyAg
ICAgICAgfQorCisgICAgICAgIHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpOworCisgICAgICAg
IHZlY3Rvci5zdWJWZWN0b3JzKCB0aGlzLnYyLCB0aGlzLnYxICk7IC8vIGRpZmYKKyAgICAgICAg
dmVjdG9yLm11bHRpcGx5U2NhbGFyKCB0ICk7CisgICAgICAgIHZlY3Rvci5hZGQoIHRoaXMudjEg
KTsKKworICAgICAgICByZXR1cm4gdmVjdG9yOworCisgICAgfTsKKworICAgIGZ1bmN0aW9uIEFy
Y0N1cnZlKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dp
c2UgKSB7CisKKyAgICAgICAgRWxsaXBzZUN1cnZlLmNhbGwoIHRoaXMsIGFYLCBhWSwgYVJhZGl1
cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApOworCisgICAg
fQorCisgICAgQXJjQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRWxsaXBzZUN1cnZl
LnByb3RvdHlwZSApOworICAgIEFyY0N1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFyY0N1
cnZlOworCisgICAgLyoqCisgICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVk
cXVhbGlhLmNvbS8KKyAgICAgKi8KKworICAgIHZhciBTY2VuZVV0aWxzID0geworCisgICAgICAg
IGNyZWF0ZU11bHRpTWF0ZXJpYWxPYmplY3Q6IGZ1bmN0aW9uICggZ2VvbWV0cnksIG1hdGVyaWFs
cyApIHsKKworICAgICAgICAgICAgdmFyIGdyb3VwID0gbmV3IEdyb3VwKCk7CisKKyAgICAgICAg
ICAgIGZvciAoIHZhciBpID0gMCwgbCA9IG1hdGVyaWFscy5sZW5ndGg7IGkgPCBsOyBpICsrICkg
eworCisgICAgICAgICAgICAgICAgZ3JvdXAuYWRkKCBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVy
aWFsc1sgaSBdICkgKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZ3Jv
dXA7CisKKyAgICAgICAgfSwKKworICAgICAgICBkZXRhY2g6IGZ1bmN0aW9uICggY2hpbGQsIHBh
cmVudCwgc2NlbmUgKSB7CisKKyAgICAgICAgICAgIGNoaWxkLmFwcGx5TWF0cml4KCBwYXJlbnQu
bWF0cml4V29ybGQgKTsKKyAgICAgICAgICAgIHBhcmVudC5yZW1vdmUoIGNoaWxkICk7CisgICAg
ICAgICAgICBzY2VuZS5hZGQoIGNoaWxkICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBhdHRh
Y2g6IGZ1bmN0aW9uICggY2hpbGQsIHNjZW5lLCBwYXJlbnQgKSB7CisKKyAgICAgICAgICAgIGNo
aWxkLmFwcGx5TWF0cml4KCBuZXcgTWF0cml4NCgpLmdldEludmVyc2UoIHBhcmVudC5tYXRyaXhX
b3JsZCApICk7CisKKyAgICAgICAgICAgIHNjZW5lLnJlbW92ZSggY2hpbGQgKTsKKyAgICAgICAg
ICAgIHBhcmVudC5hZGQoIGNoaWxkICk7CisKKyAgICAgICAgfQorCisgICAgfTsKKworICAgIC8q
KgorICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCisgICAgICovCisK
KyAgICBmdW5jdGlvbiBGYWNlNCggYSwgYiwgYywgZCwgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJ
bmRleCApIHsKKworICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5GYWNlNCBoYXMgYmVlbiBy
ZW1vdmVkLiBBIFRIUkVFLkZhY2UzIHdpbGwgYmUgY3JlYXRlZCBpbnN0ZWFkLicgKTsKKyAgICAg
ICAgcmV0dXJuIG5ldyBGYWNlMyggYSwgYiwgYywgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRl
eCApOworCisgICAgfQorCisgICAgdmFyIExpbmVTdHJpcCA9IDA7CisKKyAgICB2YXIgTGluZVBp
ZWNlcyA9IDE7CisKKyAgICBmdW5jdGlvbiBNZXNoRmFjZU1hdGVyaWFsKCBtYXRlcmlhbHMgKSB7
CisKKyAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCBoYXMgYmVl
biByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7CisgICAgICAgIHJldHVybiBtYXRl
cmlhbHM7CisKKyAgICB9CisKKyAgICBmdW5jdGlvbiBNdWx0aU1hdGVyaWFsKCBtYXRlcmlhbHMg
KSB7CisKKyAgICAgICAgaWYgKCBtYXRlcmlhbHMgPT09IHVuZGVmaW5lZCApIG1hdGVyaWFscyA9
IFtdOworCisgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJl
ZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuJyApOworICAgICAgICBtYXRlcmlhbHMu
aXNNdWx0aU1hdGVyaWFsID0gdHJ1ZTsKKyAgICAgICAgbWF0ZXJpYWxzLm1hdGVyaWFscyA9IG1h
dGVyaWFsczsKKyAgICAgICAgbWF0ZXJpYWxzLmNsb25lID0gZnVuY3Rpb24gKCkgeworCisgICAg
ICAgICAgICByZXR1cm4gbWF0ZXJpYWxzLnNsaWNlKCk7CisKKyAgICAgICAgfTsKKyAgICAgICAg
cmV0dXJuIG1hdGVyaWFsczsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIFBvaW50Q2xvdWQoIGdl
b21ldHJ5LCBtYXRlcmlhbCApIHsKKworICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5Qb2lu
dENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLicgKTsKKyAgICAgICAgcmV0
dXJuIG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApOworCisgICAgfQorCisgICAgZnVu
Y3Rpb24gUGFydGljbGUoIG1hdGVyaWFsICkgeworCisgICAgICAgIGNvbnNvbGUud2FybiggJ1RI
UkVFLlBhcnRpY2xlIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuU3ByaXRlLicgKTsKKyAgICAg
ICAgcmV0dXJuIG5ldyBTcHJpdGUoIG1hdGVyaWFsICk7CisKKyAgICB9CisKKyAgICBmdW5jdGlv
biBQYXJ0aWNsZVN5c3RlbSggZ2VvbWV0cnksIG1hdGVyaWFsICkgeworCisgICAgICAgIGNvbnNv
bGUud2FybiggJ1RIUkVFLlBhcnRpY2xlU3lzdGVtIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUu
UG9pbnRzLicgKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlh
bCApOworCisgICAgfQorCisgICAgZnVuY3Rpb24gUG9pbnRDbG91ZE1hdGVyaWFsKCBwYXJhbWV0
ZXJzICkgeworCisgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLlBvaW50Q2xvdWRNYXRlcmlh
bCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTsKKyAgICAgICAg
cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApOworCisgICAgfQorCisgICAg
ZnVuY3Rpb24gUGFydGljbGVCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkgeworCisgICAgICAg
IGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5h
bWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQb2lu
dHNNYXRlcmlhbCggcGFyYW1ldGVycyApOworCisgICAgfQorCisgICAgZnVuY3Rpb24gUGFydGlj
bGVTeXN0ZW1NYXRlcmlhbCggcGFyYW1ldGVycyApIHsKKworICAgICAgICBjb25zb2xlLndhcm4o
ICdUSFJFRS5QYXJ0aWNsZVN5c3RlbU1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUu
UG9pbnRzTWF0ZXJpYWwuJyApOworICAgICAgICByZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBw
YXJhbWV0ZXJzICk7CisKKyAgICB9CisKKyAgICBmdW5jdGlvbiBWZXJ0ZXgoIHgsIHksIHogKSB7
CisKKyAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuVmVydGV4IGhhcyBiZWVuIHJlbW92ZWQu
IFVzZSBUSFJFRS5WZWN0b3IzIGluc3RlYWQuJyApOworICAgICAgICByZXR1cm4gbmV3IFZlY3Rv
cjMoIHgsIHksIHogKTsKKworICAgIH0KKworICAgIC8vCisKKyAgICBmdW5jdGlvbiBEeW5hbWlj
QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKyAgICAgICAgY29uc29sZS53
YXJuKCAnVEhSRUUuRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ug
bmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSgpLnNldER5bmFtaWMoIHRydWUgKSBpbnN0ZWFkLicg
KTsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSAp
LnNldER5bmFtaWMoIHRydWUgKTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIEludDhBdHRyaWJ1
dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5J
bnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0
dHJpYnV0ZSgpIGluc3RlYWQuJyApOworICAgICAgICByZXR1cm4gbmV3IEludDhCdWZmZXJBdHRy
aWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOworCisgICAgfQorCisgICAgZnVuY3Rpb24gVWludDhB
dHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworICAgICAgICBjb25zb2xlLndhcm4oICdU
SFJFRS5VaW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4
QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CisgICAgICAgIHJldHVybiBuZXcgVWludDhC
dWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOworCisgICAgfQorCisgICAgZnVuY3Rp
b24gVWludDhDbGFtcGVkQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKyAgICAgICAg
Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDhDbGFtcGVkQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92
ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4n
ICk7CisgICAgICAgIHJldHVybiBuZXcgVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCBhcnJh
eSwgaXRlbVNpemUgKTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIEludDE2QXR0cmlidXRlKCBh
cnJheSwgaXRlbVNpemUgKSB7CisKKyAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuSW50MTZB
dHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQxNkJ1ZmZlckF0dHJp
YnV0ZSgpIGluc3RlYWQuJyApOworICAgICAgICByZXR1cm4gbmV3IEludDE2QnVmZmVyQXR0cmli
dXRlKCBhcnJheSwgaXRlbVNpemUgKTsKKworICAgIH0KKworICAgIGZ1bmN0aW9uIFVpbnQxNkF0
dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisgICAgICAgIGNvbnNvbGUud2FybiggJ1RI
UkVFLlVpbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQx
NkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOworICAgICAgICByZXR1cm4gbmV3IFVpbnQx
NkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CisKKyAgICB9CisKKyAgICBmdW5j
dGlvbiBJbnQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgeworCisgICAgICAgIGNvbnNv
bGUud2FybiggJ1RIUkVFLkludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcg
VEhSRUUuSW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKKyAgICAgICAgcmV0dXJu
IG5ldyBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CisKKyAgICB9CisK
KyAgICBmdW5jdGlvbiBVaW50MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKKworICAg
ICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3Zl
ZC4gVXNlIG5ldyBUSFJFRS5VaW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKKyAg
ICAgICAgcmV0dXJuIG5ldyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSAp
OworCisgICAgfQorCisgICAgZnVuY3Rpb24gRmxvYXQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1T
aXplICkgeworCisgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkZsb2F0MzJBdHRyaWJ1dGUg
aGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCkg
aW5zdGVhZC4nICk7CisgICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgg
YXJyYXksIGl0ZW1TaXplICk7CisKKyAgICB9CisKKyAgICBmdW5jdGlvbiBGbG9hdDY0QXR0cmli
dXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CisKKyAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUu
RmxvYXQ2NEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0NjRC
dWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDY0
QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKKworICAgIH0KKworICAgIC8vCisK
KyAgICBDdXJ2ZS5jcmVhdGUgPSBmdW5jdGlvbiAoIGNvbnN0cnVjdCwgZ2V0UG9pbnQgKSB7CisK
KyAgICAgICAgY29uc29sZS5sb2coICdUSFJFRS5DdXJ2ZS5jcmVhdGUoKSBoYXMgYmVlbiBkZXBy
ZWNhdGVkJyApOworCisgICAgICAgIGNvbnN0cnVjdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRl
KCBDdXJ2ZS5wcm90b3R5cGUgKTsKKyAgICAgICAgY29uc3RydWN0LnByb3RvdHlwZS5jb25zdHJ1
Y3RvciA9IGNvbnN0cnVjdDsKKyAgICAgICAgY29uc3RydWN0LnByb3RvdHlwZS5nZXRQb2ludCA9
IGdldFBvaW50OworCisgICAgICAgIHJldHVybiBjb25zdHJ1Y3Q7CisKKyAgICB9OworCisgICAg
Ly8KKworICAgIGZ1bmN0aW9uIENsb3NlZFNwbGluZUN1cnZlMyggcG9pbnRzICkgeworCisgICAg
ICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkNsb3NlZFNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXBy
ZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTsKKworICAgICAg
ICBDYXRtdWxsUm9tQ3VydmUzLmNhbGwoIHRoaXMsIHBvaW50cyApOworICAgICAgICB0aGlzLnR5
cGUgPSAnY2F0bXVsbHJvbSc7CisgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKKworICAgIH0K
KworICAgIENsb3NlZFNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRt
dWxsUm9tQ3VydmUzLnByb3RvdHlwZSApOworCisgICAgLy8KKworICAgIGZ1bmN0aW9uIFNwbGlu
ZUN1cnZlMyggcG9pbnRzICkgeworCisgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLlNwbGlu
ZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBp
bnN0ZWFkLicgKTsKKworICAgICAgICBDYXRtdWxsUm9tQ3VydmUzLmNhbGwoIHRoaXMsIHBvaW50
cyApOworICAgICAgICB0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7CisKKyAgICB9CisKKyAgICBT
cGxpbmVDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ2F0bXVsbFJvbUN1cnZlMy5w
cm90b3R5cGUgKTsKKworICAgIC8vCisKKyAgICBmdW5jdGlvbiBTcGxpbmUoIHBvaW50cyApIHsK
KworICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5TcGxpbmUgaGFzIGJlZW4gcmVtb3ZlZC4g
VXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7CisKKyAgICAgICAgQ2F0bXVs
bFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTsKKyAgICAgICAgdGhpcy50eXBlID0gJ2Nh
dG11bGxyb20nOworCisgICAgfQorCisgICAgU3BsaW5lLnByb3RvdHlwZSA9IE9iamVjdC5jcmVh
dGUoIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlICk7CisKKyAgICBPYmplY3QuYXNzaWduKCBT
cGxpbmUucHJvdG90eXBlLCB7CisKKyAgICAgICAgaW5pdEZyb21BcnJheTogZnVuY3Rpb24gKCBh
ICkgeworCisgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAuaW5pdEZy
b21BcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOworCisgICAgICAgIH0sCisgICAgICAgIGdl
dENvbnRyb2xQb2ludHNBcnJheTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKKworICAg
ICAgICAgICAgY29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmdldENvbnRyb2xQb2ludHNB
cnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOworCisgICAgICAgIH0sCisgICAgICAgIHJlcGFy
YW1ldHJpemVCeUFyY0xlbmd0aDogZnVuY3Rpb24gKCBzYW1wbGluZ0NvZWYgKSB7CisKKyAgICAg
ICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNM
ZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisK
KyAgICAvLworICAgIGZ1bmN0aW9uIEJvdW5kaW5nQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICkg
eworCisgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkJvdW5kaW5nQm94SGVscGVyIGhhcyBi
ZWVuIGRlcHJlY2F0ZWQuIENyZWF0aW5nIGEgVEhSRUUuQm94SGVscGVyIGluc3RlYWQuJyApOwor
ICAgICAgICByZXR1cm4gbmV3IEJveEhlbHBlciggb2JqZWN0LCBjb2xvciApOworCisgICAgfQor
CisgICAgZnVuY3Rpb24gRWRnZXNIZWxwZXIoIG9iamVjdCwgaGV4ICkgeworCisgICAgICAgIGNv
bnNvbGUud2FybiggJ1RIUkVFLkVkZ2VzSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJF
RS5FZGdlc0dlb21ldHJ5IGluc3RlYWQuJyApOworICAgICAgICByZXR1cm4gbmV3IExpbmVTZWdt
ZW50cyggbmV3IEVkZ2VzR2VvbWV0cnkoIG9iamVjdC5nZW9tZXRyeSApLCBuZXcgTGluZUJhc2lj
TWF0ZXJpYWwoIHsgY29sb3I6IGhleCAhPT0gdW5kZWZpbmVkID8gaGV4IDogMHhmZmZmZmYgfSAp
ICk7CisKKyAgICB9CisKKyAgICBHcmlkSGVscGVyLnByb3RvdHlwZS5zZXRDb2xvcnMgPSBmdW5j
dGlvbiAoKSB7CisKKyAgICAgICAgY29uc29sZS5lcnJvciggJ1RIUkVFLkdyaWRIZWxwZXI6IHNl
dENvbG9ycygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHBhc3MgdGhlbSBpbiB0aGUgY29uc3RydWN0
b3IgaW5zdGVhZC4nICk7CisKKyAgICB9OworCisgICAgU2tlbGV0b25IZWxwZXIucHJvdG90eXBl
LnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKKworICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUu
U2tlbGV0b25IZWxwZXI6IHVwZGF0ZSgpIG5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuJyAp
OworCisgICAgfTsKKworICAgIGZ1bmN0aW9uIFdpcmVmcmFtZUhlbHBlciggb2JqZWN0LCBoZXgg
KSB7CisKKyAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2lyZWZyYW1lSGVscGVyIGhhcyBi
ZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5XaXJlZnJhbWVHZW9tZXRyeSBpbnN0ZWFkLicgKTsKKyAg
ICAgICAgcmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBXaXJlZnJhbWVHZW9tZXRyeSggb2Jq
ZWN0Lmdlb21ldHJ5ICksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4ICE9PSB1
bmRlZmluZWQgPyBoZXggOiAweGZmZmZmZiB9ICkgKTsKKworICAgIH0KKworICAgIC8vCisKKyAg
ICBmdW5jdGlvbiBYSFJMb2FkZXIoIG1hbmFnZXIgKSB7CisKKyAgICAgICAgY29uc29sZS53YXJu
KCAnVEhSRUUuWEhSTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRmlsZUxvYWRlci4n
ICk7CisgICAgICAgIHJldHVybiBuZXcgRmlsZUxvYWRlciggbWFuYWdlciApOworCisgICAgfQor
CisgICAgZnVuY3Rpb24gQmluYXJ5VGV4dHVyZUxvYWRlciggbWFuYWdlciApIHsKKworICAgICAg
ICBjb25zb2xlLndhcm4oICdUSFJFRS5CaW5hcnlUZXh0dXJlTG9hZGVyIGhhcyBiZWVuIHJlbmFt
ZWQgdG8gVEhSRUUuRGF0YVRleHR1cmVMb2FkZXIuJyApOworICAgICAgICByZXR1cm4gbmV3IERh
dGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICk7CisKKyAgICB9CisKKyAgICAvLworCisgICAgT2Jq
ZWN0LmFzc2lnbiggQm94Mi5wcm90b3R5cGUsIHsKKworICAgICAgICBjZW50ZXI6IGZ1bmN0aW9u
ICggb3B0aW9uYWxUYXJnZXQgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVF
LkJveDI6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7Cisg
ICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7CisKKyAg
ICAgICAgfSwKKyAgICAgICAgZW1wdHk6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgY29u
c29sZS53YXJuKCAnVEhSRUUuQm94MjogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNF
bXB0eSgpLicgKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRW1wdHkoKTsKKworICAgICAg
ICB9LAorICAgICAgICBpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7CisKKyAg
ICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5pc0ludGVyc2VjdGlvbkJveCgp
IGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7CisgICAgICAgICAgICBy
ZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTsKKworICAgICAgICB9LAorICAgICAgICBz
aXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgeworCisgICAgICAgICAgICBjb25zb2xl
Lndhcm4oICdUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUo
KS4nICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTaXplKCBvcHRpb25hbFRhcmdldCAp
OworCisgICAgICAgIH0KKyAgICB9ICk7CisKKyAgICBPYmplY3QuYXNzaWduKCBCb3gzLnByb3Rv
dHlwZSwgeworCisgICAgICAgIGNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsK
KworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBi
ZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlz
LmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTsKKworICAgICAgICB9LAorICAgICAgICBlbXB0
eTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gz
OiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApOworICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuaXNFbXB0eSgpOworCisgICAgICAgIH0sCisgICAgICAgIGlzSW50ZXJz
ZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJu
KCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAu
aW50ZXJzZWN0c0JveCgpLicgKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVyc2VjdHNC
b3goIGJveCApOworCisgICAgICAgIH0sCisgICAgICAgIGlzSW50ZXJzZWN0aW9uU3BoZXJlOiBm
dW5jdGlvbiAoIHNwaGVyZSApIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUu
Qm94MzogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJz
ZWN0c1NwaGVyZSgpLicgKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhl
cmUoIHNwaGVyZSApOworCisgICAgICAgIH0sCisgICAgICAgIHNpemU6IGZ1bmN0aW9uICggb3B0
aW9uYWxUYXJnZXQgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6
IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLicgKTsKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7CisKKyAgICAgICAgfQorICAg
IH0gKTsKKworICAgIExpbmUzLnByb3RvdHlwZS5jZW50ZXIgPSBmdW5jdGlvbiAoIG9wdGlvbmFs
VGFyZ2V0ICkgeworCisgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuY2VudGVy
KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuJyApOworICAgICAgICByZXR1cm4g
dGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7CisKKyAgICB9OworCisgICAgX01hdGgu
cmFuZG9tMTYgPSBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUu
TWF0aC5yYW5kb20xNigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGlu
c3RlYWQuJyApOworICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKTsKKworICAgIH07CisKKyAg
ICBPYmplY3QuYXNzaWduKCBNYXRyaXgzLnByb3RvdHlwZSwgeworCisgICAgICAgIGZsYXR0ZW5U
b0FycmF5T2Zmc2V0OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAg
IGNvbnNvbGUud2FybiggIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhh
cyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIiApOworICAgICAgICAg
ICAgcmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApOworCisgICAgICAgIH0sCisg
ICAgICAgIG11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7CisKKyAgICAgICAg
ICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMg
YmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4n
ICk7CisgICAgICAgICAgICByZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4MyggdGhpcyApOworCisg
ICAgICAgIH0sCisgICAgICAgIG11bHRpcGx5VmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIGEgKSB7
CisKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlW
ZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgICk7CisKKyAgICAgICAgfSwKKyAgICAg
ICAgYXBwbHlUb0J1ZmZlcjogZnVuY3Rpb24oIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGggKSB7CisK
KyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVy
KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBh
dHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5VG9C
dWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciApOworCisgICAgICAgIH0sCisgICAgICAgIGFwcGx5VG9W
ZWN0b3IzQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKSB7CisKKyAgICAg
ICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb1ZlY3RvcjNBcnJh
eSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAg
IE9iamVjdC5hc3NpZ24oIE1hdHJpeDQucHJvdG90eXBlLCB7CisKKyAgICAgICAgZXh0cmFjdFBv
c2l0aW9uOiBmdW5jdGlvbiAoIG0gKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RI
UkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5
UG9zaXRpb24oKS4nICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jb3B5UG9zaXRpb24oIG0g
KTsKKworICAgICAgICB9LAorICAgICAgICBmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24g
KCBhcnJheSwgb2Zmc2V0ICkgeworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICJUSFJFRS5N
YXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2Ug
LnRvQXJyYXkoKSBpbnN0ZWFkLiIgKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnRvQXJyYXko
IGFycmF5LCBvZmZzZXQgKTsKKworICAgICAgICB9LAorICAgICAgICBnZXRQb3NpdGlvbjogZnVu
Y3Rpb24gKCkgeworCisgICAgICAgICAgICB2YXIgdjE7CisKKyAgICAgICAgICAgIHJldHVybiBm
dW5jdGlvbiBnZXRQb3NpdGlvbigpIHsKKworICAgICAgICAgICAgICAgIGlmICggdjEgPT09IHVu
ZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTsKKyAgICAgICAgICAgICAgICBjb25zb2xlLndh
cm4oICdUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ug
VmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuJyApOworICAg
ICAgICAgICAgICAgIHJldHVybiB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAzICk7CisK
KyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSgpLAorICAgICAgICBzZXRSb3RhdGlvbkZyb21R
dWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2Fybigg
J1RIUkVFLk1hdHJpeDQ6IC5zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVu
YW1lZCB0byAubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKS4nICk7CisgICAgICAgICAgICBy
ZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApOworCisgICAgICAgIH0s
CisgICAgICAgIG11bHRpcGx5VG9BcnJheTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBj
b25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4g
cmVtb3ZlZC4nICk7CisKKyAgICAgICAgfSwKKyAgICAgICAgbXVsdGlwbHlWZWN0b3IzOiBmdW5j
dGlvbiAoIHZlY3RvciApIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuTWF0
cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBw
bHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKKyAgICAgICAgICAgIHJldHVybiB2ZWN0
b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7CisKKyAgICAgICAgfSwKKyAgICAgICAgbXVsdGlwbHlW
ZWN0b3I0OiBmdW5jdGlvbiAoIHZlY3RvciApIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJu
KCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVz
ZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKKyAgICAgICAgICAg
IHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7CisKKyAgICAgICAgfSwKKyAgICAg
ICAgbXVsdGlwbHlWZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggYSApIHsKKworICAgICAgICAgICAg
Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhh
cyBiZWVuIHJlbW92ZWQuJyAgKTsKKworICAgICAgICB9LAorICAgICAgICByb3RhdGVBeGlzOiBm
dW5jdGlvbiAoIHYgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJp
eDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3Jt
RGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKKyAgICAgICAgICAgIHYudHJhbnNmb3Jt
RGlyZWN0aW9uKCB0aGlzICk7CisKKyAgICAgICAgfSwKKyAgICAgICAgY3Jvc3NWZWN0b3I6IGZ1
bmN0aW9uICggdmVjdG9yICkgeworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5N
YXRyaXg0OiAuY3Jvc3NWZWN0b3IoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5
TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7CisgICAgICAgICAgICByZXR1cm4gdmVjdG9y
LmFwcGx5TWF0cml4NCggdGhpcyApOworCisgICAgICAgIH0sCisgICAgICAgIHRyYW5zbGF0ZTog
ZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4
NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOworCisgICAgICAgIH0sCisgICAg
ICAgIHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgY29uc29sZS5lcnJvcigg
J1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVYKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKyAgICAg
ICAgfSwKKyAgICAgICAgcm90YXRlWTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBjb25z
b2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVkoKSBoYXMgYmVlbiByZW1vdmVkLicg
KTsKKworICAgICAgICB9LAorICAgICAgICByb3RhdGVaOiBmdW5jdGlvbiAoKSB7CisKKyAgICAg
ICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVu
IHJlbW92ZWQuJyApOworCisgICAgICAgIH0sCisgICAgICAgIHJvdGF0ZUJ5QXhpczogZnVuY3Rp
b24gKCkgeworCisgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJv
dGF0ZUJ5QXhpcygpIGhhcyBiZWVuIHJlbW92ZWQuJyApOworCisgICAgICAgIH0sCisgICAgICAg
IGFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uKCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoICkgeworCisg
ICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb0J1ZmZlcigp
IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0
cmlidXRlICkgaW5zdGVhZC4nICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseVRvQnVm
ZmVyQXR0cmlidXRlKCBidWZmZXIgKTsKKworICAgICAgICB9LAorICAgICAgICBhcHBseVRvVmVj
dG9yM0FycmF5OiBmdW5jdGlvbiggYXJyYXksIG9mZnNldCwgbGVuZ3RoICkgeworCisgICAgICAg
ICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLmFwcGx5VG9WZWN0b3IzQXJyYXko
KSBoYXMgYmVlbiByZW1vdmVkLicgKTsKKworICAgICAgICB9LAorICAgICAgICBtYWtlRnJ1c3R1
bTogZnVuY3Rpb24oIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyICkgeworCisg
ICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBo
YXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwg
Ym90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLicgKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlz
Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKTsK
KworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICBQbGFuZS5wcm90b3R5cGUuaXNJbnRlcnNl
Y3Rpb25MaW5lID0gZnVuY3Rpb24gKCBsaW5lICkgeworCisgICAgICAgIGNvbnNvbGUud2Fybigg
J1RIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAu
aW50ZXJzZWN0c0xpbmUoKS4nICk7CisgICAgICAgIHJldHVybiB0aGlzLmludGVyc2VjdHNMaW5l
KCBsaW5lICk7CisKKyAgICB9OworCisgICAgUXVhdGVybmlvbi5wcm90b3R5cGUubXVsdGlwbHlW
ZWN0b3IzID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7CisKKyAgICAgICAgY29uc29sZS53YXJuKCAn
VEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVz
ZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuJyAp
OworICAgICAgICByZXR1cm4gdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggdGhpcyApOworCisgICAg
fTsKKworICAgIE9iamVjdC5hc3NpZ24oIFJheS5wcm90b3R5cGUsIHsKKworICAgICAgICBpc0lu
dGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUu
d2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0
byAuaW50ZXJzZWN0c0JveCgpLicgKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVyc2Vj
dHNCb3goIGJveCApOworCisgICAgICAgIH0sCisgICAgICAgIGlzSW50ZXJzZWN0aW9uUGxhbmU6
IGZ1bmN0aW9uICggcGxhbmUgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVF
LlJheTogLmlzSW50ZXJzZWN0aW9uUGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNl
Y3RzUGxhbmUoKS4nICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3RzUGxhbmUo
IHBsYW5lICk7CisKKyAgICAgICAgfSwKKyAgICAgICAgaXNJbnRlcnNlY3Rpb25TcGhlcmU6IGZ1
bmN0aW9uICggc3BoZXJlICkgeworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5S
YXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2Vj
dHNTcGhlcmUoKS4nICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJl
KCBzcGhlcmUgKTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICBPYmplY3QuYXNzaWdu
KCBTaGFwZS5wcm90b3R5cGUsIHsKKworICAgICAgICBleHRydWRlOiBmdW5jdGlvbiAoIG9wdGlv
bnMgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAuZXh0cnVk
ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTsK
KyAgICAgICAgICAgIHJldHVybiBuZXcgRXh0cnVkZUdlb21ldHJ5KCB0aGlzLCBvcHRpb25zICk7
CisKKyAgICAgICAgfSwKKyAgICAgICAgbWFrZUdlb21ldHJ5OiBmdW5jdGlvbiAoIG9wdGlvbnMg
KSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAubWFrZUdlb21l
dHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTsK
KyAgICAgICAgICAgIHJldHVybiBuZXcgU2hhcGVHZW9tZXRyeSggdGhpcywgb3B0aW9ucyApOwor
CisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIE9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJv
dG90eXBlLCB7CisKKyAgICAgICAgZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUs
IGluZGV4LCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5W
ZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJB
dHRyaWJ1dGUoKS4nICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmli
dXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTsKKworICAgICAgICB9CisKKyAgICB9ICk7
CisKKyAgICBPYmplY3QuYXNzaWduKCBWZWN0b3IzLnByb3RvdHlwZSwgeworCisgICAgICAgIHNl
dEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNv
bnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgo
KSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgaW5z
dGVhZC4nICk7CisKKyAgICAgICAgfSwKKyAgICAgICAgc2V0RXVsZXJGcm9tUXVhdGVybmlvbjog
ZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9y
MzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIu
c2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLicgKTsKKworICAgICAgICB9LAorICAgICAgICBn
ZXRQb3NpdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHsKKworICAgICAgICAgICAgY29u
c29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldFBvc2l0aW9uRnJvbU1hdHJpeCgpIGhhcyBi
ZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhQb3NpdGlvbigpLicgKTsKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbSApOworCisgICAgICAgIH0sCisg
ICAgICAgIGdldFNjYWxlRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkgeworCisgICAgICAgICAg
ICBjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFz
IGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuJyApOworICAgICAgICAgICAg
cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKCBtICk7CisKKyAgICAgICAgfSwKKyAgICAg
ICAgZ2V0Q29sdW1uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBpbmRleCwgbWF0cml4ICkgeworCisg
ICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1h
dHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4nICk7Cisg
ICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtYXRyaXgsIGluZGV4
ICk7CisKKyAgICAgICAgfSwKKyAgICAgICAgYXBwbHlQcm9qZWN0aW9uOiBmdW5jdGlvbiAoIG0g
KSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseVBy
b2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3Rl
YWQuJyApOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtICk7CisKKyAg
ICAgICAgfSwKKyAgICAgICAgZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGlu
ZGV4LCBvZmZzZXQgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0
b3IzOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRy
aWJ1dGUoKS4nICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRl
KCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisK
KyAgICBPYmplY3QuYXNzaWduKCBWZWN0b3I0LnByb3RvdHlwZSwgeworCisgICAgICAgIGZyb21B
dHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgeworCisgICAg
ICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yNDogLmZyb21BdHRyaWJ1dGUoKSBo
YXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApOworICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zm
c2V0ICk7CisKKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLy8KKworICAgIEdlb21ldHJ5
LnByb3RvdHlwZS5jb21wdXRlVGFuZ2VudHMgPSBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgY29u
c29sZS53YXJuKCAnVEhSRUUuR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiBy
ZW1vdmVkLicgKTsKKworICAgIH07CisKKyAgICBPYmplY3QuYXNzaWduKCBPYmplY3QzRC5wcm90
b3R5cGUsIHsKKworICAgICAgICBnZXRDaGlsZEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkgewor
CisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldENoaWxkQnlO
YW1lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0T2JqZWN0QnlOYW1lKCkuJyApOworICAgICAg
ICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlOYW1lKCBuYW1lICk7CisKKyAgICAgICAgfSwK
KyAgICAgICAgcmVuZGVyRGVwdGg6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgY29uc29s
ZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5yZW5kZXJEZXB0aCBoYXMgYmVlbiByZW1vdmVkLiBV
c2UgLnJlbmRlck9yZGVyLCBpbnN0ZWFkLicgKTsKKworICAgICAgICB9LAorICAgICAgICB0cmFu
c2xhdGU6IGZ1bmN0aW9uICggZGlzdGFuY2UsIGF4aXMgKSB7CisKKyAgICAgICAgICAgIGNvbnNv
bGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4g
VXNlIC50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkgaW5zdGVhZC4nICk7CisgICAg
ICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICk7CisK
KyAgICAgICAgfQorCisgICAgfSApOworCisgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE9i
amVjdDNELnByb3RvdHlwZSwgeworCisgICAgICAgIGV1bGVyT3JkZXI6IHsKKyAgICAgICAgICAg
IGdldDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhS
RUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuJyApOworICAg
ICAgICAgICAgICAgIHJldHVybiB0aGlzLnJvdGF0aW9uLm9yZGVyOworCisgICAgICAgICAgICB9
LAorICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAgICAg
ICAgY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90
YXRpb24ub3JkZXIuJyApOworICAgICAgICAgICAgICAgIHRoaXMucm90YXRpb24ub3JkZXIgPSB2
YWx1ZTsKKworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB1c2VRdWF0ZXJuaW9u
OiB7CisgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgIGNv
bnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1v
dmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTsKKwor
ICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhh
cyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1
bHQuJyApOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIE9i
amVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMT0QucHJvdG90eXBlLCB7CisKKyAgICAgICAgb2JqZWN0
czogeworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgICAgICBj
b25zb2xlLndhcm4oICdUSFJFRS5MT0Q6IC5vYmplY3RzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmxl
dmVscy4nICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGV2ZWxzOworCisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0
eSggU2tlbGV0b24ucHJvdG90eXBlLCAndXNlVmVydGV4VGV4dHVyZScsIHsKKworICAgICAgICBn
ZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuU2tl
bGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKyAgICAgICAg
fSwKKyAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2Fy
biggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuJyAp
OworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgg
Q3VydmUucHJvdG90eXBlLCAnX19hcmNMZW5ndGhEaXZpc2lvbnMnLCB7CisKKyAgICAgICAgZ2V0
OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZl
OiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApOwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zOworCisgICAgICAgIH0s
CisgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgY29uc29s
ZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xl
bmd0aERpdmlzaW9ucy4nICk7CisgICAgICAgICAgICB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9
IHZhbHVlOworCisgICAgICAgIH0KKworICAgIH0gKTsKKworICAgIC8vCisKKyAgICBQZXJzcGVj
dGl2ZUNhbWVyYS5wcm90b3R5cGUuc2V0TGVucyA9IGZ1bmN0aW9uICggZm9jYWxMZW5ndGgsIGZp
bG1HYXVnZSApIHsKKworICAgICAgICBjb25zb2xlLndhcm4oICJUSFJFRS5QZXJzcGVjdGl2ZUNh
bWVyYS5zZXRMZW5zIGlzIGRlcHJlY2F0ZWQuICIgKworICAgICAgICAgICAgICAgICJVc2UgLnNl
dEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC4iICk7
CisKKyAgICAgICAgaWYgKCBmaWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIHRoaXMuZmlsbUdhdWdl
ID0gZmlsbUdhdWdlOworICAgICAgICB0aGlzLnNldEZvY2FsTGVuZ3RoKCBmb2NhbExlbmd0aCAp
OworCisgICAgfTsKKworICAgIC8vCisKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggTGln
aHQucHJvdG90eXBlLCB7CisgICAgICAgIG9ubHlTaGFkb3c6IHsKKyAgICAgICAgICAgIHNldDog
ZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuTGln
aHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuJyApOworCisgICAgICAgICAgICB9Cisg
ICAgICAgIH0sCisgICAgICAgIHNoYWRvd0NhbWVyYUZvdjogeworICAgICAgICAgICAgc2V0OiBm
dW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhS
RUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGb3YgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZvdi4nICk7
CisgICAgICAgICAgICAgICAgdGhpcy5zaGFkb3cuY2FtZXJhLmZvdiA9IHZhbHVlOworCisgICAg
ICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHNoYWRvd0NhbWVyYUxlZnQ6IHsKKyAgICAg
ICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgICAgIGNvbnNv
bGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTGVmdCBpcyBub3cgLnNoYWRvdy5j
YW1lcmEubGVmdC4nICk7CisgICAgICAgICAgICAgICAgdGhpcy5zaGFkb3cuY2FtZXJhLmxlZnQg
PSB2YWx1ZTsKKworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBzaGFkb3dDYW1l
cmFSaWdodDogeworICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAg
ICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFSaWdo
dCBpcyBub3cgLnNoYWRvdy5jYW1lcmEucmlnaHQuJyApOworICAgICAgICAgICAgICAgIHRoaXMu
c2hhZG93LmNhbWVyYS5yaWdodCA9IHZhbHVlOworCisgICAgICAgICAgICB9CisgICAgICAgIH0s
CisgICAgICAgIHNoYWRvd0NhbWVyYVRvcDogeworICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAo
IHZhbHVlICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6
IC5zaGFkb3dDYW1lcmFUb3AgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnRvcC4nICk7CisgICAgICAg
ICAgICAgICAgdGhpcy5zaGFkb3cuY2FtZXJhLnRvcCA9IHZhbHVlOworCisgICAgICAgICAgICB9
CisgICAgICAgIH0sCisgICAgICAgIHNoYWRvd0NhbWVyYUJvdHRvbTogeworICAgICAgICAgICAg
c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJu
KCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJh
LmJvdHRvbS4nICk7CisgICAgICAgICAgICAgICAgdGhpcy5zaGFkb3cuY2FtZXJhLmJvdHRvbSA9
IHZhbHVlOworCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHNoYWRvd0NhbWVy
YU5lYXI6IHsKKyAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAg
ICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTmVhciBp
cyBub3cgLnNoYWRvdy5jYW1lcmEubmVhci4nICk7CisgICAgICAgICAgICAgICAgdGhpcy5zaGFk
b3cuY2FtZXJhLm5lYXIgPSB2YWx1ZTsKKworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAg
ICAgICBzaGFkb3dDYW1lcmFGYXI6IHsKKyAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1
ZSApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hh
ZG93Q2FtZXJhRmFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mYXIuJyApOworICAgICAgICAgICAg
ICAgIHRoaXMuc2hhZG93LmNhbWVyYS5mYXIgPSB2YWx1ZTsKKworICAgICAgICAgICAgfQorICAg
ICAgICB9LAorICAgICAgICBzaGFkb3dDYW1lcmFWaXNpYmxlOiB7CisgICAgICAgICAgICBzZXQ6
IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkxp
Z2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVF
LkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuJyApOworCisgICAg
ICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHNoYWRvd0JpYXM6IHsKKyAgICAgICAgICAg
IHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fy
biggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93QmlhcyBpcyBub3cgLnNoYWRvdy5iaWFzLicgKTsKKyAg
ICAgICAgICAgICAgICB0aGlzLnNoYWRvdy5iaWFzID0gdmFsdWU7CisKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSwKKyAgICAgICAgc2hhZG93RGFya25lc3M6IHsKKyAgICAgICAgICAgIHNldDog
ZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuTGln
aHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLicgKTsKKworICAgICAgICAgICAg
fQorICAgICAgICB9LAorICAgICAgICBzaGFkb3dNYXBXaWR0aDogeworICAgICAgICAgICAgc2V0
OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAn
VEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBXaWR0aCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLndpZHRo
LicgKTsKKyAgICAgICAgICAgICAgICB0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoID0gdmFsdWU7
CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgc2hhZG93TWFwSGVpZ2h0OiB7
CisgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAgICAg
ICBjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcEhlaWdodCBpcyBub3cgLnNo
YWRvdy5tYXBTaXplLmhlaWdodC4nICk7CisgICAgICAgICAgICAgICAgdGhpcy5zaGFkb3cubWFw
U2l6ZS5oZWlnaHQgPSB2YWx1ZTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAp
OworCisgICAgLy8KKworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBCdWZmZXJBdHRyaWJ1
dGUucHJvdG90eXBlLCB7CisKKyAgICAgICAgbGVuZ3RoOiB7CisgICAgICAgICAgICBnZXQ6IGZ1
bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZl
ckF0dHJpYnV0ZTogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmNvdW50IGluc3Rl
YWQuJyApOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDsKKworICAg
ICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICBPYmplY3QuYXNzaWduKCBC
dWZmZXJHZW9tZXRyeS5wcm90b3R5cGUsIHsKKworICAgICAgICBhZGRJbmRleDogZnVuY3Rpb24g
KCBpbmRleCApIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2Vv
bWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuJyApOwor
ICAgICAgICAgICAgdGhpcy5zZXRJbmRleCggaW5kZXggKTsKKworICAgICAgICB9LAorICAgICAg
ICBhZGREcmF3Q2FsbDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIGluZGV4T2Zmc2V0ICkgewor
CisgICAgICAgICAgICBpZiAoIGluZGV4T2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7CisKKyAgICAg
ICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdD
YWxsKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIGluZGV4T2Zmc2V0LicgKTsKKworICAgICAgICAgICAg
fQorICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRE
cmF3Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4nICk7CisgICAgICAgICAgICB0aGlzLmFkZEdy
b3VwKCBzdGFydCwgY291bnQgKTsKKworICAgICAgICB9LAorICAgICAgICBjbGVhckRyYXdDYWxs
czogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5CdWZm
ZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLicgKTsK
KyAgICAgICAgICAgIHRoaXMuY2xlYXJHcm91cHMoKTsKKworICAgICAgICB9LAorICAgICAgICBj
b21wdXRlVGFuZ2VudHM6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJu
KCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1v
dmVkLicgKTsKKworICAgICAgICB9LAorICAgICAgICBjb21wdXRlT2Zmc2V0czogZnVuY3Rpb24g
KCkgeworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTog
LmNvbXB1dGVPZmZzZXRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKyAgICAgICAgfQorCisg
ICAgfSApOworCisgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEJ1ZmZlckdlb21ldHJ5LnBy
b3RvdHlwZSwgeworCisgICAgICAgIGRyYXdjYWxsczogeworICAgICAgICAgICAgZ2V0OiBmdW5j
dGlvbiAoKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVy
R2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLicgKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ncm91cHM7CisKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfSwKKyAgICAgICAgb2Zmc2V0czogeworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7
CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTog
Lm9mZnNldHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLicgKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gdGhpcy5ncm91cHM7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
fSApOworCisgICAgLy8KKworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBVbmlmb3JtLnBy
b3RvdHlwZSwgeworCisgICAgICAgIGR5bmFtaWM6IHsKKyAgICAgICAgICAgIHNldDogZnVuY3Rp
b24gKCkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTog
LmR5bmFtaWMgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGlu
c3RlYWQuJyApOworCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIG9uVXBkYXRl
OiB7CisgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAgICAg
Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogLm9uVXBkYXRlKCkgaGFzIGJlZW4gcmVtb3Zl
ZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuJyApOworICAgICAgICAgICAg
ICAgIHJldHVybiB0aGlzOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gKTsK
KworICAgIC8vCisKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggTWF0ZXJpYWwucHJvdG90
eXBlLCB7CisKKyAgICAgICAgd3JhcEFyb3VuZDogeworICAgICAgICAgICAgZ2V0OiBmdW5jdGlv
biAoKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDog
LndyYXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKyAgICAgICAgICAgIH0sCisgICAg
ICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fy
biggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLicgKTsKKwor
ICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB3cmFwUkdCOiB7CisgICAgICAgICAg
ICBnZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RI
UkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLicgKTsKKyAgICAgICAgICAg
ICAgICByZXR1cm4gbmV3IENvbG9yKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisg
ICAgfSApOworCisgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1lc2hQaG9uZ01hdGVyaWFs
LnByb3RvdHlwZSwgeworCisgICAgICAgIG1ldGFsOiB7CisgICAgICAgICAgICBnZXQ6IGZ1bmN0
aW9uICgpIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaG9u
Z01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFy
ZE1hdGVyaWFsIGluc3RlYWQuJyApOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBo
YXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCcg
KTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICBPYmplY3Qu
ZGVmaW5lUHJvcGVydGllcyggU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLCB7CisKKyAgICAgICAg
ZGVyaXZhdGl2ZXM6IHsKKyAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeworCisgICAgICAg
ICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZl
cyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4nICk7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlczsKKworICAgICAgICAg
ICAgfSwKKyAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAg
ICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLiBTaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVz
IGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTsKKyAgICAgICAg
ICAgICAgICB0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMgPSB2YWx1ZTsKKworICAgICAgICAg
ICAgfQorICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICAvLworCisgICAgT2JqZWN0LmFzc2ln
biggV2ViR0xSZW5kZXJlci5wcm90b3R5cGUsIHsKKworICAgICAgICBnZXRDdXJyZW50UmVuZGVy
VGFyZ2V0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVF
LldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5k
ZXJUYXJnZXQoKS4nICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRSZW5kZXJUYXJnZXQo
KTsKKworICAgICAgICB9LAorCisgICAgICAgIHN1cHBvcnRzRmxvYXRUZXh0dXJlczogZnVuY3Rp
b24gKCkgeworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVy
OiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXCdPRVNf
dGV4dHVyZV9mbG9hdFwnICkuJyApOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9u
cy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTsKKworICAgICAgICB9LAorICAgICAgICBzdXBw
b3J0c0hhbGZGbG9hdFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNvbnNv
bGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVz
KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0XCcgKS4n
ICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJl
X2hhbGZfZmxvYXQnICk7CisKKyAgICAgICAgfSwKKyAgICAgICAgc3VwcG9ydHNTdGFuZGFyZERl
cml2YXRpdmVzOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RI
UkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cg
LmV4dGVuc2lvbnMuZ2V0KCBcJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlc1wnICkuJyApOworICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZh
dGl2ZXMnICk7CisKKyAgICAgICAgfSwKKyAgICAgICAgc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVy
ZVMzVEM6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUu
V2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5l
eHRlbnNpb25zLmdldCggXCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Y1wnICkuJyApOwor
ICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2Vk
X3RleHR1cmVfczN0YycgKTsKKworICAgICAgICB9LAorICAgICAgICBzdXBwb3J0c0NvbXByZXNz
ZWRUZXh0dXJlUFZSVEM6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJu
KCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygp
IGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFwnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRj
XCcgKS4nICk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdM
X2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTsKKworICAgICAgICB9LAorICAgICAgICBzdXBw
b3J0c0JsZW5kTWluTWF4OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2Fy
biggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5l
eHRlbnNpb25zLmdldCggXCdFWFRfYmxlbmRfbWlubWF4XCcgKS4nICk7CisgICAgICAgICAgICBy
ZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7CisKKyAgICAg
ICAgfSwKKyAgICAgICAgc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNW
ZXJ0ZXhUZXh0dXJlcygpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLicgKTsK
KyAgICAgICAgICAgIHJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlczsKKwor
ICAgICAgICB9LAorICAgICAgICBzdXBwb3J0c0luc3RhbmNlZEFycmF5czogZnVuY3Rpb24gKCkg
eworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3Vw
cG9ydHNJbnN0YW5jZWRBcnJheXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcJ0FOR0xFX2lu
c3RhbmNlZF9hcnJheXNcJyApLicgKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dGVuc2lv
bnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTsKKworICAgICAgICB9LAorICAgICAg
ICBlbmFibGVTY2lzc29yVGVzdDogZnVuY3Rpb24gKCBib29sZWFuICkgeworCisgICAgICAgICAg
ICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZW5hYmxlU2Npc3NvclRlc3Qo
KSBpcyBub3cgLnNldFNjaXNzb3JUZXN0KCkuJyApOworICAgICAgICAgICAgdGhpcy5zZXRTY2lz
c29yVGVzdCggYm9vbGVhbiApOworCisgICAgICAgIH0sCisgICAgICAgIGluaXRNYXRlcmlhbDog
ZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJl
bmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKyAgICAgICAg
fSwKKyAgICAgICAgYWRkUHJlUGx1Z2luOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNv
bnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQcmVQbHVnaW4oKSBoYXMgYmVl
biByZW1vdmVkLicgKTsKKworICAgICAgICB9LAorICAgICAgICBhZGRQb3N0UGx1Z2luOiBmdW5j
dGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVy
ZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CisKKyAgICAgICAgfSwK
KyAgICAgICAgdXBkYXRlU2hhZG93TWFwOiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNv
bnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMg
YmVlbiByZW1vdmVkLicgKTsKKworICAgICAgICB9CisKKyAgICB9ICk7CisKKyAgICBPYmplY3Qu
ZGVmaW5lUHJvcGVydGllcyggV2ViR0xSZW5kZXJlci5wcm90b3R5cGUsIHsKKworICAgICAgICBz
aGFkb3dNYXBFbmFibGVkOiB7CisgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKworICAg
ICAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkOworCisgICAgICAgICAg
ICB9LAorICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAgICAg
ICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJs
ZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4nICk7CisgICAgICAgICAgICAgICAgdGhpcy5z
aGFkb3dNYXAuZW5hYmxlZCA9IHZhbHVlOworCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisg
ICAgICAgIHNoYWRvd01hcFR5cGU6IHsKKyAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewor
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93TWFwLnR5cGU7CisKKyAgICAgICAg
ICAgIH0sCisgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAg
ICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlw
ZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLicgKTsKKyAgICAgICAgICAgICAgICB0aGlzLnNoYWRv
d01hcC50eXBlID0gdmFsdWU7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAg
c2hhZG93TWFwQ3VsbEZhY2U6IHsKKyAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93TWFwLmN1bGxGYWNlOworCisgICAgICAg
ICAgICB9LAorICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAg
ICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1
bGxGYWNlIGlzIG5vdyAuc2hhZG93TWFwLmN1bGxGYWNlLicgKTsKKyAgICAgICAgICAgICAgICB0
aGlzLnNoYWRvd01hcC5jdWxsRmFjZSA9IHZhbHVlOworCisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9ICk7CisKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggV2ViR0xTaGFkb3dN
YXAucHJvdG90eXBlLCB7CisKKyAgICAgICAgY3VsbEZhY2U6IHsKKyAgICAgICAgICAgIGdldDog
ZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUmV2ZXJz
ZVNpZGVkID8gQ3VsbEZhY2VGcm9udCA6IEN1bGxGYWNlQmFjazsKKworICAgICAgICAgICAgfSwK
KyAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCBjdWxsRmFjZSApIHsKKworICAgICAgICAgICAg
ICAgIHZhciB2YWx1ZSA9ICggY3VsbEZhY2UgIT09IEN1bGxGYWNlQmFjayApOworICAgICAgICAg
ICAgICAgIGNvbnNvbGUud2FybiggIldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2Ug
aXMgZGVwcmVjYXRlZC4gU2V0IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIHRvICIgKyB2
YWx1ZSArICIuIiApOworICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyUmV2ZXJzZVNpZGVkID0g
dmFsdWU7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLy8K
KworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5
cGUsIHsKKworICAgICAgICB3cmFwUzogeworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7
CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdl
dDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7CisgICAgICAgICAgICAgICAgcmV0
dXJuIHRoaXMudGV4dHVyZS53cmFwUzsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHNl
dDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybigg
J1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicg
KTsKKyAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmUud3JhcFMgPSB2YWx1ZTsKKworICAgICAg
ICAgICAgfQorICAgICAgICB9LAorICAgICAgICB3cmFwVDogeworICAgICAgICAgICAgZ2V0OiBm
dW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJH
TFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4nICk7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZS53cmFwVDsKKworICAgICAgICAgICAgfSwKKyAg
ICAgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgICAgIGNv
bnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0
dXJlLndyYXBULicgKTsKKyAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmUud3JhcFQgPSB2YWx1
ZTsKKworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBtYWdGaWx0ZXI6IHsKKyAg
ICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53
YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJl
Lm1hZ0ZpbHRlci4nICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZS5tYWdG
aWx0ZXI7CisKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICggdmFs
dWUgKSB7CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRl
clRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTsKKyAgICAg
ICAgICAgICAgICB0aGlzLnRleHR1cmUubWFnRmlsdGVyID0gdmFsdWU7CisKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSwKKyAgICAgICAgbWluRmlsdGVyOiB7CisgICAgICAgICAgICBnZXQ6IGZ1
bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdM
UmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApOwor
ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHR1cmUubWluRmlsdGVyOworCisgICAgICAg
ICAgICB9LAorICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgeworCisgICAgICAg
ICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0
ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7CisgICAgICAgICAgICAgICAgdGhpcy50
ZXh0dXJlLm1pbkZpbHRlciA9IHZhbHVlOworCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisg
ICAgICAgIGFuaXNvdHJvcHk6IHsKKyAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5h
bmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gdGhpcy50ZXh0dXJlLmFuaXNvdHJvcHk7CisKKyAgICAgICAgICAgIH0sCisgICAg
ICAgICAgICBzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAgICAgICAgICBjb25z
b2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50
ZXh0dXJlLmFuaXNvdHJvcHkuJyApOworICAgICAgICAgICAgICAgIHRoaXMudGV4dHVyZS5hbmlz
b3Ryb3B5ID0gdmFsdWU7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgb2Zm
c2V0OiB7CisgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgICAg
IGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAu
dGV4dHVyZS5vZmZzZXQuJyApOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHR1cmUu
b2Zmc2V0OworCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoIHZh
bHVlICkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5k
ZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7CisgICAgICAgICAg
ICAgICAgdGhpcy50ZXh0dXJlLm9mZnNldCA9IHZhbHVlOworCisgICAgICAgICAgICB9CisgICAg
ICAgIH0sCisgICAgICAgIHJlcGVhdDogeworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7
CisKKyAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdl
dDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gdGhpcy50ZXh0dXJlLnJlcGVhdDsKKworICAgICAgICAgICAgfSwKKyAgICAgICAgICAg
IHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKKworICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fy
biggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBl
YXQuJyApOworICAgICAgICAgICAgICAgIHRoaXMudGV4dHVyZS5yZXBlYXQgPSB2YWx1ZTsKKwor
ICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBmb3JtYXQ6IHsKKyAgICAgICAgICAg
IGdldDogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhS
RUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4nICk7
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZS5mb3JtYXQ7CisKKyAgICAgICAg
ICAgIH0sCisgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAgICAg
ICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBp
cyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTsKKyAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmUu
Zm9ybWF0ID0gdmFsdWU7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgdHlw
ZTogeworICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgICAgICBj
b25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0
dXJlLnR5cGUuJyApOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHR1cmUudHlwZTsK
KworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsK
KworICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0
OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7CisgICAgICAgICAgICAgICAgdGhpcy50
ZXh0dXJlLnR5cGUgPSB2YWx1ZTsKKworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAg
ICBnZW5lcmF0ZU1pcG1hcHM6IHsKKyAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeworCisg
ICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5n
ZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7CisKKyAgICAg
ICAgICAgIH0sCisgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CisKKyAgICAg
ICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVy
YXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTsKKyAgICAgICAg
ICAgICAgICB0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gdmFsdWU7CisKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorCisgICAgfSApOworCisgICAgLy8KKworICAgIEF1ZGlvLnByb3Rv
dHlwZS5sb2FkID0gZnVuY3Rpb24gKCBmaWxlICkgeworCisgICAgICAgIGNvbnNvbGUud2Fybigg
J1RIUkVFLkF1ZGlvOiAubG9hZCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQXVkaW9M
b2FkZXIgaW5zdGVhZC4nICk7CisgICAgICAgIHZhciBzY29wZSA9IHRoaXM7CisgICAgICAgIHZh
ciBhdWRpb0xvYWRlciA9IG5ldyBBdWRpb0xvYWRlcigpOworICAgICAgICBhdWRpb0xvYWRlci5s
b2FkKCBmaWxlLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHsKKworICAgICAgICAgICAgc2NvcGUuc2V0
QnVmZmVyKCBidWZmZXIgKTsKKworICAgICAgICB9ICk7CisgICAgICAgIHJldHVybiB0aGlzOwor
CisgICAgfTsKKworICAgIEF1ZGlvQW5hbHlzZXIucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlv
biAoKSB7CisKKyAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW9BbmFseXNlcjogLmdl
dERhdGEoKSBpcyBub3cgLmdldEZyZXF1ZW5jeURhdGEoKS4nICk7CisgICAgICAgIHJldHVybiB0
aGlzLmdldEZyZXF1ZW5jeURhdGEoKTsKKworICAgIH07CisKKyAgICAvLworCisgICAgdmFyIEdl
b21ldHJ5VXRpbHMgPSB7CisKKyAgICAgICAgbWVyZ2U6IGZ1bmN0aW9uICggZ2VvbWV0cnkxLCBn
ZW9tZXRyeTIsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUu
d2FybiggJ1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdl
b21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbElu
ZGV4T2Zmc2V0ICkgaW5zdGVhZC4nICk7CisgICAgICAgICAgICB2YXIgbWF0cml4OworCisgICAg
ICAgICAgICBpZiAoIGdlb21ldHJ5Mi5pc01lc2ggKSB7CisKKyAgICAgICAgICAgICAgICBnZW9t
ZXRyeTIubWF0cml4QXV0b1VwZGF0ZSAmJiBnZW9tZXRyeTIudXBkYXRlTWF0cml4KCk7CisKKyAg
ICAgICAgICAgICAgICBtYXRyaXggPSBnZW9tZXRyeTIubWF0cml4OworICAgICAgICAgICAgICAg
IGdlb21ldHJ5MiA9IGdlb21ldHJ5Mi5nZW9tZXRyeTsKKworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBnZW9tZXRyeTEubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4
T2Zmc2V0ICk7CisKKyAgICAgICAgfSwKKworICAgICAgICBjZW50ZXI6IGZ1bmN0aW9uICggZ2Vv
bWV0cnkgKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5VXRp
bHM6IC5jZW50ZXIoKSBoYXMgYmVlbiBtb3ZlZCB0byBHZW9tZXRyeS4gVXNlIGdlb21ldHJ5LmNl
bnRlcigpIGluc3RlYWQuJyApOworICAgICAgICAgICAgcmV0dXJuIGdlb21ldHJ5LmNlbnRlcigp
OworCisgICAgICAgIH0KKworICAgIH07CisKKyAgICB2YXIgSW1hZ2VVdGlscyA9IHsKKworICAg
ICAgICBjcm9zc09yaWdpbjogdW5kZWZpbmVkLAorCisgICAgICAgIGxvYWRUZXh0dXJlOiBmdW5j
dGlvbiAoIHVybCwgbWFwcGluZywgb25Mb2FkLCBvbkVycm9yICkgeworCisgICAgICAgICAgICBj
b25zb2xlLndhcm4oICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlIGhhcyBiZWVuIGRlcHJl
Y2F0ZWQuIFVzZSBUSFJFRS5UZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4nICk7CisKKyAgICAgICAg
ICAgIHZhciBsb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpOworICAgICAgICAgICAgbG9hZGVy
LnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7CisKKyAgICAgICAgICAgIHZhciB0
ZXh0dXJlID0gbG9hZGVyLmxvYWQoIHVybCwgb25Mb2FkLCB1bmRlZmluZWQsIG9uRXJyb3IgKTsK
KworICAgICAgICAgICAgaWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZzsK
KworICAgICAgICAgICAgcmV0dXJuIHRleHR1cmU7CisKKyAgICAgICAgfSwKKworICAgICAgICBs
b2FkVGV4dHVyZUN1YmU6IGZ1bmN0aW9uICggdXJscywgbWFwcGluZywgb25Mb2FkLCBvbkVycm9y
ICkgeworCisgICAgICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRU
ZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2Fk
ZXIoKSBpbnN0ZWFkLicgKTsKKworICAgICAgICAgICAgdmFyIGxvYWRlciA9IG5ldyBDdWJlVGV4
dHVyZUxvYWRlcigpOworICAgICAgICAgICAgbG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNy
b3NzT3JpZ2luICk7CisKKyAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIHVy
bHMsIG9uTG9hZCwgdW5kZWZpbmVkLCBvbkVycm9yICk7CisKKyAgICAgICAgICAgIGlmICggbWFw
cGluZyApIHRleHR1cmUubWFwcGluZyA9IG1hcHBpbmc7CisKKyAgICAgICAgICAgIHJldHVybiB0
ZXh0dXJlOworCisgICAgICAgIH0sCisKKyAgICAgICAgbG9hZENvbXByZXNzZWRUZXh0dXJlOiBm
dW5jdGlvbiAoKSB7CisKKyAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5JbWFnZVV0
aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERT
TG9hZGVyIGluc3RlYWQuJyApOworCisgICAgICAgIH0sCisKKyAgICAgICAgbG9hZENvbXByZXNz
ZWRUZXh0dXJlQ3ViZTogZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBjb25zb2xlLmVycm9y
KCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlIGhhcyBiZWVuIHJl
bW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7CisKKyAgICAgICAgfQorCisg
ICAgfTsKKworICAgIC8vCisKKyAgICBmdW5jdGlvbiBQcm9qZWN0b3IoKSB7CisKKyAgICAgICAg
Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb2plY3RvciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBs
ZXMvanMvcmVuZGVyZXJzL1Byb2plY3Rvci5qcy4nICk7CisKKyAgICAgICAgdGhpcy5wcm9qZWN0
VmVjdG9yID0gZnVuY3Rpb24gKCB2ZWN0b3IsIGNhbWVyYSApIHsKKworICAgICAgICAgICAgY29u
c29sZS53YXJuKCAnVEhSRUUuUHJvamVjdG9yOiAucHJvamVjdFZlY3RvcigpIGlzIG5vdyB2ZWN0
b3IucHJvamVjdCgpLicgKTsKKyAgICAgICAgICAgIHZlY3Rvci5wcm9qZWN0KCBjYW1lcmEgKTsK
KworICAgICAgICB9OworCisgICAgICAgIHRoaXMudW5wcm9qZWN0VmVjdG9yID0gZnVuY3Rpb24g
KCB2ZWN0b3IsIGNhbWVyYSApIHsKKworICAgICAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUu
UHJvamVjdG9yOiAudW5wcm9qZWN0VmVjdG9yKCkgaXMgbm93IHZlY3Rvci51bnByb2plY3QoKS4n
ICk7CisgICAgICAgICAgICB2ZWN0b3IudW5wcm9qZWN0KCBjYW1lcmEgKTsKKworICAgICAgICB9
OworCisgICAgICAgIHRoaXMucGlja2luZ1JheSA9IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAg
ICAgY29uc29sZS5lcnJvciggJ1RIUkVFLlByb2plY3RvcjogLnBpY2tpbmdSYXkoKSBpcyBub3cg
cmF5Y2FzdGVyLnNldEZyb21DYW1lcmEoKS4nICk7CisKKyAgICAgICAgfTsKKworICAgIH0KKwor
ICAgIC8vCisKKyAgICBmdW5jdGlvbiBDYW52YXNSZW5kZXJlcigpIHsKKworICAgICAgICBjb25z
b2xlLmVycm9yKCAnVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1w
bGVzL2pzL3JlbmRlcmVycy9DYW52YXNSZW5kZXJlci5qcycgKTsKKworICAgICAgICB0aGlzLmRv
bUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8x
OTk5L3hodG1sJywgJ2NhbnZhcycgKTsKKyAgICAgICAgdGhpcy5jbGVhciA9IGZ1bmN0aW9uICgp
IHt9OworICAgICAgICB0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICgpIHt9OworICAgICAgICB0aGlz
LnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7fTsKKyAgICAgICAgdGhpcy5zZXRTaXplID0g
ZnVuY3Rpb24gKCkge307CisKKyAgICB9CisKKyAgICBleHBvcnRzLldlYkdMUmVuZGVyVGFyZ2V0
Q3ViZSA9IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZTsKKyAgICBleHBvcnRzLldlYkdMUmVuZGVyVGFy
Z2V0ID0gV2ViR0xSZW5kZXJUYXJnZXQ7CisgICAgZXhwb3J0cy5XZWJHTFJlbmRlcmVyID0gV2Vi
R0xSZW5kZXJlcjsKKyAgICBleHBvcnRzLlNoYWRlckxpYiA9IFNoYWRlckxpYjsKKyAgICBleHBv
cnRzLlVuaWZvcm1zTGliID0gVW5pZm9ybXNMaWI7CisgICAgZXhwb3J0cy5Vbmlmb3Jtc1V0aWxz
ID0gVW5pZm9ybXNVdGlsczsKKyAgICBleHBvcnRzLlNoYWRlckNodW5rID0gU2hhZGVyQ2h1bms7
CisgICAgZXhwb3J0cy5Gb2dFeHAyID0gRm9nRXhwMjsKKyAgICBleHBvcnRzLkZvZyA9IEZvZzsK
KyAgICBleHBvcnRzLlNjZW5lID0gU2NlbmU7CisgICAgZXhwb3J0cy5MZW5zRmxhcmUgPSBMZW5z
RmxhcmU7CisgICAgZXhwb3J0cy5TcHJpdGUgPSBTcHJpdGU7CisgICAgZXhwb3J0cy5MT0QgPSBM
T0Q7CisgICAgZXhwb3J0cy5Ta2lubmVkTWVzaCA9IFNraW5uZWRNZXNoOworICAgIGV4cG9ydHMu
U2tlbGV0b24gPSBTa2VsZXRvbjsKKyAgICBleHBvcnRzLkJvbmUgPSBCb25lOworICAgIGV4cG9y
dHMuTWVzaCA9IE1lc2g7CisgICAgZXhwb3J0cy5MaW5lU2VnbWVudHMgPSBMaW5lU2VnbWVudHM7
CisgICAgZXhwb3J0cy5MaW5lTG9vcCA9IExpbmVMb29wOworICAgIGV4cG9ydHMuTGluZSA9IExp
bmU7CisgICAgZXhwb3J0cy5Qb2ludHMgPSBQb2ludHM7CisgICAgZXhwb3J0cy5Hcm91cCA9IEdy
b3VwOworICAgIGV4cG9ydHMuVmlkZW9UZXh0dXJlID0gVmlkZW9UZXh0dXJlOworICAgIGV4cG9y
dHMuRGF0YVRleHR1cmUgPSBEYXRhVGV4dHVyZTsKKyAgICBleHBvcnRzLkNvbXByZXNzZWRUZXh0
dXJlID0gQ29tcHJlc3NlZFRleHR1cmU7CisgICAgZXhwb3J0cy5DdWJlVGV4dHVyZSA9IEN1YmVU
ZXh0dXJlOworICAgIGV4cG9ydHMuQ2FudmFzVGV4dHVyZSA9IENhbnZhc1RleHR1cmU7CisgICAg
ZXhwb3J0cy5EZXB0aFRleHR1cmUgPSBEZXB0aFRleHR1cmU7CisgICAgZXhwb3J0cy5UZXh0dXJl
ID0gVGV4dHVyZTsKKyAgICBleHBvcnRzLkNvbXByZXNzZWRUZXh0dXJlTG9hZGVyID0gQ29tcHJl
c3NlZFRleHR1cmVMb2FkZXI7CisgICAgZXhwb3J0cy5EYXRhVGV4dHVyZUxvYWRlciA9IERhdGFU
ZXh0dXJlTG9hZGVyOworICAgIGV4cG9ydHMuQ3ViZVRleHR1cmVMb2FkZXIgPSBDdWJlVGV4dHVy
ZUxvYWRlcjsKKyAgICBleHBvcnRzLlRleHR1cmVMb2FkZXIgPSBUZXh0dXJlTG9hZGVyOworICAg
IGV4cG9ydHMuT2JqZWN0TG9hZGVyID0gT2JqZWN0TG9hZGVyOworICAgIGV4cG9ydHMuTWF0ZXJp
YWxMb2FkZXIgPSBNYXRlcmlhbExvYWRlcjsKKyAgICBleHBvcnRzLkJ1ZmZlckdlb21ldHJ5TG9h
ZGVyID0gQnVmZmVyR2VvbWV0cnlMb2FkZXI7CisgICAgZXhwb3J0cy5EZWZhdWx0TG9hZGluZ01h
bmFnZXIgPSBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CisgICAgZXhwb3J0cy5Mb2FkaW5nTWFuYWdl
ciA9IExvYWRpbmdNYW5hZ2VyOworICAgIGV4cG9ydHMuSlNPTkxvYWRlciA9IEpTT05Mb2FkZXI7
CisgICAgZXhwb3J0cy5JbWFnZUxvYWRlciA9IEltYWdlTG9hZGVyOworICAgIGV4cG9ydHMuRm9u
dExvYWRlciA9IEZvbnRMb2FkZXI7CisgICAgZXhwb3J0cy5GaWxlTG9hZGVyID0gRmlsZUxvYWRl
cjsKKyAgICBleHBvcnRzLkxvYWRlciA9IExvYWRlcjsKKyAgICBleHBvcnRzLkNhY2hlID0gQ2Fj
aGU7CisgICAgZXhwb3J0cy5BdWRpb0xvYWRlciA9IEF1ZGlvTG9hZGVyOworICAgIGV4cG9ydHMu
U3BvdExpZ2h0U2hhZG93ID0gU3BvdExpZ2h0U2hhZG93OworICAgIGV4cG9ydHMuU3BvdExpZ2h0
ID0gU3BvdExpZ2h0OworICAgIGV4cG9ydHMuUG9pbnRMaWdodCA9IFBvaW50TGlnaHQ7CisgICAg
ZXhwb3J0cy5SZWN0QXJlYUxpZ2h0ID0gUmVjdEFyZWFMaWdodDsKKyAgICBleHBvcnRzLkhlbWlz
cGhlcmVMaWdodCA9IEhlbWlzcGhlcmVMaWdodDsKKyAgICBleHBvcnRzLkRpcmVjdGlvbmFsTGln
aHRTaGFkb3cgPSBEaXJlY3Rpb25hbExpZ2h0U2hhZG93OworICAgIGV4cG9ydHMuRGlyZWN0aW9u
YWxMaWdodCA9IERpcmVjdGlvbmFsTGlnaHQ7CisgICAgZXhwb3J0cy5BbWJpZW50TGlnaHQgPSBB
bWJpZW50TGlnaHQ7CisgICAgZXhwb3J0cy5MaWdodFNoYWRvdyA9IExpZ2h0U2hhZG93OworICAg
IGV4cG9ydHMuTGlnaHQgPSBMaWdodDsKKyAgICBleHBvcnRzLlN0ZXJlb0NhbWVyYSA9IFN0ZXJl
b0NhbWVyYTsKKyAgICBleHBvcnRzLlBlcnNwZWN0aXZlQ2FtZXJhID0gUGVyc3BlY3RpdmVDYW1l
cmE7CisgICAgZXhwb3J0cy5PcnRob2dyYXBoaWNDYW1lcmEgPSBPcnRob2dyYXBoaWNDYW1lcmE7
CisgICAgZXhwb3J0cy5DdWJlQ2FtZXJhID0gQ3ViZUNhbWVyYTsKKyAgICBleHBvcnRzLkFycmF5
Q2FtZXJhID0gQXJyYXlDYW1lcmE7CisgICAgZXhwb3J0cy5DYW1lcmEgPSBDYW1lcmE7CisgICAg
ZXhwb3J0cy5BdWRpb0xpc3RlbmVyID0gQXVkaW9MaXN0ZW5lcjsKKyAgICBleHBvcnRzLlBvc2l0
aW9uYWxBdWRpbyA9IFBvc2l0aW9uYWxBdWRpbzsKKyAgICBleHBvcnRzLkF1ZGlvQ29udGV4dCA9
IEF1ZGlvQ29udGV4dDsKKyAgICBleHBvcnRzLkF1ZGlvQW5hbHlzZXIgPSBBdWRpb0FuYWx5c2Vy
OworICAgIGV4cG9ydHMuQXVkaW8gPSBBdWRpbzsKKyAgICBleHBvcnRzLlZlY3RvcktleWZyYW1l
VHJhY2sgPSBWZWN0b3JLZXlmcmFtZVRyYWNrOworICAgIGV4cG9ydHMuU3RyaW5nS2V5ZnJhbWVU
cmFjayA9IFN0cmluZ0tleWZyYW1lVHJhY2s7CisgICAgZXhwb3J0cy5RdWF0ZXJuaW9uS2V5ZnJh
bWVUcmFjayA9IFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrOworICAgIGV4cG9ydHMuTnVtYmVyS2V5
ZnJhbWVUcmFjayA9IE51bWJlcktleWZyYW1lVHJhY2s7CisgICAgZXhwb3J0cy5Db2xvcktleWZy
YW1lVHJhY2sgPSBDb2xvcktleWZyYW1lVHJhY2s7CisgICAgZXhwb3J0cy5Cb29sZWFuS2V5ZnJh
bWVUcmFjayA9IEJvb2xlYW5LZXlmcmFtZVRyYWNrOworICAgIGV4cG9ydHMuUHJvcGVydHlNaXhl
ciA9IFByb3BlcnR5TWl4ZXI7CisgICAgZXhwb3J0cy5Qcm9wZXJ0eUJpbmRpbmcgPSBQcm9wZXJ0
eUJpbmRpbmc7CisgICAgZXhwb3J0cy5LZXlmcmFtZVRyYWNrID0gS2V5ZnJhbWVUcmFjazsKKyAg
ICBleHBvcnRzLkFuaW1hdGlvblV0aWxzID0gQW5pbWF0aW9uVXRpbHM7CisgICAgZXhwb3J0cy5B
bmltYXRpb25PYmplY3RHcm91cCA9IEFuaW1hdGlvbk9iamVjdEdyb3VwOworICAgIGV4cG9ydHMu
QW5pbWF0aW9uTWl4ZXIgPSBBbmltYXRpb25NaXhlcjsKKyAgICBleHBvcnRzLkFuaW1hdGlvbkNs
aXAgPSBBbmltYXRpb25DbGlwOworICAgIGV4cG9ydHMuVW5pZm9ybSA9IFVuaWZvcm07CisgICAg
ZXhwb3J0cy5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA9IEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5
OworICAgIGV4cG9ydHMuQnVmZmVyR2VvbWV0cnkgPSBCdWZmZXJHZW9tZXRyeTsKKyAgICBleHBv
cnRzLkdlb21ldHJ5SWRDb3VudCA9IEdlb21ldHJ5SWRDb3VudDsKKyAgICBleHBvcnRzLkdlb21l
dHJ5ID0gR2VvbWV0cnk7CisgICAgZXhwb3J0cy5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSA9
IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOworICAgIGV4cG9ydHMuSW5zdGFuY2VkSW50ZXJs
ZWF2ZWRCdWZmZXIgPSBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjsKKyAgICBleHBvcnRzLklu
dGVybGVhdmVkQnVmZmVyID0gSW50ZXJsZWF2ZWRCdWZmZXI7CisgICAgZXhwb3J0cy5JbnN0YW5j
ZWRCdWZmZXJBdHRyaWJ1dGUgPSBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU7CisgICAgZXhwb3J0
cy5GYWNlMyA9IEZhY2UzOworICAgIGV4cG9ydHMuT2JqZWN0M0QgPSBPYmplY3QzRDsKKyAgICBl
eHBvcnRzLlJheWNhc3RlciA9IFJheWNhc3RlcjsKKyAgICBleHBvcnRzLkxheWVycyA9IExheWVy
czsKKyAgICBleHBvcnRzLkV2ZW50RGlzcGF0Y2hlciA9IEV2ZW50RGlzcGF0Y2hlcjsKKyAgICBl
eHBvcnRzLkNsb2NrID0gQ2xvY2s7CisgICAgZXhwb3J0cy5RdWF0ZXJuaW9uTGluZWFySW50ZXJw
b2xhbnQgPSBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQ7CisgICAgZXhwb3J0cy5MaW5lYXJJ
bnRlcnBvbGFudCA9IExpbmVhckludGVycG9sYW50OworICAgIGV4cG9ydHMuRGlzY3JldGVJbnRl
cnBvbGFudCA9IERpc2NyZXRlSW50ZXJwb2xhbnQ7CisgICAgZXhwb3J0cy5DdWJpY0ludGVycG9s
YW50ID0gQ3ViaWNJbnRlcnBvbGFudDsKKyAgICBleHBvcnRzLkludGVycG9sYW50ID0gSW50ZXJw
b2xhbnQ7CisgICAgZXhwb3J0cy5UcmlhbmdsZSA9IFRyaWFuZ2xlOworICAgIGV4cG9ydHMuTWF0
aCA9IF9NYXRoOworICAgIGV4cG9ydHMuU3BoZXJpY2FsID0gU3BoZXJpY2FsOworICAgIGV4cG9y
dHMuQ3lsaW5kcmljYWwgPSBDeWxpbmRyaWNhbDsKKyAgICBleHBvcnRzLlBsYW5lID0gUGxhbmU7
CisgICAgZXhwb3J0cy5GcnVzdHVtID0gRnJ1c3R1bTsKKyAgICBleHBvcnRzLlNwaGVyZSA9IFNw
aGVyZTsKKyAgICBleHBvcnRzLlJheSA9IFJheTsKKyAgICBleHBvcnRzLk1hdHJpeDQgPSBNYXRy
aXg0OworICAgIGV4cG9ydHMuTWF0cml4MyA9IE1hdHJpeDM7CisgICAgZXhwb3J0cy5Cb3gzID0g
Qm94MzsKKyAgICBleHBvcnRzLkJveDIgPSBCb3gyOworICAgIGV4cG9ydHMuTGluZTMgPSBMaW5l
MzsKKyAgICBleHBvcnRzLkV1bGVyID0gRXVsZXI7CisgICAgZXhwb3J0cy5WZWN0b3I0ID0gVmVj
dG9yNDsKKyAgICBleHBvcnRzLlZlY3RvcjMgPSBWZWN0b3IzOworICAgIGV4cG9ydHMuVmVjdG9y
MiA9IFZlY3RvcjI7CisgICAgZXhwb3J0cy5RdWF0ZXJuaW9uID0gUXVhdGVybmlvbjsKKyAgICBl
eHBvcnRzLkNvbG9yID0gQ29sb3I7CisgICAgZXhwb3J0cy5Nb3JwaEJsZW5kTWVzaCA9IE1vcnBo
QmxlbmRNZXNoOworICAgIGV4cG9ydHMuSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gSW1tZWRpYXRl
UmVuZGVyT2JqZWN0OworICAgIGV4cG9ydHMuVmVydGV4Tm9ybWFsc0hlbHBlciA9IFZlcnRleE5v
cm1hbHNIZWxwZXI7CisgICAgZXhwb3J0cy5TcG90TGlnaHRIZWxwZXIgPSBTcG90TGlnaHRIZWxw
ZXI7CisgICAgZXhwb3J0cy5Ta2VsZXRvbkhlbHBlciA9IFNrZWxldG9uSGVscGVyOworICAgIGV4
cG9ydHMuUG9pbnRMaWdodEhlbHBlciA9IFBvaW50TGlnaHRIZWxwZXI7CisgICAgZXhwb3J0cy5S
ZWN0QXJlYUxpZ2h0SGVscGVyID0gUmVjdEFyZWFMaWdodEhlbHBlcjsKKyAgICBleHBvcnRzLkhl
bWlzcGhlcmVMaWdodEhlbHBlciA9IEhlbWlzcGhlcmVMaWdodEhlbHBlcjsKKyAgICBleHBvcnRz
LkdyaWRIZWxwZXIgPSBHcmlkSGVscGVyOworICAgIGV4cG9ydHMuUG9sYXJHcmlkSGVscGVyID0g
UG9sYXJHcmlkSGVscGVyOworICAgIGV4cG9ydHMuRmFjZU5vcm1hbHNIZWxwZXIgPSBGYWNlTm9y
bWFsc0hlbHBlcjsKKyAgICBleHBvcnRzLkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIgPSBEaXJlY3Rp
b25hbExpZ2h0SGVscGVyOworICAgIGV4cG9ydHMuQ2FtZXJhSGVscGVyID0gQ2FtZXJhSGVscGVy
OworICAgIGV4cG9ydHMuQm94SGVscGVyID0gQm94SGVscGVyOworICAgIGV4cG9ydHMuQXJyb3dI
ZWxwZXIgPSBBcnJvd0hlbHBlcjsKKyAgICBleHBvcnRzLkF4aXNIZWxwZXIgPSBBeGlzSGVscGVy
OworICAgIGV4cG9ydHMuQ2F0bXVsbFJvbUN1cnZlMyA9IENhdG11bGxSb21DdXJ2ZTM7CisgICAg
ZXhwb3J0cy5DdWJpY0JlemllckN1cnZlMyA9IEN1YmljQmV6aWVyQ3VydmUzOworICAgIGV4cG9y
dHMuUXVhZHJhdGljQmV6aWVyQ3VydmUzID0gUXVhZHJhdGljQmV6aWVyQ3VydmUzOworICAgIGV4
cG9ydHMuTGluZUN1cnZlMyA9IExpbmVDdXJ2ZTM7CisgICAgZXhwb3J0cy5BcmNDdXJ2ZSA9IEFy
Y0N1cnZlOworICAgIGV4cG9ydHMuRWxsaXBzZUN1cnZlID0gRWxsaXBzZUN1cnZlOworICAgIGV4
cG9ydHMuU3BsaW5lQ3VydmUgPSBTcGxpbmVDdXJ2ZTsKKyAgICBleHBvcnRzLkN1YmljQmV6aWVy
Q3VydmUgPSBDdWJpY0JlemllckN1cnZlOworICAgIGV4cG9ydHMuUXVhZHJhdGljQmV6aWVyQ3Vy
dmUgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTsKKyAgICBleHBvcnRzLkxpbmVDdXJ2ZSA9IExpbmVD
dXJ2ZTsKKyAgICBleHBvcnRzLlNoYXBlID0gU2hhcGU7CisgICAgZXhwb3J0cy5QYXRoID0gUGF0
aDsKKyAgICBleHBvcnRzLlNoYXBlUGF0aCA9IFNoYXBlUGF0aDsKKyAgICBleHBvcnRzLkZvbnQg
PSBGb250OworICAgIGV4cG9ydHMuQ3VydmVQYXRoID0gQ3VydmVQYXRoOworICAgIGV4cG9ydHMu
Q3VydmUgPSBDdXJ2ZTsKKyAgICBleHBvcnRzLlNoYXBlVXRpbHMgPSBTaGFwZVV0aWxzOworICAg
IGV4cG9ydHMuU2NlbmVVdGlscyA9IFNjZW5lVXRpbHM7CisgICAgZXhwb3J0cy5XaXJlZnJhbWVH
ZW9tZXRyeSA9IFdpcmVmcmFtZUdlb21ldHJ5OworICAgIGV4cG9ydHMuUGFyYW1ldHJpY0dlb21l
dHJ5ID0gUGFyYW1ldHJpY0dlb21ldHJ5OworICAgIGV4cG9ydHMuUGFyYW1ldHJpY0J1ZmZlckdl
b21ldHJ5ID0gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5OworICAgIGV4cG9ydHMuVGV0cmFoZWRy
b25HZW9tZXRyeSA9IFRldHJhaGVkcm9uR2VvbWV0cnk7CisgICAgZXhwb3J0cy5UZXRyYWhlZHJv
bkJ1ZmZlckdlb21ldHJ5ID0gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTsKKyAgICBleHBvcnRz
Lk9jdGFoZWRyb25HZW9tZXRyeSA9IE9jdGFoZWRyb25HZW9tZXRyeTsKKyAgICBleHBvcnRzLk9j
dGFoZWRyb25CdWZmZXJHZW9tZXRyeSA9IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTsKKyAgICBl
eHBvcnRzLkljb3NhaGVkcm9uR2VvbWV0cnkgPSBJY29zYWhlZHJvbkdlb21ldHJ5OworICAgIGV4
cG9ydHMuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSA9IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0
cnk7CisgICAgZXhwb3J0cy5Eb2RlY2FoZWRyb25HZW9tZXRyeSA9IERvZGVjYWhlZHJvbkdlb21l
dHJ5OworICAgIGV4cG9ydHMuRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkgPSBEb2RlY2FoZWRy
b25CdWZmZXJHZW9tZXRyeTsKKyAgICBleHBvcnRzLlBvbHloZWRyb25HZW9tZXRyeSA9IFBvbHlo
ZWRyb25HZW9tZXRyeTsKKyAgICBleHBvcnRzLlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSA9IFBv
bHloZWRyb25CdWZmZXJHZW9tZXRyeTsKKyAgICBleHBvcnRzLlR1YmVHZW9tZXRyeSA9IFR1YmVH
ZW9tZXRyeTsKKyAgICBleHBvcnRzLlR1YmVCdWZmZXJHZW9tZXRyeSA9IFR1YmVCdWZmZXJHZW9t
ZXRyeTsKKyAgICBleHBvcnRzLlRvcnVzS25vdEdlb21ldHJ5ID0gVG9ydXNLbm90R2VvbWV0cnk7
CisgICAgZXhwb3J0cy5Ub3J1c0tub3RCdWZmZXJHZW9tZXRyeSA9IFRvcnVzS25vdEJ1ZmZlckdl
b21ldHJ5OworICAgIGV4cG9ydHMuVG9ydXNHZW9tZXRyeSA9IFRvcnVzR2VvbWV0cnk7CisgICAg
ZXhwb3J0cy5Ub3J1c0J1ZmZlckdlb21ldHJ5ID0gVG9ydXNCdWZmZXJHZW9tZXRyeTsKKyAgICBl
eHBvcnRzLlRleHRHZW9tZXRyeSA9IFRleHRHZW9tZXRyeTsKKyAgICBleHBvcnRzLlRleHRCdWZm
ZXJHZW9tZXRyeSA9IFRleHRCdWZmZXJHZW9tZXRyeTsKKyAgICBleHBvcnRzLlNwaGVyZUdlb21l
dHJ5ID0gU3BoZXJlR2VvbWV0cnk7CisgICAgZXhwb3J0cy5TcGhlcmVCdWZmZXJHZW9tZXRyeSA9
IFNwaGVyZUJ1ZmZlckdlb21ldHJ5OworICAgIGV4cG9ydHMuUmluZ0dlb21ldHJ5ID0gUmluZ0dl
b21ldHJ5OworICAgIGV4cG9ydHMuUmluZ0J1ZmZlckdlb21ldHJ5ID0gUmluZ0J1ZmZlckdlb21l
dHJ5OworICAgIGV4cG9ydHMuUGxhbmVHZW9tZXRyeSA9IFBsYW5lR2VvbWV0cnk7CisgICAgZXhw
b3J0cy5QbGFuZUJ1ZmZlckdlb21ldHJ5ID0gUGxhbmVCdWZmZXJHZW9tZXRyeTsKKyAgICBleHBv
cnRzLkxhdGhlR2VvbWV0cnkgPSBMYXRoZUdlb21ldHJ5OworICAgIGV4cG9ydHMuTGF0aGVCdWZm
ZXJHZW9tZXRyeSA9IExhdGhlQnVmZmVyR2VvbWV0cnk7CisgICAgZXhwb3J0cy5TaGFwZUdlb21l
dHJ5ID0gU2hhcGVHZW9tZXRyeTsKKyAgICBleHBvcnRzLlNoYXBlQnVmZmVyR2VvbWV0cnkgPSBT
aGFwZUJ1ZmZlckdlb21ldHJ5OworICAgIGV4cG9ydHMuRXh0cnVkZUdlb21ldHJ5ID0gRXh0cnVk
ZUdlb21ldHJ5OworICAgIGV4cG9ydHMuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5ID0gRXh0cnVkZUJ1
ZmZlckdlb21ldHJ5OworICAgIGV4cG9ydHMuRWRnZXNHZW9tZXRyeSA9IEVkZ2VzR2VvbWV0cnk7
CisgICAgZXhwb3J0cy5Db25lR2VvbWV0cnkgPSBDb25lR2VvbWV0cnk7CisgICAgZXhwb3J0cy5D
b25lQnVmZmVyR2VvbWV0cnkgPSBDb25lQnVmZmVyR2VvbWV0cnk7CisgICAgZXhwb3J0cy5DeWxp
bmRlckdlb21ldHJ5ID0gQ3lsaW5kZXJHZW9tZXRyeTsKKyAgICBleHBvcnRzLkN5bGluZGVyQnVm
ZmVyR2VvbWV0cnkgPSBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OworICAgIGV4cG9ydHMuQ2lyY2xl
R2VvbWV0cnkgPSBDaXJjbGVHZW9tZXRyeTsKKyAgICBleHBvcnRzLkNpcmNsZUJ1ZmZlckdlb21l
dHJ5ID0gQ2lyY2xlQnVmZmVyR2VvbWV0cnk7CisgICAgZXhwb3J0cy5Cb3hHZW9tZXRyeSA9IEJv
eEdlb21ldHJ5OworICAgIGV4cG9ydHMuQm94QnVmZmVyR2VvbWV0cnkgPSBCb3hCdWZmZXJHZW9t
ZXRyeTsKKyAgICBleHBvcnRzLlNoYWRvd01hdGVyaWFsID0gU2hhZG93TWF0ZXJpYWw7CisgICAg
ZXhwb3J0cy5TcHJpdGVNYXRlcmlhbCA9IFNwcml0ZU1hdGVyaWFsOworICAgIGV4cG9ydHMuUmF3
U2hhZGVyTWF0ZXJpYWwgPSBSYXdTaGFkZXJNYXRlcmlhbDsKKyAgICBleHBvcnRzLlNoYWRlck1h
dGVyaWFsID0gU2hhZGVyTWF0ZXJpYWw7CisgICAgZXhwb3J0cy5Qb2ludHNNYXRlcmlhbCA9IFBv
aW50c01hdGVyaWFsOworICAgIGV4cG9ydHMuTWVzaFBoeXNpY2FsTWF0ZXJpYWwgPSBNZXNoUGh5
c2ljYWxNYXRlcmlhbDsKKyAgICBleHBvcnRzLk1lc2hTdGFuZGFyZE1hdGVyaWFsID0gTWVzaFN0
YW5kYXJkTWF0ZXJpYWw7CisgICAgZXhwb3J0cy5NZXNoUGhvbmdNYXRlcmlhbCA9IE1lc2hQaG9u
Z01hdGVyaWFsOworICAgIGV4cG9ydHMuTWVzaFRvb25NYXRlcmlhbCA9IE1lc2hUb29uTWF0ZXJp
YWw7CisgICAgZXhwb3J0cy5NZXNoTm9ybWFsTWF0ZXJpYWwgPSBNZXNoTm9ybWFsTWF0ZXJpYWw7
CisgICAgZXhwb3J0cy5NZXNoTGFtYmVydE1hdGVyaWFsID0gTWVzaExhbWJlcnRNYXRlcmlhbDsK
KyAgICBleHBvcnRzLk1lc2hEZXB0aE1hdGVyaWFsID0gTWVzaERlcHRoTWF0ZXJpYWw7CisgICAg
ZXhwb3J0cy5NZXNoQmFzaWNNYXRlcmlhbCA9IE1lc2hCYXNpY01hdGVyaWFsOworICAgIGV4cG9y
dHMuTGluZURhc2hlZE1hdGVyaWFsID0gTGluZURhc2hlZE1hdGVyaWFsOworICAgIGV4cG9ydHMu
TGluZUJhc2ljTWF0ZXJpYWwgPSBMaW5lQmFzaWNNYXRlcmlhbDsKKyAgICBleHBvcnRzLk1hdGVy
aWFsID0gTWF0ZXJpYWw7CisgICAgZXhwb3J0cy5GbG9hdDY0QnVmZmVyQXR0cmlidXRlID0gRmxv
YXQ2NEJ1ZmZlckF0dHJpYnV0ZTsKKyAgICBleHBvcnRzLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUg
PSBGbG9hdDMyQnVmZmVyQXR0cmlidXRlOworICAgIGV4cG9ydHMuVWludDMyQnVmZmVyQXR0cmli
dXRlID0gVWludDMyQnVmZmVyQXR0cmlidXRlOworICAgIGV4cG9ydHMuSW50MzJCdWZmZXJBdHRy
aWJ1dGUgPSBJbnQzMkJ1ZmZlckF0dHJpYnV0ZTsKKyAgICBleHBvcnRzLlVpbnQxNkJ1ZmZlckF0
dHJpYnV0ZSA9IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTsKKyAgICBleHBvcnRzLkludDE2QnVmZmVy
QXR0cmlidXRlID0gSW50MTZCdWZmZXJBdHRyaWJ1dGU7CisgICAgZXhwb3J0cy5VaW50OENsYW1w
ZWRCdWZmZXJBdHRyaWJ1dGUgPSBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU7CisgICAgZXhw
b3J0cy5VaW50OEJ1ZmZlckF0dHJpYnV0ZSA9IFVpbnQ4QnVmZmVyQXR0cmlidXRlOworICAgIGV4
cG9ydHMuSW50OEJ1ZmZlckF0dHJpYnV0ZSA9IEludDhCdWZmZXJBdHRyaWJ1dGU7CisgICAgZXhw
b3J0cy5CdWZmZXJBdHRyaWJ1dGUgPSBCdWZmZXJBdHRyaWJ1dGU7CisgICAgZXhwb3J0cy5SRVZJ
U0lPTiA9IFJFVklTSU9OOworICAgIGV4cG9ydHMuTU9VU0UgPSBNT1VTRTsKKyAgICBleHBvcnRz
LkN1bGxGYWNlTm9uZSA9IEN1bGxGYWNlTm9uZTsKKyAgICBleHBvcnRzLkN1bGxGYWNlQmFjayA9
IEN1bGxGYWNlQmFjazsKKyAgICBleHBvcnRzLkN1bGxGYWNlRnJvbnQgPSBDdWxsRmFjZUZyb250
OworICAgIGV4cG9ydHMuQ3VsbEZhY2VGcm9udEJhY2sgPSBDdWxsRmFjZUZyb250QmFjazsKKyAg
ICBleHBvcnRzLkZyb250RmFjZURpcmVjdGlvbkNXID0gRnJvbnRGYWNlRGlyZWN0aW9uQ1c7Cisg
ICAgZXhwb3J0cy5Gcm9udEZhY2VEaXJlY3Rpb25DQ1cgPSBGcm9udEZhY2VEaXJlY3Rpb25DQ1c7
CisgICAgZXhwb3J0cy5CYXNpY1NoYWRvd01hcCA9IEJhc2ljU2hhZG93TWFwOworICAgIGV4cG9y
dHMuUENGU2hhZG93TWFwID0gUENGU2hhZG93TWFwOworICAgIGV4cG9ydHMuUENGU29mdFNoYWRv
d01hcCA9IFBDRlNvZnRTaGFkb3dNYXA7CisgICAgZXhwb3J0cy5Gcm9udFNpZGUgPSBGcm9udFNp
ZGU7CisgICAgZXhwb3J0cy5CYWNrU2lkZSA9IEJhY2tTaWRlOworICAgIGV4cG9ydHMuRG91Ymxl
U2lkZSA9IERvdWJsZVNpZGU7CisgICAgZXhwb3J0cy5GbGF0U2hhZGluZyA9IEZsYXRTaGFkaW5n
OworICAgIGV4cG9ydHMuU21vb3RoU2hhZGluZyA9IFNtb290aFNoYWRpbmc7CisgICAgZXhwb3J0
cy5Ob0NvbG9ycyA9IE5vQ29sb3JzOworICAgIGV4cG9ydHMuRmFjZUNvbG9ycyA9IEZhY2VDb2xv
cnM7CisgICAgZXhwb3J0cy5WZXJ0ZXhDb2xvcnMgPSBWZXJ0ZXhDb2xvcnM7CisgICAgZXhwb3J0
cy5Ob0JsZW5kaW5nID0gTm9CbGVuZGluZzsKKyAgICBleHBvcnRzLk5vcm1hbEJsZW5kaW5nID0g
Tm9ybWFsQmxlbmRpbmc7CisgICAgZXhwb3J0cy5BZGRpdGl2ZUJsZW5kaW5nID0gQWRkaXRpdmVC
bGVuZGluZzsKKyAgICBleHBvcnRzLlN1YnRyYWN0aXZlQmxlbmRpbmcgPSBTdWJ0cmFjdGl2ZUJs
ZW5kaW5nOworICAgIGV4cG9ydHMuTXVsdGlwbHlCbGVuZGluZyA9IE11bHRpcGx5QmxlbmRpbmc7
CisgICAgZXhwb3J0cy5DdXN0b21CbGVuZGluZyA9IEN1c3RvbUJsZW5kaW5nOworICAgIGV4cG9y
dHMuQWRkRXF1YXRpb24gPSBBZGRFcXVhdGlvbjsKKyAgICBleHBvcnRzLlN1YnRyYWN0RXF1YXRp
b24gPSBTdWJ0cmFjdEVxdWF0aW9uOworICAgIGV4cG9ydHMuUmV2ZXJzZVN1YnRyYWN0RXF1YXRp
b24gPSBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbjsKKyAgICBleHBvcnRzLk1pbkVxdWF0aW9uID0g
TWluRXF1YXRpb247CisgICAgZXhwb3J0cy5NYXhFcXVhdGlvbiA9IE1heEVxdWF0aW9uOworICAg
IGV4cG9ydHMuWmVyb0ZhY3RvciA9IFplcm9GYWN0b3I7CisgICAgZXhwb3J0cy5PbmVGYWN0b3Ig
PSBPbmVGYWN0b3I7CisgICAgZXhwb3J0cy5TcmNDb2xvckZhY3RvciA9IFNyY0NvbG9yRmFjdG9y
OworICAgIGV4cG9ydHMuT25lTWludXNTcmNDb2xvckZhY3RvciA9IE9uZU1pbnVzU3JjQ29sb3JG
YWN0b3I7CisgICAgZXhwb3J0cy5TcmNBbHBoYUZhY3RvciA9IFNyY0FscGhhRmFjdG9yOworICAg
IGV4cG9ydHMuT25lTWludXNTcmNBbHBoYUZhY3RvciA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7
CisgICAgZXhwb3J0cy5Ec3RBbHBoYUZhY3RvciA9IERzdEFscGhhRmFjdG9yOworICAgIGV4cG9y
dHMuT25lTWludXNEc3RBbHBoYUZhY3RvciA9IE9uZU1pbnVzRHN0QWxwaGFGYWN0b3I7CisgICAg
ZXhwb3J0cy5Ec3RDb2xvckZhY3RvciA9IERzdENvbG9yRmFjdG9yOworICAgIGV4cG9ydHMuT25l
TWludXNEc3RDb2xvckZhY3RvciA9IE9uZU1pbnVzRHN0Q29sb3JGYWN0b3I7CisgICAgZXhwb3J0
cy5TcmNBbHBoYVNhdHVyYXRlRmFjdG9yID0gU3JjQWxwaGFTYXR1cmF0ZUZhY3RvcjsKKyAgICBl
eHBvcnRzLk5ldmVyRGVwdGggPSBOZXZlckRlcHRoOworICAgIGV4cG9ydHMuQWx3YXlzRGVwdGgg
PSBBbHdheXNEZXB0aDsKKyAgICBleHBvcnRzLkxlc3NEZXB0aCA9IExlc3NEZXB0aDsKKyAgICBl
eHBvcnRzLkxlc3NFcXVhbERlcHRoID0gTGVzc0VxdWFsRGVwdGg7CisgICAgZXhwb3J0cy5FcXVh
bERlcHRoID0gRXF1YWxEZXB0aDsKKyAgICBleHBvcnRzLkdyZWF0ZXJFcXVhbERlcHRoID0gR3Jl
YXRlckVxdWFsRGVwdGg7CisgICAgZXhwb3J0cy5HcmVhdGVyRGVwdGggPSBHcmVhdGVyRGVwdGg7
CisgICAgZXhwb3J0cy5Ob3RFcXVhbERlcHRoID0gTm90RXF1YWxEZXB0aDsKKyAgICBleHBvcnRz
Lk11bHRpcGx5T3BlcmF0aW9uID0gTXVsdGlwbHlPcGVyYXRpb247CisgICAgZXhwb3J0cy5NaXhP
cGVyYXRpb24gPSBNaXhPcGVyYXRpb247CisgICAgZXhwb3J0cy5BZGRPcGVyYXRpb24gPSBBZGRP
cGVyYXRpb247CisgICAgZXhwb3J0cy5Ob1RvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZzsKKyAg
ICBleHBvcnRzLkxpbmVhclRvbmVNYXBwaW5nID0gTGluZWFyVG9uZU1hcHBpbmc7CisgICAgZXhw
b3J0cy5SZWluaGFyZFRvbmVNYXBwaW5nID0gUmVpbmhhcmRUb25lTWFwcGluZzsKKyAgICBleHBv
cnRzLlVuY2hhcnRlZDJUb25lTWFwcGluZyA9IFVuY2hhcnRlZDJUb25lTWFwcGluZzsKKyAgICBl
eHBvcnRzLkNpbmVvblRvbmVNYXBwaW5nID0gQ2luZW9uVG9uZU1hcHBpbmc7CisgICAgZXhwb3J0
cy5VVk1hcHBpbmcgPSBVVk1hcHBpbmc7CisgICAgZXhwb3J0cy5DdWJlUmVmbGVjdGlvbk1hcHBp
bmcgPSBDdWJlUmVmbGVjdGlvbk1hcHBpbmc7CisgICAgZXhwb3J0cy5DdWJlUmVmcmFjdGlvbk1h
cHBpbmcgPSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc7CisgICAgZXhwb3J0cy5FcXVpcmVjdGFuZ3Vs
YXJSZWZsZWN0aW9uTWFwcGluZyA9IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOwor
ICAgIGV4cG9ydHMuRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgPSBFcXVpcmVjdGFu
Z3VsYXJSZWZyYWN0aW9uTWFwcGluZzsKKyAgICBleHBvcnRzLlNwaGVyaWNhbFJlZmxlY3Rpb25N
YXBwaW5nID0gU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc7CisgICAgZXhwb3J0cy5DdWJlVVZS
ZWZsZWN0aW9uTWFwcGluZyA9IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOworICAgIGV4cG9ydHMu
Q3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgPSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZzsKKyAgICBl
eHBvcnRzLlJlcGVhdFdyYXBwaW5nID0gUmVwZWF0V3JhcHBpbmc7CisgICAgZXhwb3J0cy5DbGFt
cFRvRWRnZVdyYXBwaW5nID0gQ2xhbXBUb0VkZ2VXcmFwcGluZzsKKyAgICBleHBvcnRzLk1pcnJv
cmVkUmVwZWF0V3JhcHBpbmcgPSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOworICAgIGV4cG9ydHMu
TmVhcmVzdEZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7CisgICAgZXhwb3J0cy5OZWFyZXN0TWlwTWFw
TmVhcmVzdEZpbHRlciA9IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyOworICAgIGV4cG9ydHMu
TmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciA9IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI7Cisg
ICAgZXhwb3J0cy5MaW5lYXJGaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CisgICAgZXhwb3J0cy5MaW5l
YXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlcjsKKyAgICBl
eHBvcnRzLkxpbmVhck1pcE1hcExpbmVhckZpbHRlciA9IExpbmVhck1pcE1hcExpbmVhckZpbHRl
cjsKKyAgICBleHBvcnRzLlVuc2lnbmVkQnl0ZVR5cGUgPSBVbnNpZ25lZEJ5dGVUeXBlOworICAg
IGV4cG9ydHMuQnl0ZVR5cGUgPSBCeXRlVHlwZTsKKyAgICBleHBvcnRzLlNob3J0VHlwZSA9IFNo
b3J0VHlwZTsKKyAgICBleHBvcnRzLlVuc2lnbmVkU2hvcnRUeXBlID0gVW5zaWduZWRTaG9ydFR5
cGU7CisgICAgZXhwb3J0cy5JbnRUeXBlID0gSW50VHlwZTsKKyAgICBleHBvcnRzLlVuc2lnbmVk
SW50VHlwZSA9IFVuc2lnbmVkSW50VHlwZTsKKyAgICBleHBvcnRzLkZsb2F0VHlwZSA9IEZsb2F0
VHlwZTsKKyAgICBleHBvcnRzLkhhbGZGbG9hdFR5cGUgPSBIYWxmRmxvYXRUeXBlOworICAgIGV4
cG9ydHMuVW5zaWduZWRTaG9ydDQ0NDRUeXBlID0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlOworICAg
IGV4cG9ydHMuVW5zaWduZWRTaG9ydDU1NTFUeXBlID0gVW5zaWduZWRTaG9ydDU1NTFUeXBlOwor
ICAgIGV4cG9ydHMuVW5zaWduZWRTaG9ydDU2NVR5cGUgPSBVbnNpZ25lZFNob3J0NTY1VHlwZTsK
KyAgICBleHBvcnRzLlVuc2lnbmVkSW50MjQ4VHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTsKKyAg
ICBleHBvcnRzLkFscGhhRm9ybWF0ID0gQWxwaGFGb3JtYXQ7CisgICAgZXhwb3J0cy5SR0JGb3Jt
YXQgPSBSR0JGb3JtYXQ7CisgICAgZXhwb3J0cy5SR0JBRm9ybWF0ID0gUkdCQUZvcm1hdDsKKyAg
ICBleHBvcnRzLkx1bWluYW5jZUZvcm1hdCA9IEx1bWluYW5jZUZvcm1hdDsKKyAgICBleHBvcnRz
Lkx1bWluYW5jZUFscGhhRm9ybWF0ID0gTHVtaW5hbmNlQWxwaGFGb3JtYXQ7CisgICAgZXhwb3J0
cy5SR0JFRm9ybWF0ID0gUkdCRUZvcm1hdDsKKyAgICBleHBvcnRzLkRlcHRoRm9ybWF0ID0gRGVw
dGhGb3JtYXQ7CisgICAgZXhwb3J0cy5EZXB0aFN0ZW5jaWxGb3JtYXQgPSBEZXB0aFN0ZW5jaWxG
b3JtYXQ7CisgICAgZXhwb3J0cy5SR0JfUzNUQ19EWFQxX0Zvcm1hdCA9IFJHQl9TM1RDX0RYVDFf
Rm9ybWF0OworICAgIGV4cG9ydHMuUkdCQV9TM1RDX0RYVDFfRm9ybWF0ID0gUkdCQV9TM1RDX0RY
VDFfRm9ybWF0OworICAgIGV4cG9ydHMuUkdCQV9TM1RDX0RYVDNfRm9ybWF0ID0gUkdCQV9TM1RD
X0RYVDNfRm9ybWF0OworICAgIGV4cG9ydHMuUkdCQV9TM1RDX0RYVDVfRm9ybWF0ID0gUkdCQV9T
M1RDX0RYVDVfRm9ybWF0OworICAgIGV4cG9ydHMuUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSBS
R0JfUFZSVENfNEJQUFYxX0Zvcm1hdDsKKyAgICBleHBvcnRzLlJHQl9QVlJUQ18yQlBQVjFfRm9y
bWF0ID0gUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQ7CisgICAgZXhwb3J0cy5SR0JBX1BWUlRDXzRC
UFBWMV9Gb3JtYXQgPSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQ7CisgICAgZXhwb3J0cy5SR0JB
X1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQ7CisgICAgZXhw
b3J0cy5SR0JfRVRDMV9Gb3JtYXQgPSBSR0JfRVRDMV9Gb3JtYXQ7CisgICAgZXhwb3J0cy5Mb29w
T25jZSA9IExvb3BPbmNlOworICAgIGV4cG9ydHMuTG9vcFJlcGVhdCA9IExvb3BSZXBlYXQ7Cisg
ICAgZXhwb3J0cy5Mb29wUGluZ1BvbmcgPSBMb29wUGluZ1Bvbmc7CisgICAgZXhwb3J0cy5JbnRl
cnBvbGF0ZURpc2NyZXRlID0gSW50ZXJwb2xhdGVEaXNjcmV0ZTsKKyAgICBleHBvcnRzLkludGVy
cG9sYXRlTGluZWFyID0gSW50ZXJwb2xhdGVMaW5lYXI7CisgICAgZXhwb3J0cy5JbnRlcnBvbGF0
ZVNtb290aCA9IEludGVycG9sYXRlU21vb3RoOworICAgIGV4cG9ydHMuWmVyb0N1cnZhdHVyZUVu
ZGluZyA9IFplcm9DdXJ2YXR1cmVFbmRpbmc7CisgICAgZXhwb3J0cy5aZXJvU2xvcGVFbmRpbmcg
PSBaZXJvU2xvcGVFbmRpbmc7CisgICAgZXhwb3J0cy5XcmFwQXJvdW5kRW5kaW5nID0gV3JhcEFy
b3VuZEVuZGluZzsKKyAgICBleHBvcnRzLlRyaWFuZ2xlc0RyYXdNb2RlID0gVHJpYW5nbGVzRHJh
d01vZGU7CisgICAgZXhwb3J0cy5UcmlhbmdsZVN0cmlwRHJhd01vZGUgPSBUcmlhbmdsZVN0cmlw
RHJhd01vZGU7CisgICAgZXhwb3J0cy5UcmlhbmdsZUZhbkRyYXdNb2RlID0gVHJpYW5nbGVGYW5E
cmF3TW9kZTsKKyAgICBleHBvcnRzLkxpbmVhckVuY29kaW5nID0gTGluZWFyRW5jb2Rpbmc7Cisg
ICAgZXhwb3J0cy5zUkdCRW5jb2RpbmcgPSBzUkdCRW5jb2Rpbmc7CisgICAgZXhwb3J0cy5HYW1t
YUVuY29kaW5nID0gR2FtbWFFbmNvZGluZzsKKyAgICBleHBvcnRzLlJHQkVFbmNvZGluZyA9IFJH
QkVFbmNvZGluZzsKKyAgICBleHBvcnRzLkxvZ0x1dkVuY29kaW5nID0gTG9nTHV2RW5jb2Rpbmc7
CisgICAgZXhwb3J0cy5SR0JNN0VuY29kaW5nID0gUkdCTTdFbmNvZGluZzsKKyAgICBleHBvcnRz
LlJHQk0xNkVuY29kaW5nID0gUkdCTTE2RW5jb2Rpbmc7CisgICAgZXhwb3J0cy5SR0JERW5jb2Rp
bmcgPSBSR0JERW5jb2Rpbmc7CisgICAgZXhwb3J0cy5CYXNpY0RlcHRoUGFja2luZyA9IEJhc2lj
RGVwdGhQYWNraW5nOworICAgIGV4cG9ydHMuUkdCQURlcHRoUGFja2luZyA9IFJHQkFEZXB0aFBh
Y2tpbmc7CisgICAgZXhwb3J0cy5DdWJlR2VvbWV0cnkgPSBCb3hHZW9tZXRyeTsKKyAgICBleHBv
cnRzLkZhY2U0ID0gRmFjZTQ7CisgICAgZXhwb3J0cy5MaW5lU3RyaXAgPSBMaW5lU3RyaXA7Cisg
ICAgZXhwb3J0cy5MaW5lUGllY2VzID0gTGluZVBpZWNlczsKKyAgICBleHBvcnRzLk1lc2hGYWNl
TWF0ZXJpYWwgPSBNZXNoRmFjZU1hdGVyaWFsOworICAgIGV4cG9ydHMuTXVsdGlNYXRlcmlhbCA9
IE11bHRpTWF0ZXJpYWw7CisgICAgZXhwb3J0cy5Qb2ludENsb3VkID0gUG9pbnRDbG91ZDsKKyAg
ICBleHBvcnRzLlBhcnRpY2xlID0gUGFydGljbGU7CisgICAgZXhwb3J0cy5QYXJ0aWNsZVN5c3Rl
bSA9IFBhcnRpY2xlU3lzdGVtOworICAgIGV4cG9ydHMuUG9pbnRDbG91ZE1hdGVyaWFsID0gUG9p
bnRDbG91ZE1hdGVyaWFsOworICAgIGV4cG9ydHMuUGFydGljbGVCYXNpY01hdGVyaWFsID0gUGFy
dGljbGVCYXNpY01hdGVyaWFsOworICAgIGV4cG9ydHMuUGFydGljbGVTeXN0ZW1NYXRlcmlhbCA9
IFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWw7CisgICAgZXhwb3J0cy5WZXJ0ZXggPSBWZXJ0ZXg7Cisg
ICAgZXhwb3J0cy5EeW5hbWljQnVmZmVyQXR0cmlidXRlID0gRHluYW1pY0J1ZmZlckF0dHJpYnV0
ZTsKKyAgICBleHBvcnRzLkludDhBdHRyaWJ1dGUgPSBJbnQ4QXR0cmlidXRlOworICAgIGV4cG9y
dHMuVWludDhBdHRyaWJ1dGUgPSBVaW50OEF0dHJpYnV0ZTsKKyAgICBleHBvcnRzLlVpbnQ4Q2xh
bXBlZEF0dHJpYnV0ZSA9IFVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZTsKKyAgICBleHBvcnRzLkludDE2
QXR0cmlidXRlID0gSW50MTZBdHRyaWJ1dGU7CisgICAgZXhwb3J0cy5VaW50MTZBdHRyaWJ1dGUg
PSBVaW50MTZBdHRyaWJ1dGU7CisgICAgZXhwb3J0cy5JbnQzMkF0dHJpYnV0ZSA9IEludDMyQXR0
cmlidXRlOworICAgIGV4cG9ydHMuVWludDMyQXR0cmlidXRlID0gVWludDMyQXR0cmlidXRlOwor
ICAgIGV4cG9ydHMuRmxvYXQzMkF0dHJpYnV0ZSA9IEZsb2F0MzJBdHRyaWJ1dGU7CisgICAgZXhw
b3J0cy5GbG9hdDY0QXR0cmlidXRlID0gRmxvYXQ2NEF0dHJpYnV0ZTsKKyAgICBleHBvcnRzLkNs
b3NlZFNwbGluZUN1cnZlMyA9IENsb3NlZFNwbGluZUN1cnZlMzsKKyAgICBleHBvcnRzLlNwbGlu
ZUN1cnZlMyA9IFNwbGluZUN1cnZlMzsKKyAgICBleHBvcnRzLlNwbGluZSA9IFNwbGluZTsKKyAg
ICBleHBvcnRzLkJvdW5kaW5nQm94SGVscGVyID0gQm91bmRpbmdCb3hIZWxwZXI7CisgICAgZXhw
b3J0cy5FZGdlc0hlbHBlciA9IEVkZ2VzSGVscGVyOworICAgIGV4cG9ydHMuV2lyZWZyYW1lSGVs
cGVyID0gV2lyZWZyYW1lSGVscGVyOworICAgIGV4cG9ydHMuWEhSTG9hZGVyID0gWEhSTG9hZGVy
OworICAgIGV4cG9ydHMuQmluYXJ5VGV4dHVyZUxvYWRlciA9IEJpbmFyeVRleHR1cmVMb2FkZXI7
CisgICAgZXhwb3J0cy5HZW9tZXRyeVV0aWxzID0gR2VvbWV0cnlVdGlsczsKKyAgICBleHBvcnRz
LkltYWdlVXRpbHMgPSBJbWFnZVV0aWxzOworICAgIGV4cG9ydHMuUHJvamVjdG9yID0gUHJvamVj
dG9yOworICAgIGV4cG9ydHMuQ2FudmFzUmVuZGVyZXIgPSBDYW52YXNSZW5kZXJlcjsKKworICAg
IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRy
dWUgfSk7CisKK30pKSk7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>