<?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>220098</bug_id>
          
          <creation_ts>2020-12-22 12:30:08 -0800</creation_ts>
          <short_desc>[WinCairo][WebGL2] webgl/2.0.0/conformance2/textures tests are failing</short_desc>
          <delta_ts>2020-12-22 17:04:55 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebGL</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>192314</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Fujii Hironori">fujii</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dino</cc>
    
    <cc>geofflang</cc>
    
    <cc>jdarpinian</cc>
    
    <cc>jonahr</cc>
    
    <cc>kbr</cc>
    
    <cc>kkinnunen</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1716315</commentid>
    <comment_count>0</comment_count>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-12-22 12:30:08 -0800</bug_when>
    <thetext>[WinCairo][WebGL2] webgl/2.0.0/conformance2/textures tests are failing

Since WinCairo enables WebGL2 (Bug 192314).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1716318</commentid>
    <comment_count>1</comment_count>
      <attachid>416680</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-12-22 12:31:58 -0800</bug_when>
    <thetext>Created attachment 416680
simplified tex-2d-rgba16f-rgba-float.html

I created a repro by simplifying tex-2d-rgba16f-rgba-float.html.

1. Start WinCairo MiniBrowser
2. Open tex-2d-rgba16f-rgba-float.html
3. All tests pass
4. Reload
5. The third test fails (Infrequently, both the first and the third tests fail)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1716332</commentid>
    <comment_count>2</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2020-12-22 12:51:35 -0800</bug_when>
    <thetext>CC&apos;ing a few others.

Could you please copy/paste the log from the test? We don&apos;t have a setup for debugging this directly.

Have you run this in the inspector? Which operation exactly does it look like is failing?

Which test configuration exactly is failing? There are several subdirectories of conformance2/textures/ , each of which have tests named tex-2d-rgba16f-rgba-float.html.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1716348</commentid>
    <comment_count>3</comment_count>
      <attachid>416684</attachid>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-12-22 13:21:28 -0800</bug_when>
    <thetext>Created attachment 416684
[Screenshot] WinCairo port

The test expected black for the uninitialized texture area but green in the second load.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1716349</commentid>
    <comment_count>4</comment_count>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-12-22 13:22:22 -0800</bug_when>
    <thetext>(In reply to Kenneth Russell from comment #2)
&gt; CC&apos;ing a few others.

Thank you. This bug causes a lot of test failures, but I don&apos;t think
this bug is so critical. This bug seems that uninitialized texture
areas aren&apos;t black transparent. I&apos;m going to enable WebGL2 for
WinCairo without fixing this bug and skipping the tests.

&gt; Could you please copy/paste the log from the test?

Will do.

&gt; We don&apos;t have a setup for debugging this directly.

I&apos;m going to enable WebGL2 for WinCairo, you will be able to download
WinCairo binaries. You can try it if you have a Windows PC.

https://trac.webkit.org/wiki/BuildingCairoOnWindows#DownloadbuildartifactsfromBuildbot

&gt; Have you run this in the inspector? Which operation exactly does it look
&gt; like is failing?

texSubImage2D[SubSource] and texSubImage3D[SubSource] tests are failing.
texSubImage2D and texSubImage3D don&apos;t work as expected in the SubSource case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1716393</commentid>
    <comment_count>5</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2020-12-22 15:52:39 -0800</bug_when>
    <thetext>It&apos;s actually critical that uninitialized resources like textures be zeroed out by ANGLE. Did you enable the EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE flag in your EGL context creation? See this code and nearby code in Source/WebCore/platform/graphics/cocoa/GraphicsContextGLOpenGLCocoa.mm :

    // WebGL requires that all resources are cleared at creation.
    eglContextAttributes.append(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE);
    eglContextAttributes.append(EGL_TRUE);

Ideally the WinCairo port should pick up all of these EGL initialization parameters.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1716412</commentid>
    <comment_count>6</comment_count>
    <who name="Fujii Hironori">fujii</who>
    <bug_when>2020-12-22 17:04:55 -0800</bug_when>
    <thetext>Bingo! It solves.
I&apos;m going to land the fix together with Bug 192314.
Ideally, GraphicsContextGLOpenGLCocoa.mm should be in C++, and shared among all port.
Anyway, thank you very much.

*** This bug has been marked as a duplicate of bug 192314 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>416680</attachid>
            <date>2020-12-22 12:31:58 -0800</date>
            <delta_ts>2020-12-22 12:31:58 -0800</delta_ts>
            <desc>simplified tex-2d-rgba16f-rgba-float.html</desc>
            <filename>tex-2d-rgba16f-rgba-float.html</filename>
            <type>text/html</type>
            <size>180751</size>
            <attacher name="Fujii Hironori">fujii</attacher>
            
              <data encoding="base64">PCEtLQoKQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KClBlcm1pc3Np
b24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFp
bmluZyBhCmNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0
aW9uIGZpbGVzICh0aGUKIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0
aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCndpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRz
IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKZGlzdHJpYnV0ZSwgc3VibGlj
ZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bwpwZXJtaXQg
cGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3Vi
amVjdCB0bwp0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5v
dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAppbiBhbGwg
Y29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCgpUSEUgTUFU
RVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5E
LApFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdB
UlJBTlRJRVMgT0YKTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgpJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBP
UiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQpDTEFJTSwgREFNQUdFUyBPUiBP
VEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULApUT1JUIE9S
IE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRI
RQpNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxT
LgoKLS0+Cgo8IS0tCgpUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBweS90ZXhfaW1h
Z2VfdGVzdF9nZW5lcmF0b3IucHkKRE8gTk9UIEVESVQhCgotLT4KCgo8IURPQ1RZUEUgaHRtbD4K
PGh0bWw+CjxoZWFkPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICA8c3R5bGU+Ci5wYXNzIHsK
ICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgY29sb3I6IGdyZWVuOwp9Ci5mYWlsIHsKICAgIGZv
bnQtd2VpZ2h0OiBib2xkOwogICAgY29sb3I6IHJlZDsKfQoud2FybiB7CiAgICBmb250LXdlaWdo
dDogYm9sZDsKICAgIGNvbG9yOiB5ZWxsb3c7CiAgICB0ZXh0LXNoYWRvdzogMXB4IDFweCAjZmYw
MDAwCn0KI2NvbnNvbGUgewogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgZm9udC1mYW1p
bHk6IG1vbm9zcGFjZTsKfQogIDwvc3R5bGU+CjxzY3JpcHQ+Ci8qCioqIENvcHlyaWdodCAoYykg
MjAxMiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCioqCioqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdy
YW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCioqIGNvcHkg
b2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0
aGUKKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0
cmljdGlvbiwgaW5jbHVkaW5nCioqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVz
ZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKiogZGlzdHJpYnV0ZSwgc3VibGljZW5z
ZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bwoqKiBwZXJtaXQg
cGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3Vi
amVjdCB0bwoqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CioqCioqIFRoZSBhYm92ZSBjb3B5
cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVk
CioqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFs
cy4KKioKKiogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJS
QU5UWSBPRiBBTlkgS0lORCwKKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5P
VCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCioqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKiogSU4gTk8g
RVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZP
UiBBTlkKKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFO
IEFDVElPTiBPRiBDT05UUkFDVCwKKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwg
T1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKiogTUFURVJJQUxTIE9SIFRIRSBVU0Ug
T1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KKi8KCihmdW5jdGlvbigpIHsKICB2
YXIgdGVzdEhhcm5lc3NJbml0aWFsaXplZCA9IGZhbHNlOwoKICB2YXIgaW5pdE5vbktocm9ub3NG
cmFtZXdvcmsgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0ZXN0SGFybmVzc0luaXRpYWxpemVkKSB7
CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRlc3RIYXJuZXNzSW5pdGlhbGl6ZWQgPSB0cnVlOwoK
ICAgIC8qIC0tIHBsYWZvcm0gc3BlY2lmaWMgY29kZSAtLSAqLwoKICAgIC8vIFdlYktpdCBTcGVj
aWZpYyBjb2RlLiBBZGQgeW91ciBjb2RlIGhlcmUuCiAgICBpZiAod2luZG93LnRlc3RSdW5uZXIg
JiYgIXdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgewogICAgICB3aW5kb3cubGF5b3V0VGVz
dENvbnRyb2xsZXIgPSB3aW5kb3cudGVzdFJ1bm5lcjsKICAgIH0KCiAgICBpZiAod2luZG93Lmxh
eW91dFRlc3RDb250cm9sbGVyKSB7CiAgICAgIHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlci5k
dW1wQXNUZXh0KCk7CiAgICAgIHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlci53YWl0VW50aWxE
b25lKCk7CiAgICB9CiAgICBpZiAod2luZG93LmludGVybmFscykgewogICAgICAvLyBUaGUgV2Vi
S2l0IHRlc3Rpbmcgc3lzdGVtIGNvbXBhcmVzIGNvbnNvbGUgb3V0cHV0LgogICAgICAvLyBCZWNh
dXNlIHRoZSBvdXRwdXQgb2YgdGhlIFdlYkdMIFRlc3RzIGlzIEdQVSBkZXBlbmRlbnQKICAgICAg
Ly8gd2UgdHVybiBvZmYgY29uc29sZSBtZXNzYWdlcy4KICAgICAgd2luZG93LmNvbnNvbGUubG9n
ID0gZnVuY3Rpb24oKSB7IH07CiAgICAgIHdpbmRvdy5jb25zb2xlLmVycm9yID0gZnVuY3Rpb24o
KSB7IH07CiAgICAgIHdpbmRvdy5pbnRlcm5hbHMuc2V0dGluZ3Muc2V0V2ViR0xFcnJvcnNUb0Nv
bnNvbGVFbmFibGVkKGZhbHNlKTsKICAgIH0KCiAgICAvKiAtLSBlbmQgcGxhdGZvcm0gc3BlY2lm
aWMgY29kZSAtLSovCiAgfQoKICB0aGlzLmluaXRUZXN0aW5nSGFybmVzcyA9IGZ1bmN0aW9uKCkg
ewogICAgaW5pdE5vbktocm9ub3NGcmFtZXdvcmsoKTsKICB9Cn0oKSk7Cgp2YXIgZ2V0VXJsT3B0
aW9ucyA9IChmdW5jdGlvbigpIHsKICB2YXIgX3VybE9wdGlvbnNQYXJzZWQgPSBmYWxzZTsKICB2
YXIgX3VybE9wdGlvbnMgPSB7fTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBpZiAoIV91cmxP
cHRpb25zUGFyc2VkKSB7CiAgICAgIHZhciBzID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAg
IHZhciBxID0gcy5pbmRleE9mKCI/Iik7CiAgICAgIHZhciBlID0gcy5pbmRleE9mKCIjIik7CiAg
ICAgIGlmIChlIDwgMCkgewogICAgICAgIGUgPSBzLmxlbmd0aDsKICAgICAgfQogICAgICB2YXIg
cXVlcnkgPSBzLnN1YnN0cmluZyhxICsgMSwgZSk7CiAgICAgIHZhciBwYWlycyA9IHF1ZXJ5LnNw
bGl0KCImIik7CiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBwYWlycy5sZW5ndGg7ICsraWkp
IHsKICAgICAgICB2YXIga2V5VmFsdWUgPSBwYWlyc1tpaV0uc3BsaXQoIj0iKTsKICAgICAgICB2
YXIga2V5ID0ga2V5VmFsdWVbMF07CiAgICAgICAgdmFyIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9u
ZW50KGtleVZhbHVlWzFdKTsKICAgICAgICBfdXJsT3B0aW9uc1trZXldID0gdmFsdWU7CiAgICAg
IH0KICAgICAgX3VybE9wdGlvbnNQYXJzZWQgPSB0cnVlOwogICAgfQoKICAgIHJldHVybiBfdXJs
T3B0aW9uczsKICB9Cn0pKCk7CgppZiAodHlwZW9mIHF1aWV0TW9kZSA9PSAndW5kZWZpbmVkJykg
ewogIHZhciBxdWlldE1vZGUgPSAoZnVuY3Rpb24oKSB7CiAgICB2YXIgX3F1aWV0TW9kZUNoZWNr
ZWQgPSBmYWxzZTsKICAgIHZhciBfaXNRdWlldCA9IGZhbHNlOwogICAgcmV0dXJuIGZ1bmN0aW9u
KCkgewogICAgICBpZiAoIV9xdWlldE1vZGVDaGVja2VkKSB7CiAgICAgICAgX2lzUXVpZXQgPSAo
Z2V0VXJsT3B0aW9ucygpLnF1aWV0ID09IDEpOwogICAgICAgIF9xdWlldE1vZGVDaGVja2VkID0g
dHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gX2lzUXVpZXQ7CiAgICB9CiAgfSkoKTsKfQoKZnVu
Y3Rpb24gbm9uS2hyb25vc0ZyYW1ld29ya05vdGlmeURvbmUoKSB7CiAgLy8gV2ViS2l0IFNwZWNp
ZmljIGNvZGUuIEFkZCB5b3VyIGNvZGUgaGVyZS4KICBpZiAod2luZG93LmxheW91dFRlc3RDb250
cm9sbGVyKSB7CiAgICB3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIubm90aWZ5RG9uZSgpOwog
IH0KfQoKZnVuY3Rpb24gcmVwb3J0VGVzdFJlc3VsdHNUb0hhcm5lc3Moc3VjY2VzcywgbXNnKSB7
CiAgaWYgKHdpbmRvdy5wYXJlbnQud2ViZ2xUZXN0SGFybmVzcykgewogICAgd2luZG93LnBhcmVu
dC53ZWJnbFRlc3RIYXJuZXNzLnJlcG9ydFJlc3VsdHMod2luZG93LmxvY2F0aW9uLnBhdGhuYW1l
LCBzdWNjZXNzLCBtc2cpOwogIH0KfQoKZnVuY3Rpb24gcmVwb3J0U2tpcHBlZFRlc3RSZXN1bHRz
VG9IYXJuZXNzKHN1Y2Nlc3MsIG1zZykgewogIGlmICh3aW5kb3cucGFyZW50LndlYmdsVGVzdEhh
cm5lc3MpIHsKICAgIHdpbmRvdy5wYXJlbnQud2ViZ2xUZXN0SGFybmVzcy5yZXBvcnRSZXN1bHRz
KHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwgc3VjY2VzcywgbXNnLCB0cnVlKTsKICB9Cn0KCmZ1
bmN0aW9uIG5vdGlmeUZpbmlzaGVkVG9IYXJuZXNzKCkgewogIGlmICh3aW5kb3cucGFyZW50Lndl
YmdsVGVzdEhhcm5lc3MpIHsKICAgIHdpbmRvdy5wYXJlbnQud2ViZ2xUZXN0SGFybmVzcy5ub3Rp
ZnlGaW5pc2hlZCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpOwogIH0KICBpZiAod2luZG93Lm5v
bktocm9ub3NGcmFtZXdvcmtOb3RpZnlEb25lKSB7CiAgICB3aW5kb3cubm9uS2hyb25vc0ZyYW1l
d29ya05vdGlmeURvbmUoKTsKICB9Cn0KCnZhciBfYnVmZmVyZWRDb25zb2xlTG9ncyA9IFtdOwoK
ZnVuY3Rpb24gX2J1ZmZlcmVkTG9nVG9Db25zb2xlKG1zZykKewogIGlmIChfYnVmZmVyZWRDb25z
b2xlTG9ncykgewogICAgX2J1ZmZlcmVkQ29uc29sZUxvZ3MucHVzaChtc2cpOwogIH0gZWxzZSBp
ZiAod2luZG93LmNvbnNvbGUpIHsKICAgIHdpbmRvdy5jb25zb2xlLmxvZyhtc2cpOwogIH0KfQoK
Ly8gUHVibGljIGVudHJ5IHBvaW50IGV4cG9zZWQgdG8gbWFueSBvdGhlciBmaWxlcy4KZnVuY3Rp
b24gYnVmZmVyZWRMb2dUb0NvbnNvbGUobXNnKQp7CiAgX2J1ZmZlcmVkTG9nVG9Db25zb2xlKG1z
Zyk7Cn0KCi8vIENhbGxlZCBpbXBsaWNpdGx5IGJ5IHRlc3RGYWlsZWQoKS4KZnVuY3Rpb24gX2Zs
dXNoQnVmZmVyZWRMb2dzVG9Db25zb2xlKCkKewogIGlmIChfYnVmZmVyZWRDb25zb2xlTG9ncykg
ewogICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7CiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBf
YnVmZmVyZWRDb25zb2xlTG9ncy5sZW5ndGg7ICsraWkpIHsKICAgICAgICB3aW5kb3cuY29uc29s
ZS5sb2coX2J1ZmZlcmVkQ29uc29sZUxvZ3NbaWldKTsKICAgICAgfQogICAgfQogICAgX2J1ZmZl
cmVkQ29uc29sZUxvZ3MgPSBudWxsOwogIH0KfQoKdmFyIF9qc1Rlc3RQcmVWZXJib3NlTG9nZ2lu
ZyA9IGZhbHNlOwoKZnVuY3Rpb24gZW5hYmxlSlNUZXN0UHJlVmVyYm9zZUxvZ2dpbmcoKQp7CiAg
ICBfanNUZXN0UHJlVmVyYm9zZUxvZ2dpbmcgPSB0cnVlOwp9CgpmdW5jdGlvbiBkZXNjcmlwdGlv
bihtc2cpCnsKICAgIGluaXRUZXN0aW5nSGFybmVzcygpOwogICAgaWYgKG1zZyA9PT0gdW5kZWZp
bmVkKSB7CiAgICAgIG1zZyA9IGRvY3VtZW50LnRpdGxlOwogICAgfQogICAgLy8gRm9yIE1TSUUg
NiBjb21wYXRpYmlsaXR5CiAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNw
YW4iKTsKICAgIHNwYW4uaW5uZXJIVE1MID0gJzxwPicgKyBtc2cgKyAnPC9wPjxwPk9uIHN1Y2Nl
c3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiPHNwYW4gY2xhc3M9InBhc3MiPlBBU1M8L3Nw
YW4+IiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIjxzcGFuIGNsYXNzPSJwYXNzIj5URVNUIENPTVBM
RVRFPC9zcGFuPiIuPC9wPic7CiAgICB2YXIgZGVzY3JpcHRpb24gPSBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCgiZGVzY3JpcHRpb24iKTsKICAgIGlmIChkZXNjcmlwdGlvbi5maXJzdENoaWxkKQog
ICAgICAgIGRlc2NyaXB0aW9uLnJlcGxhY2VDaGlsZChzcGFuLCBkZXNjcmlwdGlvbi5maXJzdENo
aWxkKTsKICAgIGVsc2UKICAgICAgICBkZXNjcmlwdGlvbi5hcHBlbmRDaGlsZChzcGFuKTsKICAg
IGlmIChfanNUZXN0UHJlVmVyYm9zZUxvZ2dpbmcpIHsKICAgICAgICBfYnVmZmVyZWRMb2dUb0Nv
bnNvbGUobXNnKTsKICAgIH0KfQoKZnVuY3Rpb24gX2FkZFNwYW4oY29udGVudHMpCnsKICAgIHZh
ciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgZG9jdW1lbnQuZ2V0
RWxlbWVudEJ5SWQoImNvbnNvbGUiKS5hcHBlbmRDaGlsZChzcGFuKTsgLy8gaW5zZXJ0IGl0IGZp
cnN0IHNvIFhIVE1MIGtub3dzIHRoZSBuYW1lc3BhY2UKICAgIHNwYW4uaW5uZXJIVE1MID0gY29u
dGVudHMgKyAnPGJyIC8+JzsKfQoKZnVuY3Rpb24gZGVidWcobXNnKQp7CiAgICBpZiAoIXF1aWV0
TW9kZSgpKQogICAgICBfYWRkU3Bhbihtc2cpOwogICAgaWYgKF9qc1Rlc3RQcmVWZXJib3NlTG9n
Z2luZykgewogICAgICAgIF9idWZmZXJlZExvZ1RvQ29uc29sZShtc2cpOwogICAgfQp9CgpmdW5j
dGlvbiBlc2NhcGVIVE1MKHRleHQpCnsKICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoLyYvZywgIiZh
bXA7IikucmVwbGFjZSgvPC9nLCAiJmx0OyIpOwp9Ci8qKgogKiBEZWZpbmVzIHRoZSBleGNlcHRp
b24gdHlwZSBmb3IgYSB0ZXN0IGZhaWx1cmUuCiAqIEBjb25zdHJ1Y3RvcgogKiBAcGFyYW0ge3N0
cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS4KICovCnZhciBUZXN0RmFpbGVkRXhjZXB0
aW9uID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsKICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICAg
dGhpcy5uYW1lID0gIlRlc3RGYWlsZWRFeGNlcHRpb24iOwp9OwoKLyoqCiAqIEBwYXJhbSAge3N0
cmluZz19IG1zZwogKi8KZnVuY3Rpb24gdGVzdFBhc3NlZChtc2cpIHsKICAgIG1zZyA9IG1zZyB8
fCAnUGFzc2VkJzsKICAgIGlmIChfY3VycmVudFRlc3ROYW1lKQogICAgICBtc2cgPSBfY3VycmVu
dFRlc3ROYW1lICsgJzogJyArIG1zZzsKCiAgICByZXBvcnRUZXN0UmVzdWx0c1RvSGFybmVzcyh0
cnVlLCBtc2cpOwoKICAgIGlmICghcXVpZXRNb2RlKCkpCiAgICAgIF9hZGRTcGFuKCc8c3Bhbj48
c3BhbiBjbGFzcz0icGFzcyI+UEFTUzwvc3Bhbj4gJyArIGVzY2FwZUhUTUwobXNnKSArICc8L3Nw
YW4+Jyk7CiAgICBpZiAoX2pzVGVzdFByZVZlcmJvc2VMb2dnaW5nKSB7CiAgICAgICAgX2J1ZmZl
cmVkTG9nVG9Db25zb2xlKCdQQVNTICcgKyBtc2cpOwogICAgfQp9CgovKioKICogQHBhcmFtICB7
c3RyaW5nPX0gbXNnCiAqLwpmdW5jdGlvbiB0ZXN0RmFpbGVkKG1zZykgewogICAgbXNnID0gbXNn
IHx8ICdGYWlsZWQnOwogICAgaWYgKF9jdXJyZW50VGVzdE5hbWUpCiAgICAgIG1zZyA9IF9jdXJy
ZW50VGVzdE5hbWUgKyAnOiAnICsgbXNnOwoKICAgIHJlcG9ydFRlc3RSZXN1bHRzVG9IYXJuZXNz
KGZhbHNlLCBtc2cpOwogICAgX2FkZFNwYW4oJzxzcGFuPjxzcGFuIGNsYXNzPSJmYWlsIj5GQUlM
PC9zcGFuPiAnICsgZXNjYXBlSFRNTChtc2cpICsgJzwvc3Bhbj4nKTsKICAgIF9idWZmZXJlZExv
Z1RvQ29uc29sZSgnRkFJTCAnICsgbXNnKTsKICAgIF9mbHVzaEJ1ZmZlcmVkTG9nc1RvQ29uc29s
ZSgpOwp9Cgp2YXIgX2N1cnJlbnRUZXN0TmFtZTsKCi8qKgogKiBTZXRzIHRoZSBjdXJyZW50IHRl
c3QgbmFtZSBmb3IgdXNhZ2Ugd2l0aGluIHRlc3RQYXNzZWRPcHRpb25zL3Rlc3RGYWlsZWRPcHRp
b25zLgogKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgVGhlIG5hbWUgdG8gc2V0IGFzIHRoZSBjdXJy
ZW50IHRlc3QgbmFtZS4KICovCmZ1bmN0aW9uIHNldEN1cnJlbnRUZXN0TmFtZShuYW1lKQp7CiAg
ICBfY3VycmVudFRlc3ROYW1lID0gbmFtZTsKfQoKLyoqCiAqIEdldHMgdGhlIGN1cnJlbnQgdGVz
dCBuYW1lIGluIHVzZSB3aXRoaW4gdGVzdFBhc3NlZE9wdGlvbnMvdGVzdEZhaWxlZE9wdGlvbnMu
CiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGVzdC4KICovCmZ1
bmN0aW9uIGdldEN1cnJlbnRUZXN0TmFtZSgpCnsKICAgIHJldHVybiBfY3VycmVudFRlc3ROYW1l
Owp9CgovKioKICogVmFyaWF0aW9uIG9mIHRoZSB0ZXN0UGFzc2VkIGZ1bmN0aW9uLCB3aXRoIHRo
ZSBvcHRpb24gdG8gbm90IHNob3cgKGFuZCB0aHVzIG5vdCBjb3VudCkgdGhlIHRlc3QncyBwYXNz
IHJlc3VsdC4KICogQHBhcmFtIHtzdHJpbmd9IG1zZyBUaGUgbWVzc2FnZSB0byBiZSBzaG93biBp
biB0aGUgcGFzcyByZXN1bHQuCiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWRkU3BhbiBJbmRpY2F0ZXMg
d2hldGhlciB0aGUgbWVzc2FnZSB3aWxsIGJlIHZpc2libGUgKHRodXMgY291bnRlZCBpbiB0aGUg
cmVzdWx0cykgb3Igbm90LgogKi8KZnVuY3Rpb24gdGVzdFBhc3NlZE9wdGlvbnMobXNnLCBhZGRT
cGFuKQp7CiAgICBpZiAoYWRkU3BhbiAmJiAhcXVpZXRNb2RlKCkpCiAgICB7CiAgICAgICAgcmVw
b3J0VGVzdFJlc3VsdHNUb0hhcm5lc3ModHJ1ZSwgX2N1cnJlbnRUZXN0TmFtZSArICI6ICIgKyBt
c2cpOwogICAgICAgIF9hZGRTcGFuKCc8c3Bhbj48c3BhbiBjbGFzcz0icGFzcyI+UEFTUzwvc3Bh
bj4gJyArIGVzY2FwZUhUTUwoX2N1cnJlbnRUZXN0TmFtZSkgKyAiOiAiICsgZXNjYXBlSFRNTCht
c2cpICsgJzwvc3Bhbj4nKTsKICAgIH0KICAgIGlmIChfanNUZXN0UHJlVmVyYm9zZUxvZ2dpbmcp
IHsKICAgICAgICBfYnVmZmVyZWRMb2dUb0NvbnNvbGUoJ1BBU1MgJyArIG1zZyk7CiAgICB9Cn0K
Ci8qKgogKiBSZXBvcnQgc2tpcHBlZCB0ZXN0cy4KICogQHBhcmFtIHtzdHJpbmd9IG1zZyBUaGUg
bWVzc2FnZSB0byBiZSBzaG93biBpbiB0aGUgc2tpcCByZXN1bHQuCiAqIEBwYXJhbSB7Ym9vbGVh
bn0gYWRkU3BhbiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVzc2FnZSB3aWxsIGJlIHZpc2libGUg
KHRodXMgY291bnRlZCBpbiB0aGUgcmVzdWx0cykgb3Igbm90LgogKi8KZnVuY3Rpb24gdGVzdFNr
aXBwZWRPcHRpb25zKG1zZywgYWRkU3BhbikKewogICAgaWYgKGFkZFNwYW4gJiYgIXF1aWV0TW9k
ZSgpKQogICAgewogICAgICAgIHJlcG9ydFNraXBwZWRUZXN0UmVzdWx0c1RvSGFybmVzcyh0cnVl
LCBfY3VycmVudFRlc3ROYW1lICsgIjogIiArIG1zZyk7CiAgICAgICAgX2FkZFNwYW4oJzxzcGFu
PjxzcGFuIGNsYXNzPSJ3YXJuIj5TS0lQPC9zcGFuPiAnICsgZXNjYXBlSFRNTChfY3VycmVudFRl
c3ROYW1lKSArICI6ICIgKyBlc2NhcGVIVE1MKG1zZykgKyAnPC9zcGFuPicpOwogICAgfQogICAg
aWYgKF9qc1Rlc3RQcmVWZXJib3NlTG9nZ2luZykgewogICAgICAgIF9idWZmZXJlZExvZ1RvQ29u
c29sZSgnU0tJUCcgKyBtc2cpOwogICAgfQp9CgovKioKICogVmFyaWF0aW9uIG9mIHRoZSB0ZXN0
RmFpbGVkIGZ1bmN0aW9uLCB3aXRoIHRoZSBvcHRpb24gdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9y
IG5vdC4KICogQHBhcmFtIHtzdHJpbmd9IG1zZyBUaGUgbWVzc2FnZSB0byBiZSBzaG93biBpbiB0
aGUgZmFpbCByZXN1bHQuCiAqIEBwYXJhbSB7Ym9vbGVhbn0gZXh0aHJvdyBJbmRpY2F0ZXMgd2hl
dGhlciB0aGUgZnVuY3Rpb24gd2lsbCB0aHJvdyBhIFRlc3RGYWlsZWRFeGNlcHRpb24gb3Igbm90
LgogKi8KZnVuY3Rpb24gdGVzdEZhaWxlZE9wdGlvbnMobXNnLCBleHRocm93KQp7CiAgICByZXBv
cnRUZXN0UmVzdWx0c1RvSGFybmVzcyhmYWxzZSwgX2N1cnJlbnRUZXN0TmFtZSArICI6ICIgKyBt
c2cpOwogICAgX2FkZFNwYW4oJzxzcGFuPjxzcGFuIGNsYXNzPSJmYWlsIj5GQUlMPC9zcGFuPiAn
ICsgZXNjYXBlSFRNTChfY3VycmVudFRlc3ROYW1lKSArICI6ICIgKyBlc2NhcGVIVE1MKG1zZykg
KyAnPC9zcGFuPicpOwogICAgX2J1ZmZlcmVkTG9nVG9Db25zb2xlKCdGQUlMICcgKyBtc2cpOwog
ICAgX2ZsdXNoQnVmZmVyZWRMb2dzVG9Db25zb2xlKCk7CiAgICBpZiAoZXh0aHJvdykgewogICAg
ICAgIF9jdXJyZW50VGVzdE5hbWUgPSAiIjsgLy9SZW1lbWJlcmluZyB0byBzZXQgdGhlIG5hbWUg
b2YgY3VycmVudCB0ZXN0Y2FzZSB0byBlbXB0eSBzdHJpbmcuCiAgICAgICAgdGhyb3cgbmV3IFRl
c3RGYWlsZWRFeGNlcHRpb24obXNnKTsKICAgIH0KfQoKZnVuY3Rpb24gYXJlQXJyYXlzRXF1YWwo
X2EsIF9iKQp7CiAgICB0cnkgewogICAgICAgIGlmIChfYS5sZW5ndGggIT09IF9iLmxlbmd0aCkK
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2Eu
bGVuZ3RoOyBpKyspCiAgICAgICAgICAgIGlmIChfYVtpXSAhPT0gX2JbaV0pCiAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGNhdGNoIChleCkgewogICAgICAgIHJldHVybiBmYWxz
ZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBpc01pbnVzWmVybyhuKQp7CiAg
ICAvLyB0aGUgb25seSB3YXkgdG8gdGVsbCAwIGZyb20gLTAgaW4gSlMgaXMgdGhlIGZhY3QgdGhh
dCAxLy0wIGlzCiAgICAvLyAtSW5maW5pdHkgaW5zdGVhZCBvZiBJbmZpbml0eQogICAgcmV0dXJu
IG4gPT09IDAgJiYgMS9uIDwgMDsKfQoKZnVuY3Rpb24gaXNSZXN1bHRDb3JyZWN0KF9hY3R1YWws
IF9leHBlY3RlZCkKewogICAgaWYgKF9leHBlY3RlZCA9PT0gMCkKICAgICAgICByZXR1cm4gX2Fj
dHVhbCA9PT0gX2V4cGVjdGVkICYmICgxL19hY3R1YWwpID09PSAoMS9fZXhwZWN0ZWQpOwogICAg
aWYgKF9hY3R1YWwgPT09IF9leHBlY3RlZCkKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIGlmICh0
eXBlb2YoX2V4cGVjdGVkKSA9PSAibnVtYmVyIiAmJiBpc05hTihfZXhwZWN0ZWQpKQogICAgICAg
IHJldHVybiB0eXBlb2YoX2FjdHVhbCkgPT0gIm51bWJlciIgJiYgaXNOYU4oX2FjdHVhbCk7CiAg
ICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKF9leHBlY3RlZCkgPT0gT2JqZWN0
LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFtdKSkKICAgICAgICByZXR1cm4gYXJlQXJyYXlzRXF1
YWwoX2FjdHVhbCwgX2V4cGVjdGVkKTsKICAgIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gc3Ry
aW5naWZ5KHYpCnsKICAgIGlmICh2ID09PSAwICYmIDEvdiA8IDApCiAgICAgICAgcmV0dXJuICIt
MCI7CiAgICBlbHNlIHJldHVybiAiIiArIHY7Cn0KCmZ1bmN0aW9uIGV2YWxBbmRMb2coX2EpCnsK
ICBpZiAodHlwZW9mIF9hICE9ICJzdHJpbmciKQogICAgZGVidWcoIldBUk46IHRyeUFuZExvZygp
IGV4cGVjdHMgYSBzdHJpbmcgYXJndW1lbnQiKTsKCiAgLy8gTG9nIGZpcnN0IGluIGNhc2UgdGhp
bmdzIGdvIGhvcnJpYmx5IHdyb25nIG9yIHRoaXMgY2F1c2VzIGEgc3luYyBldmVudC4KICBkZWJ1
ZyhfYSk7CgogIHZhciBfYXY7CiAgdHJ5IHsKICAgICBfYXYgPSBldmFsKF9hKTsKICB9IGNhdGNo
IChlKSB7CiAgICB0ZXN0RmFpbGVkKF9hICsgIiB0aHJldyBleGNlcHRpb24gIiArIGUpOwogIH0K
ICByZXR1cm4gX2F2Owp9CgpmdW5jdGlvbiBzaG91bGRCZShfYSwgX2IsIHF1aWV0KQp7CiAgICBp
ZiAodHlwZW9mIF9hICE9ICJzdHJpbmciIHx8IHR5cGVvZiBfYiAhPSAic3RyaW5nIikKICAgICAg
ICBkZWJ1ZygiV0FSTjogc2hvdWxkQmUoKSBleHBlY3RzIHN0cmluZyBhcmd1bWVudHMiKTsKICAg
IHZhciBleGNlcHRpb247CiAgICB2YXIgX2F2OwogICAgdHJ5IHsKICAgICAgICBfYXYgPSBldmFs
KF9hKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBleGNlcHRpb24gPSBlOwogICAgfQogICAg
dmFyIF9idiA9IGV2YWwoX2IpOwoKICAgIGlmIChleGNlcHRpb24pCiAgICAgICAgdGVzdEZhaWxl
ZChfYSArICIgc2hvdWxkIGJlICIgKyBfYnYgKyAiLiBUaHJldyBleGNlcHRpb24gIiArIGV4Y2Vw
dGlvbik7CiAgICBlbHNlIGlmIChpc1Jlc3VsdENvcnJlY3QoX2F2LCBfYnYpKSB7CiAgICAgICAg
aWYgKCFxdWlldCkgewogICAgICAgICAgICB0ZXN0UGFzc2VkKF9hICsgIiBpcyAiICsgX2IpOwog
ICAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZW9mKF9hdikgPT0gdHlwZW9mKF9idikpCiAgICAg
ICAgdGVzdEZhaWxlZChfYSArICIgc2hvdWxkIGJlICIgKyBfYnYgKyAiLiBXYXMgIiArIHN0cmlu
Z2lmeShfYXYpICsgIi4iKTsKICAgIGVsc2UKICAgICAgICB0ZXN0RmFpbGVkKF9hICsgIiBzaG91
bGQgYmUgIiArIF9idiArICIgKG9mIHR5cGUgIiArIHR5cGVvZiBfYnYgKyAiKS4gV2FzICIgKyBf
YXYgKyAiIChvZiB0eXBlICIgKyB0eXBlb2YgX2F2ICsgIikuIik7Cn0KCmZ1bmN0aW9uIHNob3Vs
ZE5vdEJlKF9hLCBfYiwgcXVpZXQpCnsKICAgIGlmICh0eXBlb2YgX2EgIT0gInN0cmluZyIgfHwg
dHlwZW9mIF9iICE9ICJzdHJpbmciKQogICAgICAgIGRlYnVnKCJXQVJOOiBzaG91bGROb3RCZSgp
IGV4cGVjdHMgc3RyaW5nIGFyZ3VtZW50cyIpOwogICAgdmFyIGV4Y2VwdGlvbjsKICAgIHZhciBf
YXY7CiAgICB0cnkgewogICAgICAgIF9hdiA9IGV2YWwoX2EpOwogICAgfSBjYXRjaCAoZSkgewog
ICAgICAgIGV4Y2VwdGlvbiA9IGU7CiAgICB9CiAgICB2YXIgX2J2ID0gZXZhbChfYik7CgogICAg
aWYgKGV4Y2VwdGlvbikKICAgICAgICB0ZXN0RmFpbGVkKF9hICsgIiBzaG91bGQgbm90IGJlICIg
KyBfYnYgKyAiLiBUaHJldyBleGNlcHRpb24gIiArIGV4Y2VwdGlvbik7CiAgICBlbHNlIGlmICgh
aXNSZXN1bHRDb3JyZWN0KF9hdiwgX2J2KSkgewogICAgICAgIGlmICghcXVpZXQpIHsKICAgICAg
ICAgICAgdGVzdFBhc3NlZChfYSArICIgaXMgbm90ICIgKyBfYik7CiAgICAgICAgfQogICAgfSBl
bHNlCiAgICAgICAgdGVzdEZhaWxlZChfYSArICIgc2hvdWxkIG5vdCBiZSAiICsgX2J2ICsgIi4i
KTsKfQoKZnVuY3Rpb24gc2hvdWxkQmVUcnVlKF9hKSB7IHNob3VsZEJlKF9hLCAidHJ1ZSIpOyB9
CmZ1bmN0aW9uIHNob3VsZEJlRmFsc2UoX2EpIHsgc2hvdWxkQmUoX2EsICJmYWxzZSIpOyB9CmZ1
bmN0aW9uIHNob3VsZEJlTmFOKF9hKSB7IHNob3VsZEJlKF9hLCAiTmFOIik7IH0KZnVuY3Rpb24g
c2hvdWxkQmVOdWxsKF9hKSB7IHNob3VsZEJlKF9hLCAibnVsbCIpOyB9CgpmdW5jdGlvbiBzaG91
bGRCZUVxdWFsVG9TdHJpbmcoYSwgYikKewogIHZhciB1bmV2YWxlZFN0cmluZyA9ICciJyArIGIu
cmVwbGFjZSgvIi9nLCAiXCIiKSArICciJzsKICBzaG91bGRCZShhLCB1bmV2YWxlZFN0cmluZyk7
Cn0KCmZ1bmN0aW9uIHNob3VsZEV2YWx1YXRlVG8oYWN0dWFsLCBleHBlY3RlZCkgewogIC8vIEEg
Z2VuZXJhbC1wdXJwb3NlIGNvbXBhcmF0b3IuICAnYWN0dWFsJyBzaG91bGQgYmUgYSBzdHJpbmcg
dG8gYmUKICAvLyBldmFsdWF0ZWQsIGFzIGZvciBzaG91bGRCZSgpLiAnZXhwZWN0ZWQnIG1heSBi
ZSBhbnkgdHlwZSBhbmQgd2lsbCBiZQogIC8vIHVzZWQgd2l0aG91dCBiZWluZyBldmFsJ2VkLgog
IGlmIChleHBlY3RlZCA9PSBudWxsKSB7CiAgICAvLyBEbyB0aGlzIGJlZm9yZSB0aGUgb2JqZWN0
IHRlc3QsIHNpbmNlIG51bGwgaXMgb2YgdHlwZSAnb2JqZWN0Jy4KICAgIHNob3VsZEJlTnVsbChh
Y3R1YWwpOwogIH0gZWxzZSBpZiAodHlwZW9mIGV4cGVjdGVkID09ICJ1bmRlZmluZWQiKSB7CiAg
ICBzaG91bGRCZVVuZGVmaW5lZChhY3R1YWwpOwogIH0gZWxzZSBpZiAodHlwZW9mIGV4cGVjdGVk
ID09ICJmdW5jdGlvbiIpIHsKICAgIC8vIEFsbCB0aGlzIGZ1c3MgaXMgdG8gYXZvaWQgdGhlIHN0
cmluZy1hcmcgd2FybmluZyBmcm9tIHNob3VsZEJlKCkuCiAgICB0cnkgewogICAgICB2YXIgYWN0
dWFsVmFsdWUgPSBldmFsKGFjdHVhbCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHRlc3RGYWls
ZWQoIkV2YWx1YXRpbmcgIiArIGFjdHVhbCArICI6IFRocmV3IGV4Y2VwdGlvbiAiICsgZSk7CiAg
ICAgIHJldHVybjsKICAgIH0KICAgIHNob3VsZEJlKCInIiArIGFjdHVhbFZhbHVlLnRvU3RyaW5n
KCkucmVwbGFjZSgvXG4vZywgIiIpICsgIiciLAogICAgICAgICAgICAgIiciICsgZXhwZWN0ZWQu
dG9TdHJpbmcoKS5yZXBsYWNlKC9cbi9nLCAiIikgKyAiJyIpOwogIH0gZWxzZSBpZiAodHlwZW9m
IGV4cGVjdGVkID09ICJvYmplY3QiKSB7CiAgICBzaG91bGRCZVRydWUoYWN0dWFsICsgIiA9PSAn
IiArIGV4cGVjdGVkICsgIiciKTsKICB9IGVsc2UgaWYgKHR5cGVvZiBleHBlY3RlZCA9PSAic3Ry
aW5nIikgewogICAgc2hvdWxkQmUoYWN0dWFsLCBleHBlY3RlZCk7CiAgfSBlbHNlIGlmICh0eXBl
b2YgZXhwZWN0ZWQgPT0gImJvb2xlYW4iKSB7CiAgICBzaG91bGRCZSgidHlwZW9mICIgKyBhY3R1
YWwsICInYm9vbGVhbiciKTsKICAgIGlmIChleHBlY3RlZCkKICAgICAgc2hvdWxkQmVUcnVlKGFj
dHVhbCk7CiAgICBlbHNlCiAgICAgIHNob3VsZEJlRmFsc2UoYWN0dWFsKTsKICB9IGVsc2UgaWYg
KHR5cGVvZiBleHBlY3RlZCA9PSAibnVtYmVyIikgewogICAgc2hvdWxkQmUoYWN0dWFsLCBzdHJp
bmdpZnkoZXhwZWN0ZWQpKTsKICB9IGVsc2UgewogICAgZGVidWcoZXhwZWN0ZWQgKyAiIGlzIHVu
a25vd24gdHlwZSAiICsgdHlwZW9mIGV4cGVjdGVkKTsKICAgIHNob3VsZEJlVHJ1ZShhY3R1YWws
ICInIiAgK2V4cGVjdGVkLnRvU3RyaW5nKCkgKyAiJyIpOwogIH0KfQoKZnVuY3Rpb24gc2hvdWxk
QmVOb25aZXJvKF9hKQp7CiAgdmFyIGV4Y2VwdGlvbjsKICB2YXIgX2F2OwogIHRyeSB7CiAgICAg
X2F2ID0gZXZhbChfYSk7CiAgfSBjYXRjaCAoZSkgewogICAgIGV4Y2VwdGlvbiA9IGU7CiAgfQoK
ICBpZiAoZXhjZXB0aW9uKQogICAgdGVzdEZhaWxlZChfYSArICIgc2hvdWxkIGJlIG5vbi16ZXJv
LiBUaHJldyBleGNlcHRpb24gIiArIGV4Y2VwdGlvbik7CiAgZWxzZSBpZiAoX2F2ICE9IDApCiAg
ICB0ZXN0UGFzc2VkKF9hICsgIiBpcyBub24temVyby4iKTsKICBlbHNlCiAgICB0ZXN0RmFpbGVk
KF9hICsgIiBzaG91bGQgYmUgbm9uLXplcm8uIFdhcyAiICsgX2F2KTsKfQoKZnVuY3Rpb24gc2hv
dWxkQmVOb25OdWxsKF9hKQp7CiAgdmFyIGV4Y2VwdGlvbjsKICB2YXIgX2F2OwogIHRyeSB7CiAg
ICAgX2F2ID0gZXZhbChfYSk7CiAgfSBjYXRjaCAoZSkgewogICAgIGV4Y2VwdGlvbiA9IGU7CiAg
fQoKICBpZiAoZXhjZXB0aW9uKQogICAgdGVzdEZhaWxlZChfYSArICIgc2hvdWxkIGJlIG5vbi1u
dWxsLiBUaHJldyBleGNlcHRpb24gIiArIGV4Y2VwdGlvbik7CiAgZWxzZSBpZiAoX2F2ICE9IG51
bGwpCiAgICB0ZXN0UGFzc2VkKF9hICsgIiBpcyBub24tbnVsbC4iKTsKICBlbHNlCiAgICB0ZXN0
RmFpbGVkKF9hICsgIiBzaG91bGQgYmUgbm9uLW51bGwuIFdhcyAiICsgX2F2KTsKfQoKZnVuY3Rp
b24gc2hvdWxkQmVVbmRlZmluZWQoX2EpCnsKICB2YXIgZXhjZXB0aW9uOwogIHZhciBfYXY7CiAg
dHJ5IHsKICAgICBfYXYgPSBldmFsKF9hKTsKICB9IGNhdGNoIChlKSB7CiAgICAgZXhjZXB0aW9u
ID0gZTsKICB9CgogIGlmIChleGNlcHRpb24pCiAgICB0ZXN0RmFpbGVkKF9hICsgIiBzaG91bGQg
YmUgdW5kZWZpbmVkLiBUaHJldyBleGNlcHRpb24gIiArIGV4Y2VwdGlvbik7CiAgZWxzZSBpZiAo
dHlwZW9mIF9hdiA9PSAidW5kZWZpbmVkIikKICAgIHRlc3RQYXNzZWQoX2EgKyAiIGlzIHVuZGVm
aW5lZC4iKTsKICBlbHNlCiAgICB0ZXN0RmFpbGVkKF9hICsgIiBzaG91bGQgYmUgdW5kZWZpbmVk
LiBXYXMgIiArIF9hdik7Cn0KCmZ1bmN0aW9uIHNob3VsZEJlRGVmaW5lZChfYSkKewogIHZhciBl
eGNlcHRpb247CiAgdmFyIF9hdjsKICB0cnkgewogICAgIF9hdiA9IGV2YWwoX2EpOwogIH0gY2F0
Y2ggKGUpIHsKICAgICBleGNlcHRpb24gPSBlOwogIH0KCiAgaWYgKGV4Y2VwdGlvbikKICAgIHRl
c3RGYWlsZWQoX2EgKyAiIHNob3VsZCBiZSBkZWZpbmVkLiBUaHJldyBleGNlcHRpb24gIiArIGV4
Y2VwdGlvbik7CiAgZWxzZSBpZiAoX2F2ICE9PSB1bmRlZmluZWQpCiAgICB0ZXN0UGFzc2VkKF9h
ICsgIiBpcyBkZWZpbmVkLiIpOwogIGVsc2UKICAgIHRlc3RGYWlsZWQoX2EgKyAiIHNob3VsZCBi
ZSBkZWZpbmVkLiBXYXMgIiArIF9hdik7Cn0KCmZ1bmN0aW9uIHNob3VsZEJlTGVzc1RoYW5PckVx
dWFsKF9hLCBfYikgewogICAgaWYgKHR5cGVvZiBfYSAhPSAic3RyaW5nIiB8fCB0eXBlb2YgX2Ig
IT0gInN0cmluZyIpCiAgICAgICAgZGVidWcoIldBUk46IHNob3VsZEJlTGVzc1RoYW5PckVxdWFs
IGV4cGVjdHMgc3RyaW5nIGFyZ3VtZW50cyIpOwoKICAgIHZhciBleGNlcHRpb247CiAgICB2YXIg
X2F2OwogICAgdHJ5IHsKICAgICAgICBfYXYgPSBldmFsKF9hKTsKICAgIH0gY2F0Y2ggKGUpIHsK
ICAgICAgICBleGNlcHRpb24gPSBlOwogICAgfQogICAgdmFyIF9idiA9IGV2YWwoX2IpOwoKICAg
IGlmIChleGNlcHRpb24pCiAgICAgICAgdGVzdEZhaWxlZChfYSArICIgc2hvdWxkIGJlIDw9ICIg
KyBfYiArICIuIFRocmV3IGV4Y2VwdGlvbiAiICsgZXhjZXB0aW9uKTsKICAgIGVsc2UgaWYgKHR5
cGVvZiBfYXYgPT0gInVuZGVmaW5lZCIgfHwgX2F2ID4gX2J2KQogICAgICAgIHRlc3RGYWlsZWQo
X2EgKyAiIHNob3VsZCBiZSA+PSAiICsgX2IgKyAiLiBXYXMgIiArIF9hdiArICIgKG9mIHR5cGUg
IiArIHR5cGVvZiBfYXYgKyAiKS4iKTsKICAgIGVsc2UKICAgICAgICB0ZXN0UGFzc2VkKF9hICsg
IiBpcyA8PSAiICsgX2IpOwp9CgpmdW5jdGlvbiBzaG91bGRCZUdyZWF0ZXJUaGFuT3JFcXVhbChf
YSwgX2IpIHsKICAgIGlmICh0eXBlb2YgX2EgIT0gInN0cmluZyIgfHwgdHlwZW9mIF9iICE9ICJz
dHJpbmciKQogICAgICAgIGRlYnVnKCJXQVJOOiBzaG91bGRCZUdyZWF0ZXJUaGFuT3JFcXVhbCBl
eHBlY3RzIHN0cmluZyBhcmd1bWVudHMiKTsKCiAgICB2YXIgZXhjZXB0aW9uOwogICAgdmFyIF9h
djsKICAgIHRyeSB7CiAgICAgICAgX2F2ID0gZXZhbChfYSk7CiAgICB9IGNhdGNoIChlKSB7CiAg
ICAgICAgZXhjZXB0aW9uID0gZTsKICAgIH0KICAgIHZhciBfYnYgPSBldmFsKF9iKTsKCiAgICBp
ZiAoZXhjZXB0aW9uKQogICAgICAgIHRlc3RGYWlsZWQoX2EgKyAiIHNob3VsZCBiZSA+PSAiICsg
X2IgKyAiLiBUaHJldyBleGNlcHRpb24gIiArIGV4Y2VwdGlvbik7CiAgICBlbHNlIGlmICh0eXBl
b2YgX2F2ID09ICJ1bmRlZmluZWQiIHx8IF9hdiA8IF9idikKICAgICAgICB0ZXN0RmFpbGVkKF9h
ICsgIiBzaG91bGQgYmUgPj0gIiArIF9iICsgIi4gV2FzICIgKyBfYXYgKyAiIChvZiB0eXBlICIg
KyB0eXBlb2YgX2F2ICsgIikuIik7CiAgICBlbHNlCiAgICAgICAgdGVzdFBhc3NlZChfYSArICIg
aXMgPj0gIiArIF9iKTsKfQoKZnVuY3Rpb24gZXhwZWN0VHJ1ZSh2LCBtc2cpIHsKICBpZiAodikg
ewogICAgdGVzdFBhc3NlZChtc2cpOwogIH0gZWxzZSB7CiAgICB0ZXN0RmFpbGVkKG1zZyk7CiAg
fQp9CgpmdW5jdGlvbiBzaG91bGRUaHJvdyhfYSwgX2UpCnsKICB2YXIgZXhjZXB0aW9uOwogIHZh
ciBfYXY7CiAgdHJ5IHsKICAgICBfYXYgPSBldmFsKF9hKTsKICB9IGNhdGNoIChlKSB7CiAgICAg
ZXhjZXB0aW9uID0gZTsKICB9CgogIHZhciBfZXY7CiAgaWYgKF9lKQogICAgICBfZXYgPSAgZXZh
bChfZSk7CgogIGlmIChleGNlcHRpb24pIHsKICAgIGlmICh0eXBlb2YgX2UgPT0gInVuZGVmaW5l
ZCIgfHwgZXhjZXB0aW9uID09IF9ldikKICAgICAgdGVzdFBhc3NlZChfYSArICIgdGhyZXcgZXhj
ZXB0aW9uICIgKyBleGNlcHRpb24gKyAiLiIpOwogICAgZWxzZQogICAgICB0ZXN0RmFpbGVkKF9h
ICsgIiBzaG91bGQgdGhyb3cgIiArICh0eXBlb2YgX2UgPT0gInVuZGVmaW5lZCIgPyAiYW4gZXhj
ZXB0aW9uIiA6IF9ldikgKyAiLiBUaHJldyBleGNlcHRpb24gIiArIGV4Y2VwdGlvbiArICIuIik7
CiAgfSBlbHNlIGlmICh0eXBlb2YgX2F2ID09ICJ1bmRlZmluZWQiKQogICAgdGVzdEZhaWxlZChf
YSArICIgc2hvdWxkIHRocm93ICIgKyAodHlwZW9mIF9lID09ICJ1bmRlZmluZWQiID8gImFuIGV4
Y2VwdGlvbiIgOiBfZXYpICsgIi4gV2FzIHVuZGVmaW5lZC4iKTsKICBlbHNlCiAgICB0ZXN0RmFp
bGVkKF9hICsgIiBzaG91bGQgdGhyb3cgIiArICh0eXBlb2YgX2UgPT0gInVuZGVmaW5lZCIgPyAi
YW4gZXhjZXB0aW9uIiA6IF9ldikgKyAiLiBXYXMgIiArIF9hdiArICIuIik7Cn0KCmZ1bmN0aW9u
IHNob3VsZEJlVHlwZShfYSwgX3R5cGUpIHsKICAgIHZhciBleGNlcHRpb247CiAgICB2YXIgX2F2
OwogICAgdHJ5IHsKICAgICAgICBfYXYgPSBldmFsKF9hKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAg
ICAgICBleGNlcHRpb24gPSBlOwogICAgfQoKICAgIHZhciBfdHlwZXYgPSBldmFsKF90eXBlKTsK
CiAgICBpZihfdHlwZXYgPT09IE51bWJlcil7CiAgICAgICAgaWYoX2F2IGluc3RhbmNlb2YgTnVt
YmVyKXsKICAgICAgICAgICAgdGVzdFBhc3NlZChfYSArICIgaXMgYW4gaW5zdGFuY2Ugb2YgTnVt
YmVyIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYodHlwZW9mKF9hdikgPT09ICdudW1iZXIn
KXsKICAgICAgICAgICAgdGVzdFBhc3NlZChfYSArICIgaXMgYW4gaW5zdGFuY2Ugb2YgTnVtYmVy
Iik7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIHRlc3RGYWlsZWQoX2EgKyAi
IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBOdW1iZXIiKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNl
IGlmIChfYXYgaW5zdGFuY2VvZiBfdHlwZXYpIHsKICAgICAgICB0ZXN0UGFzc2VkKF9hICsgIiBp
cyBhbiBpbnN0YW5jZSBvZiAiICsgX3R5cGUpOwogICAgfSBlbHNlIHsKICAgICAgICB0ZXN0RmFp
bGVkKF9hICsgIiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgIiArIF90eXBlKTsKICAgIH0KfQoKLyoq
CiAqIFNob3dzIGEgbWVzc2FnZSBpbiBjYXNlIGV4cHJlc3Npb24gdGVzdCBmYWlscy4KICogQHBh
cmFtIHtib29sZWFufSBleHAKICogQHBhcmFtIHtzdHJhaW5nfSBtZXNzYWdlCiAqLwpmdW5jdGlv
biBjaGVja01lc3NhZ2UoZXhwLCBtZXNzYWdlKSB7CiAgICBpZiAoICFleHAgKQogICAgICAgIF9h
ZGRTcGFuKCc8c3Bhbj48c3BhbiBjbGFzcz0id2FybiI+V0FSTklORzwvc3Bhbj4gJyArIGVzY2Fw
ZUhUTUwoX2N1cnJlbnRUZXN0TmFtZSkgKyAiOiAiICsgZXNjYXBlSFRNTChtZXNzYWdlKSArICc8
L3NwYW4+Jyk7Cn0KCmZ1bmN0aW9uIGFzc2VydE1zZyhhc3NlcnRpb24sIG1zZykgewogICAgaWYg
KGFzc2VydGlvbikgewogICAgICAgIHRlc3RQYXNzZWQobXNnKTsKICAgIH0gZWxzZSB7CiAgICAg
ICAgdGVzdEZhaWxlZChtc2cpOwogICAgfQp9CgovKioKICogVmFyaWF0aW9uIG9mIHRoZSBhc3Nl
cnRNc2cgZnVuY3Rpb24sIHdpdGggdGhlIG9wdGlvbiB0byBub3Qgc2hvdyAoYW5kIHRodXMgbm90
IGNvdW50KSB0aGUgdGVzdCdzIHBhc3MgcmVzdWx0LAogKiBhbmQgdGhyb3cgb3Igbm90IGEgVGVz
dEZhaWxlZEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGZhaWx1cmUuCiAqIEBwYXJhbSB7Ym9vbGVhbn0g
YXNzZXJ0aW9uIElmIHRoaXMgaXMgdHJ1ZSwgbWVhbnMgc3VjY2VzcywgZWxzZSBmYWlsdXJlLgog
KiBAcGFyYW0gez9zdHJpbmd9IG1zZyBUaGUgbWVzc2FnZSB0byBiZSBzaG93biBpbiB0aGUgcmVz
dWx0LgogKiBAcGFyYW0ge2Jvb2xlYW59IHZlcmJvc2UgSW4gY2FzZSBvZiBzdWNjZXNzLCBkZXRl
cm1pbmVzIGlmIHRoZSB0ZXN0IHdpbGwgc2hvdyBpdCdzIHJlc3VsdCBhbmQgY291bnQgaW4gdGhl
IHJlc3VsdHMuCiAqIEBwYXJhbSB7Ym9vbGVhbn0gZXh0aHJvdyBJbiBjYXNlIG9mIGZhaWx1cmUs
IGRldGVybWluZXMgaWYgdGhlIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYSBUZXN0RmFpbGVkRXhjZXB0
aW9uLgogKi8KZnVuY3Rpb24gYXNzZXJ0TXNnT3B0aW9ucyhhc3NlcnRpb24sIG1zZywgdmVyYm9z
ZSwgZXh0aHJvdykgewogICAgaWYgKGFzc2VydGlvbikgewogICAgICAgIHRlc3RQYXNzZWRPcHRp
b25zKG1zZywgdmVyYm9zZSk7CiAgICB9IGVsc2UgewogICAgICAgIHRlc3RGYWlsZWRPcHRpb25z
KG1zZywgZXh0aHJvdyk7CiAgICB9Cn0KCgpmdW5jdGlvbiB3ZWJnbEhhcm5lc3NDb2xsZWN0R2Fy
YmFnZSgpIHsKICAgIGlmICh3aW5kb3cuR0NDb250cm9sbGVyKSB7CiAgICAgICAgd2luZG93LkdD
Q29udHJvbGxlci5jb2xsZWN0KCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh3aW5k
b3cub3BlcmEgJiYgd2luZG93Lm9wZXJhLmNvbGxlY3QpIHsKICAgICAgICB3aW5kb3cub3BlcmEu
Y29sbGVjdCgpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB0cnkgewogICAgICAgIHdpbmRv
dy5RdWVyeUludGVyZmFjZShDb21wb25lbnRzLmludGVyZmFjZXMubnNJSW50ZXJmYWNlUmVxdWVz
dG9yKQogICAgICAgICAgICAgIC5nZXRJbnRlcmZhY2UoQ29tcG9uZW50cy5pbnRlcmZhY2VzLm5z
SURPTVdpbmRvd1V0aWxzKQogICAgICAgICAgICAgIC5nYXJiYWdlQ29sbGVjdCgpOwogICAgICAg
IHJldHVybjsKICAgIH0gY2F0Y2goZSkge30KCiAgICBpZiAod2luZG93LmdjKSB7CiAgICAgICAg
d2luZG93LmdjKCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh3aW5kb3cuQ29sbGVj
dEdhcmJhZ2UpIHsKICAgICAgICBDb2xsZWN0R2FyYmFnZSgpOwogICAgICAgIHJldHVybjsKICAg
IH0KCiAgICAvLyBXZWJLaXQncyBNaW5pQnJvd3NlcgogICAgaWYgKHdpbmRvdy4kdm0pIHsKICAg
ICAgICB3aW5kb3cuJHZtLmdjKCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZ1bmN0aW9u
IGdjUmVjKG4pIHsKICAgICAgICBpZiAobiA8IDEpCiAgICAgICAgICAgIHJldHVybiB7fTsKICAg
ICAgICB2YXIgdGVtcCA9IHtpOiAiYWIiICsgaSArIChpIC8gMTAwMDAwKX07CiAgICAgICAgdGVt
cCArPSAiZm9vIjsKICAgICAgICBnY1JlYyhuLTEpOwogICAgfQogICAgZm9yICh2YXIgaSA9IDA7
IGkgPCAxMDAwOyBpKyspCiAgICAgICAgZ2NSZWMoMTApOwp9CgpmdW5jdGlvbiBmaW5pc2hUZXN0
KCkgewogIHN1Y2Nlc3NmdWxseVBhcnNlZCA9IHRydWU7CiAgdmFyIGVwaWxvZ3VlID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgdmFyIGJhc2VQYXRoID0gIiI7CiAgdmFyIGV4
cGVjdGVkQmFzZSA9ICJqcy10ZXN0LXByZS5qcyI7CiAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5n
ZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7CiAgZm9yICh2YXIgc2NyaXB0LCBpID0gMDsg
c2NyaXB0ID0gc2NyaXB0c1tpXTsgaSsrKSB7CiAgICB2YXIgc3JjID0gc2NyaXB0LnNyYzsKICAg
IHZhciBsID0gc3JjLmxlbmd0aDsKICAgIGlmIChzcmMuc3Vic3RyKGwgLSBleHBlY3RlZEJhc2Uu
bGVuZ3RoKSA9PSBleHBlY3RlZEJhc2UpIHsKICAgICAgYmFzZVBhdGggPSBzcmMuc3Vic3RyKDAs
IGwgLSBleHBlY3RlZEJhc2UubGVuZ3RoKTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGVwaWxv
Z3VlLnNyYyA9IGJhc2VQYXRoICsgImpzLXRlc3QtcG9zdC5qcyI7CiAgZG9jdW1lbnQuYm9keS5h
cHBlbmRDaGlsZChlcGlsb2d1ZSk7Cn0KCjwvc2NyaXB0Pgo8c2NyaXB0PgovKgoqKiBDb3B5cmln
aHQgKGMpIDIwMTIgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgoqKgoqKiBQZXJtaXNzaW9uIGlzIGhl
cmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQoq
KiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBm
aWxlcyAodGhlCioqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhv
dXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwoqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0
cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCioqIGRpc3RyaWJ1dGUsIHN1
YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKiog
cGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8g
c28sIHN1YmplY3QgdG8KKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoqKgoqKiBUaGUgYWJv
dmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBp
bmNsdWRlZAoqKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBN
YXRlcmlhbHMuCioqCioqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhP
VVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCioqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5H
IEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgoqKiBNRVJDSEFOVEFCSUxJVFks
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCioq
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJ
QUJMRSBGT1IgQU5ZCioqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCioqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5H
IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCioqIE1BVEVSSUFMUyBPUiBU
SEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCiovCnZhciBXZWJHTFRl
c3RVdGlscyA9IChmdW5jdGlvbigpIHsKInVzZSBzdHJpY3QiOwoKLyoqCiAqIFdyYXBwZWQgbG9n
Z2luZyBmdW5jdGlvbi4KICogQHBhcmFtIHtzdHJpbmd9IG1zZyBUaGUgbWVzc2FnZSB0byBsb2cu
CiAqLwp2YXIgbG9nID0gZnVuY3Rpb24obXNnKSB7CiAgYnVmZmVyZWRMb2dUb0NvbnNvbGUobXNn
KTsKfTsKCi8qKgogKiBXcmFwcGVkIGxvZ2dpbmcgZnVuY3Rpb24uCiAqIEBwYXJhbSB7c3RyaW5n
fSBtc2cgVGhlIG1lc3NhZ2UgdG8gbG9nLgogKi8KdmFyIGVycm9yID0gZnVuY3Rpb24obXNnKSB7
CiAgLy8gRm9yIHRoZSB0aW1lIGJlaW5nLCBkaXZlcnRpbmcgdGhpcyB0byB3aW5kb3cuY29uc29s
ZS5sb2cgcmF0aGVyCiAgLy8gdGhhbiB3aW5kb3cuY29uc29sZS5lcnJvci4gSWYgYW55b25lIGNh
cmVzIGVub3VnaCB0aGV5IGNhbgogIC8vIGdlbmVyYWxpemUgdGhlIG1lY2hhbmlzbSBpbiBqcy10
ZXN0LXByZS5qcy4KICBsb2cobXNnKTsKfTsKCi8qKgogKiBUdXJuIG9mZiBhbGwgbG9nZ2luZy4K
ICovCnZhciBsb2dnaW5nT2ZmID0gZnVuY3Rpb24oKSB7CiAgbG9nID0gZnVuY3Rpb24oKSB7fTsK
ICBlcnJvciA9IGZ1bmN0aW9uKCkge307Cn07CgovKioKICogQ29udmVydHMgYSBXZWJHTCBlbnVt
IHRvIGEgc3RyaW5nLgogKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBX
ZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhl
IGVudW0gdmFsdWUuCiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGVudW0gYXMgYSBzdHJpbmcuCiAq
Lwp2YXIgZ2xFbnVtVG9TdHJpbmcgPSBmdW5jdGlvbihnbCwgdmFsdWUpIHsKICAvLyBPcHRpbWl6
YXRpb24gZm9yIHRoZSBtb3N0IGNvbW1vbiBlbnVtOgogIGlmICh2YWx1ZSA9PT0gZ2wuTk9fRVJS
T1IpIHsKICAgIHJldHVybiAiTk9fRVJST1IiOwogIH0KICBmb3IgKHZhciBwIGluIGdsKSB7CiAg
ICBpZiAoZ2xbcF0gPT0gdmFsdWUpIHsKICAgICAgaWYgKHAgPT0gJ2RyYXdpbmdCdWZmZXJXaWR0
aCcgfHwgcCA9PSAnZHJhd2luZ0J1ZmZlckhlaWdodCcpIHsKICAgICAgICBjb250aW51ZTsKICAg
ICAgfQogICAgICByZXR1cm4gcDsKICAgIH0KICB9CiAgcmV0dXJuICIweCIgKyBOdW1iZXIodmFs
dWUpLnRvU3RyaW5nKDE2KTsKfTsKCnZhciBsYXN0RXJyb3IgPSAiIjsKCi8qKgogKiBSZXR1cm5z
IHRoZSBsYXN0IGNvbXBpbGVyL2xpbmtlciBlcnJvci4KICogQHJldHVybiB7c3RyaW5nfSBUaGUg
bGFzdCBjb21waWxlci9saW5rZXIgZXJyb3IuCiAqLwp2YXIgZ2V0TGFzdEVycm9yID0gZnVuY3Rp
b24oKSB7CiAgcmV0dXJuIGxhc3RFcnJvcjsKfTsKCi8qKgogKiBXaGV0aGVyIGEgaGF5c3RhY2sg
ZW5kcyB3aXRoIGEgbmVlZGxlLgogKiBAcGFyYW0ge3N0cmluZ30gaGF5c3RhY2sgU3RyaW5nIHRv
IHNlYXJjaAogKiBAcGFyYW0ge3N0cmluZ30gbmVlZGxlIFN0cmluZyB0byBzZWFyY2ggZm9yLgog
KiBAcGFyYW0ge2Jvb2xlYW59IFRydWUgaWYgaGF5c3RhY2sgZW5kcyB3aXRoIG5lZWRsZS4KICov
CnZhciBlbmRzV2l0aCA9IGZ1bmN0aW9uKGhheXN0YWNrLCBuZWVkbGUpIHsKICByZXR1cm4gaGF5
c3RhY2suc3Vic3RyKGhheXN0YWNrLmxlbmd0aCAtIG5lZWRsZS5sZW5ndGgpID09PSBuZWVkbGU7
Cn07CgovKioKICogV2hldGhlciBhIGhheXN0YWNrIHN0YXJ0cyB3aXRoIGEgbmVlZGxlLgogKiBA
cGFyYW0ge3N0cmluZ30gaGF5c3RhY2sgU3RyaW5nIHRvIHNlYXJjaAogKiBAcGFyYW0ge3N0cmlu
Z30gbmVlZGxlIFN0cmluZyB0byBzZWFyY2ggZm9yLgogKiBAcGFyYW0ge2Jvb2xlYW59IFRydWUg
aWYgaGF5c3RhY2sgc3RhcnRzIHdpdGggbmVlZGxlLgogKi8KdmFyIHN0YXJ0c1dpdGggPSBmdW5j
dGlvbihoYXlzdGFjaywgbmVlZGxlKSB7CiAgcmV0dXJuIGhheXN0YWNrLnN1YnN0cigwLCBuZWVk
bGUubGVuZ3RoKSA9PT0gbmVlZGxlOwp9OwoKLyoqCiAqIEEgdmVydGV4IHNoYWRlciBmb3IgYSBz
aW5nbGUgdGV4dHVyZS4KICogQHR5cGUge3N0cmluZ30KICovCnZhciBzaW1wbGVUZXh0dXJlVmVy
dGV4U2hhZGVyID0gWwogICdhdHRyaWJ1dGUgdmVjNCB2UG9zaXRpb247JywKICAnYXR0cmlidXRl
IHZlYzIgdGV4Q29vcmQwOycsCiAgJ3ZhcnlpbmcgdmVjMiB0ZXhDb29yZDsnLAogICd2b2lkIG1h
aW4oKSB7JywKICAnICAgIGdsX1Bvc2l0aW9uID0gdlBvc2l0aW9uOycsCiAgJyAgICB0ZXhDb29y
ZCA9IHRleENvb3JkMDsnLAogICd9J10uam9pbignXG4nKTsKCi8qKgogKiBBIGZyYWdtZW50IHNo
YWRlciBmb3IgYSBzaW5nbGUgdGV4dHVyZS4KICogQHR5cGUge3N0cmluZ30KICovCnZhciBzaW1w
bGVUZXh0dXJlRnJhZ21lbnRTaGFkZXIgPSBbCiAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0Oycs
CiAgJ3VuaWZvcm0gc2FtcGxlcjJEIHRleDsnLAogICd2YXJ5aW5nIHZlYzIgdGV4Q29vcmQ7JywK
ICAndm9pZCBtYWluKCkgeycsCiAgJyAgICBnbF9GcmFnRGF0YVswXSA9IHRleHR1cmUyRCh0ZXgs
IHRleENvb3JkKTsnLAogICd9J10uam9pbignXG4nKTsKCi8qKgogKiBBIGZyYWdtZW50IHNoYWRl
ciBmb3IgYSBzaW5nbGUgY3ViZSBtYXAgdGV4dHVyZS4KICogQHR5cGUge3N0cmluZ30KICovCnZh
ciBzaW1wbGVDdWJlTWFwVGV4dHVyZUZyYWdtZW50U2hhZGVyID0gWwogICdwcmVjaXNpb24gbWVk
aXVtcCBmbG9hdDsnLAogICd1bmlmb3JtIHNhbXBsZXJDdWJlIHRleDsnLAogICd1bmlmb3JtIGhp
Z2hwIGludCBmYWNlOycsCiAgJ3ZhcnlpbmcgdmVjMiB0ZXhDb29yZDsnLAogICd2b2lkIG1haW4o
KSB7JywKICAvLyBUcmFuc2Zvcm0gWzAsIDFdIC0+IFstMSwgMV0KICAnICAgIHZlYzIgdGV4QzIg
PSAodGV4Q29vcmQgKiAyLikgLSAxLjsnLAogIC8vIFRyYW5zZm9ybSAyZCB0ZXggY29vcmQuIHRv
IGVhY2ggZmFjZSBvZiBURVhUVVJFX0NVQkVfTUFQIGNvb3JkLgogICcgICAgdmVjMyB0ZXhDdWJl
ID0gdmVjMygwLiwgMC4sIDAuKTsnLAogICcgICAgaWYgKGZhY2UgPT0gMzQwNjkpIHsnLCAgICAg
ICAgIC8vIFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWAogICcgICAgICAgIHRleEN1YmUgPSB2
ZWMzKDEuLCAtdGV4QzIueSwgLXRleEMyLngpOycsCiAgJyAgICB9IGVsc2UgaWYgKGZhY2UgPT0g
MzQwNzApIHsnLCAgLy8gVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YCiAgJyAgICAgICAgdGV4
Q3ViZSA9IHZlYzMoLTEuLCAtdGV4QzIueSwgdGV4QzIueCk7JywKICAnICAgIH0gZWxzZSBpZiAo
ZmFjZSA9PSAzNDA3MSkgeycsICAvLyBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kKICAnICAg
ICAgICB0ZXhDdWJlID0gdmVjMyh0ZXhDMi54LCAxLiwgdGV4QzIueSk7JywKICAnICAgIH0gZWxz
ZSBpZiAoZmFjZSA9PSAzNDA3MikgeycsICAvLyBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1kK
ICAnICAgICAgICB0ZXhDdWJlID0gdmVjMyh0ZXhDMi54LCAtMS4sIC10ZXhDMi55KTsnLAogICcg
ICAgfSBlbHNlIGlmIChmYWNlID09IDM0MDczKSB7JywgIC8vIFRFWFRVUkVfQ1VCRV9NQVBfUE9T
SVRJVkVfWgogICcgICAgICAgIHRleEN1YmUgPSB2ZWMzKHRleEMyLngsIC10ZXhDMi55LCAxLik7
JywKICAnICAgIH0gZWxzZSBpZiAoZmFjZSA9PSAzNDA3NCkgeycsICAvLyBURVhUVVJFX0NVQkVf
TUFQX05FR0FUSVZFX1oKICAnICAgICAgICB0ZXhDdWJlID0gdmVjMygtdGV4QzIueCwgLXRleEMy
LnksIC0xLik7JywKICAnICAgIH0nLAogICcgICAgZ2xfRnJhZ0RhdGFbMF0gPSB0ZXh0dXJlQ3Vi
ZSh0ZXgsIHRleEN1YmUpOycsCiAgJ30nXS5qb2luKCdcbicpOwoKLyoqCiAqIEEgdmVydGV4IHNo
YWRlciBmb3IgYSBzaW5nbGUgdGV4dHVyZS4KICogQHR5cGUge3N0cmluZ30KICovCnZhciBub1Rl
eENvb3JkVGV4dHVyZVZlcnRleFNoYWRlciA9IFsKICAnYXR0cmlidXRlIHZlYzQgdlBvc2l0aW9u
OycsCiAgJ3ZhcnlpbmcgdmVjMiB0ZXhDb29yZDsnLAogICd2b2lkIG1haW4oKSB7JywKICAnICAg
IGdsX1Bvc2l0aW9uID0gdlBvc2l0aW9uOycsCiAgJyAgICB0ZXhDb29yZCA9IHZQb3NpdGlvbi54
eSAqIDAuNSArIDAuNTsnLAogICd9J10uam9pbignXG4nKTsKCi8qKgogKiBBIHZlcnRleCBzaGFk
ZXIgZm9yIGEgdW5pZm9ybSBjb2xvci4KICogQHR5cGUge3N0cmluZ30KICovCnZhciBzaW1wbGVW
ZXJ0ZXhTaGFkZXIgPSBbCiAgJ2F0dHJpYnV0ZSB2ZWM0IHZQb3NpdGlvbjsnLAogICd2b2lkIG1h
aW4oKSB7JywKICAnICAgIGdsX1Bvc2l0aW9uID0gdlBvc2l0aW9uOycsCiAgJ30nXS5qb2luKCdc
bicpOwoKLyoqCiAqIEEgZnJhZ21lbnQgc2hhZGVyIGZvciBhIHVuaWZvcm0gY29sb3IuCiAqIEB0
eXBlIHtzdHJpbmd9CiAqLwp2YXIgc2ltcGxlQ29sb3JGcmFnbWVudFNoYWRlciA9IFsKICAncHJl
Y2lzaW9uIG1lZGl1bXAgZmxvYXQ7JywKICAndW5pZm9ybSB2ZWM0IHVfY29sb3I7JywKICAndm9p
ZCBtYWluKCkgeycsCiAgJyAgICBnbF9GcmFnRGF0YVswXSA9IHVfY29sb3I7JywKICAnfSddLmpv
aW4oJ1xuJyk7CgovKioKICogQSB2ZXJ0ZXggc2hhZGVyIGZvciB2ZXJ0ZXggY29sb3JzLgogKiBA
dHlwZSB7c3RyaW5nfQogKi8KdmFyIHNpbXBsZVZlcnRleENvbG9yVmVydGV4U2hhZGVyID0gWwog
ICdhdHRyaWJ1dGUgdmVjNCB2UG9zaXRpb247JywKICAnYXR0cmlidXRlIHZlYzQgYV9jb2xvcjsn
LAogICd2YXJ5aW5nIHZlYzQgdl9jb2xvcjsnLAogICd2b2lkIG1haW4oKSB7JywKICAnICAgIGds
X1Bvc2l0aW9uID0gdlBvc2l0aW9uOycsCiAgJyAgICB2X2NvbG9yID0gYV9jb2xvcjsnLAogICd9
J10uam9pbignXG4nKTsKCi8qKgogKiBBIGZyYWdtZW50IHNoYWRlciBmb3IgdmVydGV4IGNvbG9y
cy4KICogQHR5cGUge3N0cmluZ30KICovCnZhciBzaW1wbGVWZXJ0ZXhDb2xvckZyYWdtZW50U2hh
ZGVyID0gWwogICdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsnLAogICd2YXJ5aW5nIHZlYzQgdl9j
b2xvcjsnLAogICd2b2lkIG1haW4oKSB7JywKICAnICAgIGdsX0ZyYWdEYXRhWzBdID0gdl9jb2xv
cjsnLAogICd9J10uam9pbignXG4nKTsKCi8qKgogKiBDcmVhdGVzIGEgcHJvZ3JhbSwgYXR0YWNo
ZXMgc2hhZGVycywgYmluZHMgYXR0cmliIGxvY2F0aW9ucywgbGlua3MgdGhlCiAqIHByb2dyYW0g
YW5kIGNhbGxzIHVzZVByb2dyYW0uCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0g
Z2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7IUFycmF5Ljwh
V2ViR0xTaGFkZXJ8c3RyaW5nPn0gc2hhZGVycyBUaGUgc2hhZGVycyB0bwogKiAgICAgICAgYXR0
YWNoLCBvciB0aGUgc291cmNlLCBvciB0aGUgaWQgb2YgYSBzY3JpcHQgdG8gZ2V0CiAqICAgICAg
ICB0aGUgc291cmNlIGZyb20uCiAqIEBwYXJhbSB7IUFycmF5LjxzdHJpbmc+fSBvcHRfYXR0cmli
cyBUaGUgYXR0cmlicyBuYW1lcy4KICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IG9wdF9sb2Nh
dGlvbnMgVGhlIGxvY2F0aW9ucyBmb3IgdGhlIGF0dHJpYnMuCiAqIEBwYXJhbSB7Ym9vbGVhbn0g
b3B0X2xvZ1NoYWRlcnMgV2hldGhlciB0byBsb2cgc2hhZGVyIHNvdXJjZS4KICovCnZhciBzZXR1
cFByb2dyYW0gPSBmdW5jdGlvbigKICAgIGdsLCBzaGFkZXJzLCBvcHRfYXR0cmlicywgb3B0X2xv
Y2F0aW9ucywgb3B0X2xvZ1NoYWRlcnMpIHsKICB2YXIgcmVhbFNoYWRlcnMgPSBbXTsKICB2YXIg
cHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKICB2YXIgc2hhZGVyQ291bnQgPSAwOwogIGZv
ciAodmFyIGlpID0gMDsgaWkgPCBzaGFkZXJzLmxlbmd0aDsgKytpaSkgewogICAgdmFyIHNoYWRl
ciA9IHNoYWRlcnNbaWldOwogICAgdmFyIHNoYWRlclR5cGUgPSB1bmRlZmluZWQ7CiAgICBpZiAo
dHlwZW9mIHNoYWRlciA9PSAnc3RyaW5nJykgewogICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKHNoYWRlcik7CiAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgaWYg
KGVsZW1lbnQudHlwZSAhPSAieC1zaGFkZXIveC12ZXJ0ZXgiICYmIGVsZW1lbnQudHlwZSAhPSAi
eC1zaGFkZXIveC1mcmFnbWVudCIpCiAgICAgICAgICBzaGFkZXJUeXBlID0gaWkgPyBnbC5GUkFH
TUVOVF9TSEFERVIgOiBnbC5WRVJURVhfU0hBREVSOwogICAgICAgIHNoYWRlciA9IGxvYWRTaGFk
ZXJGcm9tU2NyaXB0KGdsLCBzaGFkZXIsIHNoYWRlclR5cGUsIHVuZGVmaW5lZCwgb3B0X2xvZ1No
YWRlcnMpOwogICAgICB9IGVsc2UgaWYgKGVuZHNXaXRoKHNoYWRlciwgIi52ZXJ0IikpIHsKICAg
ICAgICBzaGFkZXIgPSBsb2FkU2hhZGVyRnJvbUZpbGUoZ2wsIHNoYWRlciwgZ2wuVkVSVEVYX1NI
QURFUiwgdW5kZWZpbmVkLCBvcHRfbG9nU2hhZGVycyk7CiAgICAgIH0gZWxzZSBpZiAoZW5kc1dp
dGgoc2hhZGVyLCAiLmZyYWciKSkgewogICAgICAgIHNoYWRlciA9IGxvYWRTaGFkZXJGcm9tRmls
ZShnbCwgc2hhZGVyLCBnbC5GUkFHTUVOVF9TSEFERVIsIHVuZGVmaW5lZCwgb3B0X2xvZ1NoYWRl
cnMpOwogICAgICB9IGVsc2UgewogICAgICAgIHNoYWRlciA9IGxvYWRTaGFkZXIoZ2wsIHNoYWRl
ciwgaWkgPyBnbC5GUkFHTUVOVF9TSEFERVIgOiBnbC5WRVJURVhfU0hBREVSLCB1bmRlZmluZWQs
IG9wdF9sb2dTaGFkZXJzKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvcHRfbG9nU2hhZGVycykg
ewogICAgICB0aHJvdyAnU2hhZGVyIHNvdXJjZSBsb2dnaW5nIHJlcXVlc3RlZCBidXQgbm8gc2hh
ZGVyIHNvdXJjZSBwcm92aWRlZCc7CiAgICB9CiAgICBpZiAoc2hhZGVyKSB7CiAgICAgICsrc2hh
ZGVyQ291bnQ7CiAgICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBzaGFkZXIpOwogICAgfQog
IH0KICBpZiAoc2hhZGVyQ291bnQgIT0gMikgewogICAgZXJyb3IoIkVycm9yIGluIGNvbXBpbGlu
ZyBzaGFkZXIiKTsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAob3B0X2F0dHJpYnMpIHsKICAg
IGZvciAodmFyIGlpID0gMDsgaWkgPCBvcHRfYXR0cmlicy5sZW5ndGg7ICsraWkpIHsKICAgICAg
Z2wuYmluZEF0dHJpYkxvY2F0aW9uKAogICAgICAgICAgcHJvZ3JhbSwKICAgICAgICAgIG9wdF9s
b2NhdGlvbnMgPyBvcHRfbG9jYXRpb25zW2lpXSA6IGlpLAogICAgICAgICAgb3B0X2F0dHJpYnNb
aWldKTsKICAgIH0KICB9CiAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7CgogIC8vIENoZWNrIHRo
ZSBsaW5rIHN0YXR1cwogIHZhciBsaW5rZWQgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dy
YW0sIGdsLkxJTktfU1RBVFVTKTsKICBpZiAoIWxpbmtlZCkgewogICAgICAvLyBzb21ldGhpbmcg
d2VudCB3cm9uZyB3aXRoIHRoZSBsaW5rCiAgICAgIGxhc3RFcnJvciA9IGdsLmdldFByb2dyYW1J
bmZvTG9nIChwcm9ncmFtKTsKICAgICAgZXJyb3IoIkVycm9yIGluIHByb2dyYW0gbGlua2luZzoi
ICsgbGFzdEVycm9yKTsKCiAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgIHJl
dHVybiBudWxsOwogIH0KCiAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICByZXR1cm4gcHJvZ3Jh
bTsKfTsKCi8qKgogKiBDcmVhdGVzIGEgcHJvZ3JhbSwgYXR0YWNoZXMgc2hhZGVyLCBzZXRzIHVw
IHRyYXNuZm9ybSBmZWVkYmFjayB2YXJ5aW5ncywKICogYmluZHMgYXR0cmliIGxvY2F0aW9ucywg
bGlua3MgdGhlIHByb2dyYW0gYW5kIGNhbGxzIHVzZVByb2dyYW0uCiAqIEBwYXJhbSB7IVdlYkdM
UmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAq
IEBwYXJhbSB7IUFycmF5LjwhV2ViR0xTaGFkZXJ8c3RyaW5nPn0gc2hhZGVycyBUaGUgc2hhZGVy
cyB0bwogKiAgICAgICAgYXR0YWNoLCBvciB0aGUgc291cmNlLCBvciB0aGUgaWQgb2YgYSBzY3Jp
cHQgdG8gZ2V0CiAqICAgICAgICB0aGUgc291cmNlIGZyb20uCiAqIEBwYXJhbSB7IUFycmF5Ljxz
dHJpbmc+fSB2YXJ5aW5ncyBUaGUgdHJhbnNmb3JtIGZlZWRiYWNrIHZhcnlpbmcgbmFtZXMuCiAq
IEBwYXJhbSB7bnVtYmVyfSBidWZmZXJNb2RlIFRoZSBtb2RlIHVzZWQgdG8gY2FwdHVyZSB0aGUg
dmFyeWluZyB2YXJpYWJsZXMuCiAqIEBwYXJhbSB7IUFycmF5LjxzdHJpbmc+fSBvcHRfYXR0cmli
cyBUaGUgYXR0cmlicyBuYW1lcy4KICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IG9wdF9sb2Nh
dGlvbnMgVGhlIGxvY2F0aW9ucyBmb3IgdGhlIGF0dHJpYnMuCiAqIEBwYXJhbSB7Ym9vbGVhbn0g
b3B0X2xvZ1NoYWRlcnMgV2hldGhlciB0byBsb2cgc2hhZGVyIHNvdXJjZS4KICovCnZhciBzZXR1
cFRyYW5zZm9ybUZlZWRiYWNrUHJvZ3JhbSA9IGZ1bmN0aW9uKAogICAgZ2wsIHNoYWRlcnMsIHZh
cnlpbmdzLCBidWZmZXJNb2RlLCBvcHRfYXR0cmlicywgb3B0X2xvY2F0aW9ucywgb3B0X2xvZ1No
YWRlcnMpIHsKICB2YXIgcmVhbFNoYWRlcnMgPSBbXTsKICB2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0
ZVByb2dyYW0oKTsKICB2YXIgc2hhZGVyQ291bnQgPSAwOwogIGZvciAodmFyIGlpID0gMDsgaWkg
PCBzaGFkZXJzLmxlbmd0aDsgKytpaSkgewogICAgdmFyIHNoYWRlciA9IHNoYWRlcnNbaWldOwog
ICAgdmFyIHNoYWRlclR5cGUgPSB1bmRlZmluZWQ7CiAgICBpZiAodHlwZW9mIHNoYWRlciA9PSAn
c3RyaW5nJykgewogICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNo
YWRlcik7CiAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSAhPSAi
eC1zaGFkZXIveC12ZXJ0ZXgiICYmIGVsZW1lbnQudHlwZSAhPSAieC1zaGFkZXIveC1mcmFnbWVu
dCIpCiAgICAgICAgICBzaGFkZXJUeXBlID0gaWkgPyBnbC5GUkFHTUVOVF9TSEFERVIgOiBnbC5W
RVJURVhfU0hBREVSOwogICAgICAgIHNoYWRlciA9IGxvYWRTaGFkZXJGcm9tU2NyaXB0KGdsLCBz
aGFkZXIsIHNoYWRlclR5cGUsIHVuZGVmaW5lZCwgb3B0X2xvZ1NoYWRlcnMpOwogICAgICB9IGVs
c2UgaWYgKGVuZHNXaXRoKHNoYWRlciwgIi52ZXJ0IikpIHsKICAgICAgICBzaGFkZXIgPSBsb2Fk
U2hhZGVyRnJvbUZpbGUoZ2wsIHNoYWRlciwgZ2wuVkVSVEVYX1NIQURFUiwgdW5kZWZpbmVkLCBv
cHRfbG9nU2hhZGVycyk7CiAgICAgIH0gZWxzZSBpZiAoZW5kc1dpdGgoc2hhZGVyLCAiLmZyYWci
KSkgewogICAgICAgIHNoYWRlciA9IGxvYWRTaGFkZXJGcm9tRmlsZShnbCwgc2hhZGVyLCBnbC5G
UkFHTUVOVF9TSEFERVIsIHVuZGVmaW5lZCwgb3B0X2xvZ1NoYWRlcnMpOwogICAgICB9IGVsc2Ug
ewogICAgICAgIHNoYWRlciA9IGxvYWRTaGFkZXIoZ2wsIHNoYWRlciwgaWkgPyBnbC5GUkFHTUVO
VF9TSEFERVIgOiBnbC5WRVJURVhfU0hBREVSLCB1bmRlZmluZWQsIG9wdF9sb2dTaGFkZXJzKTsK
ICAgICAgfQogICAgfSBlbHNlIGlmIChvcHRfbG9nU2hhZGVycykgewogICAgICB0aHJvdyAnU2hh
ZGVyIHNvdXJjZSBsb2dnaW5nIHJlcXVlc3RlZCBidXQgbm8gc2hhZGVyIHNvdXJjZSBwcm92aWRl
ZCc7CiAgICB9CiAgICBpZiAoc2hhZGVyKSB7CiAgICAgICsrc2hhZGVyQ291bnQ7CiAgICAgIGds
LmF0dGFjaFNoYWRlcihwcm9ncmFtLCBzaGFkZXIpOwogICAgfQogIH0KICBpZiAoc2hhZGVyQ291
bnQgIT0gMikgewogICAgZXJyb3IoIkVycm9yIGluIGNvbXBpbGluZyBzaGFkZXIiKTsKICAgIHJl
dHVybiBudWxsOwogIH0KCiAgaWYgKG9wdF9hdHRyaWJzKSB7CiAgICBmb3IgKHZhciBpaSA9IDA7
IGlpIDwgb3B0X2F0dHJpYnMubGVuZ3RoOyArK2lpKSB7CiAgICAgIGdsLmJpbmRBdHRyaWJMb2Nh
dGlvbigKICAgICAgICAgIHByb2dyYW0sCiAgICAgICAgICBvcHRfbG9jYXRpb25zID8gb3B0X2xv
Y2F0aW9uc1tpaV0gOiBpaSwKICAgICAgICAgIG9wdF9hdHRyaWJzW2lpXSk7CiAgICB9CiAgfQoK
ICBnbC50cmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzKHByb2dyYW0sIHZhcnlpbmdzLCBidWZmZXJN
b2RlKTsKCiAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7CgogIC8vIENoZWNrIHRoZSBsaW5rIHN0
YXR1cwogIHZhciBsaW5rZWQgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJ
TktfU1RBVFVTKTsKICBpZiAoIWxpbmtlZCkgewogICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9u
ZyB3aXRoIHRoZSBsaW5rCiAgICAgIGxhc3RFcnJvciA9IGdsLmdldFByb2dyYW1JbmZvTG9nIChw
cm9ncmFtKTsKICAgICAgZXJyb3IoIkVycm9yIGluIHByb2dyYW0gbGlua2luZzoiICsgbGFzdEVy
cm9yKTsKCiAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgIHJldHVybiBudWxs
OwogIH0KCiAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICByZXR1cm4gcHJvZ3JhbTsKfTsKCi8q
KgogKiBDcmVhdGVzIGEgc2ltcGxlIHRleHR1cmUgcHJvZ3JhbS4KICogQHBhcmFtIHshV2ViR0xS
ZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICog
QHJldHVybiB7V2ViR0xQcm9ncmFtfQogKi8KdmFyIHNldHVwTm9UZXhDb29yZFRleHR1cmVQcm9n
cmFtID0gZnVuY3Rpb24oZ2wpIHsKICByZXR1cm4gc2V0dXBQcm9ncmFtKGdsLAogICAgICAgICAg
ICAgICAgICAgICAgW25vVGV4Q29vcmRUZXh0dXJlVmVydGV4U2hhZGVyLCBzaW1wbGVUZXh0dXJl
RnJhZ21lbnRTaGFkZXJdLAogICAgICAgICAgICAgICAgICAgICAgWyd2UG9zaXRpb24nXSwKICAg
ICAgICAgICAgICAgICAgICAgIFswXSk7Cn07CgovKioKICogQ3JlYXRlcyBhIHNpbXBsZSB0ZXh0
dXJlIHByb2dyYW0uCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdl
YkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRfcG9zaXRp
b25Mb2NhdGlvbiBUaGUgYXR0cmliIGxvY2F0aW9uIGZvciBwb3NpdGlvbi4KICogQHBhcmFtIHtu
dW1iZXJ9IG9wdF90ZXhjb29yZExvY2F0aW9uIFRoZSBhdHRyaWIgbG9jYXRpb24gZm9yIHRleHR1
cmUgY29vcmRzLgogKiBAcmV0dXJuIHtXZWJHTFByb2dyYW19CiAqLwp2YXIgc2V0dXBTaW1wbGVU
ZXh0dXJlUHJvZ3JhbSA9IGZ1bmN0aW9uKAogICAgZ2wsIG9wdF9wb3NpdGlvbkxvY2F0aW9uLCBv
cHRfdGV4Y29vcmRMb2NhdGlvbikgewogIG9wdF9wb3NpdGlvbkxvY2F0aW9uID0gb3B0X3Bvc2l0
aW9uTG9jYXRpb24gfHwgMDsKICBvcHRfdGV4Y29vcmRMb2NhdGlvbiA9IG9wdF90ZXhjb29yZExv
Y2F0aW9uIHx8IDE7CiAgcmV0dXJuIHNldHVwUHJvZ3JhbShnbCwKICAgICAgICAgICAgICAgICAg
ICAgIFtzaW1wbGVUZXh0dXJlVmVydGV4U2hhZGVyLCBzaW1wbGVUZXh0dXJlRnJhZ21lbnRTaGFk
ZXJdLAogICAgICAgICAgICAgICAgICAgICAgWyd2UG9zaXRpb24nLCAndGV4Q29vcmQwJ10sCiAg
ICAgICAgICAgICAgICAgICAgICBbb3B0X3Bvc2l0aW9uTG9jYXRpb24sIG9wdF90ZXhjb29yZExv
Y2F0aW9uXSk7Cn07CgovKioKICogQ3JlYXRlcyBhIHNpbXBsZSBjdWJlIG1hcCB0ZXh0dXJlIHBy
b2dyYW0uCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVu
ZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRfcG9zaXRpb25Mb2Nh
dGlvbiBUaGUgYXR0cmliIGxvY2F0aW9uIGZvciBwb3NpdGlvbi4KICogQHBhcmFtIHtudW1iZXJ9
IG9wdF90ZXhjb29yZExvY2F0aW9uIFRoZSBhdHRyaWIgbG9jYXRpb24gZm9yIHRleHR1cmUgY29v
cmRzLgogKiBAcmV0dXJuIHtXZWJHTFByb2dyYW19CiAqLwp2YXIgc2V0dXBTaW1wbGVDdWJlTWFw
VGV4dHVyZVByb2dyYW0gPSBmdW5jdGlvbigKICAgIGdsLCBvcHRfcG9zaXRpb25Mb2NhdGlvbiwg
b3B0X3RleGNvb3JkTG9jYXRpb24pIHsKICBvcHRfcG9zaXRpb25Mb2NhdGlvbiA9IG9wdF9wb3Np
dGlvbkxvY2F0aW9uIHx8IDA7CiAgb3B0X3RleGNvb3JkTG9jYXRpb24gPSBvcHRfdGV4Y29vcmRM
b2NhdGlvbiB8fCAxOwogIHJldHVybiBzZXR1cFByb2dyYW0oZ2wsCiAgICAgICAgICAgICAgICAg
ICAgICBbc2ltcGxlVGV4dHVyZVZlcnRleFNoYWRlciwgc2ltcGxlQ3ViZU1hcFRleHR1cmVGcmFn
bWVudFNoYWRlcl0sCiAgICAgICAgICAgICAgICAgICAgICBbJ3ZQb3NpdGlvbicsICd0ZXhDb29y
ZDAnXSwKICAgICAgICAgICAgICAgICAgICAgIFtvcHRfcG9zaXRpb25Mb2NhdGlvbiwgb3B0X3Rl
eGNvb3JkTG9jYXRpb25dKTsKfTsKCi8qKgogKiBDcmVhdGVzIGEgc2ltcGxlIHZlcnRleCBjb2xv
ciBwcm9ncmFtLgogKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJH
TFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogKiBAcGFyYW0ge251bWJlcn0gb3B0X3Bvc2l0aW9u
TG9jYXRpb24gVGhlIGF0dHJpYiBsb2NhdGlvbiBmb3IgcG9zaXRpb24uCiAqIEBwYXJhbSB7bnVt
YmVyfSBvcHRfdmVydGV4Q29sb3JMb2NhdGlvbiBUaGUgYXR0cmliIGxvY2F0aW9uCiAqICAgICAg
ICBmb3IgdmVydGV4IGNvbG9ycy4KICogQHJldHVybiB7V2ViR0xQcm9ncmFtfQogKi8KdmFyIHNl
dHVwU2ltcGxlVmVydGV4Q29sb3JQcm9ncmFtID0gZnVuY3Rpb24oCiAgICBnbCwgb3B0X3Bvc2l0
aW9uTG9jYXRpb24sIG9wdF92ZXJ0ZXhDb2xvckxvY2F0aW9uKSB7CiAgb3B0X3Bvc2l0aW9uTG9j
YXRpb24gPSBvcHRfcG9zaXRpb25Mb2NhdGlvbiB8fCAwOwogIG9wdF92ZXJ0ZXhDb2xvckxvY2F0
aW9uID0gb3B0X3ZlcnRleENvbG9yTG9jYXRpb24gfHwgMTsKICByZXR1cm4gc2V0dXBQcm9ncmFt
KGdsLAogICAgICAgICAgICAgICAgICAgICAgW3NpbXBsZVZlcnRleENvbG9yVmVydGV4U2hhZGVy
LCBzaW1wbGVWZXJ0ZXhDb2xvckZyYWdtZW50U2hhZGVyXSwKICAgICAgICAgICAgICAgICAgICAg
IFsndlBvc2l0aW9uJywgJ2FfY29sb3InXSwKICAgICAgICAgICAgICAgICAgICAgIFtvcHRfcG9z
aXRpb25Mb2NhdGlvbiwgb3B0X3ZlcnRleENvbG9yTG9jYXRpb25dKTsKfTsKCi8qKgogKiBDcmVh
dGVzIGEgc2ltcGxlIGNvbG9yIHByb2dyYW0uCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29u
dGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7bnVt
YmVyfSBvcHRfcG9zaXRpb25Mb2NhdGlvbiBUaGUgYXR0cmliIGxvY2F0aW9uIGZvciBwb3NpdGlv
bi4KICogQHJldHVybiB7V2ViR0xQcm9ncmFtfQogKi8KdmFyIHNldHVwU2ltcGxlQ29sb3JQcm9n
cmFtID0gZnVuY3Rpb24oZ2wsIG9wdF9wb3NpdGlvbkxvY2F0aW9uKSB7CiAgb3B0X3Bvc2l0aW9u
TG9jYXRpb24gPSBvcHRfcG9zaXRpb25Mb2NhdGlvbiB8fCAwOwogIHJldHVybiBzZXR1cFByb2dy
YW0oZ2wsCiAgICAgICAgICAgICAgICAgICAgICBbc2ltcGxlVmVydGV4U2hhZGVyLCBzaW1wbGVD
b2xvckZyYWdtZW50U2hhZGVyXSwKICAgICAgICAgICAgICAgICAgICAgIFsndlBvc2l0aW9uJ10s
CiAgICAgICAgICAgICAgICAgICAgICBbb3B0X3Bvc2l0aW9uTG9jYXRpb25dKTsKfTsKCi8qKgog
KiBDcmVhdGVzIGJ1ZmZlcnMgZm9yIGEgdGV4dHVyZWQgdW5pdCBxdWFkIGFuZCBhdHRhY2hlcyB0
aGVtIHRvIHZlcnRleCBhdHRyaWJzLgogKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9
IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogKiBAcGFyYW0ge251bWJlcn0g
b3B0X3Bvc2l0aW9uTG9jYXRpb24gVGhlIGF0dHJpYiBsb2NhdGlvbiBmb3IgcG9zaXRpb24uCiAq
IEBwYXJhbSB7bnVtYmVyfSBvcHRfdGV4Y29vcmRMb2NhdGlvbiBUaGUgYXR0cmliIGxvY2F0aW9u
IGZvciB0ZXh0dXJlIGNvb3Jkcy4KICogQHJldHVybiB7IUFycmF5LjxXZWJHTEJ1ZmZlcj59IFRo
ZSBidWZmZXIgb2JqZWN0cyB0aGF0IHdlcmUKICogICAgICBjcmVhdGVkLgogKi8KdmFyIHNldHVw
VW5pdFF1YWQgPSBmdW5jdGlvbihnbCwgb3B0X3Bvc2l0aW9uTG9jYXRpb24sIG9wdF90ZXhjb29y
ZExvY2F0aW9uKSB7CiAgcmV0dXJuIHNldHVwVW5pdFF1YWRXaXRoVGV4Q29vcmRzKGdsLCBbIDAu
MCwgMC4wIF0sIFsgMS4wLCAxLjAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgb3B0X3Bvc2l0aW9uTG9jYXRpb24sIG9wdF90ZXhjb29yZExvY2F0aW9uKTsKfTsKCi8qKgog
KiBDcmVhdGVzIGJ1ZmZlcnMgZm9yIGEgdGV4dHVyZWQgdW5pdCBxdWFkIHdpdGggc3BlY2lmaWVk
IGxvd2VyIGxlZnQKICogYW5kIHVwcGVyIHJpZ2h0IHRleHR1cmUgY29vcmRpbmF0ZXMsIGFuZCBh
dHRhY2hlcyB0aGVtIHRvIHZlcnRleAogKiBhdHRyaWJzLgogKiBAcGFyYW0geyFXZWJHTFJlbmRl
cmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogKiBAcGFy
YW0geyFBcnJheS48bnVtYmVyPn0gbG93ZXJMZWZ0VGV4Q29vcmRzIFRoZSB0ZXh0dXJlIGNvb3Jk
aW5hdGVzIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIuCiAqIEBwYXJhbSB7IUFycmF5LjxudW1i
ZXI+fSB1cHBlclJpZ2h0VGV4Q29vcmRzIFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIGZvciB0aGUg
dXBwZXIgcmlnaHQgY29ybmVyLgogKiBAcGFyYW0ge251bWJlcn0gb3B0X3Bvc2l0aW9uTG9jYXRp
b24gVGhlIGF0dHJpYiBsb2NhdGlvbiBmb3IgcG9zaXRpb24uCiAqIEBwYXJhbSB7bnVtYmVyfSBv
cHRfdGV4Y29vcmRMb2NhdGlvbiBUaGUgYXR0cmliIGxvY2F0aW9uIGZvciB0ZXh0dXJlIGNvb3Jk
cy4KICogQHJldHVybiB7IUFycmF5LjxXZWJHTEJ1ZmZlcj59IFRoZSBidWZmZXIgb2JqZWN0cyB0
aGF0IHdlcmUKICogICAgICBjcmVhdGVkLgogKi8KdmFyIHNldHVwVW5pdFF1YWRXaXRoVGV4Q29v
cmRzID0gZnVuY3Rpb24oCiAgICBnbCwgbG93ZXJMZWZ0VGV4Q29vcmRzLCB1cHBlclJpZ2h0VGV4
Q29vcmRzLAogICAgb3B0X3Bvc2l0aW9uTG9jYXRpb24sIG9wdF90ZXhjb29yZExvY2F0aW9uKSB7
CiAgcmV0dXJuIHNldHVwUXVhZChnbCwgewogICAgcG9zaXRpb25Mb2NhdGlvbjogb3B0X3Bvc2l0
aW9uTG9jYXRpb24gfHwgMCwKICAgIHRleGNvb3JkTG9jYXRpb246IG9wdF90ZXhjb29yZExvY2F0
aW9uIHx8IDEsCiAgICBsb3dlckxlZnRUZXhDb29yZHM6IGxvd2VyTGVmdFRleENvb3JkcywKICAg
IHVwcGVyUmlnaHRUZXhDb29yZHM6IHVwcGVyUmlnaHRUZXhDb29yZHMKICB9KTsKfTsKCi8qKgog
KiBNYWtlcyBhIHF1YWQgd2l0aCB2YXJpb3VzIG9wdGlvbnMuCiAqIEBwYXJhbSB7IVdlYkdMUmVu
ZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBw
YXJhbSB7IU9iamVjdH0gb3B0aW9ucwogKgogKiBzY2FsZTogc2NhbGUgdG8gbXVsdGlwbGUgdW5p
dCBxdWFkIHZhbHVlcyBieS4gZGVmYXVsdCAxLjAuCiAqIHBvc2l0aW9uTG9jYXRpb246IGF0dHJp
YnV0ZSBsb2NhdGlvbiBmb3IgcG9zaXRpb24uCiAqIHRleGNvb3JkTG9jYXRpb246IGF0dHJpYnV0
ZSBsb2NhdGlvbiBmb3IgdGV4Y29vcmRzLgogKiAgICAgSWYgdGhpcyBkb2VzIG5vdCBleGlzdCBu
byB0ZXh0dXJlIGNvb3JkcyBhcmUgY3JlYXRlZC4KICogbG93ZXJMZWZ0VGV4Q29vcmRzOiBhbiBh
cnJheSBvZiAyIHZhbHVlcyBmb3IgdGhlCiAqICAgICBsb3dlckxlZnRUZXhDb29yZHMuCiAqIHVw
cGVyUmlnaHRUZXhDb29yZHM6IGFuIGFycmF5IG9mIDIgdmFsdWVzIGZvciB0aGUKICogICAgIHVw
cGVyUmlnaHRUZXhDb29yZHMuCiAqLwp2YXIgc2V0dXBRdWFkID0gZnVuY3Rpb24oZ2wsIG9wdGlv
bnMpIHsKICB2YXIgcG9zaXRpb25Mb2NhdGlvbiA9IG9wdGlvbnMucG9zaXRpb25Mb2NhdGlvbiB8
fCAwOwogIHZhciBzY2FsZSA9IG9wdGlvbnMuc2NhbGUgfHwgMTsKCiAgdmFyIG9iamVjdHMgPSBb
XTsKCiAgdmFyIHZlcnRleE9iamVjdCA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwogIGdsLmJpbmRCdWZm
ZXIoZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhPYmplY3QpOwogIGdsLmJ1ZmZlckRhdGEoZ2wuQVJS
QVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFsKICAgICAgIDEuMCAqIHNjYWxlICwgIDEuMCAq
IHNjYWxlLAogICAgICAtMS4wICogc2NhbGUgLCAgMS4wICogc2NhbGUsCiAgICAgIC0xLjAgKiBz
Y2FsZSAsIC0xLjAgKiBzY2FsZSwKICAgICAgIDEuMCAqIHNjYWxlICwgIDEuMCAqIHNjYWxlLAog
ICAgICAtMS4wICogc2NhbGUgLCAtMS4wICogc2NhbGUsCiAgICAgICAxLjAgKiBzY2FsZSAsIC0x
LjAgKiBzY2FsZV0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJy
YXkocG9zaXRpb25Mb2NhdGlvbik7CiAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkxv
Y2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogIG9iamVjdHMucHVzaCh2ZXJ0ZXhP
YmplY3QpOwoKICBpZiAob3B0aW9ucy50ZXhjb29yZExvY2F0aW9uICE9PSB1bmRlZmluZWQpIHsK
ICAgIHZhciBsbHggPSBvcHRpb25zLmxvd2VyTGVmdFRleENvb3Jkc1swXTsKICAgIHZhciBsbHkg
PSBvcHRpb25zLmxvd2VyTGVmdFRleENvb3Jkc1sxXTsKICAgIHZhciB1cnggPSBvcHRpb25zLnVw
cGVyUmlnaHRUZXhDb29yZHNbMF07CiAgICB2YXIgdXJ5ID0gb3B0aW9ucy51cHBlclJpZ2h0VGV4
Q29vcmRzWzFdOwoKICAgIHZlcnRleE9iamVjdCA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwogICAgZ2wu
YmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHZlcnRleE9iamVjdCk7CiAgICBnbC5idWZmZXJE
YXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbCiAgICAgICAgdXJ4LCB1cnks
CiAgICAgICAgbGx4LCB1cnksCiAgICAgICAgbGx4LCBsbHksCiAgICAgICAgdXJ4LCB1cnksCiAg
ICAgICAgbGx4LCBsbHksCiAgICAgICAgdXJ4LCBsbHldKSwgZ2wuU1RBVElDX0RSQVcpOwogICAg
Z2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkob3B0aW9ucy50ZXhjb29yZExvY2F0aW9uKTsKICAg
IGdsLnZlcnRleEF0dHJpYlBvaW50ZXIob3B0aW9ucy50ZXhjb29yZExvY2F0aW9uLCAyLCBnbC5G
TE9BVCwgZmFsc2UsIDAsIDApOwogICAgb2JqZWN0cy5wdXNoKHZlcnRleE9iamVjdCk7CiAgfQoK
ICByZXR1cm4gb2JqZWN0czsKfTsKCi8qKgogKiBDcmVhdGVzIGEgcHJvZ3JhbSBhbmQgYnVmZmVy
cyBmb3IgcmVuZGVyaW5nIGEgdGV4dHVyZWQgcXVhZC4KICogQHBhcmFtIHshV2ViR0xSZW5kZXJp
bmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICogQHBhcmFt
IHtudW1iZXJ9IG9wdF9wb3NpdGlvbkxvY2F0aW9uIFRoZSBhdHRyaWIgbG9jYXRpb24gZm9yCiAq
ICAgICAgICBwb3NpdGlvbi4gRGVmYXVsdCA9IDAuCiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRfdGV4
Y29vcmRMb2NhdGlvbiBUaGUgYXR0cmliIGxvY2F0aW9uIGZvcgogKiAgICAgICAgdGV4dHVyZSBj
b29yZHMuIERlZmF1bHQgPSAxLgogKiBAcmV0dXJuIHshV2ViR0xQcm9ncmFtfQogKi8KdmFyIHNl
dHVwVGV4dHVyZWRRdWFkID0gZnVuY3Rpb24oCiAgICBnbCwgb3B0X3Bvc2l0aW9uTG9jYXRpb24s
IG9wdF90ZXhjb29yZExvY2F0aW9uKSB7CiAgdmFyIHByb2dyYW0gPSBzZXR1cFNpbXBsZVRleHR1
cmVQcm9ncmFtKAogICAgICBnbCwgb3B0X3Bvc2l0aW9uTG9jYXRpb24sIG9wdF90ZXhjb29yZExv
Y2F0aW9uKTsKICBzZXR1cFVuaXRRdWFkKGdsLCBvcHRfcG9zaXRpb25Mb2NhdGlvbiwgb3B0X3Rl
eGNvb3JkTG9jYXRpb24pOwogIHJldHVybiBwcm9ncmFtOwp9OwoKLyoqCiAqIENyZWF0ZXMgYSBw
cm9ncmFtIGFuZCBidWZmZXJzIGZvciByZW5kZXJpbmcgYSBjb2xvciBxdWFkLgogKiBAcGFyYW0g
eyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8g
dXNlLgogKiBAcGFyYW0ge251bWJlcn0gb3B0X3Bvc2l0aW9uTG9jYXRpb24gVGhlIGF0dHJpYiBs
b2NhdGlvbiBmb3IgcG9zaXRpb24uCiAqIEByZXR1cm4geyFXZWJHTFByb2dyYW19CiAqLwp2YXIg
c2V0dXBDb2xvclF1YWQgPSBmdW5jdGlvbihnbCwgb3B0X3Bvc2l0aW9uTG9jYXRpb24pIHsKICBv
cHRfcG9zaXRpb25Mb2NhdGlvbiA9IG9wdF9wb3NpdGlvbkxvY2F0aW9uIHx8IDA7CiAgdmFyIHBy
b2dyYW0gPSBzZXR1cFNpbXBsZUNvbG9yUHJvZ3JhbShnbCk7CiAgc2V0dXBVbml0UXVhZChnbCwg
b3B0X3Bvc2l0aW9uTG9jYXRpb24pOwogIHJldHVybiBwcm9ncmFtOwp9OwoKLyoqCiAqIENyZWF0
ZXMgYSBwcm9ncmFtIGFuZCBidWZmZXJzIGZvciByZW5kZXJpbmcgYSB0ZXh0dXJlZCBxdWFkIHdp
dGgKICogc3BlY2lmaWVkIGxvd2VyIGxlZnQgYW5kIHVwcGVyIHJpZ2h0IHRleHR1cmUgY29vcmRp
bmF0ZXMuCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVu
ZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBsb3dlckxl
ZnRUZXhDb29yZHMgVGhlIHRleHR1cmUgY29vcmRpbmF0ZXMgZm9yIHRoZSBsb3dlciBsZWZ0IGNv
cm5lci4KICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IHVwcGVyUmlnaHRUZXhDb29yZHMgVGhl
IHRleHR1cmUgY29vcmRpbmF0ZXMgZm9yIHRoZSB1cHBlciByaWdodCBjb3JuZXIuCiAqIEBwYXJh
bSB7bnVtYmVyfSBvcHRfcG9zaXRpb25Mb2NhdGlvbiBUaGUgYXR0cmliIGxvY2F0aW9uIGZvciBw
b3NpdGlvbi4KICogQHBhcmFtIHtudW1iZXJ9IG9wdF90ZXhjb29yZExvY2F0aW9uIFRoZSBhdHRy
aWIgbG9jYXRpb24gZm9yIHRleHR1cmUgY29vcmRzLgogKiBAcmV0dXJuIHshV2ViR0xQcm9ncmFt
fQogKi8KdmFyIHNldHVwVGV4dHVyZWRRdWFkV2l0aFRleENvb3JkcyA9IGZ1bmN0aW9uKAogICAg
Z2wsIGxvd2VyTGVmdFRleENvb3JkcywgdXBwZXJSaWdodFRleENvb3JkcywKICAgIG9wdF9wb3Np
dGlvbkxvY2F0aW9uLCBvcHRfdGV4Y29vcmRMb2NhdGlvbikgewogIHZhciBwcm9ncmFtID0gc2V0
dXBTaW1wbGVUZXh0dXJlUHJvZ3JhbSgKICAgICAgZ2wsIG9wdF9wb3NpdGlvbkxvY2F0aW9uLCBv
cHRfdGV4Y29vcmRMb2NhdGlvbik7CiAgc2V0dXBVbml0UXVhZFdpdGhUZXhDb29yZHMoZ2wsIGxv
d2VyTGVmdFRleENvb3JkcywgdXBwZXJSaWdodFRleENvb3JkcywKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBvcHRfcG9zaXRpb25Mb2NhdGlvbiwgb3B0X3RleGNvb3JkTG9jYXRpb24pOwog
IHJldHVybiBwcm9ncmFtOwp9OwoKLyoqCiAqIENyZWF0ZXMgYSBwcm9ncmFtIGFuZCBidWZmZXJz
IGZvciByZW5kZXJpbmcgYSB0ZXh0dXJlZCBxdWFkIHdpdGgKICogYSBjdWJlIG1hcCB0ZXh0dXJl
LgogKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJlbmRlcmlu
Z0NvbnRleHQgdG8gdXNlLgogKiBAcGFyYW0ge251bWJlcn0gb3B0X3Bvc2l0aW9uTG9jYXRpb24g
VGhlIGF0dHJpYiBsb2NhdGlvbiBmb3IKICogICAgICAgIHBvc2l0aW9uLiBEZWZhdWx0ID0gMC4K
ICogQHBhcmFtIHtudW1iZXJ9IG9wdF90ZXhjb29yZExvY2F0aW9uIFRoZSBhdHRyaWIgbG9jYXRp
b24gZm9yCiAqICAgICAgICB0ZXh0dXJlIGNvb3Jkcy4gRGVmYXVsdCA9IDEuCiAqIEByZXR1cm4g
eyFXZWJHTFByb2dyYW19CiAqLwp2YXIgc2V0dXBUZXh0dXJlZFF1YWRXaXRoQ3ViZU1hcCA9IGZ1
bmN0aW9uKAogICAgZ2wsIG9wdF9wb3NpdGlvbkxvY2F0aW9uLCBvcHRfdGV4Y29vcmRMb2NhdGlv
bikgewogIHZhciBwcm9ncmFtID0gc2V0dXBTaW1wbGVDdWJlTWFwVGV4dHVyZVByb2dyYW0oCiAg
ICAgIGdsLCBvcHRfcG9zaXRpb25Mb2NhdGlvbiwgb3B0X3RleGNvb3JkTG9jYXRpb24pOwogIHNl
dHVwVW5pdFF1YWQoZ2wsIG9wdF9wb3NpdGlvbkxvY2F0aW9uLCBvcHRfdGV4Y29vcmRMb2NhdGlv
bik7CiAgcmV0dXJuIHByb2dyYW07Cn07CgovKioKICogQ3JlYXRlcyBhIHVuaXQgcXVhZCB3aXRo
IG9ubHkgcG9zaXRpb25zIG9mIGEgZ2l2ZW4gcmVzb2x1dGlvbi4KICogQHBhcmFtIHshV2ViR0xS
ZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICog
QHBhcmFtIHtudW1iZXJ9IGdyaWRSZXMgVGhlIHJlc29sdXRpb24gb2YgdGhlIG1lc2ggZ3JpZCwK
ICogICAgIGV4cHJlc3NlZCBpbiB0aGUgbnVtYmVyIG9mIHF1YWRzIGFjcm9zcyBhbmQgZG93bi4K
ICogQHBhcmFtIHtudW1iZXJ9IG9wdF9wb3NpdGlvbkxvY2F0aW9uIFRoZSBhdHRyaWIgbG9jYXRp
b24gZm9yIHBvc2l0aW9uLgogKi8KdmFyIHNldHVwSW5kZXhlZFF1YWQgPSBmdW5jdGlvbiAoCiAg
ICBnbCwgZ3JpZFJlcywgb3B0X3Bvc2l0aW9uTG9jYXRpb24sIG9wdF9mbGlwT2RkVHJpYW5nbGVz
KSB7CiAgcmV0dXJuIHNldHVwSW5kZXhlZFF1YWRXaXRoT3B0aW9ucyhnbCwKICAgIHsgZ3JpZFJl
czogZ3JpZFJlcywKICAgICAgcG9zaXRpb25Mb2NhdGlvbjogb3B0X3Bvc2l0aW9uTG9jYXRpb24s
CiAgICAgIGZsaXBPZGRUcmlhbmdsZXM6IG9wdF9mbGlwT2RkVHJpYW5nbGVzCiAgICB9KTsKfTsK
Ci8qKgogKiBDcmVhdGVzIGEgcXVhZCB3aXRoIHZhcmlvdXMgb3B0aW9ucy4KICogQHBhcmFtIHsh
V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVz
ZS4KICogQHBhcmFtIHshT2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zLiBTZWUgYmVsb3cuCiAq
IEByZXR1cm4geyFBcnJheS48V2ViR0xCdWZmZXI+fSBUaGUgY3JlYXRlZCBidWZmZXJzLgogKiAg
ICAgW3Bvc2l0aW9ucywgPGNvbG9ycz4sIGluZGljZXNdCiAqCiAqIE9wdGlvbnM6CiAqICAgZ3Jp
ZFJlczogbnVtYmVyIG9mIHF1YWRzIGFjcm9zcyBhbmQgZG93biBncmlkLgogKiAgIHBvc2l0aW9u
TG9jYXRpb246IGF0dHJpYiBsb2NhdGlvbiBmb3IgcG9zaXRpb24KICogICBmbGlwT2RkVHJpYW5n
bGVzOiByZXZlcnNlIG9yZGVyIG9mIHZlcnRpY2VzIG9mIGV2ZXJ5IG90aGVyCiAqICAgICAgIHRy
aWFuZ2xlCiAqICAgcG9zaXRpb25PZmZzZXQ6IG9mZnNldCBhZGRlZCB0byBlYWNoIHZlcnRleAog
KiAgIHBvc2l0aW9uTXVsdDogbXVsdGlwaWVyIGZvciBlYWNoIHZlcnRleAogKiAgIGNvbG9yTG9j
YXRpb246IGF0dHJpYiBsb2NhdGlvbiBmb3IgdmVydGV4IGNvbG9ycy4gSWYKICogICAgICB1bmRl
ZmluZWQgbm8gdmVydGV4IGNvbG9ycyB3aWxsIGJlIGNyZWF0ZWQuCiAqLwp2YXIgc2V0dXBJbmRl
eGVkUXVhZFdpdGhPcHRpb25zID0gZnVuY3Rpb24gKGdsLCBvcHRpb25zKSB7CiAgdmFyIHBvc2l0
aW9uTG9jYXRpb24gPSBvcHRpb25zLnBvc2l0aW9uTG9jYXRpb24gfHwgMDsKICB2YXIgb2JqZWN0
cyA9IFtdOwoKICB2YXIgZ3JpZFJlcyA9IG9wdGlvbnMuZ3JpZFJlcyB8fCAxOwogIHZhciBwb3Np
dGlvbk9mZnNldCA9IG9wdGlvbnMucG9zaXRpb25PZmZzZXQgfHwgMDsKICB2YXIgcG9zaXRpb25N
dWx0ID0gb3B0aW9ucy5wb3NpdGlvbk11bHQgfHwgMTsKICB2YXIgdmVydHNBY3Jvc3MgPSBncmlk
UmVzICsgMTsKICB2YXIgbnVtVmVydHMgPSB2ZXJ0c0Fjcm9zcyAqIHZlcnRzQWNyb3NzOwogIHZh
ciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KG51bVZlcnRzICogMyk7CiAgdmFyIGluZGlj
ZXMgPSBuZXcgVWludDE2QXJyYXkoNiAqIGdyaWRSZXMgKiBncmlkUmVzKTsKICB2YXIgcG9mZnNl
dCA9IDA7CgogIGZvciAodmFyIHl5ID0gMDsgeXkgPD0gZ3JpZFJlczsgKyt5eSkgewogICAgZm9y
ICh2YXIgeHggPSAwOyB4eCA8PSBncmlkUmVzOyArK3h4KSB7CiAgICAgIHBvc2l0aW9uc1twb2Zm
c2V0ICsgMF0gPSAoLTEgKyAyICogeHggLyBncmlkUmVzKSAqIHBvc2l0aW9uTXVsdCArIHBvc2l0
aW9uT2Zmc2V0OwogICAgICBwb3NpdGlvbnNbcG9mZnNldCArIDFdID0gKC0xICsgMiAqIHl5IC8g
Z3JpZFJlcykgKiBwb3NpdGlvbk11bHQgKyBwb3NpdGlvbk9mZnNldDsKICAgICAgcG9zaXRpb25z
W3BvZmZzZXQgKyAyXSA9IDA7CgogICAgICBwb2Zmc2V0ICs9IDM7CiAgICB9CiAgfQoKICB2YXIg
YnVmID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIs
IGJ1Zik7CiAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIHBvc2l0aW9ucywgZ2wuU1RB
VElDX0RSQVcpOwogIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uTG9jYXRpb24p
OwogIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIocG9zaXRpb25Mb2NhdGlvbiwgMywgZ2wuRkxPQVQs
IGZhbHNlLCAwLCAwKTsKICBvYmplY3RzLnB1c2goYnVmKTsKCiAgaWYgKG9wdGlvbnMuY29sb3JM
b2NhdGlvbiAhPT0gdW5kZWZpbmVkKSB7CiAgICB2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJBcnJh
eShudW1WZXJ0cyAqIDQpOwogICAgZm9yICh2YXIgeXkgPSAwOyB5eSA8PSBncmlkUmVzOyArK3l5
KSB7CiAgICAgIGZvciAodmFyIHh4ID0gMDsgeHggPD0gZ3JpZFJlczsgKyt4eCkgewogICAgICAg
IGlmIChvcHRpb25zLmNvbG9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbG9yc1twb2Zm
c2V0ICsgMF0gPSBvcHRpb25zLmNvbG9yWzBdOwogICAgICAgICAgY29sb3JzW3BvZmZzZXQgKyAx
XSA9IG9wdGlvbnMuY29sb3JbMV07CiAgICAgICAgICBjb2xvcnNbcG9mZnNldCArIDJdID0gb3B0
aW9ucy5jb2xvclsyXTsKICAgICAgICAgIGNvbG9yc1twb2Zmc2V0ICsgM10gPSBvcHRpb25zLmNv
bG9yWzNdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb2xvcnNbcG9mZnNldCArIDBdID0g
eHggLyBncmlkUmVzOwogICAgICAgICAgY29sb3JzW3BvZmZzZXQgKyAxXSA9IHl5IC8gZ3JpZFJl
czsKICAgICAgICAgIGNvbG9yc1twb2Zmc2V0ICsgMl0gPSAoeHggLyBncmlkUmVzKSAqICh5eSAv
IGdyaWRSZXMpOwogICAgICAgICAgY29sb3JzW3BvZmZzZXQgKyAzXSA9ICh5eSAlIDIpICogMC41
ICsgMC41OwogICAgICAgIH0KICAgICAgICBwb2Zmc2V0ICs9IDQ7CiAgICAgIH0KICAgIH0KCiAg
ICBidWYgPSBnbC5jcmVhdGVCdWZmZXIoKTsKICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVG
RkVSLCBidWYpOwogICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGNvbG9ycywgZ2wu
U1RBVElDX0RSQVcpOwogICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkob3B0aW9ucy5jb2xv
ckxvY2F0aW9uKTsKICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIob3B0aW9ucy5jb2xvckxvY2F0
aW9uLCA0LCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgb2JqZWN0cy5wdXNoKGJ1Zik7CiAg
fQoKICB2YXIgdGJhc2UgPSAwOwogIGZvciAodmFyIHl5ID0gMDsgeXkgPCBncmlkUmVzOyArK3l5
KSB7CiAgICB2YXIgaW5kZXggPSB5eSAqIHZlcnRzQWNyb3NzOwogICAgZm9yICh2YXIgeHggPSAw
OyB4eCA8IGdyaWRSZXM7ICsreHgpIHsKICAgICAgaW5kaWNlc1t0YmFzZSArIDBdID0gaW5kZXgg
KyAwOwogICAgICBpbmRpY2VzW3RiYXNlICsgMV0gPSBpbmRleCArIDE7CiAgICAgIGluZGljZXNb
dGJhc2UgKyAyXSA9IGluZGV4ICsgdmVydHNBY3Jvc3M7CiAgICAgIGluZGljZXNbdGJhc2UgKyAz
XSA9IGluZGV4ICsgdmVydHNBY3Jvc3M7CiAgICAgIGluZGljZXNbdGJhc2UgKyA0XSA9IGluZGV4
ICsgMTsKICAgICAgaW5kaWNlc1t0YmFzZSArIDVdID0gaW5kZXggKyB2ZXJ0c0Fjcm9zcyArIDE7
CgogICAgICBpZiAob3B0aW9ucy5mbGlwT2RkVHJpYW5nbGVzKSB7CiAgICAgICAgaW5kaWNlc1t0
YmFzZSArIDRdID0gaW5kZXggKyB2ZXJ0c0Fjcm9zcyArIDE7CiAgICAgICAgaW5kaWNlc1t0YmFz
ZSArIDVdID0gaW5kZXggKyAxOwogICAgICB9CgogICAgICBpbmRleCArPSAxOwogICAgICB0YmFz
ZSArPSA2OwogICAgfQogIH0KCiAgYnVmID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgZ2wuYmluZEJ1
ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYnVmKTsKICBnbC5idWZmZXJEYXRhKGdsLkVM
RU1FTlRfQVJSQVlfQlVGRkVSLCBpbmRpY2VzLCBnbC5TVEFUSUNfRFJBVyk7CiAgb2JqZWN0cy5w
dXNoKGJ1Zik7CgogIHJldHVybiBvYmplY3RzOwp9OwoKLyoqCiAqIFJldHVybnMgdGhlIGNvbnN0
cnVjdG9yIGZvciBhIHR5cGVkIGFycmF5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuCiAq
IFdlYkdMIHR5cGUuCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgQSBXZWJH
TFJlbmRlcmluZ0NvbnRleHQuCiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIFRoZSBXZWJHTCB0eXBl
IChlZywgZ2wuVU5TSUdORURfQllURSkKICogQHJldHVybiB7IUNvbnN0cnVjdG9yfSBUaGUgdHlw
ZWQgYXJyYXkgY29uc3RydWN0b3IgdGhhdAogKiAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZl
biB0eXBlLgogKi8KdmFyIGdsVHlwZVRvVHlwZWRBcnJheVR5cGUgPSBmdW5jdGlvbihnbCwgdHlw
ZSkgewogIHN3aXRjaCAodHlwZSkgewogICAgY2FzZSBnbC5CWVRFOgogICAgICByZXR1cm4gd2lu
ZG93LkludDhBcnJheTsKICAgIGNhc2UgZ2wuVU5TSUdORURfQllURToKICAgICAgcmV0dXJuIHdp
bmRvdy5VaW50OEFycmF5OwogICAgY2FzZSBnbC5TSE9SVDoKICAgICAgcmV0dXJuIHdpbmRvdy5J
bnQxNkFycmF5OwogICAgY2FzZSBnbC5VTlNJR05FRF9TSE9SVDoKICAgIGNhc2UgZ2wuVU5TSUdO
RURfU0hPUlRfNV82XzU6CiAgICBjYXNlIGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ6CiAgICBj
YXNlIGdsLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE6CiAgICAgIHJldHVybiB3aW5kb3cuVWludDE2
QXJyYXk7CiAgICBjYXNlIGdsLklOVDoKICAgICAgcmV0dXJuIHdpbmRvdy5JbnQzMkFycmF5Owog
ICAgY2FzZSBnbC5VTlNJR05FRF9JTlQ6CiAgICAgIHJldHVybiB3aW5kb3cuVWludDMyQXJyYXk7
CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyAndW5rbm93biBnbCB0eXBlICcgKyBnbEVudW1Ub1N0
cmluZyhnbCwgdHlwZSk7CiAgfQp9OwoKLyoqCiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRl
cyBwZXIgY29tcG9uZW50IGZvciBhIGdpdmVuIFdlYkdMIHR5cGUuCiAqIEBwYXJhbSB7IVdlYkdM
UmVuZGVyaW5nQ29udGV4dH0gZ2wgQSBXZWJHTFJlbmRlcmluZ0NvbnRleHQuCiAqIEBwYXJhbSB7
R0xlbnVtfSB0eXBlIFRoZSBXZWJHTCB0eXBlIChlZywgZ2wuVU5TSUdORURfQllURSkKICogQHJl
dHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBjb21wb25lbnQuCiAqLwp2YXIg
Z2V0Qnl0ZXNQZXJDb21wb25lbnQgPSBmdW5jdGlvbihnbCwgdHlwZSkgewogIHN3aXRjaCAodHlw
ZSkgewogICAgY2FzZSBnbC5CWVRFOgogICAgY2FzZSBnbC5VTlNJR05FRF9CWVRFOgogICAgICBy
ZXR1cm4gMTsKICAgIGNhc2UgZ2wuU0hPUlQ6CiAgICBjYXNlIGdsLlVOU0lHTkVEX1NIT1JUOgog
ICAgY2FzZSBnbC5VTlNJR05FRF9TSE9SVF81XzZfNToKICAgIGNhc2UgZ2wuVU5TSUdORURfU0hP
UlRfNF80XzRfNDoKICAgIGNhc2UgZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMToKICAgICAgcmV0
dXJuIDI7CiAgICBjYXNlIGdsLklOVDoKICAgIGNhc2UgZ2wuVU5TSUdORURfSU5UOgogICAgICBy
ZXR1cm4gNDsKICAgIGRlZmF1bHQ6CiAgICAgIHRocm93ICd1bmtub3duIGdsIHR5cGUgJyArIGds
RW51bVRvU3RyaW5nKGdsLCB0eXBlKTsKICB9Cn07CgovKioKICogUmV0dXJucyB0aGUgbnVtYmVy
IG9mIHR5cGVkIGFycmF5IGVsZW1lbnRzIHBlciBwaXhlbCBmb3IgYSBnaXZlbiBXZWJHTAogKiBm
b3JtYXQvdHlwZSBjb21iaW5hdGlvbi4gVGhlIGNvcnJlc3BvbmRpbmcgdHlwZWQgYXJyYXkgdHlw
ZSBjYW4gYmUgZGV0ZXJtaW5lZAogKiBieSBjYWxsaW5nIGdsVHlwZVRvVHlwZWRBcnJheVR5cGUu
CiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgQSBXZWJHTFJlbmRlcmluZ0Nv
bnRleHQuCiAqIEBwYXJhbSB7R0xlbnVtfSBmb3JtYXQgVGhlIFdlYkdMIGZvcm1hdCAoZWcsIGds
LlJHQkEpCiAqIEBwYXJhbSB7R0xlbnVtfSB0eXBlIFRoZSBXZWJHTCB0eXBlIChlZywgZ2wuVU5T
SUdORURfQllURSkKICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIHR5cGVkIGFycmF5
IGVsZW1lbnRzIHBlciBwaXhlbC4KICovCnZhciBnZXRUeXBlZEFycmF5RWxlbWVudHNQZXJQaXhl
bCA9IGZ1bmN0aW9uKGdsLCBmb3JtYXQsIHR5cGUpIHsKICBzd2l0Y2ggKHR5cGUpIHsKICAgIGNh
c2UgZ2wuVU5TSUdORURfU0hPUlRfNV82XzU6CiAgICBjYXNlIGdsLlVOU0lHTkVEX1NIT1JUXzRf
NF80XzQ6CiAgICBjYXNlIGdsLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE6CiAgICAgIHJldHVybiAx
OwogICAgY2FzZSBnbC5VTlNJR05FRF9CWVRFOgogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAg
ICAgIHRocm93ICdub3QgYSBnbCB0eXBlIGZvciBjb2xvciBpbmZvcm1hdGlvbiAnICsgZ2xFbnVt
VG9TdHJpbmcoZ2wsIHR5cGUpOwogIH0KCiAgc3dpdGNoIChmb3JtYXQpIHsKICAgIGNhc2UgZ2wu
UkdCQToKICAgICAgcmV0dXJuIDQ7CiAgICBjYXNlIGdsLlJHQjoKICAgICAgcmV0dXJuIDM7CiAg
ICBjYXNlIGdsLkxVTUlOQU5DRV9BTFBIQToKICAgICAgcmV0dXJuIDI7CiAgICBjYXNlIGdsLkxV
TUlOQU5DRToKICAgIGNhc2UgZ2wuQUxQSEE6CiAgICAgIHJldHVybiAxOwogICAgZGVmYXVsdDoK
ICAgICAgdGhyb3cgJ3Vua25vd24gZ2wgZm9ybWF0ICcgKyBnbEVudW1Ub1N0cmluZyhnbCwgZm9y
bWF0KTsKICB9Cn07CgovKioKICogRmlsbHMgdGhlIGdpdmVuIHRleHR1cmUgd2l0aCBhIHNvbGlk
IGNvbG9yLgogKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJl
bmRlcmluZ0NvbnRleHQgdG8gdXNlLgogKiBAcGFyYW0geyFXZWJHTFRleHR1cmV9IHRleCBUaGUg
dGV4dHVyZSB0byBmaWxsLgogKiBAcGFyYW0ge251bWJlcn0gd2lkdGggVGhlIHdpZHRoIG9mIHRo
ZSB0ZXh0dXJlIHRvIGNyZWF0ZS4KICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCBUaGUgaGVpZ2h0
IG9mIHRoZSB0ZXh0dXJlIHRvIGNyZWF0ZS4KICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGNv
bG9yIFRoZSBjb2xvciB0byBmaWxsIHdpdGguCiAqICAgICAgICB3aGVyZSBlYWNoIGVsZW1lbnQg
aXMgaW4gdGhlIHJhbmdlIDAgdG8gMjU1LgogKiBAcGFyYW0ge251bWJlcn0gb3B0X2xldmVsIFRo
ZSBsZXZlbCBvZiB0aGUgdGV4dHVyZSB0byBmaWxsLiBEZWZhdWx0ID0gMC4KICogQHBhcmFtIHtu
dW1iZXJ9IG9wdF9mb3JtYXQgVGhlIGZvcm1hdCBmb3IgdGhlIHRleHR1cmUuCiAqIEBwYXJhbSB7
bnVtYmVyfSBvcHRfaW50ZXJuYWxGb3JtYXQgVGhlIGludGVybmFsIGZvcm1hdCBmb3IgdGhlIHRl
eHR1cmUuCiAqLwp2YXIgZmlsbFRleHR1cmUgPSBmdW5jdGlvbihnbCwgdGV4LCB3aWR0aCwgaGVp
Z2h0LCBjb2xvciwgb3B0X2xldmVsLCBvcHRfZm9ybWF0LCBvcHRfdHlwZSwgb3B0X2ludGVybmFs
Rm9ybWF0KSB7CiAgb3B0X2xldmVsID0gb3B0X2xldmVsIHx8IDA7CiAgb3B0X2Zvcm1hdCA9IG9w
dF9mb3JtYXQgfHwgZ2wuUkdCQTsKICBvcHRfdHlwZSA9IG9wdF90eXBlIHx8IGdsLlVOU0lHTkVE
X0JZVEU7CiAgb3B0X2ludGVybmFsRm9ybWF0ID0gb3B0X2ludGVybmFsRm9ybWF0IHx8IG9wdF9m
b3JtYXQ7CiAgdmFyIHBhY2sgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuVU5QQUNLX0FMSUdOTUVOVCk7
CiAgdmFyIG51bUNvbXBvbmVudHMgPSBjb2xvci5sZW5ndGg7CiAgdmFyIGJ5dGVzUGVyQ29tcG9u
ZW50ID0gZ2V0Qnl0ZXNQZXJDb21wb25lbnQoZ2wsIG9wdF90eXBlKTsKICB2YXIgcm93U2l6ZSA9
IG51bUNvbXBvbmVudHMgKiB3aWR0aCAqIGJ5dGVzUGVyQ29tcG9uZW50OwogIHZhciBwYWRkZWRS
b3dTaXplID0gTWF0aC5mbG9vcigocm93U2l6ZSArIHBhY2sgLSAxKSAvIHBhY2spICogcGFjazsK
ICB2YXIgc2l6ZSA9IHJvd1NpemUgKyAoaGVpZ2h0IC0gMSkgKiBwYWRkZWRSb3dTaXplOwogIHNp
emUgPSBNYXRoLmZsb29yKChzaXplICsgYnl0ZXNQZXJDb21wb25lbnQgLSAxKSAvIGJ5dGVzUGVy
Q29tcG9uZW50KSAqIGJ5dGVzUGVyQ29tcG9uZW50OwogIHZhciBidWYgPSBuZXcgKGdsVHlwZVRv
VHlwZWRBcnJheVR5cGUoZ2wsIG9wdF90eXBlKSkoc2l6ZSk7CiAgZm9yICh2YXIgeXkgPSAwOyB5
eSA8IGhlaWdodDsgKyt5eSkgewogICAgdmFyIG9mZiA9IHl5ICogcGFkZGVkUm93U2l6ZTsKICAg
IGZvciAodmFyIHh4ID0gMDsgeHggPCB3aWR0aDsgKyt4eCkgewogICAgICBmb3IgKHZhciBqaiA9
IDA7IGpqIDwgbnVtQ29tcG9uZW50czsgKytqaikgewogICAgICAgIGJ1ZltvZmYrK10gPSBjb2xv
cltqal07CiAgICAgIH0KICAgIH0KICB9CiAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwg
dGV4KTsKICBnbC50ZXhJbWFnZTJEKAogICAgICBnbC5URVhUVVJFXzJELCBvcHRfbGV2ZWwsIG9w
dF9pbnRlcm5hbEZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwKICAgICAgb3B0X2Zvcm1hdCwgb3B0
X3R5cGUsIGJ1Zik7Cn07CgovKioKICogQ3JlYXRlcyBhIHRleHR1cmUgYW5kIGZpbGxzIGl0IHdp
dGggYSBzb2xpZCBjb2xvci4KICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBU
aGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICogQHBhcmFtIHtudW1iZXJ9IHdpZHRo
IFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZSB0byBjcmVhdGUuCiAqIEBwYXJhbSB7bnVtYmVyfSBo
ZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZSB0byBjcmVhdGUuCiAqIEBwYXJhbSB7IUFy
cmF5LjxudW1iZXI+fSBjb2xvciBUaGUgY29sb3IgdG8gZmlsbCB3aXRoLiBBIDQgZWxlbWVudCBh
cnJheQogKiAgICAgICAgd2hlcmUgZWFjaCBlbGVtZW50IGlzIGluIHRoZSByYW5nZSAwIHRvIDI1
NS4KICogQHJldHVybiB7IVdlYkdMVGV4dHVyZX0KICovCnZhciBjcmVhdGVDb2xvcmVkVGV4dHVy
ZSA9IGZ1bmN0aW9uKGdsLCB3aWR0aCwgaGVpZ2h0LCBjb2xvcikgewogIHZhciB0ZXggPSBnbC5j
cmVhdGVUZXh0dXJlKCk7CiAgZmlsbFRleHR1cmUoZ2wsIHRleCwgd2lkdGgsIGhlaWdodCwgY29s
b3IpOwogIHJldHVybiB0ZXg7Cn07Cgp2YXIgdWJ5dGVUb0Zsb2F0ID0gZnVuY3Rpb24oYykgewog
IHJldHVybiBjIC8gMjU1Owp9OwoKdmFyIHVieXRlQ29sb3JUb0Zsb2F0Q29sb3IgPSBmdW5jdGlv
bihjb2xvcikgewogIHZhciBmbG9hdENvbG9yID0gW107CiAgZm9yICh2YXIgaWkgPSAwOyBpaSA8
IGNvbG9yLmxlbmd0aDsgKytpaSkgewogICAgZmxvYXRDb2xvcltpaV0gPSB1Ynl0ZVRvRmxvYXQo
Y29sb3JbaWldKTsKICB9CiAgcmV0dXJuIGZsb2F0Q29sb3I7Cn07CgovKioKICogU2V0cyB0aGUg
InVfY29sb3IiIHVuaWZvcm0gb2YgdGhlIGN1cnJlbnQgcHJvZ3JhbSB0byBjb2xvci4KICogQHBh
cmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0
IHRvIHVzZS4KICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGNvbG9yIDQgZWxlbWVudCBhcnJh
eSBvZiAwLTEgY29sb3IKICogICAgICBjb21wb25lbnRzLgogKi8KdmFyIHNldEZsb2F0RHJhd0Nv
bG9yID0gZnVuY3Rpb24oZ2wsIGNvbG9yKSB7CiAgdmFyIHByb2dyYW0gPSBnbC5nZXRQYXJhbWV0
ZXIoZ2wuQ1VSUkVOVF9QUk9HUkFNKTsKICB2YXIgY29sb3JMb2NhdGlvbiA9IGdsLmdldFVuaWZv
cm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb2xvciIpOwogIGdsLnVuaWZvcm00ZnYoY29sb3JMb2Nh
dGlvbiwgY29sb3IpOwp9OwoKLyoqCiAqIFNldHMgdGhlICJ1X2NvbG9yIiB1bmlmb3JtIG9mIHRo
ZSBjdXJyZW50IHByb2dyYW0gdG8gY29sb3IuCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29u
dGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7IUFy
cmF5LjxudW1iZXI+fSBjb2xvciA0IGVsZW1lbnQgYXJyYXkgb2YgMC0yNTUgY29sb3IKICogICAg
ICBjb21wb25lbnRzLgogKi8KdmFyIHNldFVCeXRlRHJhd0NvbG9yID0gZnVuY3Rpb24oZ2wsIGNv
bG9yKSB7CiAgc2V0RmxvYXREcmF3Q29sb3IoZ2wsIHVieXRlQ29sb3JUb0Zsb2F0Q29sb3IoY29s
b3IpKTsKfTsKCi8qKgogKiBEcmF3cyBhIHByZXZpb3VzbHkgc2V0dXAgcXVhZCBpbiB0aGUgZ2l2
ZW4gY29sb3IuCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdM
UmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBjb2xv
ciBUaGUgY29sb3IgdG8gZHJhdyB3aXRoLiBBIDQKICogICAgICAgIGVsZW1lbnQgYXJyYXkgd2hl
cmUgZWFjaCBlbGVtZW50IGlzIGluIHRoZSByYW5nZSAwIHRvCiAqICAgICAgICAxLgogKi8KdmFy
IGRyYXdGbG9hdENvbG9yUXVhZCA9IGZ1bmN0aW9uKGdsLCBjb2xvcikgewogIHZhciBwcm9ncmFt
ID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLkNVUlJFTlRfUFJPR1JBTSk7CiAgdmFyIGNvbG9yTG9jYXRp
b24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfY29sb3IiKTsKICBnbC51bmlm
b3JtNGZ2KGNvbG9yTG9jYXRpb24sIGNvbG9yKTsKICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xF
UywgMCwgNik7Cn07CgoKLyoqCiAqIERyYXdzIGEgcHJldmlvdXNseSBzZXR1cCBxdWFkIGluIHRo
ZSBnaXZlbiBjb2xvci4KICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUg
V2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59
IGNvbG9yIFRoZSBjb2xvciB0byBkcmF3IHdpdGguIEEgNAogKiAgICAgICAgZWxlbWVudCBhcnJh
eSB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgaW4gdGhlIHJhbmdlIDAgdG8KICogICAgICAgIDI1NS4K
ICovCnZhciBkcmF3VUJ5dGVDb2xvclF1YWQgPSBmdW5jdGlvbihnbCwgY29sb3IpIHsKICBkcmF3
RmxvYXRDb2xvclF1YWQoZ2wsIHVieXRlQ29sb3JUb0Zsb2F0Q29sb3IoY29sb3IpKTsKfTsKCi8q
KgogKiBEcmF3cyBhIHByZXZpb3VzbHkgc2V0dXBVbml0UXVhZC4KICogQHBhcmFtIHshV2ViR0xS
ZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICov
CnZhciBkcmF3VW5pdFF1YWQgPSBmdW5jdGlvbihnbCkgewogIGdsLmRyYXdBcnJheXMoZ2wuVFJJ
QU5HTEVTLCAwLCA2KTsKfTsKCi8qKgogKiBDbGVhcnMgdGhlbiBEcmF3cyBhIHByZXZpb3VzbHkg
c2V0dXBVbml0UXVhZC4KICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUg
V2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59
IG9wdF9jb2xvciBUaGUgY29sb3IgdG8gZmlsbCBjbGVhciB3aXRoIGJlZm9yZQogKiAgICAgICAg
ZHJhd2luZy4gQSA0IGVsZW1lbnQgYXJyYXkgd2hlcmUgZWFjaCBlbGVtZW50IGlzIGluIHRoZSBy
YW5nZSAwIHRvCiAqICAgICAgICAyNTUuIERlZmF1bHQgWzI1NSwgMjU1LCAyNTUsIDI1NV0KICov
CnZhciBjbGVhckFuZERyYXdVbml0UXVhZCA9IGZ1bmN0aW9uKGdsLCBvcHRfY29sb3IpIHsKICBv
cHRfY29sb3IgPSBvcHRfY29sb3IgfHwgWzI1NSwgMjU1LCAyNTUsIDI1NV07CiAgZ2wuY2xlYXJD
b2xvcigKICAgICAgb3B0X2NvbG9yWzBdIC8gMjU1LAogICAgICBvcHRfY29sb3JbMV0gLyAyNTUs
CiAgICAgIG9wdF9jb2xvclsyXSAvIDI1NSwKICAgICAgb3B0X2NvbG9yWzNdIC8gMjU1KTsKICBn
bC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCk7CiAgZHJh
d1VuaXRRdWFkKGdsKTsKfTsKCi8qKgogKiBEcmF3cyBhIHF1YWQgcHJldmlvdXNseSBzZXR1cCB3
aXRoIHNldHVwSW5kZXhlZFF1YWQuCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0g
Z2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7bnVtYmVyfSBn
cmlkUmVzIFJlc29sdXRpb24gb2YgZ3JpZC4KICovCnZhciBkcmF3SW5kZXhlZFF1YWQgPSBmdW5j
dGlvbihnbCwgZ3JpZFJlcykgewogIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIGdyaWRS
ZXMgKiBncmlkUmVzICogNiwgZ2wuVU5TSUdORURfU0hPUlQsIDApOwp9OwoKLyoqCiAqIERyYXdz
IGEgcHJldmlvdXNseSBzZXR1cEluZGV4ZWRRdWFkCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5n
Q29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7
bnVtYmVyfSBncmlkUmVzIFJlc29sdXRpb24gb2YgZ3JpZC4KICogQHBhcmFtIHshQXJyYXkuPG51
bWJlcj59IG9wdF9jb2xvciBUaGUgY29sb3IgdG8gZmlsbCBjbGVhciB3aXRoIGJlZm9yZQogKiAg
ICAgICAgZHJhd2luZy4gQSA0IGVsZW1lbnQgYXJyYXkgd2hlcmUgZWFjaCBlbGVtZW50IGlzIGlu
IHRoZSByYW5nZSAwIHRvCiAqICAgICAgICAyNTUuIERlZmF1bHQgWzI1NSwgMjU1LCAyNTUsIDI1
NV0KICovCnZhciBjbGVhckFuZERyYXdJbmRleGVkUXVhZCA9IGZ1bmN0aW9uKGdsLCBncmlkUmVz
LCBvcHRfY29sb3IpIHsKICBvcHRfY29sb3IgPSBvcHRfY29sb3IgfHwgWzI1NSwgMjU1LCAyNTUs
IDI1NV07CiAgZ2wuY2xlYXJDb2xvcigKICAgICAgb3B0X2NvbG9yWzBdIC8gMjU1LAogICAgICBv
cHRfY29sb3JbMV0gLyAyNTUsCiAgICAgIG9wdF9jb2xvclsyXSAvIDI1NSwKICAgICAgb3B0X2Nv
bG9yWzNdIC8gMjU1KTsKICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhf
QlVGRkVSX0JJVCk7CiAgZHJhd0luZGV4ZWRRdWFkKGdsLCBncmlkUmVzKTsKfTsKCi8qKgogKiBD
bGlwcyBhIHJhbmdlIHRvIG1pbiwgbWF4CiAqIChFZy4gY2xpcFRvUmFuZ2UoLTUsNywwLDIwKSB3
b3VsZCByZXR1cm4ge3ZhbHVlOjAsZXh0ZW50OjJ9CiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBz
dGFydCBvZiByYW5nZQogKiBAcGFyYW0ge251bWJlcn0gZXh0ZW50IGV4dGVudCBvZiByYW5nZQog
KiBAcGFyYW0ge251bWJlcn0gbWluIG1pbi4KICogQHBhcmFtIHtudW1iZXJ9IG1heCBtYXguCiAq
IEByZXR1cm4geyF7dmFsdWU6bnVtYmVyLGV4dGVudDpudW1iZXJ9fSBUaGUgY2xpcHBlZCB2YWx1
ZS4KICovCnZhciBjbGlwVG9SYW5nZSA9IGZ1bmN0aW9uKHZhbHVlLCBleHRlbnQsIG1pbiwgbWF4
KSB7CiAgaWYgKHZhbHVlIDwgbWluKSB7CiAgICBleHRlbnQgLT0gbWluIC0gdmFsdWU7CiAgICB2
YWx1ZSA9IG1pbjsKICB9CiAgdmFyIGVuZCA9IHZhbHVlICsgZXh0ZW50OwogIGlmIChlbmQgPiBt
YXgpIHsKICAgIGV4dGVudCAtPSBlbmQgLSBtYXg7CiAgfQogIGlmIChleHRlbnQgPCAwKSB7CiAg
ICB2YWx1ZSA9IG1heDsKICAgIGV4dGVudCA9IDA7CiAgfQogIHJldHVybiB7dmFsdWU6dmFsdWUs
IGV4dGVudDogZXh0ZW50fTsKfTsKCi8qKgogKiBEZXRlcm1pbmVzIGlmIHRoZSBwYXNzZWQgY29u
dGV4dCBpcyBhbiBpbnN0YW5jZSBvZiBhIFdlYkdMUmVuZGVyaW5nQ29udGV4dAogKiBvciBsYXRl
ciB2YXJpYW50IChsaWtlIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQpCiAqIEBwYXJhbSB7Q2FudmFz
UmVuZGVyaW5nQ29udGV4dH0gY3R4IFRoZSBjb250ZXh0IHRvIGNoZWNrLgogKi8KdmFyIGlzV2Vi
R0xDb250ZXh0ID0gZnVuY3Rpb24oY3R4KSB7CiAgaWYgKGN0eCBpbnN0YW5jZW9mIFdlYkdMUmVu
ZGVyaW5nQ29udGV4dCkKICAgIHJldHVybiB0cnVlOwoKICBpZiAoJ1dlYkdMMlJlbmRlcmluZ0Nv
bnRleHQnIGluIHdpbmRvdyAmJiBjdHggaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0
KQogICAgcmV0dXJuIHRydWU7CgogIHJldHVybiBmYWxzZTsKfTsKCi8qKgogKiBDcmVhdGVzIGEg
Y2hlY2sgcmVjdCBpcyB1c2VkIGJ5IGNoZWNrQ2FudmFzUmVjdHMuCiAqIEBwYXJhbSB7bnVtYmVy
fSB4IGxlZnQgY29ybmVyIG9mIHJlZ2lvbiB0byBjaGVjay4KICogQHBhcmFtIHtudW1iZXJ9IHkg
Ym90dG9tIGNvcm5lciBvZiByZWdpb24gdG8gY2hlY2sgaW4gY2FzZSBvZiBjaGVja2luZyBmcm9t
CiAqICAgICAgICBhIEdMIGNvbnRleHQgb3IgdG9wIGNvcm5lciBpbiBjYXNlIG9mIGNoZWNraW5n
IGZyb20gYSAyRCBjb250ZXh0LgogKiBAcGFyYW0ge251bWJlcn0gd2lkdGggd2lkdGggb2YgcmVn
aW9uIHRvIGNoZWNrLgogKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IHdpZHRoIG9mIHJlZ2lvbiB0
byBjaGVjay4KICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGNvbG9yIFRoZSBjb2xvciBleHBl
Y3RlZC4gQSA0IGVsZW1lbnQgYXJyYXkgd2hlcmUKICogICAgICAgIGVhY2ggZWxlbWVudCBpcyBp
biB0aGUgcmFuZ2UgMCB0byAyNTUuCiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRfbXNnIE1lc3NhZ2Ug
dG8gYXNzb2NpYXRlIHdpdGggc3VjY2Vzcy4gRWcKICogICAgICAgICgic2hvdWxkIGJlIHJlZCIp
LgogKiBAcGFyYW0ge251bWJlcn0gb3B0X2Vycm9yUmFuZ2UgT3B0aW9uYWwuIEFjY2VwdGFibGUg
ZXJyb3IgaW4KICogICAgICAgIGNvbG9yIGNoZWNraW5nLiAwIGJ5IGRlZmF1bHQuCiAqLwp2YXIg
bWFrZUNoZWNrUmVjdCA9IGZ1bmN0aW9uKHgsIHksIHdpZHRoLCBoZWlnaHQsIGNvbG9yLCBtc2cs
IGVycm9yUmFuZ2UpIHsKICB2YXIgcmVjdCA9IHsKICAgICd4JzogeCwgJ3knOiB5LAogICAgJ3dp
ZHRoJzogd2lkdGgsICdoZWlnaHQnOiBoZWlnaHQsCiAgICAnY29sb3InOiBjb2xvciwgJ21zZyc6
IG1zZywKICAgICdlcnJvclJhbmdlJzogZXJyb3JSYW5nZSwKCiAgICAnY2hlY2tSZWN0JzogZnVu
Y3Rpb24gKGJ1ZiwgbCwgYiwgdykgewogICAgICBmb3IgKHZhciBweCA9ICh4IC0gbCkgOyBweCA8
ICh4ICsgd2lkdGggLSBsKSA7ICsrcHgpIHsKICAgICAgICBmb3IgKHZhciBweSA9ICh5IC0gYikg
OyBweSA8ICh5ICsgaGVpZ2h0IC0gYikgOyArK3B5KSB7CiAgICAgICAgICB2YXIgb2Zmc2V0ID0g
KHB5ICogdyArIHB4KSAqIDQ7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbG9yLmxl
bmd0aDsgKytqKSB7CiAgICAgICAgICAgIGlmIChNYXRoLmFicyhidWZbb2Zmc2V0ICsgal0gLSBj
b2xvcltqXSkgPiBlcnJvclJhbmdlKSB7CiAgICAgICAgICAgICAgdGVzdEZhaWxlZChtc2cpOwog
ICAgICAgICAgICAgIHZhciB3YXMgPSBidWZbb2Zmc2V0ICsgMF0udG9TdHJpbmcoKTsKICAgICAg
ICAgICAgICBmb3IgKGogPSAxOyBqIDwgY29sb3IubGVuZ3RoOyArK2opIHsKICAgICAgICAgICAg
ICAgIHdhcyArPSAiLCIgKyBidWZbb2Zmc2V0ICsgal07CiAgICAgICAgICAgICAgfQogICAgICAg
ICAgICAgIGRlYnVnKCdhdCAoJyArIHB4ICsgJywgJyArIHB5ICsKICAgICAgICAgICAgICAgICAg
ICAnKSBleHBlY3RlZDogJyArIGNvbG9yICsgJyB3YXMgJyArIHdhcyk7CiAgICAgICAgICAgICAg
cmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAg
IHRlc3RQYXNzZWQobXNnKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlY3Q7Cn07CgovKioKICogQ2hl
Y2tzIHRoYXQgYSBwb3J0aW9ucyBvZiBhIGNhbnZhcyBvciB0aGUgY3VycmVudGx5IGF0dGFjaGVk
IGZyYW1lYnVmZmVyIGlzIDEgY29sb3IuCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4
dHxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGdsIFRoZQogKiAgICAgICAgIFdlYkdMUmVuZGVy
aW5nQ29udGV4dCBvciAyRCBjb250ZXh0IHRvIHVzZS4KICogQHBhcmFtIHshQXJyYXkuPGNoZWNr
UmVjdD59IGFycmF5IG9mIHJlY3RzIHRvIGNoZWNrIGZvciBtYXRjaGluZyBjb2xvci4KICovCnZh
ciBjaGVja0NhbnZhc1JlY3RzID0gZnVuY3Rpb24oZ2wsIHJlY3RzKSB7CiAgaWYgKHJlY3RzLmxl
bmd0aCA+IDApIHsKICAgIHZhciBsZWZ0ID0gcmVjdHNbMF0ueDsKICAgIHZhciByaWdodCA9IHJl
Y3RzWzBdLnggKyByZWN0c1sxXS53aWR0aDsKICAgIHZhciBib3R0b20gPSByZWN0c1swXS55Owog
ICAgdmFyIHRvcCA9IHJlY3RzWzBdLnkgKyByZWN0c1swXS5oZWlnaHQ7CiAgICBmb3IgKHZhciBp
ID0gMTsgaSA8IHJlY3RzLmxlbmd0aDsgKytpKSB7CiAgICAgIGxlZnQgPSBNYXRoLm1pbihsZWZ0
LCByZWN0c1tpXS54KTsKICAgICAgcmlnaHQgPSBNYXRoLm1heChyaWdodCwgcmVjdHNbaV0ueCAr
IHJlY3RzW2ldLndpZHRoKTsKICAgICAgYm90dG9tID0gTWF0aC5taW4oYm90dG9tLCByZWN0c1tp
XS55KTsKICAgICAgdG9wID0gTWF0aC5tYXgodG9wLCByZWN0c1tpXS55ICsgcmVjdHNbaV0uaGVp
Z2h0KTsKICAgIH0KICAgIHZhciB3aWR0aCA9IHJpZ2h0IC0gbGVmdDsKICAgIHZhciBoZWlnaHQg
PSB0b3AgLSBib3R0b207CiAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWln
aHQgKiA0KTsKICAgIGdsLnJlYWRQaXhlbHMobGVmdCwgYm90dG9tLCB3aWR0aCwgaGVpZ2h0LCBn
bC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBidWYpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBy
ZWN0cy5sZW5ndGg7ICsraSkgewogICAgICByZWN0c1tpXS5jaGVja1JlY3QoYnVmLCBsZWZ0LCBi
b3R0b20sIHdpZHRoKTsKICAgIH0KICB9Cn07CgovKioKICogQ2hlY2tzIHRoYXQgYSBwb3J0aW9u
IG9mIGEgY2FudmFzIG9yIHRoZSBjdXJyZW50bHkgYXR0YWNoZWQgZnJhbWVidWZmZXIgaXMgMSBj
b2xvci4KICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fENhbnZhc1JlbmRlcmluZ0Nv
bnRleHQyRH0gZ2wgVGhlCiAqICAgICAgICAgV2ViR0xSZW5kZXJpbmdDb250ZXh0IG9yIDJEIGNv
bnRleHQgdG8gdXNlLgogKiBAcGFyYW0ge251bWJlcn0geCBsZWZ0IGNvcm5lciBvZiByZWdpb24g
dG8gY2hlY2suCiAqIEBwYXJhbSB7bnVtYmVyfSB5IGJvdHRvbSBjb3JuZXIgb2YgcmVnaW9uIHRv
IGNoZWNrIGluIGNhc2Ugb2YgY2hlY2tpbmcgZnJvbQogKiAgICAgICAgYSBHTCBjb250ZXh0IG9y
IHRvcCBjb3JuZXIgaW4gY2FzZSBvZiBjaGVja2luZyBmcm9tIGEgMkQgY29udGV4dC4KICogQHBh
cmFtIHtudW1iZXJ9IHdpZHRoIHdpZHRoIG9mIHJlZ2lvbiB0byBjaGVjay4KICogQHBhcmFtIHtu
dW1iZXJ9IGhlaWdodCB3aWR0aCBvZiByZWdpb24gdG8gY2hlY2suCiAqIEBwYXJhbSB7IUFycmF5
LjxudW1iZXI+fSBjb2xvciBUaGUgY29sb3IgZXhwZWN0ZWQuIEEgNCBlbGVtZW50IGFycmF5IHdo
ZXJlCiAqICAgICAgICBlYWNoIGVsZW1lbnQgaXMgaW4gdGhlIHJhbmdlIDAgdG8gMjU1LgogKiBA
cGFyYW0ge251bWJlcn0gb3B0X2Vycm9yUmFuZ2UgT3B0aW9uYWwuIEFjY2VwdGFibGUgZXJyb3Ig
aW4KICogICAgICAgIGNvbG9yIGNoZWNraW5nLiAwIGJ5IGRlZmF1bHQuCiAqIEBwYXJhbSB7IWZ1
bmN0aW9uKCl9IHNhbWVGbiBGdW5jdGlvbiB0byBjYWxsIGlmIGFsbCBwaXhlbHMKICogICAgICAg
IGFyZSB0aGUgc2FtZSBhcyBjb2xvci4KICogQHBhcmFtIHshZnVuY3Rpb24oKX0gZGlmZmVyZW50
Rm4gRnVuY3Rpb24gdG8gY2FsbCBpZiBhIHBpeGVsCiAqICAgICAgICBpcyBkaWZmZXJlbnQgdGhh
biBjb2xvcgogKiBAcGFyYW0geyFmdW5jdGlvbigpfSBsb2dGbiBGdW5jdGlvbiB0byBjYWxsIGZv
ciBsb2dnaW5nLgogKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IG9wdF9yZWFkQmFja0J1ZiB0eXBpY2Fs
bHkgcGFzc2VkIHRvIHJldXNlIGV4aXN0aW5nCiAqICAgICAgICBidWZmZXIgd2hpbGUgcmVhZGlu
ZyBiYWNrIHBpeGVscy4KICovCnZhciBjaGVja0NhbnZhc1JlY3RDb2xvciA9IGZ1bmN0aW9uKGds
LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjb2xvciwgb3B0X2Vycm9yUmFuZ2UsIHNhbWVGbiwgZGlm
ZmVyZW50Rm4sIGxvZ0ZuLCBvcHRfcmVhZEJhY2tCdWYpIHsKICBpZiAoaXNXZWJHTENvbnRleHQo
Z2wpICYmICFnbC5nZXRQYXJhbWV0ZXIoZ2wuRlJBTUVCVUZGRVJfQklORElORykpIHsKICAgIC8v
IFdlJ3JlIHJlYWRpbmcgdGhlIGJhY2tidWZmZXIgc28gY2xpcC4KICAgIHZhciB4ciA9IGNsaXBU
b1JhbmdlKHgsIHdpZHRoLCAwLCBnbC5jYW52YXMud2lkdGgpOwogICAgdmFyIHlyID0gY2xpcFRv
UmFuZ2UoeSwgaGVpZ2h0LCAwLCBnbC5jYW52YXMuaGVpZ2h0KTsKICAgIGlmICgheHIuZXh0ZW50
IHx8ICF5ci5leHRlbnQpIHsKICAgICAgbG9nRm4oImNoZWNraW5nIHJlY3Q6IGVmZmVjdGl2ZSB3
aWR0aCBvciBoZWlnaHQgaXMgemVybyIpOwogICAgICBzYW1lRm4oKTsKICAgICAgcmV0dXJuOwog
ICAgfQogICAgeCA9IHhyLnZhbHVlOwogICAgeSA9IHlyLnZhbHVlOwogICAgd2lkdGggPSB4ci5l
eHRlbnQ7CiAgICBoZWlnaHQgPSB5ci5leHRlbnQ7CiAgfQogIHZhciBlcnJvclJhbmdlID0gb3B0
X2Vycm9yUmFuZ2UgfHwgMDsKICBpZiAoIWVycm9yUmFuZ2UubGVuZ3RoKSB7CiAgICBlcnJvclJh
bmdlID0gW2Vycm9yUmFuZ2UsIGVycm9yUmFuZ2UsIGVycm9yUmFuZ2UsIGVycm9yUmFuZ2VdCiAg
fQogIHZhciBidWY7CiAgaWYgKGlzV2ViR0xDb250ZXh0KGdsKSkgewogICAgYnVmID0gb3B0X3Jl
YWRCYWNrQnVmID8gb3B0X3JlYWRCYWNrQnVmIDogbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWln
aHQgKiA0KTsKICAgIGdsLnJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZ2wuUkdCQSwg
Z2wuVU5TSUdORURfQllURSwgYnVmKTsKICB9IGVsc2UgewogICAgYnVmID0gZ2wuZ2V0SW1hZ2VE
YXRhKHgsIHksIHdpZHRoLCBoZWlnaHQpLmRhdGE7CiAgfQogIGZvciAodmFyIGkgPSAwOyBpIDwg
d2lkdGggKiBoZWlnaHQ7ICsraSkgewogICAgdmFyIG9mZnNldCA9IGkgKiA0OwogICAgZm9yICh2
YXIgaiA9IDA7IGogPCBjb2xvci5sZW5ndGg7ICsraikgewogICAgICBpZiAoTWF0aC5hYnMoYnVm
W29mZnNldCArIGpdIC0gY29sb3Jbal0pID4gZXJyb3JSYW5nZVtqXSkgewogICAgICAgIHZhciB3
YXMgPSBidWZbb2Zmc2V0ICsgMF0udG9TdHJpbmcoKTsKICAgICAgICBmb3IgKGogPSAxOyBqIDwg
Y29sb3IubGVuZ3RoOyArK2opIHsKICAgICAgICAgIHdhcyArPSAiLCIgKyBidWZbb2Zmc2V0ICsg
al07CiAgICAgICAgfQogICAgICAgIGRpZmZlcmVudEZuKCdhdCAoJyArICh4ICsgKGkgJSB3aWR0
aCkpICsgJywgJyArICh5ICsgTWF0aC5mbG9vcihpIC8gd2lkdGgpKSArCiAgICAgICAgICAgICAg
ICAgICAgJykgZXhwZWN0ZWQ6ICcgKyBjb2xvciArICcgd2FzICcgKyB3YXMpOwogICAgICAgIHJl
dHVybjsKICAgICAgfQogICAgfQogIH0KICBzYW1lRm4oKTsKfTsKCi8qKgogKiBDaGVja3MgdGhh
dCBhIHBvcnRpb24gb2YgYSBjYW52YXMgb3IgdGhlIGN1cnJlbnRseSBhdHRhY2hlZCBmcmFtZWJ1
ZmZlciBpcyAxIGNvbG9yLgogKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR8Q2FudmFz
UmVuZGVyaW5nQ29udGV4dDJEfSBnbCBUaGUKICogICAgICAgICBXZWJHTFJlbmRlcmluZ0NvbnRl
eHQgb3IgMkQgY29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7bnVtYmVyfSB4IGxlZnQgY29ybmVy
IG9mIHJlZ2lvbiB0byBjaGVjay4KICogQHBhcmFtIHtudW1iZXJ9IHkgYm90dG9tIGNvcm5lciBv
ZiByZWdpb24gdG8gY2hlY2sgaW4gY2FzZSBvZiBjaGVja2luZyBmcm9tCiAqICAgICAgICBhIEdM
IGNvbnRleHQgb3IgdG9wIGNvcm5lciBpbiBjYXNlIG9mIGNoZWNraW5nIGZyb20gYSAyRCBjb250
ZXh0LgogKiBAcGFyYW0ge251bWJlcn0gd2lkdGggd2lkdGggb2YgcmVnaW9uIHRvIGNoZWNrLgog
KiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IHdpZHRoIG9mIHJlZ2lvbiB0byBjaGVjay4KICogQHBh
cmFtIHshQXJyYXkuPG51bWJlcj59IGNvbG9yIFRoZSBjb2xvciBleHBlY3RlZC4gQSA0IGVsZW1l
bnQgYXJyYXkgd2hlcmUKICogICAgICAgIGVhY2ggZWxlbWVudCBpcyBpbiB0aGUgcmFuZ2UgMCB0
byAyNTUuCiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRfbXNnIE1lc3NhZ2UgdG8gYXNzb2NpYXRlIHdp
dGggc3VjY2VzcyBvciBmYWlsdXJlLiBFZwogKiAgICAgICAgKCJzaG91bGQgYmUgcmVkIikuCiAq
IEBwYXJhbSB7bnVtYmVyfSBvcHRfZXJyb3JSYW5nZSBPcHRpb25hbC4gQWNjZXB0YWJsZSBlcnJv
ciBpbgogKiAgICAgICAgY29sb3IgY2hlY2tpbmcuIDAgYnkgZGVmYXVsdC4KICovCnZhciBjaGVj
a0NhbnZhc1JlY3QgPSBmdW5jdGlvbihnbCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgY29sb3IsIG9w
dF9tc2csIG9wdF9lcnJvclJhbmdlKSB7CiAgY2hlY2tDYW52YXNSZWN0Q29sb3IoCiAgICAgIGds
LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjb2xvciwgb3B0X2Vycm9yUmFuZ2UsCiAgICAgIGZ1bmN0
aW9uKCkgewogICAgICAgIHZhciBtc2cgPSBvcHRfbXNnOwogICAgICAgIGlmIChtc2cgPT09IHVu
ZGVmaW5lZCkKICAgICAgICAgIG1zZyA9ICJzaG91bGQgYmUgIiArIGNvbG9yLnRvU3RyaW5nKCk7
CiAgICAgICAgdGVzdFBhc3NlZChtc2cpOwogICAgICB9LAogICAgICBmdW5jdGlvbihkaWZmZXJl
bnRNc2cpIHsKICAgICAgICB2YXIgbXNnID0gb3B0X21zZzsKICAgICAgICBpZiAobXNnID09PSB1
bmRlZmluZWQpCiAgICAgICAgICBtc2cgPSAic2hvdWxkIGJlICIgKyBjb2xvci50b1N0cmluZygp
OwogICAgICAgIHRlc3RGYWlsZWQobXNnICsgIlxuIiArIGRpZmZlcmVudE1zZyk7CiAgICAgIH0s
CiAgICAgIGRlYnVnKTsKfTsKCi8qKgogKiBDaGVja3MgdGhhdCBhbiBlbnRpcmUgY2FudmFzIG9y
IHRoZSBjdXJyZW50bHkgYXR0YWNoZWQgZnJhbWVidWZmZXIgaXMgMSBjb2xvci4KICogQHBhcmFt
IHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gZ2wgVGhl
CiAqICAgICAgICAgV2ViR0xSZW5kZXJpbmdDb250ZXh0IG9yIDJEIGNvbnRleHQgdG8gdXNlLgog
KiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gY29sb3IgVGhlIGNvbG9yIGV4cGVjdGVkLiBBIDQg
ZWxlbWVudCBhcnJheSB3aGVyZQogKiAgICAgICAgZWFjaCBlbGVtZW50IGlzIGluIHRoZSByYW5n
ZSAwIHRvIDI1NS4KICogQHBhcmFtIHtzdHJpbmd9IG1zZyBNZXNzYWdlIHRvIGFzc29jaWF0ZSB3
aXRoIHN1Y2Nlc3MuIEVnICgic2hvdWxkIGJlIHJlZCIpLgogKiBAcGFyYW0ge251bWJlcn0gZXJy
b3JSYW5nZSBPcHRpb25hbC4gQWNjZXB0YWJsZSBlcnJvciBpbgogKiAgICAgICAgY29sb3IgY2hl
Y2tpbmcuIDAgYnkgZGVmYXVsdC4KICovCnZhciBjaGVja0NhbnZhcyA9IGZ1bmN0aW9uKGdsLCBj
b2xvciwgbXNnLCBlcnJvclJhbmdlKSB7CiAgY2hlY2tDYW52YXNSZWN0KGdsLCAwLCAwLCBnbC5j
YW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQsIGNvbG9yLCBtc2csIGVycm9yUmFuZ2UpOwp9
OwoKLyoqCiAqIENoZWNrcyBhIHJlY3Rhbmd1bGFyIGFyZWEgYm90aCBpbnNpZGUgdGhlIGFyZWEg
YW5kIG91dHNpZGUKICogdGhlIGFyZWEuCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4
dHxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGdsIFRoZQogKiAgICAgICAgIFdlYkdMUmVuZGVy
aW5nQ29udGV4dCBvciAyRCBjb250ZXh0IHRvIHVzZS4KICogQHBhcmFtIHtudW1iZXJ9IHggbGVm
dCBjb3JuZXIgb2YgcmVnaW9uIHRvIGNoZWNrLgogKiBAcGFyYW0ge251bWJlcn0geSBib3R0b20g
Y29ybmVyIG9mIHJlZ2lvbiB0byBjaGVjayBpbiBjYXNlIG9mIGNoZWNraW5nIGZyb20KICogICAg
ICAgIGEgR0wgY29udGV4dCBvciB0b3AgY29ybmVyIGluIGNhc2Ugb2YgY2hlY2tpbmcgZnJvbSBh
IDJEIGNvbnRleHQuCiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCB3aWR0aCBvZiByZWdpb24gdG8g
Y2hlY2suCiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgd2lkdGggb2YgcmVnaW9uIHRvIGNoZWNr
LgogKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gaW5uZXJDb2xvciBUaGUgY29sb3IgZXhwZWN0
ZWQgaW5zaWRlCiAqICAgICB0aGUgYXJlYS4gQSA0IGVsZW1lbnQgYXJyYXkgd2hlcmUgZWFjaCBl
bGVtZW50IGlzIGluIHRoZQogKiAgICAgcmFuZ2UgMCB0byAyNTUuCiAqIEBwYXJhbSB7IUFycmF5
LjxudW1iZXI+fSBvdXRlckNvbG9yIFRoZSBjb2xvciBleHBlY3RlZAogKiAgICAgb3V0c2lkZS4g
QSA0IGVsZW1lbnQgYXJyYXkgd2hlcmUgZWFjaCBlbGVtZW50IGlzIGluIHRoZQogKiAgICAgcmFu
Z2UgMCB0byAyNTUuCiAqIEBwYXJhbSB7IW51bWJlcn0gb3B0X2VkZ2VTaXplOiBUaGUgbnVtYmVy
IG9mIHBpeGVscyB0byBza2lwCiAqICAgICBhcm91bmQgdGhlIGVkZ2VzIG9mIHRoZSBhcmVhLiBE
ZWZhdXQgMC4KICogQHBhcmFtIHshe3dpZHRoOm51bWJlciwgaGVpZ2h0Om51bWJlcn19IG9wdF9v
dXRlckRpbWVuc2lvbnMKICogICAgIFRoZSBvdXRlciBkaW1lbnNpb25zLiBEZWZhdWx0IHRoZSBz
aXplIG9mIGdsLmNhbnZhcy4KICovCnZhciBjaGVja0FyZWFJbkFuZE91dCA9IGZ1bmN0aW9uKGds
LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBpbm5lckNvbG9yLCBvdXRlckNvbG9yLCBvcHRfZWRnZVNp
emUsIG9wdF9vdXRlckRpbWVuc2lvbnMpIHsKICB2YXIgb3V0ZXJEaW1lbnNpb25zID0gb3B0X291
dGVyRGltZW5zaW9ucyB8fCB7IHdpZHRoOiBnbC5jYW52YXMud2lkdGgsIGhlaWdodDogZ2wuY2Fu
dmFzLmhlaWdodCB9OwogIHZhciBlZGdlU2l6ZSA9IG9wdF9lZGdlU2l6ZSB8fCAwOwogIGNoZWNr
Q2FudmFzUmVjdChnbCwgeCArIGVkZ2VTaXplLCB5ICsgZWRnZVNpemUsIHdpZHRoIC0gZWRnZVNp
emUgKiAyLCBoZWlnaHQgLSBlZGdlU2l6ZSAqIDIsIGlubmVyQ29sb3IpOwogIGNoZWNrQ2FudmFz
UmVjdChnbCwgMCwgMCwgeCAtIGVkZ2VTaXplLCBvdXRlckRpbWVuc2lvbnMuaGVpZ2h0LCBvdXRl
ckNvbG9yKTsKICBjaGVja0NhbnZhc1JlY3QoZ2wsIHggKyB3aWR0aCArIGVkZ2VTaXplLCAwLCBv
dXRlckRpbWVuc2lvbnMud2lkdGggLSB4IC0gd2lkdGggLSBlZGdlU2l6ZSwgb3V0ZXJEaW1lbnNp
b25zLmhlaWdodCwgb3V0ZXJDb2xvcik7CiAgY2hlY2tDYW52YXNSZWN0KGdsLCAwLCAwLCBvdXRl
ckRpbWVuc2lvbnMud2lkdGgsIHkgLSBlZGdlU2l6ZSwgb3V0ZXJDb2xvcik7CiAgY2hlY2tDYW52
YXNSZWN0KGdsLCAwLCB5ICsgaGVpZ2h0ICsgZWRnZVNpemUsIG91dGVyRGltZW5zaW9ucy53aWR0
aCwgb3V0ZXJEaW1lbnNpb25zLmhlaWdodCAtIHkgLSBoZWlnaHQgLSBlZGdlU2l6ZSwgb3V0ZXJD
b2xvcik7Cn07CgovKioKICogQ2hlY2tzIHRoYXQgYW4gZW50aXJlIGJ1ZmZlciBtYXRjaGVzIHRo
ZSBmbG9hdGluZyBwb2ludCB2YWx1ZXMgcHJvdmlkZWQuCiAqIChXZWJHTCAyLjAgb25seSkKICog
QHBhcmFtIHshV2ViR0wyUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMMlJlbmRlcmluZ0Nv
bnRleHQgdG8gdXNlLgogKiBAcGFyYW0ge251bWJlcn0gdGFyZ2V0IFRoZSBidWZmZXIgdGFyZ2V0
IHRvIGJpbmQgdG8uCiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBleHBlY3RlZCBUaGUgdmFs
dWVzIGV4cGVjdGVkLgogKiBAcGFyYW0ge3N0cmluZ30gb3B0X21zZyBPcHRpb25hbC4gTWVzc2Fn
ZSB0byBhc3NvY2lhdGUgd2l0aCBzdWNjZXNzLiBFZyAoInNob3VsZCBiZSByZWQiKS4KICogQHBh
cmFtIHtudW1iZXJ9IG9wdF9lcnJvclJhbmdlIE9wdGlvbmFsLiBBY2NlcHRhYmxlIGVycm9yIGlu
IHZhbHVlIGNoZWNraW5nLiAwLjAwMSBieSBkZWZhdWx0LgogKi8KdmFyIGNoZWNrRmxvYXRCdWZm
ZXIgPSBmdW5jdGlvbihnbCwgdGFyZ2V0LCBleHBlY3RlZCwgb3B0X21zZywgb3B0X2Vycm9yUmFu
Z2UpIHsKICBpZiAob3B0X21zZyA9PT0gdW5kZWZpbmVkKQogICAgb3B0X21zZyA9ICJidWZmZXIg
c2hvdWxkIG1hdGNoIGV4cGVjdGVkIHZhbHVlcyI7CgogIGlmIChvcHRfZXJyb3JSYW5nZSA9PT0g
dW5kZWZpbmVkKQogICAgb3B0X2Vycm9yUmFuZ2UgPSAwLjAwMTsKCiAgdmFyIGZsb2F0QXJyYXkg
PSBuZXcgRmxvYXQzMkFycmF5KGV4cGVjdGVkLmxlbmd0aCk7CiAgZ2wuZ2V0QnVmZmVyU3ViRGF0
YSh0YXJnZXQsIDAsIGZsb2F0QXJyYXkpOwoKICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVk
Lmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoTWF0aC5hYnMoZmxvYXRBcnJheVtpXSAtIGV4cGVjdGVk
W2ldKSA+IG9wdF9lcnJvclJhbmdlKSB7CiAgICAgIHRlc3RGYWlsZWQob3B0X21zZyk7CiAgICAg
IGRlYnVnKCdhdCBbJyArIGkgKyAnXSBleHBlY3RlZDogJyArIGV4cGVjdGVkW2ldICsgJyB3YXMg
JyArIGZsb2F0QXJyYXlbaV0pOwogICAgICByZXR1cm47CiAgICB9CiAgfQogIHRlc3RQYXNzZWQo
b3B0X21zZyk7Cn07CgovKioKICogTG9hZHMgYSB0ZXh0dXJlLCBjYWxscyBjYWxsYmFjayB3aGVu
IGZpbmlzaGVkLgogKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJH
TFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBvZiBp
bWFnZSB0byBsb2FkCiAqIEBwYXJhbSB7ZnVuY3Rpb24oIUltYWdlKTogdm9pZH0gY2FsbGJhY2sg
RnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBhZnRlcgogKiAgICAgICAgaW1hZ2UgaGFzIGxvYWRl
ZAogKiBAcmV0dXJuIHshV2ViR0xUZXh0dXJlfSBUaGUgY3JlYXRlZCB0ZXh0dXJlLgogKi8KdmFy
IGxvYWRUZXh0dXJlID0gZnVuY3Rpb24oZ2wsIHVybCwgY2FsbGJhY2spIHsKICAgIHZhciB0ZXh0
dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOwogICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8y
RCwgdGV4dHVyZSk7CiAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRV
UkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRV
UkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICB2YXIgaW1hZ2Ug
PSBuZXcgSW1hZ2UoKTsKICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGds
LmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpOwogICAgICAgIGdsLnBpeGVsU3Rv
cmVpKGdsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRydWUpOwogICAgICAgIGdsLnRleEltYWdlMkQo
Z2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgaW1h
Z2UpOwogICAgICAgIGNhbGxiYWNrKGltYWdlKTsKICAgIH07CiAgICBpbWFnZS5zcmMgPSB1cmw7
CiAgICByZXR1cm4gdGV4dHVyZTsKfTsKCi8qKgogKiBDaGVja3Mgd2hldGhlciB0aGUgYm91bmQg
dGV4dHVyZSBoYXMgZXhwZWN0ZWQgZGltZW5zaW9ucy4gT25lIGNvcm5lciBwaXhlbAogKiBvZiB0
aGUgdGV4dHVyZSB3aWxsIGJlIGNoYW5nZWQgYXMgYSBzaWRlIGVmZmVjdC4KICogQHBhcmFtIHsh
V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVz
ZS4KICogQHBhcmFtIHshV2ViR0xUZXh0dXJlfSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIHRvIGNoZWNr
LgogKiBAcGFyYW0ge251bWJlcn0gd2lkdGggRXhwZWN0ZWQgd2lkdGguCiAqIEBwYXJhbSB7bnVt
YmVyfSBoZWlnaHQgRXhwZWN0ZWQgaGVpZ2h0LgogKiBAcGFyYW0ge0dMZW51bX0gb3B0X2Zvcm1h
dCBUaGUgdGV4dHVyZSdzIGZvcm1hdC4gRGVmYXVsdHMgdG8gUkdCQS4KICogQHBhcmFtIHtHTGVu
dW19IG9wdF90eXBlIFRoZSB0ZXh0dXJlJ3MgdHlwZS4gRGVmYXVsdHMgdG8gVU5TSUdORURfQllU
RS4KICovCnZhciBjaGVja1RleHR1cmVTaXplID0gZnVuY3Rpb24oZ2wsIHdpZHRoLCBoZWlnaHQs
IG9wdF9mb3JtYXQsIG9wdF90eXBlKSB7CiAgb3B0X2Zvcm1hdCA9IG9wdF9mb3JtYXQgfHwgZ2wu
UkdCQTsKICBvcHRfdHlwZSA9IG9wdF90eXBlIHx8IGdsLlVOU0lHTkVEX0JZVEU7CgogIHZhciBu
dW1FbGVtZW50cyA9IGdldFR5cGVkQXJyYXlFbGVtZW50c1BlclBpeGVsKGdsLCBvcHRfZm9ybWF0
LCBvcHRfdHlwZSk7CiAgdmFyIGJ1ZiA9IG5ldyAoZ2xUeXBlVG9UeXBlZEFycmF5VHlwZShnbCwg
b3B0X3R5cGUpKShudW1FbGVtZW50cyk7CgogIHZhciBlcnJvcnMgPSAwOwogIGdsLnRleFN1Yklt
YWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxLCAxLCAxLCBvcHRf
Zm9ybWF0LCBvcHRfdHlwZSwgYnVmKTsKICBpZiAoZ2wuZ2V0RXJyb3IoKSAhPSBnbC5OT19FUlJP
UikgewogICAgdGVzdEZhaWxlZCgiVGV4dHVyZSB3YXMgc21hbGxlciB0aGFuIHRoZSBleHBlY3Rl
ZCBzaXplICIgKyB3aWR0aCArICJ4IiArIGhlaWdodCk7CiAgICArK2Vycm9yczsKICB9CiAgZ2wu
dGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCB3aWR0aCAtIDEsIGhlaWdodCwgMSwgMSwg
b3B0X2Zvcm1hdCwgb3B0X3R5cGUsIGJ1Zik7CiAgaWYgKGdsLmdldEVycm9yKCkgPT0gZ2wuTk9f
RVJST1IpIHsKICAgIHRlc3RGYWlsZWQoIlRleHR1cmUgd2FzIHRhbGxlciB0aGFuICIgKyBoZWln
aHQpOwogICAgKytlcnJvcnM7CiAgfQogIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwg
MCwgd2lkdGgsIGhlaWdodCAtIDEsIDEsIDEsIG9wdF9mb3JtYXQsIG9wdF90eXBlLCBidWYpOwog
IGlmIChnbC5nZXRFcnJvcigpID09IGdsLk5PX0VSUk9SKSB7CiAgICB0ZXN0RmFpbGVkKCJUZXh0
dXJlIHdhcyB3aWRlciB0aGFuICIgKyB3aWR0aCk7CiAgICArK2Vycm9yczsKICB9CiAgaWYgKGVy
cm9ycyA9PSAwKSB7CiAgICB0ZXN0UGFzc2VkKCJUZXh0dXJlIGhhZCB0aGUgZXhwZWN0ZWQgc2l6
ZSAiICsgd2lkdGggKyAieCIgKyBoZWlnaHQpOwogIH0KfTsKCi8qKgogKiBNYWtlcyBhIHNoYWxs
b3cgY29weSBvZiBhbiBvYmplY3QuCiAqIEBwYXJhbSB7IU9iamVjdH0gc3JjIE9iamVjdCB0byBj
b3B5CiAqIEByZXR1cm4geyFPYmplY3R9IFRoZSBjb3B5IG9mIHNyYy4KICovCnZhciBzaGFsbG93
Q29weU9iamVjdCA9IGZ1bmN0aW9uKHNyYykgewogIHZhciBkc3QgPSB7fTsKICBmb3IgKHZhciBh
dHRyIGluIHNyYykgewogICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkgewogICAgICBk
c3RbYXR0cl0gPSBzcmNbYXR0cl07CiAgICB9CiAgfQogIHJldHVybiBkc3Q7Cn07CgovKioKICog
Q2hlY2tzIGlmIGFuIGF0dHJpYnV0ZSBleGlzdHMgb24gYW4gb2JqZWN0IGNhc2UgaW5zZW5zaXRp
dmUuCiAqIEBwYXJhbSB7IU9iamVjdH0gb2JqIE9iamVjdCB0byBjaGVjawogKiBAcGFyYW0ge3N0
cmluZ30gYXR0ciBOYW1lIG9mIGF0dHJpYnV0ZSB0byBsb29rIGZvci4KICogQHJldHVybiB7c3Ry
aW5nP30gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpZiBpdCBleGlzdHMsCiAqICAgICAgICAg
dW5kZWZpbmVkIGlmIG5vdC4KICovCnZhciBoYXNBdHRyaWJ1dGVDYXNlSW5zZW5zaXRpdmUgPSBm
dW5jdGlvbihvYmosIGF0dHIpIHsKICB2YXIgbG93ZXIgPSBhdHRyLnRvTG93ZXJDYXNlKCk7CiAg
Zm9yICh2YXIga2V5IGluIG9iaikgewogICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYm
IGtleS50b0xvd2VyQ2FzZSgpID09IGxvd2VyKSB7CiAgICAgIHJldHVybiBrZXk7CiAgICB9CiAg
fQp9OwoKLyoqCiAqIFJldHVybnMgYSBtYXAgb2YgVVJMIHF1ZXJ5c3RyaW5nIG9wdGlvbnMKICog
QHJldHVybiB7T2JqZWN0P30gT2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSB2YWx1ZXMgaW4gdGhl
IFVSTCBxdWVyeXN0cmluZwogKi8KdmFyIGdldFVybE9wdGlvbnMgPSAoZnVuY3Rpb24oKSB7CiAg
dmFyIF91cmxPcHRpb25zUGFyc2VkID0gZmFsc2U7CiAgdmFyIF91cmxPcHRpb25zID0ge307CiAg
cmV0dXJuIGZ1bmN0aW9uKCkgewogICAgaWYgKCFfdXJsT3B0aW9uc1BhcnNlZCkgewogICAgICB2
YXIgcyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICB2YXIgcSA9IHMuaW5kZXhPZigiPyIp
OwogICAgICB2YXIgZSA9IHMuaW5kZXhPZigiIyIpOwogICAgICBpZiAoZSA8IDApIHsKICAgICAg
ICBlID0gcy5sZW5ndGg7CiAgICAgIH0KICAgICAgdmFyIHF1ZXJ5ID0gcy5zdWJzdHJpbmcocSAr
IDEsIGUpOwogICAgICB2YXIgcGFpcnMgPSBxdWVyeS5zcGxpdCgiJiIpOwogICAgICBmb3IgKHZh
ciBpaSA9IDA7IGlpIDwgcGFpcnMubGVuZ3RoOyArK2lpKSB7CiAgICAgICAgdmFyIGtleVZhbHVl
ID0gcGFpcnNbaWldLnNwbGl0KCI9Iik7CiAgICAgICAgdmFyIGtleSA9IGtleVZhbHVlWzBdOwog
ICAgICAgIHZhciB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXlWYWx1ZVsxXSk7CiAgICAg
ICAgX3VybE9wdGlvbnNba2V5XSA9IHZhbHVlOwogICAgICB9CiAgICAgIF91cmxPcHRpb25zUGFy
c2VkID0gdHJ1ZTsKICAgIH0KCiAgICByZXR1cm4gX3VybE9wdGlvbnM7CiAgfQp9KSgpOwoKdmFy
IGRlZmF1bHQzRENvbnRleHRWZXJzaW9uID0gMTsKCi8qKgogKiBTZXQgdGhlIGRlZmF1bHQgY29u
dGV4dCB2ZXJzaW9uIGZvciBjcmVhdGUzRENvbnRleHQuCiAqIEluaXRpYWxseSB0aGUgZGVmYXVs
dCB2ZXJzaW9uIGlzIDEuCiAqIEBwYXJhbSB7bnVtYmVyfSBEZWZhdWx0IHZlcnNpb24gb2YgV2Vi
R0wgY29udGV4dHMuCiAqLwp2YXIgc2V0RGVmYXVsdDNEQ29udGV4dFZlcnNpb24gPSBmdW5jdGlv
bih2ZXJzaW9uKSB7CiAgICBkZWZhdWx0M0RDb250ZXh0VmVyc2lvbiA9IHZlcnNpb247Cn07Cgov
KioKICogR2V0IHRoZSBkZWZhdWx0IGNvbnRleCB2ZXJzaW9uIGZvciBjcmVhdGUzRENvbnRleHQu
CiAqIEZpcnN0IGl0IGxvb2tzIGF0IHRoZSBVUkkgb3B0aW9uIHx3ZWJnbFZlcnNpb258LiBJZiBp
dCBkb2VzIG5vdCBleGlzdCwKICogdGhlbiBsb29rIGF0IHRoZSBnbG9iYWwgZGVmYXVsdDNEQ29u
dGV4dFZlcnNpb24gdmFyaWFibGUuCiAqLwp2YXIgZ2V0RGVmYXVsdDNEQ29udGV4dFZlcnNpb24g
PSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBwYXJzZUludChnZXRVcmxPcHRpb25zKCkud2ViZ2xW
ZXJzaW9uLCAxMCkgfHwgZGVmYXVsdDNEQ29udGV4dFZlcnNpb247Cn07CgovKioKICogQ3JlYXRl
cyBhIHdlYmdsIGNvbnRleHQuCiAqIEBwYXJhbSB7IUNhbnZhc3xzdHJpbmd9IG9wdF9jYW52YXMg
VGhlIGNhbnZhcyB0YWcgdG8gZ2V0CiAqICAgICBjb250ZXh0IGZyb20uIElmIG9uZSBpcyBub3Qg
cGFzc2VkIGluIG9uZSB3aWxsIGJlCiAqICAgICBjcmVhdGVkLiBJZiBpdCdzIGEgc3RyaW5nIGl0
J3MgYXNzdW1lZCB0byBiZSB0aGUgaWQgb2YgYQogKiAgICAgY2FudmFzLgogKiBAcGFyYW0ge09i
amVjdH0gb3B0X2F0dHJpYnV0ZXMgQ29udGV4dCBhdHRyaWJ1dGVzLgogKiBAcGFyYW0geyFudW1i
ZXJ9IG9wdF92ZXJzaW9uIFZlcnNpb24gb2YgV2ViR0wgY29udGV4dCB0byBjcmVhdGUuCiAqICAg
ICBUaGUgZGVmYXVsdCB2ZXJzaW9uIGNhbiBiZSBzZXQgYnkgY2FsbGluZyBzZXREZWZhdWx0M0RD
b250ZXh0VmVyc2lvbi4KICogQHJldHVybiB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gVGhlIGNy
ZWF0ZWQgY29udGV4dC4KICovCnZhciBjcmVhdGUzRENvbnRleHQgPSBmdW5jdGlvbihvcHRfY2Fu
dmFzLCBvcHRfYXR0cmlidXRlcywgb3B0X3ZlcnNpb24pIHsKICBpZiAod2luZG93LmluaXRUZXN0
aW5nSGFybmVzcykgewogICAgd2luZG93LmluaXRUZXN0aW5nSGFybmVzcygpOwogIH0KICB2YXIg
YXR0cmlidXRlcyA9IHNoYWxsb3dDb3B5T2JqZWN0KG9wdF9hdHRyaWJ1dGVzIHx8IHt9KTsKICBp
ZiAoIWhhc0F0dHJpYnV0ZUNhc2VJbnNlbnNpdGl2ZShhdHRyaWJ1dGVzLCAiYW50aWFsaWFzIikp
IHsKICAgIGF0dHJpYnV0ZXMuYW50aWFsaWFzID0gZmFsc2U7CiAgfQogIGlmICghb3B0X3ZlcnNp
b24pIHsKICAgIG9wdF92ZXJzaW9uID0gcGFyc2VJbnQoZ2V0VXJsT3B0aW9ucygpLndlYmdsVmVy
c2lvbiwgMTApIHx8IGRlZmF1bHQzRENvbnRleHRWZXJzaW9uOwogIH0KICBvcHRfY2FudmFzID0g
b3B0X2NhbnZhcyB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICBpZiAodHlw
ZW9mIG9wdF9jYW52YXMgPT0gJ3N0cmluZycpIHsKICAgIG9wdF9jYW52YXMgPSBkb2N1bWVudC5n
ZXRFbGVtZW50QnlJZChvcHRfY2FudmFzKTsKICB9CiAgdmFyIGNvbnRleHQgPSBudWxsOwoKICB2
YXIgbmFtZXM7CiAgc3dpdGNoIChvcHRfdmVyc2lvbikgewogICAgY2FzZSAyOgogICAgICBuYW1l
cyA9IFsid2ViZ2wyIl07IGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgbmFtZXMgPSBbIndlYmds
IiwgImV4cGVyaW1lbnRhbC13ZWJnbCJdOyBicmVhazsKICB9CgogIGZvciAodmFyIGkgPSAwOyBp
IDwgbmFtZXMubGVuZ3RoOyArK2kpIHsKICAgIHRyeSB7CiAgICAgIGNvbnRleHQgPSBvcHRfY2Fu
dmFzLmdldENvbnRleHQobmFtZXNbaV0sIGF0dHJpYnV0ZXMpOwogICAgfSBjYXRjaCAoZSkgewog
ICAgfQogICAgaWYgKGNvbnRleHQpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmICghY29u
dGV4dCkgewogICAgdGVzdEZhaWxlZCgiVW5hYmxlIHRvIGZldGNoIFdlYkdMIHJlbmRlcmluZyBj
b250ZXh0IGZvciBDYW52YXMiKTsKICB9CiAgcmV0dXJuIGNvbnRleHQ7Cn07CgovKioKICogRGVm
aW5lcyB0aGUgZXhjZXB0aW9uIHR5cGUgZm9yIGEgR0wgZXJyb3IuCiAqIEBjb25zdHJ1Y3Rvcgog
KiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS4KICogQHBhcmFtIHtu
dW1iZXJ9IGVycm9yIEdMIGVycm9yIGNvZGUKICovCmZ1bmN0aW9uIEdMRXJyb3JFeGNlcHRpb24g
KG1lc3NhZ2UsIGVycm9yKSB7CiAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CiAgIHRoaXMubmFt
ZSA9ICJHTEVycm9yRXhjZXB0aW9uIjsKICAgdGhpcy5lcnJvciA9IGVycm9yOwp9OwoKLyoqCiAq
IFdyYXBzIGEgV2ViR0wgZnVuY3Rpb24gd2l0aCBhIGZ1bmN0aW9uIHRoYXQgdGhyb3dzIGFuIGV4
Y2VwdGlvbiBpZiB0aGVyZSBpcwogKiBhbiBlcnJvci4KICogQHBhcmFtIHshV2ViR0xSZW5kZXJp
bmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICogQHBhcmFt
IHtzdHJpbmd9IGZuYW1lIE5hbWUgb2YgZnVuY3Rpb24gdG8gd3JhcC4KICogQHJldHVybiB7ZnVu
Y3Rpb24oKX0gVGhlIHdyYXBwZWQgZnVuY3Rpb24uCiAqLwp2YXIgY3JlYXRlR0xFcnJvcldyYXBw
ZXIgPSBmdW5jdGlvbihjb250ZXh0LCBmbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAg
IHZhciBydiA9IGNvbnRleHRbZm5hbWVdLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7CiAgICB2
YXIgZXJyID0gY29udGV4dC5nZXRFcnJvcigpOwogICAgaWYgKGVyciAhPSBjb250ZXh0Lk5PX0VS
Uk9SKSB7CiAgICAgIHZhciBtc2cgPSAiR0wgZXJyb3IgIiArIGdsRW51bVRvU3RyaW5nKGNvbnRl
eHQsIGVycikgKyAiIGluICIgKyBmbmFtZTsKICAgICAgdGhyb3cgbmV3IEdMRXJyb3JFeGNlcHRp
b24obXNnLCBlcnIpOwogICAgfQogICAgcmV0dXJuIHJ2OwogIH07Cn07CgovKioKICogQ3JlYXRl
cyBhIFdlYkdMIGNvbnRleHQgd2hlcmUgYWxsIGZ1bmN0aW9ucyBhcmUgd3JhcHBlZCB0byB0aHJv
dyBhbiBleGNlcHRpb24KICogaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAqIEBwYXJhbSB7IUNhbnZh
c30gY2FudmFzIFRoZSBIVE1MIGNhbnZhcyB0byBnZXQgYSBjb250ZXh0IGZyb20uCiAqIEBwYXJh
bSB7T2JqZWN0fSBvcHRfYXR0cmlidXRlcyBDb250ZXh0IGF0dHJpYnV0ZXMuCiAqIEBwYXJhbSB7
IW51bWJlcn0gb3B0X3ZlcnNpb24gVmVyc2lvbiBvZiBXZWJHTCBjb250ZXh0IHRvIGNyZWF0ZQog
KiBAcmV0dXJuIHshT2JqZWN0fSBUaGUgd3JhcHBlZCBjb250ZXh0LgogKi8KZnVuY3Rpb24gY3Jl
YXRlM0RDb250ZXh0V2l0aFdyYXBwZXJUaGF0VGhyb3dzT25HTEVycm9yKGNhbnZhcywgb3B0X2F0
dHJpYnV0ZXMsIG9wdF92ZXJzaW9uKSB7CiAgdmFyIGNvbnRleHQgPSBjcmVhdGUzRENvbnRleHQo
Y2FudmFzLCBvcHRfYXR0cmlidXRlcywgb3B0X3ZlcnNpb24pOwogIHZhciB3cmFwID0ge307CiAg
Zm9yICh2YXIgaSBpbiBjb250ZXh0KSB7CiAgICB0cnkgewogICAgICBpZiAodHlwZW9mIGNvbnRl
eHRbaV0gPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHdyYXBbaV0gPSBjcmVhdGVHTEVycm9yV3Jh
cHBlcihjb250ZXh0LCBpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3cmFwW2ldID0gY29udGV4
dFtpXTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICBlcnJvcigiY3JlYXRlQ29udGV4
dFdyYXBwZXJUaGF0VGhyb3dzT25HTEVycm9yOiBFcnJvciBhY2Nlc3NpbmcgIiArIGkpOwogICAg
fQogIH0KICB3cmFwLmdldEVycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb250ZXh0
LmdldEVycm9yKCk7CiAgfTsKICByZXR1cm4gd3JhcDsKfTsKCi8qKgogKiBUZXN0cyB0aGF0IGFu
IGV2YWx1YXRlZCBleHByZXNzaW9uIGdlbmVyYXRlcyBhIHNwZWNpZmljIEdMIGVycm9yLgogKiBA
cGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRl
eHQgdG8gdXNlLgogKiBAcGFyYW0ge251bWJlcnxBcnJheS48bnVtYmVyPn0gZ2xFcnJvcnMgVGhl
IGV4cGVjdGVkIGdsIGVycm9yIG9yIGFuIGFycmF5IG9mIGV4cGVjdGVkIGVycm9ycy4KICogQHBh
cmFtIHtzdHJpbmd9IGV2YWxTdHIgVGhlIHN0cmluZyB0byBldmFsdWF0ZS4KICovCnZhciBzaG91
bGRHZW5lcmF0ZUdMRXJyb3IgPSBmdW5jdGlvbihnbCwgZ2xFcnJvcnMsIGV2YWxTdHIsIG9wdF9t
c2cpIHsKICB2YXIgZXhjZXB0aW9uOwogIHRyeSB7CiAgICBldmFsKGV2YWxTdHIpOwogIH0gY2F0
Y2ggKGUpIHsKICAgIGV4Y2VwdGlvbiA9IGU7CiAgfQogIGlmIChleGNlcHRpb24pIHsKICAgIHRl
c3RGYWlsZWQoZXZhbFN0ciArICIgdGhyZXcgZXhjZXB0aW9uICIgKyBleGNlcHRpb24pOwogICAg
cmV0dXJuIC0xOwogIH0gZWxzZSB7CiAgICBpZiAoIW9wdF9tc2cpIHsKICAgICAgb3B0X21zZyA9
ICJhZnRlciBldmFsdWF0aW5nOiAiICsgZXZhbFN0cjsKICAgIH0KICAgIHJldHVybiBnbEVycm9y
U2hvdWxkQmUoZ2wsIGdsRXJyb3JzLCBvcHRfbXNnKTsKICB9Cn07CgovKioKICogVGVzdHMgdGhh
dCBhbiBldmFsdWF0ZWQgZXhwcmVzc2lvbiBlaXRoZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvciBn
ZW5lcmF0ZXMgYSBzcGVjaWZpYyBHTCBlcnJvci4KICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdD
b250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICogQHBhcmFtIHtu
dW1iZXJ8QXJyYXkuPG51bWJlcj59IGdsRXJyb3JzIFRoZSBleHBlY3RlZCBnbCBlcnJvciBvciBh
biBhcnJheSBvZiBleHBlY3RlZCBlcnJvcnMuCiAqIEBwYXJhbSB7c3RyaW5nfSBldmFsU3RyIFRo
ZSBzdHJpbmcgdG8gZXZhbHVhdGUuCiAqLwp2YXIgc2hvdWxkVGhyb3dPckdlbmVyYXRlR0xFcnJv
ciA9IGZ1bmN0aW9uKGdsLCBnbEVycm9ycywgZXZhbFN0ciwgb3B0X21zZykgewogIHZhciBleGNl
cHRpb247CiAgdHJ5IHsKICAgIGV2YWwoZXZhbFN0cik7CiAgfSBjYXRjaCAoZSkgewogICAgZXhj
ZXB0aW9uID0gZTsKICB9CiAgaWYgKGV4Y2VwdGlvbikgewogICAgdGVzdFBhc3NlZChldmFsU3Ry
ICsgIiB0aHJldyBleGNlcHRpb24gIiArIGV4Y2VwdGlvbik7CiAgICByZXR1cm4gMDsKICB9IGVs
c2UgewogICAgaWYgKCFvcHRfbXNnKSB7CiAgICAgIG9wdF9tc2cgPSAiYWZ0ZXIgZXZhbHVhdGlu
ZzogIiArIGV2YWxTdHI7CiAgICB9CiAgICByZXR1cm4gZ2xFcnJvclNob3VsZEJlKGdsLCBnbEVy
cm9ycywgb3B0X21zZyk7CiAgfQp9OwoKLyoqCiAqIFRlc3RzIHRoYXQgYW4gZXZhbHVhdGVkIGV4
cHJlc3Npb24gZG9lcyBub3QgZ2VuZXJhdGUgYSBHTCBlcnJvci4KICogQHBhcmFtIHshV2ViR0xS
ZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICog
QHBhcmFtIHtzdHJpbmd9IGV2YWxTdHIgVGhlIHN0cmluZyB0byBldmFsdWF0ZS4KICovCnZhciBm
YWlsSWZHTEVycm9yID0gZnVuY3Rpb24oZ2wsIGV2YWxTdHIpIHsKICB2YXIgZXhjZXB0aW9uOwog
IHRyeSB7CiAgICBldmFsKGV2YWxTdHIpOwogIH0gY2F0Y2ggKGUpIHsKICAgIGV4Y2VwdGlvbiA9
IGU7CiAgfQogIGlmIChleGNlcHRpb24pIHsKICAgIHRlc3RGYWlsZWQoZXZhbFN0ciArICIgdGhy
ZXcgZXhjZXB0aW9uICIgKyBleGNlcHRpb24pOwogIH0gZWxzZSB7CiAgICBnbEVycm9yU2hvdWxk
QmVJbXBsKGdsLCBnbC5OT19FUlJPUiwgZmFsc2UsICJhZnRlciBldmFsdWF0aW5nOiAiICsgZXZh
bFN0cik7CiAgfQp9OwoKLyoqCiAqIFRlc3RzIHRoYXQgdGhlIGZpcnN0IGVycm9yIEdMIHJldHVy
bnMgaXMgdGhlIHNwZWNpZmllZCBlcnJvci4KICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250
ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICogQHBhcmFtIHtudW1i
ZXJ8QXJyYXkuPG51bWJlcj59IGdsRXJyb3JzIFRoZSBleHBlY3RlZCBnbCBlcnJvciBvciBhbiBh
cnJheSBvZiBleHBlY3RlZCBlcnJvcnMuCiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRfbXNnIE9wdGlv
bmFsIGFkZGl0aW9uYWwgbWVzc2FnZS4KICovCnZhciBnbEVycm9yU2hvdWxkQmUgPSBmdW5jdGlv
bihnbCwgZ2xFcnJvcnMsIG9wdF9tc2cpIHsKICByZXR1cm4gZ2xFcnJvclNob3VsZEJlSW1wbChn
bCwgZ2xFcnJvcnMsIHRydWUsIG9wdF9tc2cpOwp9OwoKCgovKioKICogVGVzdHMgdGhhdCB0aGUg
Zmlyc3QgZXJyb3IgR0wgcmV0dXJucyBpcyB0aGUgc3BlY2lmaWVkIGVycm9yLiBBbGxvd3Mgc3Vw
cHJlc3Npb24gb2Ygc3VjY2Vzc2VzLgogKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9
IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogKiBAcGFyYW0ge251bWJlcnxB
cnJheS48bnVtYmVyPn0gZ2xFcnJvcnMgVGhlIGV4cGVjdGVkIGdsIGVycm9yIG9yIGFuIGFycmF5
IG9mIGV4cGVjdGVkIGVycm9ycy4KICogQHBhcmFtIHtib29sZWFufSByZXBvcnRTdWNjZXNzZXMg
V2hldGhlciB0byByZXBvcnQgc3VjY2Vzc2VzIGFzIHBhc3Nlcywgb3IgdG8gc2lsZW50bHkgcGFz
cy4KICogQHBhcmFtIHtzdHJpbmd9IG9wdF9tc2cgT3B0aW9uYWwgYWRkaXRpb25hbCBtZXNzYWdl
LgogKi8KdmFyIGdsRXJyb3JTaG91bGRCZUltcGwgPSBmdW5jdGlvbihnbCwgZ2xFcnJvcnMsIHJl
cG9ydFN1Y2Nlc3Nlcywgb3B0X21zZykgewogIGlmICghZ2xFcnJvcnMubGVuZ3RoKSB7CiAgICBn
bEVycm9ycyA9IFtnbEVycm9yc107CiAgfQogIG9wdF9tc2cgPSBvcHRfbXNnIHx8ICIiOwogIHZh
ciBlcnIgPSBnbC5nZXRFcnJvcigpOwogIHZhciBuZHggPSBnbEVycm9ycy5pbmRleE9mKGVycik7
CiAgdmFyIGVyclN0cnMgPSBbXTsKICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgZ2xFcnJvcnMubGVu
Z3RoOyArK2lpKSB7CiAgICBlcnJTdHJzLnB1c2goZ2xFbnVtVG9TdHJpbmcoZ2wsIGdsRXJyb3Jz
W2lpXSkpOwogIH0KICB2YXIgZXhwZWN0ZWQgPSBlcnJTdHJzLmpvaW4oIiBvciAiKTsKICBpZiAo
bmR4IDwgMCkgewogICAgdmFyIG1zZyA9ICJnZXRFcnJvciBleHBlY3RlZCIgKyAoKGdsRXJyb3Jz
Lmxlbmd0aCA+IDEpID8gIiBvbmUgb2Y6ICIgOiAiOiAiKTsKICAgIHRlc3RGYWlsZWQobXNnICsg
ZXhwZWN0ZWQgKyAgIi4gV2FzICIgKyBnbEVudW1Ub1N0cmluZyhnbCwgZXJyKSArICIgOiAiICsg
b3B0X21zZyk7CiAgfSBlbHNlIGlmIChyZXBvcnRTdWNjZXNzZXMpIHsKICAgIHZhciBtc2cgPSAi
Z2V0RXJyb3Igd2FzICIgKyAoKGdsRXJyb3JzLmxlbmd0aCA+IDEpID8gIm9uZSBvZjogIiA6ICJl
eHBlY3RlZCB2YWx1ZTogIik7CiAgICB0ZXN0UGFzc2VkKG1zZyArIGV4cGVjdGVkICsgIiA6ICIg
KyBvcHRfbXNnKTsKICB9CiAgcmV0dXJuIGVycjsKfTsKCi8qKgogKiBMaW5rcyBhIFdlYkdMIHBy
b2dyYW0sIHRocm93cyBpZiB0aGVyZSBhcmUgZXJyb3JzLgogKiBAcGFyYW0geyFXZWJHTFJlbmRl
cmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogKiBAcGFy
YW0geyFXZWJHTFByb2dyYW19IHByb2dyYW0gVGhlIFdlYkdMUHJvZ3JhbSB0byBsaW5rLgogKiBA
cGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6IHZvaWR9IG9wdF9lcnJvckNhbGxiYWNrIGNhbGxiYWNr
IGZvciBlcnJvcnMuCiAqLwp2YXIgbGlua1Byb2dyYW0gPSBmdW5jdGlvbihnbCwgcHJvZ3JhbSwg
b3B0X2Vycm9yQ2FsbGJhY2spIHsKICB2YXIgZXJyRm4gPSBvcHRfZXJyb3JDYWxsYmFjayB8fCB0
ZXN0RmFpbGVkOwogIC8vIExpbmsgdGhlIHByb2dyYW0KICBnbC5saW5rUHJvZ3JhbShwcm9ncmFt
KTsKCiAgLy8gQ2hlY2sgdGhlIGxpbmsgc3RhdHVzCiAgdmFyIGxpbmtlZCA9IGdsLmdldFByb2dy
YW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpOwogIGlmICghbGlua2VkKSB7CiAg
ICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBsaW5rCiAgICB2YXIgZXJyb3IgPSBn
bC5nZXRQcm9ncmFtSW5mb0xvZyAocHJvZ3JhbSk7CgogICAgZXJyRm4oIkVycm9yIGluIHByb2dy
YW0gbGlua2luZzoiICsgZXJyb3IpOwoKICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAg
fQp9OwoKLyoqCiAqIExvYWRzIHRleHQgZnJvbSBhbiBleHRlcm5hbCBmaWxlLiBUaGlzIGZ1bmN0
aW9uIGlzIGFzeW5jaHJvbm91cy4KICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgdXJsIG9mIHRo
ZSBleHRlcm5hbCBmaWxlLgogKiBAcGFyYW0geyFmdW5jdGlvbihib29sLCBzdHJpbmcpOiB2b2lk
fSBjYWxsYmFjayB0aGF0IGlzIHNlbnQgYSBib29sIGZvcgogKiAgICAgc3VjY2VzcyBhbmQgdGhl
IHN0cmluZy4KICovCnZhciBsb2FkVGV4dEZpbGVBc3luYyA9IGZ1bmN0aW9uKHVybCwgY2FsbGJh
Y2spIHsKICBsb2cgKCJsb2FkaW5nOiAiICsgdXJsKTsKICB2YXIgZXJyb3IgPSAnbG9hZFRleHRG
aWxlQXN5bmMgZmFpbGVkIHRvIGxvYWQgdXJsICInICsgdXJsICsgJyInOwogIHZhciByZXF1ZXN0
OwogIGlmICh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpIHsKICAgIHJlcXVlc3QgPSBuZXcgWE1MSHR0
cFJlcXVlc3QoKTsKICAgIGlmIChyZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUpIHsKICAgICAgcmVx
dWVzdC5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L3BsYWluJyk7CiAgICB9CiAgfSBlbHNlIHsKICAg
IHRocm93ICdYTUxIdHRwUmVxdWVzdCBpcyBkaXNhYmxlZCc7CiAgfQogIHRyeSB7CiAgICByZXF1
ZXN0Lm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7CiAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5n
ZSA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlID09IDQpIHsKICAg
ICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgIC8vIEhUVFAgcmVwb3J0cyBzdWNjZXNzIHdpdGgg
YSAyMDAgc3RhdHVzLiBUaGUgZmlsZSBwcm90b2NvbCByZXBvcnRzCiAgICAgICAgLy8gc3VjY2Vz
cyB3aXRoIHplcm8uIEhUVFAgZG9lcyBub3QgdXNlIHplcm8gYXMgYSBzdGF0dXMgY29kZSAodGhl
eQogICAgICAgIC8vIHN0YXJ0IGF0IDEwMCkuCiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIu
bW96aWxsYS5vcmcvRW4vVXNpbmdfWE1MSHR0cFJlcXVlc3QKICAgICAgICB2YXIgc3VjY2VzcyA9
IHJlcXVlc3Quc3RhdHVzID09IDIwMCB8fCByZXF1ZXN0LnN0YXR1cyA9PSAwOwogICAgICAgIGlm
IChzdWNjZXNzKSB7CiAgICAgICAgICB0ZXh0ID0gcmVxdWVzdC5yZXNwb25zZVRleHQ7CiAgICAg
ICAgICBsb2coImNvbXBsZXRlZCBsb2FkIHJlcXVlc3Q6ICIgKyB1cmwpOwogICAgICAgIH0gZWxz
ZSB7CiAgICAgICAgICBsb2coImxvYWRpbmcgIiArIHVybCArICIgcmVzdWx0ZWQgaW4gdW5leHBl
Y3RlZCBzdGF0dXM6ICIgKyByZXF1ZXN0LnN0YXR1cyArICIgIiArIHJlcXVlc3Quc3RhdHVzVGV4
dCk7CiAgICAgICAgfQogICAgICAgIGNhbGxiYWNrKHN1Y2Nlc3MsIHRleHQpOwogICAgICB9CiAg
ICB9OwogICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3JFdmVudCkgewogICAgICBs
b2coImVycm9yIG9jY3VycmVkIGxvYWRpbmcgIiArIHVybCk7CiAgICAgIGNhbGxiYWNrKGZhbHNl
LCAnJyk7CiAgICB9OwogICAgcmVxdWVzdC5zZW5kKG51bGwpOwogIH0gY2F0Y2ggKGVycikgewog
ICAgbG9nKCJmYWlsZWQgdG8gbG9hZDogIiArIHVybCArICIgd2l0aCBleGNlcHRpb24gIiArIGVy
ci5tZXNzYWdlKTsKICAgIGNhbGxiYWNrKGZhbHNlLCAnJyk7CiAgfQp9OwoKLyoqCiAqIFJlY3Vy
c2l2ZWx5IGxvYWRzIGEgZmlsZSBhcyBhIGxpc3QuIEVhY2ggbGluZSBpcyBwYXJzZWQgZm9yIGEg
cmVsYXRpdmUKICogcGF0aC4gSWYgdGhlIGZpbGUgZW5kcyBpbiAudHh0IHRoZSBjb250ZW50cyBv
ZiB0aGF0IGZpbGUgaXMgaW5zZXJ0ZWQgaW4KICogdGhlIGxpc3QuCiAqCiAqIEBwYXJhbSB7c3Ry
aW5nfSB1cmwgVGhlIHVybCBvZiB0aGUgZXh0ZXJuYWwgZmlsZS4KICogQHBhcmFtIHshZnVuY3Rp
b24oYm9vbCwgQXJyYXk8c3RyaW5nPik6IHZvaWR9IGNhbGxiYWNrIHRoYXQgaXMgc2VudCBhIGJv
b2wKICogICAgIGZvciBzdWNjZXNzIGFuZCB0aGUgYXJyYXkgb2Ygc3RyaW5ncy4KICovCnZhciBn
ZXRGaWxlTGlzdEFzeW5jID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgewogIHZhciBmaWxlcyA9
IFtdOwoKICB2YXIgZ2V0RmlsZUxpc3RJbXBsID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgewog
ICAgdmFyIGZpbGVzID0gW107CiAgICBpZiAodXJsLnN1YnN0cih1cmwubGVuZ3RoIC0gNCkgPT0g
Jy50eHQnKSB7CiAgICAgIGxvYWRUZXh0RmlsZUFzeW5jKHVybCwgZnVuY3Rpb24oKSB7CiAgICAg
ICAgcmV0dXJuIGZ1bmN0aW9uKHN1Y2Nlc3MsIHRleHQpIHsKICAgICAgICAgIGlmICghc3VjY2Vz
cykgewogICAgICAgICAgICBjYWxsYmFjayhmYWxzZSwgJycpOwogICAgICAgICAgICByZXR1cm47
CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KCdcbicpOwogICAg
ICAgICAgdmFyIHByZWZpeCA9ICcnOwogICAgICAgICAgdmFyIGxhc3RTbGFzaCA9IHVybC5sYXN0
SW5kZXhPZignLycpOwogICAgICAgICAgaWYgKGxhc3RTbGFzaCA+PSAwKSB7CiAgICAgICAgICAg
IHByZWZpeCA9IHVybC5zdWJzdHIoMCwgbGFzdFNsYXNoICsgMSk7CiAgICAgICAgICB9CiAgICAg
ICAgICB2YXIgZmFpbCA9IGZhbHNlOwogICAgICAgICAgdmFyIGNvdW50ID0gMTsKICAgICAgICAg
IHZhciBpbmRleCA9IDA7CiAgICAgICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgbGluZXMubGVu
Z3RoOyArK2lpKSB7CiAgICAgICAgICAgIHZhciBzdHIgPSBsaW5lc1tpaV0ucmVwbGFjZSgvXlxz
XHMqLywgJycpLnJlcGxhY2UoL1xzXHMqJC8sICcnKTsKICAgICAgICAgICAgaWYgKHN0ci5sZW5n
dGggPiA0ICYmCiAgICAgICAgICAgICAgICBzdHJbMF0gIT0gJyMnICYmCiAgICAgICAgICAgICAg
ICBzdHJbMF0gIT0gIjsiICYmCiAgICAgICAgICAgICAgICBzdHIuc3Vic3RyKDAsIDIpICE9ICIv
LyIpIHsKICAgICAgICAgICAgICB2YXIgbmFtZXMgPSBzdHIuc3BsaXQoLyArLyk7CiAgICAgICAg
ICAgICAgdmFyIG5ld191cmwgPSBwcmVmaXggKyBzdHI7CiAgICAgICAgICAgICAgaWYgKG5hbWVz
Lmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICBuZXdfdXJsID0gcHJlZml4ICsgc3RyOwog
ICAgICAgICAgICAgICAgKytjb3VudDsKICAgICAgICAgICAgICAgIGdldEZpbGVMaXN0SW1wbChu
ZXdfdXJsLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rp
b24oc3VjY2VzcywgbmV3X2ZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nKCJnb3QgZmls
ZXM6ICIgKyBuZXdfZmlsZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2Vz
cykgewogICAgICAgICAgICAgICAgICAgICAgZmlsZXNbaW5kZXhdID0gbmV3X2ZpbGVzOwogICAg
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmaW5pc2goc3VjY2Vzcyk7CiAg
ICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KGluZGV4KyspKTsKICAgICAgICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHMgPSAiIjsKICAgICAgICAgICAgICAg
IHZhciBwID0gIiI7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBqaiA9IDA7IGpqIDwgbmFtZXMu
bGVuZ3RoOyArK2pqKSB7CiAgICAgICAgICAgICAgICAgIHMgKz0gcCArIHByZWZpeCArIG5hbWVz
W2pqXTsKICAgICAgICAgICAgICAgICAgcCA9ICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgICAgIGZpbGVzW2luZGV4KytdID0gczsKICAgICAgICAgICAgICB9CiAgICAgICAgICAg
IH0KICAgICAgICAgIH0KICAgICAgICAgIGZpbmlzaCh0cnVlKTsKCiAgICAgICAgICBmdW5jdGlv
biBmaW5pc2goc3VjY2VzcykgewogICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAg
ICAgICBmYWlsID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAtLWNvdW50OwogICAg
ICAgICAgICBsb2coImNvdW50OiAiICsgY291bnQpOwogICAgICAgICAgICBpZiAoIWNvdW50KSB7
CiAgICAgICAgICAgICAgY2FsbGJhY2soIWZhaWwsIGZpbGVzKTsKICAgICAgICAgICAgfQogICAg
ICAgICAgfQogICAgICAgIH0KICAgICAgfSgpKTsKCiAgICB9IGVsc2UgewogICAgICBmaWxlcy5w
dXNoKHVybCk7CiAgICAgIGNhbGxiYWNrKHRydWUsIGZpbGVzKTsKICAgIH0KICB9OwoKICBnZXRG
aWxlTGlzdEltcGwodXJsLCBmdW5jdGlvbihzdWNjZXNzLCBmaWxlcykgewogICAgLy8gZmxhdHRl
bgogICAgdmFyIGZsYXQgPSBbXTsKICAgIGZsYXR0ZW4oZmlsZXMpOwogICAgZnVuY3Rpb24gZmxh
dHRlbihmaWxlcykgewogICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgZmlsZXMubGVuZ3RoOyAr
K2lpKSB7CiAgICAgICAgdmFyIHZhbHVlID0gZmlsZXNbaWldOwogICAgICAgIGlmICh0eXBlb2Yo
dmFsdWUpID09ICJzdHJpbmciKSB7CiAgICAgICAgICBmbGF0LnB1c2godmFsdWUpOwogICAgICAg
IH0gZWxzZSB7CiAgICAgICAgICBmbGF0dGVuKHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KICAg
IH0KICAgIGNhbGxiYWNrKHN1Y2Nlc3MsIGZsYXQpOwogIH0pOwp9OwoKLyoqCiAqIEdldHMgYSBm
aWxlIGZyb20gYSBmaWxlL1VSTC4KICogQHBhcmFtIHtzdHJpbmd9IGZpbGUgdGhlIFVSTCBvZiB0
aGUgZmlsZSB0byBnZXQuCiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbnRlbnRzIG9mIHRoZSBm
aWxlLgogKi8KdmFyIHJlYWRGaWxlID0gZnVuY3Rpb24oZmlsZSkgewogIHZhciB4aHIgPSBuZXcg
WE1MSHR0cFJlcXVlc3QoKTsKICB4aHIub3BlbigiR0VUIiwgZmlsZSwgZmFsc2UpOwogIHhoci5v
dmVycmlkZU1pbWVUeXBlKCJ0ZXh0L3BsYWluIik7CiAgeGhyLnNlbmQoKTsKICByZXR1cm4geGhy
LnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9cci9nLCAiIik7Cn07Cgp2YXIgcmVhZEZpbGVMaXN0ID0g
ZnVuY3Rpb24odXJsKSB7CiAgdmFyIGZpbGVzID0gW107CiAgaWYgKHVybC5zdWJzdHIodXJsLmxl
bmd0aCAtIDQpID09ICcudHh0JykgewogICAgdmFyIGxpbmVzID0gcmVhZEZpbGUodXJsKS5zcGxp
dCgnXG4nKTsKICAgIHZhciBwcmVmaXggPSAnJzsKICAgIHZhciBsYXN0U2xhc2ggPSB1cmwubGFz
dEluZGV4T2YoJy8nKTsKICAgIGlmIChsYXN0U2xhc2ggPj0gMCkgewogICAgICBwcmVmaXggPSB1
cmwuc3Vic3RyKDAsIGxhc3RTbGFzaCArIDEpOwogICAgfQogICAgZm9yICh2YXIgaWkgPSAwOyBp
aSA8IGxpbmVzLmxlbmd0aDsgKytpaSkgewogICAgICB2YXIgc3RyID0gbGluZXNbaWldLnJlcGxh
Y2UoL15cc1xzKi8sICcnKS5yZXBsYWNlKC9cc1xzKiQvLCAnJyk7CiAgICAgIGlmIChzdHIubGVu
Z3RoID4gNCAmJgogICAgICAgICAgc3RyWzBdICE9ICcjJyAmJgogICAgICAgICAgc3RyWzBdICE9
ICI7IiAmJgogICAgICAgICAgc3RyLnN1YnN0cigwLCAyKSAhPSAiLy8iKSB7CiAgICAgICAgdmFy
IG5hbWVzID0gc3RyLnNwbGl0KC8gKy8pOwogICAgICAgIGlmIChuYW1lcy5sZW5ndGggPT0gMSkg
ewogICAgICAgICAgdmFyIG5ld191cmwgPSBwcmVmaXggKyBzdHI7CiAgICAgICAgICBmaWxlcyA9
IGZpbGVzLmNvbmNhdChyZWFkRmlsZUxpc3QobmV3X3VybCkpOwogICAgICAgIH0gZWxzZSB7CiAg
ICAgICAgICB2YXIgcyA9ICIiOwogICAgICAgICAgdmFyIHAgPSAiIjsKICAgICAgICAgIGZvciAo
dmFyIGpqID0gMDsgamogPCBuYW1lcy5sZW5ndGg7ICsramopIHsKICAgICAgICAgICAgcyArPSBw
ICsgcHJlZml4ICsgbmFtZXNbampdOwogICAgICAgICAgICBwID0gIiAiOwogICAgICAgICAgfQog
ICAgICAgICAgZmlsZXMucHVzaChzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9IGVsc2Ug
ewogICAgZmlsZXMucHVzaCh1cmwpOwogIH0KICByZXR1cm4gZmlsZXM7Cn07CgovKioKICogTG9h
ZHMgYSBzaGFkZXIuCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdl
YkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTb3Vy
Y2UgVGhlIHNoYWRlciBzb3VyY2UuCiAqIEBwYXJhbSB7bnVtYmVyfSBzaGFkZXJUeXBlIFRoZSB0
eXBlIG9mIHNoYWRlci4KICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiB2b2lkfSBvcHRfZXJy
b3JDYWxsYmFjayBjYWxsYmFjayBmb3IgZXJyb3JzLgogKiBAcGFyYW0ge2Jvb2xlYW59IG9wdF9s
b2dTaGFkZXJzIFdoZXRoZXIgdG8gbG9nIHNoYWRlciBzb3VyY2UuCiAqIEBwYXJhbSB7c3RyaW5n
fSBvcHRfc2hhZGVyTGFiZWwgTGFiZWwgdGhhdCBpZGVudGlmaWVzIHRoZSBzaGFkZXIgc291cmNl
IGluCiAqICAgICB0aGUgbG9nLgogKiBAcGFyYW0ge3N0cmluZ30gb3B0X3VybCBVUkwgZnJvbSB3
aGVyZSB0aGUgc2hhZGVyIHNvdXJjZSB3YXMgbG9hZGVkIGZyb20uCiAqICAgICBJZiBvcHRfbG9n
U2hhZGVycyBpcyBzZXQsIHRoZW4gYSBsaW5rIHRvIHRoZSBzb3VyY2UgZmlsZSB3aWxsIGFsc28g
YmUKICogICAgIGFkZGVkLgogKiBAcGFyYW0ge2Jvb2xlYW59IFNraXAgY29tcGlsYXRpb24gc3Rh
dHVzIGNoZWNrLiBEZWZhdWx0ID0gZmFsc2UuCiAqIEByZXR1cm4geyFXZWJHTFNoYWRlcn0gVGhl
IGNyZWF0ZWQgc2hhZGVyLgogKi8KdmFyIGxvYWRTaGFkZXIgPSBmdW5jdGlvbigKICAgIGdsLCBz
aGFkZXJTb3VyY2UsIHNoYWRlclR5cGUsIG9wdF9lcnJvckNhbGxiYWNrLCBvcHRfbG9nU2hhZGVy
cywKICAgIG9wdF9zaGFkZXJMYWJlbCwgb3B0X3VybCwgb3B0X3NraXBDb21waWxlU3RhdHVzKSB7
CiAgdmFyIGVyckZuID0gb3B0X2Vycm9yQ2FsbGJhY2sgfHwgZXJyb3I7CiAgLy8gQ3JlYXRlIHRo
ZSBzaGFkZXIgb2JqZWN0CiAgdmFyIHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihzaGFkZXJUeXBl
KTsKICBpZiAoc2hhZGVyID09IG51bGwpIHsKICAgIGVyckZuKCIqKiogRXJyb3I6IHVuYWJsZSB0
byBjcmVhdGUgc2hhZGVyICciK3NoYWRlclNvdXJjZSsiJyIpOwogICAgcmV0dXJuIG51bGw7CiAg
fQoKICAvLyBMb2FkIHRoZSBzaGFkZXIgc291cmNlCiAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwg
c2hhZGVyU291cmNlKTsKICB2YXIgZXJyID0gZ2wuZ2V0RXJyb3IoKTsKICBpZiAoZXJyICE9IGds
Lk5PX0VSUk9SKSB7CiAgICBlcnJGbigiKioqIEVycm9yIGxvYWRpbmcgc2hhZGVyICciICsgc2hh
ZGVyICsgIic6IiArIGdsRW51bVRvU3RyaW5nKGdsLCBlcnIpKTsKICAgIHJldHVybiBudWxsOwog
IH0KCiAgLy8gQ29tcGlsZSB0aGUgc2hhZGVyCiAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpOwoK
ICBpZiAob3B0X2xvZ1NoYWRlcnMpIHsKICAgIHZhciBsYWJlbCA9IHNoYWRlclR5cGUgPT0gZ2wu
VkVSVEVYX1NIQURFUiA/ICd2ZXJ0ZXggc2hhZGVyJyA6ICdmcmFnbWVudF9zaGFkZXInOwogICAg
aWYgKG9wdF9zaGFkZXJMYWJlbCkgewogICAgICBsYWJlbCA9IG9wdF9zaGFkZXJMYWJlbCArICcg
JyArIGxhYmVsOwogICAgfQogICAgYWRkU2hhZGVyU291cmNlcygKICAgICAgICBnbCwgZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnNvbGUnKSwgbGFiZWwsIHNoYWRlciwgc2hhZGVyU291cmNl
LCBvcHRfdXJsKTsKICB9CgogIC8vIENoZWNrIHRoZSBjb21waWxlIHN0YXR1cwogIGlmICghb3B0
X3NraXBDb21waWxlU3RhdHVzKSB7CiAgICB2YXIgY29tcGlsZWQgPSBnbC5nZXRTaGFkZXJQYXJh
bWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyk7CiAgICBpZiAoIWNvbXBpbGVkKSB7CiAg
ICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBjb21waWxhdGlvbjsgZ2V0IHRoZSBl
cnJvcgogICAgICBsYXN0RXJyb3IgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcik7CiAgICAg
IGVyckZuKCIqKiogRXJyb3IgY29tcGlsaW5nICIgKyBnbEVudW1Ub1N0cmluZyhnbCwgc2hhZGVy
VHlwZSkgKyAiICciICsgc2hhZGVyICsgIic6IiArIGxhc3RFcnJvcik7CiAgICAgIGdsLmRlbGV0
ZVNoYWRlcihzaGFkZXIpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIHJldHVybiBz
aGFkZXI7Cn0KCi8qKgogKiBMb2FkcyBhIHNoYWRlciBmcm9tIGEgVVJMLgogKiBAcGFyYW0geyFX
ZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNl
LgogKiBAcGFyYW0ge2ZpbGV9IGZpbGUgVGhlIFVSTCBvZiB0aGUgc2hhZGVyIHNvdXJjZS4KICog
QHBhcmFtIHtudW1iZXJ9IHR5cGUgVGhlIHR5cGUgb2Ygc2hhZGVyLgogKiBAcGFyYW0ge2Z1bmN0
aW9uKHN0cmluZyk6IHZvaWR9IG9wdF9lcnJvckNhbGxiYWNrIGNhbGxiYWNrIGZvciBlcnJvcnMu
CiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0X2xvZ1NoYWRlcnMgV2hldGhlciB0byBsb2cgc2hhZGVy
IHNvdXJjZS4KICogQHBhcmFtIHtib29sZWFufSBTa2lwIGNvbXBpbGF0aW9uIHN0YXR1cyBjaGVj
ay4gRGVmYXVsdCA9IGZhbHNlLgogKiBAcmV0dXJuIHshV2ViR0xTaGFkZXJ9IFRoZSBjcmVhdGVk
IHNoYWRlci4KICovCnZhciBsb2FkU2hhZGVyRnJvbUZpbGUgPSBmdW5jdGlvbigKICAgIGdsLCBm
aWxlLCB0eXBlLCBvcHRfZXJyb3JDYWxsYmFjaywgb3B0X2xvZ1NoYWRlcnMsIG9wdF9za2lwQ29t
cGlsZVN0YXR1cykgewogIHZhciBzaGFkZXJTb3VyY2UgPSByZWFkRmlsZShmaWxlKTsKICByZXR1
cm4gbG9hZFNoYWRlcihnbCwgc2hhZGVyU291cmNlLCB0eXBlLCBvcHRfZXJyb3JDYWxsYmFjaywK
ICAgICAgb3B0X2xvZ1NoYWRlcnMsIHVuZGVmaW5lZCwgZmlsZSwgb3B0X3NraXBDb21waWxlU3Rh
dHVzKTsKfTsKCnZhciBsb2FkU2hhZGVyRnJvbUZpbGVBc3luYyA9IGZ1bmN0aW9uKAogICAgZ2ws
IGZpbGUsIHR5cGUsIG9wdF9lcnJvckNhbGxiYWNrLCBvcHRfbG9nU2hhZGVycywgb3B0X3NraXBD
b21waWxlU3RhdHVzLCBjYWxsYmFjaykgewogIGxvYWRUZXh0RmlsZUFzeW5jKGZpbGUsIGZ1bmN0
aW9uKGdsLCB0eXBlLCBvcHRfZXJyb3JDYWxsYmFjaywgb3B0X2xvZ1NoYWRlcnMsIGZpbGUsIG9w
dF9za2lwQ29tcGlsZVN0YXR1cyl7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdWNjZXNzLCBzaGFk
ZXJTb3VyY2UpIHsKICAgICAgICBpZiAoc3VjY2VzcykgewogICAgICAgICAgdmFyIHNoYWRlciA9
IGxvYWRTaGFkZXIoZ2wsIHNoYWRlclNvdXJjZSwgdHlwZSwgb3B0X2Vycm9yQ2FsbGJhY2ssCiAg
ICAgICAgICAgICAgb3B0X2xvZ1NoYWRlcnMsIHVuZGVmaW5lZCwgZmlsZSwgb3B0X3NraXBDb21w
aWxlU3RhdHVzKTsKICAgICAgICAgIGNhbGxiYWNrKHRydWUsIHNoYWRlcik7CiAgICAgICAgfSBl
bHNlIHsKICAgICAgICAgIGNhbGxiYWNrKGZhbHNlLCBudWxsKTsKICAgICAgICB9CiAgICAgIH0K
ICB9KGdsLCB0eXBlLCBvcHRfZXJyb3JDYWxsYmFjaywgb3B0X2xvZ1NoYWRlcnMsIGZpbGUsIG9w
dF9za2lwQ29tcGlsZVN0YXR1cykpOwp9OwoKLyoqCiAqIEdldHMgdGhlIGNvbnRlbnQgb2Ygc2Ny
aXB0LgogKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0SWQgVGhlIGlkIG9mIHRoZSBzY3JpcHQgdGFn
LgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb250ZW50IG9mIHRoZSBzY3JpcHQuCiAqLwp2YXIg
Z2V0U2NyaXB0ID0gZnVuY3Rpb24oc2NyaXB0SWQpIHsKICB2YXIgc2hhZGVyU2NyaXB0ID0gZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2NyaXB0SWQpOwogIGlmICghc2hhZGVyU2NyaXB0KSB7CiAg
ICB0aHJvdygiKioqIEVycm9yOiB1bmtub3duIHNjcmlwdCBlbGVtZW50ICIgKyBzY3JpcHRJZCk7
CiAgfQogIHJldHVybiBzaGFkZXJTY3JpcHQudGV4dDsKfTsKCi8qKgogKiBMb2FkcyBhIHNoYWRl
ciBmcm9tIGEgc2NyaXB0IHRhZy4KICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBn
bCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICogQHBhcmFtIHtzdHJpbmd9IHNj
cmlwdElkIFRoZSBpZCBvZiB0aGUgc2NyaXB0IHRhZy4KICogQHBhcmFtIHtudW1iZXJ9IG9wdF9z
aGFkZXJUeXBlIFRoZSB0eXBlIG9mIHNoYWRlci4gSWYgbm90IHBhc3NlZCBpbiBpdCB3aWxsCiAq
ICAgICBiZSBkZXJpdmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHNjcmlwdCB0YWcuCiAqIEBwYXJh
bSB7ZnVuY3Rpb24oc3RyaW5nKTogdm9pZH0gb3B0X2Vycm9yQ2FsbGJhY2sgY2FsbGJhY2sgZm9y
IGVycm9ycy4KICogQHBhcmFtIHtib29sZWFufSBvcHRfbG9nU2hhZGVycyBXaGV0aGVyIHRvIGxv
ZyBzaGFkZXIgc291cmNlLgogKiBAcGFyYW0ge2Jvb2xlYW59IFNraXAgY29tcGlsYXRpb24gc3Rh
dHVzIGNoZWNrLiBEZWZhdWx0ID0gZmFsc2UuCiAqIEByZXR1cm4geyFXZWJHTFNoYWRlcn0gVGhl
IGNyZWF0ZWQgc2hhZGVyLgogKi8KdmFyIGxvYWRTaGFkZXJGcm9tU2NyaXB0ID0gZnVuY3Rpb24o
CiAgICBnbCwgc2NyaXB0SWQsIG9wdF9zaGFkZXJUeXBlLCBvcHRfZXJyb3JDYWxsYmFjaywgb3B0
X2xvZ1NoYWRlcnMsIG9wdF9za2lwQ29tcGlsZVN0YXR1cykgewogIHZhciBzaGFkZXJTb3VyY2Ug
PSAiIjsKICB2YXIgc2hhZGVyU2NyaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2NyaXB0
SWQpOwogIGlmICghc2hhZGVyU2NyaXB0KSB7CiAgICB0aHJvdygiKioqIEVycm9yOiB1bmtub3du
IHNjcmlwdCBlbGVtZW50ICIgKyBzY3JpcHRJZCk7CiAgfQogIHNoYWRlclNvdXJjZSA9IHNoYWRl
clNjcmlwdC50ZXh0OwoKICBpZiAoIW9wdF9zaGFkZXJUeXBlKSB7CiAgICBpZiAoc2hhZGVyU2Ny
aXB0LnR5cGUgPT0gIngtc2hhZGVyL3gtdmVydGV4IikgewogICAgICBvcHRfc2hhZGVyVHlwZSA9
IGdsLlZFUlRFWF9TSEFERVI7CiAgICB9IGVsc2UgaWYgKHNoYWRlclNjcmlwdC50eXBlID09ICJ4
LXNoYWRlci94LWZyYWdtZW50IikgewogICAgICBvcHRfc2hhZGVyVHlwZSA9IGdsLkZSQUdNRU5U
X1NIQURFUjsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93KCIqKiogRXJyb3I6IHVua25vd24gc2hh
ZGVyIHR5cGUiKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICByZXR1cm4gbG9hZFNo
YWRlcihnbCwgc2hhZGVyU291cmNlLCBvcHRfc2hhZGVyVHlwZSwgb3B0X2Vycm9yQ2FsbGJhY2ss
CiAgICAgIG9wdF9sb2dTaGFkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb3B0X3NraXBDb21w
aWxlU3RhdHVzKTsKfTsKCnZhciBsb2FkU3RhbmRhcmRQcm9ncmFtID0gZnVuY3Rpb24oZ2wpIHsK
ICB2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKICBnbC5hdHRhY2hTaGFkZXIocHJv
Z3JhbSwgbG9hZFN0YW5kYXJkVmVydGV4U2hhZGVyKGdsKSk7CiAgZ2wuYXR0YWNoU2hhZGVyKHBy
b2dyYW0sIGxvYWRTdGFuZGFyZEZyYWdtZW50U2hhZGVyKGdsKSk7CiAgZ2wuYmluZEF0dHJpYkxv
Y2F0aW9uKHByb2dyYW0sIDAsICJhX3ZlcnRleCIpOwogIGdsLmJpbmRBdHRyaWJMb2NhdGlvbihw
cm9ncmFtLCAxLCAiYV9ub3JtYWwiKTsKICBsaW5rUHJvZ3JhbShnbCwgcHJvZ3JhbSk7CiAgcmV0
dXJuIHByb2dyYW07Cn07Cgp2YXIgbG9hZFN0YW5kYXJkUHJvZ3JhbUFzeW5jID0gZnVuY3Rpb24o
Z2wsIGNhbGxiYWNrKSB7CiAgbG9hZFN0YW5kYXJkVmVydGV4U2hhZGVyQXN5bmMoZ2wsIGZ1bmN0
aW9uKGdsKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3VjY2VzcywgdnMpIHsKICAgICAgaWYgKHN1
Y2Nlc3MpIHsKICAgICAgICBsb2FkU3RhbmRhcmRGcmFnbWVudFNoYWRlckFzeW5jKGdsLCBmdW5j
dGlvbih2cykgewogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN1Y2Nlc3MsIGZzKSB7CiAgICAg
ICAgICAgIGlmIChzdWNjZXNzKSB7CiAgICAgICAgICAgICAgdmFyIHByb2dyYW0gPSBnbC5jcmVh
dGVQcm9ncmFtKCk7CiAgICAgICAgICAgICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHZzKTsK
ICAgICAgICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnMpOwogICAgICAgICAgICAg
IGdsLmJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAwLCAiYV92ZXJ0ZXgiKTsKICAgICAgICAg
ICAgICBnbC5iaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgMSwgImFfbm9ybWFsIik7CiAgICAg
ICAgICAgICAgbGlua1Byb2dyYW0oZ2wsIHByb2dyYW0pOwogICAgICAgICAgICAgIGNhbGxiYWNr
KHRydWUsIHByb2dyYW0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNhbGxi
YWNrKGZhbHNlLCBudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9KHZz
KSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2FsbGJhY2soZmFsc2UsIG51bGwpOwogICAgICB9
CiAgICB9OwogIH0oZ2wpKTsKfTsKCi8qKgogKiBMb2FkcyBzaGFkZXJzIGZyb20gZmlsZXMsIGNy
ZWF0ZXMgYSBwcm9ncmFtLCBhdHRhY2hlcyB0aGUgc2hhZGVycyBhbmQgbGlua3MuCiAqIEBwYXJh
bSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0
byB1c2UuCiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJ0ZXhTaGFkZXJQYXRoIFRoZSBVUkwgb2YgdGhl
IHZlcnRleCBzaGFkZXIuCiAqIEBwYXJhbSB7c3RyaW5nfSBmcmFnbWVudFNoYWRlclBhdGggVGhl
IFVSTCBvZiB0aGUgZnJhZ21lbnQgc2hhZGVyLgogKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6
IHZvaWR9IG9wdF9lcnJvckNhbGxiYWNrIGNhbGxiYWNrIGZvciBlcnJvcnMuCiAqIEByZXR1cm4g
eyFXZWJHTFByb2dyYW19IFRoZSBjcmVhdGVkIHByb2dyYW0uCiAqLwp2YXIgbG9hZFByb2dyYW1G
cm9tRmlsZSA9IGZ1bmN0aW9uKAogICAgZ2wsIHZlcnRleFNoYWRlclBhdGgsIGZyYWdtZW50U2hh
ZGVyUGF0aCwgb3B0X2Vycm9yQ2FsbGJhY2spIHsKICB2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVBy
b2dyYW0oKTsKICB2YXIgdnMgPSBsb2FkU2hhZGVyRnJvbUZpbGUoCiAgICAgIGdsLCB2ZXJ0ZXhT
aGFkZXJQYXRoLCBnbC5WRVJURVhfU0hBREVSLCBvcHRfZXJyb3JDYWxsYmFjayk7CiAgdmFyIGZz
ID0gbG9hZFNoYWRlckZyb21GaWxlKAogICAgICBnbCwgZnJhZ21lbnRTaGFkZXJQYXRoLCBnbC5G
UkFHTUVOVF9TSEFERVIsIG9wdF9lcnJvckNhbGxiYWNrKTsKICBpZiAodnMgJiYgZnMpIHsKICAg
IGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2cyk7CiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3Jh
bSwgZnMpOwogICAgbGlua1Byb2dyYW0oZ2wsIHByb2dyYW0sIG9wdF9lcnJvckNhbGxiYWNrKTsK
ICB9CiAgaWYgKHZzKSB7CiAgICBnbC5kZWxldGVTaGFkZXIodnMpOwogIH0KICBpZiAoZnMpIHsK
ICAgIGdsLmRlbGV0ZVNoYWRlcihmcyk7CiAgfQogIHJldHVybiBwcm9ncmFtOwp9OwoKLyoqCiAq
IExvYWRzIHNoYWRlcnMgZnJvbSBzY3JpcHQgdGFncywgY3JlYXRlcyBhIHByb2dyYW0sIGF0dGFj
aGVzIHRoZSBzaGFkZXJzIGFuZAogKiBsaW5rcy4KICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdD
b250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICogQHBhcmFtIHtz
dHJpbmd9IHZlcnRleFNjcmlwdElkIFRoZSBpZCBvZiB0aGUgc2NyaXB0IHRhZyB0aGF0IGNvbnRh
aW5zIHRoZQogKiAgICAgICAgdmVydGV4IHNoYWRlci4KICogQHBhcmFtIHtzdHJpbmd9IGZyYWdt
ZW50U2NyaXB0SWQgVGhlIGlkIG9mIHRoZSBzY3JpcHQgdGFnIHRoYXQgY29udGFpbnMgdGhlCiAq
ICAgICAgICBmcmFnbWVudCBzaGFkZXIuCiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKTogdm9p
ZH0gb3B0X2Vycm9yQ2FsbGJhY2sgY2FsbGJhY2sgZm9yIGVycm9ycy4KICogQHJldHVybiB7IVdl
YkdMUHJvZ3JhbX0gVGhlIGNyZWF0ZWQgcHJvZ3JhbS4KICovCnZhciBsb2FkUHJvZ3JhbUZyb21T
Y3JpcHQgPSBmdW5jdGlvbiBsb2FkUHJvZ3JhbUZyb21TY3JpcHQoCiAgICBnbCwgdmVydGV4U2Ny
aXB0SWQsIGZyYWdtZW50U2NyaXB0SWQsIG9wdF9lcnJvckNhbGxiYWNrKSB7CiAgdmFyIHByb2dy
YW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7CiAgZ2wuYXR0YWNoU2hhZGVyKAogICAgICBwcm9ncmFt
LAogICAgICBsb2FkU2hhZGVyRnJvbVNjcmlwdCgKICAgICAgICAgIGdsLCB2ZXJ0ZXhTY3JpcHRJ
ZCwgZ2wuVkVSVEVYX1NIQURFUiwgb3B0X2Vycm9yQ2FsbGJhY2spKTsKICBnbC5hdHRhY2hTaGFk
ZXIoCiAgICAgIHByb2dyYW0sCiAgICAgIGxvYWRTaGFkZXJGcm9tU2NyaXB0KAogICAgICAgICAg
Z2wsIGZyYWdtZW50U2NyaXB0SWQsICBnbC5GUkFHTUVOVF9TSEFERVIsIG9wdF9lcnJvckNhbGxi
YWNrKSk7CiAgbGlua1Byb2dyYW0oZ2wsIHByb2dyYW0sIG9wdF9lcnJvckNhbGxiYWNrKTsKICBy
ZXR1cm4gcHJvZ3JhbTsKfTsKCi8qKgogKiBMb2FkcyBzaGFkZXJzIGZyb20gc291cmNlLCBjcmVh
dGVzIGEgcHJvZ3JhbSwgYXR0YWNoZXMgdGhlIHNoYWRlcnMgYW5kCiAqIGxpbmtzLgogKiBAcGFy
YW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQg
dG8gdXNlLgogKiBAcGFyYW0geyFXZWJHTFNoYWRlcn0gdmVydGV4U2hhZGVyIFRoZSB2ZXJ0ZXgg
c2hhZGVyLgogKiBAcGFyYW0geyFXZWJHTFNoYWRlcn0gZnJhZ21lbnRTaGFkZXIgVGhlIGZyYWdt
ZW50IHNoYWRlci4KICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiB2b2lkfSBvcHRfZXJyb3JD
YWxsYmFjayBjYWxsYmFjayBmb3IgZXJyb3JzLgogKiBAcmV0dXJuIHshV2ViR0xQcm9ncmFtfSBU
aGUgY3JlYXRlZCBwcm9ncmFtLgogKi8KdmFyIGNyZWF0ZVByb2dyYW0gPSBmdW5jdGlvbihnbCwg
dmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgb3B0X2Vycm9yQ2FsbGJhY2spIHsKICB2YXIg
cHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwg
dmVydGV4U2hhZGVyKTsKICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIp
OwogIGxpbmtQcm9ncmFtKGdsLCBwcm9ncmFtLCBvcHRfZXJyb3JDYWxsYmFjayk7CiAgcmV0dXJu
IHByb2dyYW07Cn07CgovKioKICogTG9hZHMgc2hhZGVycyBmcm9tIHNvdXJjZSwgY3JlYXRlcyBh
IHByb2dyYW0sIGF0dGFjaGVzIHRoZSBzaGFkZXJzIGFuZAogKiBsaW5rcy4KICogQHBhcmFtIHsh
V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVz
ZS4KICogQHBhcmFtIHtzdHJpbmd9IHZlcnRleFNoYWRlciBUaGUgdmVydGV4IHNoYWRlciBzb3Vy
Y2UuCiAqIEBwYXJhbSB7c3RyaW5nfSBmcmFnbWVudFNoYWRlciBUaGUgZnJhZ21lbnQgc2hhZGVy
IHNvdXJjZS4KICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOiB2b2lkfSBvcHRfZXJyb3JDYWxs
YmFjayBjYWxsYmFjayBmb3IgZXJyb3JzLgogKiBAcGFyYW0ge2Jvb2xlYW59IG9wdF9sb2dTaGFk
ZXJzIFdoZXRoZXIgdG8gbG9nIHNoYWRlciBzb3VyY2UuCiAqIEByZXR1cm4geyFXZWJHTFByb2dy
YW19IFRoZSBjcmVhdGVkIHByb2dyYW0uCiAqLwp2YXIgbG9hZFByb2dyYW0gPSBmdW5jdGlvbigK
ICAgIGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBvcHRfZXJyb3JDYWxsYmFjaywg
b3B0X2xvZ1NoYWRlcnMpIHsKICB2YXIgcHJvZ3JhbTsKICB2YXIgdnMgPSBsb2FkU2hhZGVyKAog
ICAgICBnbCwgdmVydGV4U2hhZGVyLCBnbC5WRVJURVhfU0hBREVSLCBvcHRfZXJyb3JDYWxsYmFj
aywgb3B0X2xvZ1NoYWRlcnMpOwogIHZhciBmcyA9IGxvYWRTaGFkZXIoCiAgICAgIGdsLCBmcmFn
bWVudFNoYWRlciwgZ2wuRlJBR01FTlRfU0hBREVSLCBvcHRfZXJyb3JDYWxsYmFjaywgb3B0X2xv
Z1NoYWRlcnMpOwogIGlmICh2cyAmJiBmcykgewogICAgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0o
Z2wsIHZzLCBmcywgb3B0X2Vycm9yQ2FsbGJhY2spCiAgfQogIGlmICh2cykgewogICAgZ2wuZGVs
ZXRlU2hhZGVyKHZzKTsKICB9CiAgaWYgKGZzKSB7CiAgICBnbC5kZWxldGVTaGFkZXIoZnMpOwog
IH0KICByZXR1cm4gcHJvZ3JhbTsKfTsKCi8qKgogKiBMb2FkcyBzaGFkZXJzIGZyb20gc291cmNl
LCBjcmVhdGVzIGEgcHJvZ3JhbSwgYXR0YWNoZXMgdGhlIHNoYWRlcnMgYW5kCiAqIGxpbmtzIGJ1
dCBleHBlY3RzIGVycm9yLgogKgogKiBHTFNMIDEuMC4xNyAxMC4yNyBlZmZlY3RpdmVseSBzYXlz
IHRoYXQgY29tcGlsZVNoYWRlciBjYW4KICogYWx3YXlzIHN1Y2NlZWQgYXMgbG9uZyBhcyBsaW5r
UHJvZ3JhbSBmYWlscyBzbyB3ZSBjYW4ndAogKiByZWx5IG9uIGNvbXBpbGVTaGFkZXIgZmFpbGlu
Zy4gVGhpcyBmdW5jdGlvbiBleHBlY3RzCiAqIG9uZSBvZiB0aGUgc2hhZGVyIHRvIGZhaWwgT1Ig
bGlua2luZyB0byBmYWlsLgogKgogKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGds
IFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogKiBAcGFyYW0ge3N0cmluZ30gdmVy
dGV4U2hhZGVyU2NyaXB0SWQgVGhlIHZlcnRleCBzaGFkZXIuCiAqIEBwYXJhbSB7c3RyaW5nfSBm
cmFnbWVudFNoYWRlclNjcmlwdElkIFRoZSBmcmFnbWVudCBzaGFkZXIuCiAqIEByZXR1cm4ge1dl
YkdMUHJvZ3JhbX0gVGhlIGNyZWF0ZWQgcHJvZ3JhbS4KICovCnZhciBsb2FkUHJvZ3JhbUZyb21T
Y3JpcHRFeHBlY3RFcnJvciA9IGZ1bmN0aW9uKAogICAgZ2wsIHZlcnRleFNoYWRlclNjcmlwdElk
LCBmcmFnbWVudFNoYWRlclNjcmlwdElkKSB7CiAgdmFyIHZlcnRleFNoYWRlciA9IGxvYWRTaGFk
ZXJGcm9tU2NyaXB0KGdsLCB2ZXJ0ZXhTaGFkZXJTY3JpcHRJZCk7CiAgaWYgKCF2ZXJ0ZXhTaGFk
ZXIpIHsKICAgIHJldHVybiBudWxsOwogIH0KICB2YXIgZnJhZ21lbnRTaGFkZXIgPSBsb2FkU2hh
ZGVyRnJvbVNjcmlwdChnbCwgZnJhZ21lbnRTaGFkZXJTY3JpcHRJZCk7CiAgaWYgKCFmcmFnbWVu
dFNoYWRlcikgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHZhciBsaW5rU3VjY2VzcyA9IHRydWU7
CiAgdmFyIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7CiAgZ2wuYXR0YWNoU2hhZGVyKHBy
b2dyYW0sIHZlcnRleFNoYWRlcik7CiAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50
U2hhZGVyKTsKICBsaW5rU3VjY2VzcyA9IHRydWU7CiAgbGlua1Byb2dyYW0oZ2wsIHByb2dyYW0s
IGZ1bmN0aW9uKCkgewogICAgICBsaW5rU3VjY2VzcyA9IGZhbHNlOwogICAgfSk7CiAgcmV0dXJu
IGxpbmtTdWNjZXNzID8gcHJvZ3JhbSA6IG51bGw7Cn07CgoKdmFyIGdldEFjdGl2ZU1hcCA9IGZ1
bmN0aW9uKGdsLCBwcm9ncmFtLCB0eXBlSW5mbykgewogIHZhciBudW1WYXJpYWJsZXMgPSBnbC5n
ZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsW3R5cGVJbmZvLnBhcmFtXSk7CiAgdmFyIHZh
cmlhYmxlcyA9IHt9OwogIGZvciAodmFyIGlpID0gMDsgaWkgPCBudW1WYXJpYWJsZXM7ICsraWkp
IHsKICAgIHZhciBpbmZvID0gZ2xbdHlwZUluZm8uYWN0aXZlRm5dKHByb2dyYW0sIGlpKTsKICAg
IHZhcmlhYmxlc1tpbmZvLm5hbWVdID0gewogICAgICBuYW1lOiBpbmZvLm5hbWUsCiAgICAgIHNp
emU6IGluZm8uc2l6ZSwKICAgICAgdHlwZTogaW5mby50eXBlLAogICAgICBsb2NhdGlvbjogZ2xb
dHlwZUluZm8ubG9jRm5dKHByb2dyYW0sIGluZm8ubmFtZSkKICAgIH07CiAgfQogIHJldHVybiB2
YXJpYWJsZXM7Cn07CgovKioKICogUmV0dXJucyBhIG1hcCBvZiBhdHRyaWIgbmFtZXMgdG8gaW5m
byBhYm91dCB0aG9zZQogKiBhdHRyaWJzLgogKgogKiBlZzoKICogICAgeyAiYXR0cmliMU5hbWUi
OgogKiAgICAgIHsKICogICAgICAgIG5hbWU6ICJhdHRyaWIxTmFtZSIsCiAqICAgICAgICBzaXpl
OiAxLAogKiAgICAgICAgdHlwZTogZ2wuRkxPQVRfTUFUMiwKICogICAgICAgIGxvY2F0aW9uOiAw
CiAqICAgICAgfSwKICogICAgICAiYXR0cmliMk5hbWVbMF0iOgogKiAgICAgIHsKICogICAgICAg
ICBuYW1lOiAiYXR0cmliMk5hbWVbMF0iLAogKiAgICAgICAgIHNpemU6IDQsCiAqICAgICAgICAg
dHlwZTogZ2wuRkxPQVQsCiAqICAgICAgICAgbG9jYXRpb246IDEKICogICAgICB9LAogKiAgICB9
CiAqCiAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVy
aW5nQ29udGV4dCB0byB1c2UuCiAqIEBwYXJhbSB7V2ViR0xQcm9ncmFtfSBUaGUgcHJvZ3JhbSB0
byBxdWVyeSBmb3IgYXR0cmlicy4KICogQHJldHVybiB0aGUgbWFwLgogKi8KdmFyIGdldEF0dHJp
Yk1hcCA9IGZ1bmN0aW9uKGdsLCBwcm9ncmFtKSB7CiAgcmV0dXJuIGdldEFjdGl2ZU1hcChnbCwg
cHJvZ3JhbSwgewogICAgICBwYXJhbTogIkFDVElWRV9BVFRSSUJVVEVTIiwKICAgICAgYWN0aXZl
Rm46ICJnZXRBY3RpdmVBdHRyaWIiLAogICAgICBsb2NGbjogImdldEF0dHJpYkxvY2F0aW9uIgog
IH0pOwp9OwoKLyoqCiAqIFJldHVybnMgYSBtYXAgb2YgdW5pZm9ybSBuYW1lcyB0byBpbmZvIGFi
b3V0IHRob3NlIHVuaWZvcm1zLgogKgogKiBlZzoKICogICAgeyAidW5pZm9ybTFOYW1lIjoKICog
ICAgICB7CiAqICAgICAgICBuYW1lOiAidW5pZm9ybTFOYW1lIiwKICogICAgICAgIHNpemU6IDEs
CiAqICAgICAgICB0eXBlOiBnbC5GTE9BVF9NQVQyLAogKiAgICAgICAgbG9jYXRpb246IFdlYkdM
VW5pZm9ybUxvY2F0aW9uCiAqICAgICAgfSwKICogICAgICAidW5pZm9ybTJOYW1lWzBdIjoKICog
ICAgICB7CiAqICAgICAgICAgbmFtZTogInVuaWZvcm0yTmFtZVswXSIsCiAqICAgICAgICAgc2l6
ZTogNCwKICogICAgICAgICB0eXBlOiBnbC5GTE9BVCwKICogICAgICAgICBsb2NhdGlvbjogV2Vi
R0xVbmlmb3JtTG9jYXRpb24KICogICAgICB9LAogKiAgICB9CiAqCiAqIEBwYXJhbSB7IVdlYkdM
UmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAq
IEBwYXJhbSB7V2ViR0xQcm9ncmFtfSBUaGUgcHJvZ3JhbSB0byBxdWVyeSBmb3IgdW5pZm9ybXMu
CiAqIEByZXR1cm4gdGhlIG1hcC4KICovCnZhciBnZXRVbmlmb3JtTWFwID0gZnVuY3Rpb24oZ2ws
IHByb2dyYW0pIHsKICByZXR1cm4gZ2V0QWN0aXZlTWFwKGdsLCBwcm9ncmFtLCB7CiAgICAgIHBh
cmFtOiAiQUNUSVZFX1VOSUZPUk1TIiwKICAgICAgYWN0aXZlRm46ICJnZXRBY3RpdmVVbmlmb3Jt
IiwKICAgICAgbG9jRm46ICJnZXRVbmlmb3JtTG9jYXRpb24iCiAgfSk7Cn07Cgp2YXIgYmFzZVBh
dGg7CnZhciBnZXRSZXNvdXJjZVBhdGggPSBmdW5jdGlvbigpIHsKICBpZiAoIWJhc2VQYXRoKSB7
CiAgICB2YXIgZXhwZWN0ZWRCYXNlID0gImpzL3dlYmdsLXRlc3QtdXRpbHMuanMiOwogICAgdmFy
IHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7CiAgICBm
b3IgKHZhciBzY3JpcHQsIGkgPSAwOyBzY3JpcHQgPSBzY3JpcHRzW2ldOyBpKyspIHsKICAgICAg
dmFyIHNyYyA9IHNjcmlwdC5zcmM7CiAgICAgIHZhciBsID0gc3JjLmxlbmd0aDsKICAgICAgaWYg
KHNyYy5zdWJzdHIobCAtIGV4cGVjdGVkQmFzZS5sZW5ndGgpID09IGV4cGVjdGVkQmFzZSkgewog
ICAgICAgIGJhc2VQYXRoID0gc3JjLnN1YnN0cigwLCBsIC0gZXhwZWN0ZWRCYXNlLmxlbmd0aCk7
CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGJhc2VQYXRoICsgInJlc291cmNlcy8iOwp9OwoK
dmFyIGxvYWRTdGFuZGFyZFZlcnRleFNoYWRlciA9IGZ1bmN0aW9uKGdsKSB7CiAgcmV0dXJuIGxv
YWRTaGFkZXJGcm9tRmlsZSgKICAgICAgZ2wsIGdldFJlc291cmNlUGF0aCgpICsgInZlcnRleFNo
YWRlci52ZXJ0IiwgZ2wuVkVSVEVYX1NIQURFUik7Cn07CnZhciBsb2FkU3RhbmRhcmRWZXJ0ZXhT
aGFkZXJBc3luYyA9IGZ1bmN0aW9uKGdsLCBjYWxsYmFjaykgewogIGxvYWRTaGFkZXJGcm9tRmls
ZUFzeW5jKGdsLCBnZXRSZXNvdXJjZVBhdGgoKSArICJ2ZXJ0ZXhTaGFkZXIudmVydCIsIGdsLlZF
UlRFWF9TSEFERVIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNhbGxiYWNrKTsK
fTsKCnZhciBsb2FkU3RhbmRhcmRGcmFnbWVudFNoYWRlciA9IGZ1bmN0aW9uKGdsKSB7CiAgcmV0
dXJuIGxvYWRTaGFkZXJGcm9tRmlsZSgKICAgICAgZ2wsIGdldFJlc291cmNlUGF0aCgpICsgImZy
YWdtZW50U2hhZGVyLmZyYWciLCBnbC5GUkFHTUVOVF9TSEFERVIpOwp9Owp2YXIgbG9hZFN0YW5k
YXJkRnJhZ21lbnRTaGFkZXJBc3luYyA9IGZ1bmN0aW9uKGdsLCBjYWxsYmFjaykgewogIGxvYWRT
aGFkZXJGcm9tRmlsZUFzeW5jKGdsLCBnZXRSZXNvdXJjZVBhdGgoKSArICJmcmFnbWVudFNoYWRl
ci5mcmFnIiwgZ2wuRlJBR01FTlRfU0hBREVSLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZp
bmVkLCBjYWxsYmFjayk7Cn07Cgp2YXIgbG9hZFVuaWZvcm1CbG9ja1Byb2dyYW0gPSBmdW5jdGlv
bihnbCkgewogIHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpOwogIGdsLmF0dGFjaFNo
YWRlcihwcm9ncmFtLCBsb2FkVW5pZm9ybUJsb2NrVmVydGV4U2hhZGVyKGdsKSk7CiAgZ2wuYXR0
YWNoU2hhZGVyKHByb2dyYW0sIGxvYWRVbmlmb3JtQmxvY2tGcmFnbWVudFNoYWRlcihnbCkpOwog
IGdsLmJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAwLCAiYV92ZXJ0ZXgiKTsKICBnbC5iaW5k
QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgMSwgImFfbm9ybWFsIik7CiAgbGlua1Byb2dyYW0oZ2ws
IHByb2dyYW0pOwogIHJldHVybiBwcm9ncmFtOwp9OwoKdmFyIGxvYWRVbmlmb3JtQmxvY2tWZXJ0
ZXhTaGFkZXIgPSBmdW5jdGlvbihnbCkgewogIHJldHVybiBsb2FkU2hhZGVyRnJvbUZpbGUoCiAg
ICAgIGdsLCBnZXRSZXNvdXJjZVBhdGgoKSArICJ1bmlmb3JtQmxvY2tTaGFkZXIudmVydCIsIGds
LlZFUlRFWF9TSEFERVIpOwp9OwoKdmFyIGxvYWRVbmlmb3JtQmxvY2tGcmFnbWVudFNoYWRlciA9
IGZ1bmN0aW9uKGdsKSB7CiAgcmV0dXJuIGxvYWRTaGFkZXJGcm9tRmlsZSgKICAgICAgZ2wsIGdl
dFJlc291cmNlUGF0aCgpICsgInVuaWZvcm1CbG9ja1NoYWRlci5mcmFnIiwgZ2wuRlJBR01FTlRf
U0hBREVSKTsKfTsKCi8qKgogKiBMb2FkcyBhbiBpbWFnZSBhc3luY2hyb25vdXNseS4KICogQHBh
cmFtIHtzdHJpbmd9IHVybCBVUkwgb2YgaW1hZ2UgdG8gbG9hZC4KICogQHBhcmFtIHshZnVuY3Rp
b24oIUVsZW1lbnQpOiB2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiB0byBjYWxsCiAqICAgICB3aXRo
IGxvYWRlZCBpbWFnZS4KICovCnZhciBsb2FkSW1hZ2VBc3luYyA9IGZ1bmN0aW9uKHVybCwgY2Fs
bGJhY2spIHsKICB2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgaW1n
Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgY2FsbGJhY2soaW1nKTsKICB9OwogIGltZy5zcmMg
PSB1cmw7Cn07CgovKioKICogTG9hZHMgYW4gYXJyYXkgb2YgaW1hZ2VzLgogKiBAcGFyYW0geyFB
cnJheS48c3RyaW5nPn0gdXJscyBVUkxzIG9mIGltYWdlcyB0byBsb2FkLgogKiBAcGFyYW0geyFm
dW5jdGlvbighe3N0cmluZywgaW1nfSk6IHZvaWR9IGNhbGxiYWNrIENhbGxiYWNrCiAqICAgICB0
aGF0IGdldHMgcGFzc2VkIG1hcCBvZiB1cmxzIHRvIGltZyB0YWdzLgogKi8KdmFyIGxvYWRJbWFn
ZXNBc3luYyA9IGZ1bmN0aW9uKHVybHMsIGNhbGxiYWNrKSB7CiAgdmFyIGNvdW50ID0gMTsKICB2
YXIgaW1hZ2VzID0geyB9OwogIGZ1bmN0aW9uIGNvdW50RG93bigpIHsKICAgIC0tY291bnQ7CiAg
ICBpZiAoY291bnQgPT0gMCkgewogICAgICBsb2coImxvYWRJbWFnZXNBc3luYzogYWxsIGltYWdl
cyBsb2FkZWQiKTsKICAgICAgY2FsbGJhY2soaW1hZ2VzKTsKICAgIH0KICB9CiAgZnVuY3Rpb24g
aW1hZ2VMb2FkZWQodXJsKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oaW1nKSB7CiAgICAgIGltYWdl
c1t1cmxdID0gaW1nOwogICAgICBsb2coImxvYWRJbWFnZXNBc3luYzogbG9hZGVkICIgKyB1cmwp
OwogICAgICBjb3VudERvd24oKTsKICAgIH0KICB9CiAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IHVy
bHMubGVuZ3RoOyArK2lpKSB7CiAgICArK2NvdW50OwogICAgbG9hZEltYWdlQXN5bmModXJsc1tp
aV0sIGltYWdlTG9hZGVkKHVybHNbaWldKSk7CiAgfQogIGNvdW50RG93bigpOwp9OwoKLyoqCiAq
IFJldHVybnMgYSBtYXAgb2Yga2V5PXZhbHVlIHZhbHVlcyBmcm9tIHVybC4KICogQHJldHVybiB7
IU9iamVjdC48c3RyaW5nLCBudW1iZXI+fSBtYXAgb2Yga2V5cyB0byB2YWx1ZXMuCiAqLwp2YXIg
Z2V0VXJsQXJndW1lbnRzID0gZnVuY3Rpb24oKSB7CiAgdmFyIGFyZ3MgPSB7fTsKICB0cnkgewog
ICAgdmFyIHMgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgIHZhciBxID0gcy5pbmRleE9mKCI/
Iik7CiAgICB2YXIgZSA9IHMuaW5kZXhPZigiIyIpOwogICAgaWYgKGUgPCAwKSB7CiAgICAgIGUg
PSBzLmxlbmd0aDsKICAgIH0KICAgIHZhciBxdWVyeSA9IHMuc3Vic3RyaW5nKHEgKyAxLCBlKTsK
ICAgIHZhciBwYWlycyA9IHF1ZXJ5LnNwbGl0KCImIik7CiAgICBmb3IgKHZhciBpaSA9IDA7IGlp
IDwgcGFpcnMubGVuZ3RoOyArK2lpKSB7CiAgICAgIHZhciBrZXlWYWx1ZSA9IHBhaXJzW2lpXS5z
cGxpdCgiPSIpOwogICAgICB2YXIga2V5ID0ga2V5VmFsdWVbMF07CiAgICAgIHZhciB2YWx1ZSA9
IGRlY29kZVVSSUNvbXBvbmVudChrZXlWYWx1ZVsxXSk7CiAgICAgIGFyZ3Nba2V5XSA9IHZhbHVl
OwogICAgfQogIH0gY2F0Y2ggKGUpIHsKICAgIHRocm93ICJjb3VsZCBub3QgcGFyc2UgdXJsIjsK
ICB9CiAgcmV0dXJuIGFyZ3M7Cn07CgovKioKICogTWFrZXMgYW4gaW1hZ2UgZnJvbSBhIHNyYy4K
ICogQHBhcmFtIHtzdHJpbmd9IHNyYyBJbWFnZSBzb3VyY2UgVVJMLgogKiBAcGFyYW0ge2Z1bmN0
aW9uKCl9IG9ubG9hZCBDYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGltYWdlIGhhcyBmaW5pc2Vk
IGxvYWRpbmcuCiAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gb25lcnJvciBDYWxsYmFjayB0byBjYWxs
IHdoZW4gYW4gZXJyb3Igb2NjdXJzLgogKiBAcmV0dXJuIHshSW1hZ2V9IFRoZSBjcmVhdGVkIGlt
YWdlLgogKi8KdmFyIG1ha2VJbWFnZSA9IGZ1bmN0aW9uKHNyYywgb25sb2FkLCBvbmVycm9yKSB7
CiAgdmFyIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogIGlmIChvbmxvYWQp
IHsKICAgIGltZy5vbmxvYWQgPSBvbmxvYWQ7CiAgfQogIGlmIChvbmVycm9yKSB7CiAgICBpbWcu
b25lcnJvciA9IG9uZXJyb3I7CiAgfSBlbHNlIHsKICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24o
KSB7CiAgICAgIGxvZygiV0FSTklORzogY3JlYXRpbmcgaW1hZ2UgZmFpbGVkOyBzcmM6ICIgKyB0
aGlzLnNyYyk7CiAgICB9OwogIH0KICBpZiAoc3JjKSB7CiAgICBpbWcuc3JjID0gc3JjOwogIH0K
ICByZXR1cm4gaW1nOwp9CgovKioKICogTWFrZXMgYW4gaW1hZ2UgZWxlbWVudCBmcm9tIGEgY2Fu
dmFzLgogKiBAcGFyYW0geyFIVE1MQ2FudmFzfSBjYW52YXMgQ2FudmFzIHRvIG1ha2UgaW1hZ2Ug
ZnJvbS4KICogQHBhcmFtIHtmdW5jdGlvbigpfSBvbmxvYWQgQ2FsbGJhY2sgdG8gY2FsbCB3aGVu
IHRoZSBpbWFnZSBoYXMgZmluaXNlZCBsb2FkaW5nLgogKiBAcGFyYW0ge3N0cmluZ30gaW1hZ2VG
b3JtYXQgSW1hZ2UgZm9ybWF0IHRvIGJlIHBhc3NlZCB0byB0b0RhdGFVcmwoKS4KICogQHJldHVy
biB7IUltYWdlfSBUaGUgY3JlYXRlZCBpbWFnZS4KICovCnZhciBtYWtlSW1hZ2VGcm9tQ2FudmFz
ID0gZnVuY3Rpb24oY2FudmFzLCBvbmxvYWQsIGltYWdlRm9ybWF0KSB7CiAgcmV0dXJuIG1ha2VJ
bWFnZShjYW52YXMudG9EYXRhVVJMKGltYWdlRm9ybWF0KSwgb25sb2FkKTsKfTsKCi8qKgogKiBN
YWtlcyBhIHZpZGVvIGVsZW1lbnQgZnJvbSBhIHNyYy4KICogQHBhcmFtIHtzdHJpbmd9IHNyYyBW
aWRlbyBzb3VyY2UgVVJMLgogKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IG9uZXJyb3IgQ2FsbGJhY2sg
dG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy4KICogQHJldHVybiB7IVZpZGVvfSBUaGUgY3Jl
YXRlZCB2aWRlby4KICovCnZhciBtYWtlVmlkZW8gPSBmdW5jdGlvbihzcmMsIG9uZXJyb3IpIHsK
ICB2YXIgdmlkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTsKICBpZiAob25lcnJv
cikgewogICAgdmlkLm9uZXJyb3IgPSBvbmVycm9yOwogIH0gZWxzZSB7CiAgICB2aWQub25lcnJv
ciA9IGZ1bmN0aW9uKCkgewogICAgICBsb2coIldBUk5JTkc6IGNyZWF0aW5nIHZpZGVvIGZhaWxl
ZDsgc3JjOiAiICsgdGhpcy5zcmMpOwogICAgfTsKICB9CiAgaWYgKHNyYykgewogICAgdmlkLnNy
YyA9IHNyYzsKICB9CiAgcmV0dXJuIHZpZDsKfQoKLyoqCiAqIEluc2VydHMgYW4gaW1hZ2Ugd2l0
aCBhIGNhcHRpb24gaW50byAnZWxlbWVudCcuCiAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbGVt
ZW50IEVsZW1lbnQgdG8gYXBwZW5kIGltYWdlIHRvLgogKiBAcGFyYW0ge3N0cmluZ30gY2FwdGlv
biBjYXB0aW9uIHRvIGFzc29jaWF0ZSB3aXRoIGltYWdlLgogKiBAcGFyYW0geyFJbWFnZX0gaW1n
IGltYWdlIHRvIGluc2VydC4KICovCnZhciBpbnNlcnRJbWFnZSA9IGZ1bmN0aW9uKGVsZW1lbnQs
IGNhcHRpb24sIGltZykgewogIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYi
KTsKICB2YXIgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICBsYWJlbC5h
cHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjYXB0aW9uKSk7CiAgZGl2LmFwcGVu
ZENoaWxkKGxhYmVsKTsKICBkaXYuYXBwZW5kQ2hpbGQoaW1nKTsKICBlbGVtZW50LmFwcGVuZENo
aWxkKGRpdik7Cn07CgovKioKICogSW5zZXJ0cyBhICdsYWJlbCcgdGhhdCB3aGVuIGNsaWNrZWQg
ZXhwYW5kcyB0byB0aGUgcHJlIGZvcm1hdHRlZCB0ZXh0CiAqIHN1cHBsaWVkIGJ5ICdzb3VyY2Un
LgogKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWxlbWVudCBlbGVtZW50IHRvIGFwcGVuZCBsYWJl
bCB0by4KICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIGxhYmVsIGZvciBhbmNob3IuCiAqIEBwYXJh
bSB7c3RyaW5nfSBzb3VyY2UgcHJlZm9ybWF0dGVkIHRleHQgdG8gZXhwYW5kIHRvLgogKiBAcGFy
YW0ge3N0cmluZ30gb3B0X3VybCBVUkwgb2Ygc291cmNlLiBJZiBwcm92aWRlZCBhIGxpbmsgdG8g
dGhlIHNvdXJjZSBmaWxlCiAqICAgICB3aWxsIGFsc28gYmUgYWRkZWQuCiAqLwp2YXIgYWRkU2hh
ZGVyU291cmNlID0gZnVuY3Rpb24oZWxlbWVudCwgbGFiZWwsIHNvdXJjZSwgb3B0X3VybCkgewog
IHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICB2YXIgcyA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoInByZSIpOwogIHMuY2xhc3NOYW1lID0gInNoYWRlci1zb3VyY2Ui
OwogIHMuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICB2YXIgb2wgPSBkb2N1bWVudC5jcmVhdGVF
bGVtZW50KCJvbCIpOwogIC8vcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShz
b3VyY2UpKTsKICB2YXIgbGluZXMgPSBzb3VyY2Uuc3BsaXQoIlxuIik7CiAgZm9yICh2YXIgaWkg
PSAwOyBpaSA8IGxpbmVzLmxlbmd0aDsgKytpaSkgewogICAgdmFyIGxpbmUgPSBsaW5lc1tpaV07
CiAgICB2YXIgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpOwogICAgbGkuYXBwZW5k
Q2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGluZSkpOwogICAgb2wuYXBwZW5kQ2hpbGQo
bGkpOwogIH0KICBzLmFwcGVuZENoaWxkKG9sKTsKICB2YXIgbCA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoImEiKTsKICBsLmhyZWYgPSAic2hvdy1zaGFkZXItc291cmNlIjsKICBsLmFwcGVuZENo
aWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxhYmVsKSk7CiAgbC5hZGRFdmVudExpc3RlbmVy
KCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVs
dCkgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgcy5zdHls
ZS5kaXNwbGF5ID0gKHMuc3R5bGUuZGlzcGxheSA9PSAnbm9uZScpID8gJ2Jsb2NrJyA6ICdub25l
JzsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwgZmFsc2UpOwogIGRpdi5hcHBlbmRDaGlsZChs
KTsKICBpZiAob3B0X3VybCkgewogICAgdmFyIHUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJh
Iik7CiAgICB1LmhyZWYgPSBvcHRfdXJsOwogICAgZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNy
ZWF0ZVRleHROb2RlKCIgIikpOwogICAgdS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0
Tm9kZSgiKCIgKyBvcHRfdXJsICsgIikiKSk7CiAgICBkaXYuYXBwZW5kQ2hpbGQodSk7CiAgfQog
IGRpdi5hcHBlbmRDaGlsZChzKTsKICBlbGVtZW50LmFwcGVuZENoaWxkKGRpdik7Cn07CgovKioK
ICogSW5zZXJ0cyBsYWJlbHMgdGhhdCB3aGVuIGNsaWNrZWQgZXhwYW5kIHRvIHNob3cgdGhlIG9y
aWdpbmFsIHNvdXJjZSBvZiB0aGUKICogc2hhZGVyIGFuZCBhbHNvIHRyYW5zbGF0ZWQgc291cmNl
IG9mIHRoZSBzaGFkZXIsIGlmIHRoYXQgaXMgYXZhaWxhYmxlLgogKiBAcGFyYW0ge1dlYkdMUmVu
ZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAqIEBw
YXJhbSB7IUhUTUxFbGVtZW50fSBlbGVtZW50IGVsZW1lbnQgdG8gYXBwZW5kIGxhYmVsIHRvLgog
KiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgbGFiZWwgZm9yIGFuY2hvci4KICogQHBhcmFtIHtXZWJH
TFNoYWRlcn0gc2hhZGVyIFNoYWRlciB0byBzaG93IHRoZSBzb3VyY2VzIGZvci4KICogQHBhcmFt
IHtzdHJpbmd9IHNoYWRlclNvdXJjZSBPcmlnaW5hbCBzaGFkZXIgc291cmNlLgogKiBAcGFyYW0g
e3N0cmluZ30gb3B0X3VybCBVUkwgb2Ygc291cmNlLiBJZiBwcm92aWRlZCBhIGxpbmsgdG8gdGhl
IHNvdXJjZSBmaWxlCiAqICAgICB3aWxsIGFsc28gYmUgYWRkZWQuCiAqLwp2YXIgYWRkU2hhZGVy
U291cmNlcyA9IGZ1bmN0aW9uKAogICAgZ2wsIGVsZW1lbnQsIGxhYmVsLCBzaGFkZXIsIHNoYWRl
clNvdXJjZSwgb3B0X3VybCkgewogIGFkZFNoYWRlclNvdXJjZShlbGVtZW50LCBsYWJlbCwgc2hh
ZGVyU291cmNlLCBvcHRfdXJsKTsKCiAgdmFyIGRlYnVnU2hhZGVycyA9IGdsLmdldEV4dGVuc2lv
bignV0VCR0xfZGVidWdfc2hhZGVycycpOwogIGlmIChkZWJ1Z1NoYWRlcnMgJiYgc2hhZGVyKSB7
CiAgICB2YXIgdHJhbnNsYXRlZFNvdXJjZSA9IGRlYnVnU2hhZGVycy5nZXRUcmFuc2xhdGVkU2hh
ZGVyU291cmNlKHNoYWRlcik7CiAgICBpZiAodHJhbnNsYXRlZFNvdXJjZSAhPSAnJykgewogICAg
ICBhZGRTaGFkZXJTb3VyY2UoZWxlbWVudCwgbGFiZWwgKyAnIHRyYW5zbGF0ZWQgZm9yIGRyaXZl
cicsIHRyYW5zbGF0ZWRTb3VyY2UpOwogICAgfQogIH0KfTsKCi8qKgogKiBTZW5kcyBzaGFkZXIg
aW5mb3JtYXRpb24gdG8gdGhlIHNlcnZlciB0byBiZSBkdW1wZWQgaW50byB0ZXh0IGZpbGVzCiAq
IHdoZW4gdGVzdHMgYXJlIHJ1biBmcm9tIHdpdGhpbiB0aGUgdGVzdC1ydW5uZXIgaGFybmVzcy4K
ICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0Nv
bnRleHQgdG8gdXNlLgogKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBvZiBjdXJyZW50LgogKiBA
cGFyYW0ge3N0cmluZ30gcGFzc01zZyBUZXN0IGRlc2NyaXB0aW9uLgogKiBAcGFyYW0ge29iamVj
dH0gdkluZm8gT2JqZWN0IGNvbnRhaW5pbmcgdmVydGV4IHNoYWRlciBpbmZvcm1hdGlvbi4KICog
QHBhcmFtIHtvYmplY3R9IGZJbmZvIE9iamVjdCBjb250YWluaW5nIGZyYWdtZW50IHNoYWRlciBp
bmZvcm1hdGlvbi4KICovCnZhciBkdW1wU2hhZGVyc0luZm8gPSBmdW5jdGlvbihnbCwgdXJsLCBw
YXNzTXNnLCB2SW5mbywgZkluZm8pIHsKICB2YXIgc2hhZGVySW5mbyA9IHt9OwogIHNoYWRlcklu
Zm8udXJsID0gdXJsOwogIHNoYWRlckluZm8udGVzdERlc2NyaXB0aW9uID0gcGFzc01zZzsKICBz
aGFkZXJJbmZvLnZMYWJlbCA9IHZJbmZvLmxhYmVsOwogIHNoYWRlckluZm8udlNob3VsZENvbXBp
bGUgPSB2SW5mby5zaGFkZXJTdWNjZXNzOwogIHNoYWRlckluZm8udlNvdXJjZSA9IHZJbmZvLnNv
dXJjZTsKICBzaGFkZXJJbmZvLmZMYWJlbCA9IGZJbmZvLmxhYmVsOwogIHNoYWRlckluZm8uZlNo
b3VsZENvbXBpbGUgPSBmSW5mby5zaGFkZXJTdWNjZXNzOwogIHNoYWRlckluZm8uZlNvdXJjZSA9
IGZJbmZvLnNvdXJjZTsKICBzaGFkZXJJbmZvLnZUcmFuc2xhdGVkU291cmNlID0gbnVsbDsKICBz
aGFkZXJJbmZvLmZUcmFuc2xhdGVkU291cmNlID0gbnVsbDsKICB2YXIgZGVidWdTaGFkZXJzID0g
Z2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9kZWJ1Z19zaGFkZXJzJyk7CiAgaWYgKGRlYnVnU2hhZGVy
cykgewogICAgaWYgKHZJbmZvLnNoYWRlcikKICAgICAgc2hhZGVySW5mby52VHJhbnNsYXRlZFNv
dXJjZSA9IGRlYnVnU2hhZGVycy5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKHZJbmZvLnNoYWRl
cik7CiAgICBpZiAoZkluZm8uc2hhZGVyKQogICAgICBzaGFkZXJJbmZvLmZUcmFuc2xhdGVkU291
cmNlID0gZGVidWdTaGFkZXJzLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoZkluZm8uc2hhZGVy
KTsKICB9CgogIHZhciBkdW1wU2hhZGVySW5mb1JlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3Qo
KTsKICBkdW1wU2hhZGVySW5mb1JlcXVlc3Qub3BlbignUE9TVCcsICIvZHVtcFNoYWRlckluZm8i
LCB0cnVlKTsKICBkdW1wU2hhZGVySW5mb1JlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcigiQ29udGVu
dC1UeXBlIiwgInRleHQvcGxhaW4iKTsKICBkdW1wU2hhZGVySW5mb1JlcXVlc3Quc2VuZChKU09O
LnN0cmluZ2lmeShzaGFkZXJJbmZvKSk7Cn07CgovLyBBZGQgeW91ciBwcmVmaXggaGVyZS4KdmFy
IGJyb3dzZXJQcmVmaXhlcyA9IFsKICAiIiwKICAiTU9aXyIsCiAgIk9QXyIsCiAgIldFQktJVF8i
Cl07CgovKioKICogR2l2ZW4gYW4gZXh0ZW5zaW9uIG5hbWUgbGlrZSBXRUJHTF9jb21wcmVzc2Vk
X3RleHR1cmVfczN0YwogKiByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzdXBwb3J0ZWQgdmVyc2lv
biBleHRlbnNpb24sIGxpa2UKICogV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV0dXJlX3MzdGMK
ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBleHRlbnNpb24gdG8gbG9vayBmb3IuCiAq
IEByZXR1cm4ge3N0cmluZ30gbmFtZSBvZiBleHRlbnNpb24gZm91bmQgb3IgdW5kZWZpbmVkIGlm
IG5vdAogKiAgICAgZm91bmQuCiAqLwp2YXIgZ2V0U3VwcG9ydGVkRXh0ZW5zaW9uV2l0aEtub3du
UHJlZml4ZXMgPSBmdW5jdGlvbihnbCwgbmFtZSkgewogIHZhciBzdXBwb3J0ZWQgPSBnbC5nZXRT
dXBwb3J0ZWRFeHRlbnNpb25zKCk7CiAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGJyb3dzZXJQcmVm
aXhlcy5sZW5ndGg7ICsraWkpIHsKICAgIHZhciBwcmVmaXhlZE5hbWUgPSBicm93c2VyUHJlZml4
ZXNbaWldICsgbmFtZTsKICAgIGlmIChzdXBwb3J0ZWQuaW5kZXhPZihwcmVmaXhlZE5hbWUpID49
IDApIHsKICAgICAgcmV0dXJuIHByZWZpeGVkTmFtZTsKICAgIH0KICB9Cn07CgovKioKICogR2l2
ZW4gYW4gZXh0ZW5zaW9uIG5hbWUgbGlrZSBXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Ywog
KiByZXR1cm5zIHRoZSBzdXBwb3J0ZWQgdmVyc2lvbiBleHRlbnNpb24sIGxpa2UKICogV0VCS0lU
X1dFQkdMX2NvbXByZXNzZWRfdGV0dXJlX3MzdGMKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFt
ZSBvZiBleHRlbnNpb24gdG8gbG9vayBmb3IuCiAqIEByZXR1cm4ge1dlYkdMRXh0ZW5zaW9ufSBU
aGUgZXh0ZW5zaW9uIG9yIHVuZGVmaW5lZCBpZiBub3QKICogICAgIGZvdW5kLgogKi8KdmFyIGdl
dEV4dGVuc2lvbldpdGhLbm93blByZWZpeGVzID0gZnVuY3Rpb24oZ2wsIG5hbWUpIHsKICBmb3Ig
KHZhciBpaSA9IDA7IGlpIDwgYnJvd3NlclByZWZpeGVzLmxlbmd0aDsgKytpaSkgewogICAgdmFy
IHByZWZpeGVkTmFtZSA9IGJyb3dzZXJQcmVmaXhlc1tpaV0gKyBuYW1lOwogICAgdmFyIGV4dCA9
IGdsLmdldEV4dGVuc2lvbihwcmVmaXhlZE5hbWUpOwogICAgaWYgKGV4dCkgewogICAgICByZXR1
cm4gZXh0OwogICAgfQogIH0KfTsKCi8qKgogKiBSZXR1cm5zIHBvc3NpYmxlIHByZWZpeGVkIHZl
cnNpb25zIG9mIGFuIGV4dGVuc2lvbidzIG5hbWUuCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5h
bWUgb2YgZXh0ZW5zaW9uLiBNYXkgYWxyZWFkeSBpbmNsdWRlIGEgcHJlZml4LgogKiBAcmV0dXJu
IHtBcnJheS48c3RyaW5nPn0gVmFyaWF0aW9ucyBvZiB0aGUgZXh0ZW5zaW9uIG5hbWUgd2l0aCBr
bm93bgogKiAgICAgYnJvd3NlciBwcmVmaXhlcy4KICovCnZhciBnZXRFeHRlbnNpb25QcmVmaXhl
ZE5hbWVzID0gZnVuY3Rpb24obmFtZSkgewogIHZhciB1bnByZWZpeCA9IGZ1bmN0aW9uKG5hbWUp
IHsKICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBicm93c2VyUHJlZml4ZXMubGVuZ3RoOyArK2lp
KSB7CiAgICAgIGlmIChicm93c2VyUHJlZml4ZXNbaWldLmxlbmd0aCA+IDAgJiYKICAgICAgICAg
IG5hbWUuc3Vic3RyaW5nKDAsIGJyb3dzZXJQcmVmaXhlc1tpaV0ubGVuZ3RoKS50b0xvd2VyQ2Fz
ZSgpID09PQogICAgICAgICAgYnJvd3NlclByZWZpeGVzW2lpXS50b0xvd2VyQ2FzZSgpKSB7CiAg
ICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGJyb3dzZXJQcmVmaXhlc1tpaV0ubGVuZ3RoKTsK
ICAgICAgfQogICAgfQogICAgcmV0dXJuIG5hbWU7CiAgfQoKICB2YXIgdW5wcmVmaXhlZCA9IHVu
cHJlZml4KG5hbWUpOwoKICB2YXIgdmFyaWF0aW9ucyA9IFtdOwogIGZvciAodmFyIGlpID0gMDsg
aWkgPCBicm93c2VyUHJlZml4ZXMubGVuZ3RoOyArK2lpKSB7CiAgICB2YXJpYXRpb25zLnB1c2go
YnJvd3NlclByZWZpeGVzW2lpXSArIHVucHJlZml4ZWQpOwogIH0KCiAgcmV0dXJuIHZhcmlhdGlv
bnM7Cn07Cgp2YXIgcmVwbGFjZVJFID0gL1wkXCgoXHcrKVwpL2c7CgovKioKICogUmVwbGFjZXMg
c3RyaW5ncyB3aXRoIHByb3BlcnR5IHZhbHVlcy4KICogR2l2ZW4gYSBzdHJpbmcgbGlrZSAiaGVs
bG8gJChmaXJzdCkgJChsYXN0KSIgYW5kIGFuIG9iamVjdAogKiBsaWtlIHtmaXJzdDoiSm9obiIs
IGxhc3Q6IlNtaXRoIn0gd2lsbCByZXR1cm4KICogImhlbGxvIEpvaG4gU21pdGgiLgogKiBAcGFy
YW0ge3N0cmluZ30gc3RyIFN0cmluZyB0byBkbyByZXBsYWNlbWVudHMgaW4uCiAqIEBwYXJhbSB7
Li4ufSAxIG9yIG1vcmUgb2JqZWN0cyBjb250YWluaW5nIHByb3BlcnRpZXMuCiAqLwp2YXIgcmVw
bGFjZVBhcmFtcyA9IGZ1bmN0aW9uKHN0cikgewogIHZhciBhcmdzID0gYXJndW1lbnRzOwogIHJl
dHVybiBzdHIucmVwbGFjZShyZXBsYWNlUkUsIGZ1bmN0aW9uKHN0ciwgcDEsIG9mZnNldCwgcykg
ewogICAgZm9yICh2YXIgaWkgPSAxOyBpaSA8IGFyZ3MubGVuZ3RoOyArK2lpKSB7CiAgICAgIGlm
IChhcmdzW2lpXVtwMV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiBhcmdzW2lpXVtw
MV07CiAgICAgIH0KICAgIH0KICAgIHRocm93ICJ1bmtub3duIHN0cmluZyBwYXJhbSAnIiArIHAx
ICsgIiciOwogIH0pOwp9OwoKdmFyIHVwcGVyQ2FzZUZpcnN0TGV0dGVyID0gZnVuY3Rpb24oc3Ry
KSB7CiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHN0ci5zdWJz
dHJpbmcoMSk7Cn07CgovKioKICogR2V0cyBhIHByZWZpeGVkIHByb3BlcnR5LiBGb3IgZXhhbXBs
ZSwKICoKICogICAgIHZhciBmbiA9IGdldFByZWZpeGVkUHJvcGVydHkoCiAqICAgICAgICB3aW5k
b3csCiAqICAgICAgICAicmVxdWVzdEFuaW1hdGlvbkZyYW1lIik7CiAqCiAqIFdpbGwgcmV0dXJu
IGVpdGhlcjoKICogICAgIndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLAogKiAgICAid2lu
ZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLAogKiAgICAid2luZG93Lm1zUmVxdWVzdEFuaW1h
dGlvbkZyYW1lIiwKICogICAgIndpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLAogKiAg
ICAid2luZG93LndlYktpdFJlcXVlc3RBbmltYXRpb25GcmFtZSIsCiAqICAgIHVuZGVmaW5lZAog
KgogKiB0aGUgbm9uLXByZWZpeGVkIGZ1bmN0aW9uIGlzIHRyaWVkIGZpcnN0LgogKi8KdmFyIHBy
b3BlcnR5UHJlZml4ZXMgPSBbIiIsICJtb3oiLCAibXMiLCAibyIsICJ3ZWJraXQiXTsKdmFyIGdl
dFByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbihvYmosIHByb3BlcnR5TmFtZSkgewogIGZvciAo
dmFyIGlpID0gMDsgaWkgPCBwcm9wZXJ0eVByZWZpeGVzLmxlbmd0aDsgKytpaSkgewogICAgdmFy
IHByZWZpeCA9IHByb3BlcnR5UHJlZml4ZXNbaWldOwogICAgdmFyIG5hbWUgPSBwcmVmaXggKyBw
cm9wZXJ0eU5hbWU7CiAgICBsb2cobmFtZSk7CiAgICB2YXIgcHJvcGVydHkgPSBvYmpbbmFtZV07
CiAgICBpZiAocHJvcGVydHkpIHsKICAgICAgcmV0dXJuIHByb3BlcnR5OwogICAgfQogICAgaWYg
KGlpID09IDApIHsKICAgICAgcHJvcGVydHlOYW1lID0gdXBwZXJDYXNlRmlyc3RMZXR0ZXIocHJv
cGVydHlOYW1lKTsKICAgIH0KICB9CiAgcmV0dXJuIHVuZGVmaW5lZDsKfTsKCnZhciBfcmVxdWVz
dEFuaW1GcmFtZTsKCi8qKgogKiBQcm92aWRlcyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgaW4gYSBj
cm9zcyBicm93c2VyIHdheS4KICovCnZhciByZXF1ZXN0QW5pbUZyYW1lID0gZnVuY3Rpb24oY2Fs
bGJhY2spIHsKICBpZiAoIV9yZXF1ZXN0QW5pbUZyYW1lKSB7CiAgICBfcmVxdWVzdEFuaW1GcmFt
ZSA9IGdldFByZWZpeGVkUHJvcGVydHkod2luZG93LCAicmVxdWVzdEFuaW1hdGlvbkZyYW1lIikg
fHwKICAgICAgZnVuY3Rpb24oY2FsbGJhY2ssIGVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gd2lu
ZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA3MCk7CiAgICAgIH07CiAgfQogIF9yZXF1
ZXN0QW5pbUZyYW1lLmNhbGwod2luZG93LCBjYWxsYmFjayk7Cn07Cgp2YXIgX2NhbmNlbEFuaW1G
cmFtZTsKCi8qKgogKiBQcm92aWRlcyBjYW5jZWxBbmltYXRpb25GcmFtZSBpbiBhIGNyb3NzIGJy
b3dzZXIgd2F5LgogKi8KdmFyIGNhbmNlbEFuaW1GcmFtZSA9IGZ1bmN0aW9uKHJlcXVlc3QpIHsK
ICBpZiAoIV9jYW5jZWxBbmltRnJhbWUpIHsKICAgIF9jYW5jZWxBbmltRnJhbWUgPSBnZXRQcmVm
aXhlZFByb3BlcnR5KHdpbmRvdywgImNhbmNlbEFuaW1hdGlvbkZyYW1lIikgfHwKICAgICAgd2lu
ZG93LmNsZWFyVGltZW91dDsKICB9CiAgX2NhbmNlbEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgcmVx
dWVzdCk7Cn07CgovKioKICogUHJvdmlkZXMgdmlkZW8ucmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFj
ayBpbiBhIGNyb3NzIGJyb3dzZXIgd2F5LgogKiBSZXR1cm5zIGEgcHJvcGVydHksIG9yIHVuZGVm
aW5lZCBpZiB1bnN1cG9ydGVkLgogKi8KdmFyIGdldFJlcXVlc3RWaWRGcmFtZUNhbGxiYWNrID0g
ZnVuY3Rpb24oKSB7CiAgcmV0dXJuIEhUTUxWaWRlb0VsZW1lbnQucHJvdG90eXBlWyJyZXF1ZXN0
VmlkZW9GcmFtZUNhbGxiYWNrIl07Cn07CgovKioKICogUHJvdmlkZXMgcmVxdWVzdEZ1bGxTY3Jl
ZW4gaW4gYSBjcm9zcyBicm93c2VyIHdheS4KICovCnZhciByZXF1ZXN0RnVsbFNjcmVlbiA9IGZ1
bmN0aW9uKGVsZW1lbnQpIHsKICB2YXIgZm4gPSBnZXRQcmVmaXhlZFByb3BlcnR5KGVsZW1lbnQs
ICJyZXF1ZXN0RnVsbFNjcmVlbiIpOwogIGlmIChmbikgewogICAgZm4uY2FsbChlbGVtZW50KTsK
ICB9Cn07CgovKioKICogUHJvdmlkZXMgY2FuY2VsRnVsbFNjcmVlbiBpbiBhIGNyb3NzIGJyb3dz
ZXIgd2F5LgogKi8KdmFyIGNhbmNlbEZ1bGxTY3JlZW4gPSBmdW5jdGlvbigpIHsKICB2YXIgZm4g
PSBnZXRQcmVmaXhlZFByb3BlcnR5KGRvY3VtZW50LCAiY2FuY2VsRnVsbFNjcmVlbiIpOwogIGlm
IChmbikgewogICAgZm4uY2FsbChkb2N1bWVudCk7CiAgfQp9OwoKdmFyIGZ1bGxTY3JlZW5TdGF0
ZU5hbWU7CihmdW5jdGlvbigpIHsKICB2YXIgZnVsbFNjcmVlblN0YXRlTmFtZXMgPSBbCiAgICAi
aXNGdWxsU2NyZWVuIiwKICAgICJmdWxsU2NyZWVuIgogIF07CiAgZm9yICh2YXIgaWkgPSAwOyBp
aSA8IGZ1bGxTY3JlZW5TdGF0ZU5hbWVzLmxlbmd0aDsgKytpaSkgewogICAgdmFyIHByb3BlcnR5
TmFtZSA9IGZ1bGxTY3JlZW5TdGF0ZU5hbWVzW2lpXTsKICAgIGZvciAodmFyIGpqID0gMDsgamog
PCBwcm9wZXJ0eVByZWZpeGVzLmxlbmd0aDsgKytqaikgewogICAgICB2YXIgcHJlZml4ID0gcHJv
cGVydHlQcmVmaXhlc1tqal07CiAgICAgIGlmIChwcmVmaXgubGVuZ3RoKSB7CiAgICAgICAgcHJv
cGVydHlOYW1lID0gdXBwZXJDYXNlRmlyc3RMZXR0ZXIocHJvcGVydHlOYW1lKTsKICAgICAgICBm
dWxsU2NyZWVuU3RhdGVOYW1lID0gcHJlZml4ICsgcHJvcGVydHlOYW1lOwogICAgICAgIGlmIChk
b2N1bWVudFtmdWxsU2NyZWVuU3RhdGVOYW1lXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBy
ZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmdWxsU2NyZWVuU3RhdGVOYW1lID0g
dW5kZWZpbmVkOwogIH0KfSgpKTsKCi8qKgogKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGZ1
bGxzY3JlZW4gbW9kZSBpcyBhY3RpdmUuCiAqLwp2YXIgZ2V0RnVsbFNjcmVlblN0YXRlID0gZnVu
Y3Rpb24oKSB7CiAgbG9nKCJmdWxsc2NyZWVuc3RhdGVuYW1lOiIgKyBmdWxsU2NyZWVuU3RhdGVO
YW1lKTsKICBsb2coZG9jdW1lbnRbZnVsbFNjcmVlblN0YXRlTmFtZV0pOwogIHJldHVybiBkb2N1
bWVudFtmdWxsU2NyZWVuU3RhdGVOYW1lXTsKfTsKCi8qKgogKiBAcGFyYW0geyFIVE1MRWxlbWVu
dH0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBnbyBmdWxsc2NyZWVuLgogKiBAcGFyYW0geyFmdW5j
dGlvbihib29sZWFuKX0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkCiAq
ICAgICAgICB3aGVuIGVudGVyaW5nL2V4aXRpbmcgZnVsbHNjcmVlbi4gSXQgaXMgcGFzc2VkIHRy
dWUgaWYKICogICAgICAgIGVudGVyaW5nIGZ1bGxzY3JlZW4sIGZhbHNlIGlmIGV4aXRpbmcuCiAq
Lwp2YXIgb25GdWxsU2NyZWVuQ2hhbmdlID0gZnVuY3Rpb24oZWxlbWVudCwgY2FsbGJhY2spIHsK
ICBwcm9wZXJ0eVByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24ocHJlZml4KSB7CiAgICB2YXIgZXZl
bnROYW1lID0gcHJlZml4ICsgImZ1bGxzY3JlZW5jaGFuZ2UiOwogICAgbG9nKCJhZGRldmVudDog
IiArIGV2ZW50TmFtZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwg
ZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgbG9nKCJldmVudDogIiArIGV2ZW50TmFtZSk7CiAgICAg
IGNhbGxiYWNrKGdldEZ1bGxTY3JlZW5TdGF0ZSgpKTsKICAgIH0pOwogIH0pOwp9OwoKLyoqCiAq
IEBwYXJhbSB7IXN0cmluZ30gYnV0dG9uSWQgVGhlIGlkIG9mIHRoZSBidXR0b24gdGhhdCB3aWxs
IHRvZ2dsZSBmdWxsc2NyZWVuCiAqICAgICAgICBtb2RlLgogKiBAcGFyYW0geyFzdHJpbmd9IGZ1
bGxzY3JlZW5JZCBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gZ28gZnVsbHNjcmVlbi4KICogQHBh
cmFtIHshZnVuY3Rpb24oYm9vbGVhbil9IGNhbGxiYWNrIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJl
IGNhbGxlZAogKiAgICAgICAgd2hlbiBlbnRlcmluZy9leGl0aW5nIGZ1bGxzY3JlZW4uIEl0IGlz
IHBhc3NlZCB0cnVlIGlmCiAqICAgICAgICBlbnRlcmluZyBmdWxsc2NyZWVuLCBmYWxzZSBpZiBl
eGl0aW5nLgogKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGZ1bGxzY3JlZW4gbW9kZSBpcyBz
dXBwb3J0ZWQuCiAqLwp2YXIgc2V0dXBGdWxsc2NyZWVuID0gZnVuY3Rpb24oYnV0dG9uSWQsIGZ1
bGxzY3JlZW5JZCwgY2FsbGJhY2spIHsKICBpZiAoIWZ1bGxTY3JlZW5TdGF0ZU5hbWUpIHsKICAg
IHJldHVybiBmYWxzZTsKICB9CgogIHZhciBmdWxsc2NyZWVuRWxlbWVudCA9IGRvY3VtZW50Lmdl
dEVsZW1lbnRCeUlkKGZ1bGxzY3JlZW5JZCk7CiAgb25GdWxsU2NyZWVuQ2hhbmdlKGZ1bGxzY3Jl
ZW5FbGVtZW50LCBjYWxsYmFjayk7CgogIHZhciB0b2dnbGVGdWxsU2NyZWVuID0gZnVuY3Rpb24o
ZXZlbnQpIHsKICAgIGlmIChnZXRGdWxsU2NyZWVuU3RhdGUoKSkgewogICAgICBjYW5jZWxGdWxs
U2NyZWVuKGZ1bGxzY3JlZW5FbGVtZW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlcXVlc3RGdWxs
U2NyZWVuKGZ1bGxzY3JlZW5FbGVtZW50KTsKICAgIH0KICAgIGV2ZW50LnByZXZlbnREZWZhdWx0
KCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgdmFyIGJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZChidXR0b25JZCk7CiAgYnV0dG9uRWxlbWVudC5hZGRFdmVudExpc3Rl
bmVyKCdjbGljaycsIHRvZ2dsZUZ1bGxTY3JlZW4pOwoKICByZXR1cm4gdHJ1ZTsKfTsKCi8qKgog
KiBXYWl0cyBmb3IgdGhlIGJyb3dzZXIgdG8gY29tcG9zaXRlIHRoZSB3ZWIgcGFnZS4KICogQHBh
cmFtIHtmdW5jdGlvbigpfSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgY29tcG9z
aXRpbmcgaGFzIHRha2VuCiAqICAgICAgICBwbGFjZS4KICovCnZhciB3YWl0Rm9yQ29tcG9zaXRl
ID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICB2YXIgZnJhbWVzID0gNTsKICB2YXIgY291bnREb3du
ID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoZnJhbWVzID09IDApIHsKICAgICAgLy8gVE9ETyhrYnIp
OiB1bmlmeSB3aXRoIGpzLXRlc3QtcHJlLmpzIGFuZCBlbmFibGUgdGhlc2Ugd2l0aAogICAgICAv
LyB2ZXJib3NlIGxvZ2dpbmcuCiAgICAgIC8vIGxvZygid2FpdEZvckNvbXBvc2l0ZTogY2FsbGJh
Y2siKTsKICAgICAgY2FsbGJhY2soKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGxvZygid2FpdEZv
ckNvbXBvc2l0ZTogY291bnRkb3duKCIgKyBmcmFtZXMgKyAiKSIpOwogICAgICAtLWZyYW1lczsK
ICAgICAgcmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgY291bnREb3duKTsKICAgIH0KICB9
OwogIGNvdW50RG93bigpOwp9OwoKdmFyIHNldFplcm9UaW1lb3V0ID0gKGZ1bmN0aW9uKCkgewog
IC8vIFNlZSBodHRwczovL2RiYXJvbi5vcmcvbG9nLzIwMTAwMzA5LWZhc3Rlci10aW1lb3V0cwoK
ICB2YXIgdGltZW91dHMgPSBbXTsKICB2YXIgbWVzc2FnZU5hbWUgPSAiemVyby10aW1lb3V0LW1l
c3NhZ2UiOwoKICAvLyBMaWtlIHNldFRpbWVvdXQsIGJ1dCBvbmx5IHRha2VzIGEgZnVuY3Rpb24g
YXJndW1lbnQuICBUaGVyZSdzCiAgLy8gbm8gdGltZSBhcmd1bWVudCAoYWx3YXlzIHplcm8pIGFu
ZCBubyBhcmd1bWVudHMgKHlvdSBoYXZlIHRvCiAgLy8gdXNlIGEgY2xvc3VyZSkuCiAgZnVuY3Rp
b24gc2V0WmVyb1RpbWVvdXQoZm4pIHsKICAgICAgdGltZW91dHMucHVzaChmbik7CiAgICAgIHdp
bmRvdy5wb3N0TWVzc2FnZShtZXNzYWdlTmFtZSwgIioiKTsKICB9CgogIGZ1bmN0aW9uIGhhbmRs
ZU1lc3NhZ2UoZXZlbnQpIHsKICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PSB3aW5kb3cgJiYgZXZl
bnQuZGF0YSA9PSBtZXNzYWdlTmFtZSkgewogICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9u
KCk7CiAgICAgICAgICBpZiAodGltZW91dHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIHZh
ciBmbiA9IHRpbWVvdXRzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgZm4oKTsKICAgICAgICAgIH0K
ICAgICAgfQogIH0KCiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCBoYW5kbGVN
ZXNzYWdlLCB0cnVlKTsKCiAgcmV0dXJuIHNldFplcm9UaW1lb3V0Owp9KSgpOwoKLyoqCiAqIFJ1
bnMgYW4gYXJyYXkgb2YgZnVuY3Rpb25zLCB5aWVsZGluZyB0byB0aGUgYnJvd3NlciBiZXR3ZWVu
IGVhY2ggc3RlcC4KICogSWYgeW91IHdhbnQgdG8ga25vdyB3aGVuIGFsbCB0aGUgc3RlcHMgYXJl
IGZpbmlzaGVkIGFkZCBhIGxhc3Qgc3RlcC4KICogQHBhcmFtIHshQXJyYXkuPGZ1bmN0aW9uKCk6
IHZvaWQ+fSBzdGVwcyBBcnJheSBvZiBmdW5jdGlvbnMuCiAqLwp2YXIgcnVuU3RlcHMgPSBmdW5j
dGlvbihzdGVwcykgewogIGlmICghc3RlcHMubGVuZ3RoKSB7CiAgICByZXR1cm47CiAgfQoKICAv
LyBjb3B5IHN0ZXBzIHNvIHRoZXkgY2FuJ3QgYmUgbW9kaWZlZC4KICB2YXIgc3RlcHNUb1J1biA9
IHN0ZXBzLnNsaWNlKCk7CiAgdmFyIGN1cnJlbnRTdGVwID0gMDsKICB2YXIgcnVuTmV4dFN0ZXAg
PSBmdW5jdGlvbigpIHsKICAgIHN0ZXBzVG9SdW5bY3VycmVudFN0ZXArK10oKTsKICAgIGlmIChj
dXJyZW50U3RlcCA8IHN0ZXBzVG9SdW4ubGVuZ3RoKSB7CiAgICAgIHNldFRpbWVvdXQocnVuTmV4
dFN0ZXAsIDEpOwogICAgfQogIH07CiAgcnVuTmV4dFN0ZXAoKTsKfTsKCi8qKgogKiBTdGFydHMg
cGxheWluZyBhIHZpZGVvIGFuZCB3YWl0cyBmb3IgaXQgdG8gYmUgY29uc3VtYWJsZS4KICogQHBh
cmFtIHshSFRNTFZpZGVvRWxlbWVudH0gdmlkZW8gQW4gSFRNTDUgVmlkZW8gZWxlbWVudC4KICog
QHBhcmFtIHshZnVuY3Rpb24oIUhUTUxWaWRlb0VsZW1lbnQpOiB2b2lkfSBjYWxsYmFjayBGdW5j
dGlvbiB0byBjYWxsIHdoZW4KICogICAgICAgIHZpZGVvIGlzIHJlYWR5LgogKi8KdmFyIHN0YXJ0
UGxheWluZ0FuZFdhaXRGb3JWaWRlbyA9IGZ1bmN0aW9uKHZpZGVvLCBjYWxsYmFjaykgewogIHZh
ciBydmZjID0gZ2V0UmVxdWVzdFZpZEZyYW1lQ2FsbGJhY2soKTsKICBpZiAocnZmYyA9PT0gdW5k
ZWZpbmVkKSB7CiAgICB2YXIgZ290UGxheWluZyA9IGZhbHNlOwogICAgdmFyIGdvdFRpbWVVcGRh
dGUgPSBmYWxzZTsKCiAgICB2YXIgbWF5YmVDYWxsQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHsKICAg
ICAgaWYgKGdvdFBsYXlpbmcgJiYgZ290VGltZVVwZGF0ZSAmJiBjYWxsYmFjaykgewogICAgICAg
IGNhbGxiYWNrKHZpZGVvKTsKICAgICAgICBjYWxsYmFjayA9IHVuZGVmaW5lZDsKICAgICAgICB2
aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgcGxheWluZ0xpc3RlbmVyLCB0cnVl
KTsKICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgdGltZXVw
ZGF0ZUxpc3RlbmVyLCB0cnVlKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgcGxheWluZ0xpc3Rl
bmVyID0gZnVuY3Rpb24oKSB7CiAgICAgIGdvdFBsYXlpbmcgPSB0cnVlOwogICAgICBtYXliZUNh
bGxDYWxsYmFjaygpOwogICAgfTsKCiAgICB2YXIgdGltZXVwZGF0ZUxpc3RlbmVyID0gZnVuY3Rp
b24oKSB7CiAgICAgIC8vIENoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGUgY3VycmVudCB0aW1lIGhh
cyBhZHZhbmNlZCBiZXlvbmQKICAgICAgLy8gdGhlIHN0YXJ0IHRpbWUgc2VlbXMgdG8gYmUgYSBy
ZWxpYWJsZSBoZXVyaXN0aWMgdGhhdCB0aGUKICAgICAgLy8gdmlkZW8gZWxlbWVudCBoYXMgZGF0
YSB0aGF0IGNhbiBiZSBjb25zdW1lZC4KICAgICAgaWYgKHZpZGVvLmN1cnJlbnRUaW1lID4gMC4w
KSB7CiAgICAgICAgZ290VGltZVVwZGF0ZSA9IHRydWU7CiAgICAgICAgbWF5YmVDYWxsQ2FsbGJh
Y2soKTsKICAgICAgfQogICAgfTsKCiAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5n
JywgcGxheWluZ0xpc3RlbmVyLCB0cnVlKTsKICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3Rp
bWV1cGRhdGUnLCB0aW1ldXBkYXRlTGlzdGVuZXIsIHRydWUpOwogIH0gZWxzZSB7CiAgICAvLyBD
YWxscyB2aWRlby5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKF8gPT4geyBjYWxsYmFjayh2aWRl
bykgfSkKICAgIHJ2ZmMuY2FsbCh2aWRlbywgXyA9PiB7IGNhbGxiYWNrKHZpZGVvKSB9KTsKICB9
CgogIHZpZGVvLmxvb3AgPSB0cnVlOwogIHZpZGVvLm11dGVkID0gdHJ1ZTsKICAvLyBTZWUgd2hl
dGhlciBzZXR0aW5nIHRoZSBwcmVsb2FkIGZsYWcgZGUtZmxha2VzIHZpZGVvLXJlbGF0ZWQgdGVz
dHMuCiAgdmlkZW8ucHJlbG9hZCA9ICdhdXRvJzsKICB2aWRlby5wbGF5KCk7Cn07Cgp2YXIgZ2V0
SG9zdCA9IGZ1bmN0aW9uKHVybCkgewogIHVybCA9IHVybC5yZXBsYWNlKCJcXCIsICIvIik7CiAg
dmFyIHBvcyA9IHVybC5pbmRleE9mKCI6Ly8iKTsKICBpZiAocG9zID49IDApIHsKICAgIHVybCA9
IHVybC5zdWJzdHIocG9zICsgMyk7CiAgfQogIHZhciBwYXJ0cyA9IHVybC5zcGxpdCgnLycpOwog
IHJldHVybiBwYXJ0c1swXTsKfQoKLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsYXN0IDIg
d29yZHMgb2YgdGhlIGRvbWFpbiBvZiBhIFVSTAovLyBUaGlzIGlzIHByb2JhYmx5IG5vdCB0aGUg
Y29ycmVjdCBjaGVjayBidXQgaXQgd2lsbCBkbyBmb3Igbm93Lgp2YXIgZ2V0QmFzZURvbWFpbiA9
IGZ1bmN0aW9uKGhvc3QpIHsKICB2YXIgcGFydHMgPSBob3N0LnNwbGl0KCI6Iik7CiAgdmFyIGhv
c3RuYW1lID0gcGFydHNbMF07CiAgdmFyIHBvcnQgPSBwYXJ0c1sxXSB8fCAiODAiOwogIHBhcnRz
ID0gaG9zdG5hbWUuc3BsaXQoIi4iKTsKICBpZihwYXJ0cy5sZW5ndGggPCAyKQogICAgcmV0dXJu
IGhvc3RuYW1lICsgIjoiICsgcG9ydDsKICB2YXIgdGxkID0gcGFydHNbcGFydHMubGVuZ3RoLTFd
OwogIHZhciBkb21haW4gPSBwYXJ0c1twYXJ0cy5sZW5ndGgtMl07CiAgcmV0dXJuIGRvbWFpbiAr
ICIuIiArIHRsZCArICI6IiArIHBvcnQ7Cn0KCnZhciBydW5uaW5nT25Mb2NhbGhvc3QgPSBmdW5j
dGlvbigpIHsKICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluZGV4T2YoImxvY2Fs
aG9zdCIpICE9IC0xIHx8CiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5pbmRleE9mKCIx
MjcuMC4wLjEiKSAhPSAtMTsKfQoKdmFyIGdldExvY2FsQ3Jvc3NPcmlnaW4gPSBmdW5jdGlvbigp
IHsKICB2YXIgZG9tYWluOwogIGlmICh3aW5kb3cubG9jYXRpb24uaG9zdC5pbmRleE9mKCJsb2Nh
bGhvc3QiKSAhPSAtMSkgewogICAgZG9tYWluID0gIjEyNy4wLjAuMSI7CiAgfSBlbHNlIHsKICAg
IGRvbWFpbiA9ICJsb2NhbGhvc3QiOwogIH0KCiAgdmFyIHBvcnQgPSB3aW5kb3cubG9jYXRpb24u
cG9ydCB8fCAiODAiOwogIHJldHVybiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsg
ZG9tYWluICsgIjoiICsgcG9ydAp9Cgp2YXIgZ2V0UmVsYXRpdmVQYXRoID0gZnVuY3Rpb24ocGF0
aCkgewogIHZhciByZWxwYXJ0cyA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgiLyIp
OwogIHJlbHBhcnRzLnBvcCgpOyAvLyBQb3Agb2ZmIGZpbGVuYW1lCiAgdmFyIHBhdGhwYXJ0cyA9
IHBhdGguc3BsaXQoIi8iKTsKCiAgdmFyIGk7CiAgZm9yIChpID0gMDsgaSA8IHBhdGhwYXJ0cy5s
ZW5ndGg7ICsraSkgewogICAgc3dpdGNoIChwYXRocGFydHNbaV0pIHsKICAgICAgY2FzZSAiIjog
YnJlYWs7CiAgICAgIGNhc2UgIi4iOiBicmVhazsKICAgICAgY2FzZSAiLi4iOgogICAgICAgIHJl
bHBhcnRzLnBvcCgpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHJlbHBh
cnRzLnB1c2gocGF0aHBhcnRzW2ldKTsKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIHJldHVy
biByZWxwYXJ0cy5qb2luKCIvIik7Cn0KCnZhciBzZXR1cEltYWdlRm9yQ3Jvc3NPcmlnaW5UZXN0
ID0gZnVuY3Rpb24oaW1nLCBpbWdVcmwsIGxvY2FsVXJsLCBjYWxsYmFjaykgewogIHdpbmRvdy5h
ZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24oKSB7CiAgICBpZiAodHlwZW9mKGltZykg
PT0gInN0cmluZyIpCiAgICAgIGltZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW1nKTsKICAg
IGlmICghaW1nKQogICAgICBpbWcgPSBuZXcgSW1hZ2UoKTsKCiAgICBpbWcuYWRkRXZlbnRMaXN0
ZW5lcigibG9hZCIsIGNhbGxiYWNrLCBmYWxzZSk7CiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcigi
ZXJyb3IiLCBjYWxsYmFjaywgZmFsc2UpOwoKICAgIGlmIChydW5uaW5nT25Mb2NhbGhvc3QoKSkK
ICAgICAgaW1nLnNyYyA9IGdldExvY2FsQ3Jvc3NPcmlnaW4oKSArIGdldFJlbGF0aXZlUGF0aChs
b2NhbFVybCk7CiAgICBlbHNlCiAgICAgIGltZy5zcmMgPSBnZXRVcmxPcHRpb25zKCkuaW1nVXJs
IHx8IGltZ1VybDsKICB9LCBmYWxzZSk7Cn0KCi8qKgogKiBDb252ZXJ0IHNSR0IgY29sb3IgdG8g
bGluZWFyIGNvbG9yLgogKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gY29sb3IgVGhlIGNvbG9y
IHRvIGJlIGNvbnZlcnRlZC4KICogICAgICAgIFRoZSBhcnJheSBoYXMgNCBlbGVtZW50cywgZm9y
IGV4YW1wbGUgW1IsIEcsIEIsIEFdLgogKiAgICAgICAgd2hlcmUgZWFjaCBlbGVtZW50IGlzIGlu
IHRoZSByYW5nZSAwIHRvIDI1NS4KICogQHJldHVybiB7IUFycmF5LjxudW1iZXI+fSBjb2xvciBU
aGUgY29sb3IgdG8gYmUgY29udmVydGVkLgogKiAgICAgICAgVGhlIGFycmF5IGhhcyA0IGVsZW1l
bnRzLCBmb3IgZXhhbXBsZSBbUiwgRywgQiwgQV0uCiAqICAgICAgICB3aGVyZSBlYWNoIGVsZW1l
bnQgaXMgaW4gdGhlIHJhbmdlIDAgdG8gMjU1LgogKi8KdmFyIHNSR0JUb0xpbmVhciA9IGZ1bmN0
aW9uKGNvbG9yKSB7CiAgICByZXR1cm4gW3NSR0JDaGFubmVsVG9MaW5lYXIoY29sb3JbMF0pLAog
ICAgICAgICAgICBzUkdCQ2hhbm5lbFRvTGluZWFyKGNvbG9yWzFdKSwKICAgICAgICAgICAgc1JH
QkNoYW5uZWxUb0xpbmVhcihjb2xvclsyXSksCiAgICAgICAgICAgIGNvbG9yWzNdXQp9CgovKioK
ICogQ29udmVydCBsaW5lYXIgY29sb3IgdG8gc1JHQiBjb2xvci4KICogQHBhcmFtIHshQXJyYXku
PG51bWJlcj59IGNvbG9yIFRoZSBjb2xvciB0byBiZSBjb252ZXJ0ZWQuCiAqICAgICAgICBUaGUg
YXJyYXkgaGFzIDQgZWxlbWVudHMsIGZvciBleGFtcGxlIFtSLCBHLCBCLCBBXS4KICogICAgICAg
IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBpbiB0aGUgcmFuZ2UgMCB0byAyNTUuCiAqIEByZXR1cm4g
eyFBcnJheS48bnVtYmVyPn0gY29sb3IgVGhlIGNvbG9yIHRvIGJlIGNvbnZlcnRlZC4KICogICAg
ICAgIFRoZSBhcnJheSBoYXMgNCBlbGVtZW50cywgZm9yIGV4YW1wbGUgW1IsIEcsIEIsIEFdLgog
KiAgICAgICAgd2hlcmUgZWFjaCBlbGVtZW50IGlzIGluIHRoZSByYW5nZSAwIHRvIDI1NS4KICov
CnZhciBsaW5lYXJUb1NSR0IgPSBmdW5jdGlvbihjb2xvcikgewogICAgcmV0dXJuIFtsaW5lYXJD
aGFubmVsVG9TUkdCKGNvbG9yWzBdKSwKICAgICAgICAgICAgbGluZWFyQ2hhbm5lbFRvU1JHQihj
b2xvclsxXSksCiAgICAgICAgICAgIGxpbmVhckNoYW5uZWxUb1NSR0IoY29sb3JbMl0pLAogICAg
ICAgICAgICBjb2xvclszXV0KfQoKZnVuY3Rpb24gc1JHQkNoYW5uZWxUb0xpbmVhcih2YWx1ZSkg
ewogICAgdmFsdWUgPSB2YWx1ZSAvIDI1NTsKICAgIGlmICh2YWx1ZSA8PSAwLjA0MDQ1KQogICAg
ICAgIHZhbHVlID0gdmFsdWUgLyAxMi45MjsKICAgIGVsc2UKICAgICAgICB2YWx1ZSA9IE1hdGgu
cG93KCh2YWx1ZSArIDAuMDU1KSAvIDEuMDU1LCAyLjQpOwogICAgcmV0dXJuIE1hdGgudHJ1bmMo
dmFsdWUgKiAyNTUgKyAwLjUpOwp9CgpmdW5jdGlvbiBsaW5lYXJDaGFubmVsVG9TUkdCKHZhbHVl
KSB7CiAgICB2YWx1ZSA9IHZhbHVlIC8gMjU1OwogICAgaWYgKHZhbHVlIDw9IDAuMCkgewogICAg
ICAgIHZhbHVlID0gMC4wOwogICAgfSBlbHNlIGlmICh2YWx1ZSA8IDAuMDAzMTMwOCkgewogICAg
ICAgIHZhbHVlID0gdmFsdWUgKiAxMi45MjsKICAgIH0gZWxzZSBpZiAodmFsdWUgPCAxKSB7CiAg
ICAgICAgdmFsdWUgPSBNYXRoLnBvdyh2YWx1ZSwgMC40MTY2NikgKiAxLjA1NSAtIDAuMDU1Owog
ICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IDEuMDsKICAgIH0KICAgIHJldHVybiBNYXRoLnRy
dW5jKHZhbHVlICogMjU1ICsgMC41KTsKfQp2YXIgQVBJID0gewogIGFkZFNoYWRlclNvdXJjZTog
YWRkU2hhZGVyU291cmNlLAogIGFkZFNoYWRlclNvdXJjZXM6IGFkZFNoYWRlclNvdXJjZXMsCiAg
Y2FuY2VsQW5pbUZyYW1lOiBjYW5jZWxBbmltRnJhbWUsCiAgY3JlYXRlM0RDb250ZXh0OiBjcmVh
dGUzRENvbnRleHQsCiAgR0xFcnJvckV4Y2VwdGlvbjogR0xFcnJvckV4Y2VwdGlvbiwKICBjcmVh
dGUzRENvbnRleHRXaXRoV3JhcHBlclRoYXRUaHJvd3NPbkdMRXJyb3I6IGNyZWF0ZTNEQ29udGV4
dFdpdGhXcmFwcGVyVGhhdFRocm93c09uR0xFcnJvciwKICBjaGVja0FyZWFJbkFuZE91dDogY2hl
Y2tBcmVhSW5BbmRPdXQsCiAgY2hlY2tDYW52YXM6IGNoZWNrQ2FudmFzLAogIGNoZWNrQ2FudmFz
UmVjdDogY2hlY2tDYW52YXNSZWN0LAogIGNoZWNrQ2FudmFzUmVjdENvbG9yOiBjaGVja0NhbnZh
c1JlY3RDb2xvciwKICBjaGVja0NhbnZhc1JlY3RzOiBjaGVja0NhbnZhc1JlY3RzLAogIGNoZWNr
RmxvYXRCdWZmZXI6IGNoZWNrRmxvYXRCdWZmZXIsCiAgY2hlY2tUZXh0dXJlU2l6ZTogY2hlY2tU
ZXh0dXJlU2l6ZSwKICBjbGlwVG9SYW5nZTogY2xpcFRvUmFuZ2UsCiAgY3JlYXRlQ29sb3JlZFRl
eHR1cmU6IGNyZWF0ZUNvbG9yZWRUZXh0dXJlLAogIGNyZWF0ZVByb2dyYW06IGNyZWF0ZVByb2dy
YW0sCiAgY2xlYXJBbmREcmF3VW5pdFF1YWQ6IGNsZWFyQW5kRHJhd1VuaXRRdWFkLAogIGNsZWFy
QW5kRHJhd0luZGV4ZWRRdWFkOiBjbGVhckFuZERyYXdJbmRleGVkUXVhZCwKICBkaXNwYXRjaFRh
c2s6IHNldFplcm9UaW1lb3V0LAogIGRyYXdVbml0UXVhZDogZHJhd1VuaXRRdWFkLAogIGRyYXdJ
bmRleGVkUXVhZDogZHJhd0luZGV4ZWRRdWFkLAogIGRyYXdVQnl0ZUNvbG9yUXVhZDogZHJhd1VC
eXRlQ29sb3JRdWFkLAogIGRyYXdGbG9hdENvbG9yUXVhZDogZHJhd0Zsb2F0Q29sb3JRdWFkLAog
IGR1bXBTaGFkZXJzSW5mbzogZHVtcFNoYWRlcnNJbmZvLAogIGVuZHNXaXRoOiBlbmRzV2l0aCwK
ICBmYWlsSWZHTEVycm9yOiBmYWlsSWZHTEVycm9yLAogIGZpbGxUZXh0dXJlOiBmaWxsVGV4dHVy
ZSwKICBnZXRCeXRlc1BlckNvbXBvbmVudDogZ2V0Qnl0ZXNQZXJDb21wb25lbnQsCiAgZ2V0RGVm
YXVsdDNEQ29udGV4dFZlcnNpb246IGdldERlZmF1bHQzRENvbnRleHRWZXJzaW9uLAogIGdldEV4
dGVuc2lvblByZWZpeGVkTmFtZXM6IGdldEV4dGVuc2lvblByZWZpeGVkTmFtZXMsCiAgZ2V0RXh0
ZW5zaW9uV2l0aEtub3duUHJlZml4ZXM6IGdldEV4dGVuc2lvbldpdGhLbm93blByZWZpeGVzLAog
IGdldEZpbGVMaXN0QXN5bmM6IGdldEZpbGVMaXN0QXN5bmMsCiAgZ2V0TGFzdEVycm9yOiBnZXRM
YXN0RXJyb3IsCiAgZ2V0UHJlZml4ZWRQcm9wZXJ0eTogZ2V0UHJlZml4ZWRQcm9wZXJ0eSwKICBn
ZXRTY3JpcHQ6IGdldFNjcmlwdCwKICBnZXRTdXBwb3J0ZWRFeHRlbnNpb25XaXRoS25vd25QcmVm
aXhlczogZ2V0U3VwcG9ydGVkRXh0ZW5zaW9uV2l0aEtub3duUHJlZml4ZXMsCiAgZ2V0VHlwZWRB
cnJheUVsZW1lbnRzUGVyUGl4ZWw6IGdldFR5cGVkQXJyYXlFbGVtZW50c1BlclBpeGVsLAogIGdl
dFVybEFyZ3VtZW50czogZ2V0VXJsQXJndW1lbnRzLAogIGdldFVybE9wdGlvbnM6IGdldFVybE9w
dGlvbnMsCiAgZ2V0QXR0cmliTWFwOiBnZXRBdHRyaWJNYXAsCiAgZ2V0VW5pZm9ybU1hcDogZ2V0
VW5pZm9ybU1hcCwKICBnbEVudW1Ub1N0cmluZzogZ2xFbnVtVG9TdHJpbmcsCiAgZ2xFcnJvclNo
b3VsZEJlOiBnbEVycm9yU2hvdWxkQmUsCiAgZ2xUeXBlVG9UeXBlZEFycmF5VHlwZTogZ2xUeXBl
VG9UeXBlZEFycmF5VHlwZSwKICBoYXNBdHRyaWJ1dGVDYXNlSW5zZW5zaXRpdmU6IGhhc0F0dHJp
YnV0ZUNhc2VJbnNlbnNpdGl2ZSwKICBpbnNlcnRJbWFnZTogaW5zZXJ0SW1hZ2UsCiAgbG9hZElt
YWdlQXN5bmM6IGxvYWRJbWFnZUFzeW5jLAogIGxvYWRJbWFnZXNBc3luYzogbG9hZEltYWdlc0Fz
eW5jLAogIGxvYWRQcm9ncmFtOiBsb2FkUHJvZ3JhbSwKICBsb2FkUHJvZ3JhbUZyb21GaWxlOiBs
b2FkUHJvZ3JhbUZyb21GaWxlLAogIGxvYWRQcm9ncmFtRnJvbVNjcmlwdDogbG9hZFByb2dyYW1G
cm9tU2NyaXB0LAogIGxvYWRQcm9ncmFtRnJvbVNjcmlwdEV4cGVjdEVycm9yOiBsb2FkUHJvZ3Jh
bUZyb21TY3JpcHRFeHBlY3RFcnJvciwKICBsb2FkU2hhZGVyOiBsb2FkU2hhZGVyLAogIGxvYWRT
aGFkZXJGcm9tRmlsZTogbG9hZFNoYWRlckZyb21GaWxlLAogIGxvYWRTaGFkZXJGcm9tU2NyaXB0
OiBsb2FkU2hhZGVyRnJvbVNjcmlwdCwKICBsb2FkU3RhbmRhcmRQcm9ncmFtOiBsb2FkU3RhbmRh
cmRQcm9ncmFtLAogIGxvYWRTdGFuZGFyZFByb2dyYW1Bc3luYzogbG9hZFN0YW5kYXJkUHJvZ3Jh
bUFzeW5jLAogIGxvYWRTdGFuZGFyZFZlcnRleFNoYWRlcjogbG9hZFN0YW5kYXJkVmVydGV4U2hh
ZGVyLAogIGxvYWRTdGFuZGFyZFZlcnRleFNoYWRlckFzeW5jOiBsb2FkU3RhbmRhcmRWZXJ0ZXhT
aGFkZXJBc3luYywKICBsb2FkU3RhbmRhcmRGcmFnbWVudFNoYWRlcjogbG9hZFN0YW5kYXJkRnJh
Z21lbnRTaGFkZXIsCiAgbG9hZFN0YW5kYXJkRnJhZ21lbnRTaGFkZXJBc3luYzogbG9hZFN0YW5k
YXJkRnJhZ21lbnRTaGFkZXJBc3luYywKICBsb2FkVW5pZm9ybUJsb2NrUHJvZ3JhbTogbG9hZFVu
aWZvcm1CbG9ja1Byb2dyYW0sCiAgbG9hZFVuaWZvcm1CbG9ja1ZlcnRleFNoYWRlcjogbG9hZFVu
aWZvcm1CbG9ja1ZlcnRleFNoYWRlciwKICBsb2FkVW5pZm9ybUJsb2NrRnJhZ21lbnRTaGFkZXI6
IGxvYWRVbmlmb3JtQmxvY2tGcmFnbWVudFNoYWRlciwKICBsb2FkVGV4dEZpbGVBc3luYzogbG9h
ZFRleHRGaWxlQXN5bmMsCiAgbG9hZFRleHR1cmU6IGxvYWRUZXh0dXJlLAogIGxvZzogbG9nLAog
IGxvZ2dpbmdPZmY6IGxvZ2dpbmdPZmYsCiAgbWFrZUNoZWNrUmVjdDogbWFrZUNoZWNrUmVjdCwK
ICBtYWtlSW1hZ2U6IG1ha2VJbWFnZSwKICBtYWtlSW1hZ2VGcm9tQ2FudmFzOiBtYWtlSW1hZ2VG
cm9tQ2FudmFzLAogIG1ha2VWaWRlbzogbWFrZVZpZGVvLAogIGVycm9yOiBlcnJvciwKICBzaGFs
bG93Q29weU9iamVjdDogc2hhbGxvd0NvcHlPYmplY3QsCiAgc2V0RGVmYXVsdDNEQ29udGV4dFZl
cnNpb246IHNldERlZmF1bHQzRENvbnRleHRWZXJzaW9uLAogIHNldHVwQ29sb3JRdWFkOiBzZXR1
cENvbG9yUXVhZCwKICBzZXR1cFByb2dyYW06IHNldHVwUHJvZ3JhbSwKICBzZXR1cFRyYW5zZm9y
bUZlZWRiYWNrUHJvZ3JhbTogc2V0dXBUcmFuc2Zvcm1GZWVkYmFja1Byb2dyYW0sCiAgc2V0dXBR
dWFkOiBzZXR1cFF1YWQsCiAgc2V0dXBJbmRleGVkUXVhZDogc2V0dXBJbmRleGVkUXVhZCwKICBz
ZXR1cEluZGV4ZWRRdWFkV2l0aE9wdGlvbnM6IHNldHVwSW5kZXhlZFF1YWRXaXRoT3B0aW9ucywK
ICBzZXR1cFNpbXBsZUNvbG9yUHJvZ3JhbTogc2V0dXBTaW1wbGVDb2xvclByb2dyYW0sCiAgc2V0
dXBTaW1wbGVUZXh0dXJlUHJvZ3JhbTogc2V0dXBTaW1wbGVUZXh0dXJlUHJvZ3JhbSwKICBzZXR1
cFNpbXBsZUN1YmVNYXBUZXh0dXJlUHJvZ3JhbTogc2V0dXBTaW1wbGVDdWJlTWFwVGV4dHVyZVBy
b2dyYW0sCiAgc2V0dXBTaW1wbGVWZXJ0ZXhDb2xvclByb2dyYW06IHNldHVwU2ltcGxlVmVydGV4
Q29sb3JQcm9ncmFtLAogIHNldHVwTm9UZXhDb29yZFRleHR1cmVQcm9ncmFtOiBzZXR1cE5vVGV4
Q29vcmRUZXh0dXJlUHJvZ3JhbSwKICBzZXR1cFRleHR1cmVkUXVhZDogc2V0dXBUZXh0dXJlZFF1
YWQsCiAgc2V0dXBUZXh0dXJlZFF1YWRXaXRoVGV4Q29vcmRzOiBzZXR1cFRleHR1cmVkUXVhZFdp
dGhUZXhDb29yZHMsCiAgc2V0dXBUZXh0dXJlZFF1YWRXaXRoQ3ViZU1hcDogc2V0dXBUZXh0dXJl
ZFF1YWRXaXRoQ3ViZU1hcCwKICBzZXR1cFVuaXRRdWFkOiBzZXR1cFVuaXRRdWFkLAogIHNldHVw
VW5pdFF1YWRXaXRoVGV4Q29vcmRzOiBzZXR1cFVuaXRRdWFkV2l0aFRleENvb3JkcywKICBzZXRG
bG9hdERyYXdDb2xvcjogc2V0RmxvYXREcmF3Q29sb3IsCiAgc2V0VUJ5dGVEcmF3Q29sb3I6IHNl
dFVCeXRlRHJhd0NvbG9yLAogIHN0YXJ0UGxheWluZ0FuZFdhaXRGb3JWaWRlbzogc3RhcnRQbGF5
aW5nQW5kV2FpdEZvclZpZGVvLAogIHN0YXJ0c1dpdGg6IHN0YXJ0c1dpdGgsCiAgc2hvdWxkVGhy
b3dPckdlbmVyYXRlR0xFcnJvcjogc2hvdWxkVGhyb3dPckdlbmVyYXRlR0xFcnJvciwKICBzaG91
bGRHZW5lcmF0ZUdMRXJyb3I6IHNob3VsZEdlbmVyYXRlR0xFcnJvciwKICByZWFkRmlsZTogcmVh
ZEZpbGUsCiAgcmVhZEZpbGVMaXN0OiByZWFkRmlsZUxpc3QsCiAgcmVwbGFjZVBhcmFtczogcmVw
bGFjZVBhcmFtcywKICByZXF1ZXN0QW5pbUZyYW1lOiByZXF1ZXN0QW5pbUZyYW1lLAogIHJ1blN0
ZXBzOiBydW5TdGVwcywKICB3YWl0Rm9yQ29tcG9zaXRlOiB3YWl0Rm9yQ29tcG9zaXRlLAoKICAv
LyBmdWxsc2NyZWVuIGFwaQogIHNldHVwRnVsbHNjcmVlbjogc2V0dXBGdWxsc2NyZWVuLAoKICAv
LyBzUkdCIGNvbnZlcnRlciBhcGkKICBzUkdCVG9MaW5lYXI6IHNSR0JUb0xpbmVhciwKICBsaW5l
YXJUb1NSR0I6IGxpbmVhclRvU1JHQiwKCiAgZ2V0SG9zdDogZ2V0SG9zdCwKICBnZXRCYXNlRG9t
YWluOiBnZXRCYXNlRG9tYWluLAogIHJ1bm5pbmdPbkxvY2FsaG9zdDogcnVubmluZ09uTG9jYWxo
b3N0LAogIGdldExvY2FsQ3Jvc3NPcmlnaW46IGdldExvY2FsQ3Jvc3NPcmlnaW4sCiAgZ2V0UmVs
YXRpdmVQYXRoOiBnZXRSZWxhdGl2ZVBhdGgsCiAgc2V0dXBJbWFnZUZvckNyb3NzT3JpZ2luVGVz
dDogc2V0dXBJbWFnZUZvckNyb3NzT3JpZ2luVGVzdCwKCiAgbm9uZTogZmFsc2UKfTsKCk9iamVj
dC5kZWZpbmVQcm9wZXJ0aWVzKEFQSSwgewogIG5vVGV4Q29vcmRUZXh0dXJlVmVydGV4U2hhZGVy
OiB7IHZhbHVlOiBub1RleENvb3JkVGV4dHVyZVZlcnRleFNoYWRlciwgd3JpdGFibGU6IGZhbHNl
IH0sCiAgc2ltcGxlVGV4dHVyZVZlcnRleFNoYWRlcjogeyB2YWx1ZTogc2ltcGxlVGV4dHVyZVZl
cnRleFNoYWRlciwgd3JpdGFibGU6IGZhbHNlIH0sCiAgc2ltcGxlQ29sb3JGcmFnbWVudFNoYWRl
cjogeyB2YWx1ZTogc2ltcGxlQ29sb3JGcmFnbWVudFNoYWRlciwgd3JpdGFibGU6IGZhbHNlIH0s
CiAgc2ltcGxlVmVydGV4U2hhZGVyOiB7IHZhbHVlOiBzaW1wbGVWZXJ0ZXhTaGFkZXIsIHdyaXRh
YmxlOiBmYWxzZSB9LAogIHNpbXBsZVRleHR1cmVGcmFnbWVudFNoYWRlcjogeyB2YWx1ZTogc2lt
cGxlVGV4dHVyZUZyYWdtZW50U2hhZGVyLCB3cml0YWJsZTogZmFsc2UgfSwKICBzaW1wbGVDdWJl
TWFwVGV4dHVyZUZyYWdtZW50U2hhZGVyOiB7IHZhbHVlOiBzaW1wbGVDdWJlTWFwVGV4dHVyZUZy
YWdtZW50U2hhZGVyLCB3cml0YWJsZTogZmFsc2UgfSwKICBzaW1wbGVWZXJ0ZXhDb2xvckZyYWdt
ZW50U2hhZGVyOiB7IHZhbHVlOiBzaW1wbGVWZXJ0ZXhDb2xvckZyYWdtZW50U2hhZGVyLCB3cml0
YWJsZTogZmFsc2UgfSwKICBzaW1wbGVWZXJ0ZXhDb2xvclZlcnRleFNoYWRlcjogeyB2YWx1ZTog
c2ltcGxlVmVydGV4Q29sb3JWZXJ0ZXhTaGFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9Cn0pOwoKcmV0
dXJuIEFQSTsKCn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0PgovKgoqKiBDb3B5cmlnaHQgKGMpIDIw
MTUgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgoqKgoqKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFu
dGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQoqKiBjb3B5IG9m
IHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhl
CioqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJp
Y3Rpb24sIGluY2x1ZGluZwoqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2Us
IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCioqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2Us
IGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKiogcGVybWl0IHBl
cnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1Ympl
Y3QgdG8KKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoqKgoqKiBUaGUgYWJvdmUgY29weXJp
Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoq
KiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMu
CioqCioqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFO
VFkgT0YgQU5ZIEtJTkQsCioqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1Qg
TElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgoqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCioqIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1Ig
QU5ZCioqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBB
Q1RJT04gT0YgQ09OVFJBQ1QsCioqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9V
VCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCioqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9S
IE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCiovCnZhciBUZXhJbWFnZVV0aWxzID0g
KGZ1bmN0aW9uKCkgewoKICAidXNlIHN0cmljdCI7CgogIHZhciB3dHUgPSBXZWJHTFRlc3RVdGls
czsKCiAgLyoqCiAgICogQSB2ZXJ0ZXggc2hhZGVyIGZvciBhIHNpbmdsZSB0ZXh0dXJlLgogICAq
IEB0eXBlIHtzdHJpbmd9CiAgICovCiAgdmFyIHNpbXBsZVRleHR1cmVWZXJ0ZXhTaGFkZXJFUzMg
PSBbCiAgICAnI3ZlcnNpb24gMzAwIGVzJywKICAgICdpbiB2ZWM0IHZQb3NpdGlvbjsnLAogICAg
J2luIHZlYzIgdGV4Q29vcmQwOycsCiAgICAnb3V0IHZlYzIgdGV4Q29vcmQ7JywKICAgICd2b2lk
IG1haW4oKSB7JywKICAgICcgICAgZ2xfUG9zaXRpb24gPSB2UG9zaXRpb247JywKICAgICcgICAg
dGV4Q29vcmQgPSB0ZXhDb29yZDA7JywKICAgICd9J10uam9pbignXG4nKTsKCiAgLyoqCiAgICog
QSBmcmFnbWVudCBzaGFkZXIgZm9yIGEgc2luZ2xlIHVuc2lnbmVkIGludGVnZXIgdGV4dHVyZS4K
ICAgKiBAdHlwZSB7c3RyaW5nfQogICAqLwogIC8vIE5vdGUgd2UgYWx3YXlzIG91dHB1dCAxLjAg
Zm9yIGFscGhhIGJlY2F1c2UgaWYgdGhlIHRleHR1cmUgZG9lcyBub3QgY29udGFpbgogIC8vIGFs
cGhhIGNoYW5uZWwsIHNhbXBsaW5nIHJldHVybnMgMTsgZm9yIFJHQkEgdGV4dHVyZXMsIHNhbXBs
aW5nIHJldHVybnMgWzAsMjU1XS4KICB2YXIgc2ltcGxlVWludFRleHR1cmVGcmFnbWVudFNoYWRl
ckVTMyA9IFsKICAgICcjdmVyc2lvbiAzMDAgZXMnLAogICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZs
b2F0OycsCiAgICAndW5pZm9ybSBtZWRpdW1wIHVzYW1wbGVyMkQgdGV4OycsCiAgICAnaW4gdmVj
MiB0ZXhDb29yZDsnLAogICAgJ291dCB2ZWM0IGZyYWdEYXRhOycsCiAgICAndm9pZCBtYWluKCkg
eycsCiAgICAnICAgIHV2ZWM0IGRhdGEgPSB0ZXh0dXJlKHRleCwgdGV4Q29vcmQpOycsCiAgICAn
ICAgIGZyYWdEYXRhID0gdmVjNChmbG9hdChkYXRhWzBdKS8yNTUuMCwnLAogICAgJyAgICAgICAg
ICAgICAgICAgICAgZmxvYXQoZGF0YVsxXSkvMjU1LjAsJywKICAgICcgICAgICAgICAgICAgICAg
ICAgIGZsb2F0KGRhdGFbMl0pLzI1NS4wLCcsCiAgICAnICAgICAgICAgICAgICAgICAgICAxLjAp
OycsCiAgICAnfSddLmpvaW4oJ1xuJyk7CgogIC8qKgogICAqIEEgZnJhZ21lbnQgc2hhZGVyIGZv
ciBhIHNpbmdsZSBzaWduZWQgaW50ZWdlciB0ZXh0dXJlLgogICAqIEB0eXBlIHtzdHJpbmd9CiAg
ICovCiAgLy8gTm90ZSB3ZSBhbHdheXMgb3V0cHV0IDEuMCBmb3IgYWxwaGEgYmVjYXVzZSBpZiB0
aGUgdGV4dHVyZSBkb2VzIG5vdCBjb250YWluCiAgLy8gYWxwaGEgY2hhbm5lbCwgc2FtcGxpbmcg
cmV0dXJucyAxOyBmb3IgUkdCQSB0ZXh0dXJlcywgc2FtcGxpbmcgcmV0dXJucyBbMCwyNTVdLgog
IHZhciBzaW1wbGVJbnRUZXh0dXJlRnJhZ21lbnRTaGFkZXJFUzMgPSBbCiAgICAnI3ZlcnNpb24g
MzAwIGVzJywKICAgICdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsnLAogICAgJ3VuaWZvcm0gbWVk
aXVtcCBpc2FtcGxlcjJEIHRleDsnLAogICAgJ2luIHZlYzIgdGV4Q29vcmQ7JywKICAgICdvdXQg
dmVjNCBmcmFnRGF0YTsnLAogICAgJ3ZvaWQgbWFpbigpIHsnLAogICAgJyAgICBpdmVjNCBkYXRh
ID0gdGV4dHVyZSh0ZXgsIHRleENvb3JkKTsnLAogICAgJyAgICBmcmFnRGF0YSA9IHZlYzQoZmxv
YXQoZGF0YVswXSkvMjU1LjAsJywKICAgICcgICAgICAgICAgICAgICAgICAgIGZsb2F0KGRhdGFb
MV0pLzI1NS4wLCcsCiAgICAnICAgICAgICAgICAgICAgICAgICBmbG9hdChkYXRhWzJdKS8yNTUu
MCwnLAogICAgJyAgICAgICAgICAgICAgICAgICAgMS4wKTsnLAogICAgJ30nXS5qb2luKCdcbicp
OwoKICAvKioKICAgKiBBIGZyYWdtZW50IHNoYWRlciBmb3IgYSBzaW5nbGUgY3ViZSBtYXAgdW5z
aWduZWQgaW50ZWdlciB0ZXh0dXJlLgogICAqIEB0eXBlIHtzdHJpbmd9CiAgICovCiAgLy8gTm90
ZSB3ZSBhbHdheXMgb3V0cHV0IDEuMCBmb3IgYWxwaGEgYmVjYXVzZSBpZiB0aGUgdGV4dHVyZSBk
b2VzIG5vdCBjb250YWluCiAgLy8gYWxwaGEgY2hhbm5lbCwgc2FtcGxpbmcgcmV0dXJucyAxOyBm
b3IgUkdCQSB0ZXh0dXJlcywgc2FtcGxpbmcgcmV0dXJucyBbMCwyNTVdLgogIHZhciBzaW1wbGVD
dWJlTWFwVWludFRleHR1cmVGcmFnbWVudFNoYWRlckVTMyA9IFsKICAgICcjdmVyc2lvbiAzMDAg
ZXMnLAogICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OycsCiAgICAndW5pZm9ybSBtZWRpdW1w
IHVzYW1wbGVyQ3ViZSB0ZXg7JywKICAgICd1bmlmb3JtIGhpZ2hwIGludCBmYWNlOycsCiAgICAn
aW4gdmVjMiB0ZXhDb29yZDsnLAogICAgJ291dCB2ZWM0IGZyYWdEYXRhOycsCiAgICAndm9pZCBt
YWluKCkgeycsCiAgICAvLyBUcmFuc2Zvcm0gWzAsIDFdIC0+IFstMSwgMV0KICAgICcgICAgdmVj
MiB0ZXhDMiA9ICh0ZXhDb29yZCAqIDIuKSAtIDEuOycsCiAgICAvLyBUcmFuc2Zvcm0gMmQgdGV4
IGNvb3JkLiB0byBlYWNoIGZhY2Ugb2YgVEVYVFVSRV9DVUJFX01BUCBjb29yZC4KICAgICcgICAg
dmVjMyB0ZXhDdWJlID0gdmVjMygwLiwgMC4sIDAuKTsnLAogICAgJyAgICBpZiAoZmFjZSA9PSAz
NDA2OSkgeycsICAgICAgICAgLy8gVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YCiAgICAnICAg
ICAgICB0ZXhDdWJlID0gdmVjMygxLiwgLXRleEMyLnksIC10ZXhDMi54KTsnLAogICAgJyAgICB9
IGVsc2UgaWYgKGZhY2UgPT0gMzQwNzApIHsnLCAgLy8gVEVYVFVSRV9DVUJFX01BUF9ORUdBVElW
RV9YCiAgICAnICAgICAgICB0ZXhDdWJlID0gdmVjMygtMS4sIC10ZXhDMi55LCB0ZXhDMi54KTsn
LAogICAgJyAgICB9IGVsc2UgaWYgKGZhY2UgPT0gMzQwNzEpIHsnLCAgLy8gVEVYVFVSRV9DVUJF
X01BUF9QT1NJVElWRV9ZCiAgICAnICAgICAgICB0ZXhDdWJlID0gdmVjMyh0ZXhDMi54LCAxLiwg
dGV4QzIueSk7JywKICAgICcgICAgfSBlbHNlIGlmIChmYWNlID09IDM0MDcyKSB7JywgIC8vIFRF
WFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWQogICAgJyAgICAgICAgdGV4Q3ViZSA9IHZlYzModGV4
QzIueCwgLTEuLCAtdGV4QzIueSk7JywKICAgICcgICAgfSBlbHNlIGlmIChmYWNlID09IDM0MDcz
KSB7JywgIC8vIFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWgogICAgJyAgICAgICAgdGV4Q3Vi
ZSA9IHZlYzModGV4QzIueCwgLXRleEMyLnksIDEuKTsnLAogICAgJyAgICB9IGVsc2UgaWYgKGZh
Y2UgPT0gMzQwNzQpIHsnLCAgLy8gVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aCiAgICAnICAg
ICAgICB0ZXhDdWJlID0gdmVjMygtdGV4QzIueCwgLXRleEMyLnksIC0xLik7JywKICAgICcgICAg
fScsCiAgICAnICAgIHV2ZWM0IGRhdGEgPSB0ZXh0dXJlKHRleCwgdGV4Q3ViZSk7JywKICAgICcg
ICAgZnJhZ0RhdGEgPSB2ZWM0KGZsb2F0KGRhdGFbMF0pLzI1NS4wLCcsCiAgICAnICAgICAgICAg
ICAgICAgICAgICBmbG9hdChkYXRhWzFdKS8yNTUuMCwnLAogICAgJyAgICAgICAgICAgICAgICAg
ICAgZmxvYXQoZGF0YVsyXSkvMjU1LjAsJywKICAgICcgICAgICAgICAgICAgICAgICAgIDEuMCk7
JywKICAgICd9J10uam9pbignXG4nKTsKCiAgLyoqCiAgICogQSBmcmFnbWVudCBzaGFkZXIgZm9y
IGEgc2luZ2xlIGN1YmUgbWFwIHNpZ25lZCBpbnRlZ2VyIHRleHR1cmUuCiAgICogQHR5cGUge3N0
cmluZ30KICAgKi8KICAvLyBOb3RlIHdlIGFsd2F5cyBvdXRwdXQgMS4wIGZvciBhbHBoYSBiZWNh
dXNlIGlmIHRoZSB0ZXh0dXJlIGRvZXMgbm90IGNvbnRhaW4KICAvLyBhbHBoYSBjaGFubmVsLCBz
YW1wbGluZyByZXR1cm5zIDE7IGZvciBSR0JBIHRleHR1cmVzLCBzYW1wbGluZyByZXR1cm5zIFsw
LDI1NV0uCiAgdmFyIHNpbXBsZUN1YmVNYXBJbnRUZXh0dXJlRnJhZ21lbnRTaGFkZXJFUzMgPSBb
CiAgICAnI3ZlcnNpb24gMzAwIGVzJywKICAgICdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsnLAog
ICAgJ3VuaWZvcm0gbWVkaXVtcCBpc2FtcGxlckN1YmUgdGV4OycsCiAgICAndW5pZm9ybSBoaWdo
cCBpbnQgZmFjZTsnLAogICAgJ2luIHZlYzIgdGV4Q29vcmQ7JywKICAgICdvdXQgdmVjNCBmcmFn
RGF0YTsnLAogICAgJ3ZvaWQgbWFpbigpIHsnLAogICAgLy8gVHJhbnNmb3JtIFswLCAxXSAtPiBb
LTEsIDFdCiAgICAnICAgIHZlYzIgdGV4QzIgPSAodGV4Q29vcmQgKiAyLikgLSAxLjsnLAogICAg
Ly8gVHJhbnNmb3JtIDJkIHRleCBjb29yZC4gdG8gZWFjaCBmYWNlIG9mIFRFWFRVUkVfQ1VCRV9N
QVAgY29vcmQuCiAgICAnICAgIHZlYzMgdGV4Q3ViZSA9IHZlYzMoMC4sIDAuLCAwLik7JywKICAg
ICcgICAgaWYgKGZhY2UgPT0gMzQwNjkpIHsnLCAgICAgICAgIC8vIFRFWFRVUkVfQ1VCRV9NQVBf
UE9TSVRJVkVfWAogICAgJyAgICAgICAgdGV4Q3ViZSA9IHZlYzMoMS4sIC10ZXhDMi55LCAtdGV4
QzIueCk7JywKICAgICcgICAgfSBlbHNlIGlmIChmYWNlID09IDM0MDcwKSB7JywgIC8vIFRFWFRV
UkVfQ1VCRV9NQVBfTkVHQVRJVkVfWAogICAgJyAgICAgICAgdGV4Q3ViZSA9IHZlYzMoLTEuLCAt
dGV4QzIueSwgdGV4QzIueCk7JywKICAgICcgICAgfSBlbHNlIGlmIChmYWNlID09IDM0MDcxKSB7
JywgIC8vIFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWQogICAgJyAgICAgICAgdGV4Q3ViZSA9
IHZlYzModGV4QzIueCwgMS4sIHRleEMyLnkpOycsCiAgICAnICAgIH0gZWxzZSBpZiAoZmFjZSA9
PSAzNDA3MikgeycsICAvLyBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1kKICAgICcgICAgICAg
IHRleEN1YmUgPSB2ZWMzKHRleEMyLngsIC0xLiwgLXRleEMyLnkpOycsCiAgICAnICAgIH0gZWxz
ZSBpZiAoZmFjZSA9PSAzNDA3MykgeycsICAvLyBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1oK
ICAgICcgICAgICAgIHRleEN1YmUgPSB2ZWMzKHRleEMyLngsIC10ZXhDMi55LCAxLik7JywKICAg
ICcgICAgfSBlbHNlIGlmIChmYWNlID09IDM0MDc0KSB7JywgIC8vIFRFWFRVUkVfQ1VCRV9NQVBf
TkVHQVRJVkVfWgogICAgJyAgICAgICAgdGV4Q3ViZSA9IHZlYzMoLXRleEMyLngsIC10ZXhDMi55
LCAtMS4pOycsCiAgICAnICAgIH0nLAogICAgJyAgICBpdmVjNCBkYXRhID0gdGV4dHVyZSh0ZXgs
IHRleEN1YmUpOycsCiAgICAnICAgIGZyYWdEYXRhID0gdmVjNChmbG9hdChkYXRhWzBdKS8yNTUu
MCwnLAogICAgJyAgICAgICAgICAgICAgICAgICAgZmxvYXQoZGF0YVsxXSkvMjU1LjAsJywKICAg
ICcgICAgICAgICAgICAgICAgICAgIGZsb2F0KGRhdGFbMl0pLzI1NS4wLCcsCiAgICAnICAgICAg
ICAgICAgICAgICAgICAxLjApOycsCiAgICAnfSddLmpvaW4oJ1xuJyk7CgogIC8qKgogICAqIEEg
ZnJhZ21lbnQgc2hhZGVyIGZvciBhIHNpbmdsZSAzRCB0ZXh0dXJlLgogICAqIEB0eXBlIHtzdHJp
bmd9CiAgICovCiAgLy8gTm90ZSB0aGF0IHRoZSB0ZXggY29vcmRpbmF0ZSByICh0aGUgdW5pZm9y
bSB1UkNvb3JkKSBpcyBzZXQgdG8gMC4wIGJ5IGRlZmF1bHQuCiAgdmFyIHNpbXBsZTNEVGV4dHVy
ZUZyYWdtZW50U2hhZGVyRVMzID0gWwogICAgJyN2ZXJzaW9uIDMwMCBlcycsCiAgICAncHJlY2lz
aW9uIG1lZGl1bXAgZmxvYXQ7JywKICAgICd1bmlmb3JtIG1lZGl1bXAgc2FtcGxlcjNEIHRleDsn
LAogICAgJ2luIHZlYzIgdGV4Q29vcmQ7JywKICAgICd1bmlmb3JtIGZsb2F0IHVSQ29vcmQ7JywK
ICAgICdvdXQgdmVjNCBmcmFnRGF0YTsnLAogICAgJ3ZvaWQgbWFpbigpIHsnLAogICAgJyAgICBm
cmFnRGF0YSA9IHZlYzQodGV4dHVyZSh0ZXgsIHZlYzModGV4Q29vcmQsIHVSQ29vcmQpKS5yZ2Is
IDEuMCk7JywKICAgICd9J10uam9pbignXG4nKTsKCiAgLyoqCiAgICogQSBmcmFnbWVudCBzaGFk
ZXIgZm9yIGEgc2luZ2xlIDNEIHVuc2lnbmVkIGludGVnZXIgdGV4dHVyZS4KICAgKiBAdHlwZSB7
c3RyaW5nfQogICAqLwogIC8vIE5vdGUgdGhhdCB0aGUgdGV4IGNvb3JkaW5hdGUgciAodGhlIHVu
aWZvcm0gdVJDb29yZCkgaXMgc2V0IHRvIDAuMCBieSBkZWZhdWx0LgogIC8vIE5vdGUgd2UgYWx3
YXlzIG91dHB1dCAxLjAgZm9yIGFscGhhIGJlY2F1c2UgaWYgdGhlIHRleHR1cmUgZG9lcyBub3Qg
Y29udGFpbgogIC8vIGFscGhhIGNoYW5uZWwsIHNhbXBsaW5nIHJldHVybnMgMTsgZm9yIFJHQkEg
dGV4dHVyZXMsIHNhbXBsaW5nIHJldHVybnMgWzAsMjU1XS4KICB2YXIgc2ltcGxlM0RVaW50VGV4
dHVyZUZyYWdtZW50U2hhZGVyRVMzID0gWwogICAgJyN2ZXJzaW9uIDMwMCBlcycsCiAgICAncHJl
Y2lzaW9uIG1lZGl1bXAgZmxvYXQ7JywKICAgICd1bmlmb3JtIG1lZGl1bXAgdXNhbXBsZXIzRCB0
ZXg7JywKICAgICdpbiB2ZWMyIHRleENvb3JkOycsCiAgICAndW5pZm9ybSBmbG9hdCB1UkNvb3Jk
OycsCiAgICAnb3V0IHZlYzQgZnJhZ0RhdGE7JywKICAgICd2b2lkIG1haW4oKSB7JywKICAgICcg
ICAgdXZlYzQgZGF0YSA9IHRleHR1cmUodGV4LCB2ZWMzKHRleENvb3JkLCB1UkNvb3JkKSk7JywK
ICAgICcgICAgZnJhZ0RhdGEgPSB2ZWM0KGZsb2F0KGRhdGFbMF0pLzI1NS4wLCcsCiAgICAnICAg
ICAgICAgICAgICAgICAgICBmbG9hdChkYXRhWzFdKS8yNTUuMCwnLAogICAgJyAgICAgICAgICAg
ICAgICAgICAgZmxvYXQoZGF0YVsyXSkvMjU1LjAsJywKICAgICcgICAgICAgICAgICAgICAgICAg
IDEuMCk7JywKICAgICd9J10uam9pbignXG4nKTsKCiAgLyoqCiAgICogQSBmcmFnbWVudCBzaGFk
ZXIgZm9yIGEgc2luZ2xlIDNEIHNpZ25lZCBpbnRlZ2VyIHRleHR1cmUuCiAgICogQHR5cGUge3N0
cmluZ30KICAgKi8KICAvLyBOb3RlIHRoYXQgdGhlIHRleCBjb29yZGluYXRlIHIgKHRoZSB1bmlm
b3JtIHVSQ29vcmQpIGlzIHNldCB0byAwLjAgYnkgZGVmYXVsdC4KICAvLyBOb3RlIHdlIGFsd2F5
cyBvdXRwdXQgMS4wIGZvciBhbHBoYSBiZWNhdXNlIGlmIHRoZSB0ZXh0dXJlIGRvZXMgbm90IGNv
bnRhaW4KICAvLyBhbHBoYSBjaGFubmVsLCBzYW1wbGluZyByZXR1cm5zIDE7IGZvciBSR0JBIHRl
eHR1cmVzLCBzYW1wbGluZyByZXR1cm5zIFswLDI1NV0uCiAgdmFyIHNpbXBsZTNESW50VGV4dHVy
ZUZyYWdtZW50U2hhZGVyRVMzID0gWwogICAgJyN2ZXJzaW9uIDMwMCBlcycsCiAgICAncHJlY2lz
aW9uIG1lZGl1bXAgZmxvYXQ7JywKICAgICd1bmlmb3JtIG1lZGl1bXAgaXNhbXBsZXIzRCB0ZXg7
JywKICAgICdpbiB2ZWMyIHRleENvb3JkOycsCiAgICAndW5pZm9ybSBmbG9hdCB1UkNvb3JkOycs
CiAgICAnb3V0IHZlYzQgZnJhZ0RhdGE7JywKICAgICd2b2lkIG1haW4oKSB7JywKICAgICcgICAg
aXZlYzQgZGF0YSA9IHRleHR1cmUodGV4LCB2ZWMzKHRleENvb3JkLCB1UkNvb3JkKSk7JywKICAg
ICcgICAgZnJhZ0RhdGEgPSB2ZWM0KGZsb2F0KGRhdGFbMF0pLzI1NS4wLCcsCiAgICAnICAgICAg
ICAgICAgICAgICAgICBmbG9hdChkYXRhWzFdKS8yNTUuMCwnLAogICAgJyAgICAgICAgICAgICAg
ICAgICAgZmxvYXQoZGF0YVsyXSkvMjU1LjAsJywKICAgICcgICAgICAgICAgICAgICAgICAgIDEu
MCk7JywKICAgICd9J10uam9pbignXG4nKTsKCiAgLyoqCiAgICogQSBmcmFnbWVudCBzaGFkZXIg
Zm9yIGEgc2luZ2xlIDJEX0FSUkFZIHRleHR1cmUuCiAgICogQHR5cGUge3N0cmluZ30KICAgKi8K
ICAvLyBOb3RlIHRoYXQgdGhlIGZpcnN0IGltYWdlIGluIHRoZSBhcnJheSAoc2VsZWN0ZWQgYnkg
dGhlIHVuaWZvcm0KICAvLyB1UkNvb3JkKSBpcyB1c2VkIGJ5IGRlZmF1bHQuCiAgdmFyIHNpbXBs
ZTJEQXJyYXlUZXh0dXJlRnJhZ21lbnRTaGFkZXJFUzMgPSBbCiAgICAnI3ZlcnNpb24gMzAwIGVz
JywKICAgICdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsnLAogICAgJ3VuaWZvcm0gbWVkaXVtcCBz
YW1wbGVyMkRBcnJheSB0ZXg7JywKICAgICdpbiB2ZWMyIHRleENvb3JkOycsCiAgICAndW5pZm9y
bSBmbG9hdCB1UkNvb3JkOycsCiAgICAnb3V0IHZlYzQgZnJhZ0RhdGE7JywKICAgICd2b2lkIG1h
aW4oKSB7JywKICAgICcgICAgZnJhZ0RhdGEgPSB2ZWM0KHRleHR1cmUodGV4LCB2ZWMzKHRleENv
b3JkLCB1UkNvb3JkKSkucmdiLCAxLjApOycsCiAgICAnfSddLmpvaW4oJ1xuJyk7CgogIC8qKgog
ICAqIEEgZnJhZ21lbnQgc2hhZGVyIGZvciBhIHNpbmdsZSAyRF9BUlJBWSB1bnNpZ25lZCBpbnRl
Z2VyIHRleHR1cmUuCiAgICogQHR5cGUge3N0cmluZ30KICAgKi8KICAvLyBOb3RlIHRoYXQgdGhl
IGZpcnN0IGltYWdlIGluIHRoZSBhcnJheSAoc2VsZWN0ZWQgYnkgdGhlIHVuaWZvcm0KICAvLyB1
UkNvb3JkKSBpcyB1c2VkIGJ5IGRlZmF1bHQuCiAgLy8gTm90ZSB3ZSBhbHdheXMgb3V0cHV0IDEu
MCBmb3IgYWxwaGEgYmVjYXVzZSBpZiB0aGUgdGV4dHVyZSBkb2VzIG5vdCBjb250YWluCiAgLy8g
YWxwaGEgY2hhbm5lbCwgc2FtcGxpbmcgcmV0dXJucyAxOyBmb3IgUkdCQSB0ZXh0dXJlcywgc2Ft
cGxpbmcgcmV0dXJucyBbMCwyNTVdLgogIHZhciBzaW1wbGUyREFycmF5VWludFRleHR1cmVGcmFn
bWVudFNoYWRlckVTMyA9IFsKICAgICcjdmVyc2lvbiAzMDAgZXMnLAogICAgJ3ByZWNpc2lvbiBt
ZWRpdW1wIGZsb2F0OycsCiAgICAndW5pZm9ybSBtZWRpdW1wIHVzYW1wbGVyMkRBcnJheSB0ZXg7
JywKICAgICdpbiB2ZWMyIHRleENvb3JkOycsCiAgICAndW5pZm9ybSBmbG9hdCB1UkNvb3JkOycs
CiAgICAnb3V0IHZlYzQgZnJhZ0RhdGE7JywKICAgICd2b2lkIG1haW4oKSB7JywKICAgICcgICAg
dXZlYzQgZGF0YSA9IHRleHR1cmUodGV4LCB2ZWMzKHRleENvb3JkLCB1UkNvb3JkKSk7JywKICAg
ICcgICAgZnJhZ0RhdGEgPSB2ZWM0KGZsb2F0KGRhdGFbMF0pLzI1NS4wLCcsCiAgICAnICAgICAg
ICAgICAgICAgICAgICBmbG9hdChkYXRhWzFdKS8yNTUuMCwnLAogICAgJyAgICAgICAgICAgICAg
ICAgICAgZmxvYXQoZGF0YVsyXSkvMjU1LjAsJywKICAgICcgICAgICAgICAgICAgICAgICAgIDEu
MCk7JywKICAgICd9J10uam9pbignXG4nKTsKCiAgLyoqCiAgICogQSBmcmFnbWVudCBzaGFkZXIg
Zm9yIGEgc2luZ2xlIDJEX0FSUkFZIHNpZ25lZCBpbnRlZ2VyIHRleHR1cmUuCiAgICogQHR5cGUg
e3N0cmluZ30KICAgKi8KICAvLyBOb3RlIHRoYXQgdGhlIGZpcnN0IGltYWdlIGluIHRoZSBhcnJh
eSAoc2VsZWN0ZWQgYnkgdGhlIHVuaWZvcm0KICAvLyB1UkNvb3JkKSBpcyB1c2VkIGJ5IGRlZmF1
bHQuCiAgLy8gTm90ZSB3ZSBhbHdheXMgb3V0cHV0IDEuMCBmb3IgYWxwaGEgYmVjYXVzZSBpZiB0
aGUgdGV4dHVyZSBkb2VzIG5vdCBjb250YWluCiAgLy8gYWxwaGEgY2hhbm5lbCwgc2FtcGxpbmcg
cmV0dXJucyAxOyBmb3IgUkdCQSB0ZXh0dXJlcywgc2FtcGxpbmcgcmV0dXJucyBbMCwyNTVdLgog
IHZhciBzaW1wbGUyREFycmF5SW50VGV4dHVyZUZyYWdtZW50U2hhZGVyRVMzID0gWwogICAgJyN2
ZXJzaW9uIDMwMCBlcycsCiAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7JywKICAgICd1bmlm
b3JtIG1lZGl1bXAgaXNhbXBsZXIyREFycmF5IHRleDsnLAogICAgJ2luIHZlYzIgdGV4Q29vcmQ7
JywKICAgICd1bmlmb3JtIGZsb2F0IHVSQ29vcmQ7JywKICAgICdvdXQgdmVjNCBmcmFnRGF0YTsn
LAogICAgJ3ZvaWQgbWFpbigpIHsnLAogICAgJyAgICBpdmVjNCBkYXRhID0gdGV4dHVyZSh0ZXgs
IHZlYzModGV4Q29vcmQsIHVSQ29vcmQpKTsnLAogICAgJyAgICBmcmFnRGF0YSA9IHZlYzQoZmxv
YXQoZGF0YVswXSkvMjU1LjAsJywKICAgICcgICAgICAgICAgICAgICAgICAgIGZsb2F0KGRhdGFb
MV0pLzI1NS4wLCcsCiAgICAnICAgICAgICAgICAgICAgICAgICBmbG9hdChkYXRhWzJdKS8yNTUu
MCwnLAogICAgJyAgICAgICAgICAgICAgICAgICAgMS4wKTsnLAogICAgJ30nXS5qb2luKCdcbicp
OwoKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHNpbXBsZSB0ZXh0dXJlIHZlcnRleCBzaGFkZXIuCiAg
ICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdD
b250ZXh0IHRvIHVzZS4KICAgKiBAcmV0dXJuIHshV2ViR0xTaGFkZXJ9CiAgICovCiAgdmFyIHNl
dHVwU2ltcGxlVGV4dHVyZVZlcnRleFNoYWRlciA9IGZ1bmN0aW9uKGdsKSB7CiAgICByZXR1cm4g
V2ViR0xUZXN0VXRpbHMubG9hZFNoYWRlcihnbCwgc2ltcGxlVGV4dHVyZVZlcnRleFNoYWRlckVT
MywgZ2wuVkVSVEVYX1NIQURFUik7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHNpbXBsZSB1
bnNpZ25lZCBpbnRlZ2VyIHRleHR1cmUgZnJhZ21lbnQgc2hhZGVyLgogICAqIE91dHB1dCBpcyBz
Y2FsZWQgYnkgMS8yNTUgdG8gYnJpbmcgdGhlIHJlc3VsdCBpbnRvIG5vcm1hbGl6ZWQgZmxvYXQg
cmFuZ2UuCiAgICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xS
ZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICAgKiBAcmV0dXJuIHshV2ViR0xTaGFkZXJ9CiAgICov
CiAgdmFyIHNldHVwU2ltcGxlVWludFRleHR1cmVGcmFnbWVudFNoYWRlciA9IGZ1bmN0aW9uKGds
KSB7CiAgICByZXR1cm4gV2ViR0xUZXN0VXRpbHMubG9hZFNoYWRlcihnbCwgc2ltcGxlVWludFRl
eHR1cmVGcmFnbWVudFNoYWRlckVTMywgZ2wuRlJBR01FTlRfU0hBREVSKTsKICB9OwoKICAvKioK
ICAgKiBDcmVhdGVzIGEgc2ltcGxlIHNpZ25lZCBpbnRlZ2VyIHRleHR1cmUgZnJhZ21lbnQgc2hh
ZGVyLgogICAqIE91dHB1dCBpcyBzY2FsZWQgYnkgMS8yNTUgdG8gYnJpbmcgdGhlIHJlc3VsdCBp
bnRvIG5vcm1hbGl6ZWQgZmxvYXQgcmFuZ2UuCiAgICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdD
b250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICAgKiBAcmV0dXJu
IHshV2ViR0xTaGFkZXJ9CiAgICovCiAgdmFyIHNldHVwU2ltcGxlSW50VGV4dHVyZUZyYWdtZW50
U2hhZGVyID0gZnVuY3Rpb24oZ2wpIHsKICAgIHJldHVybiBXZWJHTFRlc3RVdGlscy5sb2FkU2hh
ZGVyKGdsLCBzaW1wbGVJbnRUZXh0dXJlRnJhZ21lbnRTaGFkZXJFUzMsIGdsLkZSQUdNRU5UX1NI
QURFUik7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHNpbXBsZSBjdWJlIG1hcCB1bnNpZ25l
ZCBpbnRlZ2VyIHRleHR1cmUgZnJhZ21lbnQgc2hhZGVyLgogICAqIEBwYXJhbSB7IVdlYkdMUmVu
ZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAgICog
QHJldHVybiB7IVdlYkdMU2hhZGVyfQogICAqLwogIHZhciBzZXR1cFNpbXBsZUN1YmVNYXBVaW50
VGV4dHVyZUZyYWdtZW50U2hhZGVyID0gZnVuY3Rpb24oZ2wpIHsKICAgIHJldHVybiBXZWJHTFRl
c3RVdGlscy5sb2FkU2hhZGVyKGdsLCBzaW1wbGVDdWJlTWFwVWludFRleHR1cmVGcmFnbWVudFNo
YWRlckVTMywgZ2wuRlJBR01FTlRfU0hBREVSKTsKICB9OwoKICAvKioKICAgKiBDcmVhdGVzIGEg
c2ltcGxlIGN1YmUgbWFwIHNpZ25lZCBpbnRlZ2VyIHRleHR1cmUgZnJhZ21lbnQgc2hhZGVyLgog
ICAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5n
Q29udGV4dCB0byB1c2UuCiAgICogQHJldHVybiB7IVdlYkdMU2hhZGVyfQogICAqLwogIHZhciBz
ZXR1cFNpbXBsZUN1YmVNYXBJbnRUZXh0dXJlRnJhZ21lbnRTaGFkZXIgPSBmdW5jdGlvbihnbCkg
ewogICAgcmV0dXJuIFdlYkdMVGVzdFV0aWxzLmxvYWRTaGFkZXIoZ2wsIHNpbXBsZUN1YmVNYXBJ
bnRUZXh0dXJlRnJhZ21lbnRTaGFkZXJFUzMsIGdsLkZSQUdNRU5UX1NIQURFUik7CiAgfTsKCiAg
LyoqCiAgICogQ3JlYXRlcyBhIHNpbXBsZSAzRCB0ZXh0dXJlIGZyYWdtZW50IHNoYWRlci4KICAg
KiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0Nv
bnRleHQgdG8gdXNlLgogICAqIEByZXR1cm4geyFXZWJHTFNoYWRlcn0KICAgKi8KICB2YXIgc2V0
dXBTaW1wbGUzRFRleHR1cmVGcmFnbWVudFNoYWRlciA9IGZ1bmN0aW9uKGdsKSB7CiAgICByZXR1
cm4gV2ViR0xUZXN0VXRpbHMubG9hZFNoYWRlcihnbCwgc2ltcGxlM0RUZXh0dXJlRnJhZ21lbnRT
aGFkZXJFUzMsIGdsLkZSQUdNRU5UX1NIQURFUik7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBh
IHNpbXBsZSAzRCB1bnNpZ25lZCBpbnRlZ2VyIHRleHR1cmUgZnJhZ21lbnQgc2hhZGVyLgogICAq
IEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29u
dGV4dCB0byB1c2UuCiAgICogQHJldHVybiB7IVdlYkdMU2hhZGVyfQogICAqLwogIHZhciBzZXR1
cFNpbXBsZTNEVWludFRleHR1cmVGcmFnbWVudFNoYWRlciA9IGZ1bmN0aW9uKGdsKSB7CiAgICBy
ZXR1cm4gV2ViR0xUZXN0VXRpbHMubG9hZFNoYWRlcihnbCwgc2ltcGxlM0RVaW50VGV4dHVyZUZy
YWdtZW50U2hhZGVyRVMzLCBnbC5GUkFHTUVOVF9TSEFERVIpOwogIH07CgogIC8qKgogICAqIENy
ZWF0ZXMgYSBzaW1wbGUgM0Qgc2lnbmVkIGludGVnZXIgdGV4dHVyZSBmcmFnbWVudCBzaGFkZXIu
CiAgICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJp
bmdDb250ZXh0IHRvIHVzZS4KICAgKiBAcmV0dXJuIHshV2ViR0xTaGFkZXJ9CiAgICovCiAgdmFy
IHNldHVwU2ltcGxlM0RJbnRUZXh0dXJlRnJhZ21lbnRTaGFkZXIgPSBmdW5jdGlvbihnbCkgewog
ICAgcmV0dXJuIFdlYkdMVGVzdFV0aWxzLmxvYWRTaGFkZXIoZ2wsIHNpbXBsZTNESW50VGV4dHVy
ZUZyYWdtZW50U2hhZGVyRVMzLCBnbC5GUkFHTUVOVF9TSEFERVIpOwogIH07CgogIC8qKgogICAq
IENyZWF0ZXMgYSBzaW1wbGUgMkRfQVJSQVkgdGV4dHVyZSBmcmFnbWVudCBzaGFkZXIuCiAgICog
QHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250
ZXh0IHRvIHVzZS4KICAgKiBAcmV0dXJuIHshV2ViR0xTaGFkZXJ9CiAgICovCiAgdmFyIHNldHVw
U2ltcGxlMkRBcnJheVRleHR1cmVGcmFnbWVudFNoYWRlciA9IGZ1bmN0aW9uKGdsKSB7CiAgICBy
ZXR1cm4gV2ViR0xUZXN0VXRpbHMubG9hZFNoYWRlcihnbCwgc2ltcGxlMkRBcnJheVRleHR1cmVG
cmFnbWVudFNoYWRlckVTMywgZ2wuRlJBR01FTlRfU0hBREVSKTsKICB9OwoKICAvKioKICAgKiBD
cmVhdGVzIGEgc2ltcGxlIDJEX0FSUkFZIGludGVnZXIgdGV4dHVyZSBmcmFnbWVudCBzaGFkZXIu
CiAgICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJp
bmdDb250ZXh0IHRvIHVzZS4KICAgKiBAcmV0dXJuIHshV2ViR0xTaGFkZXJ9CiAgICovCiAgdmFy
IHNldHVwU2ltcGxlMkRBcnJheVVpbnRUZXh0dXJlRnJhZ21lbnRTaGFkZXIgPSBmdW5jdGlvbihn
bCkgewogICAgcmV0dXJuIFdlYkdMVGVzdFV0aWxzLmxvYWRTaGFkZXIoZ2wsIHNpbXBsZTJEQXJy
YXlVaW50VGV4dHVyZUZyYWdtZW50U2hhZGVyRVMzLCBnbC5GUkFHTUVOVF9TSEFERVIpOwogIH07
CgogIC8qKgogICAqIENyZWF0ZXMgYSBzaW1wbGUgdW5zaWduZWQgaW50ZWdlciB0ZXh0dXJlIHBy
b2dyYW0uCiAgICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xS
ZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICAgKiBAcGFyYW0ge251bWJlcn0gb3B0X3Bvc2l0aW9u
TG9jYXRpb24gVGhlIGF0dHJpYiBsb2NhdGlvbiBmb3IgcG9zaXRpb24uCiAgICogQHBhcmFtIHtu
dW1iZXJ9IG9wdF90ZXhjb29yZExvY2F0aW9uIFRoZSBhdHRyaWIgbG9jYXRpb24gZm9yIHRleHR1
cmUgY29vcmRzLgogICAqIEByZXR1cm4ge1dlYkdMUHJvZ3JhbX0KICAgKi8KICB2YXIgc2V0dXBT
aW1wbGVVaW50VGV4dHVyZVByb2dyYW0gPSBmdW5jdGlvbihnbCwgb3B0X3Bvc2l0aW9uTG9jYXRp
b24sIG9wdF90ZXhjb29yZExvY2F0aW9uKQogIHsKICAgIG9wdF9wb3NpdGlvbkxvY2F0aW9uID0g
b3B0X3Bvc2l0aW9uTG9jYXRpb24gfHwgMDsKICAgIG9wdF90ZXhjb29yZExvY2F0aW9uID0gb3B0
X3RleGNvb3JkTG9jYXRpb24gfHwgMTsKICAgIHZhciB2cyA9IHNldHVwU2ltcGxlVGV4dHVyZVZl
cnRleFNoYWRlcihnbCksCiAgICAgICAgZnMgPSBzZXR1cFNpbXBsZVVpbnRUZXh0dXJlRnJhZ21l
bnRTaGFkZXIoZ2wpOwogICAgaWYgKCF2cyB8fCAhZnMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAg
ICB9CiAgICB2YXIgcHJvZ3JhbSA9IFdlYkdMVGVzdFV0aWxzLnNldHVwUHJvZ3JhbSgKICAgICAg
Z2wsCiAgICAgIFt2cywgZnNdLAogICAgICBbJ3ZQb3NpdGlvbicsICd0ZXhDb29yZDAnXSwKICAg
ICAgW29wdF9wb3NpdGlvbkxvY2F0aW9uLCBvcHRfdGV4Y29vcmRMb2NhdGlvbl0pOwogICAgaWYg
KCFwcm9ncmFtKSB7CiAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcyk7CiAgICAgIGdsLmRlbGV0ZVNo
YWRlcih2cyk7CiAgICB9CiAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgcmV0dXJuIHBy
b2dyYW07CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHNpbXBsZSBzaWduZWQgaW50ZWdlciB0
ZXh0dXJlIHByb2dyYW0uCiAgICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBU
aGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICAgKiBAcGFyYW0ge251bWJlcn0gb3B0
X3Bvc2l0aW9uTG9jYXRpb24gVGhlIGF0dHJpYiBsb2NhdGlvbiBmb3IgcG9zaXRpb24uCiAgICog
QHBhcmFtIHtudW1iZXJ9IG9wdF90ZXhjb29yZExvY2F0aW9uIFRoZSBhdHRyaWIgbG9jYXRpb24g
Zm9yIHRleHR1cmUgY29vcmRzLgogICAqIEByZXR1cm4ge1dlYkdMUHJvZ3JhbX0KICAgKi8KICB2
YXIgc2V0dXBTaW1wbGVJbnRUZXh0dXJlUHJvZ3JhbSA9IGZ1bmN0aW9uKGdsLCBvcHRfcG9zaXRp
b25Mb2NhdGlvbiwgb3B0X3RleGNvb3JkTG9jYXRpb24pCiAgewogICAgb3B0X3Bvc2l0aW9uTG9j
YXRpb24gPSBvcHRfcG9zaXRpb25Mb2NhdGlvbiB8fCAwOwogICAgb3B0X3RleGNvb3JkTG9jYXRp
b24gPSBvcHRfdGV4Y29vcmRMb2NhdGlvbiB8fCAxOwogICAgdmFyIHZzID0gc2V0dXBTaW1wbGVU
ZXh0dXJlVmVydGV4U2hhZGVyKGdsKSwKICAgICAgICBmcyA9IHNldHVwU2ltcGxlSW50VGV4dHVy
ZUZyYWdtZW50U2hhZGVyKGdsKTsKICAgIGlmICghdnMgfHwgIWZzKSB7CiAgICAgIHJldHVybiBu
dWxsOwogICAgfQogICAgdmFyIHByb2dyYW0gPSBXZWJHTFRlc3RVdGlscy5zZXR1cFByb2dyYW0o
CiAgICAgIGdsLAogICAgICBbdnMsIGZzXSwKICAgICAgWyd2UG9zaXRpb24nLCAndGV4Q29vcmQw
J10sCiAgICAgIFtvcHRfcG9zaXRpb25Mb2NhdGlvbiwgb3B0X3RleGNvb3JkTG9jYXRpb25dKTsK
ICAgIGlmICghcHJvZ3JhbSkgewogICAgICBnbC5kZWxldGVTaGFkZXIoZnMpOwogICAgICBnbC5k
ZWxldGVTaGFkZXIodnMpOwogICAgfQogICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgIHJl
dHVybiBwcm9ncmFtOwogIH07CgogIC8qKgogICAqIENyZWF0ZXMgYSBzaW1wbGUgY3ViZSBtYXAg
dW5zaWduZWQgaW50ZWdlciB0ZXh0dXJlIHByb2dyYW0uCiAgICogQHBhcmFtIHshV2ViR0xSZW5k
ZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICAgKiBA
cGFyYW0ge251bWJlcn0gb3B0X3Bvc2l0aW9uTG9jYXRpb24gVGhlIGF0dHJpYiBsb2NhdGlvbiBm
b3IgcG9zaXRpb24uCiAgICogQHBhcmFtIHtudW1iZXJ9IG9wdF90ZXhjb29yZExvY2F0aW9uIFRo
ZSBhdHRyaWIgbG9jYXRpb24gZm9yIHRleHR1cmUgY29vcmRzLgogICAqIEByZXR1cm4ge1dlYkdM
UHJvZ3JhbX0KICAgKi8KICB2YXIgc2V0dXBTaW1wbGVDdWJlTWFwVWludFRleHR1cmVQcm9ncmFt
ID0gZnVuY3Rpb24oZ2wsIG9wdF9wb3NpdGlvbkxvY2F0aW9uLCBvcHRfdGV4Y29vcmRMb2NhdGlv
bikgewogICAgb3B0X3Bvc2l0aW9uTG9jYXRpb24gPSBvcHRfcG9zaXRpb25Mb2NhdGlvbiB8fCAw
OwogICAgb3B0X3RleGNvb3JkTG9jYXRpb24gPSBvcHRfdGV4Y29vcmRMb2NhdGlvbiB8fCAxOwog
ICAgdmFyIHZzID0gc2V0dXBTaW1wbGVUZXh0dXJlVmVydGV4U2hhZGVyKGdsKTsKICAgIHZhciBm
cyA9IHNldHVwU2ltcGxlQ3ViZU1hcFVpbnRUZXh0dXJlRnJhZ21lbnRTaGFkZXIoZ2wpOwogICAg
aWYgKCF2cyB8fCAhZnMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgcHJvZ3Jh
bSA9IFdlYkdMVGVzdFV0aWxzLnNldHVwUHJvZ3JhbSgKICAgICAgZ2wsCiAgICAgIFt2cywgZnNd
LAogICAgICBbJ3ZQb3NpdGlvbicsICd0ZXhDb29yZDAnXSwKICAgICAgW29wdF9wb3NpdGlvbkxv
Y2F0aW9uLCBvcHRfdGV4Y29vcmRMb2NhdGlvbl0pOwogICAgaWYgKCFwcm9ncmFtKSB7CiAgICAg
IGdsLmRlbGV0ZVNoYWRlcihmcyk7CiAgICAgIGdsLmRlbGV0ZVNoYWRlcih2cyk7CiAgICB9CiAg
ICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgcmV0dXJuIHByb2dyYW07CiAgfTsKCiAgLyoq
CiAgICogQ3JlYXRlcyBhIHNpbXBsZSBjdWJlIG1hcCBzaWduZWQgaW50ZWdlciB0ZXh0dXJlIHBy
b2dyYW0uCiAgICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xS
ZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICAgKiBAcGFyYW0ge251bWJlcn0gb3B0X3Bvc2l0aW9u
TG9jYXRpb24gVGhlIGF0dHJpYiBsb2NhdGlvbiBmb3IgcG9zaXRpb24uCiAgICogQHBhcmFtIHtu
dW1iZXJ9IG9wdF90ZXhjb29yZExvY2F0aW9uIFRoZSBhdHRyaWIgbG9jYXRpb24gZm9yIHRleHR1
cmUgY29vcmRzLgogICAqIEByZXR1cm4ge1dlYkdMUHJvZ3JhbX0KICAgKi8KICB2YXIgc2V0dXBT
aW1wbGVDdWJlTWFwSW50VGV4dHVyZVByb2dyYW0gPSBmdW5jdGlvbihnbCwgb3B0X3Bvc2l0aW9u
TG9jYXRpb24sIG9wdF90ZXhjb29yZExvY2F0aW9uKSB7CiAgICBvcHRfcG9zaXRpb25Mb2NhdGlv
biA9IG9wdF9wb3NpdGlvbkxvY2F0aW9uIHx8IDA7CiAgICBvcHRfdGV4Y29vcmRMb2NhdGlvbiA9
IG9wdF90ZXhjb29yZExvY2F0aW9uIHx8IDE7CiAgICB2YXIgdnMgPSBzZXR1cFNpbXBsZVRleHR1
cmVWZXJ0ZXhTaGFkZXIoZ2wpOwogICAgdmFyIGZzID0gc2V0dXBTaW1wbGVDdWJlTWFwSW50VGV4
dHVyZUZyYWdtZW50U2hhZGVyKGdsKTsKICAgIGlmICghdnMgfHwgIWZzKSB7CiAgICAgIHJldHVy
biBudWxsOwogICAgfQogICAgdmFyIHByb2dyYW0gPSBXZWJHTFRlc3RVdGlscy5zZXR1cFByb2dy
YW0oCiAgICAgIGdsLAogICAgICBbdnMsIGZzXSwKICAgICAgWyd2UG9zaXRpb24nLCAndGV4Q29v
cmQwJ10sCiAgICAgIFtvcHRfcG9zaXRpb25Mb2NhdGlvbiwgb3B0X3RleGNvb3JkTG9jYXRpb25d
KTsKICAgIGlmICghcHJvZ3JhbSkgewogICAgICBnbC5kZWxldGVTaGFkZXIoZnMpOwogICAgICBn
bC5kZWxldGVTaGFkZXIodnMpOwogICAgfQogICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAg
IHJldHVybiBwcm9ncmFtOwogIH07CgogIC8qKgogICAqIENyZWF0ZXMgYSBzaW1wbGUgM0QgdGV4
dHVyZSBwcm9ncmFtLgogICAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhl
IFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAgICogQHBhcmFtIHtudW1iZXJ9IG9wdF9w
b3NpdGlvbkxvY2F0aW9uIFRoZSBhdHRyaWIgbG9jYXRpb24gZm9yIHBvc2l0aW9uLgogICAqIEBw
YXJhbSB7bnVtYmVyfSBvcHRfdGV4Y29vcmRMb2NhdGlvbiBUaGUgYXR0cmliIGxvY2F0aW9uIGZv
ciB0ZXh0dXJlIGNvb3Jkcy4KICAgKiBAcmV0dXJuIHtXZWJHTFByb2dyYW19CiAgICovCiAgdmFy
IHNldHVwU2ltcGxlM0RUZXh0dXJlUHJvZ3JhbSA9IGZ1bmN0aW9uKGdsLCBvcHRfcG9zaXRpb25M
b2NhdGlvbiwgb3B0X3RleGNvb3JkTG9jYXRpb24pCiAgewogICAgb3B0X3Bvc2l0aW9uTG9jYXRp
b24gPSBvcHRfcG9zaXRpb25Mb2NhdGlvbiB8fCAwOwogICAgb3B0X3RleGNvb3JkTG9jYXRpb24g
PSBvcHRfdGV4Y29vcmRMb2NhdGlvbiB8fCAxOwogICAgdmFyIHZzID0gc2V0dXBTaW1wbGVUZXh0
dXJlVmVydGV4U2hhZGVyKGdsKSwKICAgICAgICBmcyA9IHNldHVwU2ltcGxlM0RUZXh0dXJlRnJh
Z21lbnRTaGFkZXIoZ2wpOwogICAgaWYgKCF2cyB8fCAhZnMpIHsKICAgICAgcmV0dXJuIG51bGw7
CiAgICB9CiAgICB2YXIgcHJvZ3JhbSA9IFdlYkdMVGVzdFV0aWxzLnNldHVwUHJvZ3JhbSgKICAg
ICAgZ2wsCiAgICAgIFt2cywgZnNdLAogICAgICBbJ3ZQb3NpdGlvbicsICd0ZXhDb29yZDAnXSwK
ICAgICAgW29wdF9wb3NpdGlvbkxvY2F0aW9uLCBvcHRfdGV4Y29vcmRMb2NhdGlvbl0pOwogICAg
aWYgKCFwcm9ncmFtKSB7CiAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcyk7CiAgICAgIGdsLmRlbGV0
ZVNoYWRlcih2cyk7CiAgICB9CiAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgcmV0dXJu
IHByb2dyYW07CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHNpbXBsZSAzRCB1bnNpZ25lZCBp
bnRlZ2VyIHRleHR1cmUgcHJvZ3JhbS4KICAgKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRl
eHR9IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogICAqIEBwYXJhbSB7bnVt
YmVyfSBvcHRfcG9zaXRpb25Mb2NhdGlvbiBUaGUgYXR0cmliIGxvY2F0aW9uIGZvciBwb3NpdGlv
bi4KICAgKiBAcGFyYW0ge251bWJlcn0gb3B0X3RleGNvb3JkTG9jYXRpb24gVGhlIGF0dHJpYiBs
b2NhdGlvbiBmb3IgdGV4dHVyZSBjb29yZHMuCiAgICogQHJldHVybiB7V2ViR0xQcm9ncmFtfQog
ICAqLwogIHZhciBzZXR1cFNpbXBsZTNEVWludFRleHR1cmVQcm9ncmFtID0gZnVuY3Rpb24oZ2ws
IG9wdF9wb3NpdGlvbkxvY2F0aW9uLCBvcHRfdGV4Y29vcmRMb2NhdGlvbikKICB7CiAgICBvcHRf
cG9zaXRpb25Mb2NhdGlvbiA9IG9wdF9wb3NpdGlvbkxvY2F0aW9uIHx8IDA7CiAgICBvcHRfdGV4
Y29vcmRMb2NhdGlvbiA9IG9wdF90ZXhjb29yZExvY2F0aW9uIHx8IDE7CiAgICB2YXIgdnMgPSBz
ZXR1cFNpbXBsZVRleHR1cmVWZXJ0ZXhTaGFkZXIoZ2wpLAogICAgICAgIGZzID0gc2V0dXBTaW1w
bGUzRFVpbnRUZXh0dXJlRnJhZ21lbnRTaGFkZXIoZ2wpOwogICAgaWYgKCF2cyB8fCAhZnMpIHsK
ICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgcHJvZ3JhbSA9IFdlYkdMVGVzdFV0aWxz
LnNldHVwUHJvZ3JhbSgKICAgICAgZ2wsCiAgICAgIFt2cywgZnNdLAogICAgICBbJ3ZQb3NpdGlv
bicsICd0ZXhDb29yZDAnXSwKICAgICAgW29wdF9wb3NpdGlvbkxvY2F0aW9uLCBvcHRfdGV4Y29v
cmRMb2NhdGlvbl0pOwogICAgaWYgKCFwcm9ncmFtKSB7CiAgICAgIGdsLmRlbGV0ZVNoYWRlcihm
cyk7CiAgICAgIGdsLmRlbGV0ZVNoYWRlcih2cyk7CiAgICB9CiAgICBnbC51c2VQcm9ncmFtKHBy
b2dyYW0pOwogICAgcmV0dXJuIHByb2dyYW07CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHNp
bXBsZSAzRCBzaWduZWQgaW50ZWdlciB0ZXh0dXJlIHByb2dyYW0uCiAgICogQHBhcmFtIHshV2Vi
R0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4K
ICAgKiBAcGFyYW0ge251bWJlcn0gb3B0X3Bvc2l0aW9uTG9jYXRpb24gVGhlIGF0dHJpYiBsb2Nh
dGlvbiBmb3IgcG9zaXRpb24uCiAgICogQHBhcmFtIHtudW1iZXJ9IG9wdF90ZXhjb29yZExvY2F0
aW9uIFRoZSBhdHRyaWIgbG9jYXRpb24gZm9yIHRleHR1cmUgY29vcmRzLgogICAqIEByZXR1cm4g
e1dlYkdMUHJvZ3JhbX0KICAgKi8KICB2YXIgc2V0dXBTaW1wbGUzREludFRleHR1cmVQcm9ncmFt
ID0gZnVuY3Rpb24oZ2wsIG9wdF9wb3NpdGlvbkxvY2F0aW9uLCBvcHRfdGV4Y29vcmRMb2NhdGlv
bikKICB7CiAgICBvcHRfcG9zaXRpb25Mb2NhdGlvbiA9IG9wdF9wb3NpdGlvbkxvY2F0aW9uIHx8
IDA7CiAgICBvcHRfdGV4Y29vcmRMb2NhdGlvbiA9IG9wdF90ZXhjb29yZExvY2F0aW9uIHx8IDE7
CiAgICB2YXIgdnMgPSBzZXR1cFNpbXBsZVRleHR1cmVWZXJ0ZXhTaGFkZXIoZ2wpLAogICAgICAg
IGZzID0gc2V0dXBTaW1wbGUzREludFRleHR1cmVGcmFnbWVudFNoYWRlcihnbCk7CiAgICBpZiAo
IXZzIHx8ICFmcykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBwcm9ncmFtID0g
V2ViR0xUZXN0VXRpbHMuc2V0dXBQcm9ncmFtKAogICAgICBnbCwKICAgICAgW3ZzLCBmc10sCiAg
ICAgIFsndlBvc2l0aW9uJywgJ3RleENvb3JkMCddLAogICAgICBbb3B0X3Bvc2l0aW9uTG9jYXRp
b24sIG9wdF90ZXhjb29yZExvY2F0aW9uXSk7CiAgICBpZiAoIXByb2dyYW0pIHsKICAgICAgZ2wu
ZGVsZXRlU2hhZGVyKGZzKTsKICAgICAgZ2wuZGVsZXRlU2hhZGVyKHZzKTsKICAgIH0KICAgIGds
LnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICByZXR1cm4gcHJvZ3JhbTsKICB9OwoKICAvKioKICAg
KiBDcmVhdGVzIGEgc2ltcGxlIDJEX0FSUkFZIHRleHR1cmUgcHJvZ3JhbS4KICAgKiBAcGFyYW0g
eyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8g
dXNlLgogICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRfcG9zaXRpb25Mb2NhdGlvbiBUaGUgYXR0cmli
IGxvY2F0aW9uIGZvciBwb3NpdGlvbi4KICAgKiBAcGFyYW0ge251bWJlcn0gb3B0X3RleGNvb3Jk
TG9jYXRpb24gVGhlIGF0dHJpYiBsb2NhdGlvbiBmb3IgdGV4dHVyZSBjb29yZHMuCiAgICogQHJl
dHVybiB7V2ViR0xQcm9ncmFtfQogICAqLwogIHZhciBzZXR1cFNpbXBsZTJEQXJyYXlUZXh0dXJl
UHJvZ3JhbSA9IGZ1bmN0aW9uKGdsLCBvcHRfcG9zaXRpb25Mb2NhdGlvbiwgb3B0X3RleGNvb3Jk
TG9jYXRpb24pCiAgewogICAgb3B0X3Bvc2l0aW9uTG9jYXRpb24gPSBvcHRfcG9zaXRpb25Mb2Nh
dGlvbiB8fCAwOwogICAgb3B0X3RleGNvb3JkTG9jYXRpb24gPSBvcHRfdGV4Y29vcmRMb2NhdGlv
biB8fCAxOwogICAgdmFyIHZzID0gc2V0dXBTaW1wbGVUZXh0dXJlVmVydGV4U2hhZGVyKGdsKSwK
ICAgICAgICBmcyA9IHNldHVwU2ltcGxlMkRBcnJheVRleHR1cmVGcmFnbWVudFNoYWRlcihnbCk7
CiAgICBpZiAoIXZzIHx8ICFmcykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBw
cm9ncmFtID0gV2ViR0xUZXN0VXRpbHMuc2V0dXBQcm9ncmFtKAogICAgICBnbCwKICAgICAgW3Zz
LCBmc10sCiAgICAgIFsndlBvc2l0aW9uJywgJ3RleENvb3JkMCddLAogICAgICBbb3B0X3Bvc2l0
aW9uTG9jYXRpb24sIG9wdF90ZXhjb29yZExvY2F0aW9uXSk7CiAgICBpZiAoIXByb2dyYW0pIHsK
ICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZzKTsKICAgICAgZ2wuZGVsZXRlU2hhZGVyKHZzKTsKICAg
IH0KICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICByZXR1cm4gcHJvZ3JhbTsKICB9OwoK
ICAvKioKICAgKiBDcmVhdGVzIGEgc2ltcGxlIDJEX0FSUkFZIHVuc2lnbmVkIGludGVnZXIgdGV4
dHVyZSBwcm9ncmFtLgogICAqIEBwYXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhl
IFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1c2UuCiAgICogQHBhcmFtIHtudW1iZXJ9IG9wdF9w
b3NpdGlvbkxvY2F0aW9uIFRoZSBhdHRyaWIgbG9jYXRpb24gZm9yIHBvc2l0aW9uLgogICAqIEBw
YXJhbSB7bnVtYmVyfSBvcHRfdGV4Y29vcmRMb2NhdGlvbiBUaGUgYXR0cmliIGxvY2F0aW9uIGZv
ciB0ZXh0dXJlIGNvb3Jkcy4KICAgKiBAcmV0dXJuIHtXZWJHTFByb2dyYW19CiAgICovCiAgdmFy
IHNldHVwU2ltcGxlMkRBcnJheVVpbnRUZXh0dXJlUHJvZ3JhbSA9IGZ1bmN0aW9uKGdsLCBvcHRf
cG9zaXRpb25Mb2NhdGlvbiwgb3B0X3RleGNvb3JkTG9jYXRpb24pCiAgewogICAgb3B0X3Bvc2l0
aW9uTG9jYXRpb24gPSBvcHRfcG9zaXRpb25Mb2NhdGlvbiB8fCAwOwogICAgb3B0X3RleGNvb3Jk
TG9jYXRpb24gPSBvcHRfdGV4Y29vcmRMb2NhdGlvbiB8fCAxOwogICAgdmFyIHZzID0gc2V0dXBT
aW1wbGVUZXh0dXJlVmVydGV4U2hhZGVyKGdsKSwKICAgICAgICBmcyA9IHNldHVwU2ltcGxlMkRB
cnJheVVpbnRUZXh0dXJlRnJhZ21lbnRTaGFkZXIoZ2wpOwogICAgaWYgKCF2cyB8fCAhZnMpIHsK
ICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgcHJvZ3JhbSA9IFdlYkdMVGVzdFV0aWxz
LnNldHVwUHJvZ3JhbSgKICAgICAgZ2wsCiAgICAgIFt2cywgZnNdLAogICAgICBbJ3ZQb3NpdGlv
bicsICd0ZXhDb29yZDAnXSwKICAgICAgW29wdF9wb3NpdGlvbkxvY2F0aW9uLCBvcHRfdGV4Y29v
cmRMb2NhdGlvbl0pOwogICAgaWYgKCFwcm9ncmFtKSB7CiAgICAgIGdsLmRlbGV0ZVNoYWRlcihm
cyk7CiAgICAgIGdsLmRlbGV0ZVNoYWRlcih2cyk7CiAgICB9CiAgICBnbC51c2VQcm9ncmFtKHBy
b2dyYW0pOwogICAgcmV0dXJuIHByb2dyYW07CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHNp
bXBsZSAyRF9BUlJBWSBzaWduZWQgaW50ZWdlciB0ZXh0dXJlIHByb2dyYW0uCiAgICogQHBhcmFt
IHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5kZXJpbmdDb250ZXh0IHRv
IHVzZS4KICAgKiBAcGFyYW0ge251bWJlcn0gb3B0X3Bvc2l0aW9uTG9jYXRpb24gVGhlIGF0dHJp
YiBsb2NhdGlvbiBmb3IgcG9zaXRpb24uCiAgICogQHBhcmFtIHtudW1iZXJ9IG9wdF90ZXhjb29y
ZExvY2F0aW9uIFRoZSBhdHRyaWIgbG9jYXRpb24gZm9yIHRleHR1cmUgY29vcmRzLgogICAqIEBy
ZXR1cm4ge1dlYkdMUHJvZ3JhbX0KICAgKi8KICB2YXIgc2V0dXBTaW1wbGUyREFycmF5SW50VGV4
dHVyZVByb2dyYW0gPSBmdW5jdGlvbihnbCwgb3B0X3Bvc2l0aW9uTG9jYXRpb24sIG9wdF90ZXhj
b29yZExvY2F0aW9uKQogIHsKICAgIG9wdF9wb3NpdGlvbkxvY2F0aW9uID0gb3B0X3Bvc2l0aW9u
TG9jYXRpb24gfHwgMDsKICAgIG9wdF90ZXhjb29yZExvY2F0aW9uID0gb3B0X3RleGNvb3JkTG9j
YXRpb24gfHwgMTsKICAgIHZhciB2cyA9IHNldHVwU2ltcGxlVGV4dHVyZVZlcnRleFNoYWRlcihn
bCksCiAgICAgICAgZnMgPSBzZXR1cFNpbXBsZTJEQXJyYXlJbnRUZXh0dXJlRnJhZ21lbnRTaGFk
ZXIoZ2wpOwogICAgaWYgKCF2cyB8fCAhZnMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAg
ICB2YXIgcHJvZ3JhbSA9IFdlYkdMVGVzdFV0aWxzLnNldHVwUHJvZ3JhbSgKICAgICAgZ2wsCiAg
ICAgIFt2cywgZnNdLAogICAgICBbJ3ZQb3NpdGlvbicsICd0ZXhDb29yZDAnXSwKICAgICAgW29w
dF9wb3NpdGlvbkxvY2F0aW9uLCBvcHRfdGV4Y29vcmRMb2NhdGlvbl0pOwogICAgaWYgKCFwcm9n
cmFtKSB7CiAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcyk7CiAgICAgIGdsLmRlbGV0ZVNoYWRlcih2
cyk7CiAgICB9CiAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgcmV0dXJuIHByb2dyYW07
CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHByb2dyYW0gYW5kIGJ1ZmZlcnMgZm9yIHJlbmRl
cmluZyBhIHVuc2lnbmVkIGludGVnZXIgdGV4dHVyZWQgcXVhZC4KICAgKiBAcGFyYW0geyFXZWJH
TFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgog
ICAqIEByZXR1cm4geyFXZWJHTFByb2dyYW19CiAgICovCiAgdmFyIHNldHVwVWludFRleHR1cmVk
UXVhZCA9IGZ1bmN0aW9uKGdsKSB7CiAgICB2YXIgcHJvZ3JhbSA9IHNldHVwU2ltcGxlVWludFRl
eHR1cmVQcm9ncmFtKGdsKTsKICAgIHd0dS5zZXR1cFVuaXRRdWFkKGdsKTsKICAgIHJldHVybiBw
cm9ncmFtOwogIH07CgogIC8qKgogICAqIENyZWF0ZXMgYSBwcm9ncmFtIGFuZCBidWZmZXJzIGZv
ciByZW5kZXJpbmcgYSBzaWduZWQgaW50ZWdlciB0ZXh0dXJlZCBxdWFkLgogICAqIEBwYXJhbSB7
IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCB0byB1
c2UuCiAgICogQHJldHVybiB7IVdlYkdMUHJvZ3JhbX0KICAgKi8KICB2YXIgc2V0dXBJbnRUZXh0
dXJlZFF1YWQgPSBmdW5jdGlvbihnbCkgewogICAgdmFyIHByb2dyYW0gPSBzZXR1cFNpbXBsZUlu
dFRleHR1cmVQcm9ncmFtKGdsKTsKICAgIHd0dS5zZXR1cFVuaXRRdWFkKGdsKTsKICAgIHJldHVy
biBwcm9ncmFtOwogIH07CgogIC8qKgogICAqIENyZWF0ZXMgYSBwcm9ncmFtIGFuZCBidWZmZXJz
IGZvciByZW5kZXJpbmcgYSB0ZXh0dXJlZCBxdWFkIHdpdGgKICAgKiBhIGN1YmUgbWFwIHVuc2ln
bmVkIGludGVnZXIgdGV4dHVyZS4KICAgKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9
IGdsIFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogICAqIEByZXR1cm4geyFXZWJH
TFByb2dyYW19CiAgICovCiAgdmFyIHNldHVwVWludFRleHR1cmVkUXVhZFdpdGhDdWJlTWFwID0g
ZnVuY3Rpb24oZ2wpCiAgewogICAgdmFyIHByb2dyYW0gPSBzZXR1cFNpbXBsZUN1YmVNYXBVaW50
VGV4dHVyZVByb2dyYW0oZ2wpOwogICAgd3R1LnNldHVwVW5pdFF1YWQoZ2wpOwogICAgcmV0dXJu
IHByb2dyYW07CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHByb2dyYW0gYW5kIGJ1ZmZlcnMg
Zm9yIHJlbmRlcmluZyBhIHRleHR1cmVkIHF1YWQgd2l0aAogICAqIGEgY3ViZSBtYXAgc2lnbmVk
IGludGVnZXIgdGV4dHVyZS4KICAgKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGds
IFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogICAqIEByZXR1cm4geyFXZWJHTFBy
b2dyYW19CiAgICovCiAgdmFyIHNldHVwSW50VGV4dHVyZWRRdWFkV2l0aEN1YmVNYXAgPSBmdW5j
dGlvbihnbCkKICB7CiAgICB2YXIgcHJvZ3JhbSA9IHNldHVwU2ltcGxlQ3ViZU1hcEludFRleHR1
cmVQcm9ncmFtKGdsKTsKICAgIHd0dS5zZXR1cFVuaXRRdWFkKGdsKTsKICAgIHJldHVybiBwcm9n
cmFtOwogIH07CgogIC8qKgogICAqIERvZXMgdGhlIEdMIGludGVybmFsIGZvcm1hdCByZXByZXNl
bnQgYW4gdW5zaWduZWQgaW50ZWdlciBmb3JtYXQKICAgKiB0ZXh0dXJlPwogICAqIEByZXR1cm4g
e2Jvb2xlYW59CiAgICovCiAgdmFyIGlzVWludEZvcm1hdCA9IGZ1bmN0aW9uKGludGVybmFsRm9y
bWF0KQogIHsKICAgIHJldHVybiAoaW50ZXJuYWxGb3JtYXQgPT0gIlI4VUkiIHx8IGludGVybmFs
Rm9ybWF0ID09ICJSRzhVSSIgfHwgaW50ZXJuYWxGb3JtYXQgPT0gIlJHQjhVSSIgfHwgaW50ZXJu
YWxGb3JtYXQgPT0gIlJHQkE4VUkiIHx8CiAgICAgICAgICAgIGludGVybmFsRm9ybWF0ID09ICJS
MTZVSSIgfHwgaW50ZXJuYWxGb3JtYXQgPT0gIlJHMTZVSSIgfHwgaW50ZXJuYWxGb3JtYXQgPT0g
IlJHQjE2VUkiIHx8IGludGVybmFsRm9ybWF0ID09ICJSR0JBMTZVSSIgfHwKICAgICAgICAgICAg
aW50ZXJuYWxGb3JtYXQgPT0gIlIzMlVJIiB8fCBpbnRlcm5hbEZvcm1hdCA9PSAiUkczMlVJIiB8
fCBpbnRlcm5hbEZvcm1hdCA9PSAiUkdCMzJVSSIgfHwgaW50ZXJuYWxGb3JtYXQgPT0gIlJHQkEz
MlVJIik7CiAgfTsKCiAgLyoqCiAgICogRG9lcyB0aGUgR0wgaW50ZXJuYWwgZm9ybWF0IHJlcHJl
c2VudCBhbiBzaWduZWQgaW50ZWdlciBmb3JtYXQKICAgKiB0ZXh0dXJlPwogICAqIEByZXR1cm4g
e2Jvb2xlYW59CiAgICovCiAgdmFyIGlzSW50Rm9ybWF0ID0gZnVuY3Rpb24oaW50ZXJuYWxGb3Jt
YXQpCiAgewogICAgcmV0dXJuIChpbnRlcm5hbEZvcm1hdCA9PSAiUjhJIiB8fCBpbnRlcm5hbEZv
cm1hdCA9PSAiUkc4SSIgfHwgaW50ZXJuYWxGb3JtYXQgPT0gIlJHQjhJIiB8fCBpbnRlcm5hbEZv
cm1hdCA9PSAiUkdCQThJIiB8fAogICAgICAgICAgICBpbnRlcm5hbEZvcm1hdCA9PSAiUjE2SSIg
fHwgaW50ZXJuYWxGb3JtYXQgPT0gIlJHMTZJIiB8fCBpbnRlcm5hbEZvcm1hdCA9PSAiUkdCMTZJ
IiB8fCBpbnRlcm5hbEZvcm1hdCA9PSAiUkdCQTE2SSIgfHwKICAgICAgICAgICAgaW50ZXJuYWxG
b3JtYXQgPT0gIlIzMkkiIHx8IGludGVybmFsRm9ybWF0ID09ICJSRzMySSIgfHwgaW50ZXJuYWxG
b3JtYXQgPT0gIlJHQjMySSIgfHwgaW50ZXJuYWxGb3JtYXQgPT0gIlJHQkEzMkkiKTsKICB9OwoK
ICAvKioKICAgKiBDcmVhdGVhIGEgcHJvZ3JhbSBhbmQgYnVmZmVycyBmb3IgcmVuZGVyaW5nIGEg
dGV4dHVyZWQgcXVhZCBmb3IKICAgKiB0ZXgtaW1hZ2UtYW5kLXN1Yi1pbWFnZSB0ZXN0cy4gSGFu
ZGxlIHNlbGVjdGlvbiBvZiBjb3JyZWN0CiAgICogcHJvZ3JhbSB0byBoYW5kbGUgdGV4dHVyZSBm
b3JtYXQuCiAgICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xS
ZW5kZXJpbmdDb250ZXh0IHRvIHVzZS4KICAgKiBAcGFyYW0ge3N0cmluZ30gaW50ZXJuYWxGb3Jt
YXQgVGhlIGludGVybmFsIGZvcm1hdCBmb3IgdGV4dHVyZSB0byBiZSB0ZXN0ZWQuCiAgICovCiAg
dmFyIHNldHVwVGV4dHVyZWRRdWFkID0gZnVuY3Rpb24oZ2wsIGludGVybmFsRm9ybWF0KQogIHsK
ICAgIGlmIChpc1VpbnRGb3JtYXQoaW50ZXJuYWxGb3JtYXQpKQogICAgICByZXR1cm4gc2V0dXBV
aW50VGV4dHVyZWRRdWFkKGdsKTsKICAgIGlmIChpc0ludEZvcm1hdChpbnRlcm5hbEZvcm1hdCkp
CiAgICAgIHJldHVybiBzZXR1cEludFRleHR1cmVkUXVhZChnbCk7CiAgICByZXR1cm4gd3R1LnNl
dHVwVGV4dHVyZWRRdWFkKGdsKTsKICB9OwoKICAvKioKICAgKiBDcmVhdGVhIGEgcHJvZ3JhbSBh
bmQgYnVmZmVycyBmb3IgcmVuZGVyaW5nIGEgdGV4dHVyZWQgcXVhZCB3aXRoCiAgICogYSBjdWJl
IG1hcCBmb3IgdGV4LWltYWdlLWFuZC1zdWItaW1hZ2UgdGVzdHMuIEhhbmRsZSBzZWxlY3Rpb24g
b2YKICAgKiBjb3JyZWN0IHByb2dyYW0gdG8gaGFuZGxlIHRleHR1cmUgZm9ybWF0LgogICAqIEBw
YXJhbSB7IVdlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4
dCB0byB1c2UuCiAgICogQHBhcmFtIHtzdHJpbmd9IGludGVybmFsRm9ybWF0IFRoZSBpbnRlcm5h
bCBmb3JtYXQgZm9yIHRleHR1cmUgdG8gYmUgdGVzdGVkLgogICAqLwogIGZ1bmN0aW9uIHNldHVw
VGV4dHVyZWRRdWFkV2l0aEN1YmVNYXAoZ2wsIGludGVybmFsRm9ybWF0KQogIHsKICAgIGlmIChp
c1VpbnRGb3JtYXQoaW50ZXJuYWxGb3JtYXQpKQogICAgICByZXR1cm4gc2V0dXBVaW50VGV4dHVy
ZWRRdWFkV2l0aEN1YmVNYXAoZ2wpOwogICAgaWYgKGlzSW50Rm9ybWF0KGludGVybmFsRm9ybWF0
KSkKICAgICAgcmV0dXJuIHNldHVwSW50VGV4dHVyZWRRdWFkV2l0aEN1YmVNYXAoZ2wpOwogICAg
cmV0dXJuIHd0dS5zZXR1cFRleHR1cmVkUXVhZFdpdGhDdWJlTWFwKGdsKTsKICB9CgogIC8qKgog
ICAqIENyZWF0ZWEgYSBwcm9ncmFtIGFuZCBidWZmZXJzIGZvciByZW5kZXJpbmcgYSB0ZXh0dXJl
ZCBxdWFkIHdpdGggYSAzRCB0ZXh0dXJlCiAgICogZm9yIHRleC1pbWFnZS1hbmQtc3ViLWltYWdl
IHRlc3RzLiBIYW5kbGUgc2VsZWN0aW9uIG9mIGNvcnJlY3QKICAgKiBwcm9ncmFtIHRvIGhhbmRs
ZSB0ZXh0dXJlIGZvcm1hdC4KICAgKiBAcGFyYW0geyFXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGds
IFRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHQgdG8gdXNlLgogICAqIEBwYXJhbSB7c3RyaW5nfSBp
bnRlcm5hbEZvcm1hdCBUaGUgaW50ZXJuYWwgZm9ybWF0IGZvciB0ZXh0dXJlIHRvIGJlIHRlc3Rl
ZC4KICAgKi8KICB2YXIgc2V0dXBUZXh0dXJlZFF1YWRXaXRoM0QgPSBmdW5jdGlvbihnbCwgaW50
ZXJuYWxGb3JtYXQpCiAgewogICAgdmFyIHByb2dyYW07CiAgICBpZiAoaXNVaW50Rm9ybWF0KGlu
dGVybmFsRm9ybWF0KSkKICAgICAgcHJvZ3JhbSA9IHNldHVwU2ltcGxlM0RVaW50VGV4dHVyZVBy
b2dyYW0oZ2wpOwogICAgZWxzZSBpZiAoaXNJbnRGb3JtYXQoaW50ZXJuYWxGb3JtYXQpKQogICAg
ICBwcm9ncmFtID0gc2V0dXBTaW1wbGUzREludFRleHR1cmVQcm9ncmFtKGdsKTsKICAgIGVsc2UK
ICAgICAgcHJvZ3JhbSA9IHNldHVwU2ltcGxlM0RUZXh0dXJlUHJvZ3JhbShnbCk7CiAgICB2YXIg
dVJDb29yZExvYyA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAndVJDb29yZCcpOwog
ICAgZ2wudW5pZm9ybTFmKHVSQ29vcmRMb2MsIDAuMCk7CiAgICB3dHUuc2V0dXBVbml0UXVhZChn
bCk7CiAgICByZXR1cm4gcHJvZ3JhbTsKICB9OwoKICAvKioKICAgKiBDcmVhdGVhIGEgcHJvZ3Jh
bSBhbmQgYnVmZmVycyBmb3IgcmVuZGVyaW5nIGEgdGV4dHVyZWQgcXVhZCB3aXRoIGEgMkRfQVJS
QVkKICAgKiB0ZXh0dXJlIGZvciB0ZXgtaW1hZ2UtYW5kLXN1Yi1pbWFnZSB0ZXN0cy4gSGFuZGxl
IHNlbGVjdGlvbiBvZiBjb3JyZWN0CiAgICogcHJvZ3JhbSB0byBoYW5kbGUgdGV4dHVyZSBmb3Jt
YXQuCiAgICogQHBhcmFtIHshV2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgV2ViR0xSZW5k
ZXJpbmdDb250ZXh0IHRvIHVzZS4KICAgKiBAcGFyYW0ge3N0cmluZ30gaW50ZXJuYWxGb3JtYXQg
VGhlIGludGVybmFsIGZvcm1hdCBmb3IgdGV4dHVyZSB0byBiZSB0ZXN0ZWQuCiAgICovCiAgdmFy
IHNldHVwVGV4dHVyZWRRdWFkV2l0aDJEQXJyYXkgPSBmdW5jdGlvbihnbCwgaW50ZXJuYWxGb3Jt
YXQpCiAgewogICAgdmFyIHByb2dyYW07CiAgICBpZiAoaXNVaW50Rm9ybWF0KGludGVybmFsRm9y
bWF0KSkKICAgICAgcHJvZ3JhbSA9IHNldHVwU2ltcGxlMkRBcnJheVVpbnRUZXh0dXJlUHJvZ3Jh
bShnbCk7CiAgICBlbHNlIGlmIChpc0ludEZvcm1hdChpbnRlcm5hbEZvcm1hdCkpCiAgICAgIHBy
b2dyYW0gPSBzZXR1cFNpbXBsZTJEQXJyYXlJbnRUZXh0dXJlUHJvZ3JhbShnbCk7CiAgICBlbHNl
CiAgICAgIHByb2dyYW0gPSBzZXR1cFNpbXBsZTJEQXJyYXlUZXh0dXJlUHJvZ3JhbShnbCk7CiAg
ICB2YXIgdVJDb29yZExvYyA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAndVJDb29y
ZCcpOwogICAgZ2wudW5pZm9ybTFmKHVSQ29vcmRMb2MsIDAuMCk7CiAgICB3dHUuc2V0dXBVbml0
UXVhZChnbCk7CiAgICByZXR1cm4gcHJvZ3JhbTsKICB9OwoKICByZXR1cm4gewogICAgc2V0dXBU
ZXh0dXJlZFF1YWQ6IHNldHVwVGV4dHVyZWRRdWFkLAogICAgc2V0dXBUZXh0dXJlZFF1YWRXaXRo
Q3ViZU1hcDogc2V0dXBUZXh0dXJlZFF1YWRXaXRoQ3ViZU1hcCwKICAgIHNldHVwVGV4dHVyZWRR
dWFkV2l0aDNEOiBzZXR1cFRleHR1cmVkUXVhZFdpdGgzRCwKICAgIHNldHVwVGV4dHVyZWRRdWFk
V2l0aDJEQXJyYXk6IHNldHVwVGV4dHVyZWRRdWFkV2l0aDJEQXJyYXkKICB9OwoKfSgpKTsKPC9z
Y3JpcHQ+CjxzY3JpcHQ+CiAgLyoKKiogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBLaHJvbm9zIEdy
b3VwIEluYy4KKioKKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFy
Z2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFu
ZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQoqKiAiTWF0ZXJpYWxzIiks
IHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcK
Kiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1l
cmdlLCBwdWJsaXNoLAoqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3Bp
ZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCioqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhl
IE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCioqIHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9uczoKKioKKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRo
aXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKiogaW4gYWxsIGNvcGllcyBv
ciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgoqKgoqKiBUSEUgTUFURVJJ
QUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAoq
KiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdB
UlJBTlRJRVMgT0YKKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgoqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVU
SE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQoqKiBDTEFJTSwgREFN
QUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNU
LAoqKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVD
VElPTiBXSVRIIFRIRQoqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJ
TiBUSEUgTUFURVJJQUxTLgoqLwoKCmZ1bmN0aW9uIHJ1bk9uZUl0ZXJhdGlvbkltYWdlQml0bWFw
VGVzdCh1c2VUZXhTdWJJbWFnZSwgYmluZGluZ1RhcmdldCwgcHJvZ3JhbSwgYml0bWFwLCBmbGlw
WSwgcHJlbXVsdGlwbHlBbHBoYSwgb3B0aW9uc1ZhbCwKICAgIGludGVybmFsRm9ybWF0LCBwaXhl
bEZvcm1hdCwgcGl4ZWxUeXBlLCBnbCwgdGl1LCB3dHUpCnsKICAgIHZhciBoYWxmUmVkID0gWzEy
OCwgMCwgMF07CiAgICB2YXIgaGFsZkdyZWVuID0gWzAsIDEyOCwgMF07CiAgICB2YXIgcmVkQ29s
b3IgPSBbMjU1LCAwLCAwXTsKICAgIHZhciBncmVlbkNvbG9yID0gWzAsIDI1NSwgMF07CiAgICB2
YXIgYmxhY2tDb2xvciA9IFswLCAwLCAwXTsKCiAgICBzd2l0Y2ggKGdsW3BpeGVsRm9ybWF0XSkg
ewogICAgICBjYXNlIGdsLlJFRDoKICAgICAgY2FzZSBnbC5SRURfSU5URUdFUjoKICAgICAgICBn
cmVlbkNvbG9yID0gWzAsIDAsIDBdOwogICAgICAgIGhhbGZHcmVlbiA9IFswLCAwLCAwXTsKICAg
ICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KCiAgICBzd2l0
Y2ggKGdsW2ludGVybmFsRm9ybWF0XSkgewogICAgICBjYXNlIGdsLlNSR0I4OgogICAgICBjYXNl
IGdsLlNSR0I4X0FMUEhBODoKICAgICAgICAvLyBNYXRoLnBvdygoMTI4IC8gMjU1ICsgMC4wNTUp
IC8gMS4wNTUsIDIuNCkgKiAyNTUgPSA1NQogICAgICAgIGhhbGZSZWQgPSBbNTUsIDAsIDBdOwog
ICAgICAgIGhhbGZHcmVlbiA9IFswLCA1NSwgMF07CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1
bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgdmFyIHN0cjsKICAgIGlmIChvcHRpb25zVmFs
LmlzM0QpIHsKICAgICAgICBzdHIgPSAnVGVzdGluZyAnICsgKHVzZVRleFN1YkltYWdlID8gJ3Rl
eFN1YkltYWdlM0QnIDogJ3RleEltYWdlM0QnKSArCiAgICAgICAgICAgICcgd2l0aCBmbGlwWT0n
ICsgZmxpcFkgKyAnLCBwcmVtdWx0aXBseUFscGhhPScgKyBwcmVtdWx0aXBseUFscGhhICsKICAg
ICAgICAgICAgJywgYmluZGluZ1RhcmdldD0nICsgKGJpbmRpbmdUYXJnZXQgPT0gZ2wuVEVYVFVS
RV8zRCA/ICdURVhUVVJFXzNEJyA6ICdURVhUVVJFXzJEX0FSUkFZJyk7CiAgICB9IGVsc2Ugewog
ICAgICAgIHN0ciA9ICdUZXN0aW5nICcgKyAodXNlVGV4U3ViSW1hZ2UgPyAndGV4U3ViSW1hZ2Uy
RCcgOiAndGV4SW1hZ2UyRCcpICsKICAgICAgICAgICAgICAnIHdpdGggZmxpcFk9JyArIGZsaXBZ
ICsgJywgcHJlbXVsdGlwbHlBbHBoYT0nICsgcHJlbXVsdGlwbHlBbHBoYSArCiAgICAgICAgICAg
ICAgJywgYmluZGluZ1RhcmdldD0nICsgKGJpbmRpbmdUYXJnZXQgPT0gZ2wuVEVYVFVSRV8yRCA/
ICdURVhUVVJFXzJEJyA6ICdURVhUVVJFX0NVQkVfTUFQJyk7CiAgICB9CiAgICBkZWJ1ZyhzdHIp
OwogICAgYnVmZmVyZWRMb2dUb0NvbnNvbGUoc3RyKTsKCiAgICBnbC5jbGVhcihnbC5DT0xPUl9C
VUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCk7CiAgICAvLyBFbmFibGUgd3JpdGVzIHRv
IHRoZSBSR0JBIGNoYW5uZWxzCiAgICBnbC5jb2xvck1hc2soMSwgMSwgMSwgMCk7CiAgICB2YXIg
dGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKICAgIC8vIEJpbmQgdGhlIHRleHR1cmUgdG8g
dGV4dHVyZSB1bml0IDAKICAgIGdsLmJpbmRUZXh0dXJlKGJpbmRpbmdUYXJnZXQsIHRleHR1cmUp
OwogICAgLy8gU2V0IHVwIHRleHR1cmUgcGFyYW1ldGVycwogICAgZ2wudGV4UGFyYW1ldGVyaShi
aW5kaW5nVGFyZ2V0LCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgZ2wu
dGV4UGFyYW1ldGVyaShiaW5kaW5nVGFyZ2V0LCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5F
QVJFU1QpOwogICAgZ2wudGV4UGFyYW1ldGVyaShiaW5kaW5nVGFyZ2V0LCBnbC5URVhUVVJFX1dS
QVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7CiAgICBnbC50ZXhQYXJhbWV0ZXJpKGJpbmRpbmdUYXJn
ZXQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKCiAgICB2YXIgdGFyZ2V0
cyA9IFtiaW5kaW5nVGFyZ2V0XTsKICAgIGlmIChiaW5kaW5nVGFyZ2V0ID09IGdsLlRFWFRVUkVf
Q1VCRV9NQVApIHsKICAgICAgICB0YXJnZXRzID0gW2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJ
VkVfWCwKICAgICAgICAgICAgICAgICAgIGdsLlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCwK
ICAgICAgICAgICAgICAgICAgIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSwKICAgICAg
ICAgICAgICAgICAgIGdsLlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSwKICAgICAgICAgICAg
ICAgICAgIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiwKICAgICAgICAgICAgICAgICAg
IGdsLlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWl07CiAgICB9CgogICAgYnVmZmVyZWRMb2dU
b0NvbnNvbGUoIlN0YXJ0cyB1cGxvYWRpbmcgdGhlIGltYWdlIGludG8gdGV4dHVyZSIpOwogICAg
Ly8gVXBsb2FkIHRoZSBpbWFnZSBpbnRvIHRoZSB0ZXh0dXJlCiAgICBmb3IgKHZhciB0dCA9IDA7
IHR0IDwgdGFyZ2V0cy5sZW5ndGg7ICsrdHQpIHsKICAgICAgICBpZiAob3B0aW9uc1ZhbC5pczNE
KSB7CiAgICAgICAgICAgIGdsLnRleEltYWdlM0QodGFyZ2V0c1t0dF0sIDAsIGdsW2ludGVybmFs
Rm9ybWF0XSwgYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0LCAxIC8qIGRlcHRoICovLCAwLAog
ICAgICAgICAgICAgICAgICAgIGdsW3BpeGVsRm9ybWF0XSwgZ2xbcGl4ZWxUeXBlXSwgbnVsbCk7
CiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlM0QodGFyZ2V0c1t0dF0sIDAsIDAsIDAsIDAsIGJp
dG1hcC53aWR0aCwgYml0bWFwLmhlaWdodCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBnbFtwaXhlbEZvcm1hdF0sIGdsW3BpeGVsVHlwZV0sIGJpdG1hcCk7CiAgICAgICAgfSBlbHNl
IHsKICAgICAgICAgICAgaWYgKHVzZVRleFN1YkltYWdlKSB7CiAgICAgICAgICAgICAgICAvLyBJ
bml0aWFsaXplIHRoZSB0ZXh0dXJlIHRvIGJsYWNrIGZpcnN0CiAgICAgICAgICAgICAgICBnbC50
ZXhJbWFnZTJEKHRhcmdldHNbdHRdLCAwLCBnbFtpbnRlcm5hbEZvcm1hdF0sIGJpdG1hcC53aWR0
aCwgYml0bWFwLmhlaWdodCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xbcGl4
ZWxGb3JtYXRdLCBnbFtwaXhlbFR5cGVdLCBudWxsKTsKICAgICAgICAgICAgICAgIGdsLnRleFN1
YkltYWdlMkQodGFyZ2V0c1t0dF0sIDAsIDAsIDAsIGdsW3BpeGVsRm9ybWF0XSwgZ2xbcGl4ZWxU
eXBlXSwgYml0bWFwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdsLnRl
eEltYWdlMkQodGFyZ2V0c1t0dF0sIDAsIGdsW2ludGVybmFsRm9ybWF0XSwgZ2xbcGl4ZWxGb3Jt
YXRdLCBnbFtwaXhlbFR5cGVdLCBiaXRtYXApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAg
fQogICAgYnVmZmVyZWRMb2dUb0NvbnNvbGUoIlVwbG9hZGluZyB0ZXh0dXJlIGNvbXBsZXRlZCIp
OwoKICAgIHZhciB3aWR0aCA9IGdsLmNhbnZhcy53aWR0aDsKICAgIHZhciBoYWxmV2lkdGggPSBN
YXRoLmZsb29yKHdpZHRoIC8gMik7CiAgICB2YXIgcXVhdGVyV2lkdGggPSBNYXRoLmZsb29yKGhh
bGZXaWR0aCAvIDIpOwogICAgdmFyIGhlaWdodCA9IGdsLmNhbnZhcy5oZWlnaHQ7CiAgICB2YXIg
aGFsZkhlaWdodCA9IE1hdGguZmxvb3IoaGVpZ2h0IC8gMik7CiAgICB2YXIgcXVhdGVySGVpZ2h0
ID0gTWF0aC5mbG9vcihoYWxmSGVpZ2h0IC8gMik7CgogICAgdmFyIHRvcCA9IGZsaXBZID8gcXVh
dGVySGVpZ2h0IDogKGhlaWdodCAtIGhhbGZIZWlnaHQgKyBxdWF0ZXJIZWlnaHQpOwogICAgdmFy
IGJvdHRvbSA9IGZsaXBZID8gKGhlaWdodCAtIGhhbGZIZWlnaHQgKyBxdWF0ZXJIZWlnaHQpIDog
cXVhdGVySGVpZ2h0OwoKICAgIHZhciB0bCA9IHJlZENvbG9yOwogICAgdmFyIHRyID0gcHJlbXVs
dGlwbHlBbHBoYSA/ICgob3B0aW9uc1ZhbC5hbHBoYSA9PSAwLjUpID8gaGFsZlJlZCA6IChvcHRp
b25zVmFsLmFscGhhID09IDEpID8gcmVkQ29sb3IgOiBibGFja0NvbG9yKSA6IHJlZENvbG9yOwog
ICAgdmFyIGJsID0gZ3JlZW5Db2xvcjsKICAgIHZhciBiciA9IHByZW11bHRpcGx5QWxwaGEgPyAo
KG9wdGlvbnNWYWwuYWxwaGEgPT0gMC41KSA/IGhhbGZHcmVlbiA6IChvcHRpb25zVmFsLmFscGhh
ID09IDEpID8gZ3JlZW5Db2xvciA6IGJsYWNrQ29sb3IpIDogZ3JlZW5Db2xvcjsKCiAgICB2YXIg
bG9jOwogICAgdmFyIHNraXBDb3JuZXIgPSBmYWxzZTsKICAgIGlmIChiaW5kaW5nVGFyZ2V0ID09
IGdsLlRFWFRVUkVfQ1VCRV9NQVApIHsKICAgICAgICBsb2MgPSBnbC5nZXRVbmlmb3JtTG9jYXRp
b24ocHJvZ3JhbSwgImZhY2UiKTsKICAgICAgICBzd2l0Y2ggKHBpeGVsRm9ybWF0KSB7CiAgICAg
ICAgICBjYXNlIGdsLlJFRF9JTlRFR0VSOgogICAgICAgICAgY2FzZSBnbC5SR19JTlRFR0VSOgog
ICAgICAgICAgY2FzZSBnbC5SR0JfSU5URUdFUjoKICAgICAgICAgIGNhc2UgZ2wuUkdCQV9JTlRF
R0VSOgogICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1dlYkdM
L2lzc3Vlcy8xODE5CiAgICAgICAgICAgIHNraXBDb3JuZXIgPSB0cnVlOwogICAgICAgICAgICBi
cmVhazsKICAgICAgICB9CiAgICB9CgogICAgdmFyIHRvbGVyYW5jZSA9IDEwOwogICAgZm9yICh2
YXIgdHQgPSAwOyB0dCA8IHRhcmdldHMubGVuZ3RoOyArK3R0KSB7CiAgICAgICAgaWYgKGJpbmRp
bmdUYXJnZXQgPT0gZ2wuVEVYVFVSRV9DVUJFX01BUCkgewogICAgICAgICAgICBnbC51bmlmb3Jt
MWkobG9jLCB0YXJnZXRzW3R0XSk7CiAgICAgICAgfQogICAgICAgIC8vIERyYXcgdGhlIHRyaWFu
Z2xlcwogICAgICAgIHd0dS5jbGVhckFuZERyYXdVbml0UXVhZChnbCwgWzAsIDAsIDAsIDI1NV0p
OwoKICAgICAgICAvLyBDaGVjayB0aGUgdG9wIHBpeGVsIGFuZCBib3R0b20gcGl4ZWwgYW5kIG1h
a2Ugc3VyZSB0aGV5IGhhdmUKICAgICAgICAvLyB0aGUgcmlnaHQgY29sb3IuCiAgICAgICAgYnVm
ZmVyZWRMb2dUb0NvbnNvbGUoIkNoZWNraW5nICIgKyAoZmxpcFkgPyAidG9wIiA6ICJib3R0b20i
KSk7CiAgICAgICAgd3R1LmNoZWNrQ2FudmFzUmVjdChnbCwgcXVhdGVyV2lkdGgsIGJvdHRvbSwg
MiwgMiwgdGwsICJzaG91bGRCZSAiICsgdGwsIHRvbGVyYW5jZSk7CiAgICAgICAgaWYgKCFza2lw
Q29ybmVyICYmICFmbGlwWSkgewogICAgICAgICAgICB3dHUuY2hlY2tDYW52YXNSZWN0KGdsLCBo
YWxmV2lkdGggKyBxdWF0ZXJXaWR0aCwgYm90dG9tLCAyLCAyLCB0ciwgInNob3VsZEJlICIgKyB0
ciwgdG9sZXJhbmNlKTsKICAgICAgICB9CiAgICAgICAgYnVmZmVyZWRMb2dUb0NvbnNvbGUoIkNo
ZWNraW5nICIgKyAoZmxpcFkgPyAiYm90dG9tIiA6ICJ0b3AiKSk7CiAgICAgICAgd3R1LmNoZWNr
Q2FudmFzUmVjdChnbCwgcXVhdGVyV2lkdGgsIHRvcCwgMiwgMiwgYmwsICJzaG91bGRCZSAiICsg
YmwsIHRvbGVyYW5jZSk7CiAgICAgICAgaWYgKCFza2lwQ29ybmVyICYmIGZsaXBZKSB7CiAgICAg
ICAgICAgIHd0dS5jaGVja0NhbnZhc1JlY3QoZ2wsIGhhbGZXaWR0aCArIHF1YXRlcldpZHRoLCB0
b3AsIDIsIDIsIGJyLCAic2hvdWxkQmUgIiArIGJyLCB0b2xlcmFuY2UpOwogICAgICAgIH0KICAg
IH0KICAgIHd0dS5nbEVycm9yU2hvdWxkQmUoZ2wsIGdsLk5PX0VSUk9SLCAic2hvdWxkIGJlIG5v
IGVycm9ycyIpOwp9CgpmdW5jdGlvbiByZXNldFVucGFja1BhcmFtcyhnbCkKewogICAgZ2wucGl4
ZWxTdG9yZWkoZ2wuVU5QQUNLX1NLSVBfUElYRUxTLCAwKTsKICAgIGdsLnBpeGVsU3RvcmVpKGds
LlVOUEFDS19TS0lQX1JPV1MsIDApOwogICAgZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX1NLSVBf
SU1BR0VTLCAwKTsKICAgIGdsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19ST1dfTEVOR1RILCAwKTsK
ICAgIGdsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19JTUFHRV9IRUlHSFQsIDApOwp9CgpmdW5jdGlv
biBydW5PbmVJdGVyYXRpb25JbWFnZUJpdG1hcFRlc3RTdWJTb3VyY2UodXNlVGV4U3ViSW1hZ2Us
IGJpbmRpbmdUYXJnZXQsIHByb2dyYW0sIGJpdG1hcCwgZmxpcFksIHByZW11bHRpcGx5QWxwaGEs
IG9wdGlvbnNWYWwsCiAgICBpbnRlcm5hbEZvcm1hdCwgcGl4ZWxGb3JtYXQsIHBpeGVsVHlwZSwg
Z2wsIHRpdSwgd3R1KQp7CiAgICB2YXIgaGFsZlJlZCA9IFsxMjgsIDAsIDBdOwogICAgdmFyIGhh
bGZHcmVlbiA9IFswLCAxMjgsIDBdOwogICAgdmFyIHJlZENvbG9yID0gWzI1NSwgMCwgMF07CiAg
ICB2YXIgZ3JlZW5Db2xvciA9IFswLCAyNTUsIDBdOwogICAgdmFyIGJsYWNrQ29sb3IgPSBbMCwg
MCwgMF07CgogICAgc3dpdGNoIChnbFtwaXhlbEZvcm1hdF0pIHsKICAgICAgY2FzZSBnbC5SRUQ6
CiAgICAgIGNhc2UgZ2wuUkVEX0lOVEVHRVI6CiAgICAgICAgZ3JlZW5Db2xvciA9IFswLCAwLCAw
XTsKICAgICAgICBoYWxmR3JlZW4gPSBbMCwgMCwgMF07CiAgICAgICAgYnJlYWs7CiAgICAgIGRl
ZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgc3dpdGNoIChnbFtpbnRlcm5hbEZvcm1h
dF0pIHsKICAgICAgY2FzZSBnbC5TUkdCODoKICAgICAgY2FzZSBnbC5TUkdCOF9BTFBIQTg6CiAg
ICAgICAgLy8gTWF0aC5wb3coKDEyOCAvIDI1NSArIDAuMDU1KSAvIDEuMDU1LCAyLjQpICogMjU1
ID0gNTUKICAgICAgICBoYWxmUmVkID0gWzU1LCAwLCAwXTsKICAgICAgICBoYWxmR3JlZW4gPSBb
MCwgNTUsIDBdOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwog
ICAgfQoKICAgIHZhciBzdHI7CiAgICBpZiAob3B0aW9uc1ZhbC5pczNEKSB7CiAgICAgICAgc3Ry
ID0gJ1Rlc3RpbmcgJyArICh1c2VUZXhTdWJJbWFnZSA/ICd0ZXhTdWJJbWFnZTNEJyA6ICd0ZXhJ
bWFnZTNEJykgKyAnW1N1YlNvdXJjZV0nICsKICAgICAgICAgICAgJyB3aXRoIGZsaXBZPScgKyBm
bGlwWSArICcsIHByZW11bHRpcGx5QWxwaGE9JyArIHByZW11bHRpcGx5QWxwaGEgKwogICAgICAg
ICAgICAnLCBiaW5kaW5nVGFyZ2V0PVRFWFRVUkVfM0QnOwogICAgfSBlbHNlIHsKICAgICAgICBz
dHIgPSAnVGVzdGluZyAnICsgKHVzZVRleFN1YkltYWdlID8gJ3RleFN1YkltYWdlMkQnIDogJ3Rl
eEltYWdlMkQnKSArICdbU3ViU291cmNlXScgKwogICAgICAgICAgICAnIHdpdGggZmxpcFk9JyAr
IGZsaXBZICsgJywgcHJlbXVsdGlwbHlBbHBoYT0nICsgcHJlbXVsdGlwbHlBbHBoYSArCiAgICAg
ICAgICAgICcsIGJpbmRpbmdUYXJnZXQ9VEVYVFVSRV8yRCc7CiAgICB9CiAgICBkZWJ1ZyhzdHIp
OwogICAgYnVmZmVyZWRMb2dUb0NvbnNvbGUoc3RyKTsKCiAgICBnbC5jbGVhcihnbC5DT0xPUl9C
VUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCk7CiAgICAvLyBFbmFibGUgd3JpdGVzIHRv
IHRoZSBSR0JBIGNoYW5uZWxzCiAgICBnbC5jb2xvck1hc2soMSwgMSwgMSwgMCk7CiAgICB2YXIg
dGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKICAgIC8vIEJpbmQgdGhlIHRleHR1cmUgdG8g
dGV4dHVyZSB1bml0IDAKICAgIGdsLmJpbmRUZXh0dXJlKGJpbmRpbmdUYXJnZXQsIHRleHR1cmUp
OwogICAgLy8gU2V0IHVwIHRleHR1cmUgcGFyYW1ldGVycwogICAgZ2wudGV4UGFyYW1ldGVyaShi
aW5kaW5nVGFyZ2V0LCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgZ2wu
dGV4UGFyYW1ldGVyaShiaW5kaW5nVGFyZ2V0LCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5F
QVJFU1QpOwogICAgZ2wudGV4UGFyYW1ldGVyaShiaW5kaW5nVGFyZ2V0LCBnbC5URVhUVVJFX1dS
QVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7CiAgICBnbC50ZXhQYXJhbWV0ZXJpKGJpbmRpbmdUYXJn
ZXQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKCiAgICB2YXIgc3JjVEwg
PSByZWRDb2xvcjsKICAgIHZhciBzcmNUUiA9IHByZW11bHRpcGx5QWxwaGEgPyAoKG9wdGlvbnNW
YWwuYWxwaGEgPT0gMC41KSA/IGhhbGZSZWQgOiAob3B0aW9uc1ZhbC5hbHBoYSA9PSAxKSA/IHJl
ZENvbG9yIDogYmxhY2tDb2xvcikgOiByZWRDb2xvcjsKICAgIHZhciBzcmNCTCA9IGdyZWVuQ29s
b3I7CiAgICB2YXIgc3JjQlIgPSBwcmVtdWx0aXBseUFscGhhID8gKChvcHRpb25zVmFsLmFscGhh
ID09IDAuNSkgPyBoYWxmR3JlZW4gOiAob3B0aW9uc1ZhbC5hbHBoYSA9PSAxKSA/IGdyZWVuQ29s
b3IgOiBibGFja0NvbG9yKSA6IGdyZWVuQ29sb3I7CgogICAgdmFyIHRsLCB0ciwgYmwsIGJyOwoK
ICAgIGJ1ZmZlcmVkTG9nVG9Db25zb2xlKCJTdGFydHMgdXBsb2FkaW5nIHRoZSBpbWFnZSBpbnRv
IHRleHR1cmUiKTsKICAgIC8vIFVwbG9hZCB0aGUgaW1hZ2UgaW50byB0aGUgdGV4dHVyZQogICAg
aWYgKG9wdGlvbnNWYWwuaXMzRCkgewogICAgICAgIGlmICh1c2VUZXhTdWJJbWFnZSkgewogICAg
ICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0ZXh0dXJlIHRvIGJsYWNrIGZpcnN0CiAgICAgICAg
ICAgIGdsLnRleEltYWdlM0QoYmluZGluZ1RhcmdldCwgMCwgZ2xbaW50ZXJuYWxGb3JtYXRdLCBi
aXRtYXAud2lkdGgsIGJpdG1hcC5oZWlnaHQsIDEgLyogZGVwdGggKi8sIDAsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgZ2xbcGl4ZWxGb3JtYXRdLCBnbFtwaXhlbFR5cGVdLCBudWxsKTsKICAg
ICAgICAgICAgLy8gT25seSB1cGxvYWQgdGhlIGxlZnQgaGFsZiBpbWFnZSB0byB0aGUgcmlnaHQg
aGFsZiB0ZXh0dXJlLgogICAgICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfU0tJUF9Q
SVhFTFMsIDApOwogICAgICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfU0tJUF9ST1dT
LCAwKTsKICAgICAgICAgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX1NLSVBfSU1BR0VTLCAw
KTsKICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UzRChiaW5kaW5nVGFyZ2V0LCAwLCBiaXRtYXAu
d2lkdGggLyAyLCAwLCAwLCBiaXRtYXAud2lkdGggLyAyLCBiaXRtYXAuaGVpZ2h0LCAxLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGdsW3BpeGVsRm9ybWF0XSwgZ2xbcGl4ZWxUeXBlXSwg
Yml0bWFwKTsKICAgICAgICAgICAgdGwgPSBibGFja0NvbG9yOwogICAgICAgICAgICB0ciA9IHNy
Y1RMOwogICAgICAgICAgICBibCA9IGJsYWNrQ29sb3I7CiAgICAgICAgICAgIGJyID0gc3JjQkw7
CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gT25seSB1cGxvYWQgdGhlIGJvdHRvbSBt
aWRkbGUgcXVhcnRlciBpbWFnZQogICAgICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tf
U0tJUF9QSVhFTFMsIDApOwogICAgICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfU0tJ
UF9ST1dTLCBiaXRtYXAuaGVpZ2h0IC8gMik7CiAgICAgICAgICAgIGdsLnBpeGVsU3RvcmVpKGds
LlVOUEFDS19TS0lQX0lNQUdFUywgMCk7CiAgICAgICAgICAgIGdsLnRleEltYWdlM0QoYmluZGlu
Z1RhcmdldCwgMCwgZ2xbaW50ZXJuYWxGb3JtYXRdLCBiaXRtYXAud2lkdGgsIGJpdG1hcC5oZWln
aHQgLyAyLCAxIC8qIGRlcHRoICovLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdsW3Bp
eGVsRm9ybWF0XSwgZ2xbcGl4ZWxUeXBlXSwgYml0bWFwKTsKICAgICAgICAgICAgaWYgKCFmbGlw
WSkgewogICAgICAgICAgICAgICAgdGwgPSBzcmNCTDsKICAgICAgICAgICAgICAgIHRyID0gc3Jj
QlI7CiAgICAgICAgICAgICAgICBibCA9IHNyY0JMOwogICAgICAgICAgICAgICAgYnIgPSBzcmNC
UjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRsID0gc3JjVEw7CiAgICAg
ICAgICAgICAgICB0ciA9IHNyY1RSOwogICAgICAgICAgICAgICAgYmwgPSBzcmNUTDsKICAgICAg
ICAgICAgICAgIGJyID0gc3JjVFI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2Ug
ewogICAgICAgIGlmICh1c2VUZXhTdWJJbWFnZSkgewogICAgICAgICAgICAvLyBJbml0aWFsaXpl
IHRoZSB0ZXh0dXJlIHRvIGJsYWNrIGZpcnN0CiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoYmlu
ZGluZ1RhcmdldCwgMCwgZ2xbaW50ZXJuYWxGb3JtYXRdLCBiaXRtYXAud2lkdGgsIGJpdG1hcC5o
ZWlnaHQsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xbcGl4ZWxGb3JtYXRdLCBnbFtw
aXhlbFR5cGVdLCBudWxsKTsKICAgICAgICAgICAgLy8gT25seSB1cGxvYWQgdGhlIGxlZnQgaGFs
ZiBpbWFnZSB0byB0aGUgcmlnaHQgaGFsZiB0ZXh0dXJlLgogICAgICAgICAgICBnbC5waXhlbFN0
b3JlaShnbC5VTlBBQ0tfU0tJUF9QSVhFTFMsIDApOwogICAgICAgICAgICBnbC5waXhlbFN0b3Jl
aShnbC5VTlBBQ0tfU0tJUF9ST1dTLCAwKTsKICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChi
aW5kaW5nVGFyZ2V0LCAwLCBiaXRtYXAud2lkdGggLyAyLCAwLCBiaXRtYXAud2lkdGggLyAyLCBi
aXRtYXAuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsW3BpeGVsRm9ybWF0
XSwgZ2xbcGl4ZWxUeXBlXSwgYml0bWFwKTsKICAgICAgICAgICAgdGwgPSBibGFja0NvbG9yOwog
ICAgICAgICAgICB0ciA9IHNyY1RMOwogICAgICAgICAgICBibCA9IGJsYWNrQ29sb3I7CiAgICAg
ICAgICAgIGJyID0gc3JjQkw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gT25seSB1
cGxvYWQgdGhlIHJpZ2h0IGJvdHRvbSBpbWFnZS4KICAgICAgICAgICAgZ2wucGl4ZWxTdG9yZWko
Z2wuVU5QQUNLX1NLSVBfUElYRUxTLCBiaXRtYXAud2lkdGggLyAyKTsKICAgICAgICAgICAgZ2wu
cGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX1NLSVBfUk9XUywgYml0bWFwLmhlaWdodCAvIDIpOwogICAg
ICAgICAgICBnbC50ZXhJbWFnZTJEKGJpbmRpbmdUYXJnZXQsIDAsIGdsW2ludGVybmFsRm9ybWF0
XSwgYml0bWFwLndpZHRoIC8gMiwgYml0bWFwLmhlaWdodCAvIDIsIDAsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgZ2xbcGl4ZWxGb3JtYXRdLCBnbFtwaXhlbFR5cGVdLCBiaXRtYXApOwogICAg
ICAgICAgICByZXNldFVucGFja1BhcmFtcyhnbCk7CiAgICAgICAgICAgIGlmICghZmxpcFkpIHsK
ICAgICAgICAgICAgICAgIHRsID0gc3JjQlI7CiAgICAgICAgICAgICAgICB0ciA9IHNyY0JSOwog
ICAgICAgICAgICAgICAgYmwgPSBzcmNCUjsKICAgICAgICAgICAgICAgIGJyID0gc3JjQlI7CiAg
ICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0bCA9IHNyY1RSOwogICAgICAgICAg
ICAgICAgdHIgPSBzcmNUUjsKICAgICAgICAgICAgICAgIGJsID0gc3JjVFI7CiAgICAgICAgICAg
ICAgICBiciA9IHNyY1RSOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgYnVmZmVy
ZWRMb2dUb0NvbnNvbGUoIlVwbG9hZGluZyB0ZXh0dXJlIGNvbXBsZXRlZCIpOwoKICAgIHZhciB3
aWR0aCA9IGdsLmNhbnZhcy53aWR0aDsKICAgIHZhciBoYWxmV2lkdGggPSBNYXRoLmZsb29yKHdp
ZHRoIC8gMik7CiAgICB2YXIgcXVhdGVyV2lkdGggPSBNYXRoLmZsb29yKGhhbGZXaWR0aCAvIDIp
OwogICAgdmFyIGhlaWdodCA9IGdsLmNhbnZhcy5oZWlnaHQ7CiAgICB2YXIgaGFsZkhlaWdodCA9
IE1hdGguZmxvb3IoaGVpZ2h0IC8gMik7CiAgICB2YXIgcXVhdGVySGVpZ2h0ID0gTWF0aC5mbG9v
cihoYWxmSGVpZ2h0IC8gMik7CgogICAgdmFyIHRvcCA9IGZsaXBZID8gcXVhdGVySGVpZ2h0IDog
KGhlaWdodCAtIGhhbGZIZWlnaHQgKyBxdWF0ZXJIZWlnaHQpOwogICAgdmFyIGJvdHRvbSA9IGZs
aXBZID8gKGhlaWdodCAtIGhhbGZIZWlnaHQgKyBxdWF0ZXJIZWlnaHQpIDogcXVhdGVySGVpZ2h0
OwoKCiAgICB2YXIgdG9sZXJhbmNlID0gMTA7CiAgICAvLyBEcmF3IHRoZSB0cmlhbmdsZXMKICAg
IHd0dS5jbGVhckFuZERyYXdVbml0UXVhZChnbCwgWzAsIDAsIDAsIDI1NV0pOwoKICAgIC8vIENo
ZWNrIHRoZSB0b3AgcGl4ZWwgYW5kIGJvdHRvbSBwaXhlbCBhbmQgbWFrZSBzdXJlIHRoZXkgaGF2
ZQogICAgLy8gdGhlIHJpZ2h0IGNvbG9yLgogICAgLy8gRm9yIHJpZ2h0IHNpZGUsIGNoZWNrIHBp
eGVscyBjbG9zZXIgdG8gbGVmdCB0byBhdm9pZCBib3JkZXIgaW4gdGhlIHZpZGVvIHRlc3RzLgog
ICAgYnVmZmVyZWRMb2dUb0NvbnNvbGUoIkNoZWNraW5nICIgKyAoZmxpcFkgPyAidG9wIiA6ICJi
b3R0b20iKSk7CiAgICB3dHUuY2hlY2tDYW52YXNSZWN0KGdsLCBxdWF0ZXJXaWR0aCwgYm90dG9t
LCAyLCAyLCB0bCwgInNob3VsZEJlICIgKyB0bCwgdG9sZXJhbmNlKTsKICAgIHd0dS5jaGVja0Nh
bnZhc1JlY3QoZ2wsIGhhbGZXaWR0aCArIHF1YXRlcldpZHRoIC8gMiwgYm90dG9tLCAyLCAyLCB0
ciwgInNob3VsZEJlICIgKyB0ciwgdG9sZXJhbmNlKTsKICAgIGJ1ZmZlcmVkTG9nVG9Db25zb2xl
KCJDaGVja2luZyAiICsgKGZsaXBZID8gImJvdHRvbSIgOiAidG9wIikpOwogICAgd3R1LmNoZWNr
Q2FudmFzUmVjdChnbCwgcXVhdGVyV2lkdGgsIHRvcCwgMiwgMiwgYmwsICJzaG91bGRCZSAiICsg
YmwsIHRvbGVyYW5jZSk7CiAgICB3dHUuY2hlY2tDYW52YXNSZWN0KGdsLCBoYWxmV2lkdGggKyBx
dWF0ZXJXaWR0aCAvIDIsIHRvcCwgMiwgMiwgYnIsICJzaG91bGRCZSAiICsgYnIsIHRvbGVyYW5j
ZSk7CgogICAgd3R1LmdsRXJyb3JTaG91bGRCZShnbCwgZ2wuTk9fRVJST1IsICJzaG91bGQgYmUg
bm8gZXJyb3JzIik7Cn0KCmZ1bmN0aW9uIHJ1blRlc3RPbkJpbmRpbmdUYXJnZXRJbWFnZUJpdG1h
cChiaW5kaW5nVGFyZ2V0LCBwcm9ncmFtLCBjYXNlcywgb3B0aW9uc1ZhbCwKICAgIGludGVybmFs
Rm9ybWF0LCBwaXhlbEZvcm1hdCwgcGl4ZWxUeXBlLCBnbCwgdGl1LCB3dHUpCnsKICAgIC8vY2Fz
ZXMuZm9yRWFjaCh4ID0+IHsKICAgIC8vICAgIHJ1bk9uZUl0ZXJhdGlvbkltYWdlQml0bWFwVGVz
dCh4LnN1YiwgYmluZGluZ1RhcmdldCwgcHJvZ3JhbSwgeC5iaXRtYXAsCiAgICAvLyAgICAgICAg
eC5iaXRtYXAuZmxpcFksIHguYml0bWFwLnByZW11bHRpcGx5LCBvcHRpb25zVmFsLCBpbnRlcm5h
bEZvcm1hdCwgcGl4ZWxGb3JtYXQsIHBpeGVsVHlwZSwgZ2wsIHRpdSwgd3R1KTsKICAgIC8vfSk7
CgogICAgaWYgKHd0dS5nZXREZWZhdWx0M0RDb250ZXh0VmVyc2lvbigpIDw9IDEgfHwKICAgICAg
ICAoYmluZGluZ1RhcmdldCA9PSBnbC5URVhUVVJFX0NVQkVfTUFQIHx8IGJpbmRpbmdUYXJnZXQg
PT0gZ2wuVEVYVFVSRV8yRF9BUlJBWSkpCiAgICB7CiAgICAgICAgLy8gU2tpcCB0ZXN0aW5nIHNv
dXJjZSBzdWIgcmVnaW9uIG9uIFRFWFRVUkVfQ1VCRV9NQVAgYW5kIFRFWFRVUkVfMkRfQVJSQVkg
b24gV2ViR0wyIHRvIHNhdmUKICAgICAgICAvLyBydW5uaW5nIHRpbWUuCiAgICAgICAgcmV0dXJu
OwogICAgfQoKICAgIGNhc2VzLmZvckVhY2goeCA9PiB7CiAgICAgICAgcnVuT25lSXRlcmF0aW9u
SW1hZ2VCaXRtYXBUZXN0U3ViU291cmNlKHguc3ViLCBiaW5kaW5nVGFyZ2V0LCBwcm9ncmFtLCB4
LmJpdG1hcCwKICAgICAgICAgICAgeC5iaXRtYXAuZmxpcFksIHguYml0bWFwLnByZW11bHRpcGx5
LCBvcHRpb25zVmFsLCBpbnRlcm5hbEZvcm1hdCwgcGl4ZWxGb3JtYXQsIHBpeGVsVHlwZSwgZ2ws
IHRpdSwgd3R1KTsKICAgIH0pOwp9CgpmdW5jdGlvbiBydW5JbWFnZUJpdG1hcFRlc3RJbnRlcm5h
bChiaXRtYXBzLCBhbHBoYVZhbCwgaW50ZXJuYWxGb3JtYXQsIHBpeGVsRm9ybWF0LCBwaXhlbFR5
cGUsIGdsLCB0aXUsIHd0dSwgaXMzRCkKewogICAgdmFyIGNhc2VzID0gW107CiAgICBiaXRtYXBz
LmZvckVhY2goYml0bWFwID0+IHsKICAgICAgICAvL2Nhc2VzLnB1c2goe2JpdG1hcDogYml0bWFw
LCBzdWI6IGZhbHNlfSk7CiAgICAgICAgY2FzZXMucHVzaCh7Yml0bWFwOiBiaXRtYXAsIHN1Yjog
dHJ1ZX0pOwogICAgfSk7CgogICAgdmFyIG9wdGlvbnNWYWwgPSB7YWxwaGE6IGFscGhhVmFsLCBp
czNEOiBpczNEfTsKICAgIHZhciBwcm9ncmFtOwogICAgaWYgKGlzM0QpIHsKICAgICAgICBwcm9n
cmFtID0gdGl1LnNldHVwVGV4dHVyZWRRdWFkV2l0aDNEKGdsLCBpbnRlcm5hbEZvcm1hdCk7CiAg
ICAgICAgcnVuVGVzdE9uQmluZGluZ1RhcmdldEltYWdlQml0bWFwKGdsLlRFWFRVUkVfM0QsIHBy
b2dyYW0sIGNhc2VzLCBvcHRpb25zVmFsLAogICAgICAgICAgICBpbnRlcm5hbEZvcm1hdCwgcGl4
ZWxGb3JtYXQsIHBpeGVsVHlwZSwgZ2wsIHRpdSwgd3R1KTsKICAgIH0gZWxzZSB7CiAgICAgICAg
cHJvZ3JhbSA9IHRpdS5zZXR1cFRleHR1cmVkUXVhZChnbCwgaW50ZXJuYWxGb3JtYXQpOwogICAg
ICAgIHJ1blRlc3RPbkJpbmRpbmdUYXJnZXRJbWFnZUJpdG1hcChnbC5URVhUVVJFXzJELCBwcm9n
cmFtLCBjYXNlcywgb3B0aW9uc1ZhbCwKICAgICAgICAgICAgaW50ZXJuYWxGb3JtYXQsIHBpeGVs
Rm9ybWF0LCBwaXhlbFR5cGUsIGdsLCB0aXUsIHd0dSk7CiAgICB9CgogICAgLy8gY3ViZSBtYXAg
dGV4dHVyZSBtdXN0IGJlIHNxdWFyZQogICAgaWYgKGJpdG1hcHNbMF0ud2lkdGggPT0gYml0bWFw
c1swXS5oZWlnaHQpIHsKICAgICAgICBpZiAoaXMzRCkgewogICAgICAgICAgICBwcm9ncmFtID0g
dGl1LnNldHVwVGV4dHVyZWRRdWFkV2l0aDJEQXJyYXkoZ2wsIGludGVybmFsRm9ybWF0KTsKICAg
ICAgICAgICAgcnVuVGVzdE9uQmluZGluZ1RhcmdldEltYWdlQml0bWFwKGdsLlRFWFRVUkVfMkRf
QVJSQVksIHByb2dyYW0sIGNhc2VzLCBvcHRpb25zVmFsLAogICAgICAgICAgICAgICAgaW50ZXJu
YWxGb3JtYXQsIHBpeGVsRm9ybWF0LCBwaXhlbFR5cGUsIGdsLCB0aXUsIHd0dSk7CiAgICAgICAg
fSBlbHNlIHsKICAgICAgICAgICAgcHJvZ3JhbSA9IHRpdS5zZXR1cFRleHR1cmVkUXVhZFdpdGhD
dWJlTWFwKGdsLCBpbnRlcm5hbEZvcm1hdCk7CiAgICAgICAgICAgIHJ1blRlc3RPbkJpbmRpbmdU
YXJnZXRJbWFnZUJpdG1hcChnbC5URVhUVVJFX0NVQkVfTUFQLCBwcm9ncmFtLCBjYXNlcywgb3B0
aW9uc1ZhbCwKICAgICAgICAgICAgICAgIGludGVybmFsRm9ybWF0LCBwaXhlbEZvcm1hdCwgcGl4
ZWxUeXBlLCBnbCwgdGl1LCB3dHUpOwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gcnVuSW1h
Z2VCaXRtYXBUZXN0KHNvdXJjZSwgYWxwaGFWYWwsIGludGVybmFsRm9ybWF0LCBwaXhlbEZvcm1h
dCwgcGl4ZWxUeXBlLCBnbCwgdGl1LCB3dHUsIGlzM0QpCnsKICAgIHZhciBwMSA9IGNyZWF0ZUlt
YWdlQml0bWFwKHNvdXJjZSwge2ltYWdlT3JpZW50YXRpb246ICJub25lIiwgcHJlbXVsdGlwbHlB
bHBoYTogInByZW11bHRpcGx5In0pCiAgICAgICAgICAgICAgICAudGhlbihjdXIgPT4geyBjdXIu
ZmxpcFkgPSBmYWxzZTsgY3VyLnByZW11bHRpcGx5ID0gdHJ1ZTsgcmV0dXJuIGN1cjsgfSk7CiAg
ICB2YXIgcDIgPSBjcmVhdGVJbWFnZUJpdG1hcChzb3VyY2UsIHtpbWFnZU9yaWVudGF0aW9uOiAi
bm9uZSIsIHByZW11bHRpcGx5QWxwaGE6ICJub25lIn0pCiAgICAgICAgICAgICAgICAudGhlbihj
dXIgPT4geyBjdXIuZmxpcFkgPSBmYWxzZTsgY3VyLnByZW11bHRpcGx5ID0gZmFsc2U7IHJldHVy
biBjdXI7IH0pOwogICAgdmFyIHAzID0gY3JlYXRlSW1hZ2VCaXRtYXAoc291cmNlLCB7aW1hZ2VP
cmllbnRhdGlvbjogImZsaXBZIiwgcHJlbXVsdGlwbHlBbHBoYTogInByZW11bHRpcGx5In0pCiAg
ICAgICAgICAgICAgICAudGhlbihjdXIgPT4geyBjdXIuZmxpcFkgPSB0cnVlOyBjdXIucHJlbXVs
dGlwbHkgPSB0cnVlOyByZXR1cm4gY3VyOyB9KTsKICAgIHZhciBwNCA9IGNyZWF0ZUltYWdlQml0
bWFwKHNvdXJjZSwge2ltYWdlT3JpZW50YXRpb246ICJmbGlwWSIsIHByZW11bHRpcGx5QWxwaGE6
ICJub25lIn0pCiAgICAgICAgICAgICAgICAudGhlbihjdXIgPT4geyBjdXIuZmxpcFkgPSB0cnVl
OyBjdXIucHJlbXVsdGlwbHkgPSBmYWxzZTsgcmV0dXJuIGN1cjsgfSk7CiAgICByZXR1cm4gUHJv
bWlzZS5hbGwoW3AxXSkKICAgICAgICAuY2F0Y2goICgpID0+IHsKICAgICAgICAgICAgdGVzdFBh
c3NlZCgiY3JlYXRlSW1hZ2VCaXRtYXAgd2l0aCBvcHRpb25zIG1heSBiZSByZWplY3RlZCBpZiBp
dCBpcyBub3Qgc3VwcG9ydGVkLiBSZXRyeWluZyB3aXRob3V0IG9wdGlvbnMuIik7CiAgICAgICAg
ICAgIHZhciBwID0gY3JlYXRlSW1hZ2VCaXRtYXAoc291cmNlKQogICAgICAgICAgICAgICAgLnRo
ZW4oY3VyID0+IHsgY3VyLmZsaXBZID0gZmFsc2U7IGN1ci5wcmVtdWx0aXBseSA9IGZhbHNlOyBy
ZXR1cm4gY3VyOyB9KTsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtwXSk7CiAgICAg
ICAgfSkudGhlbiggYml0bWFwcyA9PiB7CiAgICAgICAgICAgIGJ1ZmZlcmVkTG9nVG9Db25zb2xl
KCJBbGwgY3JlYXRlSW1hZ2VCaXRtYXAgcHJvbWlzZXMgYXJlIHJlc29sdmVkIik7CiAgICAgICAg
ICAgIHJ1bkltYWdlQml0bWFwVGVzdEludGVybmFsKGJpdG1hcHMsIGFscGhhVmFsLCBpbnRlcm5h
bEZvcm1hdCwgcGl4ZWxGb3JtYXQsIHBpeGVsVHlwZSwgZ2wsIHRpdSwgd3R1LCBpczNEKTsKICAg
ICAgICB9LCAoZSkgPT4gewogICAgICAgICAgICAvLyBUaGlzIHdpbGwgZmFpbCBoZXJlIHdoZW4g
cnVubmluZyBmcm9tIGZpbGU6Ly8gaW5zdGVhZCBvZiBodHRwczovLy4KICAgICAgICAgICAgdGVz
dEZhaWxlZCgiY3JlYXRlSW1hZ2VCaXRtYXAoc291cmNlKSBmYWlsZWQ6IFwiIiArIGUubWVzc2Fn
ZSArICJcIiIpOwogICAgICAgIH0pOwp9Cgo8L3NjcmlwdD4KPHNjcmlwdD4KLyoKKiogQ29weXJp
Z2h0IChjKSAyMDE2IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKioKKiogUGVybWlzc2lvbiBpcyBo
ZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEK
KiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24g
ZmlsZXMgKHRoZQoqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRo
b3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdo
dHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAoqKiBkaXN0cmlidXRlLCBz
dWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCioq
IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRv
IHNvLCBzdWJqZWN0IHRvCioqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKioKKiogVGhlIGFi
b3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUg
aW5jbHVkZWQKKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUg
TWF0ZXJpYWxzLgoqKgoqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRI
T1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAoqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElO
RyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKiogTUVSQ0hBTlRBQklMSVRZ
LCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgoq
KiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBM
SUFCTEUgRk9SIEFOWQoqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAoqKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lO
RyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQoqKiBNQVRFUklBTFMgT1Ig
VEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgoqLwoKZnVuY3Rpb24g
Z2VuZXJhdGVUZXN0KGludGVybmFsRm9ybWF0LCBwaXhlbEZvcm1hdCwgcGl4ZWxUeXBlLCBwcm9s
b2d1ZSwgcmVzb3VyY2VQYXRoLCBkZWZhdWx0Q29udGV4dFZlcnNpb24pIHsKICAgIHZhciB3dHUg
PSBXZWJHTFRlc3RVdGlsczsKICAgIHZhciB0aXUgPSBUZXhJbWFnZVV0aWxzOwogICAgdmFyIGds
ID0gbnVsbDsKICAgIHZhciBzdWNjZXNzZnVsbHlQYXJzZWQgPSBmYWxzZTsKCiAgICBmdW5jdGlv
biBpbml0KCkKICAgIHsKICAgICAgICBkZXNjcmlwdGlvbignVmVyaWZ5IHRleEltYWdlMkQgYW5k
IHRleFN1YkltYWdlMkQgY29kZSBwYXRocyB0YWtpbmcgSW1hZ2VCaXRtYXAgY3JlYXRlZCBmcm9t
IGFuIEhUTUxDYW52YXNFbGVtZW50ICgnICsgaW50ZXJuYWxGb3JtYXQgKyAnLycgKyBwaXhlbEZv
cm1hdCArICcvJyArIHBpeGVsVHlwZSArICcpJyk7CgogICAgICAgIGlmKCF3aW5kb3cuY3JlYXRl
SW1hZ2VCaXRtYXAgfHwgIXdpbmRvdy5JbWFnZUJpdG1hcCkgewogICAgICAgICAgICBmaW5pc2hU
ZXN0KCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFNldCB0aGUg
ZGVmYXVsdCBjb250ZXh0IHZlcnNpb24gd2hpbGUgc3RpbGwgYWxsb3dpbmcgdGhlIHdlYmdsVmVy
c2lvbiBVUkwgcXVlcnkgc3RyaW5nIHRvIG92ZXJyaWRlIGl0LgogICAgICAgIHd0dS5zZXREZWZh
dWx0M0RDb250ZXh0VmVyc2lvbihkZWZhdWx0Q29udGV4dFZlcnNpb24pOwogICAgICAgIGdsID0g
d3R1LmNyZWF0ZTNEQ29udGV4dCgiZXhhbXBsZSIpOwoKICAgICAgICBpZiAoIXByb2xvZ3VlKGds
KSkgewogICAgICAgICAgICBmaW5pc2hUZXN0KCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAg
ICB9CgogICAgICAgIGdsLmNsZWFyQ29sb3IoMCwwLDAsMSk7CiAgICAgICAgZ2wuY2xlYXJEZXB0
aCgxKTsKCiAgICAgICAgdmFyIHRlc3RDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdj
YW52YXMnKTsKICAgICAgICB2YXIgY3R4ID0gdGVzdENhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwog
ICAgICAgIHNldENhbnZhc1RvTWluKGN0eCk7CiAgICAgICAgcnVuSW1hZ2VCaXRtYXBUZXN0KHRl
c3RDYW52YXMsIDAuNSwgaW50ZXJuYWxGb3JtYXQsIHBpeGVsRm9ybWF0LCBwaXhlbFR5cGUsIGds
LCB0aXUsIHd0dSwgZmFsc2UpCiAgICAgICAgLy8udGhlbigoKSA9PiB7CiAgICAgICAgLy8gICAg
c2V0Q2FudmFzVG8yNTd4MjU3KGN0eCk7CiAgICAgICAgLy8gICAgcmV0dXJuIHJ1bkltYWdlQml0
bWFwVGVzdCh0ZXN0Q2FudmFzLCAwLjUsIGludGVybmFsRm9ybWF0LCBwaXhlbEZvcm1hdCwgcGl4
ZWxUeXBlLCBnbCwgdGl1LCB3dHUsIGZhbHNlKTsKICAgICAgICAvL30pCiAgICAgICAgLnRoZW4o
KCkgPT4gewogICAgICAgICAgICBmaW5pc2hUZXN0KCk7CiAgICAgICAgfSk7CiAgICB9CgogICAg
ZnVuY3Rpb24gc2V0Q2FudmFzVG9SZWRHcmVlbihjdHgpIHsKICAgICAgICB2YXIgd2lkdGggPSBj
dHguY2FudmFzLndpZHRoOwogICAgICAgIHZhciBoYWxmV2lkdGggPSBNYXRoLmZsb29yKHdpZHRo
IC8gMik7CiAgICAgICAgdmFyIGhlaWdodCA9IGN0eC5jYW52YXMuaGVpZ2h0OwogICAgICAgIHZh
ciBoYWxmSGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQgLyAyKTsKICAgICAgICBjdHguZmlsbFN0
eWxlID0gInJnYmEoMjU1LCAwLCAwLCAxKSI7CiAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGhh
bGZXaWR0aCwgaGFsZkhlaWdodCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDI1NSwg
MCwgMCwgMC41KSI7CiAgICAgICAgY3R4LmZpbGxSZWN0KGhhbGZXaWR0aCwgMCwgaGFsZldpZHRo
LCBoYWxmSGVpZ2h0KTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gInJnYmEoMCwgMjU1LCAwLCAx
KSI7CiAgICAgICAgY3R4LmZpbGxSZWN0KDAsIGhhbGZIZWlnaHQsIGhhbGZXaWR0aCwgaGFsZkhl
aWdodCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDAsIDI1NSwgMCwgMC41KSI7CiAg
ICAgICAgY3R4LmZpbGxSZWN0KGhhbGZXaWR0aCwgaGFsZkhlaWdodCwgaGFsZldpZHRoLCBoYWxm
SGVpZ2h0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRDYW52YXNUb01pbihjdHgpIHsKICAgICAg
ICBjdHguY2FudmFzLndpZHRoID0gMjsKICAgICAgICBjdHguY2FudmFzLmhlaWdodCA9IDI7CiAg
ICAgICAgc2V0Q2FudmFzVG9SZWRHcmVlbihjdHgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldENh
bnZhc1RvMjU3eDI1NyhjdHgpIHsKICAgICAgICBjdHguY2FudmFzLndpZHRoID0gMjU3OwogICAg
ICAgIGN0eC5jYW52YXMuaGVpZ2h0ID0gMjU3OwogICAgICAgIHNldENhbnZhc1RvUmVkR3JlZW4o
Y3R4KTsKICAgIH0KCiAgICByZXR1cm4gaW5pdDsKfQo8L3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4K
PGNhbnZhcyBpZD0iZXhhbXBsZSIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj48L2NhbnZhcz4KPGRp
diBpZD0iZGVzY3JpcHRpb24iPjwvZGl2Pgo8ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KPHNjcmlw
dD4KInVzZSBzdHJpY3QiOwpmdW5jdGlvbiB0ZXN0UHJvbG9ndWUoZ2wpIHsKICAgIHJldHVybiB0
cnVlOwp9CgpnZW5lcmF0ZVRlc3QoIlJHQkExNkYiLCAiUkdCQSIsICJGTE9BVCIsIHRlc3RQcm9s
b2d1ZSwgIi4uLy4uLy4uL3Jlc291cmNlcy8iLCAyKSgpOwo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0
bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>416684</attachid>
            <date>2020-12-22 13:21:28 -0800</date>
            <delta_ts>2020-12-22 13:21:28 -0800</delta_ts>
            <desc>[Screenshot] WinCairo port</desc>
            <filename>wincairo.PNG</filename>
            <type>image/png</type>
            <size>44842</size>
            <attacher name="Fujii Hironori">fujii</attacher>
            
              <data encoding="base64">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
Luv5crq+Pl3fShW8vF1Pt36PvkCbjjK0PTcOT8UO+zgvn1RqHlt1PqXdTxoLkmkAAAAAAKQak2kr
k/CZhM6HTbAPib5iAmDyvmRar08wtiZNPl3X9lzfDAnTT26TZNoHetJYkEwDAAAAACB1YDJt6eMm
2NMnz5a6enylyfEnJTwmjijjMxQTKL1+X7eN0yNJpn2gJ40FyTQAAAAAAFI/STJtnDjPTYCvJ9pe
kmRa2UYC5bP3t2TaB3rSWJBMAwAAAAAgdWgybT6hnp1gHybr41ewdXHUBHxXv0wSIFPv1nqtLT/9
babh6xYfTeTsSHjk6ti9lrZpWGHxevLeaLnMMrlw2+bQ9/G/3zL16N2/ivIhmwmUse6z+rbu307m
6zNXyolKZdX05z2JM2w3Wf7RIXWzY2x1Gtv9IW15wliIynWfb2t4f9lZhdfvXz95L69/7RV+7w8A
AAAAgLyPTaYNk9j3iePSpPMe+adQFnUImuuVaXs/4T4vu6/Dw815OJk21H9et3SFTBm9oR9zfTar
U/9aiGlFutcW5Ra316grZ30cLp4sqtq/FXXeKidYjrf6/ryNqcLrD/ddtGNs7Wn3h7Slq9fBYyGo
r/ty3V7m9WG702WHsTGpDwAAAAAAr6YxmdZP/E4imUCfT6hP/12YeN6a3G+wmDgfJqvnE9Xt9VqW
E8s4v8UJ8mR73Trp9ncq9fUs0ipP29TXd96kiVzSJJjvw7tlP3XLLtqb789u32TLbVSdQBmXqdm/
NXWuKWfZfy39uUzW3JXLadQ8tva1+0Pa8pSx0FL3QnmZ14ttXiT3AAAAAAB4NR/3ZFoheVN8fY95
WYU676lXt8694Ou5K3eatJomXx6w1deZOk/7fpjMbyyjb1d5Yr9PMtyTZ/P9PZovt1Vuk67e6+Nw
sv3K/btZ58pypn3S1p/LOtytvdekdWztavcHtaWrw0eMhbvpe7XJtLVxcOCxAQAAAADAU3x4Mi19
+iWNxXz0LtNJ7FKyZ1e9uvYPk+jxv4f1Y1n9RHi/7UMmxR9OpvW618a2zDs4m1jYmNhP+6D753Kb
vb6cbN89qqt3wzis3b/z/pjXubKcaZ+09eeHJKBax9audn9QW7q6HT8W6usumQYAAAAA8B18/pNp
B7tPdpcnqXfVK1kurn8rN/ZLLKtiYr9aa8IjmPf9xLD85P1su9cn9udJhrVtpu91/33Ujt/q56Fd
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
b9rHlTGr8BFlpPZet9b06U26jc2FAeDrkUx7/WhOpt0uXp4cuW3viVxyaB659fZErh1HR267eyPX
F/PIrdcSz6r70ZHW89H6tpS1O5k2uemfS28u5zfdtTfFtcvV1ilIb36yE4PHT7Zm3epRub2q5R/t
h6i+jPtN57RO6c3o+k147f59UNrWvdupKOOIm/BDbuQndQ2RebpifGrgPgEXIrPB9K/z49Oe6V/Q
36Irf1jhyUpjrn4sHTvm8vVJt9E2gRVKPOD8mpSx0sa6ybLSdtr68d5P6bJHtLWmHmvrHyCdyJ4f
Q7djMdbt3t55f9/3xWf1cZCeN1Y/E6ZP4+w/x7e1b01an63z5mTSdrJwfV8d0/7Ere8fH5/3uu05
VqLj9kuUr0+6DefI6N5P6bJHtLWtHmVpOW377Jjjpa0d06fFYsz7ZVQu97jjPB1vO6P42bJet7ox
vNSyXtpPsZ+XTz+H8mZPYMZIm3REGaNHrlvTemx9lqT7IHf9DABfnWTa68dPn0yLkUsSjZFbfm/k
2nF05Lb7SOT6ZIzc8q3xzLo/Kx6tb8v63yqZNrmpvZc5uZELN1lrT7cd4ba9zfr26pZ/vB9ayrj3
Wbp/03JLkxejukmMfKyNh8TkL7a36lNQWUZa57034UeUEW333zIWEybFyZpL/1sWybqxX+b1fWQf
9l+5d76eY8Iv+5U/zz6nTLXVp3Rs1ag9/tJ2zPuicvvF/Tt134+lNrZEoYzdba3bn5OxePj5vVyH
24TkcHDc6jFrb/71j+zjqDRupmW8JX25PTm7tn/q9t22tN7z8ZFRfIqntq9attc4Pjf30Z1zZIjV
/krbMe+Lyu1/o3Pktr37LF1vXre5tbrWt+M9TZiHiImZur5Lyz2q3k+SXv/tiK3ry73JtPVy034K
kSx8RBmdA69b1+sRpPtgc2EA+Hok014/mpNpMW4XMCFy779iPCtZ9Oz4iL5+Zt98RP2Pjkfr27L+
c5Jp6U3J3pv72uXq6zQtM6nXZIItjVO4EY+Tr+Xv52+X1LfqBqx2+QP6oaGM7P4tTlTmlPdvekOb
j4oJi/hXrLflc1/vU6GhjCNuwo+7kV/+DtIy+knP8d+TiYd0PxYrMt/G9Dhv34c1dR7j2eeUaGd9
0r7bPA7nHjz+OumYXWljcdJpKrud4vlyK9K6HtHWyv355PN7vn73ut0OoVuf55ebHGsf3MfTviyU
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
I7V9fcixt3Ob1fuoVJeSuuXzn6M16yZjuqZOt8/i5bKPfZYPkvfLUXOuzI2n1EbfFPZr3XkwFbdT
7lf7Larro/o+D8b6rLVpIenTyuP/9jmUW/6wsRzVjIm5PesA8JUcnEwLZhcM8++Ivxs/NFc+ZN6T
r7AoXjCP1i7ctj/Qphcz6xcWeaVtNLbzJpQXb6zCe+vtjlbad8jNTXD78eewfPJ66aavfz2UMSyc
vxjb2zd9eVVfM1h7EXgbX5UXjC390XSzV+j/wVh+3UVtaR8/d0zGr3QrVe92nKXjsal/gtVzwbjO
vP9KfRE4RjLbzWg6Rgr7LqvQn4lbX3Xvry+/PEb29+FE67hrGg/JssMrN63Hx0388fJk8q3q5nSt
Hg3tmdR5XG9tLGT6L9rR9rrjakvF/vhJzhdjOauTHrf9UNrerG3Fvgg+o/+K4ygqtWGuPOayqraZ
e2+Q7qdDziUt2yz0+WDcbv0xVapTsNpP6/WIbsfF+P5R46vkkHHXOJaCuvNYS7kr+2Qmbnux3Vvb
+n6Ly8y3uVrnhsnW97f7vrydryrqnfUR+282BrP9FzV+BvQ2Ptcb+nVqbFN6HLScM4JDjr2d26ze
R/Xjvle3/G1czvt93B+LPrm7j+mK43YsL1OfYh1St/7KHZd9n5VXv/fp+nkoGpctnVc33i+MpbGN
29sfxP5a6Q/7Lajso+o+j8b2bnZMWHT3+X08Np/QJwut541ozzoAfCXHJ9PSD7dzuOBfuRDZuiF/
D+vf3ipeMI/WLsxqPtDGZcL6b+sXFnnlbTS1sxPbkrRj86JupX2FC9LyOkk/3FYo923xpi9uN7Rh
vPiL686/Jzxq75tQdOiPmiRBVHcReL+oWrtwvmvsj+LYvW/3vnzutbut/pr6nDEZ+7y4e3Ljsal/
guLy0dDm6vEe5OrUcYzc3fdF3TFyr3dx+VDHcUJku43x/XE/tB8je/pwoWbcLepYOx4qxufivVw/
hNcWf61erstSqR6N7ZnX+fbvUh0K5Te1fRDXqTiu1lXsj5/kfHGbvFhsMDGe70NMFyu148X6rziO
opW6zoxl15zT1rd5L2t7P7WOlXJ72reZGYfBVjlLFeNhdz/N1j1kfJUcNe7W+zen9XN6u9z6cR+3
vdzufVs/wrjJ/QHiap3Hc8pWRUMfnifrj/WuHX+hnveD8oP2X/p+/O/c2GqpS1i29nO9tl+j9HxV
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
m9L9Jlys47BcvKktfadlw7J924flumXz7S23665mmSq3ybckkr8un76fmRibt3+sz/B2WOCxfXEz
LyfEsMI42XiPZBuz9nWrhDq/nU/h9dqJ2NLrZbX7p3ZMRC3LZt3afS/jdNgxN7Vd1/m54BL24zCO
xvFX3E+9I4+nVZtjPJiNs0mkx1NBHMOTyfKuvGQcjzYmJqsn/IbJ2bfaJxGCZfIt9vd6y/asE1X3
x8I4rsK2hn6/7//42r2M0utzR46zqrHYdJwmx02MuNzKj5V+2DGT6vZdss005sdGzbHW2Xmu3iz/
wM+ZQW2fd7r6jcvGusX92/+7PZm2HBu3oZHbJy2f+xl7jtkjExTxXHP0+WvuiGTavjLCuEx+82ze
lq0k03ybi+Rb6Ne+jLCdydcuhn0/Ty7Gz45h/aq2PPKZtZaQqvHAeJlr3m8Pbjsm0tKvdBy/+hEA
AICP9UAy7b35SbP75FM/odJNtgxlxNfOb8nE32QSaFv3lNzp7TY51CXlwvrTSawxWTMrM2xrbEu6
fKdb5xReH9t4n1xbtLth2f6pvnQya+zPuP7wWlDVroplmtzqEuqdK2SYFFvs9qH998nby/V9fHpx
Nkm6a18s3CcW5+WnbViWEycoh3rexlmM+SThuP9qX8+r3T+1YyJqWTZvWH5Wr3w/5B3ZruW5IO7P
oZ+7baztp7ptRLV1Lur6KGz/vqHiGO+N9ZiN8w2xntM6hXJylVydmAz9t/b7M4k4MditOytv9QmH
+bJjrE1K71knqO6PmftnToiYtAjjqt91ybnj/HZ9C3EbEyv788hxVrPMbfzMluvbVDovjfUL/07b
P5QzrnJkW/YZt1cYl03HWumcXHo9qC7/gM+ZQW2fd4Z+Pt2Se7EeQ/261yc1yUvOm6d0jA9lT/ol
aUvT535BbOu0mFD+xqA5JkER+mkoZ3X9neeiVHN9F+bn6LA/Vp6Ey5uX0d5viyfOwvvjZ8m8jfPP
hPj+uL2q/njkM2slIVXlkfEy86FjNeg+u2Zf6Zg+qQYAAMDH2J9MSydpKmdX+omkuE46gTOWM59Q
W5kEW+iXzSWsJnM3m9sKN7SZ5fOJsLB8OrHWvGymXd3kXrpsTbsq295q7Kv55GEQy55vb1x+8Xpw
64O0QmP5tfuiaJwAnJdT2G7QvT55bdzmfJ+0vp5TuX+qx0TQsmzB2DfTerX0/bPatdavhX6v3kZl
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
Up22+q1mn3bn28xYLPXP2lhbS7RER9en3P66+7tHxvD6unXjs7X+q/23Mj63xslRavqz379p1CZv
hj5t2GGb9Rn6LL9I/lp/2ZeXa/8UZb4d+9u703DOKLY785mfeuSYAAD4aB+aTNv7/vJrl8IFYWEy
Ptp78V57s5UrO7fu2lcq1GyrVm17H9k/XX1P8StHWvs2/mVluDEI6+Vu7krbzPZPd6G+cjMwXKiX
3t7q83k/LpbfuBFI5drVOh4e2V+drRub6IGbm63+zHud8dAr12fruGrZZ+t9lb9xXmgYf9Gj42ff
/l0x2R99MjLt8/jv1v7OaTn/79tf7faU17rO5vJbx0t8f2V8Hd0nqUfL3hrLUe02aq83trZZU6dD
7d6/deef1vbu+TwtbaNm31Xv34bzQ2qz/A85vvJ/zBTblFu3K3OxzX6yfGtTz2jvI/s3tTUWW7SP
h8rP66ClvVttOrLNVbb278b1Vc0+LfX9ct04Ztf6fHufHFufx+/vHtmf6+vWjc+Puh/Ze75tVdOf
07rUH8fdWO+uB8p9NrdZn+74KpWXr1us/3hdcrs+Wfnaz93t3aNrz0abN+5havYhAMCr+PBk2vxC
cB51F93lr1mL9l68H32zVb5QrttWrdr2Ptb/y8nvNvkJnNKYyfbP6s1HsPH+Vp/P+3GxfOZGIH7F
yeQppxjh37mbita6PbS/homQleb2Vm9u1icwHhvDnz8eppb1KdVlVNpn1fW/qbvJbe3vh8ZP8Nj+
zRjGZLfJ7r9jHcZ2xz5o7++clvP/vv3Vbk95retsLv/g8bJa/m1/bkV+nNe2teV8O7dnH/Ty1xuP
Hl+H271/684/re3d83n6yPFYu39bzg+pzfKfeXyluond5CmQrtzc/huu2TL7qYtH+3NHe1v3b/Xx
3m0rWaYYy35qHw/1k9It7W09vp5ux/5N1YznUt8v193q8+19cmx9Hr+/K42N1L7Pu7rx2Vr/veOz
6vh64Pgd1fTntC6xn1bG96irW7/drl8q74E367N6/OT34bwv155Ki3a1d4+hj7b6P1Ro8Zl/t5Uw
BwB4LS/1ZFqb8g1D1cV7xtE3W4/+5WKt2vbu7/84KdNPJsZ6534Lo0Zu+6U6ZfsnuanJWr1Q3+7z
xY3KfPl5+d2k1vD7W8NLvX4Sa76po/8StKj2xiZa67PhZq/U3Vv9ueWzx8PcfNtbx1XLPlvvq7rJ
j0fb0+rR/bt0Py5i38ayx//f3JdBbX1qz4fRvv3Vbk95retsLr/Vx/H9B86fj6gqu/F8O/dY/ZfH
6KPH1+F279+6809re5s/T4NHjsfa/dtyfkhtlv9hx1c/3sc23M6hc2v16Y6l9YnVZ7S3af8+eLzX
ah8PlZ/XQUt7j2zTIbb278b1SM14LvX9ct2tifbtfXJsfT7gybTd479ufH7U/cje822rmvqt1SW2
efne9Fy7/HfZdn3ifirsg+7YW76XrX93ns2X097eHYbzRNXYWDtnDG0+oEYAAB/iQ5Np3YVUy9V4
4YKyV75h2HvxXnMDVCo7t265HrHuhQmQHarb29r/nXjzML3o7v4aLlwQL7a4dqEcls7tr9KYye6L
bjyU+22rH7b273z9xfKz9q1tL9eu5vGwZ3/FfVNxI32zss9i+x/pz7Wyw9ofPx5a67OxfK6uTfW/
qZv82Fwu1jc9X8Z/F7e5bXP/7tDvk7duvHdFj3WO2wp9vdYFtfVZOy7n9u2vdnvKa11nc/nheCn1
TVz/oeP9ATVlt55v5+r6p+F6Y/fx1Z87ur+03xjzTXbv38rzT2N75/tr0f+xvNn59ZHjsWaZqOX8
kKobPx90fA3nzUu3zfy+68pb/bxbP2ae0d6W/fvo8V6rfTzUfl43jucXPZ+U6rTVb5vjJyiVkVs3
N55G3fIb++To+pTbH8dHud9GW2N4rX/X160bn8313zk+19pxpJpzwlpdSvt4eQ7t+2drWzX1KS6T
+WyMSvXvjo1MQa3tbRbq+VH3mwAAr+Zjk2lB93VJ57fr++xLvsffLYp/hXcz3szFv7qaLB+/dql8
s9JdJMZJsdsqYfnhd1DWLtZqLi7XLmaX68Y29X9ZeBPaEfsp/g7Lwxeyg5b2NvV/rv6DPqE2m3iM
F8pxm/PvcI9t7ra7bO+y3+51X/TPMHF0iv2XbmMof2siYWv/zvftYvnZjUD3ftzmbZXL8LUsoe6h
/stNtY+Hpv3V9f8pGQeJ0k1M9vW4D2I/P9affX1eaDzsqM/Y/4vlw/6qOw+s1P8m7MvKG9Ku/Ljs
bAzFevZ/xTy8Nmg73qc29+8Off3j8TH+BWo/qdu9trGt2vr026g7H5Y+s45u+57yWtfZXL47Xs7X
8zDW05445Hh/QE3Z3TKxjsl+XT/fTtX1Tyir4Xpj1/E1bqeizk1279/6809Le1s/T6PlPqo5f/Zq
xlDULVd5fkjVjZ+POr7Wrxvi+1sTvmvX0NEz2ttyvu1ee+B4r9Vtp2k8NH5eTyq6Pp5f73wS92Po
h/QaKPzHEdfbUdv91HjdlY61eG6OdQmvb+yT4+sT98n++7vSsTDqtrlr/NeOz/b67xmfXTt2nG9b
bfVnVNq/0WIfd/cLod7DPyeGc9/a5mrq05cz3QdrX91Yrn+/3+bba2pvq65/Pu5+EwDg1TyeTOsu
qPqL+0nkLqQG8YYg3qDdlx8v0IcFRuMFa3ehHi/I78ufww3Vmu7i7LZ8vDmI5cw2UKp7Eum15m3S
t4vxQrq/iL2/PrsIjjcn8WZvfD+0I06EP3whO1PV3kFV/yc36F3cLnRX2jtcKPeJtuky58IFfVde
qX+S8uNNQf/vvt+n7Y31n07m9OZ1nce4D+PvBySvD22912FYLhkv/a4bbuTH9UL0/d7fSHWvzY+D
HeOh9ni517cQs7qU+2b7+Io2x/CrjYdd9cn0/1CnvLr6j27LZaLUtemESh/9eCgc7tXjZ25z/+4x
nFfSG/xxXy5u+pPjrRSl6tWcD9Ny7sfG/Jwx3V9t4qRWWtYs5ueG1va2Lp9MANWdP6NSGx7pl1Fj
/4QaNp1v9/ZP4/VG8/E11iuei4aXDrFj/97rvIxJ3yRq2psee2M77+fAvo7p/rlvq+H82bp/EzXn
h93jJ/xn9edRUlYuSvXvDOsvlsmUmy5z78sxlvujFI+0d1LW7ThdO9/uuL7aqWo8BOP7ucjvq7br
gegVzie7r69uy+Qj7aNd91PDmJjsq64uyWfJuJGPqE/r9XypTtlx3D7+02XnkavOM+9HUrXHV7Pa
/qwYC12Uxk7SF/djo49JNzXt30E4j06u50PfzM8JuXKL18txW63t3WH5OTKLWZunx1EadfebAACv
5tAn06i3drPC9/MVx4Mx/HOzf38yyeQ3n2ecjDv80LJ/P9cH9393fl6bpH024+0lPO18wm5f/drJ
tR8AAKyTTPskblZIfcXxYAz/3Ozfn4zJ7xcwfK3p6eCn0iL793N9aP/3T+J86unZeHsBTzyfsNtX
v3Zy7QcAAOsk0z7B2nei8/181fHQ3XDHiZwujOefw+yr90yo/DxMfn++bh88KQli/36uD+z/7rP3
sxMoxtvne+b5hF2++v2d+1MAANgmmfYBFt8VnvtOdL4N4wH4SPPf+YhR+mF6vh7793N9RP+XfnPm
MxIpxhv0vvr1vPsRAABoJ5kGAAAA8B0MT7dOEqqr4alFAIBIMg0AAAAAAAAKJNMAAAAAAACgQDIN
AAAAAAAACiTTAAAAAAAAoEAy7YnGH/U9vw8vvIDL22n6Y8I7Kncv46v8EPHl+n5O2n06X4/dJV+9
fAAAAAAAoOSBZNrl+v7Lj+uP3ynF6Xr+7SzT8uvb9bRYbjsxcLmcr6ff3Nc5/fLevRa38fbrsFCi
dflneju9VjIt1SXFdlfu/XpOk2nvoX/HZE8mTmE7n5V3i4moU5L1i+0+nd4Oq89XLx8AAAAAACh7
YjJtiF+SZE02mfbjepon3RKX354Wy6dxnq3auvyzfZtk2uD9HPbn/MXLpeuH/dt6QEzynd6Gf9xl
67nHVy8fAAAAAABY9UAybTAmyH4zfVLmchkTZ7mnwS7Xt+TJsfm6d+/X87DM+XJf4l72PDnWuvzz
SaaN8ss/W6xPtomFJFWrr14+AAAAAACw7mnJtGh8Smzx5Fn3lYthnV/eb0+3ZZNcm2XPEnWty+/0
/na+/R5a9xWG8Teswmu55EafTFv+5tVaUunyHtoRn+S6LR/qHcqYiMmU4f002dIlyMb1NhJldcm0
vu6T9oZ1wqttybSY0Mwm0y7Xt7RvYsT+XOmfFm+x73JldfV5/LfHvnr5AAAAAADAuqcm08ZE2TyZ
Nkmgrawflrw9aXb6bc1vbrUu3y4mi2LSLHnw7Xq9hO3G5FchmdYloJKMSJcsC6/l8lhd4qpLVqWG
hFYmq1J68q0mUba9TPx6xrjdtD5DYjC+Xv01j33/xHZNxYRc/3ran2v90+ZSfhrukGTUVy8fAAAA
AADY8qRk2uX6fvvtstPG02PjVz7OlhuNT7ElcfpNfLLrkmwv0bp8oy6ZlsvyFL52Lya7ckmwbCJr
9av7+t8dm6/yzGRafD/7lFnQrVtIpk2eMhsj87TZ6vaHZNFj+ywm656ZjPrq5QMAAAAAAFuOS6YV
YvWptFHytY9Zv75f3345Lbfzm0IyoXX5RsuveTwtv4Zx0JLsKn5F4iC3zvOSaStPRXXyiZ58Gy5h
W7HPTpO6luo+2np/myfTAAAAAACAxzwvmRafBls8afZ++xrGfNQlBy6/hnK6p9lClBJwidbl2x3z
NYxbyaOPTaatPBXVaUmmDYYn78Z3Y90nT69lYi25WKPYpwclo756+QAAAAAAwLrjkmnZ3zybuty+
+rEc6ZNs/fKn6VNso8x2W5c/Vj651JLs+nmfTBvMEkDFRNGBivVZ/UrNel+9fAAAAAAAYN0HJtM2
fhstU874lZDd1zP+mpQev8Yx86RZ6/LNVp8GejyZtp4g+Tq/mVZMpsX2hf67vRv/vVHHhxW2sVrP
oa+7p+OSJ+myXrJ8AAAAAADgKA8k0y735NUipgmzy/ibaGn88n5LIuTKOV/Wyh9jup3W5Zt1ybRQ
zul8fQ/1u4tf8xhezyQ9WpNd3ddFnt9Cnw0vROEfb6d8YmtZTqjL+JtuuQ0ntpJpsax+u/d91ZUf
6vgjvt6QTLu89303f29s77Q/w/KX9+u567tlWa3mX8F5eQ/9s5bEGvdziI0u7Lxc+QAAAAAAwGFe
Opk2fm3jW3yy7Jf43+P7p+vpl7fr+ywx1rp8s/HJtC7RE8ofEiLxCa3z2zIrcn8/xGl84ix5KmlY
d5576hJP6TJhW2/FpFIoLya3Zsv2T47F15Ly41NO43KFWCZ3+uTZmPyJcQoLhVev5/G1uNJm2aGP
Cm1YtDcs2yfYhgUeNu2jLlk5vJM1tqU6YfVi5QMAAAAAAId5IJkGP6fuKcMfdU+N7fHs8gEAAAAA
gONIpsHEpX/i7mlfo/js8gEAAAAAgCNJpkFq+D2zpz019uzyAQAAAACAQ0mmAQAAAAAAQIFkGgAA
AAAAABRIpgEAAAAAAECBZBoAAAAAAAAUSKYBAAAAAABAgWQaAAAAAAAAFEimAQAAAAAAQIFk2hOd
fvy4/ghxfh9eeAGXt1NXp1vsqNy9jNP17TK8+MIu72/X0+ne5tP57Xop1fsSlh37ZhbZrmpdfpfL
9f2c7LfT+XrskHp2+QAAAAAA8HU9kEy7XN9/+XH98TulOF3Pv51lLH59u54Wy21P3F8u5+vpN/d1
Tr+8d6/Fbbz9OiyUaF3+md5Or5VMS3VJsd2Ve7+e02Tae+jfMRmTiVPYzmfk3bo2ns7Xt/dx62Pi
qDDuuuRYQzKpdfkdYn1PSdYytul0ejusP59dPgAAAAAAfGVPTKYN8UuSZsgm035cT/OkW+Ly29Ni
+TTOs1Vbl3+2b5NMG7yfw/6cv3i5dP2wf1t75esYZesZvVoyLSYpT2/DP+6K9W/17PIBAAAAAOCL
eyCZNhgTZL+ZPslyiUmGLoGVexrscn1Lnhybr3v3fj0Py5yT7+W7lz1PjrUu/3ySaaNyYutTFJJI
r5ZMi/2Z3UWl+jd6dvkAAAAAAPDVPS2ZFo1PiS2ePOu+cjGs88v77em2bJJrs+xZoq51+Z3e387X
9HeyTvE3psJrueRDn0xb/ibVWlJp/htfP06h3revKRzEZMfwfpoM6RJk43obibK6ZFpf90l7wzrh
1bZkWpd0yiXTLte3tG9ixP5c6Z8jxHpm2/5iybS3uO9zfXHQdp9dPgAAAAAAfHVPTaaNibJ5Mm2S
QFtZPyx5e9Ls9Nua39xqXb5dl4Q5hbqmhV/CdmPyq5BM6xJQScaiS5aF13K5nC5x1SWrUkNCK5P1
KD35VpMo214mfj1j3G5anyExGF+vTaYN/RPbNRUTcv3raX+u9c8hiom9YHjvPEmYxn/nFg5al29y
KT/Nd0iy69nlAwAAAADA1/ekZNrl+n777bLTxtNj41c+zpYbjU+xJXH6TXyy65JsL9G6fKPiE02F
r8WLya5cEiybyFr9ar3+d8fmqzwzmRbfzz5lFnTrZhIxXf/ckkpJZJ42W93+kMw5Yp9NdOWuJOpu
ybEkgRjGTnx6LtsXrcs3icnGZya7nl0+AAAAAAB8fccl0wqx+lTaKPnax6xf369vv5yW2/lNYbK/
dflGy695PC2/hnHQkuzKPtWVyK3zvGTaylNLnXwiJt+GS9hW7LPTpK6luo+23m+2lUhbFdvbMn5a
l8/xZBoAAAAAAHy25yXT4tNgiyfN3m9fw5iPusn7y6+hnO5pthClBFyidfl2x3wN41by6GOTaTEZ
dFQybTA8eTe+G+s+eXotE48/3TXokkPTZF6brf6Ya10+rzgmDkp2Pbt8AAAAAAD46o5LpmV/82zq
cvvqx3KkT7L1y5+mT7GNMtttXf5Y+eRJS7Lr530ybTBL0BQTOUd7OJEWfU4yrdifq18JWu/Z5QMA
AAAAwFf3gcm0jd9Gy5QzfiVk9/WMvyalx69xzDxp1rp8s9WndR5Ppq0nML7Ob6YVk2mxfaH/bu/G
f2/U8WFhGzGRVqrSxLh/c8vO6x61Ln/T78vu6bvkSb2sQh+tJ16fXT4AAAAAAHwfDyTTLvfk1SKm
CbPL+Jtoafzyfpvkz5VzvqyVP8Z0O63LN+uSJ6GcU0ygpImG+DWP4fVMUqI12dV9XeT5LfTZ8EIU
/vF2yie2luWEuoy/6ZbbcGIrmRbL6rd731dd+aGOP+LrDcm0y3vfd/P3xvZO+zMsf3m/nru+W5ZV
rUtoncrJrkzickwSptu9hGVLv7XWunxnHEdryyTmXyHalb+WJHt2+QAAAAAA8I28dDJt/NrGt/hk
2S/xv8f3T9fTL2/X91lirHX5ZrcnkWKiJyZRQtldnK7nt2XW4v5+iFviJnlqaFh3nnvqEk/pMmFb
b8WkUigvJrdmy/ZJnvhaUn5MII3LFWKZfOmTZ2NyJsYpLBRevZ7H1+JKm2VPE06pRXvDsn2CbVhg
p3sfFCKTTItifWIi777ceaX/25e/9VV1wmq6j7tk6/BO1rPLBwAAAACAb+SBZBqwR/cU44+6p8b2
eHb5AAAAAADwnUimwYe69E/0Pe1rFJ9dPgAAAAAAfC+SafCRht8ze9pTY88uHwAAAAAAvhnJNAAA
AAAAACiQTAMAAAAAAIACyTQAAAAAAAAokEwDAAAAAACAAsk0AAAAAAAAKJBMAwAAAAAAgALJNAAA
AAAAACiQTHui048f1x8hzu/DCy/g8nbq6nSLHZW7l3G6vl2GF1/a5fp+Ttp9Ol+P3SVfvXwAAAAA
AKDkgWTae8wWXa8/KmLMuFzeMu+f+/dy3nPLp3HqqrG57Cdms95CH71SMi3VJcV2V+79ek6Tae/n
0NVDsicTp7Cdz8q7xUTUKcn6xXafTm+H1eerlw8AAAAAAJS9QDIteX9OMu2pDk2mDd7PPyaJn87l
0vXD/m09ICb5TmFszGTrucdXLx8AAAAAAFj1QDJt8H4uJ6zeTv17i0n/8O80EZdJFiyF8rvlV55k
64xlh22/QK5BMm2UX/7ZYn2yTSwkqVp99fIBAAAAAIB1z02mje/N30rXOcfEV2aZhbDAiyTT3t/O
YRPJVxjG37AKr+WSG30ybfmbV2tJpcv7WyjzXv6P0+n6FsqYiMmU4f2067sE2bheNgtzV5dM6+s+
aW9YJ7zalky7hDZlk2mX61vaNzFif670T4u32He5srr6PP7bY1+9fAAAAAAAYN3xybQuORZeW0uG
pAm08asfN5+yCQvH5T45mRaTRTFpdknLvrxfzzH5VUimdQmoJCPSJcvCa7k8Vpe46pJVqSGhlcmq
lJ58q0mUbS8Tv54xbjetz5AYjK/XJtOG/ontmooJuSE5l6yy1j9tLtmEX+eQZNRXLx8AAAAAANhy
XDJtEiuJrEXyLCxYlfx6H8p+gWRaLssTnxQrJNNySbBsIqtQRq//3bH5Ks9MpsX3s0+ZBd26mURP
1z9hPy0i87TZ6vaHZNFju3DlqyUPSUZ99fIBAAAAAIAtH59MS59KG82fbssK73Vlf24yLVp+zeNp
+TWMg5ZkV/ErEge5dZ6XTFt5KqqTT/Tk23AJ24p9dprUtVT30db72zyZBgAAAAAAPOa4ZNqY9eiS
ZeG1XALglhArxVqibFz3gWTaWNfDMxDHfA3jVvLoY5NpK09FdVqSaYPhybvx3Vj3ydNrmVhLLtYo
9ulByaivXj4AAAAAALDu+GTamrfTkBBbiWLyJJTfLfNAMm3c/oMJmrx8cqkl2fXzPpk2mCWAiomi
AxXrMyT2HvXVywcAAAAAANZ9YDLtsv71i5e3vpxigiCU/9nJtNWngR5Ppq0nSL7Ob6YVk2mxfaH/
bu/Gf2/U8WGFbazWc+jr7um4sD9KS3VesnwAAAAAAOAoDyTT3oekVSbmCaH3IeGWRpogOM/eixF/
g+x9SLAV49RVo7O5bBJ7kxBdMi0mQM6hemkZ8Wsew+uZpEdrsqv7usjz23VafEy+5BNby3JCXcbf
dMttOLGVTItl9dt9TxI+/Vda/oivNyTTLmH/xDrN3xvbO+3PsPzl/Xru+m5ZVqv5V3Bewng8rSWx
xv0cYqMLOy9XPgAAAAAAcBjJtBbjk2ldoic+mdUnROITWue3ZVbk/n6IW58kTyUN686r0yWe0mXC
tt6KSaVQXkxuzZbtnxyLryXlh/1wW64Qy+TO8HtwyTKnsFB4Ney24bW40mbZoY8KbVi0NyzbJ9iG
BR427aMuWTm8kzW2pTph9WLlAwAAAAAAh3kgmQY/p+4pwx91T43t8ezyAQAAAACA40imwcSlf+Lu
aV+j+OzyAQAAAACAI0mmQWr4PbOnPTX27PIBAAAAAIBDSaYBAAAAAABAgWQaAAAAAAAAFEimAQAA
AAAAQIFkGgAAAAAAABRIpgEAAAAAAECBZBoAAAAAAAAUSKYBAAAAAABAwTdJpr1fzz9+XM/vwz/n
Lm/X8+nH9UdYJsbp/Ha9DG99hsv72/U0r09lhd7PwzpvhRXez+H9c+gRvqrL22kYG6draTc/1yUM
o7EOIU5Hj6evXv5X99z+aTq/hXPzaazHLLLn89bldzF+AAAAAOC7+ZRkWkz4FJM9T9AlH06FBFmc
fI2Tocmbl/dzeO1zEmp9Xc/Xt1uFxonbignbbiL51E1Ur/XvW5zIPm5m+dv76PHciwniz0mmxfGY
tjeO2SOPl69e/lf3zP5pPr9157SGZFXr8jsYPwAAAADw/XyDZFr/VFppe6W6xNc/Pt9UTpDU9Flc
JibJNpf1dNqhavbN8T4pmRbHzult+MfdYX3w1cv/6p7aPzvOb6+WTDN+AAAAAOBb+umTad2TECuT
q/EprVzSrFvvlZ7eKkzi3gxPpcVu3e7fy2qCkTafM5H+Ocm02NbsYbE1Pit99fK/uk/rn1L5L5ZM
M34AAAAA4Ht6OJkWvxLxfDpd09+pKf0GTvf1gsly83hGQmLrKw1Lk6PFSdNPEuuz1o7YzrH/4rJb
fdmVd3rGV5Ndrm/d17bd92v3m0KZDXV1uC0z1iWsn46Toc33ZeNE+XwbYfyF5fJtqa/PzeW9G9Pz
8t9m/bpvPLfWp/8avOnxFdu6nkzrk8hx+WMTbm+hX/LNOiaJ8VXLn4yFzHE1HSv37bScP0fvb+fp
8nH8hNeOSOY8u/9Liue31u0+uZ6f1T8AAAAAwOd6/Mm0y2Ux8fu+8TRYTbLnGDHhsLWtmDgJdU0X
ubxdz3FCe/jnp+smaguTuFF8KiLp76r+7dZZKXOXob9jsicp9/Ie659PTuZ/bygm1MLr88oN/dD9
JlyXULqLY25ZTnt9bv0yHRDh5T45levX+vHcWp+xH9K2DnXpEjDl/Zcmb+rqViM+0fjMZMLXLn9z
HMyO007j+bNLOsVxnq7TJX/71x/z7P4vGI7r8nZP1/MkgRj/Xejn1uWbfFL/AAAAAACf7vFkWkGc
zM8mK4IPS6Z1E5zbT5jFp0O6JE2ceI1JitLTB59hsw0x4TLtz/pk2nbftFj9asxhsjk/Dx2TQ2Mi
bNmem6EvSm3rEnPJe+31icmu8r4v9WvteG6tz7w9qa6slbr27/eJhIqqVVrpn6H+jw2nr13+6v4N
uvcrE16l82eXTMu/cUAy7dn9n9GVu3Ie6t6PybAkoXzpn+7MHhutyzf5hP4BAAAAAF7Cz51MG58y
WttUXGZR0ZVJ04+0NdEcdW2cTuJW9W9N2Y3W9nm09n6faIhfebdS92GivNi0+H6SUGiuz86ERO14
bqvPylMwnc8Yo1/7ybGnlz+Mn774Pil8/3e/f2vPe2tjZfk1j6FNq99bWuuDn7zqylw/Jsri+G+p
T+vyOR/cPwAAAADAy3g4mRa/om76+1JxAvm0Okn6Ssm00qR1TO58SB1LusnZ08ZEc/4prs9Mpk3G
QSbK9VomHxa2Jqxn77fWZ+vJopKWZFquDmncy9lKln1Owje2IdtFByUTvnT5XRnDPun+O+7TcR/F
/bXc9p7z59Lwu3oHDIZn9//N0Ff1bZxrHf/HHC8f1j8AAAAAwEt5LJk2JKvO75dZAqRPjJQmSj82
mbY+KR1/kypXlb2JlUNUTzT3E/STifg01gqo6JtWa/t8XRwvfTKgS2KWEmpDvxSHTnw/ebKsuT7D
k0WtjnoybWrlKZjO5yTTim3d2XdzX7v8+3kvbicef+P/Z8dudwy2nz/zjhkPz+7/TvX5bc3nJNM+
pH8AAAAAgJfzUDKtOLEYrE0Gr613rD7ZtLat+ERH7u31J9OGp6hiwuq08iTVHu/977c90j1V/TtM
5D+ynYVYZvMM+T2RNup+wy7Xr90kfLlti33WXJ+NCfeuz5ZPn1SP58b6rI3BLtm7Utf+/ThGP2Yf
r/dBw/HykuXX68t568473WbGMRP3x6xua9vMnj+78V96+umYZNG+/mnr/+rz29je3LJDv07eal3+
5nXGDwAAAADwmh5KpnUT9nHy8TaHeBm+tqyfmMzMOXb6if500vNy+x2goycku0nSUkWiOAF7mk7A
xjZ0rw3/XhiSOmtt3KWb8D2VJ4NDX9eomdiNy2xOHO/Qfd3c+S20YVry5fLejYv4FM5dfK1/Mmeu
T6jN9sEwWX7utvE+qXtMVuQScG31iZsYklSTAdF/jV58Pbe/W8ZzW33GRGPa1qEu8fWVpMQtOfCE
Y6prQ1JmMfk5ajxeXq78Bvck5pi4iU8YDvtiVrnm8+fYzu58ldY2joll+Xs9rf9DOa3nt/F4TI+L
rj6FbbUu33mh8QMAAAAAvKaHkmnXbhJ3nDzuY0xMpX/pn9MlPxbrHT8deUt0DP/OutwnsLu6nNMJ
7oxuUrhv25E1vk/EF6LQl6M0gdJFefZ484m9R/TJyLQuYV93CaRhgSiZwO7i1pfJUyLDurdqduv0
+3I6fmL50+Raqqo+iTShkS6/NiZaxnNbffpjbFJ219b4JNLwWmY/38fSAU8rLYR9lBz3Xd8M72Q1
Hy8vVn6LYVynx1aX6Jq91ms8f47jv0u8puudrue3iixQtef0/97z2+J4DH00SXbPtC7/UuMHAAAA
AHhJDybTvoI+6XBk4micHK95iuEldZPHGwnGV5Qk0/g6nn28fPnj8Yv76v1v/AAAAAAAW75BMm14
IqL6qYMtw9e2HVbex+ueevmKM8eSaV/Qs4+Xr388fm1fvf+NHwAAAABg27dIpl2Hp9MOyR8NX+P2
ZZ9i+KpPpUWSaV/Ps4+Xr348fnVfvf+NHwAAAACgwjdJpvHVjV/FlsazfvMNAAAAAABgJJkGAAAA
AAAABZJpAAAAAAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmlPdPrx4/ojxPl9eOEF
XN5OXZ1usaNy9zJO17fL8OJLu1zfz0m7T+frkbvk8v52PZ2GskOczm/XS6lfLmHZsR6zyO6K1uV3
eW7/AAAAAADAV/ZAMu1yff/lx/XH75TidD3/dpZR+PXtelostz1xf7mcr6ff3Nc5/fLevRa38fbr
sFCidflneju9VjIt1SXFdlfu/XpOk2nvoX+TRM88TmE7n5V3i4miU5L1i+0+nd4OqU/Xh6fz9e19
LG1MTBXGdZcca0hWtS6/wzP7BwAAAAAAvronJtOG+CVJA2STaT+up3nSLXH57WmxfBrn2aqtyz/b
t0mmDd7PYX/OX7xcun7Yv60HxCTf6W34x122ns3yfRAVy3+1ZNpT+wcAAAAAAL6+B5JpgzFB9pvp
kyyXmAToEli5p8Eu17fkybH5unfv1/OwzDn53rx72fPkWOvyzyeZNionnp4p1ifbxEIS6TCl8l8s
mfZp/QMAAAAAAF/E05Jp0fiU2OLJs+4rF8M6v7zfnm7LJrk2y54l6lqX3+n97XxNf8fqFH9jKryW
Sz70ybTlb1KtJZXmv8H14xTqffsawUFMdgzvp8mQLkE2rreRKKtLpvV1n7Q3rBNebUumdUmhXDLt
cn1L+yZG7M+V/mnxFvsuV9YHJKmyfftiybTP6h8AAAAAAPgqnppMGxNl82TaJIG2sn5Y8vak2em3
Nb+51bp8uy5Jcgp1TQu/hO3G5FchmdYloJKMRZcsC6/lci1d4qpLVqWGhFYm61F68q0mUba9TPx6
xrjdtD5DYjC+XptMG/ontmsqJuT619P+XOufNpfy03DPTBZ1Za9t93Q9TxKy8d+5hYPW5Zt8Uv8A
AAAAAMAX8qRk2uX6fvvtstPG02PjVz7OlhuNT7ElcfpNfLLrkmwv0bp8o+ITR4WvxYvJrlwSLJvI
Wv1qvf53x+arPDOZFt/PPmUWdOtmEjFd/9ySPklknjZb3f6QzHlsn8Vk3Qcni7pyVxKBt+RYkqAM
YzM+nZft69blm3xC/wAAAAAAwBdzXDKtEKtPpY2Sr33M+vX9+vbLabmd3xQm+1uXb7T8msfT8msY
By3JruxTXYncOs9Lpq08tdTJJ2LybbiEbcU+O03qWqr7aOv9bR/85NVWIm1V7M+W+rQun+PJNAAA
AAAA2PK8ZFp8GmzxpNn77WsY81E3eX/5NZTTPc0WopSAS7Qu3+6Yr2HcSh59bDItJmuOSqYNhifv
xndj3SdPr2Xi0aevin16dLKoK2+aLGyz1d9zrcvnfVj/AAAAAADAF3VcMi37m2dTl9tXP5YjfZKt
X/40fYptlNlu6/LHyic3WpJdP++TaYNZgqaYyDlQsT6rX6nZ6OFEWvQ5ybQP6R8AAAAAAPjCPjCZ
tvHbaJlyxq+E7L6e8dek9Pg1jpknzVqXb7b6tM7jybT1BMbX+c20YjItti/03+3d+O+NOj6ssI31
xGXf193TccmTdFmh/JhIKxaVGsdPbtl530Sty9+01b+9fwAAAAAA4Pt4IJl2uSevFjFNmF3G30RL
45f32yR/rpzzZa38MabbaV2+WZfcCOWcYoIjTTTEr3kMr2eSEq3Jru7rIs9voc+GF6Lwj7dTPrG1
LCfUZfxNt9yGE1vJtFhWv937vurKD3X8EV9vSKZd3vu+m783tnfan2H5y/v13PXdsqxW86/gvMQE
2FqSadzPIVa7p0toncrJrkxidExCpu3q6lPYVuvyndr6D5r7BwAAAAAAvpGXTqaNX9v4Fp8s+yX+
9/j+6Xr65e36PkuMtS7f7PakUEz0xCRHKLuL0/X8tsxa3N8PcUusJE8NDevOc09d4ildJmzrrZhU
CuXF5NZs2T4JE19Lyu+SP8NyhVgmX/rk2ZiciXEKC4VXr+fxtbjSZtnThFBq0d6wbJ9gGxZ42LSP
umTl8E7W2JaNhNK9jwuRSaZFsb0xUXhf7ryyf9uXr63/XWP/AAAAAADAN/JAMg1+Tt1Thj/qnup6
RV+9/gAAAAAA8Eok02Di0j9x92W/5vCr1x8AAAAAAF6LZBqkht8b+7JPdX31+gMAAAAAwIuRTAMA
AAAAAIACyTQAAAAAAAAokEwDAAAAAACAAsk0AAAAAAAAKJBMAwAAAAAAgALJNAAAAAAAACiQTAMA
AAAAAIACyTTgW7u8na4/fvwIcbq+XYYXX9S9rkOc34d3gNRpOEZe6RA54vg94nz1fh7rcL46gwAA
AADUeSCZdrm+//Lj+uN3SnG6nn87m+n59e16Wiy3PZlzuZyvp9/c1zn98t69Frfx9uuwUKJ1+VcT
J7pOW7Nk76E96aRcNl4/OQBzVeP/cO/X8xc7XrpJ9Z80mXaf7A9xehtejeJ+St4LMR8rl/e36/mU
LHM6X9/eH9yxrefbteVz9WldPlHV3gfK/8reQr+86iHy2PF7wPnqEq7HJNMAAAAAqj0xmTbEL8lU
TTaZ9uN6mifdEpffnhbLp3Gerdq6/CtqSSaUl/16yQGIJNPq/MzJtE432R/O2yGWzczvr/6pnVNY
/v7G5f3clXPEmGo93+aXv1zfTrGOwz8Trcu3tre1/K9OMm2FZBoAAABAkweSaYMxQfabt2s6r3OJ
EzVdAuuUeRrscn1Lnhybr3v3fj0Py5wv9yXuZc+TY63Lv6aWZEJ52YtkGl9Sy/g/zgGT0x/seyTT
zte32M7T/DMis7+6p68K+7Ar6/HESuv5trh8rOvkibte0/I72ttan69OMm3FcHz9xGcQAAAAgEM9
LZkWjU+JLZ48675yMazzy/vt6bZskmuz7NM0Ude6/B6Xy/XtHMr6EbYT4xTKfL/0E2Pda/MJrtny
3Trna+5bteLE32S5WeQmQaeTo3GCbX1y7P4VaUM9L2Gd0IbJa4nW5aP4tWOnydeOheUKXyO2p/wa
k75cTMTP+/reZ/Gpjrj98YmYGKdzWH+lHu9v/ZMgt+Xj/g2vHTM5XT9+4li4LzO2OT51krw+TN7e
l41tn28jtD8sl29yfX1uJvv0Xv7bbGJ/z/hvr88ltH2+f2Nb47Gzf7zdj/8xxrJm/R8jmUDfM95G
q5PxXaKlLy9dZFLP7Lo79m9QPv894DbZHxNV86TIcn/Ffs6Pkd5qf1VqPd8Wk1eFREbL8nva21qf
vZ4yHgYt59vYR/GpvXjMj8vH8bxWp6rPr93H113deHzO+aqT7PNpnx58/q80XgvE8Tk+XTnW57zS
0JbrjXZt7f0Zrq+eez0DAAAAX9tTk2ljomyeTJsk0FbWD0venjQ7/bY0uZNqXb5VPxGRfqVWl1yL
k5pxgmIxMRaWj5MRcWIqXSVOhoTXS/NoxQnPjOXkbn6CZGpYLk6axInFsT3dBOE5vx8ql+8m/hYT
ccOEYLFirfWps9mPQ/mT3RB21DyR8d5NkM6WG8RtdImrdJ1uwqp//TGxX9rGT5ygPd0SaaM4RjP9
302mxuWHbQwvR7HNy3La69P3cdi3k8m+++R2bv/Uj//W+oz9kLZ1qEt8PdazZrMrigmOUrIiVHwy
doK18ZaqmYzvkwnDPxL5dXfs30Hczm3y9dFOHCV91tV3Mh5jXdP9Nf93xgEJo9bzbXEsx+Mic36o
X35fe1vrs9dTxkMQ69+Ng7TIlfPtWI+0DmvjufXzq+34mtpe5snnq9v5P7Y56dPwH10CKfbz8FIv
jrnQl7F/kjdqzg+1uvEZ65MkrI7cX232tnc4Nr/g9VXr8QUAAADfzZOSaeHm/vbbZeEmfvXpscvw
lY+z5UbjU2xJnH5zvr6Fu/30fv+mdfkGxYnIUHKcdJlPjK1Olg0TnbnSyttZ6iY/4rZvEfpxc9V+
kmg5WVZSufzqhGycGCxNQLXWp87WZOU4QV+jVPeu//NvVJddsnf8jO3q3+v7PTueujLKYy2Wk77X
Xp9hEi9ffHGc147/1vrM25Pqyqo6djYM+31eTHGcFJSPlbvV9g9aJvtb+zPV919o4xF9OBq22ddo
/nTabGxNli1ZH481Ws+3y7E8PnWTX696+Z3tba3PXk8ZD0HxOCqcb0vnvuxYL5TRy39+tRxfc1vL
xPefer7qxlChP4P5WFmt78b5oVa3fzPjOrvtHfurxf72tl7PVC6/u7319Wk9vgAAAOC7OS6ZVojV
p9JGydc+Zv36fn375bTczm8Kk4mty1da+0qv3MTL1mRO6f3lhGfZdNnayeLa5UZ1y2/Vuzw51Vqf
SsMEUF9sP9mUTijFf9f289q+XH4tUmjL5EmsffaOn6jr61P8CsGVNnYTgiv9Ht9PJtCa67NzAq52
/LfVZ+s3BI8ag3VfSbhlq23R6mTvoFTOkeerpxkmrG+bjOPpNoE969P5slmP7+PW821c/p54G84P
K1/jWb38zva21ucVtZxvW8b/1nmn5ZipOTbXl/mA89XW+X/y+fkx54fSPjhqf7XY397WfVO3/P72
ttXnWdczAAAA8DN4XjItPg22eNIs3NTnlr1FXbLr8msop3uaLUQpAZdoXb5kbfIyN5ERJ1vGCYlS
5CZHtiZNUtNl46RJTR+2Ta7ULr81+XTUZE+1dLKw++/Y5+N24jaX9Y1f4XT/TZEh4tdOZZYtO+Zr
pvaOn94yebiwNSE/e7+1PnsnM2vHf1t9tsbYcWNw3u7u34Wk4iPjraZ/S8dkbt3HxtsTLMZnP6b7
Osz3V8X+2xrvFVrPt/OxvPUUWP3y+9rbWp+voXy+bR3/a4dTyzo1x+b6Mlv7t2L/b3ny+X+P0rn/
qP3VYn97W/dN3fL72/voWDnqazMBAADg6zsumZb9zbOpy+2rH8uRPsnWL3+aPsU2ymy3dflWRz+Z
VlKaUMpZWzbW6SMne7bq/bzJnpL7Vx/FusVtj/8fKrOcRO6efOl/E29albWvUCp5vE17x09f337f
d2OglFDL9UEqvp8kgZrrMzzZ0Kp2/LfV56OeTAsm/boydh4cb+Xj6a5UzpHnq6eZTeZ3uj6LT6ct
91es/77zT73W8212+e64yn+WtCy/p72t9fk68sdvy/jfOu+0HDM1Y219mdd5Mm30EeeH0j44an+1
2N/e1n1Tt/z+9h4wVg4pAwAAAL6+D0ymXdZ/Gy1TzviVkN3XM/6alB6/xjHzpFnr8q3KkxlxoiGU
PZ/IiJNRO2ZjtiZNUmvLHje5Urn8avJkLUHwvImavn/euv3TbXuYjH+PfTNLMq31Zbbuucn+mwPa
tGv83BNpo+7pk1lbO13918fP5L3m+mz0wbgvhn+Oqsd/Y30W7Ul0x8qBYzCOl25bQxtzxTaPt5ny
8X1XKie7bvP+vev7L5wDjzyOs8dXfx7pj+nZtrq+Lmx/GOs7m3fTer4tLR+XPWUq07T8jva21mev
jxsPo/y5pnn8N35+NZU/s7VMt08Kndf374N9O4yRUh0WY+WB80OttfF5xP5qsru9rZ/9lcvvbm9l
+TuOLwAAAPhuHkimXe7Jq0WEm+4kYXYZfxMtjV/eQwm9XDnny1r5Y0y307p8u/fuK9nikyQ3oZ5x
EiP+rkRu4qX7epzz2/V99qM0l0ssK05+LGcn+omyc1hneCH29fA7FvOJptLkU1SerGudGKlffmzv
pLldH5UnBtvrU6/vy7DvbwmN/jetutdmfdMtG5NOt3pchq/h65dfdOU4GRmf6pg2uNsv+ybiptrG
T3xtNj4HfUJtNlE2TJ6du23cj8coJhtzCbjW8dz3f9i36eth3VhOfD3XRW3jv6U+4zhM2zrUJb5+
5BiME59d324cny3jbaZbf2Oh5TL3vsyt27p/R/Ec2B9n5fY2K03udn0bt7XcX+N4S+vZf5XhMfVq
Pd+Wl89Pfrcu39re1vL3et54CGU2nG9LbSodO+P4nxZf/vxqPb5SpTrcPfl81fVnKCf00aTNsb3d
Nh4//7cqjc+j9lerfe0N7zXtm/rl97W3svwPuJ4BAACAr+6lk2nj1za+xSfLfon/Pb5/up5+ebu+
zxJjrcvvEicu4kTTMFEYJ7ViomBtYixOkMcJq9s6cQKrm6AZFsjokhm35X/0iZB0guM2obwRszpl
lxkiV/3ccmOU5lYW7R36KCctbx6HzN0ME0TpRFM3MTR7rTdMVCZ16Ps9mRxO/zJ8nOzvJtbS9U7X
89sRle9VjZ9xImyM20RonGhLXk8n1cb6h/+cjrdY/jS5lmodz2mCKF1+Ml83szn+E2316ffxpOyu
rXHCcXjtmIE3lJf090LjeKs45pdVXzlfda8t69e6f6O18va4lzdGP05Hff/kt7UYb6FPS+efaq3n
28zyi/PNuEzcx63LJ6ra+0D5exw9HjqN59v7+yFubVo5Hw4W43/l86srr/b4yuyDeeSO32ecr8bP
wPG4eub5v9atPV2Mx/vR+6tdS3vvyywjt5tyy41R2q0t7U3Lm8ei/A+6ngEAAICv7IFkGqlu8mzH
pBZ8miSZBgAAAAAA5EmmHUQyjS9HMg0AAAAAADZJph2g/42a5dcPwUuTTAMAAAAAgE2SaTtMf8Mj
RPyNGok0vpD7b+bcY/kbcgAAAAAAgGQaAN9H90TmMplcDk8dAwAAAMB3J5kGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAAAAFAgmQYAAAAAAAAFkmkAAAAAAABQIJkGAAAAAAAABZJpAAAA
AAAAUCCZBgAAAAAAAAWSaQAAAAD///bsmAYAGAZgGH/G+7qvR6UwsKWgCAAABDMNAAAAAAAAgpkG
AAAAAAAAwUwDAAAAAACAYKYBAAAAAABAMNMAAAAAAAAgmGkAAAAAAAAQzDQAAAAAAAAIZhoAAAAA
AAAEMw0AAAAAAACCmQYAAAAAAADBTAMAAAAAAIBgpgEAAAAAAEAw0wAAAAAAACCYaQAAAAAAABDM
NAAAAAAAAAhmGgAAAAAAAAQzDQAAAAAAAIKZBgAAAAAAAMFMAwAAAAAAgGCmAQAAAAAAQDDTAAAA
AAAAIJhpAAAAAAAAEMw0AAAAAAAACGYaAAAAAAAABDMNAAAAAAAAgpkGAAAAAAAAwUwDAAAAAACA
YKYBAAAAAABAMNMAAAAAAAAgmGkAAAAAAAAQzDQAAAAAAAAIZhoAAAAAAAAEMw0AAAAAAACCmQYA
AAAAAADBTAMAAAAAAIBgpgEAAAAAAEAw0wAAAAAAACCYaQAAAAAAABDMNAAAAAAAAAhmGgAAAAAA
AAQzDQAAAAAAAIKZBgAAAAAAAMFMAwAAAAAAgGCmAQAAAAAAQDDTAAAAAAAAIJhpAAAAAAAAEMw0
AAAAAAAACGYaAAAAAAAABDMNAAAAAAAAgpkGAAAAAAAAwUwDAAAAAACAYKYBAAAAAABAMNMAAAAA
AAAgmGkAAAAAAAAQzDQAAAAAAAAIZhoAAAAAAAAEMw0AAAAAAACCmQYAAAAAAADBTAMAAAAAAIBg
pgEAAAAAAEAw0wAAAAAAACCYaQAAAAAAABDMNAAAAAAAAAhmGgAAAAAAAAQzDQAAAAAAAIKZBgAA
AAAAAMFMAwAAAAAAgGCmAQAAAAAAQDDTAAAAAAAAIJhpAAAAAAAAEMw0AAAAAAAACGYaAAAAAAAA
BDMNAAAAAAAAgpkGAAAAAAAAwUwDAAAAAACAYKYBAAAAAABAMNMAAAAAAAAgmGkAAAAAAAAQzDQA
AAAAAAAIZhoAAAAAAAAEMw0AAAAAAACCmQYAAAAAAADBTAMAAAAAAIBgpgEAAAAAAEAw0wAAAAAA
ACCYaQAAAAAAABDMNAAAAAAAAAhmGgAAAAAAAAQzDQAAAAAAAIKZBgAAAAAAAMFMAwAAAAAAgGCm
AQAAAAAAQDDTAAAAAAAAIJhpAAAAAAAAEMw0AAAAAAAACGYaAAAAAAAABDMNAAAAAAAAgpkGAAAA
AAAAwUwDAAAAAACAYKYBAAAAAABAMNMAAAAAAAAgmGkAAAAAAAAQzDQAAAAAAAAIZhoAAAAAAAAE
Mw0AAAAAAACCmQYAAAAAAADBTAMAAAAAAIBgpgEAAAAAAEAw0wAAAAAAACCYaQAAAAAAABDMNAAA
AAAAAAg70yRJkiRJkiRJkiTd3nzQlM95pswBsAAAAABJRU5ErkJggg==
</data>

          </attachment>
      

    </bug>

</bugzilla>