GET
H/1.1
|
200
OK
|
Primary Request
Cookie set
/
Show response
www.golem.de/
Redirect Chain
-
http://golem.de/
-
https://www.golem.de/
|
176 KB
177 KB
|
136ms
67ms
|
Document
text/html |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_114-min.css
www.golem.de/staticrl/styles/
|
73 KB
20 KB
|
52ms
16ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
iqd_gzip_test.js.gz
Show response
iqdtms.golem.de/
|
23 B
491 B
|
173ms
84ms
|
Script
application/x-gzip |
77.247.84.128
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
logo-g.png
www.golem.de/staticrl/images/
|
4 KB
4 KB
|
46ms
15ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136755-174672-174670_rc.jpg
www.golem.de/1810/
|
17 KB
17 KB
|
55ms
23ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137114-176443-176439_rc.jpg
www.golem.de/1810/
|
7 KB
7 KB
|
17ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137112-176434-176431_rc.jpg
www.golem.de/1810/
|
8 KB
9 KB
|
18ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137111-176429-176426_rc.jpg
www.golem.de/1810/
|
9 KB
9 KB
|
18ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137113-176438-176435_rc.jpg
www.golem.de/1810/
|
8 KB
8 KB
|
18ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
697ms
620ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
tourbox.jpg
video.golem.de/teaser/1/1/21945/thumb-high-1000/
|
52 KB
52 KB
|
93ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
1539162941_hqdefault.jpg
video.golem.de/teaser/1/1/21934/thumb-high-1000/
|
27 KB
27 KB
|
93ms
16ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137021-175959-175955_rc.jpg
www.golem.de/1810/
|
143 KB
143 KB
|
16ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137041-176120-176118_rc.jpg
www.golem.de/1810/
|
163 KB
163 KB
|
16ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
679ms
620ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_114-min.js
Show response
www.golem.de/staticrl/scripts/
|
100 KB
41 KB
|
23ms
19ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
longread-swiper_122-min.js
Show response
www.golem.de/staticrl/scripts/
|
2 KB
1 KB
|
22ms
22ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
account_js_dt18_1_0.php
Show response
www.golem.de/abo/
|
88 B
474 B
|
18ms
16ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sdcv.js
Show response
ads.golem.de/
|
63 B
430 B
|
77ms
15ms
|
Script
application/javascript |
2a00:13c8:f5::f:4b3d:17a
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
26 KB
9 KB
|
49ms
13ms
|
Script
application/javascript |
91.215.103.64
INFONLINE-AS
|
|
|
GET
H/1.1
|
200
OK
|
iqadcontroller.js.gz
Show response
iqdtms.golem.de/cdn_golem_dt/live/
|
196 KB
52 KB
|
129ms
126ms
|
Script
text/javascript |
77.247.84.128
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
|
23 KB
9 KB
|
84ms
40ms
|
Script
text/javascript |
2a00:1450:4001:820::2002
Google LLC
|
|
|
GET
S
|
200
|
imgad
Show response
tpc.googlesyndication.com/pagead/
|
25 B
412 B
|
54ms
7ms
|
Script
application/x-javascript |
2a00:1450:4001:814::2001
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
yield.js
Show response
z.moatads.com/iqdigitaldfpprebidheader645711382528/
|
93 KB
28 KB
|
75ms
8ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
S
|
200
|
prebid29082018.js
Show response
dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/
|
101 KB
31 KB
|
150ms
11ms
|
Script
application/javascript |
2600:9000:200d:de00:1:9777:c740:21
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
apstag.js
Show response
c.amazon-adsystem.com/aax2/
|
63 KB
19 KB
|
64ms
23ms
|
Script
application/javascript |
143.204.96.211
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
default.js
Show response
ups.xplosion.de/loader/97578/
Redirect Chain
-
https://dyn.emetriq.de/loader/97578/default.js
-
https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
|
2 KB
2 KB
|
124ms
26ms
|
Script
text/javascript |
52.212.18.79
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
launch-EN92e1075482f3410d81944270acba8d90.min.js
Show response
assets.adobedtm.com/
|
123 KB
39 KB
|
28ms
28ms
|
Script
application/x-javascript |
2.18.232.23
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
adex.js
Show response
dmp.theadex.com/d/494/1428/s/
|
39 KB
14 KB
|
79ms
16ms
|
Script
application/javascript |
89.163.159.117
MYLOC-AS
|
|
|
GET
S
|
200
|
vis.js
Show response
d1pywvbolq0b04.cloudfront.net/iqdvis/golem/
|
1 KB
835 B
|
82ms
9ms
|
Script
text/javascript |
2600:9000:200d:3200:1c:9fd1:6d00:21
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
26033,26034,26035,660053,660071,660107,660089,5108423,6378523,464839
Show response
ad.yieldlab.net/yp/
|
154 B
807 B
|
85ms
20ms
|
Script
text/javascript |
2.18.232.233
Akamai Technologies
|
|
General
- Full URL
- https://ad.yieldlab.net/yp/26033,26034,26035,660053,660071,660107,660089,5108423,6378523,464839?ts=1539602498623&yl_rtb_pubkey=21719_golem
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.233
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-233.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8
|
GET
H/1.1
|
200
OK
|
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
|
22 KB
22 KB
|
16ms
15ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
|
22 KB
22 KB
|
20ms
15ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
|
21 KB
21 KB
|
18ms
17ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
258 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
325 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
|
20 KB
20 KB
|
16ms
15ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
17ms
16ms
|
Script
application/javascript |
2a00:1450:4001:81c::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:81c::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
pubads_impl_264.js
Show response
securepubads.g.doubleclick.net/gpt/
|
184 KB
63 KB
|
82ms
38ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
44ms
7ms
|
XHR
application/javascript |
143.204.96.211
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
bid
Show response
aax.amazon-adsystem.com/e/dtb/
|
47 B
341 B
|
179ms
59ms
|
XHR
text/javascript |
52.94.216.48
Amazon.com
|
|
General
- Full URL
- https://aax.amazon-adsystem.com/e/dtb/bid?src=3711&u=https%3A%2F%2Fwww.golem.de%2F&pid=3549130455261539602498848&cb=2661150535931539602498853&ws=1600x1200&v=7.18.00&t=2000&slots=%5B%7B%22sd%22%3A%22iqadtile1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile1%22%7D%2C%7B%22sd%22%3A%22iqadtile16%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22728x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile16%22%7D%2C%7B%22sd%22%3A%22iqadtile3%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile3%22%7D%2C%7B%22sd%22%3A%22iqadtile4%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%2C%22970x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile4%22%7D%2C%7B%22sd%22%3A%22iqadtile5%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%2C%22970x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile5%22%7D%2C%7B%22sd%22%3A%22iqadtile8%22%2C%22s%22%3A%5B%22300x300%22%2C%22300x600%22%2C%22300x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile8%22%7D%2C%7B%22sd%22%3A%22iqadtile9%22%2C%22s%22%3A%5B%22300x300%22%2C%22300x600%22%2C%22300x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile9%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.94.216.48
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
- 20c380a6ec53985b6410d58f337e9de1058d698cc487296d7369a714443b861b
|
GET
H/1.1
|
200
OK
|
id
Show response
dpm.demdex.net/
|
1 KB
1 KB
|
127ms
33ms
|
XHR
application/json |
54.246.133.167
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
EXfba6992d417c4e169fbd5c6ebd3dc7a3-libraryCode_source.min.js
Show response
assets.adobedtm.com/BL4e1071613a0c4a16aafa097933a3e57c/
|
105 KB
28 KB
|
21ms
20ms
|
Script
application/x-javascript |
2.18.232.23
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
153 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
147 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
126 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
768 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif-Bold.woff2
www.golem.de/staticrl/fonts/droidserif/
|
26 KB
26 KB
|
16ms
15ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
yi.js
Show response
mb.moatads.com/
|
2 KB
2 KB
|
172ms
96ms
|
Script
text/html |
52.56.194.133
Amazon.com
|
|
General
- Full URL
- https://mb.moatads.com/yi.js?ud=undefined&qn=(%2BIb%7Cj8o%3FJ(jkkeL07ta_*JRM!6t9B%2CN%3Ey)%2ChXbvU37_*NhSfBghz%5D*vOJ%23_%3DNoUA%5DRgBU_Gr1%3E%3AHuFTn%3ADXqJHZ%3BR%23yAb%2Bho8bYLaXBjA%3AmQ)%3CF!tAbjrzJ%3BgoVYGVxc%40lQQV%23tc3%2Fh%7C%3FVKV%3BW5.NO)Wx%7C*E%24%3D!L2ux%7Ci_lOfxECSR23_hFAkD%3Dv%3CN%5B.%22%24b_o%3FtVD%5D%5BpN%7CQF%40Sy7%7BA&qp=00000&is=voqBBkBBBBHhBBwBBZkJjBRCqUCY3CTCB6BXwUcu8gKCBS9lYBBBCCBpYFmR4BOZBBgSJTcBBBBBBBBHUoKOFCyz7BB3CZ6mv5TimBBe9oeCt9lXqBvBCfBBBBBBBBBBBBBBCBMBaBeBBkKzQClBeaKaMVMBj5iMPzyHVY9zqxknZlysGxCBcBBBC9CctORpnICyRBBB4OBBBBBBBBBBC9TiFF3dOKBCBBxBBBBBBBfBz1BD7fB3BpkBJUDyDCZ6IDDDCCCCDDCCCCCCCBdh2eBBBGI79kNB8DJoDBBBBCiBBiB&iv=6&qt=0&gz=0&hh=0&hn=0&tw=null&qc=0&qd=0&qf=1600&qe=1200&qh=1600&qg=1200&qm=0&qa=1600&qb=1200&qi=1600&qj=1200&qr=0&url=https%3A%2F%2Fwww.golem.de%2F&confidence=2&pcode=iqdigitaldfpprebidheader645711382528&callback=MoatNadoAllJsonpRequest_74731494
- Requested by
- Host: z.moatads.com
URL: https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yield.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.56.194.133
London, United Kingdom,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-56-194-133.eu-west-2.compute.amazonaws.com
- Software
-
nginx/1.7.9 /
- Resource Hash
- e668501a20dabf5bc0f740d59041e9b18983fbcad8a99dc1a1ee360f545c779d
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
70ms
9ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=17&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&na=2002807461&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
918034,918035,918036,918038,918037,918039,918040,5196623,918310
Show response
ad.yieldlab.net/yp/
|
154 B
807 B
|
20ms
19ms
|
Script
text/javascript |
2.18.232.233
Akamai Technologies
|
|
General
- Full URL
- https://ad.yieldlab.net/yp/918034,918035,918036,918038,918037,918039,918040,5196623,918310?ts=1539602498623&yl_rtb_pubkey=781119_golem
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.233
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-233.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8
|
GET
H/1.1
|
200
OK
|
Cookie set
dest5.html
iqdigital.demdex.net/
Frame 8103
|
0
0
|
165ms
47ms
|
Document
text/html |
54.154.86.186
Amazon.com
|
|
General
- Full URL
- https://iqdigital.demdex.net/dest5.html?d_nsid=0
- Requested by
- Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
54.154.86.186
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-54-154-86-186.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
|
GET
H/1.1
|
200
OK
|
ibs:dpid=411&dpuuid=W8R4QwAACfgg9RKk
dpm.demdex.net/
Redirect Chain
-
https://cm.everesttech.net/cm/dd?d_uuid=10813531654945682143188154401728892417
-
https://dpm.demdex.net/ibs:dpid=411&dpuuid=W8R4QwAACfgg9RKk
|
42 B
769 B
|
32ms
31ms
|
Image
image/gif |
54.246.133.167
Amazon.com
|
|
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
21 B
712 B
|
87ms
18ms
|
XHR
application/json |
185.33.223.220
AppNexus
|
|
|
POST
H/1.1
|
204
No Content
|
cdb
Show response
bidder.criteo.com/
|
0
186 B
|
60ms
14ms
|
XHR
text/plain |
178.250.2.89
ASN-CRITEO-EUROPE
|
|
|
GET
S
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.1.13/
|
4 KB
2 KB
|
55ms
6ms
|
Script
application/javascript |
2600:9000:200d:a600:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
6ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=0&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=0&zMoat_YI1=0&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=22472409&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
29ms
29ms
|
Script
text/javascript |
52.212.18.79
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=0&screen=1200x1600&event_id=page_view&_sid=97578&_ver=0.1.13&_seg=jsonp&_=974473950918
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.212.18.79
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-212-18-79.eu-west-1.compute.amazonaws.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
- 18399409a85594ff2fae84d5bd21f911b6327e0b212405133bd58754f4f5e27c
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
22 KB
7 KB
|
56ms
55ms
|
XHR
text/javascript |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1608060368739750&correlator=2145406296335561&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21062650%2C21062577&vrg=264&guci=1.2.0.0.2.2.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C728x90&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile1%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D1%26m_mv%3D80%2C70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=7&abxe=1&lmt=1539602499&dt=1539602499492&dlt=1539602498176&idt=1167&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=0&adk=242336818&gut=v2&ifi=1&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=47&icsg=42949715968&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x-1&msz=1000x-1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&fws=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.16.162
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 9633c400a446273656ca565e55de70519ce5d3c9834f02ac17117d1504affc63
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
pubads_impl_rendering_264.js
Show response
securepubads.g.doubleclick.net/gpt/
|
75 KB
27 KB
|
44ms
44ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.16.162
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
sffe /
- Resource Hash
- 69f010ce6969b6ef9a337ee45c7d1b35fe5b6e83e10a1f035f166c1ad1f1e7b2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-29/html/
|
0
0
|
8ms
8ms
|
Other
text/html |
2a00:1450:4001:814::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:814::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
22 KB
6 KB
|
186ms
185ms
|
XHR
text/javascript |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1608060368739750&correlator=2145406296335561&output=json_html&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21062650%2C21062577&vrg=264&guci=1.2.0.0.2.2.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x333%7C1000x250%7C1000x100%7C970x90%7C940x250%7C970x250%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile3%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D3%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=7&abxe=1&lmt=1539602499&dt=1539602499550&dlt=1539602498176&idt=1167&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=2638043459&gut=v2&ifi=2&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=48&icsg=2241972971520&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x10651&msz=99x1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&fws=128
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.16.162
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- f2a3ae0a2aade858fa2ebe1d687695e83c0a3012dfbbc786cd9f3104cd9a68d3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
26 KB
7 KB
|
324ms
323ms
|
XHR
text/javascript |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1608060368739750&correlator=2145406296335561&output=json_html&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21062650%2C21062577&vrg=264&guci=1.2.0.0.2.2.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x333%7C1000x167%7C1000x125%7C1000x100%7C970x250%7C800x250%7C970x90%7C728x90%7C660x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile16%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D16%26m_mv%3DslotNoSlotData%26m_gv%3DslotNoSlotData&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=7&abxe=1&lmt=1539602499&dt=1539602499608&dlt=1539602498176&idt=1167&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=3736976088&gut=v2&ifi=3&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=49&icsg=2241972971520&std=0&csl=81&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=99x1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&fws=128
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.16.162
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 3661be8761631375ba3857628a44911f9f87bccede66684a59c075307a2112c8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
6ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=44&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1007636441&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
74 KB
28 KB
|
58ms
18ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
golem_csi-121-min.js
Show response
www.golem.de/staticrl/scripts/adsense/
|
2 KB
1 KB
|
23ms
22ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gx-ads.js
Show response
ads.golem.de/track.ads/
|
124 B
492 B
|
15ms
15ms
|
Script
application/javascript |
2a00:13c8:f5::f:4b3d:17a
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
23 KB
7 KB
|
349ms
349ms
|
XHR
text/javascript |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1608060368739750&correlator=2145406296335561&output=json_html&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21062650%2C21062577&vrg=264&guci=1.2.0.0.2.2.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C300x300%7C300x600%7C300x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile8%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D8%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=7&abxe=1&lmt=1539602499&dt=1539602499775&dlt=1539602498176&idt=1167&frm=20&biw=1585&bih=1200&oid=3&adx=993&ady=840&adk=1289509276&gut=v2&ifi=4&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=60&icsg=2825744894395376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x344&msz=99x1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&fws=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.16.162
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- f63aa01039149e3d1de90c4a01f612fc78cdf6b6e774993f0359d106ac58f7be
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
22 KB
7 KB
|
503ms
502ms
|
XHR
text/javascript |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1608060368739750&correlator=2145406296335561&output=json_html&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21062650%2C21062577&vrg=264&guci=1.2.0.0.2.2.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x500%7C1000x333%7C1000x250%7C1000x167%7C1000x125%7C1000x100%7C970x90%7C800x250%7C970x250%7C970x90%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile4%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D4%26m_mv%3D60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=7&abxe=1&lmt=1539602499&dt=1539602499824&dlt=1539602498176&idt=1167&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=1193&adk=780685045&gut=v2&ifi=5&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=60&icsg=2825744894395376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x16&msz=99x1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&fws=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.16.162
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 5a3deef5e530b64438564db35cae5c43ff61b20216e1d8fea6986f30daeb7b20
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
125ms
28ms
|
Script
application/javascript |
52.212.57.107
Amazon.com
|
|
|
GET
H/1.1
|
204
No Content
|
m
p.yieldlab.net/
|
0
336 B
|
95ms
14ms
|
Image
text/plain |
85.114.144.197
MYLOC-AS
|
|
General
- Full URL
- https://p.yieldlab.net/m?dm_id=21719&ext_id=BSasESwABD_ZES_0Wif-BiUABifkBiUFEifABifABifABfrr&ddata_seg=e0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
85.114.144.197
, Germany,
ASN24961
(MYLOC-AS, DE),
- Reverse DNS
- lb.yieldlab.net
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
DENY |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
2.gif
xpl.theadex.com/d/327/i/
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasESwABD_ZES_0Wif-BiUABifkBiUFEifABifABifABfrr
-
https://xpl.theadex.com/d/327/i/2.gif?_sc=1001618631321390153&axd_pid=22&axd_fuid=BSasESwABD_ZES_0Wif-BiUABifkBiUFEifABifABifABfrr
|
43 B
717 B
|
18ms
18ms
|
Image
image/gif |
89.163.159.109
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
a.js
d.df-srv.de/match/
|
6 B
228 B
|
64ms
11ms
|
Image
text/html |
2001:16e0:10a:1::c2:1
RKOM R-KOM Regens...
|
|
|
GET
H/1.1
|
200
OK
|
tx.io
Show response
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=001750cb843e6ac1b5bc47842&ep=1565441301&vr=411&id=s9k4qs&dntt=0&...
-
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=001750cb843e6ac1b5bc47842&ep=1565441301&vr=411&id=s9k4qs&dntt=0&...
|
0
694 B
|
11ms
11ms
|
Script
application/x-javascript |
91.215.103.65
INFONLINE-AS
|
|
General
- Full URL
- https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=001750cb843e6ac1b5bc47842&ep=1565441301&vr=411&id=s9k4qs&dntt=0<=1539602499878&ev=&cs=k53yq6&mo=1&sr=71
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
91.215.103.65
, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- de3.ioam.de
- Software
-
nginx /
BLACKBIRD-RCV v1.04.6 0028
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
IjvnOpbzskTW
Show response
cdn.onthe.io/io.js/
|
52 KB
17 KB
|
45ms
12ms
|
Script
text/javascript |
104.248.100.80
DigitalOcean
|
|
|
GET
S
|
200
|
ga.js
Show response
www.google-analytics.com/
|
45 KB
17 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:814::200e
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
RC06273f0c936b473482bd76df6eaba8a7-source.min.js
Show response
assets.adobedtm.com/BL4e1071613a0c4a16aafa097933a3e57c/
|
578 B
833 B
|
9ms
9ms
|
Script
application/x-javascript |
2.18.232.23
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
s56655356883531
Show response
iqdigitalmediamarketinggmbh.sc.omtrdc.net/b/ss/iqdmmgglobalprod/10/JS-v.2.9.0.6.2-L8UK/
|
899 B
2 KB
|
123ms
57ms
|
Script
application/x-javascript |
172.82.228.19
Adobe Systems Inc.
|
|
General
- Full URL
- https://iqdigitalmediamarketinggmbh.sc.omtrdc.net/b/ss/iqdmmgglobalprod/10/JS-v.2.9.0.6.2-L8UK/s56655356883531?AQB=1&ndh=1&pf=1&callback=s_c_il[1].doPostbacks&et=1&t=15%2F9%2F2018%2011%3A21%3A39%201%200&d.&nsid=0&jsonv=1&.d&mid=11426032157103850683234836750593996987&aamlh=6&ce=UTF-8&pageName=%2F&g=https%3A%2F%2Fwww.golem.de%2F&cc=EUR&ch=D%3Dv8&server=D%3Dv3&events=event1%2Cevent2&aamb=6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y&c1=D%3Dv2&v1=D%3DpageName&c2=D%3Dv3&v2=https%3A%2F%2Fwww.golem.de%2F&v3=www.golem.de&c6=D%3Dv7&c7=D%3Dv8&v7=homepage&v8=homepage&c10=D%3Dv11&v11=non-HUB&c27=D%3Dv28&c28=D%3Dv29&v28=First%20page%20view%20or%20cookies%20not%20supported&c29=D%3Dv30&v29=15.10.2018-11%3A21&v30=1539602499901&c32=D%3Dv33&c33=D%3Dv34&v33=default&v34=%2F&c40=www&c44=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20microsoft%2C%20netscape%2C%20browser%2C%20daily%2C%20headline%2C%20business%2C%20top%2C%20newslink%2C%20newslinks%2C%20stories%2C%20software%2C%20press%20release%2C%20Pressemitteilungen%2C%20Schlagzeilen%2C%20Nachrichten%2C%20deutsch%2C%20neu%2C%20aktuell%2C%20online%2C%20www%2C%20today%2C%20todays%2C%20up-to-date%20news%2C%20fast%20news%2C%20intranet%20news%2C%20world%2C%20international%2C%20german%2C%20financial%2C%20ipo%2C%20business&c45=D%3Dv45&v45=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaft%20%C3%BCber%20Hardware%2C%20Software%2C%20Telekommunikation%2C%20Games&c47=Default&c49=Default&c50=%2F&c51=11&c75=2018-10-08T09%3A02%3A47Z%7Cv.2.9.0.6.2&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&mcorgid=41833DF75A550B4B0A495DA6%40AdobeOrg&AQE=1
- Requested by
- Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/BL4e1071613a0c4a16aafa097933a3e57c/EXfba6992d417c4e169fbd5c6ebd3dc7a3-libraryCode_source.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
172.82.228.19
Lehi, United States,
ASN15224
(OMNITURE - Adobe Systems Inc., US),
- Reverse DNS
- *.sc.omtrdc.net
- Software
-
Omniture DC/2.0.0 /
- Resource Hash
- ad193e4bc2ded2978fe66af53cd54919a7512397ac5f470490689df7350a3b76
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
swiper-4.2.2.custom.min.js
Show response
www.golem.de/staticrl/scripts/external/
|
69 KB
23 KB
|
17ms
17ms
|
XHR
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_cpxl_113-min.js
Show response
www.golem.de/staticrl/scripts/
|
8 KB
4 KB
|
16ms
15ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
s42-snap.jpg
video.golem.de/teaser/1/1/21937/thumb-high-1000/
|
107 KB
108 KB
|
15ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
parcour-snap.jpg
video.golem.de/teaser/1/1/21941/thumb-high-1000/
|
130 KB
131 KB
|
16ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
athlon-snap.jpg
video.golem.de/teaser/1/1/21927/thumb-high-1000/
|
94 KB
94 KB
|
66ms
33ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137109-176425-176424_rc.jpg
www.golem.de/1810/
|
9 KB
9 KB
|
18ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137094-176356-176353_rc.jpg
www.golem.de/1810/
|
8 KB
9 KB
|
15ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137108-176420-176417_rc.jpg
www.golem.de/1810/
|
9 KB
9 KB
|
17ms
17ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137100-176386-176385_rc.jpg
www.golem.de/1810/
|
6 KB
7 KB
|
17ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137076-176264-176261_rc.jpg
www.golem.de/1810/
|
7 KB
7 KB
|
16ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
135633-172257-172254_rc.jpg
www.golem.de/1810/
|
68 KB
69 KB
|
38ms
37ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137106-176416-176413_rc.jpg
www.golem.de/1810/
|
5 KB
6 KB
|
39ms
38ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137083-176305-176302_rc.jpg
www.golem.de/1810/
|
12 KB
13 KB
|
39ms
38ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137105-176412-176409_rc.jpg
www.golem.de/1810/
|
6 KB
6 KB
|
29ms
29ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137104-176408-176405_rc.jpg
www.golem.de/1810/
|
3 KB
4 KB
|
37ms
37ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137103-176404-176401_rc.jpg
www.golem.de/1810/
|
10 KB
10 KB
|
21ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136849-175127-175124_rc.jpg
www.golem.de/1810/
|
8 KB
8 KB
|
21ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137102-176400-176397_rc.jpg
www.golem.de/1810/
|
7 KB
7 KB
|
21ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
136966-175698-175695_rc.jpg
www.golem.de/1810/
|
5 KB
5 KB
|
21ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137101-176390-176387_rc.jpg
www.golem.de/1810/
|
9 KB
9 KB
|
21ms
18ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137099-176384-176381_rc.jpg
www.golem.de/1810/
|
7 KB
7 KB
|
50ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137096-176364-176363_rc.jpg
www.golem.de/1810/
|
6 KB
6 KB
|
32ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137098-176380-176377_rc.jpg
www.golem.de/1810/
|
7 KB
8 KB
|
21ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137097-176375-176372_rc.jpg
www.golem.de/1810/
|
8 KB
9 KB
|
20ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137086-176348-176347_rc.jpg
www.golem.de/1810/
|
5 KB
6 KB
|
21ms
19ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137095-176370-176365_rc.jpg
www.golem.de/1810/
|
6 KB
6 KB
|
54ms
27ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137093-176345-176342_rc.jpg
www.golem.de/1810/
|
9 KB
10 KB
|
34ms
26ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137092-176335-176332_rc.jpg
www.golem.de/1810/
|
7 KB
7 KB
|
27ms
20ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137090-176341-176336_rc.jpg
www.golem.de/1810/
|
4 KB
5 KB
|
27ms
26ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137089-176319-176316_rc.jpg
www.golem.de/1810/
|
5 KB
6 KB
|
28ms
27ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137088-176327-176320_rc.jpg
www.golem.de/1810/
|
7 KB
7 KB
|
27ms
26ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
137087-176315-176312_rc.jpg
www.golem.de/1810/
|
9 KB
9 KB
|
24ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
133136-156931-i_rc.jpg
www.golem.de/1803/
|
10 KB
10 KB
|
29ms
25ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136829-175839-175836_rc.jpg
www.golem.de/1810/
|
20 KB
21 KB
|
29ms
26ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_137004-175995-175992_rc.jpg
www.golem.de/1810/
|
18 KB
18 KB
|
29ms
25ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136948-175610-175608_rc.jpg
www.golem.de/1810/
|
26 KB
26 KB
|
28ms
24ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_137020-175952-175950_rc.jpg
www.golem.de/1810/
|
20 KB
20 KB
|
28ms
25ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_137024-176004-176002_rc.jpg
www.golem.de/1810/
|
22 KB
23 KB
|
44ms
33ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136919-175443-175441_rc.jpg
www.golem.de/1810/
|
22 KB
22 KB
|
34ms
32ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136995-175848-175846_rc.jpg
www.golem.de/1810/
|
23 KB
24 KB
|
16ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136878-175347-175344_rc.jpg
www.golem.de/1810/
|
18 KB
18 KB
|
26ms
25ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136844-175474-175472_rc.jpg
www.golem.de/1810/
|
22 KB
22 KB
|
16ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136880-175251-175249_rc.jpg
www.golem.de/1810/
|
25 KB
25 KB
|
26ms
25ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136543-173728-173726_rc.jpg
www.golem.de/1809/
|
28 KB
28 KB
|
18ms
16ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136936-175648-175646_rc.jpg
www.golem.de/1810/
|
22 KB
23 KB
|
16ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136698-174403-174401_rc.jpg
www.golem.de/1810/
|
21 KB
22 KB
|
15ms
14ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136892-175315-175313_rc.jpg
www.golem.de/1810/
|
26 KB
26 KB
|
16ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_136868-175224-175222_rc.jpg
www.golem.de/1810/
|
22 KB
22 KB
|
16ms
15ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
cpx.php
cpx.golem.de/
|
42 B
420 B
|
96ms
23ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:182
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/
Frame 80A3
|
74 KB
27 KB
|
30ms
12ms
|
Script
text/javascript |
2a00:1450:4001:814::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:814::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e195ed8d9e79ce4d32ac163cb8e9101fcc6bea6a812a30d58a6d73515ddd3329
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
imgad
pagead2.googlesyndication.com/pagead/
|
2 KB
3 KB
|
23ms
12ms
|
Image
image/png |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/imgad?id=CICAgIDQ04jCzgEQARgBKAEyCLeTE4Yu5hvQQMa81o0F
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 5b54ebb2ed254f7922b3af74610d4487b245899ac8e4178f4c6553b6781da60a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
osd.js
Show response
pagead2.googlesyndication.com/pagead/
|
73 KB
27 KB
|
13ms
12ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/osd.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- fdfc01efb2956b260c841eadb2948b85dda3184d9a933541e933e70ed188817a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/
Frame 1338
|
74 KB
27 KB
|
14ms
6ms
|
Script
text/javascript |
2a00:1450:4001:814::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:814::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e195ed8d9e79ce4d32ac163cb8e9101fcc6bea6a812a30d58a6d73515ddd3329
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 80A3
|
0
72 B
|
46ms
45ms
|
Image
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsusu7NzNuoISlMu3PhmFsfQ0Ri6zXZaZqtau36XeZxuRLk07L7Ga9wHxpRoxqNTNKPe-FKqvklRX1y3SBohJk15ms1tuTBQUK_yLE7DZOVi94D6Vhhsg6PBXG5v5rNrsdX4qg_qXgFqzUHncs-sjVqn0FGEXoubX67dwiFZ0c3iTO3DxzESLVPHM0DTgureqdlHZFZnFS8uVldeMu9Qov3ga7Q9HX-ZShuPG_xZ5KJdOjOWsNWFgqE4Uzc&sai=AMfl-YSELP1MI34cBNPkZNCxQI7rQTWGyywieSjEiwpb0P9FhNS-2p5zaWpsWLuNyiurFcYs3wK8d_5HbrF84BAsfIM7lKzjzzXRjb2FqoJuow&sig=Cg0ArKJSzIpNGHa8a-5VEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.16.162
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 1338
|
0
47 B
|
46ms
45ms
|
Image
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstVISbanIGDw9woqTLVwI7k_PaQZkP53u9-JCEn7IAlGWsBX-4TBDnL10cn3Rle-ZbQXsL6-QaZmsbuK_vK5E2HjIOb26KlmIkqb2EKqxWn-gmaPfpJMpAROyDoCEAmqxGU4VeRHaJShJcei-CEcfG18iQfBaI0XgyiIkbUEs4eNL-wG4SqDB8y5N9JgEar3OTu29w0PQqP8wxBSE2-F8fA0oJ1hwrn61cqW1WCgaUb-AKAFfT7iRCw4m8&sai=AMfl-YRyu9cwp1qQ_FU_WJSz5ukVigSbGoQAv5K2IkGYPJwm5af9I8J_cSRAVrYUoxM5HGNkelOurm0aOa9JkhGbrLR0qiAfv3uahKEhG-rW&sig=Cg0ArKJSzHDEWR8-vMHOEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.16.162
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
50ms
49ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile1&zMoatRendered=1&zMoatSlotTargetingLoaded=1&zMoatSlotTargetingSet=1&zMoatPageDataTargetingSet=1&zMoatSafetyTargetingSet=1&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=168077864&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
Frame 3F4A
|
74 KB
27 KB
|
23ms
18ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- bd3584b1408380e4f3cfbcf229de40a5df42982b192159b9145757a5d269eadf
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/
Frame 3F4A
|
74 KB
27 KB
|
8ms
7ms
|
Script
text/javascript |
2a00:1450:4001:814::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:814::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e195ed8d9e79ce4d32ac163cb8e9101fcc6bea6a812a30d58a6d73515ddd3329
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 3F4A
|
0
47 B
|
43ms
43ms
|
Image
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvvokAVbfludEzhhzMm2fvTMLvF9BHQ3DEcI0ZvI7BhGljxEM8cMFgrFGgeBSY3b1l4QlCnzacO2BJhJyVxs0ML6SMeEbKuvm59tpsFltdZ3NLqvyaodzL3f5VoszYjDdF_ufOWydSFf62DtePLwqVyMnmt0WMyMCF-OnH7Se4WO3eOJxL8HDUbdxpzsTMdzT3QGdLmF_IZt621SG3wOdvHl5rrrAdgWdCm2lQ5bg1AMne9ZSJk7HTGTATBMOM&sai=AMfl-YSw927nzCjVkzrtgiubNG_xIU8oSphoKaofQzGLeLRfDZf3ZbOiPaorPIiH1BpBWsqzzzknSeA0jTGZBk84JvKN0xRvOI4LH_rqSTfK9IBl2u9iZblEHBsJseg&sig=Cg0ArKJSzEaGRAM2X9A-EAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.16.162
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
/
golem.whitepaperdb.de/
Frame 3269
|
0
0
|
79ms
20ms
|
Document
text/html |
62.138.242.228
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://golem.whitepaperdb.de/?tag=golem
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.138.242.228
, Germany,
ASN61157
(PLUSSERVER-ASN1, DE),
- Reverse DNS
- mail.whitepaperdb.de
- Software
-
nginx /
PHP/7.0.32
PleskLin
- Resource Hash
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/
Frame 8D92
|
74 KB
27 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:814::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:814::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e195ed8d9e79ce4d32ac163cb8e9101fcc6bea6a812a30d58a6d73515ddd3329
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 8D92
|
0
47 B
|
41ms
41ms
|
Image
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvYatErmdcAqpEjSTlC20FKppv-8jec3e4oR8P9BGFAJT7Anr15N-o9SrzwmAuA0w2Kx-MPPaoIlFEeHYlbU9QoFGrHiMIjKOmqEfH3iZ-gDQ_guhJ2PrtNfz5-GVjkyUzAhckkVmRZUU7t-Sk6f5ckaVDZ1qbZRpRvK28h6tnwfzIkpxfmscs3_ACHlXR1sue-uDmML8DyT1ivKERbmUFpU_LvoQ9U3dLeJPt8D33uT5KK8Fv_twvpHKxW02oaFFn0vMUhj3xUU9SiFQ&sai=AMfl-YRZOhMTsVifgN5WXFHxDmUzdzNdxykpdJPouDQm5jA_2iI0-0UHuJHTEmc8LqtNE1joQ1c3kZq43YQKE5YeScB4C4ysNkawQoF1HICmIKMFs3AOEdsKuYaS3hc&sig=Cg0ArKJSzEL8jsuOXJoUEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.16.162
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
/
iqdigital.demdex.net/event/
|
42 B
629 B
|
38ms
37ms
|
Image
image/gif |
54.154.86.186
Amazon.com
|
|
|
GET
S
|
200
|
collect
stats.g.doubleclick.net/r/
Redirect Chain
-
https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=895175949&utmhn=www.golem.de&utme=8(HTML5)9(1)11(2)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0...
-
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1893485975.1539602500&jid=1225137513&_v=5.7.2&z=895175949
|
35 B
136 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:400c:c0b::9c
Google LLC
|
|
General
- Full URL
- https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1893485975.1539602500&jid=1225137513&_v=5.7.2&z=895175949
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:400c:c0b::9c
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
sp_CUHl-113746-i_rc.jpg
www.golem.de/9477/
|
68 B
486 B
|
55ms
54ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
ibs:dpid=385489&dpuuid=6612542386376275987
dpm.demdex.net/
Redirect Chain
-
https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fdpm.demdex.net%2Fibs%3Adpid%3D385489%26dpuuid%3D%25%25COOKIE%25%25
-
https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6612542386376275987
|
42 B
769 B
|
31ms
31ms
|
Image
image/gif |
54.246.133.167
Amazon.com
|
|
|
GET
S
|
200
|
osd_listener.js
Show response
tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/
Frame 54F3
|
74 KB
27 KB
|
7ms
6ms
|
Script
text/javascript |
2a00:1450:4001:814::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/js/r20181008/r20110914/activeview/osd_listener.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_264.js?21062650
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
2a00:1450:4001:814::2001
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e195ed8d9e79ce4d32ac163cb8e9101fcc6bea6a812a30d58a6d73515ddd3329
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 54F3
|
0
56 B
|
47ms
43ms
|
Image
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvX-34JJ263VotrWy7XPQoV4cxbvXqV7hipYaeGwdTOygFpGKurgbYE1NFJOTmuYheCEyoros5Am5ZtJTeMGhTDLYbgCq3hLbQNG84qVJEc353xKy6wWs66w4perPzPtDvuE3SwIrWGM18m0oOSlisIiTgXe-0u1ghaJ3Arb13PWOz9KsJPEzNLlU5K2va2aOpk8fJmP1CEOBUXv9_x3h0dK0Tdh3Q33FYN2Ao7RQM58rtkwOWdzDpXTls&sai=AMfl-YRSjibKDmexhORWWlJF-3Khwv-Z_lML1lff4PJb8UCpqlODmxawx1wtO_mO1PqkBA_XR90GM8HpVpsQ2SbYfLq7qvE1kwtjw2GSZIaZOWQZFTYc7Kfs2H0Ih8w&sig=Cg0ArKJSzCMlv3IxiGbkEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
172.217.16.162
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
publishertag.prebid.js
Show response
static.criteo.net/js/ld/
|
35 KB
12 KB
|
63ms
13ms
|
Script
text/javascript |
178.250.2.130
ASN-CRITEO-EUROPE
|
|
|
GET
H/1.1
|
200
OK
|
trial-medrec-m7-140.shtml
Show response
www.golem.de/microsite/abo/
Frame FE5C
|
498 B
782 B
|
17ms
16ms
|
Document
text/html |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
66ms
1ms
|
XHR
text/javascript |
188.40.114.5
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:uniques_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:79055c955.bb8857a3a_1539602500779,cdn_version:3]&s=6acc7c777cce3be138a245218c439c54&1539602500792
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.114.5
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.5.114.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/uniques/
|
33 B
515 B
|
64ms
1ms
|
Script
text/html |
188.40.114.5
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
60ms
1ms
|
XHR
text/javascript |
188.40.114.5
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:visits_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:79055c955.bb8857a3a_1539602500779,cdn_version:3]&s=6acc7c777cce3be138a245218c439c54&__io=79055c955.bb8857a3a_1539602500779&1539602500798
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.114.5
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.5.114.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
55ms
1ms
|
XHR
text/javascript |
188.40.114.5
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:pageviews[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,custom_page_type:Home%20page,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:79055c955.bb8857a3a_1539602500779,cdn_version:3]&s=6acc7c777cce3be138a245218c439c54&1539602500804
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.114.5
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.5.114.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame 24B1
|
0
0
|
146ms
26ms
|
Document
text/html |
52.208.127.173
Amazon.com
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
62ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
ca-pub-2342548244565729.js
Show response
pagead2.googlesyndication.com/pub-config/r20160913/
|
133 B
276 B
|
7ms
6ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-2342548244565729.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20181008/r20180604/
Frame 078A
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:818::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20181008/r20180604/zrt_lookup.html
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/
Frame 8913
|
196 KB
73 KB
|
26ms
25ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 7b21595c32caa7b47cec4b349b47e05298c32c5cf065915c2bc6058c1d7f7522
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
44ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
47ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
45ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
rmpslider-rl_122-min.js
Show response
www.golem.de/staticrl/scripts/radiant/
|
16 KB
7 KB
|
24ms
23ms
|
XHR
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame 80A3
|
261 KB
81 KB
|
7ms
6ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame 1338
|
261 KB
81 KB
|
9ms
6ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
11ms
11ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile3&zMoatRendered=2&zMoatSlotTargetingLoaded=2&zMoatSlotTargetingSet=2&zMoatPageDataTargetingSet=2&zMoatSafetyTargetingSet=2&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1404715193&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame 3F4A
|
261 KB
81 KB
|
7ms
7ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 3F4A
|
215 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame 8D92
|
261 KB
81 KB
|
6ms
6ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 8D92
|
217 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
434ms
119ms
|
XHR
application/json |
52.216.228.163
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
homadclienthttpsle-json.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
286 B
677 B
|
61ms
15ms
|
XHR
application/json |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
rmp.min.js
Show response
www.golem.de/staticrl/scripts/radiant/4.9.1/js/
|
378 KB
110 KB
|
21ms
20ms
|
XHR
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_CUHl-524963-i_rc.jpg
www.golem.de/2910/adsmodules/
|
68 B
486 B
|
52ms
51ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
Frame 3F4A
|
109 B
171 B
|
16ms
15ms
|
Script
application/javascript |
2a00:1450:4001:819::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:819::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
Frame 3F4A
|
109 B
171 B
|
16ms
16ms
|
Script
application/javascript |
2a00:1450:4001:81c::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:81c::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
ca-pub-6583763995580712.js
Show response
pagead2.googlesyndication.com/pub-config/r20160913/
Frame 3F4A
|
68 B
175 B
|
7ms
6ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-6583763995580712.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
moatad.js
Show response
z.moatads.com/iqdigital277772407506/
Frame 54F3
|
261 KB
81 KB
|
6ms
6ms
|
Script
application/x-javascript |
2.18.235.40
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
5ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile16&zMoatRendered=3&zMoatSlotTargetingLoaded=3&zMoatSlotTargetingSet=3&zMoatPageDataTargetingSet=3&zMoatSafetyTargetingSet=3&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1134021812&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
309 B
975 B
|
70ms
8ms
|
XHR
application/json |
143.204.101.112
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
spalte_rechts_Abo_7_2b_300x140px.png
www.golem.de/microsite/abo/trial/
Frame FE5C
|
11 KB
11 KB
|
15ms
15ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 46C3
|
0
0
|
177ms
175ms
|
Document
text/html |
2a00:1450:4001:818::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=3446949021&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500875&bpp=29&bdt=2697&fdt=37&idt=564&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&correlator=7497780083675&frm=20&pv=2&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4021&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=636311223&ifi=6&fsb=1&xpc=mrJp7zaLeQ&p=https%3A//www.golem.de&dtd=597
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
1ms
0ms
|
XHR
text/javascript |
188.40.114.5
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
|
187 KB
51 KB
|
10ms
9ms
|
XHR
application/javascript |
143.204.101.112
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
6ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile8&zMoatRendered=4&zMoatSlotTargetingLoaded=4&zMoatSlotTargetingSet=4&zMoatPageDataTargetingSet=4&zMoatSafetyTargetingSet=4&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=780140122&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/
Frame 66A8
|
196 KB
0
|
26ms
25ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 7b21595c32caa7b47cec4b349b47e05298c32c5cf065915c2bc6058c1d7f7522
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame DA70
|
0
0
|
129ms
128ms
|
Document
text/html |
2a00:1450:4001:818::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=2459742235&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500912&bpp=20&bdt=2734&fdt=685&idt=686&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120&correlator=7497780083675&frm=20&pv=1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4782&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=1823298079&ifi=7&fsb=1&xpc=iFfBv6gKMH&p=https%3A//www.golem.de&dtd=695
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/
Frame EE78
|
196 KB
0
|
26ms
25ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 7b21595c32caa7b47cec4b349b47e05298c32c5cf065915c2bc6058c1d7f7522
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame E99D
|
0
0
|
131ms
131ms
|
Document
text/html |
2a00:1450:4001:818::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=653379571&w=520&lmt=1539602501&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1539602500932&bpp=6&bdt=2755&fdt=800&idt=812&shv=r20181008&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=7497780083675&frm=20&pv=1&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=730356177&ga_fc=1&iag=0&icsg=2814752585694976&dssz=86&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5484&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=154924829&ifi=8&fsb=1&xpc=jLLzjGfNMC&p=https%3A//www.golem.de&dtd=834
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
pixel.gif
px.moatads.com/
|
43 B
409 B
|
6ms
6ms
|
Image
image/gif |
2.18.235.40
Akamai Technologies
|
|
General
- Full URL
- https://px.moatads.com/pixel.gif?e=43&t=1539602499028&de=361518726097&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile4&zMoatRendered=5&zMoatSlotTargetingLoaded=5&zMoatSlotTargetingSet=5&zMoatPageDataTargetingSet=5&zMoatSafetyTargetingSet=5&zMoatEmptySlot=0&zMoatNadoDataLoadTime=334&zMoatAllDataLoadTime=334&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=334&zMoat_YI3=334&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=795903487&cs=0
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_256_GCM
- Server
-
2.18.235.40
, European Union,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-235-40.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
DATA
|
200
OK
|
truncated
Show response
/
|
187 KB
0
|
|
Script
text/javascript |
|
|
|
GET
S
|
200
|
vgs.json
Show response
cdn.radiantmediatechs.com/rmp/rr/
|
4 KB
2 KB
|
100ms
34ms
|
XHR
application/json |
2606:4700:30::6818:6624
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
|
57 KB
12 KB
|
17ms
16ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/
Frame 47DF
|
196 KB
0
|
26ms
25ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 7b21595c32caa7b47cec4b349b47e05298c32c5cf065915c2bc6058c1d7f7522
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/
Frame ABE4
|
196 KB
0
|
26ms
25ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 7b21595c32caa7b47cec4b349b47e05298c32c5cf065915c2bc6058c1d7f7522
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 2FA0
|
0
0
|
306ms
305ms
|
Document
text/html |
2a00:1450:4001:818::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=3930630304&adf=3574163827&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1539602501226&bpp=14&bdt=1528&fdt=1346&idt=1348&shv=r20181008&cbv=r20180604&saldr=aa&correlator=7497780083675&frm=23&ife=4&pv=2&ga_vid=1893485975.1539602500&ga_sid=1539602500&ga_hid=216572098&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=393&ady=11470&biw=1585&bih=1200&isw=800&ish=250&ifk=3088420174&scr_x=0&scr_y=0&eid=21060853%2C828064255&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=1457
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:818::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
osd.js
Show response
pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/
Frame 3F4A
|
73 KB
26 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/osd.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181008/r20180604/show_ads_impl.js
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- fdfc01efb2956b260c841eadb2948b85dda3184d9a933541e933e70ed188817a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 8D92
|
42 B
178 B
|
47ms
47ms
|
Image
image/gif |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssZ11ev5flBYJp33B6TGJQ2jlboTEbonHgTcllB9dTXc-pNk2hu0KOgE5L-n6v3YUizqnXgP3dtRR-iWAoC9S1EcsZ3MZfJAmJm0mI&sig=Cg0ArKJSzKZflRhKrXRDEAE&adk=1289509276&tt=-1&bs=1585%2C1200&mtos=1205,1205,1205,1205,1205&tos=1205,0,0,0,0&p=848,993,1098,1293&mcvt=1205&rs=3&ht=0&tfs=129&tls=1334&mc=1<e=1&bas=0&bac=0&avms=geo&rst=1539602500646&rpt=611&ps=1585%2C12327&ss=1600%2C1200&pt=-1&deb=1-5-8-18-10-26-34-1&tvt=1313&r=v&id=osdim&uc=8&tgt=IFRAME&cl=1&cec=8&clc=1&cac=0&cd=300x250&v=r20181008
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- SPDY
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
117ms
104ms
|
XHR
application/json |
52.216.228.163
Amazon.com
|
|
General
- Full URL
- https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=2674115549
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.216.228.163
Ashburn, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H/1.1
|
200
OK
|
homadclienthttpsle-json.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
286 B
677 B
|
16ms
16ms
|
XHR
application/json |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
General
- Full URL
- https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php?cache=9420799519
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a00:13c8:f5::f:4b3d:175
, Germany,
ASN25291
(SYSELEVEN SysEleven GmbH, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe
|
GET
S
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
|
230 KB
79 KB
|
55ms
40ms
|
Script
text/javascript |
2a00:1450:4001:814::200a
Google LLC
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
68 B
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
715 B
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
2 KB
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
|
8 KB
9 KB
|
16ms
15ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
|
15 KB
15 KB
|
16ms
15ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
309 B
975 B
|
8ms
8ms
|
XHR
application/json |
143.204.101.112
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=2012609714
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.101.112
Wilmington, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-101-112.fra50.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 0f4e7aaf102a3fbf84852a8b63133c28dbec6cdd6435b2168c6303946d4986c0
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.golem.de/5b86c915248e281403e034594d5025f15c6693bc/
|
309 B
1 KB
|
70ms
28ms
|
XHR
application/json |
136.243.65.40
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/5b86c915248e281403e034594d5025f15c6693bc/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.65.40
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.40.65.243.136.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- 0f4e7aaf102a3fbf84852a8b63133c28dbec6cdd6435b2168c6303946d4986c0
|
GET
H2
|
200
|
bridge3.242.3_de.html
imasdk.googleapis.com/js/core/
Frame 80A8
|
0
0
|
13ms
7ms
|
Document
text/html |
2a00:1450:4001:814::200a
Google LLC
|
|
General
- Full URL
- https://imasdk.googleapis.com/js/core/bridge3.242.3_de.html
- Requested by
- Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_ECDSA, AES_128_GCM
- Server
-
2a00:1450:4001:814::200a
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
S
|
200
|
client.js
Show response
s0.2mdn.net/instream/video/
|
26 KB
10 KB
|
89ms
39ms
|
Script
text/javascript |
2a00:1450:4001:814::2006
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.golem.de/
|
24 B
281 B
|
36ms
1ms
|
Script
application/octet-stream |
46.4.55.20
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/hic_qos?adv_partner&_werbebanner_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
46.4.55.20
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.46-4-55-20.clients.your-server.de
- Software
-
openresty/1.13.6.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.golem.de/dd9e2ea59d6afe802af18daa64ed538da4642efc/
|
110 B
672 B
|
5ms
5ms
|
XHR
application/json |
46.4.55.20
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/dd9e2ea59d6afe802af18daa64ed538da4642efc/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZhZWhvaG5nQWhsdW5nYWU9VmFlaG9obmdBaGx1bmdhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kubWV8fCh5Lm1lPTApO3kubWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5tZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk9hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5HZyhsKSxhLmNlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLmZvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLkpjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuWnQobSk7YS5ZdChsKTthLk50KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV2s9dGhpcy5hWzVdO3RoaXMuY3M9CnRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMl07dGhpcy5EcT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLm5oPWI7Yi5wcm90b3R5cGU9e1ZrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xazp0aGlzLmJzKGEpfSxiczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5MbChhKX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1sOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51ajp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRHE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYT1jLm5ofHxpYSxJYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1JYy5Wayg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZm89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5vZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnV0LmJpbmQodGhpcykpfWMuamo9YjtiLnByb3RvdHlwZT17b2Y6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sYm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sCnphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSx1dDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy50dChhLmRhdGEpfSx0dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxxZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRwKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsCmE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuZ2coYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxUcDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sJG06ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLkNwKGEpKXJldHVybjsoYj10aGlzLnFmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxDcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxCZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxOYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LElmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx2dTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxZZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxaZjpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB1PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXUpcmV0dXJuITE7Yz11LmhlaWdodCp1LndpZHRoO2Q9dS53aWR0aDtmPXUuaGVpZ2h0OzA+dS50b3AmJihmKz11LnRvcCk7dS5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT11LmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYoZCs9dS5sZWZ0KTt1LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXUucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT8KNjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sSmc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHU9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sayx3LHEscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrCjEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249dTtrPUE7dz1sO3E9bTtmb3IoZj0KMDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmNDI5NDk2NzI5NTt1PXUrbiY0Mjk0OTY3Mjk1O0E9QStrJjQyOTQ5NjcyOTU7bD1sK3cmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IodSkrYihBKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KIiIsZCxmLGMsaCxlLHUsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix1PWMmNjMsaXNOYU4oZik/ZT11PTY0OmlzTmFOKGMpJiYodT02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHUpO3JldHVybiBifSxicjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYKLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx0ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHU9ITEsQT0hMSxsPSExLGs9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuJG4/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSx1PS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLApBPSF1JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGs9KGx8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXU7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPWs7cmV0dXJuIGF9LE5wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFlhOmZ1bmN0aW9uKCl7dmFyIGE9e0hoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApVaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sV246ZnVuY3Rpb24oKXtyZXR1cm4gYS5IaCgpfHxhLlVoKCl8fGEueHEoKXx8YS5RaygpfHxhLm1tKCl9fTtyZXR1cm4gYS5XbigpfSxKYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LE5mOmZ1bmN0aW9uKGEpe2E9dGhpcy5KYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LGpiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LFVvOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LHJ1OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sRmY6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLlhnKGIpKyI6Iit0aGlzLlhnKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxYZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA+CmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LHplOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LFliOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5maXJlRXZlbnQoZCxiLGEpfSxEOmZ1bmN0aW9uKGEsYixkLGYsYyl7dmFyIGg9YTtkJiZiJiYoYj1rLlFjKGIsZCkpO2ImJihoPWsuUWMoYSxiKSk7ZiYmKGg9ay5RYyhoLGYpKTtjJiYoaD1rLlFjKGgsYykpO2UuWWIoaCl9LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFtfHwhbS5hYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0ud2UoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uR2EoZiwhMCk7Zj1tLkdhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uSWEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sZWU6ZnVuY3Rpb24oKXttJiZtLmFhP20uaXNFbmFibGVkJiZtLnVvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVlKCl9LmJpbmQodGhpcyksNTAwKX0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxpbzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLiRjKGEpfHx0aGlzLmRyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5FZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LkVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy5OYSgiZXJyX3VybCIsYSk7aWYodGhpcy5CZihhKSlyZXR1cm4gdGhpcy5CZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuT2EoYSxiLnVhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlljKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLiRtKGMsYSk7cmV0dXJuIGN9LE9hOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGw9aHx8bTtoPSEwO3UmJihoPSExKTtpZihsJiZsLmFhKWlmKGwuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goayl7YyhrKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7bC5HYShhLGgpO2g9bC5HYShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQpiO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBsLklhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYShhLGIsZCxmLGMsbCxlLHUpfS5iaW5kKHRoaXMpLDUwMCl9LGdnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciB1PSEwO2UmJih1PSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgbCBpbiBlKWQrPSImIitsKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtsXSk7ZD1kLnN1YnN0cigxKX12YXIgaz1uZXcgWE1MSHR0cFJlcXVlc3Q7ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9ay5yZWFkeVN0YXRlfHwyMDAhPWsuc3RhdHVzJiYyMDEhPWsuc3RhdHVzfHxmKGspO2MmJjQ9PWsucmVhZHlTdGF0ZSYmMjAwIT1rLnN0YXR1cyYmMjAxIT1rLnN0YXR1cyYmYyhrKX07dHJ5e2sub3BlbihiLAphLHUpLGsud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmay5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxrLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBrfSxEcjpmdW5jdGlvbihhLGIsZCl7dGhpcy5nZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5tYylmb3IodmFyIGMgaW4gdGhpcy5tYylhPWEuc3BsaXQoYykuam9pbih0aGlzLm1jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTsKYiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxoZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLk9hKGEsZi51YSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi5ZYygpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWM9YX0sV3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLk9hKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmCihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LFhuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sJHE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamp8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LkF3PWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWo9YjtiLlFjPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5mdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnY9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi50cD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU209e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTW09e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlBtPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVtPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5MbT17Y29kZToiMTAwOSIsCnR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuTm09e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5udj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuanM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk52PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkJvPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSW89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsCm1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5LYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLkpjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5SbT17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuUW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLmRmPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5jZj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5WbT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9OwpiLk9tPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5rdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLmxzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Idj10aGlzLmFbNF07dGhpcy5ibz10aGlzLmFbNl07dGhpcy5Fbj10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07CnRoaXMueGo9dGhpcy5hWzZdO3RoaXMuTWk9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOV19Yy5NdT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHY6dGhpcy5hbyhhKX0sYW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Fbjp0aGlzLlVzKGEpfSxVczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVnM6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhqOnRoaXMuTGkoYSl9LExpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIGphPWMuTXV8fGphLEpjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1KYy5Hdig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtqPWI7Yi5wcm90b3R5cGU9e1RkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sV3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFJjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5SYyhhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLlJjKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sZWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5UZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuUmMoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxWcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjKCkrIjIifSxXZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlRkKHRoaXMuV3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5SYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ranx8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMV07dGhpcy5KcT10aGlzLmFbMTBdO3RoaXMudWk9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuQ249YjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5aaTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkpxOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51aTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc2s6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBrYT1jLkNufHxrYSxLYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1LYy5ZaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5jP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmM6ZnVuY3Rpb24oKXtkLmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGd9O2MuUWU9Yn0pKGMpO3ZhciBLPWMuUWV8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGs9dGhpcy5hWzFdO3RoaXMuWGw9dGhpcy5hWzFdO3RoaXMuUGk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbM119Yy5Qdj1iO2IucHJvdG90eXBlPXtDazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkRrOnRoaXMuV2woYSl9LFdsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWGw6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgbGE9Yy5Qdnx8bGEsTGM9bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuQ2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Zaz1LLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnlhPXt9O3RoaXMuQT1udWxsO3RoaXMuamM9MTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy4kdChiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLAp0aGlzLmpjKSk6MD50aGlzLnhhJiYodGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmpjKSl9LFB0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2I+dGhpcy54YT8hMDohMX0sQ2c6ZnVuY3Rpb24oKXt0aGlzLm9iPTB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwkdDpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sVnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxKOmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5mYigpXT1iO0wmJkwuZWcmJkwud3UoYil9LEl3OmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmEodGhpcy55YSl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueWEpaWYoYT09dGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxhcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7CnJldHVybiExfSxXdzpmdW5jdGlvbihiKXt0aGlzLnlhW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcj1jLllrfHxyOyhmdW5jdGlvbihjKXtjLiRrPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuamM9MTA7dGhpcy5vYj0wO3RoaXMueGE9NTA7dGhpcy5LPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuaGI9IiI7dGhpcy52Zj0hMTt0aGlzLk4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkVhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxpdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sCkp3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sY3U6ZnVuY3Rpb24oYil7dGhpcy5pZT1ifSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmllfSxoZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGEmJih0aGlzLm9iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksdGhpcy5qYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sQWU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxYdzpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy51cSgpfHwKdGhpcy5YbSgpO3RoaXMuQWUodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxLdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxYbTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5wYSgxMCkpfSx1cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sUzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxFYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxaYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sClF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2F9LGVhOmZ1bmN0aW9uKCl7dGhpcy5rYT0hMH0sRmI6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LGFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sR3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sQmc6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LE13OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxTdzpmdW5jdGlvbigpe3RoaXMudmZ8fCh0aGlzLnZmPSEwKX0sU2M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRHc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpOwp2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLm1oPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuWmU9IjEiO3RoaXMuJGU9IjIiO3RoaXMuSG09IjMiO3RoaXMucmM9MDt0aGlzLmtnPTMwO3RoaXMueGI9W107dGhpcy5SYT1bXTt0aGlzLk5iPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLmZmPXRoaXMuJGc9ITE7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuamQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLiRnfHwodGhpcy4kZz0hMCxlLmVlKCkpfSxsZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0KITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmlhKCk/ITE6KHRoaXMuZnUoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLlRnKCksdGhpcy5mZj0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaWEoKXx8KHRoaXMueGIucHVzaChiKSx0aGlzLlJhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxUZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMueGImJjA8dGhpcy54Yi5sZW5ndGgmJih0aGlzLnhiPWUudW5pcXVlKHRoaXMueGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnhiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5SYS5sZW5ndGg7ZysrKXRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPT10aGlzLk5iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuTmJbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuTmJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksCmI9dGhpcy5SYVtnXS5yZWFzb24pO3RoaXMuTmJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxMdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5aZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yY30sYWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWmV9LHJ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLiRlfSxpYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5yY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwKYXU6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLm1ofHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJtPXRoaXMuYVs3XTt0aGlzLk9sPXRoaXMuYVs3XTt0aGlzLkFzPXRoaXMuYVs4XTt0aGlzLk9vPXRoaXMuYVs4XTt0aGlzLk5qPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsxXX1jLklqPWI7Yi5wcm90b3R5cGU9e0FtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5CbTp0aGlzLk5sKGEpfSxObDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuT2w6dGhpcy56cyhhKX0senM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFzOnRoaXMuTm8oYSl9LE5vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Pbzp0aGlzLk1qKGEpfSxNajpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk5qOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbmE9Yy5Janx8bmEsTWM9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuQW0oNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5kaXx8VDsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMudmQ9bnVsbDt0aGlzLnJ2PTFFMzt0aGlzLnVnPW51bGw7dGhpcy5PdT0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuJG4pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5BcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMucXEuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5wcShhLGIpfS5iaW5kKHRoaXMpKTsKYi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52dihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLm9xKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5HbyhhKX0uYmluZCh0aGlzKSl9LEdvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sdXY6ZnVuY3Rpb24oYil7dGhpcy52ZHx8KHRoaXMudmQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd2KGIpfS5iaW5kKHRoaXMpLHRoaXMucnYpKX0sd3Y6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudmQpO3RoaXMudygpfSx2djpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCl9LG9xOmZ1bmN0aW9uKGIpe3RoaXMueXcoYik7CnRoaXMudWc9bmV3IERhdGU7dGhpcy51Zy10aGlzLnF0PHRoaXMuT3U/dGhpcy53KCk6dGhpcy5vKCl9LHFxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuamQobmV3IFQoYSkpKTt0aGlzLncoKX0sQXA6ZnVuY3Rpb24oKXt9LHBxOmZ1bmN0aW9uKCl7dGhpcy5xdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBvYT1jLmNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkZhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgb2EoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkkoKX19fSl9KShjKTsKdmFyIHBhPWMuZWl8fHBhLHFhPW5ldyBwYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcT10aGlzLmFbOF07dGhpcy5Nbz10aGlzLmFbM107dGhpcy5vdD10aGlzLmFbN107dGhpcy5BaD10aGlzLmFbN107dGhpcy5vaz10aGlzLmFbNl07dGhpcy5idz10aGlzLmFbMV07dGhpcy5Xaj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs5XX1jLmFpPWI7Yi5wcm90b3R5cGU9e2lxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcTp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1vOnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3Q6dGhpcy56aChhKX0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkFoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vazp0aGlzLmF3KGEpfSwKYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ3OnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJhPWMuYWl8fHJhLE5jPW5ldyByYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU5jLmlxKDQpOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dGhpcy5BZigpO3RoaXMuQ2YoKTt0aGlzLkhvPSExfSxBZjpmdW5jdGlvbigpe3RoaXMuZmM9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLmZjPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPQpiLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxDZjpmdW5jdGlvbigpe2lmKCF0aGlzLmZjKXt2YXIgYj10aGlzLkVhKCksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5mYz0hMCk7dGhpcy5VKGEpfX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihsLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiYKdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcykpfSxoZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5tZChhKX0uYmluZCh0aGlzKSl9LG1kOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJgphLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuaWUmJigwLHRoaXMuaWUpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuQ2p8fHNhOyhmdW5jdGlvbihjKXtjLkJqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5yYzt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnRjPSExO3RoaXMuQ2Q9MTt0aGlzLnZjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8KKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudGM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMubGUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmtnJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5Ibz0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEubmUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnRjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMubGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMua2cmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy52Yy5pbmRleE9mKGEpJiYKdGhpcy52Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMudmMubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LEdyOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2UudnUoYS52aWRlb1RhZyk/YS5mYz90aGlzLm8oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLnRjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksCjUwKTooYS5BZigpLGEuQ2YoKSl9fSl9KShjKTt2YXIgdGE9Yy5Canx8dGE7KGZ1bmN0aW9uKGMpe2MuRGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ScCgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPQowO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2R8fChkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtkfHwiT0JKRUNUIiE9Zy5ub2RlTmFtZSYmIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5IKGcpfHx0aGlzLmFyKGcpfHwodGhpcy5KKGcpLGc9bmV3IHRhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19LEZ3OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFJwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5KYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKcmV0dXJuIGUuemIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuRGp8fHVhLHZhPW5ldyB1YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Udj10aGlzLmFbN107dGhpcy5Jcj10aGlzLmFbOV07dGhpcy5MaD10aGlzLmFbMl07dGhpcy5Laz10aGlzLmFbNl07dGhpcy5DaT10aGlzLmFbOF07dGhpcy5Ycz10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs3XX1jLml0PWI7Yi5wcm90b3R5cGU9e1N2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Udjp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSXI6dGhpcy5LaChhKX0sS2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxoOnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Lazp0aGlzLkJpKGEpfSxCaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ2k6CnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Yczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHdhPWMuaXR8fHdhLE9jPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLlN2KDQpOyhmdW5jdGlvbihjKXtjLnNtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLnNtfHx4YTsoZnVuY3Rpb24oYyl7Yy5ybT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj8KdGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MudG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTsKdmFyIHphPWMudG18fHphLEFhPW5ldyB6YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbOF07dGhpcy5sbz10aGlzLmFbMTBdO3RoaXMuZ3I9dGhpcy5hWzZdO3RoaXMudGg9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOV19Yy5UdT1iO2IucHJvdG90eXBlPXtsbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubW46dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ncjp0aGlzLnNoKGEpfSxzaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLlR1fHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMubG4oNCk7KGZ1bmN0aW9uKGMpe2MuZm09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksCmI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGxiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LApjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIENhPWMuZm18fENhOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLlpnPSEwO3RoaXMuR2Q9dGhpcy5UZj0hMTt0aGlzLnBnKCk7dGhpcy5ybygpO3RoaXMuS2EoKX0sVHc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLAp0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuc2E6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5zYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuc2E/Yi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5zYT90eXBlb2YgYi5pbWEuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYuc2E/Yi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi5zYT90eXBlb2YgYi5GLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwKIjsiLGIuRj9iLkYuemQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi56ZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuQWQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5BZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsCiI7IixiLmltYT90eXBlb2YgYi5pbWEuRmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLkZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuRmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy56Zyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxUYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj0KdGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LEtmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZGMpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5kYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuZGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5kY30sWnE6ZnVuY3Rpb24oKXtpZighdGhpcy5TZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5YcSgpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLlNmPSEwKX1yZXR1cm4gdGhpcy5TZn0sWHE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkFjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5BYz0hMCk7cmV0dXJuIHRoaXMuQWN9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5UYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMueGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHhlOmZ1bmN0aW9uKCl7dGhpcy5HZD0hMDt2YXIgYj10aGlzLktmKCk7aWYoYnx8dGhpcy5pYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsCmZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVik7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuUmI9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsCiFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLlJiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5SYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlkoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxFdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGYmJmIuYWRzJiYodGhpcy5wZj1iLmFkcyk7cmV0dXJuIHRoaXMucGZ9LHJvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKTt0aGlzLlkoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVil9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm8oKTt0aGlzLmxlKCl9LmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2YoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNmKCl9LmJpbmQodGhpcyksNTApfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5acSgpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlRjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlRjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5UZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuVGMoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlkoKSk6KHRoaXMuWSghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVGY9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMuVmJ8fCh0aGlzLlZiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuVmIhPWIuYWRzLnN0YXRlJiYodGhpcy5WYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5WYil7dGhpcy5vKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlZiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLlpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLlpnLGZ1bmN0aW9uKCl7dGhpcy5zZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKeG86ZnVuY3Rpb24oKXt0aGlzLk93fHwoMTA8dGhpcy5zdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5ZLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuc3YrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5PdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSxPdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy50dil7dGhpcy50dj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy5lbXx8RGE7KGZ1bmN0aW9uKGMpe2MuZ209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLk1nKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5NZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxNZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTsKdmFyIEVhPWMuZ218fEVhLEZhPW5ldyBFYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5udz10aGlzLmFbNl07dGhpcy4kdj10aGlzLmFbOF07dGhpcy5Jaz10aGlzLmFbMl07dGhpcy5Ybz10aGlzLmFbOF07dGhpcy5Rbz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVsxXX1jLnFrPWI7Yi5wcm90b3R5cGU9e2x3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLlp2KGEpfSxadjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHY6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLklrOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ybzp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUW86dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgR2E9Yy5xa3x8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMubHcoNCk7KGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5LJiYKInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxTYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllciwKYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuRGx8fEhhOyhmdW5jdGlvbihjKXtjLkNsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm5jPSExO3RoaXMuQWcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5uYz0hMCx0aGlzLm8oKTt0aGlzLmwoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7CmIuZ2V0UGxheWVyKCk7dGhpcy5GYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLm1mKCk6dGhpcy5vKCl9LEZjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm5jPSEwLHRoaXMubygpO3RoaXMubCgiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpOwphLmdldFBsYXllcigpO3RoaXMubmM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5GYy5iaW5kKHRoaXMpLDEwMCl9fSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWYuYmluZCh0aGlzKSw1MCl9fSxBZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmCmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5uYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5DbHx8SWE7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJgp2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuRWx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GdD10aGlzLmFbMTBdO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbOV19Yy5xdj1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnQ6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5xdnx8TGEsUmM9bmV3IExhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkV0KDQpOyhmdW5jdGlvbihjKXtjLk5oPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMub2c9YX0sTjpmdW5jdGlvbigpe30sZmU6ZnVuY3Rpb24oYil7dGhpcy5vZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5OaHx8TWE7KGZ1bmN0aW9uKGMpe2MuTWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0sZmU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLk1ofHxOYTsoZnVuY3Rpb24oYyl7Yy5PaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuZmUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuZmUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5PaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSW49dGhpcy5hWzldO3RoaXMuQ2g9dGhpcy5hWzJdO3RoaXMuZGs9dGhpcy5hWzNdO3RoaXMucmg9dGhpcy5hWzhdO3RoaXMuTXY9dGhpcy5hWzVdO3RoaXMuaT10aGlzLmFbOF19Yy4kbz1iO2IucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSW46dGhpcy5CaChhKX0sQmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkNoOnRoaXMuY2soYSl9LGNrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5kazp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJoOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ndjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIFFhPWMuJG98fFFhLFNjPW5ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Ibig0KTsoZnVuY3Rpb24oYyl7Yy5paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFlhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYKKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLmlrfHxSYTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnVjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy51YygpfS5iaW5kKHRoaXMpKSk6dGhpcy51YygpfSx1YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD9iLmFkQ29udGV4dC5fYWRSZXNwb25zZT8KdGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuaGt8fFNhOyhmdW5jdGlvbihjKXtjLmprPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUmEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgVGE9Yy5qa3x8VGEsVWE9bmV3IFRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR2PXRoaXMuYVs4XTt0aGlzLnlzPXRoaXMuYVs4XTt0aGlzLk1rPXRoaXMuYVsxXTsKdGhpcy5Ocz10aGlzLmFbOF07dGhpcy5wcz10aGlzLmFbMl07dGhpcy5pPXRoaXMuYVs3XX1jLmJrPWI7Yi5wcm90b3R5cGU9e2N2OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5kdjp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXM6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1rOnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Oczp0aGlzLm9zKGEpfSxvczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLmJrfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5jdig0KTsoZnVuY3Rpb24oYyl7Yy5Taz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dGhpcy5vZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxydDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5uZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMub2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJgpiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLm9lKys7aWYoMTA8dGhpcy5vZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsCiIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApMOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxmYTpmdW5jdGlvbigpe30sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLlNrfHxXYTsoZnVuY3Rpb24oYyl7Yy5Saz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlBkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUGQ9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5YYSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy55cD8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy55cD0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IucnQoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuUmt8fFhhOyhmdW5jdGlvbihjKXtjLlRrPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPTE1MDA7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5Ua3x8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Pbj10aGlzLmFbMl07dGhpcy5CcT10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbMV07dGhpcy56dD10aGlzLmFbMTBdO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOV19Yy5hcD1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT246dGhpcy5BcShhKX0sQXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5CcTp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHQ6dGhpcy55dChhKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnp0OnRoaXMuZ3YoYSl9LGd2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciAkYT1jLmFwfHwkYSxVYz1uZXcgJGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9VWMuTm4oNCk7KGZ1bmN0aW9uKGMpe2MuZmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlUoYi5lbGVtZW50KX0sRmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgYWI9Yy5manx8YWI7KGZ1bmN0aW9uKGMpe2MuZWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLApmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBiYj1jLmVqfHxiYjsoZnVuY3Rpb24oYyl7Yy5naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgYWIoYi5kZXRhaWwpO2Iua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGJiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgY2I9Yy5nanx8Y2IsZGI9bmV3IGNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZxPQp0aGlzLmFbNV07dGhpcy5JbD10aGlzLmFbNl07dGhpcy50cz10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzRdO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbN119Yy5acj1iO2IucHJvdG90eXBlPXtFcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZxOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudHM6dGhpcy5DbShhKX0sQ206ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkRtOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGViPWMuWnJ8fGViLFZjPW5ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1WYy5FcSg0KTsoZnVuY3Rpb24oYyl7Yy56aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5JZihiLCJlbGVtZW50SUQiKTt0aGlzLndnPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy53Zz9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6CmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuT2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLk9jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHdvOmZ1bmN0aW9uKCl7ZS5ZZih0aGlzLk9jKTtlLlpmKHRoaXMuT2MpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53bygpfS5iaW5kKHRoaXMpLDUwKX0sTDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxhZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGZiPWMuemp8fGZiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBnYj1jLnlqfHxnYjsoZnVuY3Rpb24oYyl7Yy5Baj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPQoxNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuSWYoYiwiZWxlbWVudElEIik7ZS5ZZihhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy50Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgaGI9Yy5Banx8aGIsaWI9bmV3IGhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLkdoPXRoaXMuYVs2XTt0aGlzLmFqPXRoaXMuYVs3XTt0aGlzLlFsPXRoaXMuYVsyXTt0aGlzLkVpPXRoaXMuYVs4XTt0aGlzLkVwPXRoaXMuYVsxMF07dGhpcy5PcT0KdGhpcy5hWzFdO3RoaXMucGg9dGhpcy5hWzEwXTt0aGlzLmRtPXRoaXMuYVsxXTt0aGlzLm9tPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzRdfWMuYnY9YjtiLnByb3RvdHlwZT17b2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBsOnRoaXMuRmgoYSl9LEZoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5HaDp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYWo6dGhpcy5QbChhKX0sUGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFsOnRoaXMuRGkoYSl9LERpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaTp0aGlzLkRwKGEpfSxEcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRXA6dGhpcy5OcShhKX0sTnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9xOnRoaXMub2goYSl9LG9oOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5waDp0aGlzLmNtKGEpfSxjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZG06CnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuYnZ8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLm9sKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxidTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LFltOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpOwp2YXIgej1jLmxqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuTGE9YTt0aGlzLkVmPXRoaXMuaWg9ITE7dGhpcy5xZz1kO3RoaXMuTmc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuTGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJm0mJm0uWmQodGhpcy5MYS51cmwpJiZtLnJkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5idSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPQohMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLm1qPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkVmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5OZz90aGlzLnZiLm9wZW4odGhpcy5MYS5tZXRob2QsdGhpcy5MYS51cmwsITEpOnRoaXMudmIub3Blbih0aGlzLkxhLm1ldGhvZCx0aGlzLkxhLnVybCwhMCksdGhpcy5paHx8KHRoaXMudmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiYKdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGwmJmwmJmwudnBhaWQmJm0mJm0uJGModGhpcy5MYS51cmwpLHRoaXMudmIuc2VuZChhKX1jYXRjaChjKXttJiZtLlpkKHRoaXMuTGEudXJsKT9tLnJkP20uaGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uWmQodGhpcy5MYS51cmwpLHRoaXMucWcmJnRoaXMucWcoKX1yZXR1cm4gdGhpcy52Yn19fSkoYyk7dmFyIGtiPWMubWp8fGtiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLlRiPSIiO3RoaXMuSGQ9dGhpcy5TYj10aGlzLmViPW51bGw7dGhpcy5Wbz10aGlzLnFiPXRoaXMuZmc9ITE7dGhpcy51YT0iIjt0aGlzLmFnPSExO3RoaXMuQmE9dGhpcy5XYz0iIjt0aGlzLlhmPXRoaXMuYWE9dGhpcy5pc0VuYWJsZWQ9dGhpcy51ZT0KITE7dGhpcy5RYT1bXTt0aGlzLlFmPXRoaXMuSGI9IiI7dGhpcy5OZD0hMTt0aGlzLkhlPTA7dGhpcy5VZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLlNlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy53Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5xYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5UZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSmI9IiI7dGhpcy5yYj1bXTt0aGlzLktiPVtdO3RoaXMuSWI9IiI7dGhpcy5JZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLlZkPSExO3RoaXMueW89dGhpcy5zZD1udWxsO3RoaXMuS2c9dGhpcy5vYz10aGlzLnhmPXRoaXMuS2U9dGhpcy5yZD10aGlzLklkPXRoaXMuc2M9ITE7dGhpcy5TYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX19CmMubmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5UYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlNiLGFkdGFncmVnZXg6dGhpcy5IZCxqc3BvcHVwczp0aGlzLmZnLHNpZGVsb2Fkczp0aGlzLnFiLGRpc2FibGV0ZXN0czp0aGlzLlZvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuYWcsZ2xvYmFsQ29uZmlnOnRoaXMuV2MsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5hYSxpc0Jsb2NrZWQ6dGhpcy5YZixzZXJ2ZXI6dGhpcy5RYSxzdm1Db25maWc6dGhpcy5IYixob21hZEFkcGF0aDp0aGlzLlFmLGRpc2FibGVDb29raWVUZXN0OnRoaXMuTmQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuSGUsSE9NQURfVkVSSUZJRUQ6dGhpcy5VZSxIT01BRF9CTE9DS0VEOnRoaXMuU2UsCkhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLnFjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5UZSx0ZXN0SGlkZTp0aGlzLkpiLHRlc3RUYWdzOnRoaXMucmIsdGVzdFRhZ3NKUzp0aGlzLktiLHRlc3RDb29raWU6dGhpcy5JYix0aHJvdHRsZTp0aGlzLkllLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuVmQsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy55byxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5JZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5yZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LZSxjb25maWdGYWlsdXJlczp0aGlzLlNhLHNpdGVDb25maWc6dGhpcy5HYixzZXJ2ZXJJZDp0aGlzLkZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5YYix2cGFpZDp0aGlzLm9jLHNraXBBbGxvd2VkOnRoaXMuS2d9fSxzcTpmdW5jdGlvbigpe3ZhciBhPSExLApiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmKGE9ITApO3JldHVybiBhfSx5ZTpmdW5jdGlvbihhKXt0aGlzLlNhW2FdPSEwfSxTcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5TYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlNhW2JdJiYxPT10aGlzLlNhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHBkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTsKYT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLlhuKGEpfSxHYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuJGMoYSk7ZT10aGlzLkphKGEpO2M/KHRoaXMuZ2MoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMud2UoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5UYnx8dGhpcy5lYnx8dGhpcy5TYnx8dGhpcy5IZCkmJihrPXRoaXMuU3IoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9lLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcChlLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9CnRoaXMuemIoayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSwkYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuZ2MoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxnYzpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5RYSYmdGhpcy5RYS5sZW5ndGgmJjA8dGhpcy5RYS5sZW5ndGgmJihiPXRoaXMuUWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT0KYVswXT8hMTohMCk7cmV0dXJuIGF9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuJGMoYSk7cmV0dXJuIGJ9LFVwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnd3O3JldHVybiJub25lIn0sWWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RYVt0aGlzLkZnXX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlljKCksYj10aGlzLkpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqCmQubGVuZ3RoKV0pfSxsZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxScjpmdW5jdGlvbihhLGIpe3ZhciBkPWUuSmEoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgRD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSxjPXt9LGs9MDtrPEQubGVuZ3RoO2srKyl7dmFyIGw9RFtrXS5zcGxpdCgiPSIpO2NbbFswXV09bFsxXX1mb3IodmFyIG0gaW4gYltoXS5zdWJ2YWx1ZXMpY1ttXT10aGlzLmxnKGNbbV0sbSxiW2hdLnN1YnZhbHVlc1ttXSk7RD1bXTtmb3IobSBpbiBjKUQucHVzaChtKyI9IitjW21dKTtjPUQ9ZW5jb2RlVVJJQ29tcG9uZW50KEQuam9pbigiJiIpKX1lbHNlIGM9dGhpcy5sZyhkLnF1ZXJ5S2V5W2hdLApoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31tPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbS5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK20uam9pbigiJiIpfSxTcjpmdW5jdGlvbihhKXt0aGlzLlRiJiYoYSs9dGhpcy5UYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7dGhpcy5TYiYmKGE9dGhpcy5ScihhLHRoaXMuU2IpKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsZCxjLGUsaCl7bT10aGlzO3RoaXMuYWc9ITA7dGhpcy5XYz1hO3RoaXMuQmE9Yjt0aGlzLnVlPWQ7dGhpcy5zZD1jO3RoaXMuTWM9ZTt0aGlzLkdiPWh8fHt9O3RoaXMuQ3IoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5BcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMuSGMoKX1jYXRjaChrKXt0aGlzLmhhKCJub0NsaWVudENvbmZpZyIpfX0sClphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5XYyt0aGlzLnljKCJnbG9iYWwiKSksdGhpcy5ocS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLkhjKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQmErdGhpcy55YygiY2xpZW50IikpO3RoaXMuSWEobmV3IHoodGhpcy5CYSt0aGlzLnljKCJjbGllbnQiKSksdGhpcy5IYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy55ZSgiY2xpZW50Iik7dGhpcy5oYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iKwp0aGlzLm5iKCk7dGhpcy5HYiYmdGhpcy5HYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuR2ImJnRoaXMuR2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxoYTpmdW5jdGlvbihhKXtpZighdGhpcy5JZCl7dGhpcy5JZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLk1jJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuTWM/dGhpcy5NYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5hYT10aGlzLlhmPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlNlKSk7dGhpcy51YigpO2UuWWIoay5mdCk7KGI9ZS5OZih0aGlzLlljKCkpKXx8KGI9ZS5OZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7CmF8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LGhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkJhfHx0aGlzLkhifHx0aGlzLnVhfHx0aGlzLkhjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMudWIoKSl9fSxIYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLkJhfWVsc2UgYT10aGlzLkJhO3RoaXMuaXNFbmFibGVkPXRoaXMuTGIoYS5lbmFibGVkKTsKdGhpcy5hYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5RYT1hLnNlcnZlcnx8W107dGhpcy5IYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuUWY9YS5hZHBhdGh8fCIiO3RoaXMuTmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5GZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5RYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkhiJiZ0aGlzLnVhJiZ0aGlzLlFhLmxlbmd0aD90aGlzLmJkKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX0sYmQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYWEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB6KHRoaXMud2UoKSksYz10aGlzLkphKHRoaXMuSGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9CmMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuSGIrdGhpcy55YygiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMueXUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWUoImN1c3RvbWVyIik7YT90aGlzLm1sP3RoaXMuaGEoIm5vU1ZNQ29uZmlnIik6KHRoaXMubWw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLmJkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5dTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLnJkPXRoaXMuTGIoYi5zdHJpY3QpO3RoaXMuS2U9dGhpcy5MYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy54Zj1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fAohMTt0aGlzLlhiPXRoaXMuTGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkxiKGIuZW5hYmxlZCk7dGhpcy5KYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnJiPWIudGVzdGFkdGFnc3x8W107dGhpcy5LYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlRiPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuU2I9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLkhkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLmZnPWIuanNwb3B1cHN8fCExO3RoaXMucWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMub2M9Yi52cGFpZHx8ITE7dGhpcy5HYi52cGFpZD10aGlzLm9jO3RoaXMuS2c9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5EYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuSWI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMuYnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLk5kJiYodGhpcy5JYj1udWxsKTt0aGlzLkllPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuVmQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLlZkPSEwLHRoaXMuYmQoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuTnUoKSYmKHRoaXMuSmJ8fHRoaXMuS2J8fHRoaXMucmJ8fHRoaXMuSWIpP3RoaXMudWU/KHRoaXMub2E9dGhpcy5hYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpLHRoaXMuSmQoKSx0aGlzLnViKCkpOnRoaXMuRXUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GdSgpKX19LEV1OmZ1bmN0aW9uKCl7dGhpcy5EdSgpfSxGdTpmdW5jdGlvbigpe3RoaXMuYWE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKTt0aGlzLnViKCl9LHFkOmZ1bmN0aW9uKGEpe3RoaXMuc2M9CiEwO3RoaXMuYWF8fCh0aGlzLmFhPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKGEpKSx0aGlzLnViKCksdGhpcy5KZCgpKX0sRHU6ZnVuY3Rpb24oKXtpZih0aGlzLkpiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkpiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1jfWNhdGNoKGYpe31hP3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOgp0aGlzLlJnKCl9ZWxzZSB0aGlzLlJnKCl9LFFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLm5iKCkpO3RoaXMuSXUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkVlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5xZCh0aGlzLnFjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5yYj1udWxsLHRoaXMuRWUoKX0sSXU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IHooYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LFJnOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5uYigpKTt0aGlzLkp1KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5RZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5xYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5LYiYmdGhpcy5LYi5sZW5ndGgpe3ZhciBjPXRoaXMuS2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZygpfSxKdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LEVlOmZ1bmN0aW9uKCl7dGhpcy5JYj8odGhpcy5IZSsrLHRoaXMuSWEobmV3IHoodGhpcy5JYiksdGhpcy5DdS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5GZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLk9nKCl9LEZlOmZ1bmN0aW9uKGEpe3RoaXMucWQodGhpcy5UZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LEN1OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLkhlP3RoaXMuRWUoKTp0aGlzLkZlKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuT2coKTp0aGlzLkZlKCJBQUEiKX0sT2c6ZnVuY3Rpb24oKXt0aGlzLmFhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSk7dGhpcy51YigpO3RoaXMuSmQoKX0sdWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuWWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5zYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVWUpKTt0aGlzLnNkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuc2QmJnRoaXMuc2QoKX0sdm86ZnVuY3Rpb24oKXtpZih0aGlzLktlJiZ0aGlzLnNxKCkpe3ZhciBhPXRoaXMuU3AoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFRnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LElhOmZ1bmN0aW9uKGEsYixjLGYsaCxEKXthPW5ldyBrYihhLGIsYyk7ZiYmKGEuaWg9ITApO2gmJmUuYnIoKSYmKGEuRWY9ITApO0QmJihhLk5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGtmOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLk9hKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmhhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuZ2MoKXx8KGE9dGhpcy5KYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx1bzpmdW5jdGlvbigpe3RoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuR2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLm12LmJpbmQodGhpcyksdGhpcy5sdi5iaW5kKHRoaXMpKX0sbXY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy52cCgpfSxsdjpmdW5jdGlvbigpe30sdnA6ZnVuY3Rpb24oKXtlLlliKGsudXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5xYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnFiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLk9hKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUjt3aW5kb3dbYy5lYygpXT10aGlzO2UuT2EoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LE51OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuSWV9LGJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LEpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGxiPWMubmp8fGxiLG09bmV3IGxiO3dpbmRvdy5Cdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJsPXRoaXMuYVsxMF07dGhpcy5scT10aGlzLmFbN107dGhpcy5Pcj10aGlzLmFbNl07dGhpcy5jcD10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVszXX1jLnRrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ybDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5Pcjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3A6dGhpcy5saShhKX0sbGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgbWI9Yy50a3x8bWIsWGM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5mPWE7YS51Lkw/dGhpcy5QYT1hLnUuTCgpOnRoaXMuUGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5mLlRhO3RoaXMucGxheWVyPXRoaXMuZi51O3RoaXMuQWI9dGhpcy5CYz0hMTt0aGlzLlZuPTFFMzt0aGlzLmRhPW51bGw7dGhpcy5QPWI7dGhpcy5yYT17fTt0aGlzLnZpZGVvPXt9O3RoaXMub2Q9e307dGhpcy56Yz0KIldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy56Yz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmYudSkmJnRoaXMuZi51LkImJihhPXRoaXMuZi51LkIoKSksdGhpcy56Yz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5jbj1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLm5kPSExO3RoaXMuaWc9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMubT17fTt0aGlzLnhjPSExO3RoaXMuV2c9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5EYj0hMTt0aGlzLkpvPWUucGEoMTApO3RoaXMuZGQ9ZS5wYSgxMCk7dGhpcy5qZT1lLnBhKDEwKTt0aGlzLkxnPWUucGEoMTApO3RoaXMuY29uZj17fTt0aGlzLldiPXRoaXMua2I9ITE7dGhpcy5PZD1udWxsOwp0aGlzLlhkPXRoaXMucmU9dGhpcy5LZD10aGlzLkxjPXRoaXMuRGU9dGhpcy5zZz10aGlzLlBjPXRoaXMuUHU9dGhpcy5hYj0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e0dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUGFdJiZ0aGlzLmNvbmZbdGhpcy5QYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlBhXVthXSk7cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhhJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlAuc2M/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGsuUW0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKX0sY2U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWI9YztpZih0aGlzLlAuYWEpdGhpcy5QLnZvKCksdGhpcy5QLm9hJiZ0aGlzLlAuaXNFbmFibGVkPwoodGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlAub2N9KSk6Yj8odGhpcy5VZygpLG5ldyBVKHRoaXMsYSx0aGlzLmlnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5QLm9jLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5DYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5jZShhLGIsYyl9LDUwKX19LHBlOmZ1bmN0aW9uKGEpe3RoaXMuUGM9ITE7dGhpcy5tPWE7dGhpcy5qdSh0aGlzLm0pO3RoaXMuT2YoYSl9LE9mOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLm9kPXRoaXMuZXEoYSkpLHRoaXMuT2YoYS5wYXJlbnQpKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10saD0iIjsKaWYoYS5aKXtiPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWi5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlouZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWi5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLlZhKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6aH19LGdhOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiYKYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuTmMmJmEuTmMuZXJyb3ImJmEuTmMuZXJyb3IuY29kZSYmKGI9YS5OYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LnBjLmNvZGU6Yj09RS54ZC5jb2RlP2UuRChrLkZ2LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk6KGUuZWUoKSxiPT1FLlhlLmNvZGUmJmUuRChrLmpzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpO2UuRChrLnRwLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5WZS5jb2RlOmUuRChrLm52LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2UgeC5ZZS5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UuRChrLk52LHRoaXMubS5SLAp0aGlzLmYudS5CKCksdGhpcy5UKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LnlkLmNvZGU6ZS5EKGsuT3YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LndkLmNvZGU6ZS5EKGsua3MsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5XYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09YyYmYS5lcnJvciYmYS5lcnJvci5sYSYmKGMrPSJfIithLmVycm9yLmxhKTtlLnRyYWNrKGMsIiIsITApO3RoaXMuQmIoYSk7dGhpcy5DYSgpfSxCYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYKKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5iZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5LZD10aGlzLlhkPXRoaXMucmU9ITE7dGhpcy5yYT10aGlzLmYuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuZi5DO2IuVXc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNuJiZ0aGlzLnBsYXllci5TYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIuU2MoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKHZhciBjPTA7YzxhLk0ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuTVtjXS50eXBlKSYmCnRoaXMuWm0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLlNnKGIpPyh0aGlzLmFuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYikpOnRoaXMubS5FbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLAp0aGlzLmh1KCkpOnRoaXMuWWQoKT90aGlzLklnKCk6dGhpcy5tLm9yaWdpbi55Zih4LndkKX0saHU6ZnVuY3Rpb24oKXtlLm9mKCk7dGhpcy5tJiZ0aGlzLm0ub3JpZ2luJiZ0aGlzLm0ub3JpZ2luLlBlJiZlLmJuKHRoaXMubS5vcmlnaW4uUGUpO2UuTmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmYuQzt0aGlzLmYuQz1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5mLkMsYSk7dGhpcy5mLnRnKCk7dGhpcy5mLmxjKCk7Zm9yKGE9dGhpcy5mLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuZi5sYygpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmYuRy5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uZ3EoKSxiPXRoaXMubS5SLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5mLkcuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS5oZWlnaHQpfX19OwplLnphKHRoaXMuTywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwKMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuaW8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlApO3RoaXMuTy5zcmM9YTtlLkVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy54dihhKSwiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLnl2KCksdGhpcy5mLmJjKCEwKSksIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmJjKCEwKSx0aGlzLnp2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuZi5iYyghMCksCnRoaXMuRHYoKSksIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQnYoKSwiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3YoKSwiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdigpLCJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdigpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maCgpKX0uYmluZCh0aGlzKSk7ZS5FZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTtlLkVkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQ2EoKX0uYmluZCh0aGlzKSk7dGhpcy5mLldtKGZ1bmN0aW9uKGEpe2UuemEodGhpcy5PLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0senY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0seXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5OYSgiaW1wcmVzc2lvbiIpfSwKRHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuTmEoInN0YXJ0Iil9LEJ2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuTmEoImZpcnN0UXVhcnRpbGUiKX0sQ3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuTmEoIm1pZHBvaW50Iil9LEV2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuTmEoInRoaXJkUXVhcnRpbGUiKX0sQXY6ZnVuY3Rpb24oKXt0aGlzLnRkKCk7ZS5OYSgiY29tcGxldGUiKX0sZmg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5OYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuYmE9ITE7dGhpcy5DYShhKX19LHh2OmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsCmEubWVzc2FnZSwhMCk7ZS5OYSgiZXJyIixhLm1lc3NhZ2UpO3RoaXMuZmgoITApfSxabTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlA7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmdjKCk/KGY9ZS5KYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpiPWY7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLnB2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxhbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy50ZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnVkLmJpbmQodGhpcykpfSxoZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5laC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk1lLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5OZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnRkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMudWQuYmluZCh0aGlzKSl9LGVoOmZ1bmN0aW9uKGEpe3RoaXMuQWJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYnx8dGhpcy5NZShhKX0uYmluZCh0aGlzKSx0aGlzLlZuKSl9LE1lOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkJjJiYKdGhpcy5TZyh0aGlzLnZpZGVvKSYmIXRoaXMua2ImJiF0aGlzLkFiKXt0aGlzLkJjPSEwO3RyeXtpZighZS5ZYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5tLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5rYnx8KHRoaXMua2I9ITAsdGhpcy5oZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLlAueGZ8fHRoaXMuUC5oYSgidmlkZW8tbm9vcCIpKTt0aGlzLkNhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMub3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuZi5sYygpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5oZigpO3RoaXMuZi50ZygpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5DZSgpfX0sQ2U6ZnVuY3Rpb24oKXtpZighdGhpcy5MYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPQp0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5YYz1bXTtmb3IodmFyIGI9dGhpcy5mLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuWGMucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCmZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy53YygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy53YygpfWVsc2UgdGhpcy53YygpfSx3YzpmdW5jdGlvbihhKXtpZih0aGlzLlhjKWZvcih2YXIgYj0wO2I8dGhpcy5YYy5sZW5ndGg7YisrKXRoaXMuWGNbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuTGN8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSwKdGhpcy5DYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMubWcoITApLHRoaXMud2MoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMuWGQmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLnJlPSEwfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5FYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5FYi5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMueGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNlKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmQoKS5IZyh0aGlzKX0sdGQ6ZnVuY3Rpb24oKXt0aGlzLlAuWGImJiF0aGlzLmtiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5EKGsuTG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLkNhKCl9LENhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLktkKWlmKHRoaXMuS2Q9ITAsdGhpcy5tLiRhfHx0aGlzLm0uT2Ipe3RoaXMuQWI9dGhpcy5CYz0hMTt0cnl7dGhpcy5oZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuZGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMubmQ9ITE7dHJ5e3RoaXMuZi5ZZygpfWNhdGNoKGUpe310aGlzLkRlPSEwO3RoaXMuZi5VZCgpO3RoaXMuRGI9ITE7dGhpcy5SZCgpLkJnKCk7dGhpcy5tLiRhJiZ0aGlzLm0ub3JpZ2luLmtlKCk7dGhpcy5tLk9iJiYoYT90aGlzLm0ub3JpZ2luLm5nKCk6dGhpcy5MZCgpKX1lbHNlIHRoaXMuTGQoKX0sCnB2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuaGQodGhpcy52aWRlbyksdGhpcy5ZZCgpP3RoaXMuSWcoKTp0aGlzLnVkKGEpKX0sdWQ6ZnVuY3Rpb24oYSl7dGhpcy5BYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5ZZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XYnx8dGhpcy5QLmtmKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlAua2YoKSk7dGhpcy5tLm9yaWdpbi55Zih4LndkKX0sTmU6ZnVuY3Rpb24oKXtpZih0aGlzLlB1KXRoaXMuQ2EoKTtlbHNle3RoaXMuRGI9ITA7dGhpcy5mLnUubGImJgohdGhpcy5EZSYmdGhpcy5mLnUubGIoKSYmZS5EKGsuSmMsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuU3UoYSk7dmFyIGI9IiI7aWYodGhpcy5tLkJlKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxnKTtjJiYoYj10aGlzLm0uQmUtYSwwPGI/Yj10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMubmR8fCh0aGlzLm5kPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChrLlJtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5tLiRhPyh0aGlzLkFiPXRoaXMuQmM9ITEsdGhpcy5oZCh0aGlzLnZpZGVvKSx0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5kYSksCnRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5uZD0hMSx0aGlzLmYuWWcoKSx0aGlzLm0ub3JpZ2luLmtlKCkpOnRoaXMuQ2EoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKHRoaXMubS5kdXJhdGlvbi1hKSkpO3RoaXMueGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LElnOmZ1bmN0aW9uKCl7dGhpcy5XYj0hMDt0aGlzLnJhPXRoaXMuZi5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpOwphLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5acCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuZi5DPWE7dmFyIGI9dGhpcy5mLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmYubGMoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYWgoKTt0aGlzLmJoKCk7dGhpcy5PZD1zZXRJbnRlcnZhbCh0aGlzLnRvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9e30sYz0wO2M8dGhpcy5tLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLm0uTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5QO2gub2EmJmguaXNFbmFibGVkJiYhaC5nYygpJiYoZT1oLkphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sdG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMubS5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLk9kKSx0aGlzLnRkKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMuTmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuT2QpLHRoaXMudWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKToKdGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sVmc6ZnVuY3Rpb24oKXt0aGlzLnNnfHwodGhpcy5zZz0hMCx0aGlzLlBjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sU3U6ZnVuY3Rpb24oYSl7YT09dGhpcy5XZ3x8dGhpcy5rYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnJlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLlhkPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5WZygpfS5iaW5kKHRoaXMpKSx0aGlzLldiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwKIiIsITApLHRoaXMua2J8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQoay5ObSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLGUuRChrLlNtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzQpJiYodGhpcy5QLlhiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5QYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChrLk1tLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5tLmR1cmF0aW9uLzIpJiYodGhpcy5QLlhiJiZlLnRyYWNrKCJxdWFydGlsZSIsCiJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGsuUG0sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5YYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChrLlVtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGUuRChrLlZtLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksdGhpcy5XZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5rYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLmZxKHRoaXMubS5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT0KYSYmdGhpcy5vZC5pbXByZXNzaW9ucyYmZS4kcShmLnVybCx0aGlzLm9kLmltcHJlc3Npb25zKT90aGlzLmJlKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQoay5PbSx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkse2FkSWQ6dGhpcy5vZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuYmUoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMubS5BYT10aGlzLlJvKHRoaXMubS5BYSxhKSl9fSxiZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlAuR2EoYSksYyYmYS5ZbShjKSxmfHwoZj10aGlzLndmKSx0aGlzLlAuSWEoYSxmLHRoaXMud2YsITEsITApKX0sZnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxSbzpmdW5jdGlvbihhLApiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sb3Y6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuZGguYmluZCh0aGlzKX0sZGg6ZnVuY3Rpb24oKXtlLkQoay5Cbyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5QYyYmZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS5OcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLm0uR2N9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5tLkdjLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuemMucmVwbGFjZSgiW3RpbWVdIixlLkZmKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlAuRGMmJgooYj10aGlzLlAuRGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGIuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSl9fSwkYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxrZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5QLkRjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sYmg6ZnVuY3Rpb24oKXtpZighdGhpcy5jb250cm9scyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pZD10aGlzLkpvO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXToKKGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4Iik7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixiLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixiLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtiLmlkPXRoaXMuZGQ7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUnUuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuamU7Yy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247CmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUXUuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5MZztmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMubS5CZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMua2QoKX0uYmluZCh0aGlzKSk7dGhpcy5kYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLmFjKCk7dGhpcy4kYigpfS5iaW5kKHRoaXMpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYSk7dGhpcy5mLnUudmEmJnRoaXMuZi51LnZhKCkmJgp0aGlzLm1nKCk7dGhpcy5hYygpfX0sYWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxsZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxSdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZD8odGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKToodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmNmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSxuZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZHx8KHRoaXMuZi5DLnBhdXNlKCksCmEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGsuY2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LFF0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kZCk7dGhpcy5mLkMucGF1c2VkJiYodGhpcy5mLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQoay5kZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0sUXU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmplKTt0aGlzLmYuQy5tdXRlZD8odGhpcy5mLkMubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSk6KHRoaXMuZi5DLm11dGVkPSEwLGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LG1nOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5qZSk7dGhpcy5mLkMubXV0ZWR8fCh0aGlzLmYuQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEViOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuRWIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkViKTt0aGlzLkxjfHx0aGlzLnhjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5DZSgpKX0sTGQ6ZnVuY3Rpb24oKXt0aGlzLkxjPSEwO3RoaXMuYWImJgood2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkhhJiZ0aGlzLnhjfHwicG9zdHJvbGwiPT1lLkhhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkhhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5mLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuZi5sYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5NZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLk1kKCl9ZWxzZSB0aGlzLk1kKCl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5EZT0hMDt0aGlzLmYuVWQoKTt0aGlzLmYuUnQoKTt0aGlzLkRiPSExO2UuRChrLklvLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5SZCgpLkJnKCl9LFJkOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmYmJnRoaXMuZi51JiYoYT10aGlzLmYudSk7cmV0dXJuIGF9LApZZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGhmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGUuWmYodGhpcy52aWRlbyxhKT90aGlzLlF0KCk6dGhpcy5uZSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxUOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5tJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5tLkdjLGEuZHVyYXRpb249dGhpcy5tLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5tLiRhLAp0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LHdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLmhqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmt3PXRoaXMuYVs4XTt0aGlzLnhuPXRoaXMuYVsyXTt0aGlzLndzPXRoaXMuYVsxXTt0aGlzLnpuPXRoaXMuYVs3XTt0aGlzLm9pPXRoaXMuYVs5XTt0aGlzLmtuPXRoaXMuYVsxMF07dGhpcy52az10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVsxMF19Yy54bT1iO2IucHJvdG90eXBlPXtpdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3c6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bjp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3M6dGhpcy55bihhKX0sCnluOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9pOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbjp0aGlzLnVrKGEpfSx1azpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudms6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLnhtfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5pdyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLk1hPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUGI9dGhpcy5RYj0hMTt0aGlzLlBlPSIiOwp0aGlzLk9lPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmJtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS5xZih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/Cih0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0ucGQoYSkpKyImdHlwZT1qcyIsYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy5Fci5iaW5kKHRoaXMpLHRoaXMuQnIuYmluZCh0aGlzKSl9LEdmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLk1hLmZpcnN0Q2hpbGQubm9kZU5hbWUmJgphLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLk1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5NYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT0KYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/Ck51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LEVyOmZ1bmN0aW9uKGEpe3RoaXMuR3QoYSk7dHJ5e3RoaXMuTWE9YS5yZXNwb25zZVhNTCx0aGlzLk1hfHwodGhpcy5NYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5HZigpO3RoaXMuUWI9dGhpcy5HZSgpO3RoaXMuUGI9dGhpcy5QZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnBjLHtlcnJvcjp0aGlzLk9lP0UueGQ6RS5XZX0pKX0sRnI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTWF8fCh0aGlzLk1hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPQp0aGlzLkdmKCk7dGhpcy5RYj10aGlzLkdlKCk7dGhpcy5QYj10aGlzLlBnKCk7dGhpcy5XLmxlbmd0aD90aGlzLmljKCk6dGhpcy5nYSh0aGlzLkRhKHgucGMse2Vycm9yOnRoaXMuT2U/RS54ZDpFLldlfSkpfSxCcjpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlZlLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLmVyKCk/dGhpcy5LdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLlBmKCksZyx7QWRTeXN0ZW06dGhpcy5McCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5ZZSkpOihhPTAsdGhpcy5qdigpJiZ0aGlzLnBlKHRoaXMuS28oKSkpfSxrZTpmdW5jdGlvbigpe3RoaXMuUWI/KHRoaXMuUWI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQua2UoKX0sbmc6ZnVuY3Rpb24oKXt0aGlzLlBiPyh0aGlzLlBiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiYKdGhpcy5pYygpKTp0aGlzLnBhcmVudC5uZygpfSxqdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkh1KCk/dGhpcy5HdSgpPyEwOigtMSE9dGhpcy5aYigpP3RoaXMuZ2EodGhpcy5EYSh4LlJlKSk6dGhpcy5nYSh0aGlzLkRhKHguYmkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnBjLEUuWGUpKSwhMSl9LHBlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5nZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlFiO2EuT2I9YS5PYj9hLk9iOnRoaXMuUGI7dGhpcy5wYXJlbnQucGUoYSl9LEtvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy5aYigpO2EuTT10aGlzLkxmKCk7YS5HYz10aGlzLk9wKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5LcCgpO2EuQmU9dGhpcy5jcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguUmUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLlFwKCkpOmIuQWEuY29uY2F0KHRoaXMuWHAoKSkpOwp0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuQmImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5CYiYmdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0seWY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxIdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTGYoKS5sZW5ndGh9LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aYigpfSxHZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxQZzpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuR2UoKSYmKGE9ITApO3JldHVybiBhfSxHdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuUGU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLk9lPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LGVyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5QZigpLmxlbmd0aH0sUGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFkKHRoaXMuWiwiQWRTeXN0ZW0iKX0sZ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwKIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxMZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxDYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iiksenc6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuQ2MpLU1hdGguYWJzKDcwMC1iLkNjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSwKS3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5WYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sWmI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LApjcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5aLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLnJ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sUWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxTZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5WYyhhKToiIn0sVmM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7CnJldHVybiBifX19KShjKTt2YXIgVT1jLmJtfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlpvPXRoaXMuYVs4XTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmZ2PXRoaXMuYVsxXTt0aGlzLlFoPXRoaXMuYVs4XTt0aGlzLmF2PXRoaXMuYVs2XTt0aGlzLmFzPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLm5sPWI7Yi5wcm90b3R5cGU9e1lvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5abzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mdjp0aGlzLlBoKGEpfSxQaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUWg6dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF2OnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuYXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5ubHx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WmMuWW8oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5BYT1bXTt0aGlzLk09W107dGhpcy5HYz0iIjt0aGlzLlI9dGhpcy5PYj10aGlzLiRhPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Yaz1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxncTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG9iPWMuWGt8fG9iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmltPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlJzPXRoaXMuYVsxXTt0aGlzLlVqPXRoaXMuYVs0XTt0aGlzLm1yPXRoaXMuYVs0XTt0aGlzLlRzPQp0aGlzLmFbMl07dGhpcy5Zaj10aGlzLmFbN107dGhpcy5pPXRoaXMuYVsxXX1jLmtpPWI7Yi5wcm90b3R5cGU9e2htOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pbTp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucG46dGhpcy5RcyhhKX0sUXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJzOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlRzOnRoaXMuWGooYSl9LFhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Zajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMua2l8fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5obSg0KTt2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGJpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxwYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxZZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFZlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCm93Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxSZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17V2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sWGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0scXc6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMucXU9dGhpcy5hWzEwXTt0aGlzLlpzPXRoaXMuYVsxMF07dGhpcy53aD10aGlzLmFbN107dGhpcy5Ubz10aGlzLmFbMl07dGhpcy55bD10aGlzLmFbN107dGhpcy5JaT10aGlzLmFbM107dGhpcy5KcD10aGlzLmFbOF07dGhpcy5kdz10aGlzLmFbN107dGhpcy52bj10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs1XX1jLkVrPWI7Yi5wcm90b3R5cGU9e3B1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdTp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnM6dGhpcy52aChhKX0sdmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndoOnRoaXMuU28oYSl9LFNvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ubzp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueWw6dGhpcy5IaShhKX0sSGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklpOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuSnA6dGhpcy5jdyhhKX0sY3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR3OnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIHNiPWMuRWt8fHNiLGFkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLnB1KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuTmM9Yjt0aGlzLkFhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5OaT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHBiPWMuTml8fHBiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs0XTsKdGhpcy53aT10aGlzLmFbMTBdO3RoaXMuJGg9dGhpcy5hWzRdO3RoaXMuU249dGhpcy5hWzZdO3RoaXMuQWk9dGhpcy5hWzVdO3RoaXMuS2k9dGhpcy5hWzhdO3RoaXMuVnU9dGhpcy5hWzNdO3RoaXMuem09dGhpcy5hWzNdO3RoaXMuVmw9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbOF19Yy5xaj1iO2IucHJvdG90eXBlPXtUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLndpOnRoaXMuWmgoYSl9LFpoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU246dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZ1OnRoaXMueW0oYSl9LAp5bTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuem06dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlZsOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRiPWMucWp8fHRiLGJkPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlRuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuVGE9YS5IZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuY2c9ITE7dGhpcy5jYz1bXX1jLmZpPWI7Yi5wcm90b3R5cGU9e2FxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuYXEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSx4dTpmdW5jdGlvbigpe3RoaXMuY2c9ITB9LFlnOmZ1bmN0aW9uKCl7dGhpcy5DPUMucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx0ZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpOwplLkQoay5KYyx0aGlzLnUuQigpKX0sUnQ6ZnVuY3Rpb24oKXt0aGlzLmNnfHwodGhpcy51LnBsYXkoKSxlLkQoay5LYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlRhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5UYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlRhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrCjArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5GYiYmdGhpcy51LkZiKCk/dGhpcy51LkhmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9CmEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUHAodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHxiLnBvc2l0aW9uIT10aGlzLlVhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlVhLndpZHRofHxiLmhlaWdodCE9dGhpcy5VYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5VYS53aWR0aCYmMDx0aGlzLlVhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuVWQoKTtyZXR1cm59dGhpcy5VYT1iO3RoaXMudS5GYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247CnRoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmNjLmxlbmd0aDthKyspdGhpcy5jY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLmJjLmJpbmQodGhpcyksMTApfSxXbTpmdW5jdGlvbihhKXt0aGlzLmNjfHwodGhpcy5jYz1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuY2MucHVzaChhKX0sVWQ6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLmZpfHxPLEM9W10sdWI9MDsxMDA+dWI7dWIrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9CiJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRsPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMudmo9YjtiLnByb3RvdHlwZT17c2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIHZiPWMudmp8fHZiLGNkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5zbCg0KTsoZnVuY3Rpb24oYyl7Yy5Paz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWUoYik7dGhpcy51ZigpfSxBZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sdWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkVhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5VKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZigpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sbGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5FYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB3Yj1jLk9rfHx3YjsoZnVuY3Rpb24oYyl7Yy5Oaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLnliPXRoaXMueWJ8fCExO3RoaXMuYmY9dGhpcy5lZj10aGlzLlVmPXRoaXMuamE9dGhpcy5KZT0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnpwKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5KZT0hMDt0aGlzLlVmJiZ0aGlzLm5mKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmhiO2EmJmEuRGImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5FYygpO3RoaXMuVWY9ITA7dGhpcy5uZigpfS5iaW5kKHRoaXMpKTt0aGlzLmpmKCl9LG5mOmZ1bmN0aW9uKCl7aWYoIXRoaXMueWIpe3RoaXMuRWMoKTtpZighdGhpcy5KZSYmIXRoaXMuRWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkplJiZ0aGlzLmJmJiYhdGhpcy5lZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkljKCl9LmJpbmQodGhpcyksMTAwKX19LEVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKTWY6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0samY6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKCkpe3ZhciBiPXRoaXMuTWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5lZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmJmPWIudnd9dGhpcy5pYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamYoKX0uYmluZCh0aGlzKSwxMDApfSxDdzpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5QdygpOiExfSxaYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLlpiKCk6LTF9LFlwOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHpwOmZ1bmN0aW9uKGIsYSl7dGhpcy55Yj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLnlifHwzMDI9PXRoaXMueWI/dGhpcy5qYT0hMDp0aGlzLmwoImFkZXJyb3IiLHRoaXMueWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPyh0aGlzLm8oKSx0aGlzLm5hKCkpOmIuWmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5ZcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgeGI9Yy5Oa3x8eGI7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxjcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5hbC5JbS5HbT93aW5kb3cuT08uYWwuSW0uR20udHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY3IoKX0sMTAwKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDt2YXIgYj1kYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgd2IoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IHhiKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgeWI9Yy5Qa3x8eWIsemI9bmV3IHliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldoPXRoaXMuYVszXTt0aGlzLkJ1PXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzhdfWMuZm49YjtiLnByb3RvdHlwZT17Vmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldoOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CdTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuZm58fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlZoKDQpOyhmdW5jdGlvbihjKXtjLkFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEZiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5BbHx8VjsoZnVuY3Rpb24oYyl7Yy56bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKeS5EZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy51cyhhKX0uYmluZCh0aGlzKSk7eS5ycSgpfSx1czpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJgooYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciBXPWMuemx8fFc7KGZ1bmN0aW9uKGMpe2MuQmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUuVW8oYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsCiIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLkgoZCkpe3RoaXMuSihkKTt2YXIgZj1uZXcgVyhkLHRoaXMuQSk7Zi5iKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuY2R8fCh0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxMdTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHwKdGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5oY3x8KHRoaXMuaGM9W10pLHRoaXMuaGMucHVzaChiKSx0aGlzLlB0KCkmJih0aGlzLkNnKCksdGhpcy5iKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LHJxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lkx1KGIpfX0pfSkoYyk7dmFyIEJiPWMuQmx8fEJiLHk9bmV3IEJiKHEpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRm09dGhpcy5hWzVdO3RoaXMuQm49dGhpcy5hWzNdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMuanA9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuaG89YjtiLnByb3RvdHlwZT17RW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GbTp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQm46dGhpcy5WcihhKX0sVnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xcjp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmpwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5ob3x8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRW0oNCk7KGZ1bmN0aW9uKGMpe2MuUmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5VKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0sCnBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLlJofHxEYjsoZnVuY3Rpb24oYyl7Yy5TaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucHR8fCh0aGlzLnB0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlNofHxFYjsoZnVuY3Rpb24oYyl7Yy5UaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBGYj1jLlRofHxGYixHYj1uZXcgRmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucm49dGhpcy5hWzddOwp0aGlzLlp1PXRoaXMuYVs0XTt0aGlzLnBwPXRoaXMuYVsxXTt0aGlzLkFvPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzVdfWMucW89YjtiLnByb3RvdHlwZT17cW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJuOnRoaXMuWXUoYSl9LFl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5adTp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHA6dGhpcy56byhhKX0sem86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5xb3x8SGIsZmQ9bmV3IEhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQucW4oNCk7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sZmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT4KdGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuZ2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLkZwfHwodGhpcy5WZigpLHRoaXMuRnA9ITApO2ImJmIuaWQmJjA8Yi5pZC5pbmRleE9mKCJhZCIpP3RoaXMubygpOnRoaXMuZ2Y/KHRoaXMubCgiYWRlcnJvciIsIm5vQ29udGFpbmVyIiksdGhpcy5zKCkpOih0aGlzLmdmPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjUwMCkpfSxNcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sVmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLk1wKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZmKCl9LmJpbmQodGhpcyksNTApfSxOdzpmdW5jdGlvbigpe3JldHVybiEwfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEpiPWMuam18fEpiOyhmdW5jdGlvbihjKXtjLmxtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgS2I9Yy5sbXx8S2IsTGI9bmV3IEtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlsPXRoaXMuYVszXTt0aGlzLlVpPXRoaXMuYVs0XTt0aGlzLkR0PXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVs4XTt0aGlzLkdrPQp0aGlzLmFbNl07dGhpcy5Dcz10aGlzLmFbM107dGhpcy5Ebz10aGlzLmFbN107dGhpcy50bj10aGlzLmFbNV07dGhpcy5LbD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs1XX1jLmtrPWI7Yi5wcm90b3R5cGU9e2hsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pbDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMueGgoYSl9LHhoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55aDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR2s6dGhpcy5CcyhhKX0sQnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNzOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ebzp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudG46dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5LbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIE1iPWMua2t8fE1iLGdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLmhsKDQpOyhmdW5jdGlvbihjKXtjLktqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBOYj1jLktqfHxOYjsoZnVuY3Rpb24oYyl7Yy5Kaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IiwKZnVuY3Rpb24oKXt0aGlzLkRmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5EZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5UbSgpfS5iaW5kKHRoaXMpKSx0aGlzLmhoPSExLHRoaXMuSXY9MUUzLHRoaXMudmc9e2RvbmU6ITF9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LERmOmZ1bmN0aW9uKCl7dGhpcy52Zy5kb25lfHwodGhpcy52Zy5kb25lPSEwLHRoaXMuaGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmdoKCl9LmJpbmQodGhpcyksdGhpcy5JdikpfSxUbTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oaCk7dGhpcy5vKCl9LGdoOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksCnRoaXMudygpKX0sSmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpO2JbY11bZF0uZ2V0TWVzc2FnZSgpO2JbY11bZF0uZ2V0VHlwZSgpO2JbY11bZF0uZ2V0VmFzdEVycm9yQ29kZSgpO2EucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLkpmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMuSmYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwOwpyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLkpqfHxPYjsoZnVuY3Rpb24oYyl7Yy5Maj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHx3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSl7dmFyIGI9bnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRmEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFBiPWMuTGp8fFBiLFFiPW5ldyBQYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5odz10aGlzLmFbN107dGhpcy5jbD10aGlzLmFbNl07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuWXY9dGhpcy5hWzNdO3RoaXMucnM9dGhpcy5hWzZdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMucXI9dGhpcy5hWzJdO3RoaXMua2g9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbM119Yy5pdj1iO2IucHJvdG90eXBlPXtndzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaHc6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmNsOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuV3Q6dGhpcy5YdihhKX0sWHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll2OnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yczp0aGlzLkZuKGEpfSxGbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR246dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuamgoYSl9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5raDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIFJiPWMuaXZ8fFJiLGhkPW5ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLmd3KDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgU2I9Yy52bHx8U2I7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTt0aGlzLlViKCl9LFViOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMuJGQoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRkKCkmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTApfSwkZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIFRiPWMudWx8fFRiOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLndsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZqPXRoaXMuYVs5XTt0aGlzLm5xPXRoaXMuYVszXTt0aGlzLk1uPXRoaXMuYVsyXTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLm5vPXRoaXMuYVs4XTt0aGlzLmZ3PXRoaXMuYVs3XTt0aGlzLllyPXRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzJdfWMucGs9YjtiLnByb3RvdHlwZT17RWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZqOnRoaXMubXEoYSl9LG1xOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ucTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTW46dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhxOnRoaXMubW8oYSl9LG1vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubzp0aGlzLmV3KGEpfSxldzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnc6dGhpcy5YcihhKX0sWHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Zcjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMucGt8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkVqKDQpOyhmdW5jdGlvbihjKXtjLmtsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5TKGIpO3RoaXMuVShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLnFlPSExfSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5zdCgpfS5iaW5kKHRoaXMpLDUwMCl9LHN0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLnFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LHV1OmZ1bmN0aW9uKCl7dGhpcy5xZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFhiPWMua2x8fFhiOyhmdW5jdGlvbihjKXtjLmpsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy5NYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5Ncj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTWJ8fCh0aGlzLk1iPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk1ifHx0aGlzLk1iKyssdGhpcy5NYjw9dGhpcy5Ncj8odGhpcy5NYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkudXUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFliPWMuamx8fFliOyhmdW5jdGlvbihjKXtjLmxsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBZYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFpiPWMubGx8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbMTBdO3RoaXMueHI9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuRWg9dGhpcy5hWzhdO3RoaXMudHU9dGhpcy5hWzZdO3RoaXMub3I9dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVsyXTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLkt2PXRoaXMuYVs0XTt0aGlzLnhwPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzEwXX0KYy53bT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXI6dGhpcy53cihhKX0sd3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnhyOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56cjp0aGlzLkRoKGEpfSxEaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWg6dGhpcy5zdShhKX0sc3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnR1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vcjp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmF0OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ldjp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueHA6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuaTphfX19KShjKTt2YXIgYWM9Yy53bXx8YWMsamQ9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuZmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYmM9Yy5mbHx8YmM7KGZ1bmN0aW9uKGMpe2MuZGw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMucGIoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5GbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yj10aGlzLlVjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy52cigpOnRoaXMuVWIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWYoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLnMoITApKX0uYmluZCh0aGlzKSwxRTMpfSxGbzpmdW5jdGlvbigpe3RoaXMuYWYoKXx8dGhpcy5zKCEwKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7IWIubWEmJgpiLlcmJmIuc3cmJmIudXcmJih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCkpfSxVYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVWMoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMucygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlViKCl9LmJpbmQodGhpcyksMTAwKX0sVWM6ZnVuY3Rpb24oKXtpZighdGhpcy5yZylmb3IodmFyIGI9bC5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09CmEmJih0aGlzLnJnPWJbY10pO3JldHVybiB0aGlzLnJnfSwkZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxzOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5VYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBjYz1jLmRsfHxjYzsoZnVuY3Rpb24oYyl7Yy5nbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihsJiZsLnBsYXllcmFwaSl7dmFyIGI9bC5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBiYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IGNjKGMsdGhpcy5BKSkuYigpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGRjPWMuZ2x8fGRjLGVjPW5ldyBkYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbz10aGlzLmFbMTBdO3RoaXMuaXI9dGhpcy5hWzRdO3RoaXMuS3I9dGhpcy5hWzddO3RoaXMueHQ9dGhpcy5hWzRdO3RoaXMud3E9dGhpcy5hWzEwXTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmVzPXRoaXMuYVs2XTt0aGlzLmk9dGhpcy5hWzVdfWMudWg9YjtiLnByb3RvdHlwZT17Y286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVvOnRoaXMuaHIoYSl9LGhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pcjp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS3I6dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy54dDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3E6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLnVofHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5jbyg0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEZiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5ma3x8WDsoZnVuY3Rpb24oYyl7Yy5laz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5zZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnNlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuc2UmJmIhPXRoaXMuc2V8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5SdyksCnRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLmVrfHxZOyhmdW5jdGlvbihjKXtjLmdrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIua2F8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5DZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLmdrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPQplLmhnLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bTtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBmIGluIGEpbFtmXT1hW2ZdO3EoYyxiKX07Zz1hLnNjcmlwdHMuc2hpZnQoKTspZS5oZyhnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzZdO3RoaXMuaG49dGhpcy5hWzRdO3RoaXMubXQ9dGhpcy5hWzldO3RoaXMuZ3M9dGhpcy5hWzhdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMuWm49dGhpcy5hWzRdO3RoaXMucmk9dGhpcy5hWzZdO3RoaXMuVXI9dGhpcy5hWzFdO3RoaXMuZnA9dGhpcy5hWzldO3RoaXMuc2o9CnRoaXMuYVs4XTt0aGlzLmk9dGhpcy5hWzRdfWMua3U9YjtiLnByb3RvdHlwZT17SHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklzOnRoaXMuZ24oYSl9LGduOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5objp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXQ6dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuc3I6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpuOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucmk6dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVyOnRoaXMuZXAoYSl9LGVwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZnA6dGhpcy5yaihhKX0scmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnNqOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGljPWMua3V8fGljLGxkPW5ldyBpYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLkhzKDQpOyhmdW5jdGlvbihjKXtjLlNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVShjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuaHM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIiwKZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxYdDpmdW5jdGlvbihiKXt0aGlzLkJkPWJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEw6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihiKXt0aGlzLnNiKGIpfS5iaW5kKHRoaXMpKX0sc2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksdGhpcy5CZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuQmQmJihuZXcgSSh0aGlzLHRoaXMuQmQpKS5iKCkpfX0pfSkoYyk7dmFyIE49Yy5TbHx8TjsoZnVuY3Rpb24oYyl7Yy5SbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuUGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5pYisrLDE1PHRoaXMuaWIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiYKd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy5ndSgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlBkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksCjEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuUmx8fEk7KGZ1bmN0aW9uKGMpe2MuVGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuWHQodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuVGx8fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW09dGhpcy5hWzhdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMua3Q9dGhpcy5hWzVdO3RoaXMubnM9dGhpcy5hWzRdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMucGo9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzEwXTt0aGlzLkxxPXRoaXMuYVs0XTt0aGlzLkVzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzJdfWMuTXE9YjtiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5RcTp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Q6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5zOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5CdDp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6CnRoaXMuYmooYSl9LGJqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jajp0aGlzLktxKGEpfSxLcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHE6dGhpcy5EcyhhKX0sRHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgbGM9Yy5NcXx8bGMsbWQ9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQucG0oNCk7KGZ1bmN0aW9uKGMpe2MuJGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMucmY9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlUoYSk6dGhpcy5lYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLDUwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlBBVVNFLHtpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmZ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxkYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHtqbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLnJmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtqbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLAppZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBtYz1jLiRqfHxtYzsoZnVuY3Rpb24oYyl7Yy5aaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxWdzpmdW5jdGlvbigpe30sS3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmZhY2FkZSxhO2E9bmV3IG12cC5RZShuZXcgZnVuY3Rpb24oKXt9KTthLnB3PSJIT01BRF9NRURJQVRPUiI7YT1uZXcgYTtiLkt0KGEpO3dpbmRvdy54dz1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5KdHx8KHRoaXMuSnQ9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XZHx8KHRoaXMuV2Q9MSk7aWYoMjA8dGhpcy5XZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iKwpiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTG9hZGVyKSl7dGhpcy5LYShjLGEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEpO3JldHVybn10aGlzLldkKys7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxLYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGM9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy54ZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwKITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx4ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlgoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOgp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbmM9Yy5aanx8bmM7KGZ1bmN0aW9uKGMpe2MuYWs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IG1jKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5rYXx8dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgbmMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIG9jPWMuYWt8fG9jLHBjPW5ldyBvYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnY9dGhpcy5hWzVdO3RoaXMueGs9dGhpcy5hWzldO3RoaXMuQms9dGhpcy5hWzNdO3RoaXMuUW49dGhpcy5hWzEwXTt0aGlzLmhwPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuenU9YjtiLnByb3RvdHlwZT17UXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlJ2OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54azp0aGlzLkFrKGEpfSxBazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJrOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmhwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWM9Yy56dXx8cWMsbmQ9bmV3IHFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW5kLlF2KDQpOyhmdW5jdGlvbihjKXtjLlBqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5Qanx8WjsoZnVuY3Rpb24oYyl7Yy5Paj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSwKYjpmdW5jdGlvbigpe3RoaXMuUmY9MDt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuamE9dGhpcy5kYz10aGlzLlhhPXRoaXMuQWM9ITE7dGhpcy56Zz1lLm5iKDEwKTt0aGlzLiRmKCl9LCRmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5LYSgpLCEwO3RoaXMuUmYrKztpZigxMDx0aGlzLlJmKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGYuYmluZCh0aGlzKSwxMDApLCExfSxLYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLm1hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpO3RoaXMuWSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApfSxYOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5WPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sWTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYWE9Yy5Panx8YWE7KGZ1bmN0aW9uKGMpe2MuUWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksYi5iKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBhYShiLHRoaXMuQSksCmIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcmM9Yy5Ranx8cmMsc2M9bmV3IHJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVs5XTt0aGlzLmVuPXRoaXMuYVs0XTt0aGlzLkl0PXRoaXMuYVs2XTt0aGlzLlNxPXRoaXMuYVs5XTt0aGlzLkpoPXRoaXMuYVsxXTt0aGlzLmk9dGhpcy5hWzldfWMuQnA9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnprOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVuOnRoaXMuSHQoYSl9LEh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSXQ6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlNxOnRoaXMuSWgoYSl9LApJaDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSmg6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB0Yz1jLkJwfHx0YyxvZD1uZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC55ayg0KTsoZnVuY3Rpb24oYyl7Yy5SaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVShiKTp0aGlzLmVhKCkpOnRoaXMuZWEoKTp0aGlzLmVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sWmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHVjPWMuUml8fHVjOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMucygpKX0sdGVzdDpmdW5jdGlvbigpe30sczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdmM9CmMuUWl8fHZjOyhmdW5jdGlvbihjKXtjLlNpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkZhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdWMoZCksZC5rYXx8dGhpcy5IKGQpfHwodGhpcy5KKGQpLChuZXcgdmMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgd2M9Yy5TaXx8d2MseGM9bmV3IHdjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhqPXRoaXMuYVs1XTt0aGlzLkdzPXRoaXMuYVs4XTsKdGhpcy5VdD10aGlzLmFbMTBdO3RoaXMuVnY9dGhpcy5hWzFdO3RoaXMuVXE9dGhpcy5hWzJdO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuTHM9dGhpcy5hWzJdO3RoaXMuaT10aGlzLmFbMl19Yy5Vaz1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGo6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdzOnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5VdDp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVnY6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVxOnRoaXMua3AoYSl9LGtwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5scDp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciB5Yz1jLlVrfHwKeWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuR2ooNCk7KGZ1bmN0aW9uKGMpe2MuV2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgemM9Yy5XaXx8CnpjOyhmdW5jdGlvbihjKXtjLlZpPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmxmKCl9LGxmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5WaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHpjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmthKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOwoobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5YaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs2XTt0aGlzLlpsPXRoaXMuYVs3XTt0aGlzLmk9dGhpcy5hWzZdfWMuSnM9YjtiLnByb3RvdHlwZT17anI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtyOnRoaXMuWWwoYSl9LFlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBEYz1jLkpzfHxEYyxxZD1uZXcgRGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1xZC5qcig0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmc9dGhpcy5lZz10aGlzLmRnPSExO3RoaXMuZWQ9W107dGhpcy52ZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQ2M/bnVsbDpDYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygc2M/bnVsbDpzYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEthP251bGw6S2EsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBGYT9udWxsOkZhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJpdG1vdmluRGV0ZWN0aW9uP251bGw6Qml0bW92aW5EZXRlY3Rpb24sTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVWE/bnVsbDpVYSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFphP251bGw6WmEsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgdmE/bnVsbDp2YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/Cm51bGw6a2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBoYz9udWxsOmhjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBHYj9udWxsOkdiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHhjP251bGw6eGMsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBpYj9udWxsOmliLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgUWI/bnVsbDpRYix3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIExiPwpudWxsOkxiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFBhP251bGw6UGEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgcWE/bnVsbDpxYX19Yy5aaz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLiRwKGEpOltdLGI7dGhpcy5lZz0hMDtpZihhLmxlbmd0aCl7dGhpcy5kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5EZyhiKX1lbHNlIGZvcihjIGluIHRoaXMudmUpe2lmKHRoaXMuYmcpYnJlYWs7Yj10aGlzLnZlW2NdO3RoaXMuTGUoYikmJih0aGlzLmVkLnB1c2goYiksdGhpcy5EZyhiKSl9fSxMZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHI/ITA6ITF9LCRwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPQphW2VdLGM9dGhpcy52ZVtjXSx0aGlzLkxlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LERnOmZ1bmN0aW9uKGEpe3RoaXMuTGUoYSkmJmEuYigpfSx3dTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZGcpZm9yKHRoaXMuYmc9ITAsYT0wO2E8dGhpcy5lZC5sZW5ndGg7YSsrKXRoaXMuZWRbYV0udGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5lZFthXS50Yil9fX0pKGMpO3ZhciBFYz1jLlprfHxFYyxMPW5ldyBFYztMLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IcD10aGlzLmFbM107dGhpcy56cT10aGlzLmFbM107dGhpcy5qaT10aGlzLmFbOF07dGhpcy5ZaD10aGlzLmFbOF07dGhpcy5jdD10aGlzLmFbOV07dGhpcy5wbz10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLnFwPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkhwOnRoaXMueXEoYSl9LHlxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy56cTp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuamk6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZaDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3Q6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRmM9Yy5xcHx8RmMscmQ9bmV3IEZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuR3AoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPQpjLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlliKGsua3YpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlliKGsubHMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtHLndpZHRoPTE7Ry5oZWlnaHQ9MTtHLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRyk7dmFyIHNkPUcuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5lYygpO0guV2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmVjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5XZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csSC5WcSgpLHtpZDp0ZH0pfSw1MDApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYW09dGhpcy5hWzEwXTt0aGlzLnZtPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzddfWMuc2k9YjtiLnByb3RvdHlwZT17JGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFtOnRoaXMudW0oYSl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm06dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBHYz1jLnNpfHxHYyx1ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC4kbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueGc9dGhpcy5jb25mPXRoaXMuV2E9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmFkPTA7dGhpcy5QYT0iIjt0aGlzLmZkPVtdO3RoaXMuZ2Q9MDt0aGlzLnlnPSExO3RoaXMudGU9W119Yy5saD1iO2IucHJvdG90eXBlPXtkdTpmdW5jdGlvbihhKXt0aGlzLnhnPWF9LGpkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5QYT10aGlzLnBsYXllci5MKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sWnQ6ZnVuY3Rpb24oYSl7dGhpcy5XYT0KYX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5QYV0mJnRoaXMuY29uZlt0aGlzLlBhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUGFdW2FdKTtyZXR1cm4gYn0sa2M6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuT2EoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuV2EpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5XcSgpKXRoaXMuV2EuYyh0aGlzLldhLldjLHRoaXMuV2EuQmEsCnRoaXMuV2EudWUsZnVuY3Rpb24oKXt0aGlzLmtjKGEsYil9LmJpbmQodGhpcyksdGhpcy5XYS5NYyk7ZWxzZSBpZih0aGlzLnRxKCkpdGhpcy5TdChmdW5jdGlvbigpe3RoaXMua2MoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChrLkpjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLnh1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuV2EsaCk7bC5HZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5McihhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuYWUmJihjPXRoaXMucGxheWVyLmFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSwKaC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5jZShhLGMsZik7dGhpcy5wbGF5ZXIuSGcobCl9fSxXcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLmFkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuYWQuZ2V0VGltZSgpLHRoaXMuYWQ9YSwzRTU8Yj8hMDohMTt0aGlzLmFkPWE7cmV0dXJuITF9LG91OmZ1bmN0aW9uKCl7ZS56ZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLnpmKGEpKT90aGlzLmtjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUuRChrLktjLHRoaXMucGxheWVyLkIoKSkpfSxudTpmdW5jdGlvbihhKXtlLnplKCJwb3N0cm9sbCIpO2lmKCF0aGlzLnhnKXt0aGlzLmR1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy56ZihjKSk/dGhpcy5rYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKSl9fSx6ZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sTXQ6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5pdSh0aGlzLm51LmJpbmQodGhpcykpO3RoaXMucGxheWVyLmZhKCl9LG1kOmZ1bmN0aW9uKGEpe2UuemUoIm1pZHJvbGwiKTtpZighdGhpcy5qZyl7dGhpcy5qZz0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5rYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZz0KITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5LYyx0aGlzLnBsYXllci5CKCkpKX19LEx0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5tZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5oZSgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5vdSgpO3RoaXMucGxheWVyLmhlJiZ0aGlzLkx0KCk7dGhpcy5NdCgpfSxOdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLmZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5XdihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuZ2Q9dGhpcy5mZC5sZW5ndGh9LAp0cTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5nZCYmKGE9ITApO3JldHVybiBhfSxTdDpmdW5jdGlvbihhKXt0aGlzLnlnPWE7Zm9yKGE9MDthPHRoaXMuZmQubGVuZ3RoO2ErKyl0aGlzLmZkW2FdWyJmdW5jdGlvbiJdKHRoaXMudnQuYmluZCh0aGlzKSl9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMuZ2QtLTthJiZ0aGlzLnRlLnB1c2goYSk7MD49dGhpcy5nZCYmdGhpcy55ZygpfSxMcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy50ZS5sZW5ndGg7YysrKWI9dGhpcy50ZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgaGE9Yy5saHx8aGEsUz0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YdT10aGlzLmFbNF07dGhpcy5HaT10aGlzLmFbOF07dGhpcy5zcD10aGlzLmFbOV07dGhpcy55aT0KdGhpcy5hWzhdO3RoaXMubWs9dGhpcy5hWzEwXTt0aGlzLm5wPXRoaXMuYVs5XTt0aGlzLm11PXRoaXMuYVszXTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkttPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzNdfWMuZGo9YjtiLnByb3RvdHlwZT17V3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlh1OnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HaTp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuc3A6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlpOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tazp0aGlzLm1wKGEpfSxtcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnA6dGhpcy5sdShhKX0sbHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tdTp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaGk6dGhpcy5KbShhKX0sCkptOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LbTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZGp8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLld1KDQpfSkuY2FsbChWYWVob2huZ0FobHVuZ2FlLFZhZWhvaG5nQWhsdW5nYWUpOwo=
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
46.4.55.20
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.46-4-55-20.clients.your-server.de
- Software
-
TornadoServer/4.5.3 /
- Resource Hash
- 9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
9ms
1ms
|
XHR
text/javascript |
136.243.151.13
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:time[url:%2F,site_skin:desktop,device:desktop,custom_page_type:Home%20page,cdn_version:3]&s=6acc7c777cce3be138a245218c439c54&1539602510809
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.151.13
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.13.151.243.136.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
11ms
2ms
|
XHR
text/javascript |
188.40.114.5
HETZNER-AS
|
|
General
- Full URL
- https://tt.onthe.io/?k[]=43098:time[url:%2F,site_skin:desktop,device:desktop,custom_page_type:Home%20page,cdn_version:3]&s=6acc7c777cce3be138a245218c439c54&1539602520818
- Requested by
- Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.114.5
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.5.114.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|